poulpy/base2k/src/internals.rs
base2k/src/internals.rsRaw
1use std::cmp::{max, min};
2
3use crate::{Backend, IntegerType, Module, ZnxBasics, ZnxLayout, ffi::module::MODULE};
4
5#[inline(always)]
6pub fn apply_unary_op<B: Backend, T: ZnxBasics + ZnxLayout>(
7 module: &Module<B>,
8 b: &mut T,
9 a: &T,
10 op: impl Fn(&mut [T::Scalar], &[T::Scalar]),
11) where
12 <T as ZnxLayout>::Scalar: IntegerType,
13{
14 #[cfg(debug_assertions)]
15 {
16 assert_eq!(a.n(), module.n());
17 assert_eq!(b.n(), module.n());
18 }
19 let a_cols: usize = a.cols();
20 let b_cols: usize = b.cols();
21 let min_cols: usize = min(a_cols, b_cols);
22 // Applies over the shared cols between (a, b)
23 (0..min_cols).for_each(|i| op(b.at_poly_mut(i, 0), a.at_poly(i, 0)));
24 // Zeroes the remaining cols of b.
25 (min_cols..b_cols).for_each(|i| (0..b.size()).for_each(|j| b.zero_at(i, j)));
26}
27
28pub fn ffi_ternary_op_factory<T>(
29 module_ptr: *const MODULE,
30 c_size: usize,
31 c_sl: usize,
32 a_size: usize,
33 a_sl: usize,
34 b_size: usize,
35 b_sl: usize,
36 op_fn: unsafe extern "C" fn(*const MODULE, *mut T, u64, u64, *const T, u64, u64, *const T, u64, u64),
37) -> impl Fn(&mut [T], &[T], &[T]) {
38 move |cv: &mut [T], av: &[T], bv: &[T]| unsafe {
39 op_fn(
40 module_ptr,
41 cv.as_mut_ptr(),
42 c_size as u64,
43 c_sl as u64,
44 av.as_ptr(),
45 a_size as u64,
46 a_sl as u64,
47 bv.as_ptr(),
48 b_size as u64,
49 b_sl as u64,
50 )
51 }
52}
53
54pub fn ffi_binary_op_factory_type_0<T>(
55 module_ptr: *const MODULE,
56 b_size: usize,
57 b_sl: usize,
58 a_size: usize,
59 a_sl: usize,
60 op_fn: unsafe extern "C" fn(*const MODULE, *mut T, u64, u64, *const T, u64, u64),
61) -> impl Fn(&mut [T], &[T]) {
62 move |bv: &mut [T], av: &[T]| unsafe {
63 op_fn(
64 module_ptr,
65 bv.as_mut_ptr(),
66 b_size as u64,
67 b_sl as u64,
68 av.as_ptr(),
69 a_size as u64,
70 a_sl as u64,
71 )
72 }
73}
74
75pub fn ffi_binary_op_factory_type_1<T>(
76 module_ptr: *const MODULE,
77 k: i64,
78 b_size: usize,
79 b_sl: usize,
80 a_size: usize,
81 a_sl: usize,
82 op_fn: unsafe extern "C" fn(*const MODULE, i64, *mut T, u64, u64, *const T, u64, u64),
83) -> impl Fn(&mut [T], &[T]) {
84 move |bv: &mut [T], av: &[T]| unsafe {
85 op_fn(
86 module_ptr,
87 k,
88 bv.as_mut_ptr(),
89 b_size as u64,
90 b_sl as u64,
91 av.as_ptr(),
92 a_size as u64,
93 a_sl as u64,
94 )
95 }
96}