arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/zn_arithmetic_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/zn_arithmetic_private.hRaw
  1#ifndef SPQLIOS_ZN_ARITHMETIC_PRIVATE_H
  2#define SPQLIOS_ZN_ARITHMETIC_PRIVATE_H
  3
  4#include "../commons_private.h"
  5#include "zn_arithmetic.h"
  6#include "zn_arithmetic_plugin.h"
  7
  8typedef struct main_z_module_precomp_t MAIN_Z_MODULE_PRECOMP;
  9struct main_z_module_precomp_t {
 10  // TODO
 11};
 12
 13typedef union z_module_precomp_t Z_MODULE_PRECOMP;
 14union z_module_precomp_t {
 15  MAIN_Z_MODULE_PRECOMP main;
 16};
 17
 18void main_init_z_module_precomp(MOD_Z* module);
 19
 20void main_finalize_z_module_precomp(MOD_Z* module);
 21
 22/** @brief opaque structure that describes the modules (RnX,ZnX,TnX) and the hardware */
 23struct z_module_info_t {
 24  Z_MODULE_TYPE mtype;
 25  Z_MODULE_VTABLE vtable;
 26  Z_MODULE_PRECOMP precomp;
 27  void* custom;
 28  void (*custom_deleter)(void*);
 29};
 30
 31void init_z_module_info(MOD_Z* module, Z_MODULE_TYPE mtype);
 32
 33void main_init_z_module_vtable(MOD_Z* module);
 34
 35struct tndbl_approxdecomp_gadget_t {
 36  uint64_t k;
 37  uint64_t ell;
 38  double add_cst;       // 3.2^51-(K.ell) + 1/2.(sum 2^-(i+1)K)
 39  int64_t and_mask;     // (2^K)-1
 40  int64_t sub_cst;      // 2^(K-1)
 41  uint8_t rshifts[64];  // 2^(ell-1-i).K for i in [0:ell-1]
 42};
 43
 44/** @brief sets res = gadget_decompose(a) (int8_t* output) */
 45EXPORT void default_i8_approxdecomp_from_tndbl_ref(const MOD_Z* module,                      // N
 46                                                   const TNDBL_APPROXDECOMP_GADGET* gadget,  // gadget
 47                                                   int8_t* res, uint64_t res_size,  // res (in general, size ell.a_size)
 48                                                   const double* a, uint64_t a_size);  // a
 49
 50/** @brief sets res = gadget_decompose(a) (int16_t* output) */
 51EXPORT void default_i16_approxdecomp_from_tndbl_ref(const MOD_Z* module,                      // N
 52                                                    const TNDBL_APPROXDECOMP_GADGET* gadget,  // gadget
 53                                                    int16_t* res,
 54                                                    uint64_t res_size,  // res (in general, size ell.a_size)
 55                                                    const double* a, uint64_t a_size);  // a
 56/** @brief sets res = gadget_decompose(a) (int32_t* output) */
 57EXPORT void default_i32_approxdecomp_from_tndbl_ref(const MOD_Z* module,                      // N
 58                                                    const TNDBL_APPROXDECOMP_GADGET* gadget,  // gadget
 59                                                    int32_t* res,
 60                                                    uint64_t res_size,  // res (in general, size ell.a_size)
 61                                                    const double* a, uint64_t a_size);  // a
 62
 63/** @brief prepares a vmp matrix (contiguous row-major version) */
 64EXPORT void default_zn32_vmp_prepare_contiguous_ref(  //
 65    const MOD_Z* module,
 66    ZN32_VMP_PMAT* pmat,                                // output
 67    const int32_t* mat, uint64_t nrows, uint64_t ncols  // a
 68);
 69
 70/** @brief prepares a vmp matrix (mat[row]+col*N points to the item) */
 71EXPORT void default_zn32_vmp_prepare_dblptr_ref(  //
 72    const MOD_Z* module,
 73    ZN32_VMP_PMAT* pmat,                                 // output
 74    const int32_t** mat, uint64_t nrows, uint64_t ncols  // a
 75);
 76
 77/** @brief prepares the ith-row of a vmp matrix with nrows and ncols */
 78EXPORT void default_zn32_vmp_prepare_row_ref(  //
 79    const MOD_Z* module,
 80    ZN32_VMP_PMAT* pmat,                                                // output
 81    const int32_t* row, uint64_t row_i, uint64_t nrows, uint64_t ncols  // a
 82);
 83
 84/** @brief applies a vmp product (int32_t* input) */
 85EXPORT void default_zn32_vmp_apply_i32_ref(                      //
 86    const MOD_Z* module,                                         //
 87    int32_t* res, uint64_t res_size,                             // res
 88    const int32_t* a, uint64_t a_size,                           // a
 89    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
 90
 91/** @brief applies a vmp product (int16_t* input) */
 92EXPORT void default_zn32_vmp_apply_i16_ref(                      //
 93    const MOD_Z* module,                                         // N
 94    int32_t* res, uint64_t res_size,                             // res
 95    const int16_t* a, uint64_t a_size,                           // a
 96    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
 97
 98/** @brief applies a vmp product (int8_t* input) */
 99EXPORT void default_zn32_vmp_apply_i8_ref(                       //
100    const MOD_Z* module,                                         // N
101    int32_t* res, uint64_t res_size,                             // res
102    const int8_t* a, uint64_t a_size,                            // a
103    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
104
105/** @brief applies a vmp product (int32_t* input) */
106EXPORT void default_zn32_vmp_apply_i32_avx(                      //
107    const MOD_Z* module,                                         //
108    int32_t* res, uint64_t res_size,                             // res
109    const int32_t* a, uint64_t a_size,                           // a
110    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
111
112/** @brief applies a vmp product (int16_t* input) */
113EXPORT void default_zn32_vmp_apply_i16_avx(                      //
114    const MOD_Z* module,                                         // N
115    int32_t* res, uint64_t res_size,                             // res
116    const int16_t* a, uint64_t a_size,                           // a
117    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
118
119/** @brief applies a vmp product (int8_t* input) */
120EXPORT void default_zn32_vmp_apply_i8_avx(                       //
121    const MOD_Z* module,                                         // N
122    int32_t* res, uint64_t res_size,                             // res
123    const int8_t* a, uint64_t a_size,                            // a
124    const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols);  // prep matrix
125
126// explicit conversions
127
128/** reduction mod 1, output in torus32 space */
129EXPORT void dbl_to_tn32_ref(const MOD_Z* module,              //
130                            int32_t* res, uint64_t res_size,  // res
131                            const double* a, uint64_t a_size  // a
132);
133
134/** real centerlift mod 1, output in double space */
135EXPORT void tn32_to_dbl_ref(const MOD_Z* module,               //
136                            double* res, uint64_t res_size,    // res
137                            const int32_t* a, uint64_t a_size  // a
138);
139
140/** round to the nearest int, output in i32 space */
141EXPORT void dbl_round_to_i32_ref(const MOD_Z* module,              //
142                                 int32_t* res, uint64_t res_size,  // res
143                                 const double* a, uint64_t a_size  // a
144);
145
146/** small int (int32 space) to double */
147EXPORT void i32_to_dbl_ref(const MOD_Z* module,               //
148                           double* res, uint64_t res_size,    // res
149                           const int32_t* a, uint64_t a_size  // a
150);
151
152/** round to the nearest int, output in int64 space */
153EXPORT void dbl_round_to_i64_ref(const MOD_Z* module,              //
154                                 int64_t* res, uint64_t res_size,  // res
155                                 const double* a, uint64_t a_size  // a
156);
157
158/** small int (int64 space) to double */
159EXPORT void i64_to_dbl_ref(const MOD_Z* module,               //
160                           double* res, uint64_t res_size,    // res
161                           const int64_t* a, uint64_t a_size  // a
162);
163
164#endif  // SPQLIOS_ZN_ARITHMETIC_PRIVATE_H