tf_idf_vectorizer/utils/math/vector/
serde.rs

1use num::Num;
2use serde::{Serialize, Serializer, Deserialize, Deserializer};
3use serde::ser::SerializeStruct;
4use super::ZeroSpVec;
5
6impl<N> Serialize for ZeroSpVec<N>
7where
8    N: Num + Serialize + Copy,
9{
10    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where S: Serializer {
12        // シリアライズするフィールドは len, nnz, entries とする
13        let mut state = serializer.serialize_struct("ZeroSpVec", 3)?;
14        state.serialize_field("len", &self.len)?;
15        state.serialize_field("nnz", &self.nnz)?;
16        
17        // entries: (index, value) のVecとして順序付きに出力する
18        let mut entries = Vec::with_capacity(self.nnz);
19        unsafe {
20            for i in 0..self.nnz {
21                let idx = *self.ind_ptr().add(i);
22                let val = *self.val_ptr().add(i);
23                entries.push((idx, val));
24            }
25        }
26        state.serialize_field("entries", &entries)?;
27        state.end()
28    }
29}
30
31impl<'de, N> Deserialize<'de> for ZeroSpVec<N>
32where
33    N: Num + Deserialize<'de> + Copy,
34{
35    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
36    where D: Deserializer<'de> {
37        // 内部表現用の一時構造体
38        #[derive(Deserialize)]
39        struct ZeroSpVecData<N> {
40            len: usize,
41            nnz: usize,
42            entries: Vec<(usize, N)>,
43        }
44
45        let data = ZeroSpVecData::deserialize(deserializer)?;
46
47        // capacity は nnz の値で良いとする
48        let mut vec = ZeroSpVec::with_capacity(data.nnz);
49        vec.len = data.len;
50        vec.nnz = data.nnz;
51        // entries を内部バッファに移す
52        for (index, value) in data.entries {
53            vec.raw_push(index, value);
54        }
55        Ok(vec)
56    }
57}