use crate::measurements::Measure;
use crate::Circuit;
use crate::RoqoqoError;
use std::collections::HashMap;
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub struct ClassicalRegister {
pub constant_circuit: Option<Circuit>,
pub circuits: Vec<Circuit>,
}
impl Measure for ClassicalRegister {
fn constant_circuit(&self) -> &Option<Circuit> {
&self.constant_circuit
}
fn circuits<'a>(&'a self) -> Box<dyn Iterator<Item = &'a Circuit> + 'a> {
Box::new(self.circuits.iter())
}
fn substitute_parameters(
&self,
substituted_parameters: HashMap<String, f64>,
) -> Result<Self, RoqoqoError> {
let mut calculator = qoqo_calculator::Calculator::new();
for (name, val) in substituted_parameters.iter() {
calculator.set_variable(name, *val)
}
let new_constant_circuit = match &self.constant_circuit {
None => None,
Some(c) => Some(c.substitute_parameters(&calculator)?),
};
let mut new_circuits = Vec::new();
for circ in self.circuits.iter() {
let mut calculator = qoqo_calculator::Calculator::new();
for (name, val) in substituted_parameters.iter() {
calculator.set_variable(name, *val)
}
new_circuits.push(circ.substitute_parameters(&calculator)?)
}
Ok(Self {
constant_circuit: new_constant_circuit,
circuits: new_circuits,
})
}
}
impl crate::operations::SupportedVersion for ClassicalRegister {
fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
let mut current_minimum_version = (1, 0, 0);
if let Some(circuit) = self.constant_circuit() {
let comparison_version = circuit.minimum_supported_roqoqo_version();
crate::update_roqoqo_version(&mut current_minimum_version, comparison_version);
}
for circuit in self.circuits.iter() {
let comparison_version = circuit.minimum_supported_roqoqo_version();
crate::update_roqoqo_version(&mut current_minimum_version, comparison_version);
}
current_minimum_version
}
}