use crate::error::Error;
use crate::plonkup::LookupTable;
use crate::plonkup::MultiSet;
use dusk_bls12_381::BlsScalar;
#[derive(Clone, Eq, PartialEq, Debug)]
pub struct WitnessTable {
pub f_1: MultiSet,
pub f_2: MultiSet,
pub f_3: MultiSet,
pub f_4: MultiSet,
}
impl Default for WitnessTable {
fn default() -> Self {
WitnessTable::new()
}
}
impl WitnessTable {
pub fn new() -> Self {
WitnessTable {
f_1: MultiSet::new(),
f_2: MultiSet::new(),
f_3: MultiSet::new(),
f_4: MultiSet::new(),
}
}
pub fn from_wire_values(
&mut self,
left_wire_val: BlsScalar,
right_wire_val: BlsScalar,
output_wire_val: BlsScalar,
fourth_wire_val: BlsScalar,
) {
self.f_1.push(left_wire_val);
self.f_2.push(right_wire_val);
self.f_3.push(output_wire_val);
self.f_4.push(fourth_wire_val);
}
pub fn value_from_table(
&mut self,
lookup_table: &LookupTable,
left_wire_val: BlsScalar,
right_wire_val: BlsScalar,
fourth_wire_val: BlsScalar,
) -> Result<(), Error> {
let output_wire_val = lookup_table.lookup(
left_wire_val,
right_wire_val,
fourth_wire_val,
)?;
self.f_1.push(left_wire_val);
self.f_2.push(right_wire_val);
self.f_3.push(output_wire_val);
self.f_4.push(fourth_wire_val);
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::plonkup::LookupTable;
#[test]
fn test_lookup() {
let mut lookup_table = LookupTable::new();
lookup_table.insert_multi_xor(0, 4);
lookup_table.insert_multi_add(2, 3);
let mut f = WitnessTable::new();
assert!(f
.value_from_table(
&lookup_table,
BlsScalar::from(2),
BlsScalar::from(3),
-BlsScalar::one()
)
.is_ok());
assert!(f
.value_from_table(
&lookup_table,
BlsScalar::from(4),
BlsScalar::from(6),
BlsScalar::zero()
)
.is_ok());
assert!(f
.value_from_table(
&lookup_table,
BlsScalar::from(22),
BlsScalar::from(1),
-BlsScalar::one()
)
.is_err());
assert!(f
.value_from_table(
&lookup_table,
BlsScalar::from(0),
BlsScalar::from(1),
BlsScalar::zero()
)
.is_err());
}
}