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