cuDensityMat functions

Library context management API

cudensitymatCreate

cudensitymatStatus_t cudensitymatCreate(cudensitymatHandle_t *handle)

Creates and initializes the library context.

Parameters

handle[out] Library handle.

Returns

cudensitymatStatus_t


cudensitymatDestroy

cudensitymatStatus_t cudensitymatDestroy(cudensitymatHandle_t handle)

Destroys the library context.

Parameters

handle[in] Library handle.

Returns

cudensitymatStatus_t


cudensitymatResetRandomSeed

cudensitymatStatus_t cudensitymatResetRandomSeed(cudensitymatHandle_t handle, int32_t randomSeed)

Resets the context-level random seed used by the random number generator inside the library context.

Parameters
  • handle[inout] Library handle.

  • randomSeed[in] Random seed value.

Returns

cudensitymatStatus_t


Distributed parallelization API

cudensitymatResetDistributedConfiguration

cudensitymatStatus_t cudensitymatResetDistributedConfiguration(cudensitymatHandle_t handle, cudensitymatDistributedProvider_t provider, const void *commPtr, size_t commSize)

Resets the current distributed execution configuration associated with the given library context by importing a user-provided inter-process communicator (e.g., MPI_Comm).

Accepts and stores a copy of the provided inter-process communicator which will be used for distributing numerical operations across all involved distributed processes.

Parameters
  • handle[inout] Library handle.

  • provider[in] Communication service provider.

  • commPtr[in] Pointer to the communicator in a type-erased form.

  • commSize[in] Size of the communicator in bytes.

Returns

cudensitymatStatus_t


cudensitymatGetNumRanks

cudensitymatStatus_t cudensitymatGetNumRanks(const cudensitymatHandle_t handle, int32_t *numRanks)

Returns the total number of distributed processes associated with the given library context in its current distributed execution configuration.

Parameters
  • handle[in] Library handle.

  • numRanks[out] Number of distributed processes.

Returns

cudensitymatStatus_t


cudensitymatGetProcRank

cudensitymatStatus_t cudensitymatGetProcRank(const cudensitymatHandle_t handle, int32_t *procRank)

Returns the rank of the current process in the distributed execution configuration associated with the given library context.

Parameters
  • handle[in] Library handle.

  • procRank[out] Rank of the current distributed process.

Returns

cudensitymatStatus_t


Workspace management API

cudensitymatCreateWorkspace

cudensitymatStatus_t cudensitymatCreateWorkspace(const cudensitymatHandle_t handle, cudensitymatWorkspaceDescriptor_t *workspaceDescr)

Creates a workspace descriptor.

Parameters
  • handle[in] Library handle.

  • workspaceDescr[out] Workspace descriptor.

Returns

cudensitymatStatus_t


cudensitymatDestroyWorkspace

cudensitymatStatus_t cudensitymatDestroyWorkspace(cudensitymatWorkspaceDescriptor_t workspaceDescr)

Destroys a workspace descriptor.

Parameters

workspaceDescr[inout] Workspace descriptor.

Returns

cudensitymatStatus_t


cudensitymatWorkspaceGetMemorySize

cudensitymatStatus_t cudensitymatWorkspaceGetMemorySize(const cudensitymatHandle_t handle, const cudensitymatWorkspaceDescriptor_t workspaceDescr, cudensitymatMemspace_t memSpace, cudensitymatWorkspaceKind_t workspaceKind, size_t *memoryBufferSize)

Queries the required workspace buffer size.

Parameters
  • handle[in] Library handle.

  • workspaceDescr[in] Workspace descriptor.

  • memSpace[in] Memory space.

  • workspaceKind[in] Workspace kind.

  • memoryBufferSize[out] Required workspace buffer size in bytes.

Returns

cudensitymatStatus_t


cudensitymatWorkspaceSetMemory

cudensitymatStatus_t cudensitymatWorkspaceSetMemory(const cudensitymatHandle_t handle, cudensitymatWorkspaceDescriptor_t workspaceDescr, cudensitymatMemspace_t memSpace, cudensitymatWorkspaceKind_t workspaceKind, void *memoryBuffer, size_t memoryBufferSize)

Attaches memory to a workspace buffer.

Parameters
  • handle[in] Library handle.

  • workspaceDescr[inout] Workspace descriptor.

  • memSpace[in] Memory space.

  • workspaceKind[in] Workspace kind.

  • memoryBuffer[in] Pointer to a user-owned memory buffer to be used by the specified workspace.

  • memoryBufferSize[in] Size of the provided memory buffer in bytes.

Returns

cudensitymatStatus_t


cudensitymatWorkspaceGetMemory

cudensitymatStatus_t cudensitymatWorkspaceGetMemory(const cudensitymatHandle_t handle, const cudensitymatWorkspaceDescriptor_t workspaceDescr, cudensitymatMemspace_t memSpace, cudensitymatWorkspaceKind_t workspaceKind, void **memoryBuffer, size_t *memoryBufferSize)

Retrieves a workspace buffer.

Parameters
  • handle[in] Library handle.

  • workspaceDescr[in] Workspace descriptor.

  • memSpace[in] Memory space.

  • workspaceKind[in] Workspace kind.

  • memoryBuffer[out] Pointer to a user-owned memory buffer used by the specified workspace.

  • memoryBufferSize[out] Size of the memory buffer in bytes.

Returns

cudensitymatStatus_t


Quantum state API

cudensitymatCreateState

cudensitymatStatus_t cudensitymatCreateState(const cudensitymatHandle_t handle, cudensitymatStatePurity_t purity, int32_t numSpaceModes, const int64_t spaceModeExtents[], int64_t batchSize, cudaDataType_t dataType, cudensitymatState_t *state)

Defines an empty quantum state of a given purity and shape, or a batch of such quantum states.

The number of space modes defining the state space is always the number of quantum degrees of freedom used to define the corresponding composite tensor-product space. With that, the number of modes in a pure-state tensor equals the number of the space modes (quantum degrees of freedom). The number of modes in a mixed-state tensor equals twice the number of the space modes, consisting of a set of the ket modes and a set of the bra modes, which are identical in terms of their extents between the two sets, with the ket modes preceding the bra modes, for example: S[i0, i1, j0, j1] tensor represents a mixed quantum state with two degrees of freedom, where modes {i0, i1} form the ket set, and modes {j0, j1} form the bra set such that ket mode i0 corresponds to the bra mode j0, and ket mode i1 corresponds to the bra mode j1. In contrast, a pure quantum state with two degrees of freedom is represented by the tensor S[i0, i1] with only the ket modes (no bra modes). Furthermore, batched pure/mixed states introduce one additional (batch) mode to their dense tensor representation, namely: S[i0, i1, b] for the batched pure state, and S[i0, i1, j0, j1, b] for the batched mixed state, where b is the size of the batch (batch size or extent of the batch mode).

