use super::ValuedMatrix2D;
use crate::traits::{DenseMatrix2D, DenseValuedMatrix, TotalOrd, ValuedMatrix};
pub trait DenseValuedMatrix2D: DenseMatrix2D + ValuedMatrix2D + DenseValuedMatrix {
type RowValues<'a>: Iterator<Item = <Self as ValuedMatrix>::Value>
+ DoubleEndedIterator<Item = <Self as ValuedMatrix>::Value>
+ Clone
where
Self: 'a;
#[inline]
fn row_max_value(&self, row: Self::RowIndex) -> Option<<Self as ValuedMatrix>::Value>
where
Self::Value: TotalOrd,
{
self.row_values(row).max_by(TotalOrd::total_cmp)
}
#[inline]
fn row_max_value_and_column(
&self,
row: Self::RowIndex,
) -> Option<(Self::ColumnIndex, Self::Value)>
where
Self::Value: TotalOrd,
{
self.column_indices()
.zip(self.row_values(row))
.max_by(|(_, value1), (_, value2)| value1.total_cmp(value2))
}
#[inline]
fn row_min_value(&self, row: Self::RowIndex) -> Option<<Self as ValuedMatrix>::Value>
where
Self::Value: TotalOrd,
{
self.row_values(row).min_by(TotalOrd::total_cmp)
}
#[inline]
fn row_min_value_and_column(
&self,
row: Self::RowIndex,
) -> Option<(Self::ColumnIndex, Self::Value)>
where
Self::Value: TotalOrd,
{
self.column_indices()
.zip(self.row_values(row))
.min_by(|(_, value1), (_, value2)| value1.total_cmp(value2))
}
fn row_values(&self, row: Self::RowIndex) -> Self::RowValues<'_>;
}
impl<M: DenseValuedMatrix2D> DenseValuedMatrix2D for &M {
type RowValues<'a>
= M::RowValues<'a>
where
Self: 'a;
#[inline]
fn row_values(&self, row: Self::RowIndex) -> Self::RowValues<'_> {
(*self).row_values(row)
}
}