arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_private.hRaw
  1#ifndef SPQLIOS_REIM_FFT_PRIVATE_H
  2#define SPQLIOS_REIM_FFT_PRIVATE_H
  3
  4#include "../commons_private.h"
  5#include "reim_fft.h"
  6
  7#define STATIC_ASSERT(condition) (void)sizeof(char[-1 + 2 * !!(condition)])
  8
  9typedef struct reim_twiddle_precomp REIM_FFTVEC_TWIDDLE_PRECOMP;
 10typedef struct reim_bitwiddle_precomp REIM_FFTVEC_BITWIDDLE_PRECOMP;
 11
 12typedef void (*FFT_FUNC)(const REIM_FFT_PRECOMP*, double*);
 13typedef void (*IFFT_FUNC)(const REIM_IFFT_PRECOMP*, double*);
 14typedef void (*FFTVEC_ADD_FUNC)(const REIM_FFTVEC_ADD_PRECOMP*, double*, const double*, const double*);
 15typedef void (*FFTVEC_SUB_FUNC)(const REIM_FFTVEC_SUB_PRECOMP*, double*, const double*, const double*);
 16typedef void (*FFTVEC_MUL_FUNC)(const REIM_FFTVEC_MUL_PRECOMP*, double*, const double*, const double*);
 17typedef void (*FFTVEC_ADDMUL_FUNC)(const REIM_FFTVEC_ADDMUL_PRECOMP*, double*, const double*, const double*);
 18typedef void (*FROM_ZNX32_FUNC)(const REIM_FROM_ZNX32_PRECOMP*, void*, const int32_t*);
 19typedef void (*FROM_ZNX64_FUNC)(const REIM_FROM_ZNX64_PRECOMP*, void*, const int64_t*);
 20typedef void (*FROM_TNX32_FUNC)(const REIM_FROM_TNX32_PRECOMP*, void*, const int32_t*);
 21typedef void (*TO_TNX32_FUNC)(const REIM_TO_TNX32_PRECOMP*, int32_t*, const void*);
 22typedef void (*TO_TNX_FUNC)(const REIM_TO_TNX_PRECOMP*, double*, const double*);
 23typedef void (*TO_ZNX64_FUNC)(const REIM_TO_ZNX64_PRECOMP*, int64_t*, const void*);
 24typedef void (*FFTVEC_TWIDDLE_FUNC)(const REIM_FFTVEC_TWIDDLE_PRECOMP*, void*, const void*, const void*);
 25typedef void (*FFTVEC_BITWIDDLE_FUNC)(const REIM_FFTVEC_BITWIDDLE_PRECOMP*, void*, uint64_t, const void*);
 26
 27typedef void (*FFTVEC_AUTOMORPHISM_APPLY)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp, int64_t p, double* r,
 28                                          const double* a, uint64_t a_size);
 29typedef uint64_t (*FFTVEC_AUTOMORPHISM_APPLY_INPLACE_TMP_BYTES)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp);
 30typedef void (*FFTVEC_AUTOMORPHISM_APPLY_INPLACE)(const REIM_FFTVEC_AUTOMORPHISM_PRECOMP* precomp, int64_t p, double* a,
 31                                                  uint64_t a_size, uint8_t* tmp_bytes);
 32typedef struct reim_fftvec_automorphism_funcs {
 33  FFTVEC_AUTOMORPHISM_APPLY apply;
 34  FFTVEC_AUTOMORPHISM_APPLY_INPLACE apply_inplace;
 35  FFTVEC_AUTOMORPHISM_APPLY_INPLACE_TMP_BYTES apply_inplace_tmp_bytes;
 36} FFTVEC_AUTOMORPHISM_FUNCS;
 37
 38typedef struct reim_fft_precomp {
 39  FFT_FUNC function;
 40  int64_t m;              ///< complex dimension warning: reim uses n=2N=4m
 41  uint64_t buf_size;      ///< size of aligned_buffers (multiple of 64B)
 42  double* powomegas;      ///< 64B aligned
 43  void* aligned_buffers;  ///< 64B aligned
 44} REIM_FFT_PRECOMP;
 45
 46typedef struct reim_ifft_precomp {
 47  IFFT_FUNC function;
 48  int64_t m;          // warning: reim uses n=2N=4m
 49  uint64_t buf_size;  ///< size of aligned_buffers (multiple of 64B)
 50  double* powomegas;
 51  void* aligned_buffers;
 52} REIM_IFFT_PRECOMP;
 53
 54typedef struct reim_add_precomp {
 55  FFTVEC_ADD_FUNC function;
 56  int64_t m;
 57} REIM_FFTVEC_ADD_PRECOMP;
 58
 59typedef struct reim_sub_precomp {
 60  FFTVEC_SUB_FUNC function;
 61  int64_t m;
 62} REIM_FFTVEC_SUB_PRECOMP;
 63
 64typedef struct reim_mul_precomp {
 65  FFTVEC_MUL_FUNC function;
 66  int64_t m;
 67} REIM_FFTVEC_MUL_PRECOMP;
 68
 69typedef struct reim_addmul_precomp {
 70  FFTVEC_ADDMUL_FUNC function;
 71  int64_t m;
 72} REIM_FFTVEC_ADDMUL_PRECOMP;
 73
 74typedef struct reim_fftvec_automorphism_precomp {
 75  FFTVEC_AUTOMORPHISM_FUNCS function;
 76  int64_t m;
 77  uint64_t* irev;
 78} REIM_FFTVEC_AUTOMORPHISM_PRECOMP;
 79
 80struct reim_from_znx32_precomp {
 81  FROM_ZNX32_FUNC function;
 82  int64_t m;
 83};
 84
 85struct reim_from_znx64_precomp {
 86  FROM_ZNX64_FUNC function;
 87  int64_t m;
 88};
 89
 90struct reim_from_tnx32_precomp {
 91  FROM_TNX32_FUNC function;
 92  int64_t m;
 93};
 94
 95struct reim_to_tnx32_precomp {
 96  TO_TNX32_FUNC function;
 97  int64_t m;
 98  double divisor;
 99};
100
101struct reim_to_tnx_precomp {
102  TO_TNX_FUNC function;
103  int64_t m;
104  double divisor;
105  uint32_t log2overhead;
106  double add_cst;
107  uint64_t mask_and;
108  uint64_t mask_or;
109  double sub_cst;
110};
111
112struct reim_to_znx64_precomp {
113  TO_ZNX64_FUNC function;
114  int64_t m;
115  double divisor;
116};
117
118struct reim_twiddle_precomp {
119  FFTVEC_TWIDDLE_FUNC function;
120  int64_t m;
121};
122
123struct reim_bitwiddle_precomp {
124  FFTVEC_BITWIDDLE_FUNC function;
125  int64_t m;
126};
127
128#endif  // SPQLIOS_REIM_FFT_PRIVATE_H