Merge branch 'development' into elasticnet
This commit is contained in:
+34
-34
@@ -99,27 +99,27 @@ pub trait EVDDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
|
||||
fn tred2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<T>) {
|
||||
let (n, _) = V.shape();
|
||||
for i in 0..n {
|
||||
d[i] = V.get(n - 1, i);
|
||||
for (i, d_i) in d.iter_mut().enumerate().take(n) {
|
||||
*d_i = V.get(n - 1, i);
|
||||
}
|
||||
|
||||
for i in (1..n).rev() {
|
||||
let mut scale = T::zero();
|
||||
let mut h = T::zero();
|
||||
for k in 0..i {
|
||||
scale += d[k].abs();
|
||||
for d_k in d.iter().take(i) {
|
||||
scale += d_k.abs();
|
||||
}
|
||||
if scale == T::zero() {
|
||||
e[i] = d[i - 1];
|
||||
for j in 0..i {
|
||||
d[j] = V.get(i - 1, j);
|
||||
for (j, d_j) in d.iter_mut().enumerate().take(i) {
|
||||
*d_j = V.get(i - 1, j);
|
||||
V.set(i, j, T::zero());
|
||||
V.set(j, i, T::zero());
|
||||
}
|
||||
} else {
|
||||
for k in 0..i {
|
||||
d[k] /= scale;
|
||||
h += d[k] * d[k];
|
||||
for d_k in d.iter_mut().take(i) {
|
||||
*d_k /= scale;
|
||||
h += (*d_k) * (*d_k);
|
||||
}
|
||||
let mut f = d[i - 1];
|
||||
let mut g = h.sqrt();
|
||||
@@ -129,8 +129,8 @@ fn tred2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec
|
||||
e[i] = scale * g;
|
||||
h -= f * g;
|
||||
d[i - 1] = f - g;
|
||||
for j in 0..i {
|
||||
e[j] = T::zero();
|
||||
for e_j in e.iter_mut().take(i) {
|
||||
*e_j = T::zero();
|
||||
}
|
||||
|
||||
for j in 0..i {
|
||||
@@ -170,16 +170,16 @@ fn tred2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec
|
||||
V.set(i, i, T::one());
|
||||
let h = d[i + 1];
|
||||
if h != T::zero() {
|
||||
for k in 0..=i {
|
||||
d[k] = V.get(k, i + 1) / h;
|
||||
for (k, d_k) in d.iter_mut().enumerate().take(i + 1) {
|
||||
*d_k = V.get(k, i + 1) / h;
|
||||
}
|
||||
for j in 0..=i {
|
||||
let mut g = T::zero();
|
||||
for k in 0..=i {
|
||||
g += V.get(k, i + 1) * V.get(k, j);
|
||||
}
|
||||
for k in 0..=i {
|
||||
V.sub_element_mut(k, j, g * d[k]);
|
||||
for (k, d_k) in d.iter().enumerate().take(i + 1) {
|
||||
V.sub_element_mut(k, j, g * (*d_k));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -187,8 +187,8 @@ fn tred2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec
|
||||
V.set(k, i + 1, T::zero());
|
||||
}
|
||||
}
|
||||
for j in 0..n {
|
||||
d[j] = V.get(n - 1, j);
|
||||
for (j, d_j) in d.iter_mut().enumerate().take(n) {
|
||||
*d_j = V.get(n - 1, j);
|
||||
V.set(n - 1, j, T::zero());
|
||||
}
|
||||
V.set(n - 1, n - 1, T::one());
|
||||
@@ -238,8 +238,8 @@ fn tql2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<
|
||||
d[l + 1] = e[l] * (p + r);
|
||||
let dl1 = d[l + 1];
|
||||
let mut h = g - d[l];
|
||||
for i in l + 2..n {
|
||||
d[i] -= h;
|
||||
for d_i in d.iter_mut().take(n).skip(l + 2) {
|
||||
*d_i -= h;
|
||||
}
|
||||
f += h;
|
||||
|
||||
@@ -285,10 +285,10 @@ fn tql2<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, d: &mut Vec<T>, e: &mut Vec<
|
||||
for i in 0..n - 1 {
|
||||
let mut k = i;
|
||||
let mut p = d[i];
|
||||
for j in i + 1..n {
|
||||
if d[j] > p {
|
||||
for (j, d_j) in d.iter().enumerate().take(n).skip(i + 1) {
|
||||
if *d_j > p {
|
||||
k = j;
|
||||
p = d[j];
|
||||
p = *d_j;
|
||||
}
|
||||
}
|
||||
if k != i {
|
||||
@@ -316,7 +316,7 @@ fn balance<T: RealNumber, M: BaseMatrix<T>>(A: &mut M) -> Vec<T> {
|
||||
let mut done = false;
|
||||
while !done {
|
||||
done = true;
|
||||
for i in 0..n {
|
||||
for (i, scale_i) in scale.iter_mut().enumerate().take(n) {
|
||||
let mut r = T::zero();
|
||||
let mut c = T::zero();
|
||||
for j in 0..n {
|
||||
@@ -341,7 +341,7 @@ fn balance<T: RealNumber, M: BaseMatrix<T>>(A: &mut M) -> Vec<T> {
|
||||
if (c + r) / f < t * s {
|
||||
done = false;
|
||||
g = T::one() / f;
|
||||
scale[i] *= f;
|
||||
*scale_i *= f;
|
||||
for j in 0..n {
|
||||
A.mul_element_mut(i, j, g);
|
||||
}
|
||||
@@ -360,7 +360,7 @@ fn elmhes<T: RealNumber, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
||||
let (n, _) = A.shape();
|
||||
let mut perm = vec![0; n];
|
||||
|
||||
for m in 1..n - 1 {
|
||||
for (m, perm_m) in perm.iter_mut().enumerate().take(n - 1).skip(1) {
|
||||
let mut x = T::zero();
|
||||
let mut i = m;
|
||||
for j in m..n {
|
||||
@@ -369,7 +369,7 @@ fn elmhes<T: RealNumber, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
perm[m] = i;
|
||||
*perm_m = i;
|
||||
if i != m {
|
||||
for j in (m - 1)..n {
|
||||
let swap = A.get(i, j);
|
||||
@@ -402,7 +402,7 @@ fn elmhes<T: RealNumber, M: BaseMatrix<T>>(A: &mut M) -> Vec<usize> {
|
||||
perm
|
||||
}
|
||||
|
||||
fn eltran<T: RealNumber, M: BaseMatrix<T>>(A: &M, V: &mut M, perm: &Vec<usize>) {
|
||||
fn eltran<T: RealNumber, M: BaseMatrix<T>>(A: &M, V: &mut M, perm: &[usize]) {
|
||||
let (n, _) = A.shape();
|
||||
for mp in (1..n - 1).rev() {
|
||||
for k in mp + 1..n {
|
||||
@@ -774,11 +774,11 @@ fn hqr2<T: RealNumber, M: BaseMatrix<T>>(A: &mut M, V: &mut M, d: &mut Vec<T>, e
|
||||
}
|
||||
}
|
||||
|
||||
fn balbak<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, scale: &Vec<T>) {
|
||||
fn balbak<T: RealNumber, M: BaseMatrix<T>>(V: &mut M, scale: &[T]) {
|
||||
let (n, _) = V.shape();
|
||||
for i in 0..n {
|
||||
for (i, scale_i) in scale.iter().enumerate().take(n) {
|
||||
for j in 0..n {
|
||||
V.mul_element_mut(i, j, scale[i]);
|
||||
V.mul_element_mut(i, j, *scale_i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -789,8 +789,8 @@ fn sort<T: RealNumber, M: BaseMatrix<T>>(d: &mut Vec<T>, e: &mut Vec<T>, V: &mut
|
||||
for j in 1..n {
|
||||
let real = d[j];
|
||||
let img = e[j];
|
||||
for k in 0..n {
|
||||
temp[k] = V.get(k, j);
|
||||
for (k, temp_k) in temp.iter_mut().enumerate().take(n) {
|
||||
*temp_k = V.get(k, j);
|
||||
}
|
||||
let mut i = j as i32 - 1;
|
||||
while i >= 0 {
|
||||
@@ -806,8 +806,8 @@ fn sort<T: RealNumber, M: BaseMatrix<T>>(d: &mut Vec<T>, e: &mut Vec<T>, V: &mut
|
||||
}
|
||||
d[i as usize + 1] = real;
|
||||
e[i as usize + 1] = img;
|
||||
for k in 0..n {
|
||||
V.set(k, i as usize + 1, temp[k]);
|
||||
for (k, temp_k) in temp.iter().enumerate().take(n) {
|
||||
V.set(k, i as usize + 1, *temp_k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-8
@@ -202,24 +202,21 @@ pub trait LUDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
fn lu_mut(mut self) -> Result<LU<T, Self>, Failed> {
|
||||
let (m, n) = self.shape();
|
||||
|
||||
let mut piv = vec![0; m];
|
||||
for i in 0..m {
|
||||
piv[i] = i;
|
||||
}
|
||||
let mut piv = (0..m).collect::<Vec<_>>();
|
||||
|
||||
let mut pivsign = 1;
|
||||
let mut LUcolj = vec![T::zero(); m];
|
||||
|
||||
for j in 0..n {
|
||||
for i in 0..m {
|
||||
LUcolj[i] = self.get(i, j);
|
||||
for (i, LUcolj_i) in LUcolj.iter_mut().enumerate().take(m) {
|
||||
*LUcolj_i = self.get(i, j);
|
||||
}
|
||||
|
||||
for i in 0..m {
|
||||
let kmax = usize::min(i, j);
|
||||
let mut s = T::zero();
|
||||
for k in 0..kmax {
|
||||
s += self.get(i, k) * LUcolj[k];
|
||||
for (k, LUcolj_k) in LUcolj.iter().enumerate().take(kmax) {
|
||||
s += self.get(i, k) * (*LUcolj_k);
|
||||
}
|
||||
|
||||
LUcolj[i] -= s;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(clippy::ptr_arg)]
|
||||
use std::fmt;
|
||||
use std::fmt::Debug;
|
||||
use std::marker::PhantomData;
|
||||
@@ -164,8 +165,8 @@ impl<T: RealNumber> BaseVector<T> for Vec<T> {
|
||||
|
||||
fn sum(&self) -> T {
|
||||
let mut sum = T::zero();
|
||||
for i in 0..self.len() {
|
||||
sum += self[i];
|
||||
for self_i in self.iter() {
|
||||
sum += *self_i;
|
||||
}
|
||||
sum
|
||||
}
|
||||
@@ -253,9 +254,9 @@ impl<T: RealNumber> DenseMatrix<T> {
|
||||
nrows,
|
||||
values: vec![T::zero(); ncols * nrows],
|
||||
};
|
||||
for row in 0..nrows {
|
||||
for col in 0..ncols {
|
||||
m.set(row, col, values[row][col]);
|
||||
for (row_index, row) in values.iter().enumerate().take(nrows) {
|
||||
for (col_index, value) in row.iter().enumerate().take(ncols) {
|
||||
m.set(row_index, col_index, *value);
|
||||
}
|
||||
}
|
||||
m
|
||||
@@ -273,7 +274,7 @@ impl<T: RealNumber> DenseMatrix<T> {
|
||||
/// * `nrows` - number of rows in new matrix.
|
||||
/// * `ncols` - number of columns in new matrix.
|
||||
/// * `values` - values to initialize the matrix.
|
||||
pub fn from_vec(nrows: usize, ncols: usize, values: &Vec<T>) -> DenseMatrix<T> {
|
||||
pub fn from_vec(nrows: usize, ncols: usize, values: &[T]) -> DenseMatrix<T> {
|
||||
let mut m = DenseMatrix {
|
||||
ncols,
|
||||
nrows,
|
||||
@@ -557,8 +558,8 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
|
||||
fn get_row(&self, row: usize) -> Self::RowVector {
|
||||
let mut v = vec![T::zero(); self.ncols];
|
||||
|
||||
for c in 0..self.ncols {
|
||||
v[c] = self.get(row, c);
|
||||
for (c, v_c) in v.iter_mut().enumerate().take(self.ncols) {
|
||||
*v_c = self.get(row, c);
|
||||
}
|
||||
|
||||
v
|
||||
@@ -566,29 +567,29 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
|
||||
|
||||
fn get_row_as_vec(&self, row: usize) -> Vec<T> {
|
||||
let mut result = vec![T::zero(); self.ncols];
|
||||
for c in 0..self.ncols {
|
||||
result[c] = self.get(row, c);
|
||||
for (c, result_c) in result.iter_mut().enumerate().take(self.ncols) {
|
||||
*result_c = self.get(row, c);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn copy_row_as_vec(&self, row: usize, result: &mut Vec<T>) {
|
||||
for c in 0..self.ncols {
|
||||
result[c] = self.get(row, c);
|
||||
for (c, result_c) in result.iter_mut().enumerate().take(self.ncols) {
|
||||
*result_c = self.get(row, c);
|
||||
}
|
||||
}
|
||||
|
||||
fn get_col_as_vec(&self, col: usize) -> Vec<T> {
|
||||
let mut result = vec![T::zero(); self.nrows];
|
||||
for r in 0..self.nrows {
|
||||
result[r] = self.get(r, col);
|
||||
for (r, result_r) in result.iter_mut().enumerate().take(self.nrows) {
|
||||
*result_r = self.get(r, col);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn copy_col_as_vec(&self, col: usize, result: &mut Vec<T>) {
|
||||
for r in 0..self.nrows {
|
||||
result[r] = self.get(r, col);
|
||||
for (r, result_r) in result.iter_mut().enumerate().take(self.nrows) {
|
||||
*result_r = self.get(r, col);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -850,13 +851,13 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
|
||||
let mut mean = vec![T::zero(); self.ncols];
|
||||
|
||||
for r in 0..self.nrows {
|
||||
for c in 0..self.ncols {
|
||||
mean[c] += self.get(r, c);
|
||||
for (c, mean_c) in mean.iter_mut().enumerate().take(self.ncols) {
|
||||
*mean_c += self.get(r, c);
|
||||
}
|
||||
}
|
||||
|
||||
for i in 0..mean.len() {
|
||||
mean[i] /= T::from(self.nrows).unwrap();
|
||||
for mean_i in mean.iter_mut() {
|
||||
*mean_i /= T::from(self.nrows).unwrap();
|
||||
}
|
||||
|
||||
mean
|
||||
@@ -1003,7 +1004,7 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
|
||||
fn argmax(&self) -> Vec<usize> {
|
||||
let mut res = vec![0usize; self.nrows];
|
||||
|
||||
for r in 0..self.nrows {
|
||||
for (r, res_r) in res.iter_mut().enumerate().take(self.nrows) {
|
||||
let mut max = T::neg_infinity();
|
||||
let mut max_pos = 0usize;
|
||||
for c in 0..self.ncols {
|
||||
@@ -1013,7 +1014,7 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
|
||||
max_pos = c;
|
||||
}
|
||||
}
|
||||
res[r] = max_pos;
|
||||
*res_r = max_pos;
|
||||
}
|
||||
|
||||
res
|
||||
|
||||
+4
-4
@@ -44,8 +44,8 @@ pub struct QR<T: RealNumber, M: BaseMatrix<T>> {
|
||||
impl<T: RealNumber, M: BaseMatrix<T>> QR<T, M> {
|
||||
pub(crate) fn new(QR: M, tau: Vec<T>) -> QR<T, M> {
|
||||
let mut singular = false;
|
||||
for j in 0..tau.len() {
|
||||
if tau[j] == T::zero() {
|
||||
for tau_elem in tau.iter() {
|
||||
if *tau_elem == T::zero() {
|
||||
singular = true;
|
||||
break;
|
||||
}
|
||||
@@ -153,7 +153,7 @@ pub trait QRDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
|
||||
let mut r_diagonal: Vec<T> = vec![T::zero(); n];
|
||||
|
||||
for k in 0..n {
|
||||
for (k, r_diagonal_k) in r_diagonal.iter_mut().enumerate().take(n) {
|
||||
let mut nrm = T::zero();
|
||||
for i in k..m {
|
||||
nrm = nrm.hypot(self.get(i, k));
|
||||
@@ -179,7 +179,7 @@ pub trait QRDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
}
|
||||
}
|
||||
}
|
||||
r_diagonal[k] = -nrm;
|
||||
*r_diagonal_k = -nrm;
|
||||
}
|
||||
|
||||
Ok(QR::new(self, r_diagonal))
|
||||
|
||||
+8
-8
@@ -22,14 +22,14 @@ pub trait MatrixStats<T: RealNumber>: BaseMatrix<T> {
|
||||
|
||||
let div = T::from_usize(m).unwrap();
|
||||
|
||||
for i in 0..n {
|
||||
for (i, x_i) in x.iter_mut().enumerate().take(n) {
|
||||
for j in 0..m {
|
||||
x[i] += match axis {
|
||||
*x_i += match axis {
|
||||
0 => self.get(j, i),
|
||||
_ => self.get(i, j),
|
||||
};
|
||||
}
|
||||
x[i] /= div;
|
||||
*x_i /= div;
|
||||
}
|
||||
|
||||
x
|
||||
@@ -49,7 +49,7 @@ pub trait MatrixStats<T: RealNumber>: BaseMatrix<T> {
|
||||
|
||||
let div = T::from_usize(m).unwrap();
|
||||
|
||||
for i in 0..n {
|
||||
for (i, x_i) in x.iter_mut().enumerate().take(n) {
|
||||
let mut mu = T::zero();
|
||||
let mut sum = T::zero();
|
||||
for j in 0..m {
|
||||
@@ -61,7 +61,7 @@ pub trait MatrixStats<T: RealNumber>: BaseMatrix<T> {
|
||||
sum += a * a;
|
||||
}
|
||||
mu /= div;
|
||||
x[i] = sum / div - mu * mu;
|
||||
*x_i = sum / div - mu * mu;
|
||||
}
|
||||
|
||||
x
|
||||
@@ -76,15 +76,15 @@ pub trait MatrixStats<T: RealNumber>: BaseMatrix<T> {
|
||||
_ => self.shape().0,
|
||||
};
|
||||
|
||||
for i in 0..n {
|
||||
x[i] = x[i].sqrt();
|
||||
for x_i in x.iter_mut().take(n) {
|
||||
*x_i = x_i.sqrt();
|
||||
}
|
||||
|
||||
x
|
||||
}
|
||||
|
||||
/// standardize values by removing the mean and scaling to unit variance
|
||||
fn scale_mut(&mut self, mean: &Vec<T>, std: &Vec<T>, axis: u8) {
|
||||
fn scale_mut(&mut self, mean: &[T], std: &[T], axis: u8) {
|
||||
let (n, m) = match axis {
|
||||
0 => {
|
||||
let (n, m) = self.shape();
|
||||
|
||||
+16
-16
@@ -156,8 +156,8 @@ pub trait SVDDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
let h = f * g - s;
|
||||
U.set(i, l - 1, f - g);
|
||||
|
||||
for k in l - 1..n {
|
||||
rv1[k] = U.get(i, k) / h;
|
||||
for (k, rv1_k) in rv1.iter_mut().enumerate().take(n).skip(l - 1) {
|
||||
*rv1_k = U.get(i, k) / h;
|
||||
}
|
||||
|
||||
for j in l - 1..m {
|
||||
@@ -166,8 +166,8 @@ pub trait SVDDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
s += U.get(j, k) * U.get(i, k);
|
||||
}
|
||||
|
||||
for k in l - 1..n {
|
||||
U.add_element_mut(j, k, s * rv1[k]);
|
||||
for (k, rv1_k) in rv1.iter().enumerate().take(n).skip(l - 1) {
|
||||
U.add_element_mut(j, k, s * (*rv1_k));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -365,11 +365,11 @@ pub trait SVDDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
inc /= 3;
|
||||
for i in inc..n {
|
||||
let sw = w[i];
|
||||
for k in 0..m {
|
||||
su[k] = U.get(k, i);
|
||||
for (k, su_k) in su.iter_mut().enumerate().take(m) {
|
||||
*su_k = U.get(k, i);
|
||||
}
|
||||
for k in 0..n {
|
||||
sv[k] = v.get(k, i);
|
||||
for (k, sv_k) in sv.iter_mut().enumerate().take(n) {
|
||||
*sv_k = v.get(k, i);
|
||||
}
|
||||
let mut j = i;
|
||||
while w[j - inc] < sw {
|
||||
@@ -386,11 +386,11 @@ pub trait SVDDecomposableMatrix<T: RealNumber>: BaseMatrix<T> {
|
||||
}
|
||||
}
|
||||
w[j] = sw;
|
||||
for k in 0..m {
|
||||
U.set(k, j, su[k]);
|
||||
for (k, su_k) in su.iter().enumerate().take(m) {
|
||||
U.set(k, j, *su_k);
|
||||
}
|
||||
for k in 0..n {
|
||||
v.set(k, j, sv[k]);
|
||||
for (k, sv_k) in sv.iter().enumerate().take(n) {
|
||||
v.set(k, j, *sv_k);
|
||||
}
|
||||
}
|
||||
if inc <= 1 {
|
||||
@@ -454,7 +454,7 @@ impl<T: RealNumber, M: SVDDecomposableMatrix<T>> SVD<T, M> {
|
||||
|
||||
for k in 0..p {
|
||||
let mut tmp = vec![T::zero(); self.n];
|
||||
for j in 0..self.n {
|
||||
for (j, tmp_j) in tmp.iter_mut().enumerate().take(self.n) {
|
||||
let mut r = T::zero();
|
||||
if self.s[j] > self.tol {
|
||||
for i in 0..self.m {
|
||||
@@ -462,13 +462,13 @@ impl<T: RealNumber, M: SVDDecomposableMatrix<T>> SVD<T, M> {
|
||||
}
|
||||
r /= self.s[j];
|
||||
}
|
||||
tmp[j] = r;
|
||||
*tmp_j = r;
|
||||
}
|
||||
|
||||
for j in 0..self.n {
|
||||
let mut r = T::zero();
|
||||
for jj in 0..self.n {
|
||||
r += self.V.get(j, jj) * tmp[jj];
|
||||
for (jj, tmp_jj) in tmp.iter().enumerate().take(self.n) {
|
||||
r += self.V.get(j, jj) * (*tmp_jj);
|
||||
}
|
||||
b.set(j, k, r);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user