Example #1
0
File: run.py Project: adamgreig/iib
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
Example #2
0
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)