use crate::{
circuit::{Circuit, CircuitData},
parser::Parsed,
product_repeat::product_repeat,
};
use std::collections::HashMap;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TruthEntry {
pub data: CircuitData,
pub result: bool,
}
pub fn truth(p: Parsed) -> Vec<TruthEntry> {
let repeat = p.variables.len();
let bool_arr = vec![true, false];
let mut data = HashMap::new();
let variable_list = p.variables.into_iter().collect::<Vec<String>>();
let mut results = vec![];
for i in product_repeat(bool_arr.iter(), repeat) {
for (idx, var) in variable_list.iter().enumerate() {
data.insert(var.clone(), *i[idx]);
}
let circuit = Circuit {
data: data.clone(),
gate: p.root_gate.clone(),
};
results.push(TruthEntry {
data: data.clone(),
result: circuit.execute().unwrap(), });
}
results
}