use std::{hash::Hash, iter::{Chain, Flatten}};
use crate::{algebra::{matrices::query::MatrixAlgebra, vectors::entries::KeyValGet}, utilities::sequences_and_ordinals::BijectiveSequence};
pub mod barcode;
pub trait ChainComplex
where
Self: MatrixAlgebra
{
type BasisVectorIndicesIterable: IntoIterator<Item = Self::RowIndex>;
fn basis_vector_indices_for_dimension( &self, dimension: isize ) -> Self::BasisVectorIndicesIterable;
fn basis_vector_indices_for_dimensions< I >( &self, dimensions: I ) -> Flatten< std::vec::IntoIter< Self::BasisVectorIndicesIterable > >
where
I: IntoIterator<Item = isize>,
{
let mut dimensions: Vec<isize> = dimensions.into_iter().collect();
dimensions.sort();
dimensions.dedup();
dimensions.into_iter()
.map( |d| self.basis_vector_indices_for_dimension(d) )
.collect::<Vec<_>>()
.into_iter()
.flatten()
}
fn basis_vector_index_bimap_for_dimensions< I >( &self, dimensions: I )
->
Result<
BijectiveSequence< Self::RowIndex >,
Self::RowIndex,
>
where
I: IntoIterator<Item = isize>,
Self::RowIndex: Hash,
{
let indices: Vec< Self::RowIndex > = self.basis_vector_indices_for_dimensions(dimensions).into_iter().collect();
BijectiveSequence::from_iter(indices)
}
fn dimension_for_basis_vector_with_index( &self, index: & Self::RowIndex ) -> Result<isize, Self::RowIndex>;
}
pub trait FilteredChainComplex: ChainComplex {
type FiltrationValue;
fn filtration_value_for_basis_vector_with_index(
&self,
index: & Self::RowIndex
) ->
Result<
Self::FiltrationValue,
Self::RowIndex
>;
fn filtration_value_for_vector< V >(
&self,
vector: V
) ->
Result<
Self::FiltrationValue,
Option< Self::RowIndex >
>
where
V: IntoIterator< Item: KeyValGet< Key = Self::RowIndex > >,
Self::FiltrationValue: Ord,
{
let mut filtration_value = None;
for entry in vector.into_iter() {
match self.filtration_value_for_basis_vector_with_index(&entry.key()) {
Ok(value) => {
filtration_value = filtration_value.max(Some(value));
},
Err(invalid_index) => return Err(Some(invalid_index)),
}
}
match filtration_value {
Some(value) => Ok(value),
None => Err(None), }
}
}