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