@@ -322,16 +322,18 @@ impl<'a, TX: Number + RealNumber, TY: Number + Ord, X: Array2<TX> + 'a, Y: Array
322
322
let ( n, _) = x. shape ( ) ;
323
323
let mut y_hat: Vec < TX > = Array1 :: zeros ( n) ;
324
324
325
+ let mut row = Vec :: with_capacity ( n) ;
325
326
for i in 0 ..n {
326
- let row_pred: TX =
327
- self . predict_for_row ( Vec :: from_iterator ( x. get_row ( i) . iterator ( 0 ) . copied ( ) , n) ) ;
327
+ row. clear ( ) ;
328
+ row. extend ( x. get_row ( i) . iterator ( 0 ) . copied ( ) ) ;
329
+ let row_pred: TX = self . predict_for_row ( & row) ;
328
330
y_hat. set ( i, row_pred) ;
329
331
}
330
332
331
333
Ok ( y_hat)
332
334
}
333
335
334
- fn predict_for_row ( & self , x : Vec < TX > ) -> TX {
336
+ fn predict_for_row ( & self , x : & [ TX ] ) -> TX {
335
337
let mut f = self . b . unwrap ( ) ;
336
338
337
339
for i in 0 ..self . instances . as_ref ( ) . unwrap ( ) . len ( ) {
@@ -472,14 +474,12 @@ impl<'a, TX: Number + RealNumber, TY: Number + Ord, X: Array2<TX>, Y: Array1<TY>
472
474
let tol = self . parameters . tol ;
473
475
let good_enough = TX :: from_i32 ( 1000 ) . unwrap ( ) ;
474
476
477
+ let mut x = Vec :: with_capacity ( n) ;
475
478
for _ in 0 ..self . parameters . epoch {
476
479
for i in self . permutate ( n) {
477
- self . process (
478
- i,
479
- Vec :: from_iterator ( self . x . get_row ( i) . iterator ( 0 ) . copied ( ) , n) ,
480
- * self . y . get ( i) ,
481
- & mut cache,
482
- ) ;
480
+ x. clear ( ) ;
481
+ x. extend ( self . x . get_row ( i) . iterator ( 0 ) . take ( n) . copied ( ) ) ;
482
+ self . process ( i, & x, * self . y . get ( i) , & mut cache) ;
483
483
loop {
484
484
self . reprocess ( tol, & mut cache) ;
485
485
self . find_min_max_gradient ( ) ;
@@ -511,24 +511,17 @@ impl<'a, TX: Number + RealNumber, TY: Number + Ord, X: Array2<TX>, Y: Array1<TY>
511
511
let mut cp = 0 ;
512
512
let mut cn = 0 ;
513
513
514
+ let mut x = Vec :: with_capacity ( n) ;
514
515
for i in self . permutate ( n) {
516
+ x. clear ( ) ;
517
+ x. extend ( self . x . get_row ( i) . iterator ( 0 ) . take ( n) . copied ( ) ) ;
515
518
if * self . y . get ( i) == TY :: one ( ) && cp < few {
516
- if self . process (
517
- i,
518
- Vec :: from_iterator ( self . x . get_row ( i) . iterator ( 0 ) . copied ( ) , n) ,
519
- * self . y . get ( i) ,
520
- cache,
521
- ) {
519
+ if self . process ( i, & x, * self . y . get ( i) , cache) {
522
520
cp += 1 ;
523
521
}
524
522
} else if * self . y . get ( i) == TY :: from ( -1 ) . unwrap ( )
525
523
&& cn < few
526
- && self . process (
527
- i,
528
- Vec :: from_iterator ( self . x . get_row ( i) . iterator ( 0 ) . copied ( ) , n) ,
529
- * self . y . get ( i) ,
530
- cache,
531
- )
524
+ && self . process ( i, & x, * self . y . get ( i) , cache)
532
525
{
533
526
cn += 1 ;
534
527
}
@@ -539,7 +532,7 @@ impl<'a, TX: Number + RealNumber, TY: Number + Ord, X: Array2<TX>, Y: Array1<TY>
539
532
}
540
533
}
541
534
542
- fn process ( & mut self , i : usize , x : Vec < TX > , y : TY , cache : & mut Cache < TX , TY , X , Y > ) -> bool {
535
+ fn process ( & mut self , i : usize , x : & [ TX ] , y : TY , cache : & mut Cache < TX , TY , X , Y > ) -> bool {
543
536
for j in 0 ..self . sv . len ( ) {
544
537
if self . sv [ j] . index == i {
545
538
return true ;
0 commit comments