use super::AllocatedScalar;
use crate::Error as GadgetsError;
use dusk_plonk::prelude::*;
pub fn conditionally_select_zero(
composer: &mut StandardComposer,
x: Variable,
select: Variable,
) -> Variable {
composer.mul(BlsScalar::one(), x, select, BlsScalar::zero(), None)
}
pub fn conditionally_select_one(
composer: &mut StandardComposer,
y: Variable,
selector: Variable,
) -> Variable {
let one = composer.add_witness_to_circuit_description(BlsScalar::one());
let selector_y = composer.mul(BlsScalar::one(), y, selector, BlsScalar::zero(), None);
let one_min_selector = composer.add(
(BlsScalar::one(), one),
(-BlsScalar::one(), selector),
BlsScalar::zero(),
None,
);
composer.add(
(BlsScalar::one(), selector_y),
(BlsScalar::one(), one_min_selector),
BlsScalar::zero(),
None,
)
}
pub fn is_non_zero(
composer: &mut StandardComposer,
var: Variable,
value_assigned: BlsScalar,
) -> Result<(), GadgetsError> {
let var_assigned = composer.add_input(value_assigned);
composer.assert_equal(var, var_assigned);
let inverse = value_assigned.invert();
let inv: Variable;
if inverse.is_some().unwrap_u8() == 1u8 {
inv = composer.add_input(inverse.unwrap());
} else {
return Err(GadgetsError::NonExistingInverse);
}
let one = composer.add_witness_to_circuit_description(BlsScalar::one());
composer.poly_gate(
var,
inv,
one,
BlsScalar::one(),
BlsScalar::zero(),
BlsScalar::zero(),
-BlsScalar::one(),
BlsScalar::zero(),
None,
);
Ok(())
}
pub fn maybe_equal(
composer: &mut StandardComposer,
a: AllocatedScalar,
b: AllocatedScalar,
) -> Variable {
let u = {
let q_l_a = (BlsScalar::one(), a.var);
let q_r_b = (-BlsScalar::one(), b.var);
let q_c = BlsScalar::zero();
composer.add(q_l_a, q_r_b, q_c, None)
};
let u_scalar = a.scalar - b.scalar;
let u_inv_scalar = u_scalar.invert().unwrap_or(BlsScalar::zero());
let z = composer.add_input(u_inv_scalar);
let y = composer.mul(-BlsScalar::one(), z, u, BlsScalar::one(), None);
{
let a = y;
let b = u;
let c = u;
let q_m = BlsScalar::one();
let q_o = BlsScalar::zero();
let q_c = BlsScalar::zero();
composer.mul_gate(a, b, c, q_m, q_o, q_c, None);
}
y
}