Parameters
  • handle[in] Library handle.

  • purity[in] Desired quantum state purity.

  • numSpaceModes[in] Number of space modes (number of quantum degrees of freedom).

  • spaceModeExtents[in] Extents of the space modes (dimensions of the quantum degrees of freedom).

  • batchSize[in] Batch size (number of equally-shaped quantum states in the batch). Note that setting the batch size to zero is the same as setting it to 1 (no batching).

  • dataType[in] Numerical representation data type (type of tensor elements).

  • state[out] Empty quantum state (or a batch of quantum states).

Returns

cudensitymatStatus_t


cudensitymatDestroyState

cudensitymatStatus_t cudensitymatDestroyState(cudensitymatState_t state)

Destroys the quantum state.

Parameters

state[in] Quantum state (or a batch of quantum states).

Returns

cudensitymatStatus_t


cudensitymatStateGetNumComponents

cudensitymatStatus_t cudensitymatStateGetNumComponents(const cudensitymatHandle_t handle, const cudensitymatState_t state, int32_t *numStateComponents)

Queries the number of components (tensors) constituting the chosen quantum state representation (on the current process in multi-process runs).

Quantum state representation may include one or more components (tensors) distributed over one or more parallel processes (in distributed multi-GPU runs). The plain state vector or density matrix representations consist of only one component, the full state tensor, which can be sliced and distributed over all parallel processes (in distributed multi-GPU runs). Factorized quantum state representations include more than one component, and these components (tensors) are generally distributed over all parallel processes (in distributed multi-GPU runs).

Note

In multi-process runs, this function returns the number of locally stored components which, in general, can be smaller than the total number of components stored across all parallel processes. One can use API function cudensitymatStateGetComponentInfo to obtain more information on a given local component by providing its local id.

Note

Batching does not add new components to the quantum state representation, it just makes all existing components batched. The corresponding tensors acquire one additional (most significant) mode which represents the batch dimension. Note, however, that the batch dimension of a locally stored component may have a smaller extent than the total batch size due to potential slicing.

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • numStateComponents[out] Number of components (tensors) in the quantum state representation (on the current process).

Returns

cudensitymatStatus_t


cudensitymatStateGetComponentStorageSize

cudensitymatStatus_t cudensitymatStateGetComponentStorageSize(const cudensitymatHandle_t handle, const cudensitymatState_t state, int32_t numStateComponents, size_t componentBufferSize[])

Queries the storage size (in bytes) for each component (tensor) constituting the quantum state representation (on the current process in multi-process runs).

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • numStateComponents[in] Number of components (tensors) in the quantum state representation (on the current process).

  • componentSize[out] Storage size (bytes) for each component (tensor) consituting the quantum state representation (on the current process).

Returns

cudensitymatStatus_t


cudensitymatStateGetComponentNumModes

cudensitymatStatus_t cudensitymatStateGetComponentNumModes(const cudensitymatHandle_t handle, cudensitymatState_t state, int32_t stateComponentLocalId, int32_t *stateComponentGlobalId, int32_t *stateComponentNumModes, int32_t *batchModeLocation)

Queries the number of modes in a local component tensor (on the current process in multi-process runs).

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • stateComponentLocalId[in] Component local id (on the current parallel process).

  • stateComponentGlobalId[out] Component global id (across all parallel processes).

  • stateComponentNumModes[out] Number of modes in the queried component tensor.

  • batchModeLocation[out] Location of the batch mode (or -1 if the batch mode is absent).

Returns

cudensitymatStatus_t


cudensitymatStateGetComponentInfo

cudensitymatStatus_t cudensitymatStateGetComponentInfo(const cudensitymatHandle_t handle, cudensitymatState_t state, int32_t stateComponentLocalId, int32_t *stateComponentGlobalId, int32_t *stateComponentNumModes, int64_t stateComponentModeExtents[], int64_t stateComponentModeOffsets[])

Queries information for a locally stored component tensor which represents either the full component or its slice (on the current process in multi-process runs).

This API function queries the global component id (across all parallel processes), the number of tensor modes (including the batch mode, if present), the extents of all modes, and the base offsets for all modes which can be different from zero if the locally stored component tensor represents a slice of the full component tensor (a base offset of a sliced mode is the starting index value of that mode inside the full tensor mode).

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • stateComponentLocalId[in] Component local id (on the current parallel process).

  • stateComponentGlobalId[out] Component global id (across all parallel processes).

  • stateComponentNumModes[out] Number of modes in the queried component tensor.

  • stateComponentModeExtents[out] Component tensor mode extents (the size of the array must be sufficient, see cudensitymatStateGetComponentNumModes)

  • stateComponentModeOffsets[out] Component tensor mode offsets defining the locally stored slice (the size of the array must be sufficient, see cudensitymatStateGetComponentNumModes)

Returns

cudensitymatStatus_t


cudensitymatStateAttachComponentStorage

cudensitymatStatus_t cudensitymatStateAttachComponentStorage(const cudensitymatHandle_t handle, cudensitymatState_t state, int32_t numStateComponents, void *componentBuffer[], const size_t componentBufferSize[])

Attaches a user-owned GPU-accessible storage buffer for each component (tensor) constituting the quantum state representation (on the current process in multi-process runs).

The provided user-owned GPU-accessible storage buffers will be used for storing components (tensors) constituting the quantum state representation (on the current process in multi-process runs). The initial value of the provided storage buffers will be respected by the library, thus providing a mechanism for specifing any initial value of the quantum state in its chosen representation form. In multi-process runs, API function cudensitymatGetComponentInfo can be used for retrieving the information on which slice of the requested component (tensor) is stored on the current process.

Note

The sizes of the provided storage buffers must be equal or larger than the required sizes retrieved via cudensitymatStateGetComponentStorageSize.

Parameters
  • handle[in] Library handle.

  • state[inout] Quantum state (or a batch of quantum states)

  • numStateComponents[in] Number of components (tensors) in the quantum state representation (on the current process). The number of components can be retrived by calling the API function cudensitymatStateGetNumComponents.

  • componentBuffer[in] Pointers to user-owned GPU-accessible storage buffers for all components (tensors) constituting the quantum state representation (on the current process).

  • componentBufferSize[in] Sizes of the provded storage buffers for all components (tensors) constituting the quantum state representation (on the current process).

Returns

cudensitymatStatus_t


cudensitymatStateInitializeZero

cudensitymatStatus_t cudensitymatStateInitializeZero(const cudensitymatHandle_t handle, cudensitymatState_t state, cudaStream_t stream)

Initializes the quantum state to zero (null state).

Note

This API function is typically used for initializing the output quantum state to true zero before accumulating in it the action of an operator on some input quantum state.

