arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/layouts/convolution.rs
poulpy-hal/src/layouts/convolution.rsRaw
  1use std::marker::PhantomData;
  2
  3use crate::{
  4    alloc_aligned,
  5    layouts::{Backend, Data, DataMut, DataRef, DataView, DataViewMut, ZnxInfos, ZnxView},
  6    oep::CnvPVecBytesOfImpl,
  7};
  8
  9pub struct CnvPVecR<D: Data, BE: Backend> {
 10    data: D,
 11    n: usize,
 12    size: usize,
 13    cols: usize,
 14    _phantom: PhantomData<BE>,
 15}
 16
 17impl<D: Data, BE: Backend> ZnxInfos for CnvPVecR<D, BE> {
 18    fn cols(&self) -> usize {
 19        self.cols
 20    }
 21
 22    fn n(&self) -> usize {
 23        self.n
 24    }
 25
 26    fn rows(&self) -> usize {
 27        1
 28    }
 29
 30    fn size(&self) -> usize {
 31        self.size
 32    }
 33}
 34
 35impl<D: Data, BE: Backend> DataView for CnvPVecR<D, BE> {
 36    type D = D;
 37    fn data(&self) -> &Self::D {
 38        &self.data
 39    }
 40}
 41
 42impl<D: Data, B: Backend> DataViewMut for CnvPVecR<D, B> {
 43    fn data_mut(&mut self) -> &mut Self::D {
 44        &mut self.data
 45    }
 46}
 47
 48impl<D: DataRef, BE: Backend> ZnxView for CnvPVecR<D, BE> {
 49    type Scalar = BE::ScalarPrep;
 50}
 51
 52impl<D: DataRef + From<Vec<u8>>, B: Backend> CnvPVecR<D, B>
 53where
 54    B: CnvPVecBytesOfImpl,
 55{
 56    pub fn alloc(n: usize, cols: usize, size: usize) -> Self {
 57        let data: Vec<u8> = alloc_aligned::<u8>(B::bytes_of_cnv_pvec_right_impl(n, cols, size));
 58        Self {
 59            data: data.into(),
 60            n,
 61            size,
 62            cols,
 63            _phantom: PhantomData,
 64        }
 65    }
 66
 67    pub fn from_bytes(n: usize, cols: usize, size: usize, bytes: impl Into<Vec<u8>>) -> Self {
 68        let data: Vec<u8> = bytes.into();
 69        assert!(data.len() == B::bytes_of_cnv_pvec_right_impl(n, cols, size));
 70        Self {
 71            data: data.into(),
 72            n,
 73            size,
 74            cols,
 75            _phantom: PhantomData,
 76        }
 77    }
 78}
 79
 80impl<D: Data, B: Backend> CnvPVecR<D, B> {
 81    pub fn from_data(data: D, n: usize, cols: usize, size: usize) -> Self {
 82        Self {
 83            data,
 84            n,
 85            cols,
 86            size,
 87            _phantom: PhantomData,
 88        }
 89    }
 90}
 91
 92pub struct CnvPVecL<D: Data, BE: Backend> {
 93    data: D,
 94    n: usize,
 95    size: usize,
 96    cols: usize,
 97    _phantom: PhantomData<BE>,
 98}
 99
100impl<D: Data, BE: Backend> ZnxInfos for CnvPVecL<D, BE> {
101    fn cols(&self) -> usize {
102        self.cols
103    }
104
105    fn n(&self) -> usize {
106        self.n
107    }
108
109    fn rows(&self) -> usize {
110        1
111    }
112
113    fn size(&self) -> usize {
114        self.size
115    }
116}
117
118impl<D: Data, BE: Backend> DataView for CnvPVecL<D, BE> {
119    type D = D;
120    fn data(&self) -> &Self::D {
121        &self.data
122    }
123}
124
125impl<D: Data, B: Backend> DataViewMut for CnvPVecL<D, B> {
126    fn data_mut(&mut self) -> &mut Self::D {
127        &mut self.data
128    }
129}
130
131impl<D: DataRef, BE: Backend> ZnxView for CnvPVecL<D, BE> {
132    type Scalar = BE::ScalarPrep;
133}
134
135impl<D: DataRef + From<Vec<u8>>, B: Backend> CnvPVecL<D, B>
136where
137    B: CnvPVecBytesOfImpl,
138{
139    pub fn alloc(n: usize, cols: usize, size: usize) -> Self {
140        let data: Vec<u8> = alloc_aligned::<u8>(B::bytes_of_cnv_pvec_left_impl(n, cols, size));
141        Self {
142            data: data.into(),
143            n,
144            size,
145            cols,
146            _phantom: PhantomData,
147        }
148    }
149
150    pub fn from_bytes(n: usize, cols: usize, size: usize, bytes: impl Into<Vec<u8>>) -> Self {
151        let data: Vec<u8> = bytes.into();
152        assert!(data.len() == B::bytes_of_cnv_pvec_left_impl(n, cols, size));
153        Self {
154            data: data.into(),
155            n,
156            size,
157            cols,
158            _phantom: PhantomData,
159        }
160    }
161}
162
163impl<D: Data, B: Backend> CnvPVecL<D, B> {
164    pub fn from_data(data: D, n: usize, cols: usize, size: usize) -> Self {
165        Self {
166            data,
167            n,
168            cols,
169            size,
170            _phantom: PhantomData,
171        }
172    }
173}
174
175pub trait CnvPVecRToRef<BE: Backend> {
176    fn to_ref(&self) -> CnvPVecR<&[u8], BE>;
177}
178
179impl<D: DataRef, BE: Backend> CnvPVecRToRef<BE> for CnvPVecR<D, BE> {
180    fn to_ref(&self) -> CnvPVecR<&[u8], BE> {
181        CnvPVecR {
182            data: self.data.as_ref(),
183            n: self.n,
184            size: self.size,
185            cols: self.cols,
186            _phantom: self._phantom,
187        }
188    }
189}
190
191pub trait CnvPVecRToMut<BE: Backend> {
192    fn to_mut(&mut self) -> CnvPVecR<&mut [u8], BE>;
193}
194
195impl<D: DataMut, BE: Backend> CnvPVecRToMut<BE> for CnvPVecR<D, BE> {
196    fn to_mut(&mut self) -> CnvPVecR<&mut [u8], BE> {
197        CnvPVecR {
198            data: self.data.as_mut(),
199            n: self.n,
200            size: self.size,
201            cols: self.cols,
202            _phantom: self._phantom,
203        }
204    }
205}
206
207pub trait CnvPVecLToRef<BE: Backend> {
208    fn to_ref(&self) -> CnvPVecL<&[u8], BE>;
209}
210
211impl<D: DataRef, BE: Backend> CnvPVecLToRef<BE> for CnvPVecL<D, BE> {
212    fn to_ref(&self) -> CnvPVecL<&[u8], BE> {
213        CnvPVecL {
214            data: self.data.as_ref(),
215            n: self.n,
216            size: self.size,
217            cols: self.cols,
218            _phantom: self._phantom,
219        }
220    }
221}
222
223pub trait CnvPVecLToMut<BE: Backend> {
224    fn to_mut(&mut self) -> CnvPVecL<&mut [u8], BE>;
225}
226
227impl<D: DataMut, BE: Backend> CnvPVecLToMut<BE> for CnvPVecL<D, BE> {
228    fn to_mut(&mut self) -> CnvPVecL<&mut [u8], BE> {
229        CnvPVecL {
230            data: self.data.as_mut(),
231            n: self.n,
232            size: self.size,
233            cols: self.cols,
234            _phantom: self._phantom,
235        }
236    }
237}