arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/backend/src/hal/oep/scratch.rs
backend/src/hal/oep/scratch.rsRaw
  1use crate::hal::{
  2    api::ZnxInfos,
  3    layouts::{Backend, DataRef, MatZnx, ScalarZnx, Scratch, ScratchOwned, SvpPPol, VecZnx, VecZnxBig, VecZnxDft, VmpPMat},
  4};
  5
  6/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
  7/// * See TODO for reference code.
  8/// * See TODO for corresponding public API.
  9/// # Safety [crate::doc::backend_safety] for safety contract.
 10pub unsafe trait ScratchOwnedAllocImpl<B: Backend> {
 11    fn scratch_owned_alloc_impl(size: usize) -> ScratchOwned<B>;
 12}
 13
 14/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 15/// * See TODO for reference code.
 16/// * See TODO for corresponding public API.
 17/// # Safety [crate::doc::backend_safety] for safety contract.
 18pub unsafe trait ScratchOwnedBorrowImpl<B: Backend> {
 19    fn scratch_owned_borrow_impl(scratch: &mut ScratchOwned<B>) -> &mut Scratch<B>;
 20}
 21
 22/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 23/// * See TODO for reference code.
 24/// * See TODO for corresponding public API.
 25/// # Safety [crate::doc::backend_safety] for safety contract.
 26pub unsafe trait ScratchFromBytesImpl<B: Backend> {
 27    fn scratch_from_bytes_impl(data: &mut [u8]) -> &mut Scratch<B>;
 28}
 29
 30/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 31/// * See TODO for reference code.
 32/// * See TODO for corresponding public API.
 33/// # Safety [crate::doc::backend_safety] for safety contract.
 34pub unsafe trait ScratchAvailableImpl<B: Backend> {
 35    fn scratch_available_impl(scratch: &Scratch<B>) -> usize;
 36}
 37
 38/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 39/// * See TODO for reference code.
 40/// * See TODO for corresponding public API.
 41/// # Safety [crate::doc::backend_safety] for safety contract.
 42pub unsafe trait TakeSliceImpl<B: Backend> {
 43    fn take_slice_impl<T>(scratch: &mut Scratch<B>, len: usize) -> (&mut [T], &mut Scratch<B>);
 44}
 45
 46/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 47/// * See TODO for reference code.
 48/// * See TODO for corresponding public API.
 49/// # Safety [crate::doc::backend_safety] for safety contract.
 50pub unsafe trait TakeScalarZnxImpl<B: Backend> {
 51    fn take_scalar_znx_impl(scratch: &mut Scratch<B>, n: usize, cols: usize) -> (ScalarZnx<&mut [u8]>, &mut Scratch<B>);
 52}
 53
 54/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 55/// * See TODO for reference code.
 56/// * See TODO for corresponding public API.
 57/// # Safety [crate::doc::backend_safety] for safety contract.
 58pub unsafe trait TakeSvpPPolImpl<B: Backend> {
 59    fn take_svp_ppol_impl(scratch: &mut Scratch<B>, n: usize, cols: usize) -> (SvpPPol<&mut [u8], B>, &mut Scratch<B>);
 60}
 61
 62/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 63/// * See TODO for reference code.
 64/// * See TODO for corresponding public API.
 65/// # Safety [crate::doc::backend_safety] for safety contract.
 66pub unsafe trait TakeVecZnxImpl<B: Backend> {
 67    fn take_vec_znx_impl(scratch: &mut Scratch<B>, n: usize, cols: usize, size: usize) -> (VecZnx<&mut [u8]>, &mut Scratch<B>);
 68}
 69
 70/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 71/// * See TODO for reference code.
 72/// * See TODO for corresponding public API.
 73/// # Safety [crate::doc::backend_safety] for safety contract.
 74pub unsafe trait TakeVecZnxSliceImpl<B: Backend> {
 75    fn take_vec_znx_slice_impl(
 76        scratch: &mut Scratch<B>,
 77        len: usize,
 78        n: usize,
 79        cols: usize,
 80        size: usize,
 81    ) -> (Vec<VecZnx<&mut [u8]>>, &mut Scratch<B>);
 82}
 83
 84/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 85/// * See TODO for reference code.
 86/// * See TODO for corresponding public API.
 87/// # Safety [crate::doc::backend_safety] for safety contract.
 88pub unsafe trait TakeVecZnxBigImpl<B: Backend> {
 89    fn take_vec_znx_big_impl(
 90        scratch: &mut Scratch<B>,
 91        n: usize,
 92        cols: usize,
 93        size: usize,
 94    ) -> (VecZnxBig<&mut [u8], B>, &mut Scratch<B>);
 95}
 96
 97/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 98/// * See TODO for reference code.
 99/// * See TODO for corresponding public API.
