Qx.Behaviours.QuantumState behaviour (Qx - Quantum Computing Simulator v0.8.0)

View Source

Behaviour for multi-qubit quantum state manipulation.

Enforces a consistent gate-application API across modules whose state is indexed by qubit number — currently Qx.Register (calc-mode multi-qubit) and, by convention, Qx.QuantumCircuit via Qx.Operations. Implementing modules must provide the standard gate set + state inspection.

Single-qubit modules

Qx.Qubit is intentionally not an implementor — its gate functions take a single-state argument (Qx.Qubit.h(qubit)) rather than the (state, qubit_index) shape this behaviour requires. Unifying both paradigms under one behaviour would force a structural redesign of Qx.Qubit and is deferred to a future major version.

Optional callbacks

Three-qubit gates (ccx, cswap) and a small handful of less-common two-qubit gates are marked as @optional_callbacks — implementations with fewer than 3 qubits (or that omit a gate) can leave them undefined without a compile warning.

Example

defmodule MyMultiQubitState do
  @behaviour Qx.Behaviours.QuantumState

  @impl true
  def h(state, qubit), do: # ... implementation

  @impl true
  def cx(state, control, target), do: # ... implementation

  # ... other required callbacks
end

Summary

Types

angle()

@type angle() :: number()

qubit_index()

@type qubit_index() :: non_neg_integer()

state()

@type state() :: any()

Callbacks

ccx(state, qubit_index, qubit_index, qubit_index)

(optional)
@callback ccx(state(), qubit_index(), qubit_index(), qubit_index()) :: state()

cp(state, qubit_index, qubit_index, angle)

(optional)
@callback cp(state(), qubit_index(), qubit_index(), angle()) :: state()

crx(state, qubit_index, qubit_index, angle)

(optional)
@callback crx(state(), qubit_index(), qubit_index(), angle()) :: state()

cry(state, qubit_index, qubit_index, angle)

(optional)
@callback cry(state(), qubit_index(), qubit_index(), angle()) :: state()

crz(state, qubit_index, qubit_index, angle)

(optional)
@callback crz(state(), qubit_index(), qubit_index(), angle()) :: state()

cswap(state, qubit_index, qubit_index, qubit_index)

(optional)
@callback cswap(state(), qubit_index(), qubit_index(), qubit_index()) :: state()

cx(state, qubit_index, qubit_index)

@callback cx(state(), qubit_index(), qubit_index()) :: state()

cy(state, qubit_index, qubit_index)

(optional)
@callback cy(state(), qubit_index(), qubit_index()) :: state()

cz(state, qubit_index, qubit_index)

@callback cz(state(), qubit_index(), qubit_index()) :: state()

h(state, qubit_index)

@callback h(state(), qubit_index()) :: state()

iswap(state, qubit_index, qubit_index)

(optional)
@callback iswap(state(), qubit_index(), qubit_index()) :: state()

phase(state, qubit_index, angle)

@callback phase(state(), qubit_index(), angle()) :: state()

rx(state, qubit_index, angle)

@callback rx(state(), qubit_index(), angle()) :: state()

ry(state, qubit_index, angle)

@callback ry(state(), qubit_index(), angle()) :: state()

rz(state, qubit_index, angle)

@callback rz(state(), qubit_index(), angle()) :: state()

s(state, qubit_index)

@callback s(state(), qubit_index()) :: state()

sdg(state, qubit_index)

@callback sdg(state(), qubit_index()) :: state()

state_vector(state)

@callback state_vector(state()) :: Nx.Tensor.t()

swap(state, qubit_index, qubit_index)

(optional)
@callback swap(state(), qubit_index(), qubit_index()) :: state()

t(state, qubit_index)

@callback t(state(), qubit_index()) :: state()

u(state, qubit_index, angle, angle, angle)

(optional)
@callback u(state(), qubit_index(), angle(), angle(), angle()) :: state()

valid?(state)

@callback valid?(state()) :: boolean()

x(state, qubit_index)

@callback x(state(), qubit_index()) :: state()

y(state, qubit_index)

@callback y(state(), qubit_index()) :: state()

z(state, qubit_index)

@callback z(state(), qubit_index()) :: state()