Source code for n_sphere.sphere

import math

from .vdcorput import vdcorput

# def circle_co(k, base=2):
#     """Generate Circle Halton sequence 0,..,k

#     Arguments:
#         k (int): maximum sequence index, non-negative integer

#     Keyword Arguments:
#         base (int): [description] (default: {2})

#     Returns:
#         ([float]): base-b low discrepancy sequence
#     """
#     twopi = 2 * math.pi
#     for vd in vdcorput_co(k, base):
#         theta = twopi * vd  # map to [0, 2*math.pi]
#         s = [math.cos(theta), math.sin(theta)]
#         yield s


[docs]class circle: """Generate Circle Halton sequence 0,..,k Arguments: k (int): maximum sequence index, non-negative integer Keyword Arguments: base (int): [description] (default: {2}) Returns: ([float]): base-b low discrepancy sequence """ def __init__(self, base=2): self.vc = vdcorput(base) self.twopi = 2 * math.pi def __next__(self): """Get the next item Raises: StopIteration: description Returns: list: the next item """ vd = next(self.vc) theta = self.twopi * vd # map to [0, 2*math.pi] return [math.cos(theta), math.sin(theta)]
# def sphere_co(k, b): # """Generate Sphere Halton sequence 0,..,k # Arguments: # k (int): maximum sequence index, non-negative integer # Keyword Arguments: # b ([int]): sequence base, integer exceeding 1 # Returns: # ([float]): base-b low discrepancy sequence # """ # assert len(b) >= 2 # cirgen = circle_co(k, b[1]) # for vd in vdcorput_co(k, b[0]): # cosphi = 2 * vd - 1 # map to [-1, 1] # sinphi = math.sqrt(1 - cosphi * cosphi) # c = next(cirgen) # s = [cosphi, sinphi * c[0], sinphi * c[1]] # yield s
[docs]class sphere: """Generate Sphere Halton sequence 0,..,k Arguments: k (int): maximum sequence index, non-negative integer Keyword Arguments: b ([int]): sequence base, integer exceeding 1 Returns: ([float]): base-b low discrepancy sequence """ def __init__(self, b): assert len(b) >= 2 self.cirgen = circle(b[1]) self.vdc = vdcorput(b[0]) def __next__(self): """Get the next item Returns: list: the next item """ vd = next(self.vdc) cosphi = 2 * vd - 1 # map to [-1, 1] sinphi = math.sqrt(1 - cosphi * cosphi) c = next(self.cirgen) return [cosphi, sinphi * c[0], sinphi * c[1]]
if __name__ == "__main__": cirgen = circle(2) for _ in range(10): print(next(cirgen)) sgen = sphere(10, [2, 3]) for _ in range(10): print(sgen)