arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/fft64/zn.rs
poulpy-backend/src/cpu_spqlios/fft64/zn.rsRaw
 1use poulpy_hal::{
 2    api::TakeSlice,
 3    layouts::{Scratch, Zn, ZnToMut, ZnxInfos, ZnxSliceSize, ZnxView, ZnxViewMut},
 4    oep::{TakeSliceImpl, ZnAddNormalImpl, ZnFillNormalImpl, ZnFillUniformImpl, ZnNormalizeInplaceImpl},
 5    reference::zn::{zn_add_normal, zn_fill_normal, zn_fill_uniform},
 6    source::Source,
 7};
 8
 9use crate::cpu_spqlios::{FFT64Spqlios, ffi::zn64};
10
11unsafe impl ZnNormalizeInplaceImpl<Self> for FFT64Spqlios
12where
13    Self: TakeSliceImpl<Self>,
14{
15    fn zn_normalize_inplace_impl<A>(n: usize, basek: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<Self>)
16    where
17        A: ZnToMut,
18    {
19        let mut a: Zn<&mut [u8]> = a.to_mut();
20
21        let (tmp_bytes, _) = scratch.take_slice(n * size_of::<i64>());
22
23        unsafe {
24            zn64::zn64_normalize_base2k_ref(
25                n as u64,
26                basek as u64,
27                a.at_mut_ptr(a_col, 0),
28                a.size() as u64,
29                a.sl() as u64,
30                a.at_ptr(a_col, 0),
31                a.size() as u64,
32                a.sl() as u64,
33                tmp_bytes.as_mut_ptr(),
34            );
35        }
36    }
37}
38
39unsafe impl ZnFillUniformImpl<Self> for FFT64Spqlios {
40    fn zn_fill_uniform_impl<R>(n: usize, basek: usize, res: &mut R, res_col: usize, source: &mut Source)
41    where
42        R: ZnToMut,
43    {
44        zn_fill_uniform(n, basek, res, res_col, source);
45    }
46}
47
48unsafe impl ZnFillNormalImpl<Self> for FFT64Spqlios {
49    #[allow(clippy::too_many_arguments)]
50    fn zn_fill_normal_impl<R>(
51        n: usize,
52        basek: usize,
53        res: &mut R,
54        res_col: usize,
55        k: usize,
56        source: &mut Source,
57        sigma: f64,
58        bound: f64,
59    ) where
60        R: ZnToMut,
61    {
62        zn_fill_normal(n, basek, res, res_col, k, source, sigma, bound);
63    }
64}
65
66unsafe impl ZnAddNormalImpl<Self> for FFT64Spqlios {
67    #[allow(clippy::too_many_arguments)]
68    fn zn_add_normal_impl<R>(
69        n: usize,
70        basek: usize,
71        res: &mut R,
72        res_col: usize,
73        k: usize,
74        source: &mut Source,
75        sigma: f64,
76        bound: f64,
77    ) where
78        R: ZnToMut,
79    {
80        zn_add_normal(n, basek, res, res_col, k, source, sigma, bound);
81    }
82}