Qx.Validation (Qx - Quantum Computing Simulator v0.6.0)
View SourceCentralized validation functions for quantum operations.
Provides consistent error handling and validation across all Qx modules.
Examples
# Validate single qubit state
iex> q = Qx.Qubit.new()
iex> Qx.Validation.valid_qubit?(q)
true
# Validate qubit index
iex> Qx.Validation.validate_qubit_index!(0, 3)
:ok
iex> Qx.Validation.validate_qubit_index!(5, 3)
** (Qx.QubitIndexError) Qubit index 5 out of range (0..2)
Summary
Functions
Validates a single qubit state.
Validates a quantum register state.
Validates a classical bit index.
Validates gate name is a known gate.
Validates normalization of a state vector.
Validates number of qubits is within supported range (1-20).
Validates that an angle/parameter is a number.
Validates a qubit index is within valid range for the system.
Validates multiple qubit indices are all within valid range.
Validates all qubit indices in a list are different.
Validates state vector shape matches expected size.
Functions
@spec valid_qubit?(Nx.Tensor.t(), float()) :: boolean()
Validates a single qubit state.
A valid qubit must:
- Have shape
{2} - Be normalized (|α|² + |β|² = 1)
Parameters
state- Nx tensor representing qubit statetolerance- Normalization tolerance (default: 1.0e-6)
Examples
iex> q = Qx.Qubit.new()
iex> Qx.Validation.valid_qubit?(q)
true
iex> invalid = Nx.tensor([Complex.new(1.0, 0.0), Complex.new(1.0, 0.0)], type: :c64)
iex> Qx.Validation.valid_qubit?(invalid)
false
iex> wrong_shape = Nx.tensor([Complex.new(1.0, 0.0)], type: :c64)
iex> Qx.Validation.valid_qubit?(wrong_shape)
false
@spec valid_register?(%{state: Nx.Tensor.t(), num_qubits: integer()}, float()) :: boolean()
Validates a quantum register state.
Requirements:
- Shape must be
{2^num_qubits} - Must be normalized
Examples
iex> reg = Qx.Register.new(2)
iex> Qx.Validation.valid_register?(reg)
true
Validates a classical bit index.
Examples
iex> Qx.Validation.validate_classical_bit!(0, 5)
:ok
iex> Qx.Validation.validate_classical_bit!(10, 5)
** (Qx.ClassicalBitError) Classical bit index 10 out of range (0..4)
Validates gate name is a known gate.
Examples
iex> Qx.Validation.validate_gate_name!(:h)
:ok
iex> Qx.Validation.validate_gate_name!(:not_a_gate)
** (Qx.GateError) Unsupported gate: :not_a_gate
Validates normalization of a state vector.
Raises Qx.StateNormalizationError if not normalized within tolerance.
Examples
iex> state = Qx.Qubit.new()
iex> Qx.Validation.validate_normalized!(state)
:ok
iex> invalid = Nx.tensor([Complex.new(1.0, 0.0), Complex.new(1.0, 0.0)], type: :c64)
iex> Qx.Validation.validate_normalized!(invalid)
** (Qx.StateNormalizationError) State not normalized: total probability = 2.0 (expected 1.0 ± 1.0e-6)
Validates number of qubits is within supported range (1-20).
Examples
iex> Qx.Validation.validate_num_qubits!(5)
:ok
iex> Qx.Validation.validate_num_qubits!(0)
** (Qx.QubitCountError) Invalid qubit count: 0 (must be between 1 and 20)
iex> Qx.Validation.validate_num_qubits!(25)
** (Qx.QubitCountError) Invalid qubit count: 25 (must be between 1 and 20)
Validates that an angle/parameter is a number.
Examples
iex> Qx.Validation.validate_parameter!(:math.pi())
:ok
iex> Qx.Validation.validate_parameter!("not a number")
** (ArgumentError) Parameter must be a number, got: "not a number"
Validates a qubit index is within valid range for the system.
Parameters
index- Qubit index to validate (0-based)num_qubits- Total number of qubits in the system
Examples
iex> Qx.Validation.validate_qubit_index!(0, 3)
:ok
iex> Qx.Validation.validate_qubit_index!(2, 3)
:ok
iex> Qx.Validation.validate_qubit_index!(5, 3)
** (Qx.QubitIndexError) Qubit index 5 out of range (0..2)
iex> Qx.Validation.validate_qubit_index!(-1, 3)
** (Qx.QubitIndexError) Qubit index -1 out of range (0..2)
Validates multiple qubit indices are all within valid range.
Examples
iex> Qx.Validation.validate_qubit_indices!([0, 1], 3)
:ok
iex> Qx.Validation.validate_qubit_indices!([0, 5], 3)
** (Qx.QubitIndexError) Qubit index 5 out of range (0..2)
Validates all qubit indices in a list are different.
Examples
iex> Qx.Validation.validate_qubits_different!([0, 1, 2])
:ok
iex> Qx.Validation.validate_qubits_different!([0, 1, 0])
** (ArgumentError) All qubit indices must be different: [0, 1, 0]
Validates state vector shape matches expected size.
Examples
iex> state = Qx.Qubit.new()
iex> Qx.Validation.validate_state_shape!(state, 2)
:ok
iex> state = Qx.Qubit.new()
iex> Qx.Validation.validate_state_shape!(state, 4)
** (ArgumentError) Invalid state shape: expected {4}, got {2}