144 lines
5.1 KiB
Plaintext
144 lines
5.1 KiB
Plaintext
---
|
||
title: MatrixFunctional
|
||
description: API reference for qiskit.algorithms.linear_solvers.MatrixFunctional
|
||
in_page_toc_min_heading_level: 1
|
||
python_api_type: class
|
||
python_api_name: qiskit.algorithms.linear_solvers.MatrixFunctional
|
||
---
|
||
|
||
# MatrixFunctional
|
||
|
||
<Class id="qiskit.algorithms.linear_solvers.MatrixFunctional" isDedicatedPage={true} github="https://github.com/qiskit/qiskit/tree/stable/0.21/qiskit/algorithms/linear_solvers/observables/matrix_functional.py" signature="MatrixFunctional(main_diag, off_diag)" modifiers="class">
|
||
Bases: [`qiskit.algorithms.linear_solvers.observables.linear_system_observable.LinearSystemObservable`](qiskit.algorithms.linear_solvers.LinearSystemObservable "qiskit.algorithms.linear_solvers.observables.linear_system_observable.LinearSystemObservable")
|
||
|
||
A class for the matrix functional of the vector solution to the linear systems.
|
||
|
||
**Examples**
|
||
|
||
```python
|
||
import numpy as np
|
||
from qiskit import QuantumCircuit
|
||
from qiskit.algorithms.linear_solvers.observables.matrix_functional import MatrixFunctional
|
||
from qiskit.transpiler.passes import RemoveResetInZeroState
|
||
from qiskit.opflow import StateFn
|
||
|
||
tpass = RemoveResetInZeroState()
|
||
|
||
vector = [1.0, -2.1, 3.2, -4.3]
|
||
observable = MatrixFunctional(1, -1 / 3)
|
||
|
||
init_state = vector / np.linalg.norm(vector)
|
||
num_qubits = int(np.log2(len(vector)))
|
||
|
||
# Get observable circuits
|
||
obs_circuits = observable.observable_circuit(num_qubits)
|
||
qcs = []
|
||
for obs_circ in obs_circuits:
|
||
qc = QuantumCircuit(num_qubits)
|
||
qc.isometry(init_state, list(range(num_qubits)), None)
|
||
qc.append(obs_circ, list(range(num_qubits)))
|
||
qcs.append(tpass(qc.decompose()))
|
||
|
||
# Get observables
|
||
observable_ops = observable.observable(num_qubits)
|
||
state_vecs = []
|
||
# First is the norm
|
||
state_vecs.append((~StateFn(observable_ops[0]) @ StateFn(qcs[0])).eval())
|
||
for i in range(1, len(observable_ops), 2):
|
||
state_vecs += [(~StateFn(observable_ops[i]) @ StateFn(qcs[i])).eval(),
|
||
(~StateFn(observable_ops[i + 1]) @ StateFn(qcs[i + 1])).eval()]
|
||
|
||
# Obtain result
|
||
result = observable.post_processing(state_vecs, num_qubits)
|
||
|
||
# Obtain analytical evaluation
|
||
exact = observable.evaluate_classically(init_state)
|
||
```
|
||
|
||
**Parameters**
|
||
|
||
* **main\_diag** (`float`) – The main diagonal of the tridiagonal Toeplitz symmetric matrix to compute the functional.
|
||
* **off\_diag** (`int`) – The off diagonal of the tridiagonal Toeplitz symmetric matrix to compute the functional.
|
||
|
||
## Methods
|
||
|
||
### evaluate\_classically
|
||
|
||
<Function id="qiskit.algorithms.linear_solvers.MatrixFunctional.evaluate_classically" signature="MatrixFunctional.evaluate_classically(solution)">
|
||
Evaluates the given observable on the solution to the linear system.
|
||
|
||
**Parameters**
|
||
|
||
**solution** (`Union`\[`array`, [`QuantumCircuit`](qiskit.circuit.QuantumCircuit "qiskit.circuit.quantumcircuit.QuantumCircuit")]) – The solution to the system as a numpy array or the circuit that prepares it.
|
||
|
||
**Return type**
|
||
|
||
`float`
|
||
|
||
**Returns**
|
||
|
||
The value of the observable.
|
||
</Function>
|
||
|
||
### observable
|
||
|
||
<Function id="qiskit.algorithms.linear_solvers.MatrixFunctional.observable" signature="MatrixFunctional.observable(num_qubits)">
|
||
The observable operators.
|
||
|
||
**Parameters**
|
||
|
||
**num\_qubits** (`int`) – The number of qubits on which the observable will be applied.
|
||
|
||
**Return type**
|
||
|
||
`Union`\[[`TensoredOp`](qiskit.opflow.list_ops.TensoredOp "qiskit.opflow.list_ops.tensored_op.TensoredOp"), `List`\[[`TensoredOp`](qiskit.opflow.list_ops.TensoredOp "qiskit.opflow.list_ops.tensored_op.TensoredOp")]]
|
||
|
||
**Returns**
|
||
|
||
The observable as a list of sums of Pauli strings.
|
||
</Function>
|
||
|
||
### observable\_circuit
|
||
|
||
<Function id="qiskit.algorithms.linear_solvers.MatrixFunctional.observable_circuit" signature="MatrixFunctional.observable_circuit(num_qubits)">
|
||
The circuits to implement the matrix functional observable.
|
||
|
||
**Parameters**
|
||
|
||
**num\_qubits** (`int`) – The number of qubits on which the observable will be applied.
|
||
|
||
**Return type**
|
||
|
||
`Union`\[[`QuantumCircuit`](qiskit.circuit.QuantumCircuit "qiskit.circuit.quantumcircuit.QuantumCircuit"), `List`\[[`QuantumCircuit`](qiskit.circuit.QuantumCircuit "qiskit.circuit.quantumcircuit.QuantumCircuit")]]
|
||
|
||
**Returns**
|
||
|
||
The observable as a list of QuantumCircuits.
|
||
</Function>
|
||
|
||
### post\_processing
|
||
|
||
<Function id="qiskit.algorithms.linear_solvers.MatrixFunctional.post_processing" signature="MatrixFunctional.post_processing(solution, num_qubits, scaling=1)">
|
||
Evaluates the matrix functional on the solution to the linear system.
|
||
|
||
**Parameters**
|
||
|
||
* **solution** (`Union`\[`float`, `List`\[`float`]]) – The list of probabilities calculated from the circuit and the observable.
|
||
* **num\_qubits** (`int`) – The number of qubits where the observable was applied.
|
||
* **scaling** (`float`) – Scaling of the solution.
|
||
|
||
**Return type**
|
||
|
||
`float`
|
||
|
||
**Returns**
|
||
|
||
The value of the absolute average.
|
||
|
||
**Raises**
|
||
|
||
**ValueError** – If the input is not in the correct format.
|
||
</Function>
|
||
</Class>
|
||
|