use super::{ChipletsLookup, ChipletsLookupRow, Felt, FieldElement};
use crate::{
trace::{build_lookup_table_row_values, AuxColumnBuilder, LookupTableRow},
Matrix, Vec,
};
pub struct AuxTraceBuilder {
pub(super) lookup_hints: Vec<(u32, ChipletsLookup)>,
pub(super) request_rows: Vec<ChipletsLookupRow>,
pub(super) response_rows: Vec<ChipletsLookupRow>,
}
impl AuxTraceBuilder {
pub fn build_aux_columns<E: FieldElement<BaseField = Felt>>(
&self,
main_trace: &Matrix<Felt>,
rand_elements: &[E],
) -> Vec<Vec<E>> {
let b_chip = self.build_aux_column(main_trace, rand_elements);
vec![b_chip]
}
}
impl AuxColumnBuilder<ChipletsLookup, ChipletsLookupRow, u32> for AuxTraceBuilder {
fn get_table_rows(&self) -> &[ChipletsLookupRow] {
unimplemented!()
}
fn get_table_hints(&self) -> &[(u32, ChipletsLookup)] {
&self.lookup_hints
}
fn get_multiplicand<E: FieldElement<BaseField = Felt>>(
&self,
hint: ChipletsLookup,
row_values: &[E],
inv_row_values: &[E],
) -> E {
match hint {
ChipletsLookup::Request(request_row) => inv_row_values[request_row],
ChipletsLookup::Response(response_row) => row_values[response_row],
ChipletsLookup::RequestAndResponse((request_row, response_row)) => {
inv_row_values[request_row] * row_values[response_row]
}
}
}
fn build_row_values<E>(&self, main_trace: &Matrix<Felt>, alphas: &[E]) -> (Vec<E>, Vec<E>)
where
E: FieldElement<BaseField = Felt>,
{
let row_values = self
.response_rows
.iter()
.map(|response| response.to_value(main_trace, alphas))
.collect();
let (_, inv_row_values) =
build_lookup_table_row_values(&self.request_rows, main_trace, alphas);
(row_values, inv_row_values)
}
}