This package contains unified functions for framework-agnostic tensor and array manipulation. Given the input tensor-like object, the call is dispatched to the corresponding array manipulation framework, allowing for end-to-end differentiation to be preserved.


These functions are experimental, and only a subset of common functionality is supported. Furthermore, the names and behaviour of these functions may differ from similar functions in common frameworks; please refer to the function docstrings for more details.

The following frameworks are currently supported:

  • NumPy

  • Autograd

  • TensorFlow

  • PyTorch

  • JAX


add(*args[, like])

Add arguments element-wise.

allclose(a, b[, rtol, atol])

Returns True if two arrays are element-wise equal within a tolerance.

allequal(tensor1, tensor2, **kwargs)

Returns True if two tensors are element-wise equal along a given axis.

array(*args[, like])

Creates an array or tensor object of the target framework.

block_diag(values[, like])

Combine a sequence of 2D tensors to form a block diagonal tensor.

cast(tensor, dtype)

Casts the given tensor to a new type.

cast_like(tensor1, tensor2)

Casts a tensor to the same dtype as another.

concatenate(values[, axis, like])

Concatenate a sequence of tensors along the specified axis.

convert_like(tensor1, tensor2)

Convert a tensor to the same type as another.

cov_matrix(prob, obs[, wires, diag_approx])

Calculate the covariance matrix of a list of commuting observables, given the joint probability distribution of the system in the shared eigenbasis.

detach(tensor[, like])

Detach a tensor from its trace and return just its numerical values.

diag(values[, k, like])

Construct a diagonal tensor from a list of scalars.

dm_from_state_vector(state[, check_state, …])

Convenience function to compute a (full) density matrix from a state vector.

dot(tensor1, tensor2[, like])

Returns the matrix or dot product of two tensors.

einsum(indices, *operands[, like, optimize])

Evaluates the Einstein summation convention on the operands.

expand_matrix(mat, wires[, wire_order, …])

Re-express a matrix acting on a subspace defined by a set of wire labels according to a global wire order.

eye(*args[, like])

Creates an identity array or tensor object of the target framework.

fidelity(state0, state1[, check_state, c_dtype])

Compute the fidelity for two states (given as density matrices) acting on quantum systems with the same size.

fidelity_statevector(state0, state1[, …])

Compute the fidelity for two states (given as state vectors) acting on quantum systems with the same size.

frobenius_inner_product(A, B[, normalize, like])

Frobenius inner product between two matrices.


An interface independent way of getting the name of the datatype.


Determines the correct framework to dispatch to given a tensor-like object or a sequence of tensor-like objects.


Given a deep data structure with interface-specific scalars at the bottom, return their interface name.

get_trainable_indices(values[, like])

Returns a set containing the trainable indices of a sequence of values.

in_backprop(tensor[, interface])

Returns True if the tensor is considered to be in a backpropagation environment, it works for Autograd, TensorFlow and Jax.

is_abstract(tensor[, like])

Returns True if the tensor is considered abstract.

is_independent(func, interface, args[, …])

Test whether a function is independent of its input arguments, both numerically and analytically.

iscomplex(tensor[, like])

Return True if the tensor has a non-zero complex component.

marginal_prob(prob, axis)

Compute the marginal probability given a joint probability distribution expressed as a tensor.

max_entropy(state, indices[, base, …])

Compute the maximum entropy of a density matrix on a given subsystem.

min_entropy(state, indices[, base, …])

Compute the minimum entropy from a density matrix.

multi_dispatch([argnum, tensor_list])

Decorater to dispatch arguments handled by the interface.

mutual_info(state, indices0, indices1[, …])

Compute the mutual information between two subsystems given a state:

ones_like(tensor[, dtype])

Returns a tensor of all ones with the same shape and dtype as the input tensor.

partial_trace(matrix, indices[, c_dtype])

Compute the reduced density matrix by tracing out the provided indices.

purity(state, indices[, check_state, c_dtype])

Computes the purity of a density matrix.

reduce_dm(density_matrix, indices[, …])

Compute the density matrix from a state represented with a density matrix.

reduce_statevector(state, indices[, …])

Compute the density matrix from a state vector.

relative_entropy(state0, state1[, base, …])

Compute the quantum relative entropy of one state with respect to another.

requires_grad(tensor[, interface])

Returns True if the tensor is considered trainable.


Compute the square root matrix of a density matrix where \(\rho = \sqrt{\rho} \times \sqrt{\rho}\)

scatter_element_add(tensor, index, value[, like])

In-place addition of a multidimensional value over various indices of a tensor.

stack(values[, axis, like])

Stack a sequence of tensors along the specified axis.

svd(tensor[, like])

Compute the singular value decomposition of a tensor in each interface.

tensordot(tensor1, tensor2[, axes, like])

Returns the tensor product of two tensors.

trace_distance(state0, state1[, …])

Compute the trace distance between two quantum states.

unwrap(values[, max_depth])

Unwrap a sequence of objects to NumPy arrays.

vn_entropy(state, indices[, base, …])

Compute the Von Neumann entropy from a density matrix on a given subsystem.

vn_entanglement_entropy(state, indices0, …)

Compute the Von Neumann entanglement entropy between two subsystems in a given state.

where(condition[, x, y])

Returns elements chosen from x or y depending on a boolean tensor condition, or the indices of entries satisfying the condition.