Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
 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])
Пример #11
0
 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])