poulpy/poulpy-hal/src/layouts/vmp_pmat.rs
poulpy-hal/src/layouts/vmp_pmat.rsRaw
1use std::{
2 hash::{DefaultHasher, Hasher},
3 marker::PhantomData,
4};
5
6use crate::{
7 alloc_aligned,
8 layouts::{Backend, Data, DataMut, DataRef, DataView, DataViewMut, DigestU64, ZnxInfos, ZnxView},
9 oep::VmpPMatAllocBytesImpl,
10};
11
12#[repr(C)]
13#[derive(PartialEq, Eq, Hash)]
14pub struct VmpPMat<D: Data, B: Backend> {
15 data: D,
16 n: usize,
17 size: usize,
18 rows: usize,
19 cols_in: usize,
20 cols_out: usize,
21 _phantom: PhantomData<B>,
22}
23
24impl<D: DataRef, B: Backend> DigestU64 for VmpPMat<D, B> {
25 fn digest_u64(&self) -> u64 {
26 let mut h: DefaultHasher = DefaultHasher::new();
27 h.write(self.data.as_ref());
28 h.write_usize(self.n);
29 h.write_usize(self.size);
30 h.write_usize(self.rows);
31 h.write_usize(self.cols_in);
32 h.write_usize(self.cols_out);
33 h.finish()
34 }
35}
36
37impl<D: DataRef, B: Backend> ZnxView for VmpPMat<D, B> {
38 type Scalar = B::ScalarPrep;
39}
40
41impl<D: Data, B: Backend> ZnxInfos for VmpPMat<D, B> {
42 fn cols(&self) -> usize {
43 self.cols_in
44 }
45
46 fn rows(&self) -> usize {
47 self.rows
48 }
49
50 fn n(&self) -> usize {
51 self.n
52 }
53
54 fn size(&self) -> usize {
55 self.size
56 }
57
58 fn poly_count(&self) -> usize {
59 self.rows() * self.cols_in() * self.size() * self.cols_out()
60 }
61}
62
63impl<D: Data, B: Backend> DataView for VmpPMat<D, B> {
64 type D = D;
65 fn data(&self) -> &Self::D {
66 &self.data
67 }
68}
69
70impl<D: Data, B: Backend> DataViewMut for VmpPMat<D, B> {
71 fn data_mut(&mut self) -> &mut Self::D {
72 &mut self.data
73 }
74}
75
76impl<D: Data, B: Backend> VmpPMat<D, B> {
77 pub fn cols_in(&self) -> usize {
78 self.cols_in
79 }
80
81 pub fn cols_out(&self) -> usize {
82 self.cols_out
83 }
84}
85
86impl<D: DataRef + From<Vec<u8>>, B: Backend> VmpPMat<D, B>
87where
88 B: VmpPMatAllocBytesImpl<B>,
89{
90 pub fn alloc(n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize) -> Self {
91 let data: Vec<u8> = alloc_aligned(B::vmp_pmat_alloc_bytes_impl(
92 n, rows, cols_in, cols_out, size,
93 ));
94 Self {
95 data: data.into(),
96 n,
97 size,
98 rows,
99 cols_in,
100 cols_out,
101 _phantom: PhantomData,
102 }
103 }
104
105 pub fn from_bytes(n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize, bytes: impl Into<Vec<u8>>) -> Self {
106 let data: Vec<u8> = bytes.into();
107 assert!(data.len() == B::vmp_pmat_alloc_bytes_impl(n, rows, cols_in, cols_out, size));
108 Self {
109 data: data.into(),
110 n,
111 size,
112 rows,
113 cols_in,
114 cols_out,
115 _phantom: PhantomData,
116 }
117 }
118}
119
120pub type VmpPMatOwned<B> = VmpPMat<Vec<u8>, B>;
121pub type VmpPMatRef<'a, B> = VmpPMat<&'a [u8], B>;
122
123pub trait VmpPMatToRef<B: Backend> {
124 fn to_ref(&self) -> VmpPMat<&[u8], B>;
125}
126
127impl<D: DataRef, B: Backend> VmpPMatToRef<B> for VmpPMat<D, B> {
128 fn to_ref(&self) -> VmpPMat<&[u8], B> {
129 VmpPMat {
130 data: self.data.as_ref(),
131 n: self.n,
132 rows: self.rows,
133 cols_in: self.cols_in,
134 cols_out: self.cols_out,
135 size: self.size,
136 _phantom: std::marker::PhantomData,
137 }
138 }
139}
140
141pub trait VmpPMatToMut<B: Backend> {
142 fn to_mut(&mut self) -> VmpPMat<&mut [u8], B>;
143}
144
145impl<D: DataMut, B: Backend> VmpPMatToMut<B> for VmpPMat<D, B> {
146 fn to_mut(&mut self) -> VmpPMat<&mut [u8], B> {
147 VmpPMat {
148 data: self.data.as_mut(),
149 n: self.n,
150 rows: self.rows,
151 cols_in: self.cols_in,
152 cols_out: self.cols_out,
153 size: self.size,
154 _phantom: std::marker::PhantomData,
155 }
156 }
157}
158
159impl<D: Data, B: Backend> VmpPMat<D, B> {
160 pub fn from_data(data: D, n: usize, rows: usize, cols_in: usize, cols_out: usize, size: usize) -> Self {
161 Self {
162 data,
163 n,
164 rows,
165 cols_in,
166 cols_out,
167 size,
168 _phantom: PhantomData,
169 }
170 }
171}