#[cfg(feature = "mpi")]
use std::rc::Rc;
#[cfg(feature = "mpi")]
use mpi::traits::Communicator;
#[cfg(feature = "mpi")]
use crate::distributed_tools::IndexLayout;
use crate::sparse::SparseMatType;
use super::{BaseItem, Shape};
pub trait Nonzeros {
fn nnz(&self) -> usize;
}
pub trait SparseMatrixType {
fn mat_type(&self) -> SparseMatType;
}
pub trait FromAij
where
Self: BaseItem + Sized,
{
fn from_aij(
shape: [usize; 2],
rows: &[usize],
cols: &[usize],
data: &[<Self as BaseItem>::Item],
) -> Self;
fn from_aij_iter<I>(shape: [usize; 2], iter: I) -> Self
where
I: Iterator<Item = ([usize; 2], <Self as BaseItem>::Item)>,
{
let (rows, cols, data): (Vec<_>, Vec<_>, Vec<_>) = {
let mut rows = Vec::new();
let mut cols = Vec::new();
let mut data = Vec::new();
for (index, value) in iter {
rows.push(index[0]);
cols.push(index[1]);
data.push(value);
}
(rows, cols, data)
};
Self::from_aij(shape, &rows, &cols, &data)
}
}
#[cfg(feature = "mpi")]
pub trait FromAijDistributed<'a>
where
Self: BaseItem + Sized,
{
type C: Communicator;
fn from_aij(
domain_layout: Rc<IndexLayout<'a, Self::C>>,
range_layout: Rc<IndexLayout<'a, Self::C>>,
rows: &[usize],
cols: &[usize],
data: &[<Self as BaseItem>::Item],
) -> Self;
fn from_aij_iter<I>(
domain_layout: Rc<IndexLayout<'a, Self::C>>,
range_layout: Rc<IndexLayout<'a, Self::C>>,
iter: I,
) -> Self
where
I: Iterator<Item = ([usize; 2], <Self as BaseItem>::Item)>,
{
let (rows, cols, data): (Vec<_>, Vec<_>, Vec<_>) = {
let mut rows = Vec::new();
let mut cols = Vec::new();
let mut data = Vec::new();
for (index, value) in iter {
rows.push(index[0]);
cols.push(index[1]);
data.push(value);
}
(rows, cols, data)
};
Self::from_aij(domain_layout, range_layout, &rows, &cols, &data)
}
}
pub trait AijIterMat: BaseItem + Shape<2> {
fn iter_aij(&self) -> impl Iterator<Item = ([usize; 2], Self::Item)> + '_;
}