Parameters
  • handle[in] Library handle.

  • state[inout] Quantum state (or a batch of quantum states).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatStateComputeScaling

cudensitymatStatus_t cudensitymatStateComputeScaling(const cudensitymatHandle_t handle, cudensitymatState_t state, const void *scalingFactors, cudaStream_t stream)

Multiplies the quantum state(s) by a scalar factor(s).

Parameters
  • handle[in] Library handle.

  • state[inout] Quantum state (or a batch of quantum states).

  • scalingFactors[in] Array of scaling factor(s) of dimension equal to the batch size in the GPU-accessible RAM (same data type as used by the quantum state).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatStateComputeNorm

cudensitymatStatus_t cudensitymatStateComputeNorm(const cudensitymatHandle_t handle, const cudensitymatState_t state, void *norm, cudaStream_t stream)

Computes the squared Frobenius norm(s) of the quantum state(s).

The result is generally a vector of dimension equal to the quantum state batch size.

Note

For quantum states represented by complex data types, the actual data type of the returned norm is float for cuFloatComplex and double for cuDoubleComplex, respectively.

Note

For quantum states represented by FP32 complex numbers the norm type is float; For quantum states represented by FP64 complex numbers the norm type is double.

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • norm[out] Pointer to the squared Frobenius norm(s) vector storage in the GPU-accessible RAM (float or double real data type).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatStateComputeTrace

cudensitymatStatus_t cudensitymatStateComputeTrace(const cudensitymatHandle_t handle, const cudensitymatState_t state, void *trace, cudaStream_t stream)

Computes the trace(s) of the quantum state(s).

Trace of a pure quantum state is defined to be its squared norm. Trace of a mixed quantum state is equal to the trace of its density matrix. The result is generally a vector of dimension equal to the quantum state batch size.

Parameters
  • handle[in] Library handle.

  • state[in] Quantum state (or a batch of quantum states).

  • norm[out] Pointer to the trace(s) vector storage in the GPU-accessible RAM (same data type as used by the quantum state).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatStateComputeAccumulation

cudensitymatStatus_t cudensitymatStateComputeAccumulation(const cudensitymatHandle_t handle, const cudensitymatState_t stateIn, cudensitymatState_t stateOut, const void *scalingFactors, cudaStream_t stream)

Computes accumulation of a quantum state(s) into another quantum state(s) of compatible shape.

Parameters
  • handle[in] Library handle.

  • stateIn[in] Accumulated quantum state (or a batch of quantum states).

  • stateOut[inout] Accumulating quantum state (or a batch of quantum states).

  • scalingFactors[in] Array of scaling factor(s) of dimension equal to the batch size in the GPU-accessible RAM (same data type as used by the quantum state).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatStateComputeInnerProduct

cudensitymatStatus_t cudensitymatStateComputeInnerProduct(const cudensitymatHandle_t handle, const cudensitymatState_t stateLeft, const cudensitymatState_t stateRight, void *innerProduct, cudaStream_t stream)

Computes the inner product(s) between the left quantum state(s) and the right quantum state(s): < state(s)Left | state(s)Right >

For pure quantum states, this function computes the regular Hilbert-space inner product. For mixed quantum states, it computes the matrix inner product induced by the Frobenius matrix norm: The sum of regular Hilbert-space inner products for all columns of two density matrices.

The result is generally a vector of dimension equal to the batch size of both quantum states, which must be the same. The participating quantum states must have compatible shapes.

Parameters
  • handle[in] Library handle.

  • stateLeft[in] Left quantum state (or a batch of quantum states).

  • stateRight[in] Right quantum state (or a batch of quantum states).

  • innerProduct[out] Pointer to the inner product(s) vector storage in the GPU-accessible RAM (same data type as the one used by the quantum states).

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


Quantum operator API

cudensitymatCreateElementaryOperator

cudensitymatStatus_t cudensitymatCreateElementaryOperator(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], cudensitymatElementaryOperatorSparsity_t sparsity, int32_t numDiagonals, const int32_t diagonalOffsets[], cudaDataType_t dataType, void *tensorData, cudensitymatWrappedTensorCallback_t tensorCallback, cudensitymatElementaryOperator_t *elemOperator)

Creates an elementary tensor operator acting on a given number of quantum state modes (aka space modes).

An elementary tensor operator is a single tensor operator acting on a specific set of space modes (quantum degrees of freedom). A tensor operator is composed of a set of the ket modes and a set of the corresponding bra modes of matching extents, where both sets have the same number of modes and the ket modes precede the bra modes, both in the same order. For example, T[i0, i1, j0, j1] is a 2-body tensor operator in which modes {i0, i1} form a set of the ket modes while modes {j0, j1} form the corresponding set of the bra modes, where the ket mode i0 corresponds to the bra mode j0, and the ket mode i1 corresponds to the bra mode j1 (the modes are always paired this way). Only one mode in each pair of the corresponding modes is contracted with the quantum state tensor, either from the left or from the right. For example, either the bra mode j0 is contracted with a specific ket mode of the quantum state, representing an operator action from the left, or the ket mode i0 is contracted with a specific bra mode of the quantum state, representing an operator action from the right. Then, the corresponding remaining uncontracted mode replaces the contracted mode of the quantum state.

Storage of tensor elements in memory:

  • CUDENSITYMAT_OPERATOR_SPARSITY_NONE: Dense tensor stored using the generalized column-wise layout.

  • CUDENSITYMAT_OPERATOR_SPARSITY_MULTIDIAGONAL: The full non-zero diagonals are stored in a concatenated form, following the order how they appear in the diagonalOffsets argument. The length of each stored diagonal is equal to the full matrix dimension, padded with trailing zeros for non-main diagonals.

Note

Currently the multi-diagonal storage format is only supported by 1-body elementary tensor operators (restriction subject to lifting in future).

Warning

Different elementary tensor operators must not use the same or overlapping GPU storage buffers, otherwise it will cause an undefined behavior.

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of the (state) space modes acted on.

  • spaceModeExtents[in] Extents of the (state) space modes acted on.

  • sparsity[in] Tensor operator sparsity defining the storage scheme.

  • numDiagonals[in] For multi-diagonal tensor operator matrices, specifies the total number of non-zero diagonals (>= 1).

  • diagonalOffsets[in] Offsets of the non-zero diagonals (for example, the main diagonal has offset 0, the diagonal right above the main diagonal has offset +1, the diagonal right below the main diagonal has offset -1, and so on).

  • dataType[in] Tensor operator data type.

  • tensorData[in] GPU-accessible pointer to the tensor operator elements storage.

  • tensorCallback[in] Optional user-defined tensor callback function which can be called later to fill in the tensor elements in the provided storage, or NULL.

  • elemOperator[out] Elementary tensor operator.

