use crate::custom_ops::CustomOperation;
use crate::data_types::{scalar_type, UINT32};
use crate::errors::Result;
use crate::graphs::{Context, Graph};
use crate::ops::comparisons::GreaterThan;
pub fn create_millionaires_graph(context: Context) -> Result<Graph> {
let g = context.create_graph()?;
let first_millionaire = g.input(scalar_type(UINT32))?;
let second_millionaire = g.input(scalar_type(UINT32))?;
let op = CustomOperation::new(GreaterThan {
signed_comparison: false,
});
let output = g.custom_op(
op,
vec![first_millionaire.a2b()?, second_millionaire.a2b()?],
)?;
output.set_as_output()?;
g.finalize()?;
Ok(g)
}
#[cfg(test)]
mod tests {
use crate::custom_ops::run_instantiation_pass;
use crate::data_types::BIT;
use crate::data_values::Value;
use crate::evaluators::random_evaluate;
use crate::graphs::create_context;
use std::ops::Not;
use super::*;
fn test_millionaires_helper<
T1: TryInto<u128> + Not<Output = T1> + TryInto<u8> + Copy,
T2: TryInto<u128> + Not<Output = T2> + TryInto<u8> + Copy,
>(
input1_value: T1,
input2_value: T2,
) -> Value {
|| -> Result<Value> {
let c = create_context()?;
let g = create_millionaires_graph(c.clone())?;
g.set_as_main()?;
c.finalize()?;
let mapped_c = run_instantiation_pass(c)?.get_context();
let mapped_g = mapped_c.get_main_graph()?;
let val1 = Value::from_scalar(input1_value, UINT32)?;
let val2 = Value::from_scalar(input2_value, UINT32)?;
random_evaluate(mapped_g, vec![val1, val2])
}()
.unwrap()
}
#[test]
fn test_matmul() {
|| -> Result<()> {
assert!(test_millionaires_helper(2000, 1000) == Value::from_scalar(1, BIT)?);
assert!(test_millionaires_helper(1000, 2000) == Value::from_scalar(0, BIT)?);
assert!(test_millionaires_helper(1000, 1000) == Value::from_scalar(0, BIT)?);
Ok(())
}()
.unwrap();
}
}