100/// # Safety [crate::doc::backend_safety] for safety contract.
101pub unsafe trait TakeVecZnxDftImpl<B: Backend> {
102    fn take_vec_znx_dft_impl(
103        scratch: &mut Scratch<B>,
104        n: usize,
105        cols: usize,
106        size: usize,
107    ) -> (VecZnxDft<&mut [u8], B>, &mut Scratch<B>);
108}
109
110/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
111/// * See TODO for reference code.
112/// * See TODO for corresponding public API.
113/// # Safety [crate::doc::backend_safety] for safety contract.
114pub unsafe trait TakeVecZnxDftSliceImpl<B: Backend> {
115    fn take_vec_znx_dft_slice_impl(
116        scratch: &mut Scratch<B>,
117        len: usize,
118        n: usize,
119        cols: usize,
120        size: usize,
121    ) -> (Vec<VecZnxDft<&mut [u8], B>>, &mut Scratch<B>);
122}
123
124/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
125/// * See TODO for reference code.
126/// * See TODO for corresponding public API.
127/// # Safety [crate::doc::backend_safety] for safety contract.
128pub unsafe trait TakeVmpPMatImpl<B: Backend> {
129    fn take_vmp_pmat_impl(
130        scratch: &mut Scratch<B>,
131        n: usize,
132        rows: usize,
133        cols_in: usize,
134        cols_out: usize,
135        size: usize,
136    ) -> (VmpPMat<&mut [u8], B>, &mut Scratch<B>);
137}
138
139/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
140/// * See TODO for reference code.
141/// * See TODO for corresponding public API.
142/// # Safety [crate::doc::backend_safety] for safety contract.
143pub unsafe trait TakeMatZnxImpl<B: Backend> {
144    fn take_mat_znx_impl(
145        scratch: &mut Scratch<B>,
146        n: usize,
147        rows: usize,
148        cols_in: usize,
149        cols_out: usize,
150        size: usize,
151    ) -> (MatZnx<&mut [u8]>, &mut Scratch<B>);
152}
153
154/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
155/// * See TODO for reference code.
156/// * See TODO for corresponding public API.
157/// # Safety [crate::doc::backend_safety] for safety contract.
158pub trait TakeLikeImpl<'a, B: Backend, T> {
159    type Output;
160    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &T) -> (Self::Output, &'a mut Scratch<B>);
161}
162
163impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VmpPMat<D, B>> for B
164where
165    B: TakeVmpPMatImpl<B>,
166    D: DataRef,
167{
168    type Output = VmpPMat<&'a mut [u8], B>;
169
170    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VmpPMat<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
171        B::take_vmp_pmat_impl(
172            scratch,
173            template.n(),
174            template.rows(),
175            template.cols_in(),
176            template.cols_out(),
177            template.size(),
178        )
179    }
180}
181
182impl<'a, B: Backend, D> TakeLikeImpl<'a, B, MatZnx<D>> for B
183where
184    B: TakeMatZnxImpl<B>,
185    D: DataRef,
186{
187    type Output = MatZnx<&'a mut [u8]>;
188
189    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &MatZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
190        B::take_mat_znx_impl(
191            scratch,
192            template.n(),
193            template.rows(),
194            template.cols_in(),
195            template.cols_out(),
196            template.size(),
197        )
198    }
199}
200
201impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxDft<D, B>> for B
202where
203    B: TakeVecZnxDftImpl<B>,
204    D: DataRef,
205{
206    type Output = VecZnxDft<&'a mut [u8], B>;
207
208    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnxDft<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
209        B::take_vec_znx_dft_impl(scratch, template.n(), template.cols(), template.size())
210    }
211}
212
213impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxBig<D, B>> for B
214where
215    B: TakeVecZnxBigImpl<B>,
216    D: DataRef,
217{
218    type Output = VecZnxBig<&'a mut [u8], B>;
219
220    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnxBig<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
221        B::take_vec_znx_big_impl(scratch, template.n(), template.cols(), template.size())
222    }
223}
224
225impl<'a, B: Backend, D> TakeLikeImpl<'a, B, SvpPPol<D, B>> for B
226where
227    B: TakeSvpPPolImpl<B>,
228    D: DataRef,
229{
230    type Output = SvpPPol<&'a mut [u8], B>;
231
232    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &SvpPPol<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
233        B::take_svp_ppol_impl(scratch, template.n(), template.cols())
234    }
235}
236
237impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnx<D>> for B
238where
239    B: TakeVecZnxImpl<B>,
240    D: DataRef,
241{
242    type Output = VecZnx<&'a mut [u8]>;
243
244    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
245        B::take_vec_znx_impl(scratch, template.n(), template.cols(), template.size())
246    }
247}
248
249impl<'a, B: Backend, D> TakeLikeImpl<'a, B, ScalarZnx<D>> for B
250where
251    B: TakeScalarZnxImpl<B>,
252    D: DataRef,
253{
254    type Output = ScalarZnx<&'a mut [u8]>;
255
256    fn take_like_impl(scratch: &'a mut Scratch<B>, template: &ScalarZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
257        B::take_scalar_znx_impl(scratch, template.n(), template.cols())
258    }
259}