use derive_new::new;
use itertools::PutBack;
use itertools::put_back;
use crate::{algebra::matrices::query::{MatrixAlgebra, MatrixOracle,}, utilities::sets::MapHasKeyOrSequenceHasElement, };
#[derive(new,Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd)]
pub struct PutbackIteratorMatrix<
Matrix,
>
{
matrix: Matrix,
}
impl < Matrix >
MatrixOracle for
PutbackIteratorMatrix
< Matrix >
where
Matrix: MatrixOracle,
{
type Coefficient = Matrix::Coefficient; type RowIndex = Matrix::RowIndex; type ColumnIndex = Matrix::ColumnIndex; type RowEntry = Matrix::RowEntry; type ColumnEntry = Matrix::ColumnEntry; type Row = PutBack< Matrix::Row >; type RowReverse = PutBack< Matrix::RowReverse >; type Column = PutBack< Matrix::Column >; type ColumnReverse = PutBack< Matrix::ColumnReverse >;
fn row( & self, index: &Self::RowIndex ) -> Self::Row
{ put_back( self.matrix.row(index) ) }
fn row_reverse( & self, index: &Self::RowIndex ) -> Self::RowReverse
{ put_back( self.matrix.row_reverse(index) ) }
fn column( & self, index: & Self::ColumnIndex) -> Self::Column
{ put_back( self.matrix.column(index) ) }
fn column_reverse( & self, index: & Self::ColumnIndex) -> Self::ColumnReverse
{ put_back( self.matrix.column_reverse(index) ) }
fn has_row_for_index( & self, index: &Self::RowIndex ) -> bool
{ self.matrix.has_row_for_index(index) }
fn has_column_for_index( & self, index: & Self::ColumnIndex) -> bool
{
self.matrix.has_column_for_index(index)
}
fn structural_nonzero_entry( & self, row: & Self::RowIndex, column: & Self::ColumnIndex ) -> Option< Self::Coefficient >
{ self.matrix.structural_nonzero_entry( row, column ) }
}
impl < Matrix >
MatrixAlgebra for
PutbackIteratorMatrix
< Matrix >
where
Matrix: MatrixAlgebra,
{
type RingOperator = Matrix::RingOperator;
type OrderOperatorForRowEntries = Matrix::OrderOperatorForRowEntries;
type OrderOperatorForRowIndices = Matrix::OrderOperatorForRowIndices;
type OrderOperatorForColumnEntries = Matrix::OrderOperatorForColumnEntries;
type OrderOperatorForColumnIndices = Matrix::OrderOperatorForColumnIndices;
fn ring_operator( &self ) -> Self::RingOperator { self.matrix.ring_operator() }
fn order_operator_for_row_entries( &self ) -> Self::OrderOperatorForRowEntries { self.matrix.order_operator_for_row_entries() }
fn order_operator_for_row_indices( &self ) -> Self::OrderOperatorForRowIndices { self.matrix.order_operator_for_row_indices() }
fn order_operator_for_column_entries( &self ) -> Self::OrderOperatorForColumnEntries { self.matrix.order_operator_for_column_entries() }
fn order_operator_for_column_indices( &self ) -> Self::OrderOperatorForColumnIndices { self.matrix.order_operator_for_column_indices() }
}
use crate::algebra::vectors::operations::OnlyIndicesOutsideCollection;
#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd)]
pub struct OnlyColumnIndicesOutsideCollection<
Matrix, ColumnIndicesToExclude,
>
where
Matrix: MatrixOracle,
ColumnIndicesToExclude: MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
matrix: Matrix,
column_indices_to_exclude: ColumnIndicesToExclude,
}
impl < Matrix, ColumnIndicesToExclude, >
OnlyColumnIndicesOutsideCollection
< Matrix, ColumnIndicesToExclude >
where
Matrix: MatrixOracle,
ColumnIndicesToExclude: MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
pub fn new( matrix: Matrix, column_indices_to_exclude: ColumnIndicesToExclude )
->
OnlyColumnIndicesOutsideCollection
< Matrix, ColumnIndicesToExclude >
where
Matrix: MatrixOracle,
ColumnIndicesToExclude: MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{ OnlyColumnIndicesOutsideCollection{ matrix, column_indices_to_exclude: column_indices_to_exclude, } }
}
impl < Matrix, ColumnIndicesToExclude >
MatrixOracle for
OnlyColumnIndicesOutsideCollection
< Matrix, ColumnIndicesToExclude >
where
Matrix: MatrixOracle,
ColumnIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
type Coefficient = Matrix::Coefficient; type RowIndex = Matrix::RowIndex; type ColumnIndex = Matrix::ColumnIndex; type RowEntry = Matrix::RowEntry; type ColumnEntry = Matrix::ColumnEntry; type Row = OnlyIndicesOutsideCollection< Matrix::Row, ColumnIndicesToExclude >; type RowReverse = OnlyIndicesOutsideCollection< Matrix::RowReverse, ColumnIndicesToExclude >; type Column = Matrix::Column; type ColumnReverse = Matrix::ColumnReverse;
fn row( & self, index: &Self::RowIndex ) -> Self::Row
{ OnlyIndicesOutsideCollection::new( self.matrix.row(index), self.column_indices_to_exclude ) }
fn row_reverse( & self, index: &Self::RowIndex ) -> Self::RowReverse
{ OnlyIndicesOutsideCollection::new( self.matrix.row_reverse(index), self.column_indices_to_exclude ) }
fn column( & self, index: & Self::ColumnIndex) -> Self::Column
{ self.matrix.column(index) }
fn column_reverse( & self, index: & Self::ColumnIndex) -> Self::ColumnReverse
{ self.matrix.column_reverse(index) }
fn has_row_for_index( & self, index: &Self::RowIndex ) -> bool
{ self.matrix.has_row_for_index(index) }
fn has_column_for_index( & self, index: & Self::ColumnIndex) -> bool
{
let matrix_has_column = self.matrix.has_column_for_index(index);
let column_is_excluded = self.column_indices_to_exclude.map_has_key_or_sequence_has_element(index);
return matrix_has_column && (! column_is_excluded)
}
fn structural_nonzero_entry( & self, row: & Self::RowIndex, column: & Self::ColumnIndex ) -> Option< Self::Coefficient >
{ self.matrix.structural_nonzero_entry( row, column ) }
}
impl < Matrix, ColumnIndicesToExclude >
MatrixAlgebra for
OnlyColumnIndicesOutsideCollection
< Matrix, ColumnIndicesToExclude >
where
Matrix: MatrixAlgebra,
ColumnIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
type RingOperator = Matrix::RingOperator;
type OrderOperatorForRowEntries = Matrix::OrderOperatorForRowEntries;
type OrderOperatorForRowIndices = Matrix::OrderOperatorForRowIndices;
type OrderOperatorForColumnEntries = Matrix::OrderOperatorForColumnEntries;
type OrderOperatorForColumnIndices = Matrix::OrderOperatorForColumnIndices;
fn ring_operator( &self ) -> Self::RingOperator { self.matrix.ring_operator() }
fn order_operator_for_row_entries( &self ) -> Self::OrderOperatorForRowEntries { self.matrix.order_operator_for_row_entries() }
fn order_operator_for_row_indices( &self ) -> Self::OrderOperatorForRowIndices { self.matrix.order_operator_for_row_indices() }
fn order_operator_for_column_entries( &self ) -> Self::OrderOperatorForColumnEntries { self.matrix.order_operator_for_column_entries() }
fn order_operator_for_column_indices( &self ) -> Self::OrderOperatorForColumnIndices { self.matrix.order_operator_for_column_indices() }
}
#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd)]
pub struct OnlyRowIndicesOutsideCollection<
Matrix, RowIndicesToExclude,
>
where
Matrix: MatrixOracle,
RowIndicesToExclude: MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
matrix: Matrix,
row_indices_to_exclude: RowIndicesToExclude,
}
impl < Matrix, RowIndicesToExclude, >
OnlyRowIndicesOutsideCollection
< Matrix, RowIndicesToExclude >
where
Matrix: MatrixOracle,
RowIndicesToExclude: MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
pub fn new( matrix: Matrix, row_indices_to_exclude: RowIndicesToExclude )
->
OnlyRowIndicesOutsideCollection
< Matrix, RowIndicesToExclude >
{ OnlyRowIndicesOutsideCollection{ matrix, row_indices_to_exclude: row_indices_to_exclude, } }
}
impl < Matrix, RowIndicesToExclude >
MatrixOracle for
OnlyRowIndicesOutsideCollection
< Matrix, RowIndicesToExclude >
where
Matrix: MatrixOracle,
RowIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
type Coefficient = Matrix::Coefficient; type RowIndex = Matrix::RowIndex; type ColumnIndex = Matrix::ColumnIndex; type RowEntry = Matrix::RowEntry; type ColumnEntry = Matrix::ColumnEntry; type Row = Matrix::Row; type RowReverse = Matrix::RowReverse; type Column = OnlyIndicesOutsideCollection< Matrix::Column, RowIndicesToExclude >; type ColumnReverse = OnlyIndicesOutsideCollection< Matrix::ColumnReverse, RowIndicesToExclude >;
fn row( & self, index: &Self::RowIndex ) -> Self::Row
{ self.matrix.row(index) }
fn row_reverse( & self, index: &Self::RowIndex ) -> Self::RowReverse
{ self.matrix.row_reverse(index) }
fn column( & self, index: & Self::ColumnIndex) -> Self::Column
{ OnlyIndicesOutsideCollection::new( self.matrix.column(index), self.row_indices_to_exclude ) }
fn column_reverse( & self, index: & Self::ColumnIndex) -> Self::ColumnReverse
{ OnlyIndicesOutsideCollection::new( self.matrix.column_reverse(index), self.row_indices_to_exclude ) }
fn has_row_for_index( & self, index: &Self::RowIndex ) -> bool
{
let matrix_has_row = self.matrix.has_row_for_index(index);
let row_is_excluded = self.row_indices_to_exclude.map_has_key_or_sequence_has_element(index);
return matrix_has_row && (! row_is_excluded)
}
fn has_column_for_index( & self, index: & Self::ColumnIndex) -> bool
{ self.matrix.has_column_for_index(index) }
fn structural_nonzero_entry( & self, row: & Self::RowIndex, column: & Self::ColumnIndex ) -> Option< Self::Coefficient >
{ self.matrix.structural_nonzero_entry( row, column ) }
}
impl < Matrix, RowIndicesToExclude >
MatrixAlgebra for
OnlyRowIndicesOutsideCollection
< Matrix, RowIndicesToExclude >
where
Matrix: MatrixAlgebra,
RowIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
type RingOperator = Matrix::RingOperator;
type OrderOperatorForRowEntries = Matrix::OrderOperatorForRowEntries;
type OrderOperatorForRowIndices = Matrix::OrderOperatorForRowIndices;
type OrderOperatorForColumnEntries = Matrix::OrderOperatorForColumnEntries;
type OrderOperatorForColumnIndices = Matrix::OrderOperatorForColumnIndices;
fn ring_operator( &self ) -> Self::RingOperator { self.matrix.ring_operator() }
fn order_operator_for_row_entries( &self ) -> Self::OrderOperatorForRowEntries { self.matrix.order_operator_for_row_entries() }
fn order_operator_for_row_indices( &self ) -> Self::OrderOperatorForRowIndices { self.matrix.order_operator_for_row_indices() }
fn order_operator_for_column_entries( &self ) -> Self::OrderOperatorForColumnEntries { self.matrix.order_operator_for_column_entries() }
fn order_operator_for_column_indices( &self ) -> Self::OrderOperatorForColumnIndices { self.matrix.order_operator_for_column_indices() }
}
use crate::algebra::vectors::operations::OnlyIndicesInsideCollection;
#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd)]
pub struct OnlyColumnIndicesInsideCollection
< Matrix, ColumnIndicesToInclude, >
{
matrix: Matrix,
column_indices_to_include: ColumnIndicesToInclude,
}
impl < Matrix, ColumnIndicesToInclude >
OnlyColumnIndicesInsideCollection
< Matrix, ColumnIndicesToInclude >
{
pub fn new( matrix: Matrix, column_indices_to_include: ColumnIndicesToInclude )
->
OnlyColumnIndicesInsideCollection
< Matrix, ColumnIndicesToInclude, >
where
Matrix: MatrixOracle,
ColumnIndicesToInclude: MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{ OnlyColumnIndicesInsideCollection{ matrix, column_indices_to_include } }
}
impl < Matrix, ColumnIndicesToInclude >
MatrixOracle for
OnlyColumnIndicesInsideCollection
< Matrix, ColumnIndicesToInclude >
where
Matrix: MatrixOracle,
ColumnIndicesToInclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
type Coefficient = Matrix::Coefficient; type RowIndex = Matrix::RowIndex; type ColumnIndex = Matrix::ColumnIndex; type RowEntry = Matrix::RowEntry; type ColumnEntry = Matrix::ColumnEntry; type Row = OnlyIndicesInsideCollection< Matrix::Row, ColumnIndicesToInclude >; type RowReverse = OnlyIndicesInsideCollection< Matrix::RowReverse, ColumnIndicesToInclude >; type Column = Matrix::Column; type ColumnReverse = Matrix::ColumnReverse;
fn row( & self, index: &Self::RowIndex ) -> Self::Row
{ OnlyIndicesInsideCollection::new( self.matrix.row(index), self.column_indices_to_include ) }
fn row_reverse( & self, index: &Self::RowIndex ) -> Self::RowReverse
{ OnlyIndicesInsideCollection::new( self.matrix.row_reverse(index), self.column_indices_to_include ) }
fn column( & self, index: & Self::ColumnIndex) -> Self::Column
{ self.matrix.column(index) }
fn column_reverse( & self, index: & Self::ColumnIndex) -> Self::ColumnReverse
{ self.matrix.column_reverse(index) }
fn has_row_for_index( & self, index: &Self::RowIndex ) -> bool
{ self.matrix.has_row_for_index(index) }
fn has_column_for_index( & self, index: & Self::ColumnIndex) -> bool
{
let matrix_has_column = self.matrix.has_column_for_index(index);
let column_is_included = self.column_indices_to_include.map_has_key_or_sequence_has_element(index);
return matrix_has_column && column_is_included
}
fn structural_nonzero_entry( & self, row: & Self::RowIndex, column: & Self::ColumnIndex ) -> Option< Self::Coefficient >
{ self.matrix.structural_nonzero_entry( row, column ) }
}
impl < Matrix, ColumnIndicesToExclude >
MatrixAlgebra for
OnlyColumnIndicesInsideCollection
< Matrix, ColumnIndicesToExclude >
where
Matrix: MatrixAlgebra,
ColumnIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::ColumnIndex >,
{
type RingOperator = Matrix::RingOperator;
type OrderOperatorForRowEntries = Matrix::OrderOperatorForRowEntries;
type OrderOperatorForRowIndices = Matrix::OrderOperatorForRowIndices;
type OrderOperatorForColumnEntries = Matrix::OrderOperatorForColumnEntries;
type OrderOperatorForColumnIndices = Matrix::OrderOperatorForColumnIndices;
fn ring_operator( &self ) -> Self::RingOperator { self.matrix.ring_operator() }
fn order_operator_for_row_entries( &self ) -> Self::OrderOperatorForRowEntries { self.matrix.order_operator_for_row_entries() }
fn order_operator_for_row_indices( &self ) -> Self::OrderOperatorForRowIndices { self.matrix.order_operator_for_row_indices() }
fn order_operator_for_column_entries( &self ) -> Self::OrderOperatorForColumnEntries { self.matrix.order_operator_for_column_entries() }
fn order_operator_for_column_indices( &self ) -> Self::OrderOperatorForColumnIndices { self.matrix.order_operator_for_column_indices() }
}
#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd)]
pub struct OnlyRowIndicesInsideCollection<
Matrix, RowIndicesToInclude,
>
where
Matrix: MatrixOracle,
RowIndicesToInclude: MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
matrix: Matrix,
row_indices_to_include: RowIndicesToInclude,
}
impl < Matrix, RowIndicesToInclude, >
OnlyRowIndicesInsideCollection
< Matrix, RowIndicesToInclude >
where
Matrix: MatrixOracle,
RowIndicesToInclude: MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
pub fn new( matrix: Matrix, row_indices_to_include: RowIndicesToInclude )
->
OnlyRowIndicesInsideCollection
< Matrix, RowIndicesToInclude >
where
RowIndicesToInclude: MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{ OnlyRowIndicesInsideCollection{ matrix, row_indices_to_include } }
}
impl < Matrix, RowIndicesToExclude >
MatrixOracle for
OnlyRowIndicesInsideCollection
< Matrix, RowIndicesToExclude >
where
Matrix: MatrixOracle,
RowIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
type Coefficient = Matrix::Coefficient; type RowIndex = Matrix::RowIndex; type ColumnIndex = Matrix::ColumnIndex; type RowEntry = Matrix::RowEntry; type ColumnEntry = Matrix::ColumnEntry; type Row = Matrix::Row; type RowReverse = Matrix::RowReverse; type Column = OnlyIndicesInsideCollection< Matrix::Column, RowIndicesToExclude >; type ColumnReverse = OnlyIndicesInsideCollection< Matrix::ColumnReverse, RowIndicesToExclude >;
fn row( & self, index: &Self::RowIndex ) -> Self::Row
{ self.matrix.row(index) }
fn row_reverse( & self, index: &Self::RowIndex ) -> Self::RowReverse
{ self.matrix.row_reverse(index) }
fn column( & self, index: & Self::ColumnIndex) -> Self::Column
{ OnlyIndicesInsideCollection::new( self.matrix.column(index), self.row_indices_to_include ) }
fn column_reverse( & self, index: & Self::ColumnIndex) -> Self::ColumnReverse
{ OnlyIndicesInsideCollection::new( self.matrix.column_reverse(index), self.row_indices_to_include ) }
fn has_row_for_index( & self, index: &Self::RowIndex ) -> bool
{
let matrix_has_row = self.matrix.has_row_for_index(index);
let row_is_included = self.row_indices_to_include.map_has_key_or_sequence_has_element(index);
return matrix_has_row && row_is_included
}
fn has_column_for_index( & self, index: & Self::ColumnIndex) -> bool
{ self.matrix.has_column_for_index(index) }
fn structural_nonzero_entry( & self, row: & Self::RowIndex, column: & Self::ColumnIndex ) -> Option< Self::Coefficient >
{ self.matrix.structural_nonzero_entry( row, column ) }
}
impl < Matrix, RowIndicesToExclude >
MatrixAlgebra for
OnlyRowIndicesInsideCollection
< Matrix, RowIndicesToExclude >
where
Matrix: MatrixAlgebra,
RowIndicesToExclude: Copy + MapHasKeyOrSequenceHasElement< Matrix::RowIndex >,
{
type RingOperator = Matrix::RingOperator;
type OrderOperatorForRowEntries = Matrix::OrderOperatorForRowEntries;
type OrderOperatorForRowIndices = Matrix::OrderOperatorForRowIndices;
type OrderOperatorForColumnEntries = Matrix::OrderOperatorForColumnEntries;
type OrderOperatorForColumnIndices = Matrix::OrderOperatorForColumnIndices;
fn ring_operator( &self ) -> Self::RingOperator { self.matrix.ring_operator() }
fn order_operator_for_row_entries( &self ) -> Self::OrderOperatorForRowEntries { self.matrix.order_operator_for_row_entries() }
fn order_operator_for_row_indices( &self ) -> Self::OrderOperatorForRowIndices { self.matrix.order_operator_for_row_indices() }
fn order_operator_for_column_entries( &self ) -> Self::OrderOperatorForColumnEntries { self.matrix.order_operator_for_column_entries() }
fn order_operator_for_column_indices( &self ) -> Self::OrderOperatorForColumnIndices { self.matrix.order_operator_for_column_indices() }
}
#[cfg(test)]
mod doc_test_drafts {
}