use crate::op::{Additive, Multiplicative};
use crate::tower::{Field, FiniteDimVectorSpace};
pub trait Matrix: Sized + Clone {
type Field: Field<Additive, Multiplicative> + Copy;
type Row: FiniteDimVectorSpace<Additive, Multiplicative, Scalar = Self::Field>;
type Column: FiniteDimVectorSpace<Additive, Multiplicative, Scalar = Self::Field>;
type Transpose: Matrix<Field = Self::Field, Row = Self::Column, Column = Self::Row>;
fn nrows(&self) -> usize;
fn ncolumns(&self) -> usize;
fn row(&self, i: usize) -> Self::Row;
fn column(&self, j: usize) -> Self::Column;
fn get(&self, i: usize, j: usize) -> Self::Field;
fn transpose(&self) -> Self::Transpose;
}
pub trait MatrixMut: Matrix {
fn set_row(&self, i: usize, row: &Self::Row) -> Self;
fn set_row_mut(&mut self, i: usize, row: &Self::Row);
fn set_column(&self, j: usize, column: &Self::Column) -> Self;
fn set_column_mut(&mut self, j: usize, column: &Self::Column);
fn set(&mut self, i: usize, j: usize, val: Self::Field);
}
pub trait SquareMatrix: Matrix {
type Vector: FiniteDimVectorSpace<Additive, Multiplicative, Scalar = Self::Field>;
fn dimension(&self) -> usize;
fn diagonal(&self) -> Self::Vector;
fn determinant(&self) -> Self::Field;
fn try_inverse(&self) -> Option<Self>;
}
pub trait SquareMatrixMut: SquareMatrix + MatrixMut {
fn transpose_mut(&mut self);
}
pub trait InversibleSquareMatrix: SquareMatrix {
fn inverse(&self) -> Self;
}