poseidon_parameters/
matrix_ops.rs1use core::slice::Chunks;
2
3use crate::error::PoseidonParameterError;
4use decaf377::Fq;
5
6pub trait MatrixOperations {
7 fn new(elements: &[Fq]) -> Self;
9 fn elements(&self) -> &[Fq];
11 fn get_element(&self, i: usize, j: usize) -> Fq;
13 fn set_element(&mut self, i: usize, j: usize, val: Fq);
15 fn iter_rows(&self) -> Chunks<Fq> {
17 self.elements().chunks(self.n_cols())
18 }
19 fn n_rows(&self) -> usize;
21 fn n_cols(&self) -> usize;
23 fn hadamard_product(&self, rhs: &Self) -> Result<Self, PoseidonParameterError>
25 where
26 Self: Sized;
27}
28
29pub fn dot_product(a: &[Fq], b: &[Fq]) -> Fq {
31 if a.len() != b.len() {
32 panic!("vecs not same len")
33 }
34
35 a.iter().zip(b.iter()).map(|(x, y)| *x * *y).sum()
36}
37
38pub trait SquareMatrixOperations {
40 fn inverse(&self) -> Result<Self, PoseidonParameterError>
42 where
43 Self: Sized;
44 fn identity() -> Self;
46 fn minors(&self) -> Self;
48 fn cofactors(&self) -> Self;
50 fn determinant(&self) -> Fq;
52}