@@ -35,12 +35,15 @@ impl SparseVector {
35
35
}
36
36
}
37
37
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 ( ) ;
44
47
45
48
SparseVector {
46
49
dim,
@@ -107,7 +110,7 @@ impl SparseVector {
107
110
#[ cfg( test) ]
108
111
mod tests {
109
112
use crate :: SparseVector ;
110
- use std:: collections:: HashMap ;
113
+ use std:: collections:: { BTreeMap , HashMap } ;
111
114
112
115
#[ test]
113
116
fn test_from_dense ( ) {
@@ -119,19 +122,22 @@ mod tests {
119
122
}
120
123
121
124
#[ 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 ) ;
125
128
assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
126
129
assert_eq ! ( 6 , vec. dimensions( ) ) ;
127
130
assert_eq ! ( & [ 0 , 2 , 4 ] , vec. indices( ) ) ;
128
131
assert_eq ! ( & [ 1.0 , 2.0 , 3.0 ] , vec. values( ) ) ;
129
132
}
130
133
131
134
#[ 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 ) ;
135
138
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( ) ) ;
136
142
}
137
143
}
0 commit comments