tf_idf_vectorizer/utils/math/vector/
serde.rs

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