def point(self, idx): p = [0]*self.dimension iwidth = self.bits * self.dimension for i in range(iwidth): b = utils.bitrange(idx, iwidth, i, i+1) << (iwidth-i-1)/self.dimension p[i%self.dimension] |= b return p
def point(self, idx): idx = utils.graycode(idx) p = [0]*self.dimension iwidth = self.bits * self.dimension for i in range(iwidth): b = utils.bitrange(idx, iwidth, i, i+1) << (iwidth-i-1)/self.dimension p[i%self.dimension] |= b return p
def index(self, p): idx = 0 iwidth = self.bits * self.dimension for i in range(iwidth): bitoff = self.bits-(i/self.dimension)-1 poff = self.dimension-(i%self.dimension)-1 b = utils.bitrange(p[poff], self.bits, bitoff, bitoff+1) << i idx |= b return utils.igraycode(idx)
def point(self, idx): p = [0] * self.dimension iwidth = self.bits * self.dimension for i in range(iwidth): b = utils.bitrange(idx, iwidth, i, i + 1) << (iwidth - i - 1) / self.dimension p[i % self.dimension] |= b p.reverse() return p
def hilbert_index(dimension, order, p): h, e, d = 0, 0, 0 for i in range(order): l = 0 for x in range(dimension): b = utils.bitrange(p[dimension - x - 1], order, i, i + 1) l |= b << x l = transform(e, d, dimension, l) w = utils.igraycode(l) e = e ^ utils.lrot(entry(w), d + 1, dimension) d = (d + direction(w, dimension) + 1) % dimension h = (h << dimension) | w return h
def hilbert_point(dimension, order, h): """ Convert an index on the Hilbert curve of the specified dimension and order to a set of point coordinates. """ # The bit widths in this function are: # p[*] - order # h - order*dimension # l - dimension # e - dimension hwidth = order*dimension e, d = 0, 0 p = [0]*dimension for i in range(order): w = utils.bitrange(h, hwidth, i*dimension, i*dimension+dimension) l = utils.graycode(w) l = itransform(e, d, dimension, l) for j in range(dimension): b = utils.bitrange(l, dimension, j, j+1) p[j] = utils.setbit(p[j], order, i, b) e = e ^ utils.lrot(entry(w), d+1, dimension) d = (d + direction(w, dimension) + 1)%dimension return p
def hilbert_point(dimension, order, h): """ Convert an index on the Hilbert curve of the specified dimension and order to a set of point coordinates. """ # The bit widths in this function are: # p[*] - order # h - order*dimension # l - dimension # e - dimension hwidth = order * dimension e, d = 0, 0 p = [0] * dimension for i in range(order): w = utils.bitrange(h, hwidth, i * dimension, i * dimension + dimension) l = utils.graycode(w) l = itransform(e, d, dimension, l) for j in range(dimension): b = utils.bitrange(l, dimension, j, j + 1) p[j] = utils.setbit(p[j], order, i, b) e = e ^ utils.lrot(entry(w), d + 1, dimension) d = (d + direction(w, dimension) + 1) % dimension return p
def hilbert_index(dimension, order, p): # Hamilton's paper initialises d to 0, which appears to be an error. h, e, d = 0, 0, 1 for i in range(order): l = 0 for x in range(dimension): b = utils.bitrange(p[x], order, i, i+1) l |= b<<x l = transform(e, d, dimension, l) w = utils.igraycode(l) e = e ^ utils.lrot(entry(w), d+1, dimension) d = (d + direction(w, dimension) + 1)%dimension h = (h<<dimension)|w return h
def checkbit(i, width, start, end, expected): e = utils.bitrange(i, width, start, end) assert e == expected assert e == utils.bits2int(utils.bits(i, width)[start:end])