diff --git a/qiskit/aqua/algorithms/minimum_eigen_solvers/qaoa/qaoa.py b/qiskit/aqua/algorithms/minimum_eigen_solvers/qaoa/qaoa.py index 46888ca477..245c7538d6 100755 --- a/qiskit/aqua/algorithms/minimum_eigen_solvers/qaoa/qaoa.py +++ b/qiskit/aqua/algorithms/minimum_eigen_solvers/qaoa/qaoa.py @@ -123,6 +123,8 @@ def __init__(self, @VQE.operator.setter def operator(self, operator: Union[OperatorBase, LegacyBaseOperator]) -> None: """ Sets operator """ + # Need to wipe the var_form in case number of qubits differs from operator. + self.var_form = None # Setting with VQE's operator property super(QAOA, self.__class__).operator.__set__(self, operator) self.var_form = QAOAVarForm(self.operator, diff --git a/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py b/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py index f9656aa340..46a9a0a404 100755 --- a/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py +++ b/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py @@ -131,7 +131,9 @@ def __init__(self, self._max_evals_grouped = max_evals_grouped self._circuit_sampler = None + self._expectation = expectation self._expect_op = None + self._operator = None super().__init__(var_form=var_form, optimizer=optimizer, @@ -143,8 +145,6 @@ def __init__(self, self._optimizer.set_max_evals_grouped(max_evals_grouped) self._callback = callback - self._expectation = expectation - self._operator = None if operator is not None: self.operator = operator self.aux_operators = aux_operators diff --git a/qiskit/aqua/algorithms/vq_algorithm.py b/qiskit/aqua/algorithms/vq_algorithm.py index b394f31d79..f74938a163 100644 --- a/qiskit/aqua/algorithms/vq_algorithm.py +++ b/qiskit/aqua/algorithms/vq_algorithm.py @@ -84,7 +84,7 @@ def var_form(self) -> Optional[Union[QuantumCircuit, VariationalForm]]: return self._var_form @var_form.setter - def var_form(self, var_form: Union[QuantumCircuit, VariationalForm]): + def var_form(self, var_form: Optional[Union[QuantumCircuit, VariationalForm]]): """ Sets variational form """ if isinstance(var_form, QuantumCircuit): # store the parameters @@ -93,6 +93,9 @@ def var_form(self, var_form: Union[QuantumCircuit, VariationalForm]): elif isinstance(var_form, VariationalForm): self._var_form_params = ParameterVector('θ', length=var_form.num_parameters) self._var_form = var_form + elif var_form is None: + self._var_form_params = None + self._var_form = var_form else: raise ValueError( "Unsupported type '{}' of var_form".format( diff --git a/test/optimization/test_qaoa.py b/test/optimization/test_qaoa.py index 72734889e4..f97242fdef 100755 --- a/test/optimization/test_qaoa.py +++ b/test/optimization/test_qaoa.py @@ -26,7 +26,7 @@ from qiskit.aqua.components.optimizers import COBYLA from qiskit.aqua.algorithms import QAOA from qiskit.aqua import QuantumInstance, aqua_globals -from qiskit.aqua.operators import WeightedPauliOperator +from qiskit.aqua.operators import WeightedPauliOperator, X, Z W1 = np.array([ [0, 1, 0, 1], @@ -90,6 +90,21 @@ def test_qaoa(self, w, prob, m, solutions, convert_to_matrix_op): self.log.debug('solution objective: %s', max_cut.max_cut_value(x, w)) self.assertIn(''.join([str(int(i)) for i in graph_solution]), solutions) + def test_change_operator_size(self): + """ QAOA test """ + backend = BasicAer.get_backend('statevector_simulator') + optimizer = COBYLA(maxiter=2) + qubit_op, _ = max_cut.get_operator(W1) + qubit_op = qubit_op.to_opflow().to_matrix_op() + + seed = 0 + aqua_globals.random_seed = seed + qaoa = QAOA(qubit_op, optimizer, P1) + quantum_instance = QuantumInstance(backend, seed_simulator=seed, seed_transpiler=seed) + qaoa.run(quantum_instance) + qaoa.operator = (X ^ qubit_op ^ Z) + qaoa.run() + if __name__ == '__main__': unittest.main()