LightningTensor¶
- class LightningTensor(*, wires=None, shots=None, method: str = 'mps', c_dtype=<class 'numpy.complex128'>, **kwargs)[source]¶
Bases:
Device
PennyLane Lightning Tensor device.
A device to perform tensor network operations on a quantum circuit.
This device is designed to simulate large-scale quantum circuits using tensor network methods. For small circuits, other devices like
lightning.qubit
,lightning.gpu``or ``lightning.kokkos
are recommended.Currently, only the Matrix Product State (MPS) method as implemented in the
cutensornet
backend is supported.- Parameters
wires (int) – The number of wires to initialize the device with. Defaults to
None
if not specified.shots (int) – Measurements are performed drawing
shots
times from a discrete random variable distribution associated with a state vector and an observable. Defaults toNone
if not specified. Setting toNone
results in computing statistics like expectation values and variances analytically.method (str) – Supported method. Currently, only
mps
is supported.c_dtype – Datatypes for the tensor representation. Must be one of
numpy.complex64
ornumpy.complex128
. Default isnumpy.complex128
.
- Keyword Arguments
max_bond_dim (int) – The maximum bond dimension to be used in the MPS simulation. Default is 128. The accuracy of the wavefunction representation comes with a memory tradeoff which can be tuned with max_bond_dim. The larger the internal bond dimension, the more entanglement can be described but the larger the memory requirements. Note that GPUs are ill-suited (i.e. less competitive compared with CPUs) for simulating circuits with low bond dimensions and/or circuit layers with a single or few gates because the arithmetic intensity is lower.
cutoff (float) – The threshold used to truncate the singular values of the MPS tensors. The default is 0.
cutoff_mode (str) – Singular value truncation mode. The options are
"rel"
and"abs"
. The default is"abs"
.backend (str) – Supported backend. Currently, only
cutensornet
is supported.
Example
import pennylane as qml num_qubits = 100 dev = qml.device("lightning.tensor", wires=num_qubits) @qml.qnode(dev) def circuit(num_qubits): for qubit in range(0, num_qubits - 1): qml.CZ(wires=[qubit, qubit + 1]) qml.X(wires=[qubit]) qml.Z(wires=[qubit + 1]) return qml.expval(qml.Z(0))
>>> print(circuit(num_qubits)) -1.0
Attributes
Supported backend.
Tensor complex data type.
Tensor complex data type.
Supported method.
The name of the device.
Number of wires addressed on this device.
Default shots for execution workflows containing this device.
A
Tracker
that can store information about device executions, shots, batches, intermediate results, or any additional device dependent information.The device wires.
- backend¶
Supported backend.
- c_dtype¶
Tensor complex data type.
- dtype¶
Tensor complex data type.
- method¶
Supported method.
- name¶
The name of the device.
- num_wires¶
Number of wires addressed on this device.
- observables = frozenset({'Exp', 'Hadamard', 'Hamiltonian', 'Hermitian', 'Identity', 'LinearCombination', 'PauliX', 'PauliY', 'PauliZ', 'Prod', 'SProd', 'Sum'})¶
- operations = frozenset({'Adjoint(ISWAP)', 'Adjoint(S)', 'Adjoint(SISWAP)', 'Adjoint(SX)', 'Adjoint(T)', 'BasisState', 'BlockEncode', 'C(BlockEncode)', 'C(DoubleExcitation)', 'C(DoubleExcitationMinus)', 'C(DoubleExcitationPlus)', 'C(GlobalPhase)', 'C(Hadamard)', 'C(IsingXX)', 'C(IsingXY)', 'C(IsingYY)', 'C(IsingZZ)', 'C(MultiRZ)', 'C(PhaseShift)', 'C(RX)', 'C(RY)', 'C(RZ)', 'C(Rot)', 'C(S)', 'C(SingleExcitation)', 'C(SingleExcitationMinus)', 'C(SingleExcitationPlus)', 'C(T)', 'CNOT', 'CRX', 'CRY', 'CRZ', 'CRot', 'CSWAP', 'CY', 'CZ', 'ControlledPhaseShift', 'ControlledQubitUnitary', 'DiagonalQubitUnitary', 'DoubleExcitation', 'DoubleExcitationMinus', 'DoubleExcitationPlus', 'ECR', 'GlobalPhase', 'Hadamard', 'ISWAP', 'Identity', 'IsingXX', 'IsingXY', 'IsingYY', 'IsingZZ', 'OrbitalRotation', 'PSWAP', 'PauliX', 'PauliY', 'PauliZ', 'PhaseShift', 'QubitCarry', 'QubitSum', 'QubitUnitary', 'RX', 'RY', 'RZ', 'Rot', 'S', 'SISWAP', 'SQISW', 'SWAP', 'SX', 'SingleExcitation', 'SingleExcitationMinus', 'SingleExcitationPlus', 'T', 'Toffoli'})¶
- shots¶
Default shots for execution workflows containing this device.
Note that the device itself should always pull shots from the provided
QuantumTape
and itsshots
, not from this property. This property is used to provide a default at the start of a workflow.
- tracker: Tracker = <pennylane.tracker.Tracker object>¶
A
Tracker
that can store information about device executions, shots, batches, intermediate results, or any additional device dependent information.A plugin developer can store information in the tracker by:
# querying if the tracker is active if self.tracker.active: # store any keyword: value pairs of information self.tracker.update(executions=1, shots=self._shots, results=results) # Calling a user-provided callback function self.tracker.record()
- wires¶
The device wires.
Note that wires are optional, and the default value of None means any wires can be used. If a device has wires defined, they will only be used for certain features. This includes:
Validation of tapes being executed on the device
Defining the wires used when evaluating a
state()
measurement
Methods
compute_derivatives
(circuits[, execution_config])Calculate the Jacobian of either a single or a batch of circuits on the device.
compute_jvp
(circuits, tangents[, ...])The jacobian vector product used in forward mode calculation of derivatives.
compute_vjp
(circuits, cotangents[, ...])The vector-Jacobian product used in reverse-mode differentiation.
execute
(circuits[, execution_config])Execute a circuit or a batch of circuits and turn it into results.
execute_and_compute_derivatives
(circuits[, ...])Compute the results and Jacobians of circuits at the same time.
execute_and_compute_jvp
(circuits, tangents)Execute a batch of circuits and compute their jacobian vector products.
execute_and_compute_vjp
(circuits, cotangents)Calculate both the results and the vector-Jacobian product used in reverse-mode differentiation.
preprocess
([execution_config])This function defines the device transform program to be applied and an updated device configuration.
supports_derivatives
([execution_config, circuit])Check whether or not derivatives are available for a given configuration and circuit.
supports_jvp
([execution_config, circuit])Whether or not a given device defines a custom jacobian vector product.
supports_vjp
([execution_config, circuit])Whether or not this device defines a custom vector-Jacobian product.
- compute_derivatives(circuits: Union[QuantumTape, Sequence[QuantumTape]], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))[source]¶
Calculate the Jacobian of either a single or a batch of circuits on the device.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the circuits to calculate derivatives for.
execution_config (ExecutionConfig) – a data structure with all additional information required for execution.
- Returns
The Jacobian for each trainable parameter.
- Return type
Tuple
- compute_jvp(circuits: Union[QuantumScript, Sequence[QuantumScript]], tangents: tuple[numbers.Number, ...], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))¶
The jacobian vector product used in forward mode calculation of derivatives.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the circuit or batch of circuits
tangents (tensor-like) – Gradient vector for input parameters.
execution_config (ExecutionConfig) – a datastructure with all additional information required for execution
- Returns
A numeric result of computing the jacobian vector product
- Return type
Tuple
Definition of jvp:
If we have a function with jacobian:
\[\vec{y} = f(\vec{x}) \qquad J_{i,j} = \frac{\partial y_i}{\partial x_j}\]The Jacobian vector product is the inner product with the derivatives of \(x\), yielding only the derivatives of the output \(y\):
\[\text{d}y_i = \Sigma_{j} J_{i,j} \text{d}x_j\]Shape of tangents:
The
tangents
tuple should be the same length ascircuit.get_parameters()
and have a single number per parameter. If a number is zero, then the gradient with respect to that parameter does not need to be computed.
- compute_vjp(circuits: Union[QuantumTape, Sequence[QuantumTape]], cotangents: Tuple[Number], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))[source]¶
The vector-Jacobian product used in reverse-mode differentiation.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the circuit or batch of circuits.
cotangents (Tuple[Number, Tuple[Number]]) – Gradient-output vector. Must have shape matching the output shape of the corresponding circuit. If the circuit has a single output,
cotangents
may be a single number, not an iterable of numbers.execution_config (ExecutionConfig) – a data structure with all additional information required for execution.
- Returns
A numeric result of computing the vector-Jacobian product.
- Return type
tensor-like
- execute(circuits: Union[QuantumTape, Sequence[QuantumTape]], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None))) Union[Result, Sequence[Result]] [source]¶
Execute a circuit or a batch of circuits and turn it into results.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the quantum circuits to be executed.
execution_config (ExecutionConfig) – a data structure with additional information required for execution.
- Returns
A numeric result of the computation.
- Return type
TensorLike, tuple[TensorLike], tuple[tuple[TensorLike]]
- execute_and_compute_derivatives(circuits: Union[QuantumTape, Sequence[QuantumTape]], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))[source]¶
Compute the results and Jacobians of circuits at the same time.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the circuits or batch of circuits.
execution_config (ExecutionConfig) – a data structure with all additional information required for execution.
- Returns
A numeric result of the computation and the gradient.
- Return type
tuple
- execute_and_compute_jvp(circuits: Union[QuantumScript, Sequence[QuantumScript]], tangents: tuple[numbers.Number, ...], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))¶
Execute a batch of circuits and compute their jacobian vector products.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – circuit or batch of circuits
tangents (tensor-like) – Gradient vector for input parameters.
execution_config (ExecutionConfig) – a datastructure with all additional information required for execution
- Returns
A numeric result of execution and of computing the jacobian vector product
- Return type
Tuple, Tuple
See also
execute()
andcompute_jvp()
- execute_and_compute_vjp(circuits: Union[QuantumTape, Sequence[QuantumTape]], cotangents: Tuple[Number], execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))[source]¶
Calculate both the results and the vector-Jacobian product used in reverse-mode differentiation.
- Parameters
circuits (Union[QuantumTape, Sequence[QuantumTape]]) – the circuit or batch of circuits to be executed.
cotangents (Tuple[Number, Tuple[Number]]) – Gradient-output vector. Must have shape matching the output shape of the corresponding circuit.
execution_config (ExecutionConfig) – a data structure with all additional information required for execution.
- Returns
the result of executing the scripts and the numeric result of computing the vector-Jacobian product
- Return type
Tuple, Tuple
- preprocess(execution_config: ExecutionConfig = ExecutionConfig(grad_on_execution=None, use_device_gradient=None, use_device_jacobian_product=None, gradient_method=None, gradient_keyword_arguments={}, device_options={}, interface=None, derivative_order=1, mcm_config=MCMConfig(mcm_method=None, postselect_mode=None)))[source]¶
This function defines the device transform program to be applied and an updated device configuration.
- Parameters
execution_config (Union[ExecutionConfig, Sequence[ExecutionConfig]]) – A data structure describing the parameters needed to fully describe the execution.
- Returns
A transform program that when called returns
QuantumTape
’s that the device can natively execute as well as a postprocessing function to be called after execution, and a configuration with unset specifications filled in.- Return type
TransformProgram, ExecutionConfig
This device currently:
Does not support derivatives.
Does not support vector-Jacobian products.
- supports_derivatives(execution_config: Optional[ExecutionConfig] = None, circuit: Optional[QuantumTape] = None) bool [source]¶
Check whether or not derivatives are available for a given configuration and circuit.
- Parameters
execution_config (ExecutionConfig) – The configuration of the desired derivative calculation.
circuit (QuantumTape) – An optional circuit to check derivatives support for.
- Returns
Whether or not a derivative can be calculated provided the given information.
- Return type
Bool
- supports_jvp(execution_config: Optional[ExecutionConfig] = None, circuit: Optional[QuantumScript] = None) bool ¶
Whether or not a given device defines a custom jacobian vector product.
- Parameters
execution_config (ExecutionConfig) – A description of the hyperparameters for the desired computation.
circuit (None, QuantumTape) – A specific circuit to check differentation for.
Default behaviour assumes this to be
True
ifcompute_jvp()
is overridden.
- supports_vjp(execution_config: Optional[ExecutionConfig] = None, circuit: Optional[QuantumTape] = None) bool [source]¶
Whether or not this device defines a custom vector-Jacobian product.
- Parameters
execution_config (ExecutionConfig) – The configuration of the desired derivative calculation.
circuit (QuantumTape) – An optional circuit to check derivatives support for.
- Returns
Whether or not a derivative can be calculated provided the given information.
- Return type
Bool