use crate::circuit::{Instruction, ParameterValue, ValueInstruction, ValueOperation};
use ndarray::Array2;
use num_complex::Complex64;
pub(crate) fn one_qubit_run_matrix(operations: &[ValueOperation]) -> Option<Array2<Complex64>> {
let mut matrix = Array2::<Complex64>::eye(2);
let mut run_qubit = None;
for operation in operations {
let ValueInstruction::Instruction(Instruction::Standard(gate)) = &operation.instruction
else {
return None;
};
if gate.num_qubits() != 1 || operation.params.len() != gate.num_params() {
return None;
}
let [qubit] = operation.qubits.as_slice() else {
return None;
};
if run_qubit.is_some_and(|previous| previous != *qubit) {
return None;
}
run_qubit = Some(*qubit);
let params = operation
.params
.iter()
.map(|param| match param {
ParameterValue::Fixed(value) if value.is_finite() => Some(*value),
ParameterValue::Fixed(_) | ParameterValue::Param(_) => None,
})
.collect::<Option<Vec<_>>>()?;
matrix = gate.matrix(¶ms).ok()?.dot(&matrix);
}
Some(matrix)
}
#[cfg(test)]
#[path = "numeric_matrix_test.rs"]
mod numeric_matrix_test;