Returns

cudensitymatStatus_t


cudensitymatCreateElementaryOperatorBatch

cudensitymatStatus_t cudensitymatCreateElementaryOperatorBatch(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], int64_t batchSize, cudensitymatElementaryOperatorSparsity_t sparsity, int32_t numDiagonals, const int32_t diagonalOffsets[], cudaDataType_t dataType, void *tensorData, cudensitymatWrappedTensorCallback_t tensorCallback, cudensitymatElementaryOperator_t *elemOperator)

Creates a batch of elementary tensor operators acting on a given number of quantum state modes (aka space modes). This is a batched version of the cudensitymatCreateElementaryOperator API function.

This API function is used to create a batch of elementary tensor operators of the same shape stored contiguously in memory, where the batch size must match the batch size of the quantum state acted on. An elementary tensor operator is a single tensor operator acting on a specific set of space modes (quantum degrees of freedom). A tensor operator is composed of a set of the ket modes and a set of the corresponding bra modes of matching extents, where both sets have the same number of modes and the ket modes precede the bra modes, both in the same order. For example, T[i0, i1, j0, j1] is a 2-body tensor operator in which modes {i0, i1} form a set of the ket modes while modes {j0, j1} form the corresponding set of the bra modes, where the ket mode i0 corresponds to the bra mode j0, and the ket mode i1 corresponds to the bra mode j1 (the modes are always paired this way). Only one mode in each pair of the corresponding modes is contracted with the quantum state tensor, either from the left or from the right. For example, either the bra mode j0 is contracted with a specific ket mode of the quantum state, representing an operator action from the left, or the ket mode i0 is contracted with a specific bra mode of the quantum state, representing an operator action from the right. Then, the corresponding remaining uncontracted mode replaces the contracted mode of the quantum state.

Storage of tensor elements in memory:

  • CUDENSITYMAT_OPERATOR_SPARSITY_NONE: Dense tensor stored using the generalized column-wise layout.

  • CUDENSITYMAT_OPERATOR_SPARSITY_MULTIDIAGONAL: The full non-zero diagonals are stored in a concatenated form, following the order how they appear in the diagonalOffsets argument. The length of each stored diagonal is equal to the full matrix dimension, padded with trailing zeros for non-main diagonals.

Note

Currently the multi-diagonal storage format is only supported by 1-body elementary tensor operators (restriction subject to lifting in future). Furthermore, all elementary tensor operators within the batch are assumed to have the same sparse structure in terms of which matrix diagonals are stored, that is, the same diagonalOffsets.

Warning

Different elementary tensor operators must not use the same or overlapping GPU storage buffers, otherwise it will cause an undefined behavior.

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of the (state) space modes acted on.

  • spaceModeExtents[in] Extents of the (state) space modes acted on.

  • batchSize[in] Batch size (>= 1).

  • sparsity[in] Tensor operator sparsity defining the storage scheme.

  • numDiagonals[in] For multi-diagonal tensor operator matrices, specifies the total number of non-zero diagonals (>= 1).

  • diagonalOffsets[in] Offsets of the non-zero diagonals (for example, the main diagonal has offset 0, the diagonal right above the main diagonal has offset +1, the diagonal right below the main diagonal has offset -1, and so on).

  • dataType[in] Tensor operator data type.

  • tensorData[in] GPU-accessible pointer to the tensor operator elements storage, where all elementary tensor operators within the batch are stored contiguously in memory.

  • tensorCallback[in] Optional user-defined batched tensor callback function which can be called later to fill in the tensor elements in the provided batched storage, or NULL. Note that the provided batched tensor callback function is expected to fill in all tensor instances within the batch in one call.

  • elemOperator[out] Batched elementary tensor operator (a batch of individual elementary tensor operators stored contiguously in memory).

Returns

cudensitymatStatus_t


cudensitymatDestroyElementaryOperator

cudensitymatStatus_t cudensitymatDestroyElementaryOperator(cudensitymatElementaryOperator_t elemOperator)

Destroys an elementary tensor operator (simple or batched).

Parameters

elemOperator[in] Elementary tensor operator.

Returns

cudensitymatStatus_t


cudensitymatCreateMatrixOperatorDenseLocal

cudensitymatStatus_t cudensitymatCreateMatrixOperatorDenseLocal(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], cudaDataType_t dataType, void *matrixData, cudensitymatWrappedTensorCallback_t matrixCallback, cudensitymatMatrixOperator_t *matrixOperator)

Creates a full matrix operator acting on all quantum state modes (aka space modes) from a dense matrix stored (replicated) locally on each process.

A full matrix operator is a single tensor operator represented by its square matrix acting in the full Hilbert space. The dimension of the matrix is equal to the product of the extents of all space modes. The elements of the provided dense matrix are expected to be stored exactly in the same way as if the matrix operator was defined as an elementary tensor operator acting in the full space (acting on all space modes), please see description of the cudensitymatCreateElementaryOperator API function.

Note

The optional matrix callback function is still expected to take the actual tensor shape of the defined full matrix operator, namely, the tensor shape induced by the provided array of the space mode extents.

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of the (state) space modes acted on. It must coincide with the total number of space modes in the Hilbert space.

  • spaceModeExtents[in] Extents of the (state) space modes acted on.

  • dataType[in] Matrix operator data type.

  • matrixData[in] GPU-accessible pointer to the matrix operator elements storage.

  • matrixCallback[in] Optional user-defined tensor callback function which can be called later to fill in the matrix elements in the provided storage, or NULL.

  • matrixOperator[out] Full matrix operator.

Returns

cudensitymatStatus_t


cudensitymatCreateMatrixOperatorDenseLocalBatch

cudensitymatStatus_t cudensitymatCreateMatrixOperatorDenseLocalBatch(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], int64_t batchSize, cudaDataType_t dataType, void *matrixData, cudensitymatWrappedTensorCallback_t matrixCallback, cudensitymatMatrixOperator_t *matrixOperator)

Creates a batch of full matrix operators acting on all quantum state modes (aka space modes) from an array of dense matrices stored (replicated) locally on each process. This is a batched version of the cudensitymatCreateMatrixOperatorDenseLocal API function.

This API function is used to create a batch of full matrix operators stored contiguously in memory, where the batch size must match the batch size of the quantum state acted on. A full matrix operator is a single tensor operator represented by its square matrix acting in the full Hilbert space. The dimension of the matrix is equal to the product of the extents of all space modes. The elements of the provided dense matrix are expected to be stored exactly in the same way as if the matrix operator was defined as an elementary tensor operator acting in the full space (acting on all space modes), please see description of the cudensitymatCreateElementaryOperatorBatch API function.

Note

The optional batched matrix callback function is still expected to take the actual tensor shape of the defined full matrix operator, namely, the tensor shape induced by the provided array of the space mode extents and the corresponding batch size (last mode).

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of the (state) space modes acted on. It must coincide with the total number of space modes in the Hilbert space.

  • spaceModeExtents[in] Extents of the (state) space modes acted on.

  • batchSize[in] Batch size (>= 1).

  • dataType[in] Matrix operator data type.

  • matrixData[in] GPU-accessible pointer to the matrix operator elements storage where all matrix operator instances within the batch are stored contiguously in memory.

  • matrixCallback[in] Optional user-defined batched tensor callback function which can be called later to fill in the matrix elements in the provided batched storage, or NULL. Note that the provided batched tensor callback function is expected to fill in all matrix instances within the batch in one call.

  • matrixOperator[out] Batched full matrix operator (a batch of full matrix operators).

Returns

cudensitymatStatus_t


cudensitymatCreateOperatorTerm

cudensitymatStatus_t cudensitymatCreateOperatorTerm(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], cudensitymatOperatorTerm_t *operatorTerm)

Creates an empty operator term which is going to be a sum of products of either elementary tensor operators or full matrix operators. Each individual elementary tensor operator within a product acts on a subset of space modes, either from the left or from the right (for each mode). Each full matrix operator within a product acts on all space modes, either from the left or from the right (for all modes).

Note

The created operator term will only be able to act on the quantum states which reside in the same space where the operator term is set to act.

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of modes (quantum degrees of freedom) defining the primary/dual tensor product space in which the operator term will act.

  • spaceModeExtents[in] Extents of the modes (quantum degrees of freedom) defining the primary/dual tensor product space in which the operator term will act.

  • operatorTerm[out] Operator term.

Returns

cudensitymatStatus_t


cudensitymatDestroyOperatorTerm

cudensitymatStatus_t cudensitymatDestroyOperatorTerm(cudensitymatOperatorTerm_t operatorTerm)

Destroys an operator term.

Parameters

operatorTerm[in] Operator term.

Returns

cudensitymatStatus_t


cudensitymatOperatorTermAppendElementaryProduct

cudensitymatStatus_t cudensitymatOperatorTermAppendElementaryProduct(const cudensitymatHandle_t handle, cudensitymatOperatorTerm_t operatorTerm, int32_t numElemOperators, const cudensitymatElementaryOperator_t elemOperators[], const int32_t stateModesActedOn[], const int32_t modeActionDuality[], cuDoubleComplex coefficient, cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a product of elementary tensor operators acting on quantum state modes to the operator term.

The elementary tensor operators constituting the provided tensor operator product are applied to the quantum state in-order, each elementary tensor operator acting on a quantum state mode either on the left or on the right, or both.

Parameters
  • handle[in] Library handle.

  • operatorTerm[inout] Operator term.

  • numElemOperators[in] Number of elementary tensor operators in the tensor operator product.

  • elemOperators[in] Elementary tensor operators constituting the tensor operator product.

  • stateModesActedOn[in] State modes acted on by the tensor operator product. This is a concatenated list of the state modes acted on by all constituting elementary tensor operators in the same order how they appear in the elemOperators argument.

  • modeActionDuality[in] Duality status of each mode action, that is, whether the action applies to a ket mode of the quantum state (value zero) or a bra mode of the quantum state (positive value).

  • coefficient[in] Constant (static) complex scalar coefficient associated with the appended tensor operator product.

  • coefficientCallback[in] User-defined complex scalar callback function which can be called later to update the scalar coefficient associated with the tensor operator product, or NULL. The total coefficient associated with the tensor operator product is a product of the constant coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorTermAppendElementaryProductBatch

cudensitymatStatus_t cudensitymatOperatorTermAppendElementaryProductBatch(const cudensitymatHandle_t handle, cudensitymatOperatorTerm_t operatorTerm, int32_t numElemOperators, const cudensitymatElementaryOperator_t elemOperators[], const int32_t stateModesActedOn[], const int32_t modeActionDuality[], int64_t batchSize, const cuDoubleComplex staticCoefficients[], cuDoubleComplex totalCoefficients[], cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a batch of elementary tensor operator products acting on quantum state modes to the operator term.

This is a batched version of the cudensitymatOperatorTermAppendElementaryProduct API function in which the provided static coefficients form an array of some length given by the batchSize argument. The provided elementary tensor operators themselves may or may not be batched. If any of them is batched itself, its batch size must match the batchSize argument. Furthermore, all non-unity batch sizes must match the batch size of the quantum state acted on.

Parameters
  • handle[in] Library handle.

  • operatorTerm[inout] Operator term.

  • numElemOperators[in] Number of elementary tensor operators in the tensor operator product.

  • elemOperators[in] Elementary tensor operators constituting the tensor operator product (each elementary tensor operator may or may not be batched).

  • stateModesActedOn[in] State modes acted on by the tensor operator product. This is a concatenated list of the state modes acted on by all constituting elementary tensor operators in the same order how they appear in the elemOperators argument.

  • modeActionDuality[in] Duality status of each mode action, that is, whether the action applies to a ket mode of the quantum state (value zero) or a bra mode of the quantum state (positive value).

  • batchSize[in] Batch size (>= 1).

  • staticCoefficients[in] GPU-accessible array of constant (static) complex scalar coefficients associated with the appended batch of elementary tensor operator products (of length batchSize).

  • totalCoefficients[in] GPU-accessible storage for the array of total complex scalar coefficients associated with the appended batch of elementary tensor operator products (of length batchSize). Each coefficient will be a product of a static coefficient and a dynamic coefficient generated by the provided scalar callback during the computation phase. If the scalar callback is not supplied here (NULL), this argument can also be set to NULL.

  • coefficientCallback[in] User-defined batched complex scalar callback function which can be called later to update the array of dynamic scalar coefficients associated with the defined batch of elementary tensor operator products, or NULL. The total coefficient associated with an elementary tensor operator product is a product of the constant (static) coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorTermAppendGeneralProduct

cudensitymatStatus_t cudensitymatOperatorTermAppendGeneralProduct(const cudensitymatHandle_t handle, cudensitymatOperatorTerm_t operatorTerm, int32_t numElemOperators, const int32_t numOperatorModes[], const int64_t *operatorModeExtents[], const int64_t *operatorModeStrides[], const int32_t stateModesActedOn[], const int32_t modeActionDuality[], cudaDataType_t dataType, void *tensorData[], cudensitymatWrappedTensorCallback_t tensorCallbacks[], cuDoubleComplex coefficient, cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a product of generic dense tensor operators acting on quantum state modes to the operator term.

The dense tensor operators constituting the provided tensor operator product are applied to the quantum state in-order, each tensor operator acting on a quantum state mode either on the left or on the right, or both.

This is a slightly more general version of cudensitymatOperatorTermAppendElementaryProduct which does not require explicit construction of the cudensitymatElementaryOperator_t objects. Additionally, it accepts specification of tensor storage strides when describing the raw dense tensors representing tensor operators in the provided tensor operator product. On the other hand, it does not allow specification of the tensor operator sparsity, thus resulting in suboptimal performance for such cases.

Warning

Dense tensor operators from the appended tensor product must not share GPU storage buffers. Each tensor operator appended to the operator term as part of the tensor product via this API function must have its own GPU storage buffer.

Parameters
  • handle[in] Library handle.

  • operatorTerm[inout] Operator term.

  • numElemOperators[in] Number of dense tensor operators in the given tensor operator product.

  • numOperatorModes[in] Number of modes in each tensor operator (twice the number of state modes it acts on).

  • operatorModeExtents[in] Mode extents for each dense tensor operator.

  • operatorModeStrides[in] Mode strides for each dense tensor operator. If a specific element is set to NULL, the corresponding dense tensor operator will assume the default generalized column-wise storage strides.

  • stateModesActedOn[in] State modes acted on by the tensor operator product. This is a concatenated list of the state modes acted on by all constituting dense tensor operators in the same order how they appear in the above arguments.

  • modeActionDuality[in] Duality status of each mode action, whether the action applies to a ket mode of the quantum state (value 0) or a bra mode of the quantum state (value 1 or other non-zero).

  • dataType[in] Data type (for all dense tensor operators).

  • tensorData[in] GPU-accessible pointers to the elements of each dense tensor operator constituting the tensor operator product.

  • tensorCallbacks[in] User-defined tensor callback functions which can be called later to update the elements of each dense tensor operator (any of the callbacks can be NULL).

  • coefficient[in] Constant (static) complex scalar coefficient associated with the tensor operator product.

  • coefficientCallback[in] User-defined complex scalar callback function which can be called later to update the scalar coefficient associated with the tensor operator product, or NULL. The total coefficient associated with the tensor operator product is a product of the constant coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorTermAppendMatrixProduct

cudensitymatStatus_t cudensitymatOperatorTermAppendMatrixProduct(const cudensitymatHandle_t handle, cudensitymatOperatorTerm_t operatorTerm, int32_t numMatrixOperators, const cudensitymatMatrixOperator_t matrixOperators[], const int32_t matrixConjugation[], const int32_t actionDuality[], cuDoubleComplex coefficient, cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a product of full matrix operators, each acting on all quantum state modes, to the operator term.

The full matrix operators constituting the provided matrix operator product are applied to the quantum state in-order, either on the left or on the rigt, either normal or in the conjugate-transposed form.

Parameters
  • handle[in] Library handle.

  • operatorTerm[inout] Operator term.

  • numMatrixOperators[in] Number of full matrix operators in the matrix operator product.

  • matrixOperators[in] Full matrix operators constituting the matrix operator product.

  • matrixConjugation[in] Hermitean conjugation status of each matrix in the matrix operator product (zero means normal, positive integer means conjugate-transposed). For real matrices, hermitean conjugation reduces to a mere matrix transpose since there is no complex conjugation involved.

  • actionDuality[in] Duality status of each matrix operator action, that is, whether it acts on all ket modes of the quantum state (value zero) or on all bra modes of the quantum state (positive integer value).

  • coefficient[in] Constant (static) complex scalar coefficient associated with the matrix operator product.

  • coefficientCallback[in] User-defined complex scalar callback function which can be called later to update the scalar coefficient associated with the matrix operator product, or NULL. The total coefficient associated with the matrix operator product is a product of the constant coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorTermAppendMatrixProductBatch

cudensitymatStatus_t cudensitymatOperatorTermAppendMatrixProductBatch(const cudensitymatHandle_t handle, cudensitymatOperatorTerm_t operatorTerm, int32_t numMatrixOperators, const cudensitymatMatrixOperator_t matrixOperators[], const int32_t matrixConjugation[], const int32_t actionDuality[], int64_t batchSize, const cuDoubleComplex staticCoefficients[], cuDoubleComplex totalCoefficients[], cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a batch of full matrix operators to the operator term, each full matrix operator acting on all quantum state modes. This is a batched version of the cudensitymatOperatorTermAppendMatrixProduct API function.

This is a batched version of the cudensitymatOperatorTermAppendMatrixProduct API function in which the provided coefficients form an array of some length given by the batchSize argument. The provided full matrix operator itself may or may not be batched. If it is batched, its batch size must match the one the batchSize argument. If the full matrix operator itlsef is not batched, the same matrix will be used for all batch instances defined here. Furthermore, all non-unity batch sizes must match the batch size of the quantum state acted on.

Parameters
  • handle[in] Library handle.

  • operatorTerm[inout] Operator term.

  • numMatrixOperators[in] Number of full matrix operators in the matrix operator product.

  • matrixOperators[in] Full matrix operators constituting the matrix operator product (each full matrix operator may or may not be batched).

  • matrixConjugation[in] Hermitean conjugation status of each matrix in the matrix operator product (zero means normal, positive integer means conjugate-transposed). For real matrices, hermitean conjugation reduces to a mere matrix transpose since there is no complex conjugation involved.

  • actionDuality[in] Duality status of each matrix operator action, that is, whether it acts on all ket modes of the quantum state (value zero) or on all bra modes of the quantum state (positive integer value).

  • batchSize[in] Batch size (>= 1).

  • staticCoefficients[in] GPU-accessible array of constant (static) complex scalar coefficients associated with the appended batch of full matrix operator products (of length batchSize).

  • totalCoefficients[in] GPU-accessible storage for the array of total complex scalar coefficients associated with the appended batch of full matrix operator products (of length batchSize). Each coefficient will be a product of a static coefficient and a dynamic coefficient generated by the provided scalar callback during the computation phase. If the scalar callback is not supplied here (NULL), this argument can also be set to NULL.

  • coefficientCallback[in] User-defined batched complex scalar callback function which can be called later to update the array of dynamic scalar coefficients associated with the defined batch of full matrix operator products, or NULL. The total coefficient associated with an elementary tensor operator product is a product of the constant (static) coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatCreateOperator

cudensitymatStatus_t cudensitymatCreateOperator(const cudensitymatHandle_t handle, int32_t numSpaceModes, const int64_t spaceModeExtents[], cudensitymatOperator_t *superoperator)

Creates an empty operator which is going to be a collection of operator terms with some coefficients.

If the operator is expected to act on a pure quantum state, it is just a regular operator that will act on the pure state vector from one side. If the operator is expected to act on a mixed quantum state, its action can become more complicated where it may act on both sides of the density matrix representing the mixed quantum state. In this case, the operator is specifically called the super-operator. However, one should note that in both cases this is still a mathematical operator, just acting on a different kind of mathematical vector.

Note

The created operator will only be able to act on the quantum states which reside in the same space where the operator is set to act.

Parameters
  • handle[in] Library handle.

  • numSpaceModes[in] Number of modes (degrees of freedom) defining the primary/dual tensor product space in which the operator term will act.

  • spaceModeExtents[in] Extents of the modes (degrees of freedom) defining the primary/dual tensor product space in which the operator term will act.

  • superoperator[out] Operator.

Returns

cudensitymatStatus_t


cudensitymatDestroyOperator

cudensitymatStatus_t cudensitymatDestroyOperator(cudensitymatOperator_t superoperator)

Destroys an operator.

Parameters

superoperator[in] Operator.

Returns

cudensitymatStatus_t


cudensitymatOperatorAppendTerm

cudensitymatStatus_t cudensitymatOperatorAppendTerm(const cudensitymatHandle_t handle, cudensitymatOperator_t superoperator, cudensitymatOperatorTerm_t operatorTerm, int32_t duality, cuDoubleComplex coefficient, cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends an operator term to the operator.

Parameters
  • handle[in] Library handle.

  • superoperator[inout] Operator.

  • operatorTerm[in] Operator term.

  • duality[in] Duality status of the operator term action as a whole. If not zero, the duality status of each mode action inside the operator term will be flipped, that is, action from the left will be replaced by action from the right, and vice versa.

  • coefficient[in] Constant (static) complex scalar coefficient associated with the operator term.

  • coefficientCallback[in] User-defined complex scalar callback function which can be called later to update the scalar coefficient associated with the operator term, or NULL. The total coefficient associated with the operator term is a product of the constant coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorAppendTermBatch

cudensitymatStatus_t cudensitymatOperatorAppendTermBatch(const cudensitymatHandle_t handle, cudensitymatOperator_t superoperator, cudensitymatOperatorTerm_t operatorTerm, int32_t duality, int64_t batchSize, const cuDoubleComplex staticCoefficients[], cuDoubleComplex totalCoefficients[], cudensitymatWrappedScalarCallback_t coefficientCallback)

Appends a batch of operator terms to the operator.

This is a batched version of the cudensitymatOperatorAppendTerm API function in which the provided coefficients form an array of some length given by the batchSize argument. The operator term itself may or may not be batched, that is, it may or may not contain batched components (batched elementary tensor operator products or batched full matrix operator products). If any of its components is batched, the batch sizes must match. They also must match the batch size of the quantum state acted on. If any of the operator terms or elementary tensor operators or full matrix operators inside any operator term is not batched, its value will be replicated along the batch dimension.

Parameters
  • handle[in] Library handle.

  • superoperator[inout] Operator.

  • operatorTerm[in] Operator term.

  • duality[in] Duality status of the operator term action as a whole. If not zero, the duality status of each mode action inside the operator term will be flipped, that is, action from the left will be replaced by action from the right, and vice versa.

  • batchSize[in] Batch size (>= 1).

  • staticCoefficients[in] GPU-accessible array of constant (static) complex scalar coefficients associated with the appended batch of operator terms (of length batchSize).

  • totalCoefficients[in] GPU-accessible storage for the array of total complex scalar coefficients associated with the appended batch of operator terms (of length batchSize). Each coefficient will be a product of a static coefficient and a dynamic coefficient generated by the coefficient callback during the computation phase. If the scalar callback is not supplied here (NULL), this argument can also be set to NULL.

  • coefficientCallback[in] User-defined batched complex scalar callback function which can be called later to update the array of scalar coefficients associated with the defined batch of operator terms, or NULL. The total coefficient associated with an operator term is a product of the constant (static) coefficient and the result of the scalar callback function, if defined.

Returns

cudensitymatStatus_t


cudensitymatOperatorPrepareAction

cudensitymatStatus_t cudensitymatOperatorPrepareAction(const cudensitymatHandle_t handle, const cudensitymatOperator_t superoperator, const cudensitymatState_t stateIn, const cudensitymatState_t stateOut, cudensitymatComputeType_t computeType, size_t workspaceSizeLimit, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Prepares the operator for an action on a quantum state.

In general, before the operator action on a specific quantum state(s) can be computed, it needs to be prepared for computation first, which is the purpose of this API function.

Note

The required size of the workspace buffer returned inside the workspace descriptor may sometimes be zero, in which case there is no need to allocate a workspace buffer.

Parameters
  • handle[in] Library handle.

  • superoperator[in] Operator.

  • stateIn[in] Representative input quantum state on which the operator is supposed to act. The actual state acted on during computation may be different, but it has to be of the same shape, kind, and factorization structure (topology, bond dimensions, etc).

  • stateOut[in] Representative output quantum state produced by the action of the operator on the input quantum state. The actual state acted on during computation may be different, but it has to be of the same shape, kind, and factorization structure (topology, bond dimensions, etc).

  • computeType[in] Desired compute type.

  • workspaceSizeLimit[in] Workspace buffer size limit (bytes).

  • workspace[inout] Empty workspace descriptor on entrance. The workspace size required for the computation will be set on exit.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatOperatorComputeAction

cudensitymatStatus_t cudensitymatOperatorComputeAction(const cudensitymatHandle_t handle, const cudensitymatOperator_t superoperator, double time, int64_t batchSize, int32_t numParams, const double *params, const cudensitymatState_t stateIn, cudensitymatState_t stateOut, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Computes the action of the operator on a given input quantum state, accumulating the result in the output quantum state (accumulative action).

Note

The provided input and output quantum states must be of the same kind, shape, and structure as the quantum states provided during the preceding preparation phase.

Warning

The output quantum state cannot coincide with the input quantum state.

Parameters
  • handle[in] Library handle.

  • superoperator[in] Operator.

  • time[in] Time value.

  • batchSize[in] Batch size (>=1).

  • numParams[in] Number of variable parameters defined by the user.

  • params[in] GPU-accessible pointer to an F-order 2d-array of user-defined real parameter values: params[numParams, batchSize].

  • stateIn[in] Input quantum state (or a batch of input quantum states).

  • stateOut[inout] Updated resulting quantum state which accumulates operator action on the input quantum state.

  • workspace[in] Allocated workspace descriptor.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatCreateOperatorAction

cudensitymatStatus_t cudensitymatCreateOperatorAction(const cudensitymatHandle_t handle, int32_t numOperators, cudensitymatOperator_t operators[], cudensitymatOperatorAction_t *operatorAction)

Creates an action descriptor for one or more operators, thus defining an aggregate action of the operator(s) on a set of input quantum states compliant with the operator domains, where all input quantum states can also be batched.

Specification of an operator itself is generally insufficient for specifying the r.h.s. of the desired ordinary differential equation (ODE) defining the evolution of the quantum state in time. In general, the ODE r.h.s. specification requires specifying the action of one or more operators on one or more (batched) quantum states (normally, density matrices). The abstraction of the OperatorAction serves exactly this purpose. When the aggregate operator action is computed, each provided operator will act on its own input quantum state producing a contribution to the same output quantum state.

Note

Sometimes one needs to solve a coupled system of ordinary differential equations where a number of quantum states are simultaneously evolved in time. In such a case, not all quantum states have to affect the evolution of a given one of them. To handle such cases, some of the operator-state products, which do not contribute, can be set to zero by setting the corresponding entry of the operators[] argument to NULL.

Parameters
  • handle[in] Library handle.

  • numOperators[in] Number of operators involved (number of operator-state products).

  • operators[in] Constituting operator(s) with the same domain of action. Some of the operators may be set to NULL to represent zero action on a specific input quantum state.

  • operatorAction[out] Operator action.

Returns

cudensitymatStatus_t


cudensitymatDestroyOperatorAction

cudensitymatStatus_t cudensitymatDestroyOperatorAction(cudensitymatOperatorAction_t operatorAction)

Destroys the operator action descriptor.

Parameters

operatorAction[in] Operator action.

Returns

cudensitymatStatus_t


cudensitymatOperatorActionPrepare

cudensitymatStatus_t cudensitymatOperatorActionPrepare(const cudensitymatHandle_t handle, cudensitymatOperatorAction_t operatorAction, const cudensitymatState_t stateIn[], const cudensitymatState_t stateOut, cudensitymatComputeType_t computeType, size_t workspaceSizeLimit, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Prepares the (aggregate) operator(s) action for computation.

In general, before the (aggregate) operator(s) action on specific quantum states can be computed, it needs to be prepared for computation first, which is the purpose of this API function.

Note

The required size of the workspace buffer returned inside the workspace descriptor may sometimes be zero, in which case there is no need to allocate a workspace buffer.

Parameters
  • handle[in] Library handle.

  • operatorAction[inout] Operator(s) action specification.

  • stateIn[in] Input quantum state(s) for all operator(s) defining the current Operator Action. Each input quantum state can be a batch of quantum states itself (with the same batch size).

  • stateOut[in] Updated output quantum state (or a batch) which accumulates the (aggregate) operator(s) action on all input quantum state(s).

  • computeType[in] Desired compute type.

  • workspaceSizeLimit[in] Workspace buffer size limit (bytes).

  • workspace[inout] Empty workspace descriptor on entrance. The workspace size required for the computation will be set on exit.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatOperatorActionCompute

cudensitymatStatus_t cudensitymatOperatorActionCompute(const cudensitymatHandle_t handle, cudensitymatOperatorAction_t operatorAction, double time, int64_t batchSize, int32_t numParams, const double *params, const cudensitymatState_t stateIn[], cudensitymatState_t stateOut, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Executes the action of one or more operators constituting the aggreggate operator(s) action on the same number of input quantum states, accumulating the results into a single output quantum state.

Note

The output quantum state cannot be one of the input quantum states.

Parameters
  • handle[in] Library handle.

  • operatorAction[inout] Operator(s) action.

  • time[in] Time value.

  • batchSize[in] Batch size (>=1).

  • numParams[in] Number of variable parameters defined by the user.

  • params[in] GPU-accessible pointer to an F-order 2d-array of user-defined real parameter values: params[numParams, batchSize].

  • stateIn[in] Input quantum state(s). Each input quantum state can be a batch of quantum states, in general.

  • stateOut[inout] Updated output quantum state which accumulates operator action(s) on all input quantum state(s).

  • workspace[in] Allocated workspace descriptor.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


Operator expectation API

cudensitymatCreateExpectation

cudensitymatStatus_t cudensitymatCreateExpectation(const cudensitymatHandle_t handle, cudensitymatOperator_t superoperator, cudensitymatExpectation_t *expectation)

Creates the operator expectation value computation object.

Note

The unnormalized expectation value will be produced during the computation. If the quantum state is not normalized, one will need to additionally compute the state norm or trace in order to obtain the normalized operator expectation value.

Note

The operator must stay alive during the lifetime of the Expectation object.

Parameters
  • handle[in] Library handle.

  • superoperator[in] Operator.

  • expectation[out] Expectation value object.

Returns

cudensitymatStatus_t


cudensitymatDestroyExpectation

cudensitymatStatus_t cudensitymatDestroyExpectation(cudensitymatExpectation_t expectation)

Destroys an expectation value object.

Parameters

expectation[in] Expectation value object.

Returns

cudensitymatStatus_t


cudensitymatExpectationPrepare

cudensitymatStatus_t cudensitymatExpectationPrepare(const cudensitymatHandle_t handle, cudensitymatExpectation_t expectation, const cudensitymatState_t state, cudensitymatComputeType_t computeType, size_t workspaceSizeLimit, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Prepares the expectation value object for computation.

In general, before the expectation value can be computed, it needs to be prepared for computation first, which is the purpose of this API function.

Note

The required size of the workspace buffer returned inside the workspace descriptor may sometimes be zero, in which case there is no need to allocate a workspace buffer.

Parameters
  • handle[in] Library handle.

  • expectation[inout] Expectation value object.

  • state[in] Quantum state (or a batch of quantum states).

  • computeType[in] Desired compute type.

  • workspaceSizeLimit[in] Workspace buffer size limit (bytes).

  • workspace[inout] Empty workspace descriptor on entrance. The workspace size required for the computation will be set on exit.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t


cudensitymatExpectationCompute

cudensitymatStatus_t cudensitymatExpectationCompute(const cudensitymatHandle_t handle, cudensitymatExpectation_t expectation, double time, int64_t batchSize, int32_t numParams, const double *params, const cudensitymatState_t state, void *expectationValue, cudensitymatWorkspaceDescriptor_t workspace, cudaStream_t stream)

Computes the operator expectation value(s) with respect to the given quantum state(s).

The result is generally a vector of dimension equal to the state batch size.

Parameters
  • handle[in] Library handle.

  • expectation[in] Expectation value object.

  • time[in] Specified time.

  • batchSize[in] Batch size (>=1).

  • numParams[in] Number of variable parameters defined by the user.

  • params[in] GPU-accessible pointer to an F-order 2d-array of user-defined real parameter values: params[numParams, batchSize].

  • state[in] Quantum state (or a batch of quantum states).

  • expectationValue[out] Pointer to the expectation value(s) vector storage in GPU-accessible RAM of the same data type as used by the state and operator.

  • workspace[in] Allocated workspace descriptor.

  • stream[in] CUDA stream.

Returns

cudensitymatStatus_t