#![allow(
unused_variables,
unused_imports,
unused_mut,
dead_code,
clippy::needless_range_loop
)]
use dudect_bencher::{ctbench_main_with_seeds, BenchRng, Class, CtRunner};
use rand_core::RngCore;
use std::cell::RefCell;
use vaea_ntt::ntt32::Ntt32Context;
const Q_MLDSA: u32 = 8_380_417;
const N_MLDSA: usize = 256;
const BATCH: usize = 10_000;
fn bench_forward(runner: &mut CtRunner, rng: &mut BenchRng) {
let ctx = Ntt32Context::new(N_MLDSA, Q_MLDSA);
let mut inputs: Vec<Vec<u32>> = Vec::with_capacity(BATCH);
let mut classes: Vec<Class> = Vec::with_capacity(BATCH);
for _ in 0..BATCH {
let class = if rng.next_u32() & 1 == 0 {
Class::Left
} else {
Class::Right
};
let input = match class {
Class::Left => vec![0u32; N_MLDSA],
Class::Right => (0..N_MLDSA).map(|_| rng.next_u32() % Q_MLDSA).collect(),
};
inputs.push(input);
classes.push(class);
}
for (input, class) in inputs.into_iter().zip(classes.into_iter()) {
let input = RefCell::new(input);
runner.run_one(class, || {
ctx.forward(&mut input.borrow_mut());
});
}
}
fn bench_inverse(runner: &mut CtRunner, rng: &mut BenchRng) {
let ctx = Ntt32Context::new(N_MLDSA, Q_MLDSA);
let mut inputs: Vec<Vec<u32>> = Vec::with_capacity(BATCH);
let mut classes: Vec<Class> = Vec::with_capacity(BATCH);
for _ in 0..BATCH {
let class = if rng.next_u32() & 1 == 0 {
Class::Left
} else {
Class::Right
};
let input = match class {
Class::Left => vec![0u32; N_MLDSA],
Class::Right => (0..N_MLDSA).map(|_| rng.next_u32() % Q_MLDSA).collect(),
};
inputs.push(input);
classes.push(class);
}
for (input, class) in inputs.into_iter().zip(classes.into_iter()) {
let input = RefCell::new(input);
runner.run_one(class, || {
ctx.inverse(&mut input.borrow_mut());
});
}
}
fn bench_negacyclic_mul(runner: &mut CtRunner, rng: &mut BenchRng) {
let ctx = Ntt32Context::new(N_MLDSA, Q_MLDSA);
let mut inputs: Vec<(Vec<u32>, Vec<u32>)> = Vec::with_capacity(BATCH);
let mut classes: Vec<Class> = Vec::with_capacity(BATCH);
for _ in 0..BATCH {
let class = if rng.next_u32() & 1 == 0 {
Class::Left
} else {
Class::Right
};
let (a, b) = match class {
Class::Left => (vec![0u32; N_MLDSA], vec![0u32; N_MLDSA]),
Class::Right => (
(0..N_MLDSA).map(|_| rng.next_u32() % Q_MLDSA).collect(),
(0..N_MLDSA).map(|_| rng.next_u32() % Q_MLDSA).collect(),
),
};
inputs.push((a, b));
classes.push(class);
}
for ((a, b), class) in inputs.into_iter().zip(classes.into_iter()) {
let a = RefCell::new(a);
let b = RefCell::new(b);
let result = RefCell::new(vec![0u32; N_MLDSA]);
runner.run_one(class, || {
ctx.negacyclic_mul_into(
&mut a.borrow_mut(),
&mut b.borrow_mut(),
&mut result.borrow_mut(),
);
});
}
}
ctbench_main_with_seeds!(
(bench_forward, None),
(bench_inverse, None),
(bench_negacyclic_mul, None)
);