6
6
use std:: sync:: Arc ;
7
7
8
8
use super :: storage:: { DistCalculator , VectorStorage } ;
9
+ use arrow:: array:: AsArray ;
9
10
use arrow_array:: types:: Float32Type ;
11
+ use arrow_array:: ArrayRef ;
10
12
use lance_linalg:: { distance:: MetricType , MatrixView } ;
11
13
12
14
/// All data are stored in memory
@@ -26,7 +28,7 @@ impl InMemoryVectorStorage {
26
28
}
27
29
}
28
30
29
- pub fn vector ( & self , id : u32 ) -> & [ f32 ] {
31
+ pub fn vector ( & self , id : u32 ) -> ArrayRef {
30
32
self . vectors . row ( id as usize ) . unwrap ( )
31
33
}
32
34
}
@@ -48,40 +50,40 @@ impl VectorStorage for InMemoryVectorStorage {
48
50
self . metric_type
49
51
}
50
52
51
- fn dist_calculator ( & self , query : & [ f32 ] ) -> Box < dyn DistCalculator > {
53
+ fn dist_calculator ( & self , query : ArrayRef ) -> Box < dyn DistCalculator > {
52
54
Box :: new ( InMemoryDistanceCal {
53
55
vectors : self . vectors . clone ( ) ,
54
- query : query . to_vec ( ) ,
56
+ query,
55
57
metric_type : self . metric_type ,
56
58
} )
57
59
}
58
60
59
61
fn dist_calculator_from_id ( & self , id : u32 ) -> Box < dyn DistCalculator > {
60
62
Box :: new ( InMemoryDistanceCal {
61
63
vectors : self . vectors . clone ( ) ,
62
- query : self . vectors . row ( id as usize ) . unwrap ( ) . to_vec ( ) ,
64
+ query : self . vectors . row ( id as usize ) . unwrap ( ) ,
63
65
metric_type : self . metric_type ,
64
66
} )
65
67
}
66
68
67
69
/// Distance between two vectors.
68
70
fn distance_between ( & self , a : u32 , b : u32 ) -> f32 {
69
- let vector1 = self . vectors . row ( a as usize ) . unwrap ( ) ;
70
- let vector2 = self . vectors . row ( b as usize ) . unwrap ( ) ;
71
+ let vector1 = self . vectors . row_ref ( a as usize ) . unwrap ( ) ;
72
+ let vector2 = self . vectors . row_ref ( b as usize ) . unwrap ( ) ;
71
73
self . metric_type . func ( ) ( vector1, vector2)
72
74
}
73
75
}
74
76
75
77
struct InMemoryDistanceCal {
76
78
vectors : Arc < MatrixView < Float32Type > > ,
77
- query : Vec < f32 > ,
79
+ query : ArrayRef ,
78
80
metric_type : MetricType ,
79
81
}
80
82
81
83
impl DistCalculator for InMemoryDistanceCal {
82
84
#[ inline]
83
85
fn distance ( & self , id : u32 ) -> f32 {
84
- let vector = self . vectors . row ( id as usize ) . unwrap ( ) ;
85
- self . metric_type . func ( ) ( & self . query , vector)
86
+ let vector = self . vectors . row_ref ( id as usize ) . unwrap ( ) ;
87
+ self . metric_type . func ( ) ( self . query . as_primitive :: < Float32Type > ( ) . values ( ) , vector)
86
88
}
87
89
}
0 commit comments