void recursiveEval(const CubeSlice<zz_p>& s, const Vec< copied_ptr<FFTHelper> >& multiEvalPoints, long d, zz_pX& tmp1, Vec<zz_p>& tmp2) { long numDims = s.getNumDims(); //OLD: assert(numDims > 0); helib::assertTrue(numDims > 0, "CubeSlice s has negative dimension number"); if (numDims > 1) { long dim0 = s.getDim(0); for (long i = 0; i < dim0; i++) recursiveEval(CubeSlice<zz_p>(s, i), multiEvalPoints, d+1, tmp1, tmp2); } long posBnd = s.getProd(1); for (long pos = 0; pos < posBnd; pos++) { getHyperColumn(tmp1.rep, s, pos); tmp1.normalize(); multiEvalPoints[d]->FFT(tmp1, tmp2); setHyperColumn(tmp2, s, pos); } }
void setHyperColumn(const Vec<T>& v, const CubeSlice<T>& s, long pos) { long m = s.getProd(1); long n = s.getDim(0); assert(pos >= 0 && pos < m); if (v.length() < n) n = v.length(); for (long i = 0; i < n; i++) s[pos + i*m] = v[i]; }
void setHyperColumn(const Vec<T>& v, const CubeSlice<T>& s, long pos, const T& val) { long m = s.getProd(1); long n = s.getDim(0); long n1 = n; assert(pos >= 0 && pos < m); if (v.length() < n) n1 = v.length(); const T* vp = &v[0]; T* sp = &s[0]; for (long i = 0; i < n1; i++) sp[pos + i*m] = vp[i]; for (long i = n1; i < n; i++) sp[pos + i*m] = val; }
void recursiveInterp(const CubeSlice<zz_p>& s, const Vec< copied_ptr<FFTHelper> >& multiEvalPoints, long d, zz_pX& tmp1, Vec<zz_p>& tmp2) { long numDims = s.getNumDims(); assert(numDims > 0); long posBnd = s.getProd(1); for (long pos = 0; pos < posBnd; pos++) { getHyperColumn(tmp2, s, pos); multiEvalPoints[d]->iFFT(tmp1, tmp2, false); // do not normalize setHyperColumn(tmp1.rep, s, pos, zz_p::zero()); } if (numDims > 1) { long dim0 = s.getDim(0); for (long i = 0; i < dim0; i++) recursiveInterp(CubeSlice<zz_p>(s, i), multiEvalPoints, d+1, tmp1, tmp2); } }
void recursiveEval(const CubeSlice<zz_p>& s, const Vec< Vec<zz_p> >& multiEvalPoints, long d, zz_pX& tmp1, Vec<zz_p>& tmp2) { long numDims = s.getNumDims(); assert(numDims > 0); if (numDims > 1) { long dim0 = s.getDim(0); for (long i = 0; i < dim0; i++) recursiveEval(CubeSlice<zz_p>(s, i), multiEvalPoints, d+1, tmp1, tmp2); } long posBnd = s.getProd(1); for (long pos = 0; pos < posBnd; pos++) { getHyperColumn(tmp1.rep, s, pos); tmp1.normalize(); eval(tmp2, tmp1, multiEvalPoints[d]); setHyperColumn(tmp2, s, pos); } }