def test_random(ctx_factory): context = ctx_factory() queue = cl.CommandQueue(context) from pyopencl.clrandom import RanluxGenerator if has_double_support(context.devices[0]): dtypes = [np.float32, np.float64] else: dtypes = [np.float32] gen = RanluxGenerator(queue, 5120) for ary_size in [300, 301, 302, 303, 10007]: for dtype in dtypes: ran = cl_array.zeros(queue, ary_size, dtype) gen.fill_uniform(ran) assert (0 < ran.get()).all() assert (ran.get() < 1).all() gen.synchronize(queue) ran = cl_array.zeros(queue, ary_size, dtype) gen.fill_uniform(ran, a=4, b=7) assert (4 < ran.get()).all() assert (ran.get() < 7).all() ran = gen.normal(queue, (10007,), dtype, mu=4, sigma=3) dtypes = [np.int32] for dtype in dtypes: ran = gen.uniform(queue, (10000007,), dtype, a=200, b=300) assert (200 <= ran.get()).all() assert (ran.get() < 300).all()
def make_normal_particle_array(queue, nparticles, dims, dtype, seed=15): from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=seed) return make_obj_array([ rng.normal(queue, nparticles, dtype=dtype) for i in range(dims)])
ctx = cl.create_some_context() queue = cl.CommandQueue(ctx) dims = 2 nparticles = 500 # ----------------------------------------------------------------------------- # generate some random particle positions # ----------------------------------------------------------------------------- from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=15) from pytools.obj_array import make_obj_array particles = make_obj_array([ rng.normal(queue, nparticles, dtype=np.float64) for i in range(dims)]) # ----------------------------------------------------------------------------- # build tree and traversals (lists) # ----------------------------------------------------------------------------- from boxtree import TreeBuilder tb = TreeBuilder(ctx) tree, _ = tb(queue, particles, max_particles_in_box=5) from boxtree.traversal import FMMTraversalBuilder tg = FMMTraversalBuilder(ctx) trav, _ = tg(queue, tree) # ENDEXAMPLE
ctx = cl.create_some_context() queue = cl.CommandQueue(ctx) dims = 2 nparticles = 10**4 # ----------------------------------------------------------------------------- # generate some random particle positions # ----------------------------------------------------------------------------- from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=15) from pytools.obj_array import make_obj_array particles = make_obj_array( [rng.normal(queue, nparticles, dtype=np.float64) for i in range(dims)]) # ----------------------------------------------------------------------------- # build tree and traversals (lists) # ----------------------------------------------------------------------------- from boxtree import TreeBuilder tb = TreeBuilder(ctx) tree, _ = tb(queue, particles, max_particles_in_box=30) from boxtree.traversal import FMMTraversalBuilder tg = FMMTraversalBuilder(ctx) trav, _ = tg(queue, tree) # ENDEXAMPLE # -----------------------------------------------------------------------------
def plot_traversal(ctx_getter, do_plot=False): ctx = ctx_getter() queue = cl.CommandQueue(ctx) #for dims in [2, 3]: for dims in [2]: nparticles = 10**4 dtype = np.float64 from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=15) from pytools.obj_array import make_obj_array particles = make_obj_array( [rng.normal(queue, nparticles, dtype=dtype) for i in range(dims)]) #if do_plot: #pt.plot(particles[0].get(), particles[1].get(), "x") from boxtree import TreeBuilder tb = TreeBuilder(ctx) queue.finish() tree = tb(queue, particles, max_particles_in_box=30, debug=True) from boxtree.traversal import FMMTraversalBuilder tg = FMMTraversalBuilder(ctx) trav = tg(queue, tree).get() from boxtree.visualization import TreePlotter plotter = TreePlotter(tree) plotter.draw_tree(fill=False, edgecolor="black") #plotter.draw_box_numbers() plotter.set_bounding_box() from random import randrange, seed seed(7) # {{{ generic box drawing helper def draw_some_box_lists(starts, lists, key_to_box=None, count=5): actual_count = 0 while actual_count < count: if key_to_box is not None: key = randrange(len(key_to_box)) ibox = key_to_box[key] else: key = ibox = randrange(tree.nboxes) start, end = starts[key:key + 2] if start == end: continue #print ibox, start, end, lists[start:end] for jbox in lists[start:end]: plotter.draw_box(jbox, facecolor='yellow') plotter.draw_box(ibox, facecolor='red') actual_count += 1 # }}} if 0: # colleagues draw_some_box_lists(trav.colleagues_starts, trav.colleagues_lists) elif 0: # near neighbors ("list 1") draw_some_box_lists(trav.neighbor_leaves_starts, trav.neighbor_leaves_lists, key_to_box=trav.source_boxes) elif 0: # well-separated siblings (list 2) draw_some_box_lists(trav.sep_siblings_starts, trav.sep_siblings_lists) elif 1: # separated smaller (list 3) draw_some_box_lists(trav.sep_smaller_starts, trav.sep_smaller_lists, key_to_box=trav.source_boxes) elif 1: # separated bigger (list 4) draw_some_box_lists(trav.sep_bigger_starts, trav.sep_bigger_lists) import matplotlib.pyplot as pt pt.show()
def plot_traversal(ctx_getter, do_plot=False): ctx = ctx_getter() queue = cl.CommandQueue(ctx) #for dims in [2, 3]: for dims in [2]: nparticles = 10**4 dtype = np.float64 from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=15) from pytools.obj_array import make_obj_array particles = make_obj_array([ rng.normal(queue, nparticles, dtype=dtype) for i in range(dims)]) #if do_plot: #pt.plot(particles[0].get(), particles[1].get(), "x") from boxtree import TreeBuilder tb = TreeBuilder(ctx) queue.finish() tree = tb(queue, particles, max_particles_in_box=30, debug=True) from boxtree.traversal import FMMTraversalBuilder tg = FMMTraversalBuilder(ctx) trav = tg(queue, tree).get() from boxtree.visualization import TreePlotter plotter = TreePlotter(tree) plotter.draw_tree(fill=False, edgecolor="black") #plotter.draw_box_numbers() plotter.set_bounding_box() from random import randrange, seed seed(7) # {{{ generic box drawing helper def draw_some_box_lists(starts, lists, key_to_box=None, count=5): actual_count = 0 while actual_count < count: if key_to_box is not None: key = randrange(len(key_to_box)) ibox = key_to_box[key] else: key = ibox = randrange(tree.nboxes) start, end = starts[key:key+2] if start == end: continue #print ibox, start, end, lists[start:end] for jbox in lists[start:end]: plotter.draw_box(jbox, facecolor='yellow') plotter.draw_box(ibox, facecolor='red') actual_count += 1 # }}} if 0: # colleagues draw_some_box_lists( trav.colleagues_starts, trav.colleagues_lists) elif 0: # near neighbors ("list 1") draw_some_box_lists( trav.neighbor_leaves_starts, trav.neighbor_leaves_lists, key_to_box=trav.source_boxes) elif 0: # well-separated siblings (list 2) draw_some_box_lists( trav.sep_siblings_starts, trav.sep_siblings_lists) elif 1: # separated smaller (list 3) draw_some_box_lists( trav.sep_smaller_starts, trav.sep_smaller_lists, key_to_box=trav.source_boxes) elif 1: # separated bigger (list 4) draw_some_box_lists( trav.sep_bigger_starts, trav.sep_bigger_lists) import matplotlib.pyplot as pt pt.show()
def make_normal_particle_array(queue, nparticles, dims, dtype, seed=15): from pyopencl.clrandom import RanluxGenerator rng = RanluxGenerator(queue, seed=seed) return make_obj_array( [rng.normal(queue, nparticles, dtype=dtype) for i in range(dims)])