use std::fmt::{Debug, Display};
use crate::algorithm::two_phase::matrix_provider::column::{Column, ColumnNumber};
use crate::algorithm::two_phase::matrix_provider::filter::Filtered;
use crate::algorithm::two_phase::matrix_provider::MatrixProvider;
use crate::algorithm::two_phase::tableau::BasisChangeComputationInfo;
use crate::algorithm::two_phase::tableau::kind::Kind;
use crate::data::linear_algebra::SparseTuple;
use crate::data::linear_algebra::traits::Element;
use crate::data::linear_algebra::vector::{DenseVector, SparseVector};
pub mod carry;
pub mod ops;
pub trait InverseMaintainer: Display + Sized {
type F: ops::Field;
type ColumnComputationInfo: ColumnComputationInfo<Self::F>;
fn create_for_fully_artificial<Rhs: Element>(rhs: DenseVector<Rhs>) -> Self
where
Self::F: ops::Rhs<Rhs>,
;
fn create_for_partially_artificial<G: Element>(
artificial: &[usize],
basis: &[(usize, usize)],
b: DenseVector<G>,
basis_indices: Vec<usize>,
) -> Self
where
Self::F: ops::Rhs<G>,
;
fn from_basis<'a, MP: MatrixProvider>(basis: &[usize], provider: &'a MP) -> Self
where
Self::F:
ops::Column<<MP::Column as Column>::F> +
ops::Rhs<MP::Rhs> +
ops::Cost<MP::Cost<'a>> +
ops::Column<MP::Rhs> +
,
MP::Rhs: 'static,
;
fn from_basis_pivots<'a, MP: MatrixProvider>(basis: &[(usize, usize)], provider: &'a MP) -> Self
where
Self::F:
ops::Column<<MP::Column as Column>::F> +
ops::Rhs<MP::Rhs> +
ops::Cost<MP::Cost<'a>> +
ops::Column<MP::Rhs> +
,
MP::Rhs: 'static + ColumnNumber,
;
fn from_artificial<'provider, MP: MatrixProvider>(
artificial: Self,
provider: &'provider MP,
nr_artificial: usize,
) -> Self
where
Self::F: ops::FieldHR + ops::Column<<MP::Column as Column>::F> + ops::Cost<MP::Cost<'provider>>,
;
fn from_artificial_remove_rows<'a, MP: Filtered>(
artificial: Self,
rows_removed: &'a MP,
nr_artificial: usize,
) -> Self
where
Self::F: ops::Column<<<MP as MatrixProvider>::Column as Column>::F> + ops::Cost<MP::Cost<'a>>,
;
fn change_basis<K: Kind>(
&mut self,
pivot_row_index: usize,
pivot_column_index: usize,
column: Self::ColumnComputationInfo,
cost: Self::F,
kind: &K,
) -> BasisChangeComputationInfo<Self::F>
where
Self::F: ops::Column<<<K as Kind>::Column as Column>::F>,
;
fn cost_difference<C: Column>(&self, original_column: &C) -> Self::F
where
Self::F: ops::Column<C::F>,
;
fn generate_column<C: Column>(
&self,
original_column: C,
) -> Self::ColumnComputationInfo
where
Self::F: ops::Column<C::F>,
;
fn generate_element<C: Column>(
&self,
i: usize,
original_column: C,
) -> Option<Self::F>
where
Self::F: ops::Column<C::F>,
;
fn current_bfs(&self) -> Vec<SparseTuple<Self::F>>;
fn basis_column_index_for_row(&self, row: usize) -> usize;
fn b(&self) -> DenseVector<Self::F>;
fn get_objective_function_value(&self) -> Self::F;
fn get_constraint_value(&self, i: usize) -> &Self::F;
}
pub trait ColumnComputationInfo<F>: Debug {
fn column(&self) -> &SparseVector<F, F>;
fn into_column(self) -> SparseVector<F, F>;
}