411 lines
16 KiB
Plaintext
411 lines
16 KiB
Plaintext
---
|
||
title: PiecewisePolynomialPauliRotations (latest version)
|
||
description: API reference for qiskit.circuit.library.PiecewisePolynomialPauliRotations in the latest version of qiskit
|
||
in_page_toc_min_heading_level: 1
|
||
python_api_type: class
|
||
python_api_name: qiskit.circuit.library.PiecewisePolynomialPauliRotations
|
||
---
|
||
|
||
# PiecewisePolynomialPauliRotations
|
||
|
||
<Class id="qiskit.circuit.library.PiecewisePolynomialPauliRotations" isDedicatedPage={true} github="https://github.com/Qiskit/qiskit/tree/stable/1.2/qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py#L27-L317" signature="qiskit.circuit.library.PiecewisePolynomialPauliRotations(num_state_qubits=None, breakpoints=None, coeffs=None, basis='Y', name='pw_poly')" modifiers="class">
|
||
Bases: [`FunctionalPauliRotations`](qiskit.circuit.library.FunctionalPauliRotations "qiskit.circuit.library.arithmetic.functional_pauli_rotations.FunctionalPauliRotations")
|
||
|
||
Piecewise-polynomially-controlled Pauli rotations.
|
||
|
||
This class implements a piecewise polynomial (not necessarily continuous) function, $f(x)$, on qubit amplitudes, which is defined through breakpoints and coefficients as follows. Suppose the breakpoints $(x_0, ..., x_J)$ are a subset of $[0, 2^n-1]$, where $n$ is the number of state qubits. Further on, denote the corresponding coefficients by $[a_{j,1},...,a_{j,d}]$, where $d$ is the highest degree among all polynomials.
|
||
|
||
Then $f(x)$ is defined as:
|
||
|
||
$$
|
||
f(x) = \begin{cases}
|
||
0, x < x_0 \\
|
||
\sum_{i=0}^{i=d}a_{j,i}/2 x^i, x_j \leq x < x_{j+1}
|
||
\end{cases}
|
||
$$
|
||
|
||
where if given the same number of breakpoints as polynomials, we implicitly assume $x_{J+1} = 2^n$.
|
||
|
||
<Admonition title="Note" type="note">
|
||
Note the $1/2$ factor in the coefficients of $f(x)$, this is consistent with Qiskit’s Pauli rotations.
|
||
</Admonition>
|
||
|
||
**Examples**
|
||
|
||
```python
|
||
>>> from qiskit import QuantumCircuit
|
||
>>> from qiskit.circuit.library.arithmetic.piecewise_polynomial_pauli_rotations import\
|
||
... PiecewisePolynomialPauliRotations
|
||
>>> qubits, breakpoints, coeffs = (2, [0, 2], [[0, -1.2],[-1, 1, 3]])
|
||
>>> poly_r = PiecewisePolynomialPauliRotations(num_state_qubits=qubits,
|
||
...breakpoints=breakpoints, coeffs=coeffs)
|
||
>>>
|
||
>>> qc = QuantumCircuit(poly_r.num_qubits)
|
||
>>> qc.h(list(range(qubits)));
|
||
>>> qc.append(poly_r.to_instruction(), list(range(qc.num_qubits)));
|
||
>>> qc.draw()
|
||
┌───┐┌──────────┐
|
||
q_0: ┤ H ├┤0 ├
|
||
├───┤│ │
|
||
q_1: ┤ H ├┤1 ├
|
||
└───┘│ │
|
||
q_2: ─────┤2 ├
|
||
│ pw_poly │
|
||
q_3: ─────┤3 ├
|
||
│ │
|
||
q_4: ─────┤4 ├
|
||
│ │
|
||
q_5: ─────┤5 ├
|
||
└──────────┘
|
||
```
|
||
|
||
**References**
|
||
|
||
**\[1]: Haener, T., Roetteler, M., & Svore, K. M. (2018).**
|
||
|
||
Optimizing Quantum Circuits for Arithmetic. [arXiv:1805.12445](http://arxiv.org/abs/1805.12445)
|
||
|
||
**\[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](https://doi.org/10.1145/3490631)
|
||
|
||
**Parameters**
|
||
|
||
* **num\_state\_qubits** (*Optional\[*[*int*](https://docs.python.org/3/library/functions.html#int "(in Python v3.13)")*]*) – The number of qubits representing the state.
|
||
* **breakpoints** (*Optional\[List\[*[*int*](https://docs.python.org/3/library/functions.html#int "(in Python v3.13)")*]]*) – The breakpoints to define the piecewise-linear function. Defaults to `[0]`.
|
||
* **coeffs** (*Optional\[List\[List\[*[*float*](https://docs.python.org/3/library/functions.html#float "(in Python v3.13)")*]]]*) – The coefficients of the polynomials for different segments of the
|
||
* **x** (*piecewise-linear function. coeffs\[j]\[i] is the coefficient of the i-th power of*) –
|
||
* **polynomial.** (*for the j-th*) – Defaults to linear: `[[1]]`.
|
||
* **basis** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.13)")) – The type of Pauli rotation (`'X'`, `'Y'`, `'Z'`).
|
||
* **name** ([*str*](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.13)")) – The name of the circuit.
|
||
|
||
## Attributes
|
||
|
||
### ancillas
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.ancillas">
|
||
A list of `AncillaQubit`s in the order that they were added. You should not mutate this.
|
||
</Attribute>
|
||
|
||
### basis
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.basis">
|
||
The kind of Pauli rotation to be used.
|
||
|
||
Set the basis to ‘X’, ‘Y’ or ‘Z’ for controlled-X, -Y, or -Z rotations respectively.
|
||
|
||
**Returns**
|
||
|
||
The kind of Pauli rotation used in controlled rotation.
|
||
</Attribute>
|
||
|
||
### breakpoints
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.breakpoints">
|
||
The breakpoints of the piecewise polynomial function.
|
||
|
||
The function is polynomial in the intervals `[point_i, point_{i+1}]` where the last point implicitly is `2**(num_state_qubits + 1)`.
|
||
|
||
**Returns**
|
||
|
||
The list of breakpoints.
|
||
</Attribute>
|
||
|
||
### calibrations
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.calibrations">
|
||
Return calibration dictionary.
|
||
|
||
The custom pulse definition of a given gate is of the form `{'gate_name': {(qubits, params): schedule}}`
|
||
</Attribute>
|
||
|
||
### clbits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.clbits">
|
||
A list of `Clbit`s in the order that they were added. You should not mutate this.
|
||
</Attribute>
|
||
|
||
### coeffs
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.coeffs">
|
||
The coefficients of the polynomials.
|
||
|
||
**Returns**
|
||
|
||
The polynomial coefficients per interval as nested lists.
|
||
</Attribute>
|
||
|
||
### contains\_zero\_breakpoint
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.contains_zero_breakpoint">
|
||
Whether 0 is the first breakpoint.
|
||
|
||
**Returns**
|
||
|
||
True, if 0 is the first breakpoint, otherwise False.
|
||
</Attribute>
|
||
|
||
### data
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.data">
|
||
The circuit data (instructions and context).
|
||
|
||
**Returns**
|
||
|
||
a list-like object containing the [`CircuitInstruction`](qiskit.circuit.CircuitInstruction "qiskit.circuit.CircuitInstruction")s for each instruction.
|
||
|
||
**Return type**
|
||
|
||
QuantumCircuitData
|
||
</Attribute>
|
||
|
||
### global\_phase
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.global_phase">
|
||
The global phase of the current circuit scope in radians.
|
||
</Attribute>
|
||
|
||
### instances
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.instances" attributeValue="256" />
|
||
|
||
### layout
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.layout">
|
||
Return any associated layout information about the circuit
|
||
|
||
This attribute contains an optional [`TranspileLayout`](qiskit.transpiler.TranspileLayout "qiskit.transpiler.TranspileLayout") object. This is typically set on the output from [`transpile()`](compiler#qiskit.compiler.transpile "qiskit.compiler.transpile") or [`PassManager.run()`](qiskit.transpiler.PassManager#run "qiskit.transpiler.PassManager.run") to retain information about the permutations caused on the input circuit by transpilation.
|
||
|
||
There are two types of permutations caused by the [`transpile()`](compiler#qiskit.compiler.transpile "qiskit.compiler.transpile") function, an initial layout which permutes the qubits based on the selected physical qubits on the [`Target`](qiskit.transpiler.Target "qiskit.transpiler.Target"), and a final layout which is an output permutation caused by [`SwapGate`](qiskit.circuit.library.SwapGate "qiskit.circuit.library.SwapGate")s inserted during routing.
|
||
</Attribute>
|
||
|
||
### mapped\_coeffs
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.mapped_coeffs">
|
||
The coefficients mapped to the internal representation, since we only compare x>=breakpoint.
|
||
|
||
**Returns**
|
||
|
||
The mapped coefficients.
|
||
</Attribute>
|
||
|
||
### metadata
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.metadata">
|
||
Arbitrary user-defined metadata for the circuit.
|
||
|
||
Qiskit will not examine the content of this mapping, but it will pass it through the transpiler and reattach it to the output, so you can track your own metadata.
|
||
</Attribute>
|
||
|
||
### num\_ancilla\_qubits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_ancilla_qubits">
|
||
The minimum number of ancilla qubits in the circuit.
|
||
|
||
**Returns**
|
||
|
||
The minimal number of ancillas required.
|
||
</Attribute>
|
||
|
||
### num\_ancillas
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_ancillas">
|
||
Return the number of ancilla qubits.
|
||
</Attribute>
|
||
|
||
### num\_captured\_vars
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_captured_vars">
|
||
The number of real-time classical variables in the circuit marked as captured from an enclosing scope.
|
||
|
||
This is the length of the `iter_captured_vars()` iterable. If this is non-zero, [`num_input_vars`](#qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_input_vars "qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_input_vars") must be zero.
|
||
</Attribute>
|
||
|
||
### num\_clbits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_clbits">
|
||
Return number of classical bits.
|
||
</Attribute>
|
||
|
||
### num\_declared\_vars
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_declared_vars">
|
||
The number of real-time classical variables in the circuit that are declared by this circuit scope, excluding inputs or captures.
|
||
|
||
This is the length of the `iter_declared_vars()` iterable.
|
||
</Attribute>
|
||
|
||
### num\_input\_vars
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_input_vars">
|
||
The number of real-time classical variables in the circuit marked as circuit inputs.
|
||
|
||
This is the length of the `iter_input_vars()` iterable. If this is non-zero, [`num_captured_vars`](#qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_captured_vars "qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_captured_vars") must be zero.
|
||
</Attribute>
|
||
|
||
### num\_parameters
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_parameters">
|
||
The number of parameter objects in the circuit.
|
||
</Attribute>
|
||
|
||
### num\_qubits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_qubits">
|
||
Return number of qubits.
|
||
</Attribute>
|
||
|
||
### num\_state\_qubits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_state_qubits">
|
||
The number of state qubits representing the state $|x\rangle$.
|
||
|
||
**Returns**
|
||
|
||
The number of state qubits.
|
||
</Attribute>
|
||
|
||
### num\_vars
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.num_vars">
|
||
The number of real-time classical variables in the circuit.
|
||
|
||
This is the length of the `iter_vars()` iterable.
|
||
</Attribute>
|
||
|
||
### op\_start\_times
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.op_start_times">
|
||
Return a list of operation start times.
|
||
|
||
This attribute is enabled once one of scheduling analysis passes runs on the quantum circuit.
|
||
|
||
**Returns**
|
||
|
||
List of integers representing instruction start times. The index corresponds to the index of instruction in `QuantumCircuit.data`.
|
||
|
||
**Raises**
|
||
|
||
[**AttributeError**](https://docs.python.org/3/library/exceptions.html#AttributeError "(in Python v3.13)") – When circuit is not scheduled.
|
||
</Attribute>
|
||
|
||
### parameters
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.parameters">
|
||
The parameters defined in the circuit.
|
||
|
||
This attribute returns the [`Parameter`](qiskit.circuit.Parameter "qiskit.circuit.Parameter") objects in the circuit sorted alphabetically. Note that parameters instantiated with a [`ParameterVector`](qiskit.circuit.ParameterVector "qiskit.circuit.ParameterVector") are still sorted numerically.
|
||
|
||
**Examples**
|
||
|
||
The snippet below shows that insertion order of parameters does not matter.
|
||
|
||
```python
|
||
>>> from qiskit.circuit import QuantumCircuit, Parameter
|
||
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
|
||
>>> circuit = QuantumCircuit(1)
|
||
>>> circuit.rx(b, 0)
|
||
>>> circuit.rz(elephant, 0)
|
||
>>> circuit.ry(a, 0)
|
||
>>> circuit.parameters # sorted alphabetically!
|
||
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])
|
||
```
|
||
|
||
Bear in mind that alphabetical sorting might be unintuitive when it comes to numbers. The literal “10” comes before “2” in strict alphabetical sorting.
|
||
|
||
```python
|
||
>>> from qiskit.circuit import QuantumCircuit, Parameter
|
||
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
|
||
>>> circuit = QuantumCircuit(1)
|
||
>>> circuit.u(*angles, 0)
|
||
>>> circuit.draw()
|
||
┌─────────────────────────────┐
|
||
q: ┤ U(angle_1,angle_2,angle_10) ├
|
||
└─────────────────────────────┘
|
||
>>> circuit.parameters
|
||
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])
|
||
```
|
||
|
||
To respect numerical sorting, a [`ParameterVector`](qiskit.circuit.ParameterVector "qiskit.circuit.ParameterVector") can be used.
|
||
|
||
```python
|
||
>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
|
||
>>> x = ParameterVector("x", 12)
|
||
>>> circuit = QuantumCircuit(1)
|
||
>>> for x_i in x:
|
||
... circuit.rx(x_i, 0)
|
||
>>> circuit.parameters
|
||
ParameterView([
|
||
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
||
ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
|
||
..., ParameterVectorElement(x[11])
|
||
])
|
||
```
|
||
|
||
**Returns**
|
||
|
||
The sorted [`Parameter`](qiskit.circuit.Parameter "qiskit.circuit.Parameter") objects in the circuit.
|
||
</Attribute>
|
||
|
||
### prefix
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.prefix" attributeValue="'circuit'" />
|
||
|
||
### qregs
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.qregs" attributeTypeHint="list[QuantumRegister]">
|
||
A list of the `QuantumRegister`s in this circuit. You should not mutate this.
|
||
</Attribute>
|
||
|
||
### qubits
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.qubits">
|
||
A list of `Qubit`s in the order that they were added. You should not mutate this.
|
||
</Attribute>
|
||
|
||
### name
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.name" attributeTypeHint="str">
|
||
A human-readable name for the circuit.
|
||
</Attribute>
|
||
|
||
### cregs
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.cregs" attributeTypeHint="list[ClassicalRegister]">
|
||
A list of the `ClassicalRegister`s in this circuit. You should not mutate this.
|
||
</Attribute>
|
||
|
||
### duration
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.duration" attributeTypeHint="int | float | None">
|
||
The total duration of the circuit, set by a scheduling transpiler pass. Its unit is specified by [`unit`](#qiskit.circuit.library.PiecewisePolynomialPauliRotations.unit "qiskit.circuit.library.PiecewisePolynomialPauliRotations.unit").
|
||
</Attribute>
|
||
|
||
### unit
|
||
|
||
<Attribute id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.unit">
|
||
The unit that [`duration`](#qiskit.circuit.library.PiecewisePolynomialPauliRotations.duration "qiskit.circuit.library.PiecewisePolynomialPauliRotations.duration") is specified in.
|
||
</Attribute>
|
||
|
||
## Methods
|
||
|
||
### evaluate
|
||
|
||
<Function id="qiskit.circuit.library.PiecewisePolynomialPauliRotations.evaluate" github="https://github.com/Qiskit/qiskit/tree/stable/1.2/qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py#L210-L224" signature="evaluate(x)">
|
||
Classically evaluate the piecewise polynomial rotation.
|
||
|
||
**Parameters**
|
||
|
||
**x** ([*float*](https://docs.python.org/3/library/functions.html#float "(in Python v3.13)")) – Value to be evaluated at.
|
||
|
||
**Returns**
|
||
|
||
Value of piecewise polynomial function at x.
|
||
|
||
**Return type**
|
||
|
||
[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.13)")
|
||
</Function>
|
||
</Class>
|
||
|