Skip to content

HHL.solve() doesn't use specified quantum_instance. #8735

@ahehn-nv

Description

@ahehn-nv

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmod: algorithmsRelated to the Algorithms module

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions