CUDA-Q Python API

Program Construction

cudaq.make_kernel(*args)

Create a Kernel: An empty kernel function to be used for quantum program construction. This kernel is non-parameterized if it accepts no arguments, else takes the provided types as arguments.

Returns a kernel if it is non-parameterized, else a tuple containing the kernel and a QuakeValue for each kernel argument.

# Example:
# Non-parameterized kernel.
kernel = cudaq.make_kernel()

# Example:
# Parameterized kernel that accepts an `int` and `float` as arguments.
kernel, int_value, float_value = cudaq.make_kernel(int, float)
class cudaq.PyKernel(argTypeList)

The Kernel provides an API for dynamically constructing quantum circuits. The Kernel programmatically represents the circuit as an MLIR function using the Quake dialect.

name

The name of the Kernel function. Read-only.

Type:

str

arguments

The arguments accepted by the Kernel function. Read-only.

Type:

List[QuakeValue]

argument_count

The number of arguments accepted by the Kernel function. Read-only.

Type:

int

cudaq.Kernel

alias of PyKernel

class cudaq.PyKernelDecorator(function, verbose=False, module=None, kernelName=None)

The PyKernelDecorator serves as a standard Python decorator that takes the decorated function as input and optionally lowers its AST representation to executable code via MLIR. This decorator enables full JIT compilation mode, where the function is lowered to an MLIR representation.

This decorator exposes a call overload that executes the code via the MLIR ExecutionEngine for the MLIR mode.

__call__(*args)

Invoke the CUDA-Q kernel. JIT compilation of the kernel AST to MLIR will occur here if it has not already occurred.

__str__()

Return the MLIR Module string representation for this kernel.

compile()

Compile the Python function AST to MLIR. This is a no-op if the kernel is already compiled.

cudaq.kernel(function=None, **kwargs)

The cudaq.kernel represents the CUDA-Q language function attribute that programmers leverage to indicate the following function is a CUDA-Q kernel and should be compile and executed on an available quantum coprocessor.

Verbose logging can be enabled via verbose=True.

Kernel Execution

cudaq.sample(kernel, *args, shots_count=1000, noise_model=None)

Sample the state generated by the provided kernel at the given kernel arguments over the specified number of circuit executions (shots_count). Each argument in arguments provided can be a list or ndarray of arguments of the specified kernel argument type, and in this case, the sample functionality will be broadcasted over all argument sets and a list of sample_result instances will be returned.

Parameters:
  • kernel (Kernel) – The Kernel to execute shots_count times on the QPU.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments. For example, if the kernel takes two float values as input, the sample call should be structured as cudaq.sample(kernel, firstFloat, secondFloat). For broadcasting of the sample function, the arguments should be structured as a list or ndarray of argument values of the specified kernel argument type.

  • shots_count (Optional[int]) – The number of kernel executions on the QPU. Defaults to 1000. Key-word only.

  • noise_model (Optional[NoiseModel]) – The optional NoiseModel to add noise to the kernel execution on the simulator. Defaults to an empty noise model.

Returns:

A dictionary containing the measurement count results for the Kernel, or a list of such results in the case of sample function broadcasting.

Return type:

SampleResult or list[SampleResult]

cudaq.sample_async()
cudaq.sample_async(kernel: object, \*args, shots_count: int = 1000, qpu_id: int = 0) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncSampleResult

Asynchronously sample the state of the provided kernel at the specified number of circuit executions (shots_count). When targeting a quantum platform with more than one QPU, the optional qpu_id allows for control over which QPU to enable. Will return a future whose results can be retrieved via future.get().

Parameters:
  • kernel (Kernel) – The Kernel to execute shots_count times on the QPU.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

  • shots_count (Optional[int]) – The number of kernel executions on the QPU. Defaults to 1000. Key-word only.

  • qpu_id (Optional[int]) – The optional identification for which QPU on the platform to target. Defaults to zero. Key-word only.

Returns:

A dictionary containing the measurement count results for the Kernel.

Return type:

AsyncSampleResult

cudaq.observe(kernel, spin_operator, *args, shots_count=0, noise_model=None, execution=None)

Compute the expected value of the spin_operator with respect to the kernel. If the input spin_operator is a list of SpinOperator then compute the expected value of every operator in the list and return a list of results. If the kernel accepts arguments, it will be evaluated with respect to kernel(*arguments). Each argument in arguments provided can be a list or ndarray of arguments of the specified kernel argument type, and in this case, the observe functionality will be broadcasted over all argument sets and a list of observe_result instances will be returned. If both the input spin_operator and arguments are broadcast lists, a nested list of results over arguments then spin_operator will be returned.

Parameters:
  • kernel (Kernel) – The Kernel to evaluate the expectation value with respect to.

  • spin_operator (SpinOperator or list[SpinOperator]) – The Hermitian spin operator to calculate the expectation of, or a list of such operators.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

  • shots_count (Optional[int]) – The number of shots to use for QPU execution. Defaults to -1 implying no shots-based sampling. Key-word only.

  • noise_model (Optional[NoiseModel]) – The optional NoiseModel to add noise to the kernel execution on the simulator. Defaults to an empty noise model.

Returns:

A data-type containing the expectation value of the spin_operator with respect to the kernel(*arguments), or a list of such results in the case of observe function broadcasting. If shots_count was provided, the ObserveResult will also contain a SampleResult dictionary.

Return type:

ObserveResult

cudaq.observe_async()
cudaq.observe_async(kernel: object, spin_operator: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, \*args, qpu_id: int = 0, shots_count: int = -1) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncObserveResult

Compute the expected value of the spin_operator with respect to the kernel asynchronously. If the kernel accepts arguments, it will be evaluated with respect to kernel(*arguments). When targeting a quantum platform with more than one QPU, the optional qpu_id allows for control over which QPU to enable. Will return a future whose results can be retrieved via future.get().

Parameters:
  • kernel (Kernel) – The Kernel to evaluate the expectation value with respect to.

  • spin_operator (SpinOperator) – The Hermitian spin operator to calculate the expectation of.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

  • qpu_id (Optional[int]) – The optional identification for which QPU on the platform to target. Defaults to zero. Key-word only.

  • shots_count (Optional[int]) – The number of shots to use for QPU execution. Defaults to -1 implying no shots-based sampling. Key-word only.

Returns:

A future containing the result of the call to observe.

Return type:

AsyncObserveResult

cudaq.get_state()
cudaq.get_state(arg0: object, \*args) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State

Return the State of the system after execution of the provided kernel.

Parameters:
  • kernel (Kernel) – The Kernel to execute on the QPU.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

# Example:
import numpy as np

# Define a kernel that will produced the all |11...1> state.
kernel = cudaq.make_kernel()
qubits = kernel.qalloc(3)
# Prepare qubits in the 1-state.
kernel.x(qubits)

# Get the state of the system. This will execute the provided kernel
# and, depending on the selected target, will return the state as a
# vector or matrix.
state = cudaq.get_state(kernel)
print(state)
cudaq.get_state_async()
cudaq.get_state_async(kernel: object, \*args, qpu_id: int = 0) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncStateResult

Asynchronously retrieve the state generated by the given quantum kernel. When targeting a quantum platform with more than one QPU, the optional qpu_id allows for control over which QPU to enable. Will return a future whose results can be retrieved via future.get().

Parameters:
  • kernel (Kernel) – The Kernel to execute on the QPU.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

  • qpu_id (Optional[int]) – The optional identification for which QPU on the platform to target. Defaults to zero. Key-word only.

Returns:

Quantum state (state vector or density matrix) data).

Return type:

AsyncStateResult

cudaq.vqe(*args, **kwargs)

Overloaded function.

  1. cudaq.vqe(kernel: object, spin_operator: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, optimizer: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.optimizer, parameter_count: int, shots: int = -1) tuple[float, list[float]]
  2. cudaq.vqe(kernel: object, spin_operator: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, optimizer: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.optimizer, parameter_count: int, argument_mapper: Callable, shots: int = -1) tuple[float, list[float]]
  3. cudaq.vqe(kernel: object, gradient_strategy: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.gradients.gradient, spin_operator: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, optimizer: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.optimizer, parameter_count: int, shots: int = -1) tuple[float, list[float]]
  4. cudaq.vqe(kernel: object, gradient_strategy: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.gradients.gradient, spin_operator: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, optimizer: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.optimizer, parameter_count: int, argument_mapper: Callable, shots: int = -1) tuple[float, list[float]]
cudaq.draw()
cudaq.draw(arg0: object, \*args) str

Return a UTF-8 encoded string representing drawing of the execution path, i.e., the trace, of the provided kernel.

Parameters:
  • kernel (Kernel) – The Kernel to draw.

  • *arguments (Optional[Any]) – The concrete values to evaluate the kernel function at. Leave empty if the kernel doesn’t accept any arguments.

Returns:

The UTF-8 encoded string of the circuit, without measurement operations.

# Example
import cudaq
@cudaq.kernel
def bell_pair():
    q = cudaq.qvector(2)
    h(q[0])
    cx(q[0], q[1])
    mz(q)
print(cudaq.draw(bell_pair))
# Output
#      ╭───╮
# q0 : ┤ h ├──●──
#      ╰───╯╭─┴─╮
# q1 : ─────┤ x ├
#           ╰───╯

# Example with arguments
import cudaq
@cudaq.kernel
def kernel(angle:float):
    q = cudaq.qubit()
    h(q)
    ry(angle, q)
print(cudaq.draw(kernel, 0.59))
# Output
#      ╭───╮╭──────────╮
# q0 : ┤ h ├┤ ry(0.59) ├
#      ╰───╯╰──────────╯

Backend Configuration

cudaq.has_target()
cudaq.has_target(arg0: str) bool

Return true if the cudaq.Target with the given name exists.

cudaq.get_target(*args, **kwargs)

Overloaded function.

  1. cudaq.get_target(arg0: str) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target

Return the cudaq.Target with the given name. Will raise an exception if the name is not valid.

  1. cudaq.get_target() cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target

Return the cudaq.Target with the given name. Will raise an exception if the name is not valid.

cudaq.get_targets()
cudaq.get_targets() list[cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target]

Return all available cudaq.Target instances on the current system.

cudaq.set_target(*args, **kwargs)

Overloaded function.

  1. cudaq.set_target(arg0: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target, \*\*kwargs) None

Set the cudaq.Target to be used for CUDA-Q kernel execution. Can provide optional, target-specific configuration data via Python kwargs.

  1. cudaq.set_target(arg0: str, \*\*kwargs) None

Set the cudaq.Target with given name to be used for CUDA-Q kernel execution. Can provide optional, target-specific configuration data via Python kwargs.

cudaq.reset_target()
cudaq.reset_target() None

Reset the current cudaq.Target to the default.

cudaq.set_noise()
cudaq.set_noise(arg0: cudaq.NoiseModel) None

Set the underlying noise model.

cudaq.unset_noise()
cudaq.unset_noise() None

Clear backend simulation from any existing noise models.

cudaq.initialize_cudaq()
cudaq.initialize_cudaq(\*\*kwargs) None

Initialize the CUDA-Q environment.

cudaq.num_available_gpus()
cudaq.num_available_gpus() int

The number of available GPUs detected on the system.

cudaq.set_random_seed()
cudaq.set_random_seed(arg0: int) None

Provide the seed for backend quantum kernel simulation.

Data Types

class cudaq.Target

The cudaq.Target represents the underlying infrastructure that CUDA-Q kernels will execute on. Instances of cudaq.Target describe what simulator they may leverage, the quantum_platform required for execution, and a description for the target.

property description

A string describing the features for this cudaq.Target.

is_emulated()
is_emulated(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target) bool

Returns true if the emulation mode for the target has been activated.

is_remote()
is_remote(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target) bool

Returns true if the target consists of a remote REST QPU.

property name

The name of the cudaq.Target.

num_qpus()
num_qpus(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.Target) int

Return the number of QPUs available in this cudaq.Target.

property platform

The name of the quantum_platform implementation this cudaq.Target leverages.

property simulator

The name of the simulator this cudaq.Target leverages. This will be empty for physical QPUs.

class cudaq.State

A data-type representing the quantum state of the internal simulator. Returns a state vector by default. If the target is set to density-matrix-cpu, a density matrix will be returned.

dump()
dump(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State) None

Print the state to the console.

overlap(*args, **kwargs)

Overloaded function.

  1. overlap(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State, arg0: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State) float

Compute the overlap between the provided State’s.

  1. overlap(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State, arg0: numpy.ndarray) float

Compute the overlap between the provided State’s.

class cudaq.QuakeValue(mlirValue, pyKernel, size=None)

A QuakeValue represents a handle to an individual function argument of a Kernel, or a return value from an operation within it. As documented in make_kernel(), a QuakeValue can hold values of the following types: int, float, list/List, qubit, or qvector. The QuakeValue can also hold kernel operations such as qubit allocations and measurements.

__add__(other)

Return the sum of self (QuakeValue) and other (float).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = value + 5.0
__radd__(other)

Return the sum of other (float) and self (QuakeValue).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = 5.0 + value
__sub__(other)

Return the difference of self (QuakeValue) and other (float).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = value - 5.0
__rsub__(other)

Return the difference of other (float) and self (QuakeValue).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = 5.0 - value
__neg__()

Return the negation of self (QuakeValue).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = -value
__mul__(other)

Return the product of self (QuakeValue) with other (float).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = value * 5.0
__rmul__(other)

Return the product of other (float) with self (QuakeValue).

Raises:

RuntimeError – if the underlying QuakeValue type is not a float.

# Example:
kernel, value = cudaq.make_kernel(float)
new_value: QuakeValue = 5.0 * value
__getitem__(idx)

Return the element of self at the provided index.

Note

Only list or qvector type QuakeValue’s may be indexed.

Parameters:

index (int) – The element of self that you’d like to return.

Returns:

A new QuakeValue for the index element of self.

Return type:

QuakeValue

Raises:

RuntimeError – if self is a non-subscriptable QuakeValue.

slice(startIdx, count)

Return a slice of the given QuakeValue as a new QuakeValue.

Note

The underlying QuakeValue must be a list or veq.

Parameters:
  • start (int) – The index to begin the slice from.

  • count (int) – The number of elements to extract after the start index.

Returns:

A new QuakeValue containing a slice of self from the start element to the start + count element.

Return type:

QuakeValue

class cudaq.qubit

The qubit is the primary unit of information in a quantum computer. Qubits can be created individually or as part of larger registers.

cudaq.qreg

alias of qvector

class cudaq.qvector

An owning, dynamically sized container for qubits. The semantics of the qvector follows that of a std::vector or list for qubits.

class cudaq.ComplexMatrix

The ComplexMatrix is a thin wrapper around a matrix of complex<double> elements.

__getitem__(*args, **kwargs)

Overloaded function.

  1. __getitem__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ComplexMatrix, arg0: int, arg1: int) complex

Return the matrix element at i, j.

  1. __getitem__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ComplexMatrix, arg0: tuple[int, int]) complex

Return the matrix element at i, j.

__str__()
__str__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ComplexMatrix) str

Write this matrix to a string representation.

minimal_eigenvalue()
minimal_eigenvalue(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ComplexMatrix) complex

Return the lowest eigenvalue for this ComplexMatrix.

class cudaq.SpinOperator
__eq__()
__eq__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) bool

Return true if the two SpinOperator’s are equal. Equality does not consider the coefficients.

__add__(*args, **kwargs)

Overloaded function.

  1. __add__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Add the given SpinOperator to this one and return result as a new SpinOperator.

  1. __add__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Add a double to the given SpinOperator and return result as a new SpinOperator.

__radd__()
__radd__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Add a SpinOperator to the given double and return result as a new SpinOperator.

__sub__(*args, **kwargs)

Overloaded function.

  1. __sub__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Subtract the given SpinOperator from this one and return result as a new SpinOperator.

  1. __sub__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Subtract a double from the given SpinOperator and return result as a new SpinOperator.

__rsub__()
__rsub__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Subtract a SpinOperator from the given double and return result as a new SpinOperator.

__mul__(*args, **kwargs)

Overloaded function.

  1. __mul__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Multiply the given SpinOperator’s together and return result as a new SpinOperator.

  1. __mul__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Multiply the SpinOperator by the given double and return result as a new SpinOperator.

  1. __mul__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: complex) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Multiply the SpinOperator by the given complex value and return result as a new SpinOperator.

__rmul__(*args, **kwargs)

Overloaded function.

  1. __rmul__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: float) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Multiply the double by the given SpinOperator and return result as a new SpinOperator.

  1. __rmul__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, other: complex) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Multiply the complex value by the given SpinOperator and return result as a new SpinOperator.

__iter__()
__iter__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) Iterator[cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator]

Loop through each term of this SpinOperator.

distribute_terms()
distribute_terms(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, chunk_count: int) list[cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator]

Return a list of SpinOperator representing a distribution of the terms in this SpinOperator into chunk_count sized chunks.

dump()
dump(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) None

Print a string representation of this SpinOperator.

for_each_pauli()
for_each_pauli(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, function: Callable) None

For a single SpinOperator term, apply the given function to each pauli element in the term. The function must have void(pauli, int) signature where pauli is the Pauli matrix type and the int is the qubit index.

for_each_term()
for_each_term(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, function: Callable) None

Apply the given function to all terms in this SpinOperator. The input function must have void(SpinOperator) signature.

static from_word()
from_word(word: str) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Return a SpinOperator corresponding to the provided Pauli word.

# Example:
# The first and third qubits will receive a Pauli X,
# while the second qubit will receive a Pauli Y.
word = "XYX"
# Convert word to spin operator.
spin_operator = cudaq.SpinOperator.from_word(word)
print(spin_operator) # prints: `[1+0j] XYX`
get_coefficient()
get_coefficient(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) complex

Return the coefficient of this SpinOperator. Must be a SpinOperator with one term, otherwise an exception is thrown.

get_qubit_count()
get_qubit_count(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) int

Return the number of qubits this SpinOperator is on.

get_raw_data()
get_raw_data(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) tuple[list[list[bool]], list[complex]]

Return the raw data of this SpinOperator.

get_term_count()
get_term_count(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) int

Return the number of terms in this SpinOperator.

is_identity()
is_identity(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) bool

Returns a bool indicating if this SpinOperator is equal to the identity.

static random()
random(qubit_count: int, term_count: int, seed: int = 665825445) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator

Return a random SpinOperator on the given number of qubits (qubit_count) and composed of the given number of terms (term_count). An optional seed value may also be provided.

serialize()
serialize(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) list[float]

Return a serialized representation of the SpinOperator. Specifically, this encoding is via a vector of doubles. The encoding is as follows: for each term, a list of doubles where the ith element is a 3.0 for a Y, a 1.0 for a X, and a 2.0 for a Z on qubit i, followed by the real and imaginary part of the coefficient. Each term is appended to the array forming one large 1d array of doubles. The array is ended with the total number of terms represented as a double.

to_matrix()
to_matrix(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ComplexMatrix

Return self as a ComplexMatrix.

to_sparse_matrix()
to_sparse_matrix(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator) tuple[list[complex], list[int], list[int]]

Return self as a sparse matrix. This representation is a Tuple[list[complex], list[int], list[int]], encoding the non-zero values, rows, and columns of the matrix. This format is supported by scipy.sparse.csr_array.

to_string()
to_string(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SpinOperator, print_coefficient: bool = True) str

Return a string representation of this SpinOperator.

spin.i()
i(target: int) cudaq.SpinOperator

Return an identity SpinOperator on the given target qubit index.

spin.x()
x(target: int) cudaq.SpinOperator

Return an X SpinOperator on the given target qubit index.

spin.y()
y(target: int) cudaq.SpinOperator

Return a Y SpinOperator on the given target qubit index.

spin.z()
z(target: int) cudaq.SpinOperator

Return a Z SpinOperator on the given target qubit index.

class cudaq.SampleResult

A data-type containing the results of a call to sample(). This includes all measurement counts data from both mid-circuit and terminal measurements.

Note

At this time, mid-circuit measurements are not directly supported. Mid-circuit measurements may only be used if they are passed through to c_if.

register_names

A list of the names of each measurement register that are stored in self.

Type:

List[str]

__getitem__()
__getitem__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, bitstring: str) int

Return the measurement counts for the given bitstring.

Parameters:

bitstring (str) – The binary string to return the measurement data of.

Returns:

The number of times the given bitstring was measured during the shots_count number of executions on the QPU.

Return type:

float

__iter__()
__iter__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) Iterator[str]

Iterate through the SampleResult dictionary.

__len__()
__len__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) int

Return the number of elements in self. Equivalent to the number of uniquely measured bitstrings.

clear()
clear(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) None

Clear out all metadata from self.

count()
count(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, bitstring: str, register_name: str = '__global__') int

Return the number of times the given bitstring was observed.

Parameters:
  • bitstring (str) – The binary string to return the measurement counts for.

  • register_name (Optional[str]) – The optional measurement register name to extract the probability from. Defaults to the ‘__global__’ register.

Returns:

The number of times the given bitstring was measured during the experiment.

Return type:

int

dump()
dump(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) None

Print a string of the raw measurement counts data to the terminal.

expectation()
expectation(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, register_name: str = '__global__') float

Return the expectation value in the Z-basis of the Kernel that was sampled.

expectation_z()
expectation_z(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, register_name: str = '__global__') float

Return the expectation value in the Z-basis of the Kernel that was sampled.

get_marginal_counts()
get_marginal_counts(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, marginal_indices: list[int], \*, register_name: str = '__global__') cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult

Extract the measurement counts data for the provided subset of qubits (marginal_indices).

Parameters:
  • marginal_indices (list[int]) – A list of the qubit indices to extract the measurement data from.

  • register_name (Optional[str]) – The optional measurement register name to extract the counts data from. Defaults to the ‘__global__’ register.

Returns:

A new SampleResult dictionary containing the extracted measurement data.

Return type:

SampleResult

get_register_counts()
get_register_counts(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, register_name: str) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult

Extract the provided sub-register (register_name) as a new SampleResult.

get_sequential_data()
get_sequential_data(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, register_name: str = '__global__') list[str]

Return the data from the given register (register_name) as it was collected sequentially. A list of measurement results, not collated into a map.

items()
items(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) Iterator[tuple[str, int]]

Return the key/value pairs in this SampleResult dictionary.

most_probable()
most_probable(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, register_name: str = '__global__') str

Return the bitstring that was measured most frequently in the experiment.

Parameters:

register_name (Optional[str]) – The optional measurement register name to extract the most probable bitstring from. Defaults to the ‘__global__’ register.

Returns:

The most frequently measured binary string during the experiment.

Return type:

str

probability()
probability(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult, bitstring: str, register_name: str = '__global__') float

Return the probability of measuring the given bitstring.

Parameters:
  • bitstring (str) – The binary string to return the measurement probability of.

  • register_name (Optional[str]) – The optional measurement register name to extract the probability from. Defaults to the ‘__global__’ register.

Returns:

The probability of measuring the given bitstring. Equivalent to the proportion of the total times the bitstring was measured vs. the number of experiments (shots_count).

Return type:

float

values()
values(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult) Iterator[int]

Return all values (the counts) in this SampleResult dictionary.

class cudaq.AsyncSampleResult

A data-type containing the results of a call to sample_async(). The AsyncSampleResult models a future-like type, whose SampleResult may be returned via an invocation of the get method. This kicks off a wait on the current thread until the results are available. See future for more information on this programming pattern.

get()
get(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncSampleResult) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult

Return the SampleResult from the asynchronous sample execution.

class cudaq.ObserveResult

A data-type containing the results of a call to observe(). This includes any measurement counts data, as well as the global expectation value of the user-defined spin_operator.

counts(*args, **kwargs)

Overloaded function.

  1. counts(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult

Returns a SampleResult dictionary with the measurement results from the experiment. The result for each individual term of the spin_operator is stored in its own measurement register. Each register name corresponds to the string representation of the spin term (without any coefficients).

  1. counts(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult, sub_term: cudaq.SpinOperator) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.SampleResult

Given a sub_term of the global spin_operator that was passed to observe(), return its measurement counts.

Parameters:

sub_term (SpinOperator) – An individual sub-term of the spin_operator.

Returns:

The measurement counts data for the individual sub_term.

Return type:

SampleResult

dump()
dump(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult) None

Dump the raw data from the SampleResult that are stored in ObserveResult to the terminal.

expectation(*args, **kwargs)

Overloaded function.

  1. expectation(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult) float

Return the expectation value of the spin_operator that was provided in observe().

  1. expectation(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult, sub_term: cudaq.SpinOperator) float

Return the expectation value of an individual sub_term of the global spin_operator that was passed to observe().

Parameters:

sub_term (SpinOperator) – An individual sub-term of the spin_operator.

Returns:

The expectation value of the sub_term with respect to the Kernel that was passed to observe().

Return type:

float

expectation_z(*args, **kwargs)

Overloaded function.

  1. expectation_z(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult) float

Return the expectation value of the spin_operator that was provided in observe().

Note

expectation_z has been deprecated in favor of expectation.

  1. expectation_z(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult, sub_term: cudaq.SpinOperator) float

Return the expectation value of an individual sub_term of the global spin_operator that was passed to observe().

Note

expectation_z has been deprecated in favor of expectation.

Parameters:

sub_term (SpinOperator) – An individual sub-term of the spin_operator.

Returns:

The expectation value of the sub_term with respect to the Kernel that was passed to observe().

Return type:

float

get_spin()
get_spin(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult) cudaq.SpinOperator

Return the SpinOperator corresponding to this ObserveResult.

class cudaq.AsyncObserveResult

A data-type containing the results of a call to observe_async().

The AsyncObserveResult contains a future, whose ObserveResult may be returned via an invocation of the get method.

This kicks off a wait on the current thread until the results are available.

See future for more information on this programming pattern.

get()
get(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncObserveResult) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.ObserveResult

Returns the ObserveResult from the asynchronous observe execution.

class cudaq.AsyncStateResult

A data-type containing the results of a call to get_state_async(). The AsyncStateResult models a future-like type, whose State may be returned via an invocation of the get method. This kicks off a wait on the current thread until the results are available. See future for more information on this programming pattern.

get()
get(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AsyncStateResult) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.State

Return the State from the asynchronous get_state accessor execution.

class cudaq.OptimizationResult

Optimizers

class cudaq.optimizers.optimizer
class cudaq.optimizers.GradientDescent
property initial_parameters

Set the initial parameter values for the optimization.

property lower_bounds

Set the lower value bound for the optimization parameters.

property max_iterations

Set the maximum number of optimizer iterations.

optimize()
optimize(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.GradientDescent, dimensions: int, function: Callable) tuple[float, list[float]]

Run cudaq.optimize() on the provided objective function.

property upper_bounds

Set the upper value bound for the optimization parameters.

class cudaq.optimizers.COBYLA
property initial_parameters

Set the initial parameter values for the optimization.

property lower_bounds

Set the lower value bound for the optimization parameters.

property max_iterations

Set the maximum number of optimizer iterations.

optimize()
optimize(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.COBYLA, dimensions: int, function: Callable) tuple[float, list[float]]

Run cudaq.optimize() on the provided objective function.

property upper_bounds

Set the upper value bound for the optimization parameters.

class cudaq.optimizers.NelderMead
property initial_parameters

Set the initial parameter values for the optimization.

property lower_bounds

Set the lower value bound for the optimization parameters.

property max_iterations

Set the maximum number of optimizer iterations.

optimize()
optimize(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.NelderMead, dimensions: int, function: Callable) tuple[float, list[float]]

Run cudaq.optimize() on the provided objective function.

property upper_bounds

Set the upper value bound for the optimization parameters.

class cudaq.optimizers.LBFGS
property initial_parameters

Set the initial parameter values for the optimization.

property lower_bounds

Set the lower value bound for the optimization parameters.

property max_iterations

Set the maximum number of optimizer iterations.

optimize()
optimize(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.optimizers.LBFGS, dimensions: int, function: Callable) tuple[float, list[float]]

Run cudaq.optimize() on the provided objective function.

property upper_bounds

Set the upper value bound for the optimization parameters.

Gradients

class cudaq.gradients.gradient
class cudaq.gradients.CentralDifference
compute()
compute(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.gradients.gradient, parameter_vector: list[float], function: Callable, funcAtX: float) list[float]

Compute the gradient of the provided parameter_vector with respect to its loss function, using the CentralDifference method.

class cudaq.gradients.ForwardDifference
compute()
compute(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.gradients.gradient, parameter_vector: list[float], function: Callable, funcAtX: float) list[float]

Compute the gradient of the provided parameter_vector with respect to its loss function, using the ForwardDifference method.

class cudaq.gradients.ParameterShift
compute()
compute(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.gradients.gradient, parameter_vector: list[float], function: Callable, funcAtX: float) list[float]

Compute the gradient of the provided parameter_vector with respect to its loss function, using the ParameterShift method.

Noisy Simulation

class cudaq.NoiseModel

The NoiseModel defines a set of KrausChannel’s applied to specific qubits after the invocation of specified quantum operations.

__init__()
__init__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.NoiseModel) None

Construct an empty noise model.

add_channel()
add_channel(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.NoiseModel, operator: str, qubits: list[int], channel: cudaq.KrausChannel) None

Add the given KrausChannel to be applied after invocation of the specified quantum operation.

Parameters:
  • operator (str) – The quantum operator to apply the noise channel to.

  • qubits (List[int]) – The qubit/s to apply the noise channel to.

  • channel (cudaq.KrausChannel) – The KrausChannel to apply to the specified operator on the specified qubits.

get_channels()
get_channels(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.NoiseModel, operator: str, qubits: list[int]) list[cudaq.KrausChannel]

Return the KrausChannel’s that make up this noise model.

class cudaq.BitFlipChannel

Models the decoherence of the qubit state. Its constructor expects a float value, probability, representing the probability that the qubit flips from the 1-state to the 0-state, or vice versa. E.g, the probability of a random X-180 rotation being applied to the qubit. The probability of the qubit remaining in the same state is therefore 1 - probability.

__init__()
__init__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.BitFlipChannel, probability: float) None

Initialize the BitFlipChannel with the provided probability.

class cudaq.PhaseFlipChannel

Models the decoherence of the qubit phase. Its constructor expects a float value, probability, representing the probability of a random Z-180 rotation being applied to the qubit. The probability of the qubit phase remaining untouched is therefore 1 - probability.

__init__()
__init__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.PhaseFlipChannel, probability: float) None

Initialize the PhaseFlipChannel with the provided probability.

class cudaq.DepolarizationChannel

Models the decoherence of the qubit state and phase into a mixture of the computational basis states, |0> and |1>. Its constructor expects a float value, probability, representing the probability that this decay will occur. The qubit will remain untouched, therefore, with a probability of 1 - probability.

__init__()
__init__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.DepolarizationChannel, probability: float) None

Initialize the DepolarizationChannel with the provided probability.

class cudaq.AmplitudeDampingChannel

Models the dissipation of energy due to system interactions with the environment. Its constructor expects a float value, probability, representing the probablity that the qubit will decay to its ground state. The probability of the qubit remaining in the same state is therefore 1 - probability.

__init__()
__init__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.AmplitudeDampingChannel, probability: float) None

Initialize the AmplitudeDampingChannel with the provided probability.

class cudaq.KrausChannel

The KrausChannel is composed of a list of KrausOperator’s and is applied to a specific qubit or set of qubits.

__getitem__()
__getitem__(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.KrausChannel, index: int) cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.KrausOperator

Return the KrausOperator at the given index in this KrausChannel.

append()
append(self: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.KrausChannel, arg0: cudaq.mlir._mlir_libs._quakeDialects.cudaq_runtime.KrausOperator) None

Add a KrausOperator to this KrausChannel.

class cudaq.KrausOperator

The KrausOperator is represented by a matrix and serves as an element of a quantum channel such that Sum Ki Ki^dag = I.

property col_count

The number of columns in the matrix representation of this KrausOperator.

property row_count

The number of rows in the matrix representation of this KrausOperator.

MPI Submodule

cudaq.mpi.initialize()
cudaq.mpi.initialize() None

Initialize MPI if available.

cudaq.mpi.rank()
cudaq.mpi.rank() int

Return the rank of this process.

cudaq.mpi.num_ranks()
cudaq.mpi.num_ranks() int

Return the total number of ranks.

cudaq.mpi.all_gather(*args, **kwargs)

Overloaded function.

  1. cudaq.mpi.all_gather(arg0: int, arg1: list[float]) list[float]

Gather and scatter the local list of floating-point numbers, returning a concatenation of all lists across all ranks. The total global list size must be provided.

  1. cudaq.mpi.all_gather(arg0: int, arg1: list[int]) list[int]

Gather and scatter the local list of integers, returning a concatenation of all lists across all ranks. The total global list size must be provided.

cudaq.mpi.broadcast()
cudaq.mpi.broadcast(arg0: list[float], arg1: int, arg2: int) list[float]

Broadcast an array from a process (rootRank) to all other processes. The size of broadcast array must be provided.

cudaq.mpi.is_initialized()
cudaq.mpi.is_initialized() bool

Returns true if MPI has already been initialized.

cudaq.mpi.finalize()
cudaq.mpi.finalize() None

Finalize MPI.