Qx.Validation (Qx - Quantum Computing Simulator v0.6.0)

View Source

Centralized 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

valid_qubit?(state, tolerance \\ 1.0e-6)

@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 state
  • tolerance - 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

valid_register?(map, tolerance \\ 1.0e-6)

@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

validate_classical_bit!(index, num_bits)

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)

validate_gate_name!(gate_name)

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

validate_normalized!(state, tolerance \\ 1.0e-6)

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)

validate_num_qubits!(num_qubits)

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)

validate_parameter!(param)

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"

validate_qubit_index!(index, num_qubits)

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)

validate_qubit_indices!(indices, num_qubits)

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)

validate_qubits_different!(qubits)

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]

validate_state_shape!(state, expected_size)

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}