in prover/src/constraints/periodic_table.rs [108:155]
fn periodic_value_table() {
let trace_length = 32;
// instantiate AIR with 2 periodic columns
let col1 = vec![1u128, 2]
.into_iter()
.map(BaseElement::new)
.collect::<Vec<_>>();
let col2 = vec![3u128, 4, 5, 6]
.into_iter()
.map(BaseElement::new)
.collect::<Vec<_>>();
let air = MockAir::with_periodic_columns(vec![col1, col2], trace_length);
// build a table of periodic values
let table = super::PeriodicValueTable::new(&air);
assert_eq!(2, table.width);
assert_eq!(4 * air.ce_blowup_factor(), table.length);
let polys = air.get_periodic_column_polys();
let domain = build_ce_domain(air.ce_domain_size(), air.domain_offset());
// build expected values by evaluating polynomials over shifted ce_domain
let expected = polys
.iter()
.map(|poly| {
let num_cycles = trace_length / poly.len();
domain
.iter()
.map(|&x| {
let x = x.exp((num_cycles as u32).into());
polynom::eval(poly, x)
})
.collect::<Vec<_>>()
})
.collect::<Vec<_>>();
// build actual values by recording rows of the table at each step of ce_domain
let mut actual = vec![Vec::new(), Vec::new()];
for i in 0..air.ce_domain_size() {
let row = table.get_row(i);
actual[0].push(row[0]);
actual[1].push(row[1]);
}
assert_eq!(expected, actual);
}