use std::fmt::Debug;
pub use cpu::CpuBackend;
use crate::core::channel::MerkleChannel;
use crate::core::fields::m31::BaseField;
use crate::core::fields::qm31::SecureField;
use crate::core::proof_of_work::GrindOps;
use crate::prover::fri::FriOps;
use crate::prover::lookups::gkr_prover::GkrOps;
use crate::prover::poly::circle::PolyOps;
use crate::prover::vcs_lifted::ops::MerkleOpsLifted;
use crate::prover::{AccumulationOps, QuotientOps};
pub mod cpu;
pub mod simd;
#[cfg(feature = "gpu")]
pub mod gpu;
pub trait Backend:
Copy
+ Clone
+ Debug
+ ColumnOps<BaseField>
+ ColumnOps<SecureField>
+ PolyOps
+ QuotientOps
+ FriOps
+ AccumulationOps
+ GkrOps
{
}
pub trait BackendForChannel<MC: MerkleChannel>:
Backend + MerkleOpsLifted<MC::H> + GrindOps<MC::C>
{
}
pub trait ColumnOps<T> {
type Column: Column<T>;
fn bit_reverse_column(column: &mut Self::Column);
}
pub type Col<B, T> = <B as ColumnOps<T>>::Column;
pub trait Column<T>: Clone + Debug + FromIterator<T> + Send + Sync {
fn zeros(len: usize) -> Self;
unsafe fn uninitialized(len: usize) -> Self;
fn to_cpu(&self) -> Vec<T>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn at(&self, index: usize) -> T;
fn set(&mut self, index: usize, value: T);
fn split_at_mid(self) -> (Self, Self);
}