use anyhow::Result;
use ark_ff::{vec::Vec, PrimeField};
use crate::{Matrix, MatrixOperations};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ArcMatrix<F: PrimeField>(pub Matrix<F>);
impl<F: PrimeField> MatrixOperations<F> for ArcMatrix<F> {
fn new(n_rows: usize, n_cols: usize, elements: Vec<F>) -> Self {
Self(Matrix::new(n_rows, n_cols, elements))
}
fn elements(&self) -> &Vec<F> {
self.0.elements()
}
fn get_element(&self, i: usize, j: usize) -> F {
self.0.get_element(i, j)
}
fn set_element(&mut self, i: usize, j: usize, val: F) {
self.0.set_element(i, j, val)
}
fn rows(&self) -> Vec<&[F]> {
self.0.rows()
}
fn n_rows(&self) -> usize {
self.0.n_rows()
}
fn n_cols(&self) -> usize {
self.0.n_cols()
}
fn transpose(&self) -> Self {
Self(self.0.transpose())
}
fn hadamard_product(&self, rhs: &Self) -> Result<Self>
where
Self: Sized,
{
Ok(Self(self.0.hadamard_product(&rhs.0)?))
}
}
impl<F: PrimeField> From<ArcMatrix<F>> for Vec<Vec<F>> {
fn from(arc: ArcMatrix<F>) -> Self {
let mut rows = Vec::<Vec<F>>::new();
let m = &arc.0;
for i in 0..arc.n_rows() {
let mut row = Vec::new();
for j in 0..arc.n_cols() {
row.push(m.get_element(i, j));
}
rows.push(row);
}
rows
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OptimizedArcMatrix<F: PrimeField>(pub ArcMatrix<F>);
impl<F: PrimeField> MatrixOperations<F> for OptimizedArcMatrix<F> {
fn new(n_rows: usize, n_cols: usize, elements: Vec<F>) -> Self {
Self(ArcMatrix::new(n_rows, n_cols, elements))
}
fn elements(&self) -> &Vec<F> {
self.0.elements()
}
fn get_element(&self, i: usize, j: usize) -> F {
self.0.get_element(i, j)
}
fn set_element(&mut self, i: usize, j: usize, val: F) {
self.0.set_element(i, j, val)
}
fn rows(&self) -> Vec<&[F]> {
self.0.rows()
}
fn n_rows(&self) -> usize {
self.0.n_rows()
}
fn n_cols(&self) -> usize {
self.0.n_cols()
}
fn transpose(&self) -> Self {
Self(self.0.transpose())
}
fn hadamard_product(&self, rhs: &Self) -> Result<Self>
where
Self: Sized,
{
Ok(Self(self.0.hadamard_product(&rhs.0)?))
}
}