sonobe/src/utils/vec.rs
src/utils/vec.rsRaw
1use ark_ff::PrimeField;
2use ark_std::cfg_iter;
3
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct SparseMatrix<F: PrimeField> {
6 pub n_rows: usize,
7 pub n_cols: usize,
8 pub coeffs: Vec<(usize, usize, F)>,
9}
10
11pub fn dense_matrix_to_sparse<F: PrimeField>(m: Vec<Vec<F>>) -> SparseMatrix<F> {
12 let mut r = SparseMatrix::<F> {
13 n_rows: m.len(),
14 n_cols: m[0].len(),
15 coeffs: Vec::new(),
16 };
17 for (i, m_i) in m.iter().enumerate() {
18 for (j, m_ij) in m_i.iter().enumerate() {
19 if !m_ij.is_zero() {
20 r.coeffs.push((i, j, *m_ij));
21 }
22 }
23 }
24 r
25}
26
27pub fn vec_add<F: PrimeField>(a: &[F], b: &[F]) -> Vec<F> {
28 assert_eq!(a.len(), b.len());
29 let mut r: Vec<F> = vec![F::zero(); a.len()];
30 for i in 0..a.len() {
31 r[i] = a[i] + b[i];
32 }
33 r
34}
35
36pub fn vec_sub<F: PrimeField>(a: &[F], b: &[F]) -> Vec<F> {
37 assert_eq!(a.len(), b.len());
38 let mut r: Vec<F> = vec![F::zero(); a.len()];
39 for i in 0..a.len() {
40 r[i] = a[i] - b[i];
41 }
42 r
43}
44
45pub fn vec_scalar_mul<F: PrimeField>(vec: &[F], c: &F) -> Vec<F> {
46 let mut result = vec![F::zero(); vec.len()];
47 for (i, a) in vec.iter().enumerate() {
48 result[i] = *a * c;
49 }
50 result
51}
52
53pub fn is_zero_vec<F: PrimeField>(vec: &[F]) -> bool {
54 for e in vec {
55 if !e.is_zero() {
56 return false;
57 }
58 }
59 true
60}
61
62pub fn mat_vec_mul<F: PrimeField>(M: &Vec<Vec<F>>, z: &[F]) -> Vec<F> {
63 assert!(!M.is_empty());
64 assert_eq!(M[0].len(), z.len());
65
66 let mut r: Vec<F> = vec![F::zero(); M.len()];
67 for (i, M_i) in M.iter().enumerate() {
68 for (j, M_ij) in M_i.iter().enumerate() {
69 r[i] += *M_ij * z[j];
70 }
71 }
72 r
73}
74
75pub fn mat_vec_mul_sparse<F: PrimeField>(matrix: &SparseMatrix<F>, vector: &[F]) -> Vec<F> {
76 let mut res = vec![F::zero(); matrix.n_cols];
77 for &(row, col, value) in matrix.coeffs.iter() {
78 res[row] += value * vector[col];
79 }
80 res
81}
82
83pub fn hadamard<F: PrimeField>(a: &[F], b: &[F]) -> Vec<F> {
84 assert_eq!(a.len(), b.len());
85 cfg_iter!(a).zip(b).map(|(a, b)| *a * b).collect()
86}