-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Description
Environment
- Qiskit Terra version: 0.21.2
- Python version: all
- Operating system: Linux
What is happening?
HHL.solve()
in qiskit/algorithms/linear_solvers/hhl.py constructs a quantum circuit qc, stores it in solution.state and calls HHL._calculate_norm(self, qc)
.
This function performs an evaluation of the quantum circuit "qc" using qiskit's built-in StateVector simulator and does not use the quantum_instance
provided to the constructor of hhl:
https://github.com/Qiskit/qiskit-terra/blob/070b9e214718b413f3d2f1142ffdc07d1d750c91/qiskit/algorithms/linear_solvers/hhl.py#L238
Is this intentional?
The tutorial https://qiskit.org/textbook/ch-applications/hhl_tutorial.html shows the following example at the end of section 4A
from qiskit import Aer
backend = Aer.get_backend('aer_simulator')
hhl = HHL(1e-3, quantum_instance=backend)
accurate_solution = hhl.solve(matrix, vector)
classical_solution = NumPyLinearSolver().solve(matrix, vector / np.linalg.norm(vector))
print(accurate_solution.euclidean_norm)
print(classical_solution.euclidean_norm)
suggesting that quantum_instance
allows the use of qiskit-aer in HHL.solve()
.
Additional information:
hhl._calculate_norm(self, qc)
boils down to an evaluation via
https://github.com/Qiskit/qiskit-terra/blob/main/qiskit/opflow/state_fns/circuit_state_fn.py#L258
in CircuitStateFn.to_matrix()
:
[3] /usr/local/lib/python3.8/dist-packages/qiskit/algorithms/linear_solvers/hhl.py(525)solve()
-> solution.euclidean_norm = self._calculate_norm(solution.state)
[4] /usr/local/lib/python3.8/dist-packages/qiskit/algorithms/linear_solvers/hhl.py(220)_calculate_norm()
-> norm_2 = (~StateFn(observable) @ StateFn(qc)).eval()
[5] /usr/local/lib/python3.8/dist-packages/qiskit/opflow/list_ops/composed_op.py(141)eval()
-> return reduce(tree_recursive_eval, reversed(eval_list))
[6] /usr/local/lib/python3.8/dist-packages/qiskit/opflow/list_ops/composed_op.py(131)tree_recursive_eval()
-> return l_arg.eval(r)
[7] /usr/local/lib/python3.8/dist-packages/qiskit/opflow/state_fns/operator_state_fn.py(249)eval()
-> front = front.eval()
[8] /usr/local/lib/python3.8/dist-packages/qiskit/opflow/state_fns/circuit_state_fn.py(308)eval()
-> vector_state_fn = self.to_matrix_op().eval()
[9] /usr/local/lib/python3.8/dist-packages/qiskit/opflow/state_fns/state_fn.py(429)to_matrix_op()
-> return VectorStateFn(self.to_matrix(massive=massive), is_measurement=self.is_measurement)
[10] > /usr/local/lib/python3.8/dist-packages/qiskit/opflow/state_fns/circuit_state_fn.py(251)to_matrix()
-> def to_matrix(self, massive: bool = False) -> np.ndarray:
How can we reproduce the issue?
Script based on the tutorial https://qiskit.org/textbook/ch-applications/hhl_tutorial.html :
import numpy as np
from qiskit.algorithms.linear_solvers.hhl import HHL
from qiskit.providers.aer.backends import AerSimulator
from qiskit.algorithms.linear_solvers.matrices.tridiagonal_toeplitz import TridiagonalToeplitz
matrix = np.array([[1, -1/3], [-1/3, 1]])
vector = np.array([1, 0])
backend = AerSimulator()
hhl = HHL(1e-3, quantum_instance=backend)
accurate_solution = hhl.solve(matrix, vector)
print(accurate_solution.euclidean_norm)
What should happen?
HHL should use the backend (e.g., qiskit-aer simulator) passed to the HHL constructor for the circuit evaluation when HHL.solve() is called.
Any suggestions?
No response