sparse_rs/
sparse_vector.rs1use std::collections::BTreeMap;
2use std::ops::{Index, Mul};
3use num::Zero;
4
5pub struct SparseVector<T> {
6 len: usize,
7 data: BTreeMap<usize, T>,
8 zero: T,
9}
10
11impl<T: Zero> SparseVector<T> {
12 pub fn insert(&mut self, index: usize, value: T) {
13 self.data.insert(index, value);
14 }
15}
16
17impl<T: Zero> SparseVector<T> {
18 pub fn zero(len: usize) -> SparseVector<T> {
19 SparseVector {
20 len: len,
21 data: BTreeMap::new(),
22 zero: T::zero(),
23 }
24 }
25}
26
27impl<T: Zero> Index<usize> for SparseVector<T> {
28 type Output = T;
29
30 fn index(&self, idx: usize) -> &T {
31 match self.data.get(&idx) {
32 Some(x) => x,
33 None => &self.zero,
34 }
35 }
36}
37
38impl<T: Mul<Output=T> + Clone + Zero> Mul<SparseVector<T>> for SparseVector<T> {
39 type Output = SparseVector<T>;
40
41 fn mul(self, rhs: SparseVector<T>) -> SparseVector<T> {
42 let data = self.data.into_iter().filter_map(|(key, value)| {
43 match rhs.data.get(&key) {
44 Some(r) => Some((key, r.clone() * value)),
45 None => None,
46 }
47 }).collect();
48 SparseVector {
49 len: self.len,
50 data: data,
51 zero: self.zero,
52 }
53 }
54}
55
56 #[test]
57 fn mul_test() {
58 let mut lhs = SparseVector::zero(3);
59 lhs.insert(1, 3);
60 lhs.insert(2, 3);
61
62 let mut rhs = SparseVector::zero(3);
63 rhs.insert(1,2);
64 rhs.insert(0,1);
65
66 let product = lhs * rhs;
67 assert_eq!(product[0], 0);
68 assert_eq!(product[1], 6);
69 assert_eq!(product[2], 0);
70 }