Skip to content

Commit 1ce18b5

Browse files
Merge pull request #37 from smartcorelib/elasticnet
Elastic Net
2 parents 413f1a0 + cceb2f0 commit 1ce18b5

File tree

8 files changed

+714
-252
lines changed

8 files changed

+714
-252
lines changed

src/linalg/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,9 @@ pub trait BaseVector<T: RealNumber>: Clone + Debug {
271271
fn std(&self) -> T {
272272
self.var().sqrt()
273273
}
274+
275+
/// Copies content of `other` vector.
276+
fn copy_from(&mut self, other: &Self);
274277
}
275278

276279
/// Generic matrix type.

src/linalg/naive/dense_matrix.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,18 @@ impl<T: RealNumber> BaseVector<T> for Vec<T> {
177177
result.dedup();
178178
result
179179
}
180+
181+
fn copy_from(&mut self, other: &Self) {
182+
if self.len() != other.len() {
183+
panic!(
184+
"Can't copy vector of length {} into a vector of length {}.",
185+
self.len(),
186+
other.len()
187+
);
188+
}
189+
190+
self[..].clone_from_slice(&other[..]);
191+
}
180192
}
181193

182194
/// Column-major, dense matrix. See [Simple Dense Matrix](../index.html).
@@ -915,9 +927,7 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
915927
);
916928
}
917929

918-
for i in 0..self.values.len() {
919-
self.values[i] = other.values[i];
920-
}
930+
self.values[..].clone_from_slice(&other.values[..]);
921931
}
922932

923933
fn abs_mut(&mut self) -> &Self {
@@ -1052,6 +1062,14 @@ mod tests {
10521062
assert_eq!(32.0, BaseVector::dot(&v1, &v2));
10531063
}
10541064

1065+
#[test]
1066+
fn vec_copy_from() {
1067+
let mut v1 = vec![1., 2., 3.];
1068+
let v2 = vec![4., 5., 6.];
1069+
v1.copy_from(&v2);
1070+
assert_eq!(v1, v2);
1071+
}
1072+
10551073
#[test]
10561074
fn vec_approximate_eq() {
10571075
let a = vec![1., 2., 3.];
@@ -1185,6 +1203,14 @@ mod tests {
11851203
assert_eq!(a.dot(&b), 32.);
11861204
}
11871205

1206+
#[test]
1207+
fn copy_from() {
1208+
let mut a = DenseMatrix::from_2d_array(&[&[1., 2.], &[3., 4.], &[5., 6.]]);
1209+
let b = DenseMatrix::from_2d_array(&[&[7., 8.], &[9., 10.], &[11., 12.]]);
1210+
a.copy_from(&b);
1211+
assert_eq!(a, b);
1212+
}
1213+
11881214
#[test]
11891215
fn slice() {
11901216
let m = DenseMatrix::from_2d_array(&[

src/linalg/nalgebra_bindings.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ impl<T: RealNumber + 'static> BaseVector<T> for MatrixMN<T, U1, Dynamic> {
181181
result.dedup();
182182
result
183183
}
184+
185+
fn copy_from(&mut self, other: &Self) {
186+
Matrix::copy_from(self, other);
187+
}
184188
}
185189

186190
impl<T: RealNumber + Scalar + AddAssign + SubAssign + MulAssign + DivAssign + Sum + 'static>
@@ -575,6 +579,16 @@ mod tests {
575579
use crate::linear::linear_regression::*;
576580
use nalgebra::{DMatrix, Matrix2x3, RowDVector};
577581

582+
#[test]
583+
fn vec_copy_from() {
584+
let mut v1 = RowDVector::from_vec(vec![1., 2., 3.]);
585+
let mut v2 = RowDVector::from_vec(vec![4., 5., 6.]);
586+
v1.copy_from(&v2);
587+
assert_eq!(v2, v1);
588+
v2[0] = 10.0;
589+
assert_ne!(v2, v1);
590+
}
591+
578592
#[test]
579593
fn vec_len() {
580594
let v = RowDVector::from_vec(vec![1., 2., 3.]);

src/linalg/ndarray_bindings.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ impl<T: RealNumber + ScalarOperand> BaseVector<T> for ArrayBase<OwnedRepr<T>, Ix
176176
result.dedup();
177177
result
178178
}
179+
180+
fn copy_from(&mut self, other: &Self) {
181+
self.assign(&other);
182+
}
179183
}
180184

181185
impl<T: RealNumber + ScalarOperand + AddAssign + SubAssign + MulAssign + DivAssign + Sum>
@@ -537,6 +541,16 @@ mod tests {
537541
assert_eq!(5., BaseVector::get(&result, 1));
538542
}
539543

544+
#[test]
545+
fn vec_copy_from() {
546+
let mut v1 = arr1(&[1., 2., 3.]);
547+
let mut v2 = arr1(&[4., 5., 6.]);
548+
v1.copy_from(&v2);
549+
assert_eq!(v1, v2);
550+
v2[0] = 10.0;
551+
assert_ne!(v1, v2);
552+
}
553+
540554
#[test]
541555
fn vec_len() {
542556
let v = arr1(&[1., 2., 3.]);

0 commit comments

Comments
 (0)