tf_idf_vectorizer/utils/math/vector/
serde.rs1use 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 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 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 #[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 let mut vec = ZeroSpVec::with_capacity(data.nnz);
51 vec.len = data.len;
52 for (index, value) in data.entries {
54 unsafe { vec.raw_push(index as usize, value) };
55 }
56 Ok(vec)
57 }
58}