H_INLINE void _compactIndexToCoords( P *p, const int *ms, int n, const HC &hc, int M = 0, int m = 0 ) { I e(n), l(n), t(n), w(n), r(n), mask(n), ptrn(n); int d, i, j, b; // Get total precision and max precision // if not supplied if ( M == 0 || m == 0 ) { M = m = 0; for ( i = 0; i < n; i++ ) { if ( ms[i] > m ) m = ms[i]; M += ms[i]; } } // Initialize e.zero(); d = D0; l.zero(); for ( j = 0; j < n; j++ ) p[j].zero(); // Work from MSB to LSB for ( i = m-1; i >= 0; i-- ) { // Get the mask and ptrn extractMask<I>(ms,n,d,i,mask,b); ptrn = e; ptrn.rotr(d,n);//#D ptrn.Rotr(d+1,n); // Get the Hilbert index bits M -= b; r.zero(); // GetBits doesn't do this getBits<HC,I>(hc,b,M,r); // w = GrayCodeRankInv(r) // t = GrayCode(w) grayCodeRankInv<I>(mask,ptrn,r,n,b,t,w); // Reverse the transform // l = T^{-1}_{(e,d)}(t) l = t; transformInv<I>(e,d,n,l); // Distribute these bits // to the coordinates. setLocation<P,I>(p,n,i,l); // Update the entry point and direction. update1<I>(l,t,w,n,e,d); } return; }
void LetStmt::bind(NameSema& sema) const { if (init()) init()->bind(sema); ptrn()->bind(sema); }