use core::slice::Chunks;
use crate::error::PoseidonParameterError;
use decaf377::Fq;
pub trait MatrixOperations {
fn new(elements: &[Fq]) -> Self;
fn elements(&self) -> &[Fq];
fn get_element(&self, i: usize, j: usize) -> Fq;
fn set_element(&mut self, i: usize, j: usize, val: Fq);
fn iter_rows(&self) -> Chunks<Fq> {
self.elements().chunks(self.n_cols())
}
fn n_rows(&self) -> usize;
fn n_cols(&self) -> usize;
fn hadamard_product(&self, rhs: &Self) -> Result<Self, PoseidonParameterError>
where
Self: Sized;
}
pub fn dot_product(a: &[Fq], b: &[Fq]) -> Fq {
if a.len() != b.len() {
panic!("vecs not same len")
}
a.iter().zip(b.iter()).map(|(x, y)| *x * *y).sum()
}
pub trait SquareMatrixOperations {
fn inverse(&self) -> Result<Self, PoseidonParameterError>
where
Self: Sized;
fn identity() -> Self;
fn minors(&self) -> Self;
fn cofactors(&self) -> Self;
fn determinant(&self) -> Fq;
}