API#
Submodules#
pyquest.core module#
Classes and attributes for the core functionality of pyQuEST.
This module contains classes that are needed for the core tasks of pyQuEST, like the QuEST environment and register, as well as some useful properties.
- np_qreal#
Numpy equivalent to the precision of real float in the QuEST backend (qreal).
- Type:
type
- np_qcomp#
Numpy equivalent to the precision of the complex float type in QuEST (qcomp).
- Type:
type
- Classes:
QuESTEnvironment: Holds internals for the QuEST backend. Register: A quantum register holding a number of qubits. Circuit: A collection of operators to be applied to a Register at once.
- class Circuit(operators=None)#
Bases:
GlobalOperatorA collection of quantum operations in sequence.
For now, this class is just a glorified list of objects derived from
BaseOperator, but will get more useful features in the future.Create a new
Circuitfrom an iterable of gates.- Parameters:
operators (iterable[BaseOperator]) – The individual operators to wrap in a
Circuit.
- inverse#
The inverse of a
Circuit.Can only be returned if every contained opartor itself has the
inverseproperty implemented.
- remove(self, op)#
Remove operator
opfrom theself
- class QuESTEnvironment#
Bases:
objectClass holding internals for the QuEST library.
QuEST needs a
QuESTEnvstruct to create and destroy registers and other data structures, and this class wraps such a struct for pyQuEST to use for its operations. There should never be the need for the user to create an instance of this class, it should only be instantiated once by the__init__.pyof the package.Registers created in a QuESTEnvironment are tracked with weak references and destroyed before closing the environment.
A
QuESTEnvironmentobject also holds information about the execution environment of QuEST, like number of threads, whether GPU acceleration is enabled, etc. These are object properties.- close_env(self)#
Close the QuEST environment.
Does not need to be called by the user during normal operation and has mainly debug purposes.
- cuda#
Get whether the execution is GPU accelerated.
- env_capsule#
- logged_registers#
Get all alive registers created with this environment.
- mpi#
Get whether distributed execution is enabled.
- num_ranks#
Get the number of distributed processes in distributed mode.
Each rank is processed on a single node, but may utilise multiple local threads.
- num_threads#
Get the number of threads for execution.
- openmp#
Get whether multithreading is enabled.
- precision#
Get the precision of the QuEST floating point data type.
Amplitudes and other variables in the QuEST library are stored in a float data type, whose size can be defined at compile time to be single (1), double (2), or quad (4) precision.
- rank#
Get the rank of the host process in an MPI environment.
The rank can be used to identify a specific process within an MPI execution environment and execute code in only one of these processes. This is useful for printing messages and accessing the file system.
- class Register(num_qubits=-1, density_matrix=False, copy_reg=None)#
Bases:
objectA quantum register holding a quantum state.
Stores the amplitudes of a quantum states for a given number of qubits, either as a pure state vector, or a density matrix.
Create new register from scratch or copy an existing state.
- Parameters:
num_qubits (int) – Number of qubits in the register. For density matrices the number of qubits internally required to represent the state is 2 * num_qubits. Must not be passed if copy_reg is not None.
density_matrix (bool) – True if the register should represent a density matrix, False otherwise. Ignored if copy_reg is not None. Defaults to False.
copy_reg (Register) – If given and not None, makes the newly created register an exact copy of copy_reg.
- apply_circuit(self, Circuit circ)#
Apply a
Circuitto the stored state.If the circuit contains any measurements, their outcomes are returned as a (nested) list.
- apply_operator(self, BaseOperator op)#
Apply a single quantum operator to the stored state.
If the operator is a measurement, returns the measured outcomes as a list.
- copy_from(self, Register other) void#
Copy the state from another
Register.The other register must have the same number of qubits and be of the same type (state vector or density matrix).
- copy_to(self, Register other) void#
Copy the state to another
Register.The other register must have the same number of qubits and be of the same type (state vector or density matrix).
- destroy_reg(self)#
Free the resources of the underlying data structure.
Destroys the QuEST register and frees its resources. Memory is automatically freed when the object is garbage collected, but users may sometimes want to free a register manually. If the register has already been freed, do nothing.
- fidelity(self, Register other) qreal#
Calculate fidelity with the pure state in another register.
- Raises:
QuESTError – If other register is not a state vector.
- init_blank_state(self)#
Set all amplitudes to zero.
- inner_product(self, Register other) double complex#
Calculate the inner product of self with another state.
If both self and other are state vectors, returns the regular inner product of the vectors. If both are density matrices, returns the Hilbert-Schmidt inner product.
- Raises:
QuESTError – If self and other are not both state vecotrs or both density matrices.
- is_alive#
Return whether the underlying QuEST structure is valid.
- is_density_matrix#
Return whether the register represents a density matrix.
- num_amps#
Return the number of amplitudes stored in the register.
This is given by 2 ** num_qubits for pure states, and 2 ** (2 * num_qubits) for density matrices.
- num_qubits#
Return the number of qubits in the register.
- prob_of_all_outcomes(self, qubits)#
Calculate probabilities of all measurement outcomes.
For all possible states of the sub-register given by
qubits, the probability of measuring each of the states is calculated and returned in an array.- Parameters:
qubits (int | array_like[int]) – An object, that numpy can convert into an array. That array will be flattened, and its elements are the indices of qubits to consider for the measurement outcomes. For the purpose of indexing the output array, the entries of
qubitsare considered to be in _increasing_ order of significance. The qubits need not be contiguous or in any specific order.- Returns:
- Probabilities of measuring each output.
The elements in the returned array are ordered such that the qubits in
qubitsare ordered from low to high significance. The following table illustrates this by mapping the index in the returned array k to the measurement output corresponding to that index.k
qubits[2]
qubits[1]
qubits[0]
0
0
0
0
1
0
0
1
2
0
1
0
3
0
1
1
4
1
0
0
…
…
…
…
Index 2 of the returned array, for example, contains the probability of measuring only
qubits[1]in state 1, and all other qubits in state 0. The element at index 3 gives the probability of measuring bothqubit[0]andqubit[1]in state 1, and all others in state 0.The returned array has a size of
2**len(qubits).
- Return type:
np.ndarray[qreal]
- purity#
Return the purity of the stored quantum state.
- total_prob#
Return the probability of being in any state.
For properly normalised pure states and density matrices, this will be 1. More accurate than self * self. For not-normalised density matrices, only the real part of the trace is returned.
- static zero_like(Register other)#
Create a new register with the same properties as
other.The size and type (state vector or density matrix) of the newly created register are identical to
other, but the returned register is initialised to the zero product state.
pyquest.decoherence module#
- class Damping#
Bases:
SingleQubitOperator
- class Dephasing#
Bases:
MultiQubitOperator
- class Depolarising#
Bases:
MultiQubitOperator- prob#
- class KrausMap#
Bases:
MultiQubitOperator
- class MixDensityMatrix#
Bases:
GlobalOperator
- class PauliNoise#
Bases:
SingleQubitOperator
pyquest.gates module#
Classes to represent norm-conserving operations in pyquest.
This module contains classes representing non-unitary but
norm-conserving operations on a quantum state. They generally use short
names, but often have more verbose aliases, which are defined at the end
of the file and listed in the Classes section after each gate in
square brackets.
- Classes:
M [Measurement]: Measurement of one or more qubits.
- class M#
Bases:
MultiQubitOperatorClass implementing measurements.
When applied to a register, an object of this class performs a measurement of one or more qubits in the \(z\)-basis. Qubits are measured in the order they are given in the targets argument.
The results of the last time the gate was applied to a register are available in the
resultsproperty, the corresponding probabilities are in theprobabilitiesproperty.For faster calculations (e.g. when post-selecting on a measurement outcome), the (unphysical) additional option of forcing the outcome of the measurement by providing it in the
forcearument.- Parameters:
targets (int | iterable[int]) – Indices of the qubits to measure, in the order they are supposed to be measured. Can be a scalar for a single target, or an iterable for multiple targets. Remember that measurements are destructive and the outcome of an earlier measurement can influence the probabilities of later measurements.
target (int | iterable[int]) – Alternative for
targets; only one oftargetortargetsmay be notNone.force (int | iterable[int]) – Force the outcome of all or some measurements. Can be a scalar or an iterable of length 1, if a single qubit is measured. Must be
Noneor an iterable of the same length astargets, if multiple qubits are measured. Each entry must be eitherNone(meaning do not force the outcome of that specific measurement),0, or1. Defaults toNone.
- QuEST functions:
- force#
What the measurment outcomes of this operator are forced to be.
Returns a list of the same length as
targetswith each element either0,1, orNone, with0or1meaning force the outcome of that target to this result, andNonemeaning do not force the outcome of this target.
- probabilities#
The probabilities of each outcome of the last measurement.
- results#
The outcomes of the last measurement using this operator.
pyquest.initialisations module#
- class BlankState#
Bases:
StateInitSet all amplitudes in a
Registerto zero.Applying this operator results in an unphysical state. Make sure to set the amplitudes appropriately afterwards.
- QuEST function:
- class ClassicalState#
Bases:
StateInitInitialise a
Registerto a specific computational basis state.Applying this operator sets the amplitude of a pre-defined computational basis state to 1 and all others to 0.
- Parameters:
state_ind (int) – The index of the computational basis state which should be set to 1. Its binary representation is the bit pattern of the appropriate basis state.
- QuEST function:
- class PlusState#
Bases:
StateInitInitialise a
Registerto a N-qubit plus-state.Applying this operator puts each qubit in a
Registerin the plus-state and is thus equivalent to first initialising to the all-zero computational basis state followed by a Hadamard gate on every qubit (but this initialisation is faster).- QuEST function:
- class PureState#
Bases:
StateInitInitialise a
Registerinto a predefined pure state.Applying this operator sets the state in a Register to a pure state that must be provided when the operator is created.
- Parameters:
pure_state (Register) – A state vector (not density matrix) register containing the state a different register should later be set to (upon application of this operator).
copy_state (bool) – Whether the state in
pure_stateshould be copied into a new memory location to be kept as reference. Setting this toTrueuses more memory to store the state, but does not rely on the reference register to remain unchanged. If set toFalse, changes to the registerpure_statewill also affect the action of applying this operator. However, it saves some memory as the state does not need to be duplicated.
- QuEST function:
- class StateInit#
Bases:
GlobalOperator
pyquest.operators module#
Classes to represent generic operations in pyquest.
The most generic (possibly non-unitary, non-norm-preserving) operations on quantum states are contained in this module.
- Classes:
- BaseOperator:
Abstract generic base class for all operators.
- ControlledOperator:
Base class for all controlled operators.
- SingleQubitOperator:
Base class for operators acting on a single qubit.
- MultiQubitOperator:
Base class for operators potentially acting on multiple qubits.
- MatrixOperator:
Most generic operator, specified by its matrix representation.
- PauliProduct:
A weighted product of Pauli operators.
- PauliSum:
A sum of ´´PauliProduct´´s.
- class BaseOperator#
Bases:
objectGeneric base class for every class representing an operator.
All operators on a quantum state must be derived from this class in order to work with pyquest. It only provides prototypes for the most basic tasks and returns a
NotImplementedErrorif not properly overridden.- Cython attributes:
- TYPE (pyquest.quest_interface.OP_TYPES): Identifier of the
operation for faster type checking than with
IsInstance().
- as_matrix(self, num_qubits=None)#
Return the operator in matrix representation.
- inverse#
Calculate and return the inverse of an operator.
- targets#
Return a list of qubits this operator acts on.
- class ControlledOperator#
Bases:
BaseOperatorClass implementing functionality for controlled operations.
Abstract base class handling the keyword-only
controlsargument in the constructor and providing an interface for accessing it.- controls#
The control qubits of the operator.
Always returns a list, which may be empty or contain only one element.
- class DiagonalOperator#
Bases:
GlobalOperator
- class FullQFT#
Bases:
GlobalOperator
- class GlobalOperator#
Bases:
BaseOperator
- class MatrixOperator(targets=None, matrix=None, controls=None, target=None, **kwargs)#
Bases:
MultiQubitOperator- matrix#
- class MultiQubitOperator#
Bases:
ControlledOperatorClass implementing an operator with multiple target qubits.
Abstract base class for operators with (potentially) more than one target qubit. Provides functionality for accessing the target qubits.
- target#
The targets of the operator as integer or list.
If the operator has a single target, return it as an integer, otherwise return a list of integers (i.e. identical to the
targetsproperty). This exists mostly for consistency with single-target operators, which also return a scalar from theirtargetproperty.
- targets#
The targets of the operator as a list of integers.
- class PauliProduct#
Bases:
GlobalOperator
- class PauliSum#
Bases:
GlobalOperator
- class PhaseFunc#
Bases:
GlobalOperator- class FuncType(value)#
Bases:
IntEnumAn enumeration.
- NORM = 0#
- SCALED_NORM = 1#
- INVERSE_NORM = 2#
- SCALED_INVERSE_NORM = 3#
- SCALED_INVERSE_SHIFTED_NORM = 4#
- PRODUCT = 5#
- SCALED_PRODUCT = 6#
- INVERSE_PRODUCT = 7#
- SCALED_INVERSE_PRODUCT = 8#
- DISTANCE = 9#
- SCALED_DISTANCE = 10#
- INVERSE_DISTANCE = 11#
- SCALED_INVERSE_DISTANCE = 12#
- SCALED_INVERSE_SHIFTED_DISTANCE = 13#
- EXPONENTIAL_POLYNOMIAL = 14#
- bit_encoding#
- divergence_override#
- func_type#
- inverse#
- overrides#
- scaling#
- shifts#
- targets#
- terms#
- class QFT#
Bases:
MultiQubitOperator
- class SingleQubitOperator#
Bases:
ControlledOperatorClass implementing an operator with only one target qubit.
Abstract base class for all operator acting on a single qubit only. Provides properties for accessing the target qubit.
- target#
The target qubit of the operator.
- targets#
The target qubit of the operator as a single-item list.
This property exists mostly for consistency with multi-target operators, which also return a list from their
targetsproperty.
- class TrotterCircuit#
Bases:
GlobalOperator
pyquest.quest_error module#
- exception QuESTError#
Bases:
Exception
pyquest.unitaries module#
Classes to represent unitary operations in pyquest.
This module contains classes representing unitary operations on a
quantum state. They generally use short names, but often have more
verbose aliases, which are defined at the end of the file and listed
in the Classes section after each gate in square brackets.
- Classes:
- U [Unitary]:
Generic unitary gate for which a matrix form must be given.
- CompactU [CompactUnitary]:
Single-qubit unitary in a compact form with only 2 parameters.
- X [NOT, PauliX]:
Single-qubit Pauli-X gate.
- Y [PauliY]:
Single-qubit Pauli-Y gate.
- Z [PauliZ]:
Single-qubit Pauli-Z gate.
- Swap:
Swap gate on exactly two qubits.
- SqrtSwap:
Square root of swap gate on exactly two qubits.
- H [Hadamard]:
Single-qubit Hadamard gate.
- S [SGate]:
Single-qubit phase shift gate with a phase of \(\pi/2\) (S-Gate).
- T [TGate]:
Single-qubit phase shift gate with a phase of \(\pi/4\) (T-Gate).
- BaseRotate:
Abstract base class for all rotation gates.
- Rx [RotateX]:
Single-qubit gate rotating about the x-axis of the Bloch sphere.
- Ry [RotateY]:
Single-qubit gate rotating about the y-axis of the Bloch sphere.
- Rz [RotateZ]:
Single-qubit gate rotating about the z-axis of the Bloch sphere.
- Phase [PhaseShift]:
Single-qubit gate shifting the phase of the \(\vert 1\rangle\) state.
- RotateAroundAxis:
Single-qubit gate rotating the qubit about an arbitrary axis.
- class BaseRotate#
Bases:
SingleQubitOperatorAbstract base class for Pauli rotation gates.
This class does not usually need to be instantiated by the user.
- angle#
- inverse#
- class CompactU(target, alpha, beta, controls=None)#
Bases:
SingleQubitOperatorA single-qubit unitary in compact representation.
Because a unitary operator on a single qubit only has two degrees of freedom (up to an unphysical global phase factor), this operator allows the specification of such an operator with only two parameters \(\alpha\), \(\beta\), which make up the unitary
\[\begin{split}U = \begin{pmatrix} \alpha & -\beta^\ast \\ \beta & \alpha^\ast \end{pmatrix},\end{split}\]where \(\lvert\alpha\rvert^2 + \lvert\beta\rvert^2 = 1\) must hold.
- Parameters:
target (int) – The target qubit of the operator.
CompactUonly supports single targets.alpha (float) – Parameter of the unitary \(U\) as specified above.
beta (float) – Parameter of the unitary \(U\) as specified above.
controls (int) – An optional control qubit of the operator. Passing
Noneor an empty list means no controls. This operator supports at most one control qubit. Default:None.
- QuEST functions:
- class H(target)#
Bases:
SingleQubitOperatorA Hadamard gate on a single qubit.
The
Hoperator interconverts between the \(\lvert 0\rangle, \lvert 1\rangle\) and the \(\lvert +\rangle, \lvert -\rangle\) basis. In the computational basis, it has the matrix representation\[\begin{split}H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}\end{split}\]- Parameters:
target (int) – The qubit to which the operator should be applied.
- QuEST function:
- inverse#
- class MultiRotatePauli#
Bases:
BaseRotate
- class ParamSwap#
Bases:
BaseRotate
- class Phase(target, angle, controls=None)#
Bases:
BaseRotateAdd a phase to the 1-state of a set of qubits.
When acting on a single target, the
Phaseoperator has the following matrix representation.\[\begin{split}P(\theta) = \begin{pmatrix} 1 & 0 \\ 0 & \exp{i\theta} \end{pmatrix}\end{split}\]The
Phaseoperator is somewhat similar to that of theZoperator in that it makes no difference which qubits are called targets and which are called controls. For consistency, exactly onetargetqubit must be named, the rest must go in thecontrolsargument. However, the action of the operator is invariant under swapping thetargetfor any of thecontrols.- Parameters:
target (int) – The qubit to phase shift.
angle (float) – The angle \(\theta\) as defined above.
controls (int | iterable[int]) – An optional list of control qubits. In the
Phaseoperater, there is no functional difference betweentargetandcontrols, but for more than a single target, all but one of the indices must be passed via thecontrolsparameter. An empty list orNonesignifies only a single target. Default:None.
- QuEST functions:
- class RotateAroundAxis(target, angle, axis, controls=None)#
Bases:
BaseRotateRotate a single qubit around a defined vector on the Bloch-sphere.
The axis to rotate around is normalised by the QuEST backend, but must not be zero in magnitude. The resulting operator is
\[R_{\hat{n}}(\theta) = \exp\left(-i\frac{\theta}{2} \hat{n} \cdot \vec{\sigma}\right)\]where \(\vec{\sigma}\) is a vector of Pauli-operators. The
RotateAroundAxisoperator supports at most one control qubit.- Parameters:
target (int) – The target qubit of the operator.
angle (float) – The angle \(\theta\) as defined above.
axis (indexable[float]) – The axis through the Bloch sphere about which the state should be rotated. The entries
axis[0],axis[1], andaxis[2]are interpreted as \(x\)- \(y\)- and \(z\)-components, respecively.controls (int) – An optional control qubit. There is no functional difference between
targetandcontrols, one of the indices must be passed via thecontrolsparameter. An empty list orNonesignifies only a single target. Default:None.
- QuEST functions:
- class Rx(target, angle, controls=None)#
Bases:
BaseRotateRotate a single qubit about the X-axis of the Bloch sphere.
The Pauli-X rotation gate \(R_x(\theta)\) on a single qubit for a given angle \(\theta\) has the matrix representation
\[\begin{split}R_x(\theta) = \begin{pmatrix} \cos \theta / 2 & -i \sin \theta / 2 \\ -i \sin \theta / 2 & \cos \theta / 2 \end{pmatrix}\end{split}\]The
Rxoperator supports at most one control qubit.- Parameters:
target (int) – The qubit to rotate.
angle (float) – The angle \(\theta\) as defined above.
controls (int) – An optional control qubit. Passing an empty list or
Nonemeans no control qubit for the operation. Default:None.
- QuEST functions:
- class Ry(target, angle, controls=None)#
Bases:
BaseRotateRotate a single qubit about the Y-axis of the Bloch sphere.
The Pauli-Y rotation gate \(R_y(\theta)\) on a single qubit for a given angle \(\theta\) has the matrix representation
\[\begin{split}R_y(\theta) = \begin{pmatrix} \cos \theta / 2 & - \sin \theta / 2 \\ \sin \theta / 2 & \cos \theta / 2 \end{pmatrix}\end{split}\]The
Ryoperator supports at most one control qubit.- Parameters:
target (int) – The qubit to rotate.
angle (float) – The angle \(\theta\) as defined above.
controls (int) – An optional control qubit. Passing an empty list or
Nonemeans no control qubit for the operation. Default:None.
- QuEST functions:
- class Rz(target, angle, controls=None)#
Bases:
BaseRotateRotate a single qubit about the Z-axis of the Bloch sphere.
The Pauli-Z rotation gate \(R_z(\theta)\) on a single qubit for a given angle \(\theta\) has the matrix representation
\[\begin{split}R_z(\theta) = \begin{pmatrix} \exp -i \theta / 2 & 0 \\ 0 & \exp i\theta / 2 \end{pmatrix}\end{split}\]The
Rzoperator supports at most one control qubit.- Parameters:
target (int) – The qubit to rotate.
angle (float) – The angle \(\theta\) as defined above.
controls (int) – An optional control qubit. Passing an empty list or
Nonemeans no control qubit for the operation. Default:None.
- QuEST functions:
- class S(target)#
Bases:
SingleQubitOperatorAn S-gate on a single qubit.
The
Soperator adds a phase of \(i\) to the \(\lvert 1\rangle\). It thus has the matrix representation\[\begin{split}S = \begin{pmatrix} 1 & 0 \\ 0 & i \end{pmatrix}\end{split}\]- Parameters:
target (int) – The qubit to which the operator should be applied.
- QuEST function:
- class SqrtSwap(targets=None, target=None)#
Bases:
MultiQubitOperatorA \(\sqrt{\mathrm{SWAP}}\) operator on exactly two qubits.
The
SqrtSwapexchanges the states of two qubits if applied twice (hence the name). In matrix representation using the ordering of the states like \(\lvert 00 \rangle, \lvert 01 \rangle, \lvert 10 \rangle, \lvert 11 \rangle\) it takes the form\[\begin{split}\sqrt{\mathrm{SWAP}} = \frac{1}{2} \begin{pmatrix} 2 & 0 & 0 & 0 \\ 0 & (1+i) & (1-i) & 0 \\ 0 & (1-i) & (1+i) & 0 \\ 0 & 0 & 0 & 2 \end{pmatrix}\end{split}\]Currently, QuEST does not support controlling this operation on other qubits.
- Parameters:
targets (iterable[int]) – The indices of the two qubits the gate will act on.
target (iterable[int]) – Alias for
targets. Exactly one of these two must be notNone. Default:None.
- QuEST function:
- class Swap(targets=None, target=None)#
Bases:
MultiQubitOperatorA SWAP operator on exactly two qubits.
The
Swapoperator exchanges the states of its two target qubits. In matrix representation using the ordering of the states like \(\lvert 00 \rangle, \lvert 01 \rangle, \lvert 10 \rangle, \lvert 11 \rangle\) it takes the form\[\begin{split}\mathrm{SWAP} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\end{split}\]Currently, QuEST does not support controlling this operation on other qubits.
- Parameters:
targets (iterable[int]) – The indices of the two qubits whose states will be swapped.
target (iterable[int]) – Alias for
targets. Exactly one of these two must be notNone. Default:None.
- QuEST function:
- inverse#
- class T(target)#
Bases:
SingleQubitOperatorA T-gate on a single qubit.
The
Toperator adds a phase of \(\sqrt{i}\) to the \(\lvert 1\rangle\)-state of a qubit. It thus has the matrix representation\[\begin{split}T = \begin{pmatrix} 1 & 0 \\ 0 & e^{\frac{i\pi}{4}} \end{pmatrix}\end{split}\]- Parameters:
target (int) – The qubit to which the operator should be applied.
- QuEST function:
- class U(targets=None, matrix=None, controls=None, target=None, control_pattern=None)#
Bases:
MatrixOperatorA generic unitary operator.
An operator on one or more qubits, fully specified via its matrix representation. Its unitarity is checked by the QuEST backend only upon application to a state, not at object creation.
State vector registers \(\vert\psi\rangle\) are affected in the usual way by applying the operator from the left \(U\vert\psi\rangle\) with implicit identity operators on every qubit \(U\) does not act on. Density matrix registers \(\rho\) are multiplied from the left and right \(U\rho U^\dagger\) to achieve the equivalent action as for state vectors.
Because specifying the full matrix requires a comparatively large block of memory, and the backend cannot utilise specialised algorithms, this operator should only be used when no builtin alternatives are available.
- Parameters:
targets (int | iterable[int]) – The qubits onto which the operator should act nontrivially. The order is important in that
targets[0]is the least significant qubit in the matrix representation of \(U\), i.e. neighbouring entries inmatrixwill differ by the state of the qubittargets[0].matrix (numpy.ndarray) – The matrix representation of the operator given as an array with dimensions \(2^{\mathrm{len(targets)}} \times 2^{\mathrm{len(targets)}}\).
controls (int | interable[int]) – The control qubits of the operator. May be
Noneor an empty list to signify no controls. Default:None.target (int) – Alias for
targets. Only one of the two may be specified. Default:None.control_pattern (iterable[int]) – For controlled operators, this parameter can be used to specify which qubits act as regular controls (operator only acts on the 1-state subspace), and which act as anti-controls (operator acts on the 0-state subspace). If specified, its length must match that of
controls. A1means regular control, a0means anti-control, matching entries ofcontrol_patternindex-wise with those incontrols. Default:None.
- QuEST functions:
- control_pattern#
The control/anti-control pattern of the operator.
- class X(targets, controls=None)#
Bases:
MultiQubitOperatorA Pauli-X operator on one or more qubits.
When acting on a single target, the Pauli-X (also called NOT, X, sigma-X, or bit-flip) operator has the following matrix representation.
\[\begin{split}X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}\end{split}\]When applying a Pauli-X onto multiple qubits in sequence, using a single
Xwith multiple targets is significantly faster than applying several individual single-qubitX-operators sequentially.- Parameters:
targets (int | iterable[int]) – The target qubit indices on which the operator should act.
controls (int | iterable[int]) – The optional control qubits of the operator. An empty list or
Nonesignify no controls. Default:None.
- QuEST functions:
- inverse#
- class Y(target, controls=None)#
Bases:
SingleQubitOperatorA Pauli-Y operator on one qubit.
The Pauli-Y (also known as Y or sigma-Y) operator has the following matrix representation.
\[\begin{split}Y = \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}\end{split}\]- Parameters:
target (int) – The qubit on which the operator should act. The
Yoperator supports only a single target.controls (int) – The index of an optional control qubit. Passing
Noneor an empty list means no controls. Default:None.
- QuEST functions:
- inverse#
- class Z(target, controls=None)#
Bases:
SingleQubitOperatorA Pauli-Z operator on one or more qubits.
When acting on a single target, the Pauli-Z (also called Z, sigma-Z, or phase-flip) operator has the following matrix representation.
\[\begin{split}Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}\end{split}\]The
Z-operator is somewhat special in that it makes no difference which qubits are called targets and which are called controls. For consistency, exactly onetargetqubit must be named, the rest must go in thecontrolsargument. However, the action of the operator is invariant under swapping thetargetfor any of thecontrols.- Parameters:
target (int) – The target qubit of the operator.
controls (int | iterable[int]) – An optional list of control qubits. In the
Zoperater, there is no functional difference betweentargetandcontrols, but for more than a single target, all but one of the indices must be passed via thecontrolsparameter. An empty list orNonesignifies only a single target. Default:None.
- QuEST functions:
- inverse#
Module contents#
Python wrapper for the Quantum Exact Simulation Toolkit (QuEST).
This package provides an easy to use Python interface for the QuEST library, which is written in C.
- env = QuESTEnvironment(gpu_accelerated=False, multithreaded=False, distributed=False, num_threads=1, rank=0, num_ranks=1, precision=2)#
Package level variable holding the only instance of QuESTEnvironment.
To properly initialize a QuESTEnv, create a single instance at package load time and have every function needing it use this instance. This also allows user checking of the environment via
pyquest.env.
- rank = 0#
Promote environment properties to the package level.
These attributes are only for convenience, so individual properties of the environment can be checked at the package level, e.g. with
pyquest.precision.