import isaac as sc import random from copy import deepcopy from sys import stdout from itertools import product from external.deap import base from external.deap import creator from external.deap import tools as deap_tools from numpy import cumsum import tools fetch_types = [sc.templates.FETCH_FROM_GLOBAL_CONTIGUOUS, sc.templates.FETCH_FROM_GLOBAL_STRIDED, sc.templates.FETCH_FROM_LOCAL, sc.templates.FETCH_FROM_LOCAL] def exhaustive(template, sizes, context): tree, _ = tools.tree_of(template, sizes, context) metric = tools.metric_of(template) nbits = tools.genetic_infos_of(template)['nbits'] categorical = tools.genetic_infos_of(template)['categorical'] ranges = [range(2**x) for x in nbits] ranges = list(product(*ranges)) timings = {} best = None for idx, r in enumerate(ranges): parameters = tuple([fetch_types[x] if i in categorical else 2**x for i,x in enumerate(r)]) try: time = tools.benchmark(template, parameters, tree) if not best or time < best[1]: best = parameters, time except (sc.OperationNotSupported, sc.LaunchOutOfResources, sc.MemObjectAllocationFailure): pass if best: stdout.write('%.2f %% | Best %.2f [ for %s ]\r'%(float(idx*100)/len(ranges),metric(sizes, best[1]), best[0])) return best[0] def genetic(template, sizes, context, naccept=200, niter = 1000, cxpb=0.4, mutpb=0.4, popsize = 10, initializer = None, prior = None): tree, _ = tools.tree_of(template, sizes, context) metric = tools.metric_of(template) genetic_infos = tools.genetic_infos_of(template) nbits = genetic_infos['nbits'] offsets = cumsum([0] + nbits) def bin2gray(A): g = [int(A[0])] for i in range(1, len(A)): g += [int(A[i-1] != A[i])] return g def gray2int(A): b = [A[0]] for i in range(1, len(A)): b += [int(b[i-1] != A[i])] return int(''.join(map(str,b)), 2) def encode(genome): encoded = [bin2gray(bin(x)[2:].zfill(nb)) for x, nb in zip(genome, nbits)] return sum(encoded, []) def decode(genome): result = [] for off1,off2 in zip(offsets[:-1],offsets[1:]): result += [gray2int(genome[off1:off2])] result = [fetch_types[x] if i in genetic_infos['categorical'] else 2**x for i,x in enumerate(result)] return result def evaluate(genome): idx = tuple(genome) if idx not in cache: print decode(genome) cache[idx] = tools.benchmark(template, decode(genome), tree) return cache[idx], cache = {} hof = deap_tools.HallOfFame(1) creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) toolbox = base.Toolbox() toolbox.register("evaluate", evaluate) toolbox.register("mate", deap_tools.cxTwoPoint) toolbox.register("mutate", deap_tools.mutFlipBit) toolbox.register("select", deap_tools.selNSGA2) #Initialization if initializer is None: initializer = ([random.randint(0, 2**x) for x in nbits] for i in iter(int,1)) population = [] genome = encode(prior if prior else list(initializer.next())) while len(population) < popsize: individual = creator.Individual(genome) try: individual.fitness.values = toolbox.evaluate(genome) population += [individual] except (sc.OperationNotSupported, sc.LaunchOutOfResources, sc.MemObjectAllocationFailure ): pass genome = encode(list(initializer.next())) hof.update(population) x = [] y = [] it = 0 while len(cache) < naccept and it