use indexmap::IndexMap;
use pldag::{Pldag, Bound};
fn main() {
let mut pldag: Pldag = Pldag::new();
pldag.set_primitive("x".to_string(), (0, 1));
pldag.set_primitive("y".to_string(), (0, 1));
pldag.set_primitive("z".to_string(), (0, 1));
let root = pldag.set_or(vec![
"x".to_string(),
"y".to_string(),
"z".to_string(),
]);
let mut inputs: IndexMap<String, Bound> = IndexMap::new();
let validated = pldag.propagate(&inputs);
println!("Root valid? {}", *validated.get(&root).unwrap() == (1, 1));
inputs.insert("x".to_string(), (0,0));
let revalidated = pldag.propagate(&inputs);
println!("Root valid? {}", *revalidated.get(&root).unwrap() == (1, 1));
inputs.insert("y".to_string(), (1,1));
inputs.insert("z".to_string(), (1,1));
let revalidated = pldag.propagate(&inputs);
println!("Root valid? {}", *revalidated.get(&root).unwrap() == (1, 1));
pldag.set_coef("x".to_string(), 1.0);
pldag.set_coef("y".to_string(), 2.0);
pldag.set_coef("z".to_string(), 3.0);
pldag.set_coef(root.clone(), -1.0);
let scores = pldag.propagate_coefs(&inputs);
let root_result = scores.get(&root).unwrap();
println!("Root bounds: {:?}, Total score: {:?}", root_result.0, root_result.1);
inputs.insert("x".to_string(), (0,1));
let scores = pldag.propagate_coefs(&inputs);
let root_result = scores.get(&root).unwrap();
println!("Root bounds: {:?}, Score range: {:?}", root_result.0, root_result.1);
inputs.insert("x".to_string(), (0,0));
let scores = pldag.propagate_coefs(&inputs);
let root_result = scores.get(&root).unwrap();
println!("Root bounds: {:?}, Score: {:?}", root_result.0, root_result.1);
inputs.insert("y".to_string(), (0,0));
inputs.insert("z".to_string(), (0,0));
let scores = pldag.propagate_coefs(&inputs);
let root_result = scores.get(&root).unwrap();
println!("Root bounds: {:?}, Score: {:?}", root_result.0, root_result.1);
}