@@ -35,12 +35,15 @@ impl SparseVector {
3535 }
3636 }
3737
38- /// Creates a sparse vector from `(index, value)` pairs.
39- pub fn from_pairs < I : IntoIterator < Item = ( i32 , f32 ) > > ( pairs : I , dim : usize ) -> SparseVector {
40- let mut elements: Vec < ( i32 , f32 ) > = pairs. into_iter ( ) . filter ( |v| v. 1 != 0.0 ) . collect ( ) ;
41- elements. sort_by_key ( |v| v. 0 ) ;
42- let indices: Vec < i32 > = elements. iter ( ) . map ( |v| v. 0 ) . collect ( ) ;
43- let values: Vec < f32 > = elements. iter ( ) . map ( |v| v. 1 ) . collect ( ) ;
38+ /// Creates a sparse vector from a map of non-zero elements.
39+ pub fn from_map < ' a , I : IntoIterator < Item = ( & ' a i32 , & ' a f32 ) > > (
40+ map : I ,
41+ dim : usize ,
42+ ) -> SparseVector {
43+ let mut elements: Vec < ( & i32 , & f32 ) > = map. into_iter ( ) . filter ( |v| * v. 1 != 0.0 ) . collect ( ) ;
44+ elements. sort_by_key ( |v| * v. 0 ) ;
45+ let indices: Vec < i32 > = elements. iter ( ) . map ( |v| * v. 0 ) . collect ( ) ;
46+ let values: Vec < f32 > = elements. iter ( ) . map ( |v| * v. 1 ) . collect ( ) ;
4447
4548 SparseVector {
4649 dim,
@@ -107,7 +110,7 @@ impl SparseVector {
107110#[ cfg( test) ]
108111mod tests {
109112 use crate :: SparseVector ;
110- use std:: collections:: HashMap ;
113+ use std:: collections:: { BTreeMap , HashMap } ;
111114
112115 #[ test]
113116 fn test_from_dense ( ) {
@@ -119,19 +122,22 @@ mod tests {
119122 }
120123
121124 #[ test]
122- fn test_from_pairs_map ( ) {
123- let pairs = HashMap :: from ( [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ) ;
124- let vec = SparseVector :: from_pairs ( pairs , 6 ) ;
125+ fn test_from_hash_map ( ) {
126+ let map = HashMap :: from ( [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ) ;
127+ let vec = SparseVector :: from_map ( & map , 6 ) ;
125128 assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
126129 assert_eq ! ( 6 , vec. dimensions( ) ) ;
127130 assert_eq ! ( & [ 0 , 2 , 4 ] , vec. indices( ) ) ;
128131 assert_eq ! ( & [ 1.0 , 2.0 , 3.0 ] , vec. values( ) ) ;
129132 }
130133
131134 #[ test]
132- fn test_from_pairs_vec ( ) {
133- let pairs = vec ! [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ;
134- let vec = SparseVector :: from_pairs ( pairs , 6 ) ;
135+ fn test_from_btree_map ( ) {
136+ let map = BTreeMap :: from ( [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ) ;
137+ let vec = SparseVector :: from_map ( & map , 6 ) ;
135138 assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
139+ assert_eq ! ( 6 , vec. dimensions( ) ) ;
140+ assert_eq ! ( & [ 0 , 2 , 4 ] , vec. indices( ) ) ;
141+ assert_eq ! ( & [ 1.0 , 2.0 , 3.0 ] , vec. values( ) ) ;
136142 }
137143}
0 commit comments