fn gen_scheduling_logup_trace(
log_size: u32,
scheduling_col_1: &CircleEvaluation<SimdBackend, M31, BitReversedOrder>,
scheduling_col_2: &CircleEvaluation<SimdBackend, M31, BitReversedOrder>,
lookup_elements: &ComputationLookupElements,
) -> (
Vec<CircleEvaluation<SimdBackend, M31, BitReversedOrder>>,
SecureField,
) {
let mut logup_gen = LogupTraceGenerator::new(log_size);
let mut col_gen = logup_gen.new_col();
for row in 0..(1 << (log_size - LOG_N_LANES)) {
let scheduling_input: PackedSecureField =
lookup_elements.combine(&[scheduling_col_1.data[row]]);
let scheduling_output: PackedSecureField =
lookup_elements.combine(&[scheduling_col_2.data[row]]);
col_gen.write_frac(
row,
scheduling_output - scheduling_input,
scheduling_input * scheduling_output,
);
}
col_gen.finalize_col();
logup_gen.finalize_last()
}
fn gen_computing_logup_trace(
log_size: u32,
computing_col_1: &CircleEvaluation<SimdBackend, M31, BitReversedOrder>,
computing_col_3: &CircleEvaluation<SimdBackend, M31, BitReversedOrder>,
lookup_elements: &ComputationLookupElements,
) -> (
Vec<CircleEvaluation<SimdBackend, M31, BitReversedOrder>>,
SecureField,
) {
let mut logup_gen = LogupTraceGenerator::new(log_size);
let mut col_gen = logup_gen.new_col();
for row in 0..(1 << (log_size - LOG_N_LANES)) {
let computing_input: PackedSecureField =
lookup_elements.combine(&[computing_col_1.data[row]]);
let computing_output: PackedSecureField =
lookup_elements.combine(&[computing_col_3.data[row]]);
col_gen.write_frac(
row,
computing_input - computing_output,
computing_input * computing_output,
);
}
col_gen.finalize_col();
logup_gen.finalize_last()
}