use alloc::vec::Vec;
use air::{proof::Queries, TraceInfo};
use crypto::{ElementHasher, Hasher, VectorCommitment};
use super::{ColMatrix, EvaluationFrame, FieldElement, TracePolyTable};
use crate::StarkDomain;
mod default;
pub use default::DefaultTraceLde;
pub trait TraceLde<E: FieldElement>: Sync {
type HashFn: ElementHasher<BaseField = E::BaseField>;
type VC: VectorCommitment<Self::HashFn>;
fn get_main_trace_commitment(&self) -> <Self::HashFn as Hasher>::Digest;
fn set_aux_trace(
&mut self,
aux_trace: &ColMatrix<E>,
domain: &StarkDomain<E::BaseField>,
) -> (ColMatrix<E>, <Self::HashFn as Hasher>::Digest);
fn read_main_trace_frame_into(
&self,
lde_step: usize,
frame: &mut EvaluationFrame<E::BaseField>,
);
fn read_aux_trace_frame_into(&self, lde_step: usize, frame: &mut EvaluationFrame<E>);
fn query(&self, positions: &[usize]) -> Vec<Queries>;
fn trace_len(&self) -> usize;
fn blowup(&self) -> usize;
fn trace_info(&self) -> &TraceInfo;
}