diff --git a/qiskit/aqua/operators/converters/circuit_sampler.py b/qiskit/aqua/operators/converters/circuit_sampler.py index 29ab9069dc..7c2f13a115 100644 --- a/qiskit/aqua/operators/converters/circuit_sampler.py +++ b/qiskit/aqua/operators/converters/circuit_sampler.py @@ -164,12 +164,13 @@ def convert(self, Returns: The converted Operator with CircuitStateFns replaced by DictStateFns or VectorStateFns. """ - if self._last_op is None or operator != self._last_op: + if self._last_op is None or id(operator) != id(self._last_op): # Clear caches self._last_op = operator self._reduced_op_cache = None self._circuit_ops_cache = None self._transpiled_circ_cache = None + self._transpile_before_bind = True if not self._reduced_op_cache: operator_dicts_replaced = operator.to_circuit_op() diff --git a/qiskit/aqua/operators/primitive_ops/circuit_op.py b/qiskit/aqua/operators/primitive_ops/circuit_op.py index f6b3ab8b98..09151c7362 100644 --- a/qiskit/aqua/operators/primitive_ops/circuit_op.py +++ b/qiskit/aqua/operators/primitive_ops/circuit_op.py @@ -47,7 +47,7 @@ def __init__(self, coeff: A coefficient multiplying the primitive Raises: - TypeError: invalid parameters. + TypeError: Unsupported primitive, or primitive has ClassicalRegisters. """ if isinstance(primitive, Instruction): qc = QuantumCircuit(primitive.num_qubits) @@ -58,6 +58,9 @@ def __init__(self, raise TypeError('CircuitOp can only be instantiated with ' 'QuantumCircuit, not {}'.format(type(primitive))) + if len(primitive.clbits) != 0: + raise TypeError('CircuitOp does not support QuantumCircuits with ClassicalRegisters.') + super().__init__(primitive, coeff=coeff) def primitive_strings(self) -> Set[str]: @@ -122,11 +125,7 @@ def compose(self, other: OperatorBase) -> OperatorBase: other = other.to_circuit_op() if isinstance(other, (CircuitOp, CircuitStateFn)): - new_qc = QuantumCircuit(self.num_qubits) - new_qc.append(other.to_instruction(), qargs=range(self.num_qubits)) - new_qc.append(self.to_instruction(), qargs=range(self.num_qubits)) - # TODO Fix, because converting to dag just to append is nuts - new_qc = new_qc.decompose() + new_qc = other.primitive.combine(self.primitive) if isinstance(other, CircuitStateFn): return CircuitStateFn(new_qc, is_measurement=other.is_measurement, diff --git a/qiskit/aqua/operators/state_fns/circuit_state_fn.py b/qiskit/aqua/operators/state_fns/circuit_state_fn.py index 1cdf7b9dfc..25826f1597 100644 --- a/qiskit/aqua/operators/state_fns/circuit_state_fn.py +++ b/qiskit/aqua/operators/state_fns/circuit_state_fn.py @@ -18,7 +18,7 @@ from typing import Union, Set import numpy as np -from qiskit import QuantumCircuit, BasicAer, execute +from qiskit import QuantumCircuit, BasicAer, execute, ClassicalRegister from qiskit.circuit import Instruction, ParameterExpression from qiskit.extensions import Initialize, IGate @@ -46,7 +46,7 @@ def __init__(self, is_measurement: Whether the StateFn is a measurement operator. Raises: - TypeError: invalid parameters. + TypeError: Unsupported primitive, or primitive has ClassicalRegisters. """ if isinstance(primitive, Instruction): qc = QuantumCircuit(primitive.num_qubits) @@ -57,6 +57,9 @@ def __init__(self, raise TypeError('CircuitStateFn can only be instantiated ' 'with QuantumCircuit, not {}'.format(type(primitive))) + if len(primitive.clbits) != 0: + raise TypeError('CircuitOp does not support QuantumCircuits with ClassicalRegisters.') + super().__init__(primitive, coeff=coeff, is_measurement=is_measurement) @staticmethod @@ -294,10 +297,10 @@ def eval(self, def to_circuit(self, meas: bool = False) -> QuantumCircuit: """ Return QuantumCircuit representing StateFn """ if meas: - qc = QuantumCircuit(self.num_qubits, self.num_qubits) - qc.append(self.to_instruction(), qargs=range(self.primitive.num_qubits)) - qc.measure(qubit=range(self.num_qubits), cbit=range(self.num_qubits)) - return qc.decompose() + meas_qc = self.primitive.copy() + meas_qc.add_register(ClassicalRegister(self.num_qubits)) + meas_qc.measure(qubit=range(self.num_qubits), cbit=range(self.num_qubits)) + return meas_qc else: return self.primitive diff --git a/test/aqua/operators/test_pauli_expectation.py b/test/aqua/operators/test_pauli_expectation.py index f20362cb1a..b34d3963d1 100644 --- a/test/aqua/operators/test_pauli_expectation.py +++ b/test/aqua/operators/test_pauli_expectation.py @@ -25,7 +25,7 @@ PauliExpectation, AbelianGrouper, CircuitSampler) -from qiskit import BasicAer, IBMQ +from qiskit import BasicAer # pylint: disable=invalid-name @@ -190,6 +190,7 @@ def test_grouped_pauli_expectation(self): @unittest.skip(reason="IBMQ testing not available in general.") def test_ibmq_grouped_pauli_expectation(self): """ pauli expect op vector state vector test """ + from qiskit import IBMQ p = IBMQ.load_account() backend = p.get_backend('ibmq_qasm_simulator') paulis_op = ListOp([X, Y, Z, I]) diff --git a/test/aqua/test_vqe.py b/test/aqua/test_vqe.py index 68c6013373..19883b9a48 100644 --- a/test/aqua/test_vqe.py +++ b/test/aqua/test_vqe.py @@ -18,7 +18,7 @@ from test.aqua import QiskitAquaTestCase import numpy as np from ddt import ddt, unpack, data -from qiskit import BasicAer, QuantumCircuit, IBMQ +from qiskit import BasicAer, QuantumCircuit from qiskit.circuit import ParameterVector from qiskit.aqua import QuantumInstance, aqua_globals, AquaError @@ -259,6 +259,7 @@ def test_vqe_mes(self): @unittest.skip(reason="IBMQ testing not available in general.") def test_ibmq_vqe(self): """ IBMQ VQE Test """ + from qiskit import IBMQ provider = IBMQ.load_account() backend = provider.get_backend('ibmq_qasm_simulator') var_form = RYRZ(self.qubit_op.num_qubits)