fix: minor refactoring
This commit is contained in:
@@ -5,14 +5,14 @@ use crate::linalg::Matrix;
|
|||||||
use crate::math::distance::euclidian;
|
use crate::math::distance::euclidian;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BBDTree<T: FloatExt + Debug> {
|
pub struct BBDTree<T: FloatExt> {
|
||||||
nodes: Vec<BBDTreeNode<T>>,
|
nodes: Vec<BBDTreeNode<T>>,
|
||||||
index: Vec<usize>,
|
index: Vec<usize>,
|
||||||
root: usize
|
root: usize
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct BBDTreeNode<T: FloatExt + Debug> {
|
struct BBDTreeNode<T: FloatExt> {
|
||||||
count: usize,
|
count: usize,
|
||||||
index: usize,
|
index: usize,
|
||||||
center: Vec<T>,
|
center: Vec<T>,
|
||||||
@@ -23,7 +23,7 @@ struct BBDTreeNode<T: FloatExt + Debug> {
|
|||||||
upper: Option<usize>
|
upper: Option<usize>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> BBDTreeNode<T> {
|
impl<T: FloatExt> BBDTreeNode<T> {
|
||||||
fn new(d: usize) -> BBDTreeNode<T> {
|
fn new(d: usize) -> BBDTreeNode<T> {
|
||||||
BBDTreeNode {
|
BBDTreeNode {
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -38,7 +38,7 @@ impl<T: FloatExt + Debug> BBDTreeNode<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> BBDTree<T> {
|
impl<T: FloatExt> BBDTree<T> {
|
||||||
pub fn new<M: Matrix<T>>(data: &M) -> BBDTree<T> {
|
pub fn new<M: Matrix<T>>(data: &M) -> BBDTree<T> {
|
||||||
let nodes = Vec::new();
|
let nodes = Vec::new();
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ impl Default for KMeansParameters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug + Sum> KMeans<T>{
|
impl<T: FloatExt + Sum> KMeans<T>{
|
||||||
pub fn new<M: Matrix<T>>(data: &M, k: usize, parameters: KMeansParameters) -> KMeans<T> {
|
pub fn new<M: Matrix<T>>(data: &M, k: usize, parameters: KMeansParameters) -> KMeans<T> {
|
||||||
|
|
||||||
let bbd = BBDTree::new(data);
|
let bbd = BBDTree::new(data);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use crate::math::num::FloatExt;
|
|||||||
use crate::linalg::{Matrix};
|
use crate::linalg::{Matrix};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PCA<T: FloatExt + Debug, M: Matrix<T>> {
|
pub struct PCA<T: FloatExt, M: Matrix<T>> {
|
||||||
eigenvectors: M,
|
eigenvectors: M,
|
||||||
eigenvalues: Vec<T>,
|
eigenvalues: Vec<T>,
|
||||||
projection: M,
|
projection: M,
|
||||||
@@ -24,7 +24,7 @@ impl Default for PCAParameters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug, M: Matrix<T>> PCA<T, M> {
|
impl<T: FloatExt, M: Matrix<T>> PCA<T, M> {
|
||||||
|
|
||||||
pub fn new(data: &M, n_components: usize, parameters: PCAParameters) -> PCA<T, M> {
|
pub fn new(data: &M, n_components: usize, parameters: PCAParameters) -> PCA<T, M> {
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ impl Default for RandomForestClassifierParameters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> RandomForestClassifier<T> {
|
impl<T: FloatExt> RandomForestClassifier<T> {
|
||||||
|
|
||||||
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: RandomForestClassifierParameters) -> RandomForestClassifier<T> {
|
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: RandomForestClassifierParameters) -> RandomForestClassifier<T> {
|
||||||
let (_, num_attributes) = x.shape();
|
let (_, num_attributes) = x.shape();
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ impl Default for RandomForestRegressorParameters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> RandomForestRegressor<T> {
|
impl<T: FloatExt> RandomForestRegressor<T> {
|
||||||
|
|
||||||
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: RandomForestRegressorParameters) -> RandomForestRegressor<T> {
|
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: RandomForestRegressorParameters) -> RandomForestRegressor<T> {
|
||||||
let (n_rows, num_attributes) = x.shape();
|
let (n_rows, num_attributes) = x.shape();
|
||||||
|
|||||||
+11
-11
@@ -6,13 +6,13 @@ use crate::math::num::FloatExt;
|
|||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct EVD<T: FloatExt + Debug, M: BaseMatrix<T>> {
|
pub struct EVD<T: FloatExt, M: BaseMatrix<T>> {
|
||||||
pub d: Vec<T>,
|
pub d: Vec<T>,
|
||||||
pub e: Vec<T>,
|
pub e: Vec<T>,
|
||||||
pub V: M
|
pub V: M
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug, M: BaseMatrix<T>> EVD<T, M> {
|
impl<T: FloatExt, M: BaseMatrix<T>> EVD<T, M> {
|
||||||
pub fn new(V: M, d: Vec<T>, e: Vec<T>) -> EVD<T, M> {
|
pub fn new(V: M, d: Vec<T>, e: Vec<T>) -> EVD<T, M> {
|
||||||
EVD {
|
EVD {
|
||||||
d: d,
|
d: d,
|
||||||
@@ -22,7 +22,7 @@ impl<T: FloatExt + Debug, M: BaseMatrix<T>> EVD<T, M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait EVDDecomposableMatrix<T: FloatExt + Debug>: BaseMatrix<T> {
|
pub trait EVDDecomposableMatrix<T: FloatExt>: BaseMatrix<T> {
|
||||||
|
|
||||||
fn evd(&self, symmetric: bool) -> EVD<T, Self>{
|
fn evd(&self, symmetric: bool) -> EVD<T, Self>{
|
||||||
self.clone().evd_mut(symmetric)
|
self.clone().evd_mut(symmetric)
|
||||||
@@ -68,7 +68,7 @@ pub trait EVDDecomposableMatrix<T: FloatExt + Debug>: BaseMatrix<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tred2<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
fn tred2<T: FloatExt, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
||||||
|
|
||||||
let (n, _) = V.shape();
|
let (n, _) = V.shape();
|
||||||
for i in 0..n {
|
for i in 0..n {
|
||||||
@@ -172,7 +172,7 @@ fn tred2<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &m
|
|||||||
e[0] = T::zero();
|
e[0] = T::zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tql2<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
fn tql2<T: FloatExt, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
||||||
let (n, _) = V.shape();
|
let (n, _) = V.shape();
|
||||||
for i in 1..n {
|
for i in 1..n {
|
||||||
e[i - 1] = e[i];
|
e[i - 1] = e[i];
|
||||||
@@ -288,7 +288,7 @@ fn tql2<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn balance<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M) -> Vec<T> {
|
fn balance<T: FloatExt, M: BaseMatrix<T>>(A: &mut M) -> Vec<T> {
|
||||||
let radix = T::two();
|
let radix = T::two();
|
||||||
let sqrdx = radix * radix;
|
let sqrdx = radix * radix;
|
||||||
|
|
||||||
@@ -341,7 +341,7 @@ fn balance<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M) -> Vec<T> {
|
|||||||
return scale;
|
return scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn elmhes<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
fn elmhes<T: FloatExt, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
||||||
let (n, _) = A.shape();
|
let (n, _) = A.shape();
|
||||||
let mut perm = vec![0; n];
|
let mut perm = vec![0; n];
|
||||||
|
|
||||||
@@ -387,7 +387,7 @@ fn elmhes<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
|||||||
return perm;
|
return perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn eltran<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &M, V: &mut M, perm: &Vec<usize>) {
|
fn eltran<T: FloatExt, M: BaseMatrix<T>>(A: &M, V: &mut M, perm: &Vec<usize>) {
|
||||||
let (n, _) = A.shape();
|
let (n, _) = A.shape();
|
||||||
for mp in (1..n - 1).rev() {
|
for mp in (1..n - 1).rev() {
|
||||||
for k in mp + 1..n {
|
for k in mp + 1..n {
|
||||||
@@ -404,7 +404,7 @@ fn eltran<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &M, V: &mut M, perm: &Vec<us
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn hqr2<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M, V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
fn hqr2<T: FloatExt, M: BaseMatrix<T>>(A: &mut M, V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
||||||
let (n, _) = A.shape();
|
let (n, _) = A.shape();
|
||||||
let mut z = T::zero();
|
let mut z = T::zero();
|
||||||
let mut s = T::zero();
|
let mut s = T::zero();
|
||||||
@@ -742,7 +742,7 @@ fn hqr2<T: FloatExt + Debug, M: BaseMatrix<T>>(A: &mut M, V: &mut M, d: &mut Vec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn balbak<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, scale: &Vec<T>) {
|
fn balbak<T: FloatExt, M: BaseMatrix<T>>(V: &mut M, scale: &Vec<T>) {
|
||||||
let (n, _) = V.shape();
|
let (n, _) = V.shape();
|
||||||
for i in 0..n {
|
for i in 0..n {
|
||||||
for j in 0..n {
|
for j in 0..n {
|
||||||
@@ -751,7 +751,7 @@ fn balbak<T: FloatExt + Debug, M: BaseMatrix<T>>(V: &mut M, scale: &Vec<T>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sort<T: FloatExt + Debug, M: BaseMatrix<T>>(d: &mut Vec<T>, e: &mut Vec<T>, V: &mut M) {
|
fn sort<T: FloatExt, M: BaseMatrix<T>>(d: &mut Vec<T>, e: &mut Vec<T>, V: &mut M) {
|
||||||
let n = d.len();
|
let n = d.len();
|
||||||
let mut temp = vec![T::zero(); n];
|
let mut temp = vec![T::zero(); n];
|
||||||
for j in 1..n {
|
for j in 1..n {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use crate::linalg::qr::QRDecomposableMatrix;
|
|||||||
use crate::math::num::FloatExt;
|
use crate::math::num::FloatExt;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct DenseMatrix<T: FloatExt + Debug> {
|
pub struct DenseMatrix<T: FloatExt> {
|
||||||
|
|
||||||
ncols: usize,
|
ncols: usize,
|
||||||
nrows: usize,
|
nrows: usize,
|
||||||
@@ -24,7 +24,7 @@ pub struct DenseMatrix<T: FloatExt + Debug> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> fmt::Display for DenseMatrix<T> {
|
impl<T: FloatExt> fmt::Display for DenseMatrix<T> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
let mut rows: Vec<Vec<f64>> = Vec::new();
|
let mut rows: Vec<Vec<f64>> = Vec::new();
|
||||||
for r in 0..self.nrows {
|
for r in 0..self.nrows {
|
||||||
@@ -34,7 +34,7 @@ impl<T: FloatExt + Debug> fmt::Display for DenseMatrix<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> DenseMatrix<T> {
|
impl<T: FloatExt> DenseMatrix<T> {
|
||||||
|
|
||||||
fn new(nrows: usize, ncols: usize, values: Vec<T>) -> Self {
|
fn new(nrows: usize, ncols: usize, values: Vec<T>) -> Self {
|
||||||
DenseMatrix {
|
DenseMatrix {
|
||||||
@@ -182,15 +182,15 @@ impl<T: FloatExt + fmt::Debug + Serialize> Serialize for DenseMatrix<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> SVDDecomposableMatrix<T> for DenseMatrix<T> {}
|
impl<T: FloatExt> SVDDecomposableMatrix<T> for DenseMatrix<T> {}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> EVDDecomposableMatrix<T> for DenseMatrix<T> {}
|
impl<T: FloatExt> EVDDecomposableMatrix<T> for DenseMatrix<T> {}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> QRDecomposableMatrix<T> for DenseMatrix<T> {}
|
impl<T: FloatExt> QRDecomposableMatrix<T> for DenseMatrix<T> {}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> Matrix<T> for DenseMatrix<T> {}
|
impl<T: FloatExt> Matrix<T> for DenseMatrix<T> {}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> PartialEq for DenseMatrix<T> {
|
impl<T: FloatExt> PartialEq for DenseMatrix<T> {
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
if self.ncols != other.ncols || self.nrows != other.nrows {
|
if self.ncols != other.ncols || self.nrows != other.nrows {
|
||||||
return false
|
return false
|
||||||
@@ -213,13 +213,13 @@ impl<T: FloatExt + Debug> PartialEq for DenseMatrix<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> Into<Vec<T>> for DenseMatrix<T> {
|
impl<T: FloatExt> Into<Vec<T>> for DenseMatrix<T> {
|
||||||
fn into(self) -> Vec<T> {
|
fn into(self) -> Vec<T> {
|
||||||
self.values
|
self.values
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> BaseMatrix<T> for DenseMatrix<T> {
|
impl<T: FloatExt> BaseMatrix<T> for DenseMatrix<T> {
|
||||||
|
|
||||||
type RowVector = Vec<T>;
|
type RowVector = Vec<T>;
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -6,13 +6,13 @@ use crate::math::num::FloatExt;
|
|||||||
use crate::linalg::BaseMatrix;
|
use crate::linalg::BaseMatrix;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct QR<T: FloatExt + Debug, M: BaseMatrix<T>> {
|
pub struct QR<T: FloatExt, M: BaseMatrix<T>> {
|
||||||
QR: M,
|
QR: M,
|
||||||
tau: Vec<T>,
|
tau: Vec<T>,
|
||||||
singular: bool
|
singular: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug, M: BaseMatrix<T>> QR<T, M> {
|
impl<T: FloatExt, M: BaseMatrix<T>> QR<T, M> {
|
||||||
pub fn new(QR: M, tau: Vec<T>) -> QR<T, M> {
|
pub fn new(QR: M, tau: Vec<T>) -> QR<T, M> {
|
||||||
|
|
||||||
let mut singular = false;
|
let mut singular = false;
|
||||||
@@ -112,7 +112,7 @@ impl<T: FloatExt + Debug, M: BaseMatrix<T>> QR<T, M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait QRDecomposableMatrix<T: FloatExt + Debug>: BaseMatrix<T> {
|
pub trait QRDecomposableMatrix<T: FloatExt>: BaseMatrix<T> {
|
||||||
|
|
||||||
fn qr(&self) -> QR<T, Self> {
|
fn qr(&self) -> QR<T, Self> {
|
||||||
self.clone().qr_mut()
|
self.clone().qr_mut()
|
||||||
|
|||||||
+3
-3
@@ -5,7 +5,7 @@ use crate::math::num::FloatExt;
|
|||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct SVD<T: FloatExt + Debug, M: SVDDecomposableMatrix<T>> {
|
pub struct SVD<T: FloatExt, M: SVDDecomposableMatrix<T>> {
|
||||||
pub U: M,
|
pub U: M,
|
||||||
pub V: M,
|
pub V: M,
|
||||||
pub s: Vec<T>,
|
pub s: Vec<T>,
|
||||||
@@ -15,7 +15,7 @@ pub struct SVD<T: FloatExt + Debug, M: SVDDecomposableMatrix<T>> {
|
|||||||
tol: T
|
tol: T
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait SVDDecomposableMatrix<T: FloatExt + Debug>: BaseMatrix<T> {
|
pub trait SVDDecomposableMatrix<T: FloatExt>: BaseMatrix<T> {
|
||||||
|
|
||||||
fn svd_solve_mut(self, b: Self) -> Self {
|
fn svd_solve_mut(self, b: Self) -> Self {
|
||||||
self.svd_mut().solve(b)
|
self.svd_mut().solve(b)
|
||||||
@@ -373,7 +373,7 @@ pub trait SVDDecomposableMatrix<T: FloatExt + Debug>: BaseMatrix<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug, M: SVDDecomposableMatrix<T>> SVD<T, M> {
|
impl<T: FloatExt, M: SVDDecomposableMatrix<T>> SVD<T, M> {
|
||||||
pub fn new(U: M, V: M, s: Vec<T>) -> SVD<T, M> {
|
pub fn new(U: M, V: M, s: Vec<T>) -> SVD<T, M> {
|
||||||
let m = U.shape().0;
|
let m = U.shape().0;
|
||||||
let n = V.shape().0;
|
let n = V.shape().0;
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
use std::fmt::Debug;
|
|
||||||
|
|
||||||
use crate::math::num::FloatExt;
|
use crate::math::num::FloatExt;
|
||||||
use crate::linalg::{Matrix, row_iter};
|
use crate::linalg::{Matrix, row_iter};
|
||||||
use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName};
|
use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName};
|
||||||
@@ -13,7 +11,7 @@ pub struct KNNClassifier<'a, T: FloatExt> {
|
|||||||
k: usize,
|
k: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: FloatExt + Debug> KNNClassifier<'a, T> {
|
impl<'a, T: FloatExt> KNNClassifier<'a, T> {
|
||||||
|
|
||||||
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, k: usize, distance: &'a dyn Fn(&Vec<T>, &Vec<T>) -> T, algorithm: KNNAlgorithmName) -> KNNClassifier<'a, T> {
|
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, k: usize, distance: &'a dyn Fn(&Vec<T>, &Vec<T>) -> T, algorithm: KNNAlgorithmName) -> KNNClassifier<'a, T> {
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::fmt::Debug;
|
|
||||||
|
|
||||||
use crate::math::num::FloatExt;
|
use crate::math::num::FloatExt;
|
||||||
use crate::linalg::Matrix;
|
use crate::linalg::Matrix;
|
||||||
@@ -23,7 +22,7 @@ impl<T: FloatExt> Default for GradientDescent<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> FirstOrderOptimizer<T> for GradientDescent<T>
|
impl<T: FloatExt> FirstOrderOptimizer<T> for GradientDescent<T>
|
||||||
{
|
{
|
||||||
|
|
||||||
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &'a F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X> {
|
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &'a F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X> {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ impl<T: FloatExt> Default for LBFGS<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> LBFGS<T> {
|
impl<T: FloatExt> LBFGS<T> {
|
||||||
|
|
||||||
fn two_loops<X: Matrix<T>>(&self, state: &mut LBFGSState<T, X>) {
|
fn two_loops<X: Matrix<T>>(&self, state: &mut LBFGSState<T, X>) {
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ impl<T: FloatExt + Debug> LBFGS<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct LBFGSState<T: FloatExt + Debug, X: Matrix<T>> {
|
struct LBFGSState<T: FloatExt, X: Matrix<T>> {
|
||||||
x: X,
|
x: X,
|
||||||
x_prev: X,
|
x_prev: X,
|
||||||
x_f: T,
|
x_f: T,
|
||||||
@@ -189,7 +189,7 @@ struct LBFGSState<T: FloatExt + Debug, X: Matrix<T>> {
|
|||||||
alpha: T
|
alpha: T
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> FirstOrderOptimizer<T> for LBFGS<T> {
|
impl<T: FloatExt> FirstOrderOptimizer<T> for LBFGS<T> {
|
||||||
|
|
||||||
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X> {
|
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X> {
|
||||||
|
|
||||||
|
|||||||
@@ -9,12 +9,12 @@ use crate::linalg::Matrix;
|
|||||||
use crate::optimization::line_search::LineSearchMethod;
|
use crate::optimization::line_search::LineSearchMethod;
|
||||||
use crate::optimization::{F, DF};
|
use crate::optimization::{F, DF};
|
||||||
|
|
||||||
pub trait FirstOrderOptimizer<T: FloatExt + Debug> {
|
pub trait FirstOrderOptimizer<T: FloatExt> {
|
||||||
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X>;
|
fn optimize<'a, X: Matrix<T>, LS: LineSearchMethod<T>>(&self, f: &F<T, X>, df: &'a DF<X>, x0: &X, ls: &'a LS) -> OptimizerResult<T, X>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct OptimizerResult<T: FloatExt + Debug, X: Matrix<T>>
|
pub struct OptimizerResult<T: FloatExt, X: Matrix<T>>
|
||||||
{
|
{
|
||||||
pub x: X,
|
pub x: X,
|
||||||
pub f_x: T,
|
pub f_x: T,
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ impl<T: FloatExt> Node<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NodeVisitor<'a, T: FloatExt + Debug, M: Matrix<T>> {
|
struct NodeVisitor<'a, T: FloatExt, M: Matrix<T>> {
|
||||||
x: &'a M,
|
x: &'a M,
|
||||||
y: &'a Vec<usize>,
|
y: &'a Vec<usize>,
|
||||||
node: usize,
|
node: usize,
|
||||||
@@ -115,7 +115,7 @@ fn impurity<T: FloatExt>(criterion: &SplitCriterion, count: &Vec<usize>, n: usiz
|
|||||||
return impurity;
|
return impurity;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: FloatExt + Debug, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
impl<'a, T: FloatExt, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
||||||
|
|
||||||
fn new(node_id: usize, samples: Vec<usize>, order: &'a Vec<Vec<usize>>, x: &'a M, y: &'a Vec<usize>, level: u16) -> Self {
|
fn new(node_id: usize, samples: Vec<usize>, order: &'a Vec<Vec<usize>>, x: &'a M, y: &'a Vec<usize>, level: u16) -> Self {
|
||||||
NodeVisitor {
|
NodeVisitor {
|
||||||
@@ -147,7 +147,7 @@ pub(in crate) fn which_max(x: &Vec<usize>) -> usize {
|
|||||||
return which;
|
return which;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> DecisionTreeClassifier<T> {
|
impl<T: FloatExt> DecisionTreeClassifier<T> {
|
||||||
|
|
||||||
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: DecisionTreeClassifierParameters) -> DecisionTreeClassifier<T> {
|
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: DecisionTreeClassifierParameters) -> DecisionTreeClassifier<T> {
|
||||||
let (x_nrows, num_attributes) = x.shape();
|
let (x_nrows, num_attributes) = x.shape();
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ impl<T: FloatExt> Node<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NodeVisitor<'a, T: FloatExt + Debug, M: Matrix<T>> {
|
struct NodeVisitor<'a, T: FloatExt, M: Matrix<T>> {
|
||||||
x: &'a M,
|
x: &'a M,
|
||||||
y: &'a M,
|
y: &'a M,
|
||||||
node: usize,
|
node: usize,
|
||||||
@@ -67,7 +67,7 @@ struct NodeVisitor<'a, T: FloatExt + Debug, M: Matrix<T>> {
|
|||||||
level: u16
|
level: u16
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: FloatExt + Debug, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
impl<'a, T: FloatExt, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
||||||
|
|
||||||
fn new(node_id: usize, samples: Vec<usize>, order: &'a Vec<Vec<usize>>, x: &'a M, y: &'a M, level: u16) -> Self {
|
fn new(node_id: usize, samples: Vec<usize>, order: &'a Vec<Vec<usize>>, x: &'a M, y: &'a M, level: u16) -> Self {
|
||||||
NodeVisitor {
|
NodeVisitor {
|
||||||
@@ -84,7 +84,7 @@ impl<'a, T: FloatExt + Debug, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: FloatExt + Debug> DecisionTreeRegressor<T> {
|
impl<T: FloatExt> DecisionTreeRegressor<T> {
|
||||||
|
|
||||||
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: DecisionTreeRegressorParameters) -> DecisionTreeRegressor<T> {
|
pub fn fit<M: Matrix<T>>(x: &M, y: &M::RowVector, parameters: DecisionTreeRegressorParameters) -> DecisionTreeRegressor<T> {
|
||||||
let (x_nrows, num_attributes) = x.shape();
|
let (x_nrows, num_attributes) = x.shape();
|
||||||
|
|||||||
Reference in New Issue
Block a user