#![warn(missing_docs)]
pub mod error;
pub mod mutvec;
pub mod stats;
pub mod triangmat;
pub mod vecg;
pub mod vecu8;
pub mod vecvec;
pub mod vecvecg;
pub use crate::error::*;
pub use indxvec::{here, printing::*, MinMax, Printing};
pub use medians::{MedError, Median, Medianf64};
pub fn fromop<T: Clone + Into<f64>>(f: &T) -> f64 {
f.clone().into()
}
pub fn tm_stat(val: f64, params: Params) -> f64 {
(val - params.centre) / params.spread
}
pub fn sumn(n: usize) -> usize {
n * (n + 1) / 2
}
pub fn unit_matrix(n: usize) -> Vec<Vec<f64>> {
(0..n).map(|i| basis_vec(i,n)).collect()
}
pub fn basis_vec(i: usize, n: usize) -> Vec<f64> {
(0..n).map(|d| if d==i { 1_f64 } else { 0_f64 }).collect()
}
#[derive(Default)]
pub struct Params {
pub centre: f64,
pub spread: f64,
}
impl std::fmt::Display for Params {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
f,
"{YL}centre: {GR}{:.5}{YL} ± spread: {GR}{:.5}{UN}",
self.centre, self.spread
)
}
}
#[derive(Default, Clone)]
pub struct TriangMat{
pub kind: usize,
pub data: Vec<f64>
}
pub trait Stats {
fn vmag(self) -> f64;
fn vmagsq(self) -> f64;
fn vreciprocal(self) -> Result<Vec<f64>, RE>;
fn vinverse(self) -> Result<Vec<f64>, RE>;
fn negv(self) -> Result<Vec<f64>, RE>;
fn vunit(self) -> Result<Vec<f64>, RE>;
fn hmad(self) -> Result<f64, RE>;
fn amean(self) -> Result<f64, RE>;
fn medmad(self) -> Result<Params, RE>;
fn ameanstd(self) -> Result<Params, RE>;
fn awmean(self) -> Result<f64, RE>;
fn awmeanstd(self) -> Result<Params, RE>;
fn hmean(self) -> Result<f64, RE>;
fn hmeanstd(self) -> Result<Params, RE>;
fn hwmean(self) -> Result<f64, RE>;
fn hwmeanstd(self) -> Result<Params, RE>;
fn gmean(self) -> Result<f64, RE>;
fn gmeanstd(self) -> Result<Params, RE>;
fn gwmean(self) -> Result<f64, RE>;
fn gwmeanstd(self) -> Result<Params, RE>;
fn pdf(self) -> Vec<f64>;
fn entropy(self) -> f64;
fn autocorr(self) -> Result<f64, RE>;
fn lintrans(self) -> Result<Vec<f64>, RE>;
fn dfdt(self, centre: f64) -> Result<f64, RE>;
fn house_reflector(self) -> Vec<f64>;
}
pub trait Vecg {
fn tm_statistic(self, centre: &[f64], spread: f64) -> Result<f64, RE>;
fn columnp<U: Clone + Into<f64>>(self, c: usize, v: &[Vec<U>]) -> f64;
fn sadd<U: Into<f64>>(self, s: U) -> Vec<f64>;
fn smult<U: Into<f64>>(self, s: U) -> Vec<f64>;
fn dotp<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn dotsig(self, sig: &[f64]) -> Result<f64, RE>;
fn cosine<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn sine<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn vsub<U: Clone + Into<f64>>(self, v: &[U]) -> Vec<f64>;
fn vsubunit<U: Clone + Into<f64>>(self, v: &[U]) -> Vec<f64>;
fn vadd<U: Clone + Into<f64>>(self, v: &[U]) -> Vec<f64>;
fn vdist<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn wvmean<U: Clone + Into<f64>>(self, ws: &[U]) -> f64;
fn wvdist<U: Clone + Into<f64>, V: Clone + Into<f64>>(self, ws: &[U], v: &[V]) -> f64;
fn vdistsq<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn cityblockd<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn varea<U: Clone + PartialOrd + Into<f64>>(self, v: &[U]) -> f64;
fn varc<U: Clone + PartialOrd + Into<f64>>(self, v: &[U]) -> f64;
fn vsim<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn vcorrsim(self, v: Self) -> Result<f64, RE>;
fn pdotp<U: Clone + PartialOrd + Into<f64>>(self, v: &[U]) -> f64;
fn vdisim<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn covone<U: Clone + Into<f64>>(self, m: &[U]) -> TriangMat;
fn kron<U: Clone + Into<f64>>(self, v: &[U]) -> Vec<f64>;
fn outer<U: Clone + Into<f64>>(self, v: &[U]) -> Vec<Vec<f64>>;
fn wedge<U: Clone + Into<f64>>(self, v: &[U]) -> TriangMat;
fn geometric<U: Clone + Into<f64>>(self, b: &[U]) -> TriangMat;
fn jointpdf<U: Clone + Into<f64>>(self, v: &[U]) -> Result<Vec<f64>, RE>;
fn jointentropy<U: Clone + Into<f64>>(self, v: &[U]) -> Result<f64, RE>;
fn dependence<U: Clone + PartialOrd + Into<f64>>(self, v: &[U]) -> Result<f64, RE>;
fn independence<U: Clone + PartialOrd + Into<f64>>(self, v: &[U]) -> Result<f64, RE>;
fn correlation<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn kendalcorr<U: Clone + Into<f64>>(self, v: &[U]) -> f64;
fn spearmancorr<U: PartialOrd + Clone + Into<f64>>(self, v: &[U]) -> f64;
fn contribvec_newpt(self, gm: &[f64], recips: f64) -> Result<Vec<f64>, RE>;
fn contrib_newpt(self, gm: &[f64], recips: f64, nf: f64) -> Result<f64, RE>;
fn contribvec_oldpt(self, gm: &[f64], recips: f64) -> Result<Vec<f64>, RE>;
fn contrib_oldpt(self, gm: &[f64], recips: f64, nf: f64) -> Result<f64, RE>;
fn house_reflect<U: Clone + PartialOrd + Into<f64>>(self, x: &[U]) -> Vec<f64>;
}
pub trait MutVecg {
fn mutsmult<U: PartialOrd + Into<f64>>(self, _s: U);
fn mutvsub<U: Clone + PartialOrd + Into<f64>>(self, _v: &[U]);
fn mutvadd<U: Clone + PartialOrd + Into<f64>>(self, _v: &[U]);
fn minvert(self);
fn mneg(self);
fn munit(self);
fn mlintrans(self);
}
pub trait Vecu8 {
fn pdfu8(self) -> Vec<f64>;
fn entropyu8(self) -> f64;
fn jointpdfu8(self, v: &[u8]) -> Result<Vec<Vec<u32>>, RE>;
fn jointentropyu8(self, v: &[u8]) -> Result<f64, RE>;
fn dependenceu8(self, v: &[u8]) -> Result<f64, RE>;
fn independenceu8(self, v: &[u8]) -> Result<f64, RE>;
}
pub trait VecVec<T> {
fn dvdt(self, centre: &[f64]) -> Result<Vec<f64>, RE>;
fn scalar_fn(self, f: impl Fn(&[T]) -> Result<f64, RE>) -> Result<Vec<f64>, RE>;
fn vector_fn(self, f: impl Fn(&[T]) -> Result<Vec<f64>, RE>) -> Result<Vec<Vec<f64>>, RE>;
fn radii(self, gm: &[f64]) -> Result<Vec<f64>, RE>;
fn column(self, cnum: usize) -> Vec<f64>;
fn transpose(self) -> Vec<Vec<f64>>;
fn normalize(self) -> Result<Vec<Vec<f64>>, RE>;
fn projection(self, basis: &[Vec<f64>]) -> Result<Vec<Vec<f64>>, RE>;
fn house_ur(self) -> Result<(TriangMat, TriangMat), RE>;
fn jointpdfn(self) -> Result<Vec<f64>, RE>;
fn jointentropyn(self) -> Result<f64, RE>;
fn dependencen(self) -> Result<f64, RE>;
fn crossfeatures(self, f: fn(&[T], &[T]) -> f64) -> Result<TriangMat, RE>;
fn sumv(self) -> Vec<f64>;
fn acentroid(self) -> Vec<f64>;
fn par_acentroid(self) -> Vec<f64>;
fn gcentroid(self) -> Result<Vec<f64>, RE>;
fn hcentroid(self) -> Result<Vec<f64>, RE>;
fn distsums(self) -> Vec<f64>;
fn medout(self, gm: &[f64]) -> Result<MinMax<f64>, RE>;
fn radius(self, i: usize, gm: &[f64]) -> Result<f64, RE>;
fn eccinfo(self, gm: &[f64]) -> Result<(Params, Params, MinMax<f64>), RE>
where
Vec<f64>: FromIterator<f64>;
fn quasimedian(self) -> Result<Vec<f64>, RE>;
fn sigvec(self, idx: &[usize]) -> Result<Vec<f64>, RE>;
fn madgm(self, gm: &[f64]) -> Result<f64, RE>;
fn stdgm(self, gm: &[f64]) -> Result<f64, RE>;
fn outer_hull(self, sqrads: &[f64], sindex: &[usize]) -> Vec<usize>;
fn inner_hull(self, sqrads: &[f64], sindex: &[usize]) -> Vec<usize>;
fn depth(self, descending_index: &[usize], p: &[f64]) -> Result<f64, RE>;
fn depth_ratio(self, descending_index: &[usize], p: &[f64]) -> f64;
fn hulls(self) -> (Vec<usize>, Vec<usize>);
fn gmerror(self, g: &[f64]) -> Result<f64, RE>;
fn gmedian(self, eps: f64) -> Vec<f64>;
fn par_gmedian(self, eps: f64) -> Vec<f64>;
fn gmparts(self, eps: f64) -> (Vec<f64>, f64);
fn covar(self, mid: &[f64]) -> Result<TriangMat, RE>;
fn serial_covar(self, mid: &[f64]) -> Result<TriangMat, RE>;
}
pub trait VecVecg<T, U> {
fn scalar_wfn(
self,
ws: &[U],
f: impl Fn(&[T]) -> Result<f64, RE>,
) -> Result<(Vec<f64>, f64), RE>;
fn vector_wfn(
self,
v: &[U],
f: impl Fn(&[T]) -> Result<Vec<f64>, RE>,
) -> Result<(Vec<Vec<f64>>, f64), RE>;
fn wdvdt(self, ws: &[U], centre: &[f64]) -> Result<Vec<f64>, RE>;
fn divs(self, v: &[U]) -> Result<Vec<f64>, RE>;
fn wdivs(self, ws: &[U], v: &[f64]) -> Result<(Vec<f64>, f64), RE>;
fn wdivsmed(self, ws: &[U], v: &[f64]) -> Result<f64, RE>;
fn wradii(self, ws: &[U], gm: &[f64]) -> Result<(Vec<f64>, f64), RE>;
fn wmadgm(self, ws: &[U], wgm: &[f64]) -> Result<f64, RE>;
fn leftmultv(self, v: &[U]) -> Result<Vec<f64>, RE>;
fn rightmultv(self, v: &[U]) -> Result<Vec<f64>, RE>;
fn matmult(self, m: &[Vec<U>]) -> Result<Vec<Vec<f64>>, RE>;
fn wsumv(self, ws: &[U]) -> Vec<f64>;
fn wacentroid(self, ws: &[U]) -> Vec<f64>;
fn trend(self, eps: f64, v: Vec<Vec<U>>) -> Result<Vec<f64>, RE>;
fn translate(self, m: &[U]) -> Result<Vec<Vec<f64>>, RE>;
fn wsigvec(self, idx: &[usize], ws: &[U]) -> Result<Vec<f64>, RE>;
fn wdepth(self, descending_index: &[usize], ws: &[U], p: &[f64]) -> Result<f64, RE>;
fn dependencies(self, m: &[U]) -> Result<Vec<f64>, RE>;
fn distsum(self, v: &[U]) -> Result<f64, RE>;
fn dists(self, v: &[U]) -> Result<Vec<f64>, RE>;
fn wsortedrads(self, ws: &[U], gm: &[f64]) -> Result<Vec<f64>, RE>;
fn wgmedian(self, ws: &[U], eps: f64) -> Result<Vec<f64>, RE>;
fn par_wgmedian(self, ws: &[U], eps: f64) -> Result<Vec<f64>, RE>;
fn wgmparts(self, ws: &[U], eps: f64) -> Result<(Vec<f64>, f64), RE>;
fn wcovar(self, ws: &[U], mid: &[f64]) -> Result<TriangMat, RE>;
fn serial_wcovar(self, ws: &[U], mid: &[f64]) -> Result<TriangMat, RE>;
}