use crate::base::{polynomial::MultilinearExtension, scalar::Scalar};
#[tracing::instrument(name = "FoldUtil::fold_columns", level = "debug", skip_all)]
pub fn fold_columns<S: Scalar>(
res: &mut [S],
mul: S,
beta: S,
columns: &[impl MultilinearExtension<S>],
) {
for (m, col) in powers(mul, beta).zip(columns.iter().rev()) {
col.mul_add(res, &m);
}
}
pub fn fold_vals<S: Scalar>(beta: S, vals: &[S]) -> S {
vals.iter().fold(S::zero(), |acc, &v| acc * beta + v)
}
fn powers<S: Scalar>(init: S, base: S) -> impl Iterator<Item = S> {
core::iter::successors(Some(init), move |&m| Some(m * base))
}