def run_simulation(config): if len(sys.argv) == 4: platform_idx = int(sys.argv[2]) device_idx = int(sys.argv[3]) dev = cl.get_platforms()[platform_idx].get_devices()[device_idx] print("Using device:", dev) ctx = cl.Context(devices=[dev]) else: ctx = cl.create_some_context(interactive=False) queue = cl.CommandQueue(ctx) mf = cl.mem_flags ifmt_f = cl.ImageFormat(cl.channel_order.RGBA, cl.channel_type.FLOAT) gs = config['grid_size'] wgs = 16 clctx = CLContext(ctx, queue, ifmt_f, gs, wgs) sigs = set_up_signals(config) colony, feats, blurs2, blurs4, rdctns, colours = build_programs(clctx, config) sigs_a = sigs[:, :, :4].reshape(gs*gs*4) sigs_b = sigs[:, :, 4:].reshape(gs*gs*4) ifmt_f = cl.ImageFormat(cl.channel_order.RGBA, cl.channel_type.FLOAT) ibuf_1a = cl.Image(ctx, mf.READ_WRITE, ifmt_f, (gs, gs)) ibuf_1b = cl.Image(ctx, mf.READ_WRITE, ifmt_f, (gs, gs)) ibuf_2a = cl.Image(ctx, mf.READ_WRITE, ifmt_f, (gs, gs)) ibuf_2b = cl.Image(ctx, mf.READ_WRITE, ifmt_f, (gs, gs)) cl.enqueue_copy(queue, ibuf_1a, sigs_a, origin=(0, 0), region=(gs, gs)) cl.enqueue_copy(queue, ibuf_1b, sigs_b, origin=(0, 0), region=(gs, gs)) for i in config.get('dump_images', []): dump_image(clctx, colours, ibuf_1a, ibuf_1b, i, 0) n_iters = config['iterations'] feature_v = np.zeros((n_iters, 8, 4), np.float32) for iteration in range(n_iters): colony.genome(queue, (gs, gs), (wgs, wgs), ibuf_1a, ibuf_1b, ibuf_2a, ibuf_2b) colony.convolve_x(queue, (gs, gs), (wgs, wgs), ibuf_2a, ibuf_1a) colony.convolve_y(queue, (gs, gs), (wgs, wgs), ibuf_1a, ibuf_2a) ibuf_1a, ibuf_2a = ibuf_2a, ibuf_1a ibuf_1b, ibuf_2b = ibuf_2b, ibuf_1b feature_v[iteration] = features.get_features( clctx, feats, rdctns, blurs2, blurs4, ibuf_1b) for i in config.get('dump_images', []): dump_image(clctx, colours, ibuf_1a, ibuf_1b, i, iteration+1) if config.get('early_stop') and iteration > 1: m = np.max(feature_v[iteration]) if m < 0.1: break if config.get('dump_final_image'): for i in genome.get_used_genes(config["genome"]): dump_image(clctx, colours, ibuf_1a, ibuf_1b, i, iteration+1, config["genome"]) return iteration, feature_v
def process(config): # Run the simulation, get the resulting feature vector evolution niters, fvs = run.run_simulation(config) # ignore first two FVs due to initial conditions fvs = fvs[2:] # now find mean for each feature fvs = np.mean(fvs, axis=0) # sum up all the blob counts blobs = np.sum(fvs[1:6], axis=0) # reform fvs with iteration count and combined blobs niters = np.ones_like(blobs) * niters fvs = np.array((niters, fvs[0], blobs, fvs[6], fvs[7])) # normalise gs = config["grid_size"] iters = config["iterations"] norms = np.array((iters, (gs**2)/2, (gs**2)/(26*4*5), 0.25, 8.0)) norms = np.kron(norms, np.ones(4)).reshape(5, 4) fvs /= norms # weight scores = np.dot(config["weights"], fvs) # Take the average weight of the genomes in use sigs_used = np.array(genome.get_used_genes(config["genome"])) sigs_used = sigs_used[sigs_used >= 4] - 4 if sigs_used.size == 0: return 0.0 mask = np.ones_like(scores).astype(np.bool) mask[:, sigs_used] = 0 score = np.ma.masked_array(scores, mask).mean() return float(score)