Skip to main contentIBM Quantum Documentation
This page is from an old version of Qiskit SDK and does not exist in the latest version. We recommend you migrate to the latest version. See the release notes for more information.

HHL

class HHL(epsilon=0.01, expectation=None, quantum_instance=None)

GitHub

Bases: qiskit.algorithms.linear_solvers.linear_solver.LinearSolver

The deprecated systems of linear equations arise naturally in many real-life applications in a wide range of areas, such as in the solution of Partial Differential Equations, the calibration of financial models, fluid simulation or numerical field calculation. The problem can be defined as, given a matrix ACN×NA\in\mathbb{C}^{N\times N} and a vector bCN\vec{b}\in\mathbb{C}^{N}, find xCN\vec{x}\in\mathbb{C}^{N} satisfying Ax=bA\vec{x}=\vec{b}.

A system of linear equations is called ss-sparse if AA has at most ss non-zero entries per row or column. Solving an ss-sparse system of size NN with a classical computer requires O(Nsκlog(1/ϵ))\mathcal{ O }(Ns\kappa\log(1/\epsilon)) running time using the conjugate gradient method. Here κ\kappa denotes the condition number of the system and ϵ\epsilon the accuracy of the approximation.

The deprecated HHL is a quantum algorithm to estimate a function of the solution with running time complexity of O(log(N)s2κ2/ϵ)\mathcal{ O }(\log(N)s^{2}\kappa^{2}/\epsilon) when AA is a Hermitian matrix under the assumptions of efficient oracles for loading the data, Hamiltonian simulation and computing a function of the solution. This is an exponential speed up in the size of the system, however one crucial remark to keep in mind is that the classical algorithm returns the full solution, while the HHL can only approximate functions of the solution vector.

The HHL class is deprecated as of Qiskit Terra 0.22.0 and will be removed no sooner than 3 months after the release date. It is replaced by the tutorial at HHL

Examples:

import warnings
import numpy as np
from qiskit import QuantumCircuit
from qiskit.algorithms.linear_solvers.hhl import HHL
from qiskit.algorithms.linear_solvers.matrices import TridiagonalToeplitz
from qiskit.algorithms.linear_solvers.observables import MatrixFunctional
 
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    matrix = TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2)
    right_hand_side = [1.0, -2.1, 3.2, -4.3]
    observable = MatrixFunctional(1, 1 / 2)
    rhs = right_hand_side / np.linalg.norm(right_hand_side)
 
# Initial state circuit
num_qubits = matrix.num_state_qubits
qc = QuantumCircuit(num_qubits)
qc.isometry(rhs, list(range(num_qubits)), None)
 
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    hhl = HHL()
    solution = hhl.solve(matrix, qc, observable)
approx_result = solution.observable

References

[1]: Harrow, A. W., Hassidim, A., Lloyd, S. (2009).

Quantum algorithm for linear systems of equations. Phys. Rev. Lett. 103, 15 (2009), 1–15.

[2]: Carrera Vazquez, A., Hiptmair, R., & Woerner, S. (2022).

Enhancing the Quantum Linear Systems Algorithm Using Richardson Extrapolation. ACM Transactions on Quantum Computing 3, 1, Article 2

Parameters

  • epsilon (float) – Error tolerance of the approximation to the solution, i.e. if xx is the exact solution and x~\tilde{x} the one calculated by the algorithm, then xx~epsilon||x - \tilde{x}|| \le epsilon.
  • expectation (Optional[ExpectationBase]) – The expectation converter applied to the expectation values before evaluation. If None then PauliExpectation is used.
  • quantum_instance (Union[Backend, QuantumInstance, None]) – Quantum Instance or Backend. If None, a Statevector calculation is done.

Methods

construct_circuit

HHL.construct_circuit(matrix, vector, neg_vals=True)

Construct the HHL circuit.

Parameters

  • matrix (Union[List, ndarray, QuantumCircuit]) – The matrix specifying the system, i.e. A in Ax=b.
  • vector (Union[List, ndarray, QuantumCircuit]) – The vector specifying the right hand side of the equation in Ax=b.
  • neg_vals (Optional[bool]) – States whether the matrix has negative eigenvalues. If False the
  • cheaper. (computation becomes) –

Return type

QuantumCircuit

Returns

The HHL circuit.

Raises

  • ValueError – If the input is not in the correct format.
  • ValueError – If the type of the input matrix is not supported.

solve

HHL.solve(matrix, vector, observable=None, observable_circuit=None, post_processing=None)

Tries to solve the given linear system of equations.

Parameters

  • matrix (Union[List, ndarray, QuantumCircuit]) – The matrix specifying the system, i.e. A in Ax=b.
  • vector (Union[List, ndarray, QuantumCircuit]) – The vector specifying the right hand side of the equation in Ax=b.
  • observable (Union[LinearSystemObservable, BaseOperator, List[LinearSystemObservable], List[BaseOperator], None]) – Optional information to be extracted from the solution. Default is the probability of success of the algorithm.
  • observable_circuit (Union[QuantumCircuit, List[QuantumCircuit], None]) – Optional circuit to be applied to the solution to extract information. Default is None.
  • post_processing (Optional[Callable[[Union[float, List[float]]], Union[float, List[float]]]]) – Optional function to compute the value of the observable. Default is the raw value of measuring the observable.

Raises

ValueError – If an invalid combination of observable, observable_circuit and post_processing is passed.

Return type

LinearSolverResult

Returns

The result object containing information about the solution vector of the linear system.


Attributes

expectation

The expectation value algorithm used to construct the expectation measurement from the observable.

Return type

ExpectationBase

quantum_instance

Get the quantum instance.

Return type

Optional[QuantumInstance]

Returns

The quantum instance used to run this algorithm.

scaling

The scaling of the solution vector.

Return type

float

Was this page helpful?
Report a bug or request content on GitHub.