import isaac as isc import random from copy import deepcopy from sys import stdout from itertools import product from deap import algorithms from deap import base from deap import creator from deap import tools as deap_tools from numpy import cumsum import tools fetch_types = [isc.fetching_policy_type.FETCH_FROM_LOCAL, isc.fetching_policy_type.FETCH_FROM_LOCAL, isc.fetching_policy_type.FETCH_FROM_LOCAL, isc.fetching_policy_type.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 (isc.OperationNotSupported, isc.LaunchOutOfResources, isc.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: 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 (isc.OperationNotSupported, isc.LaunchOutOfResources, isc.MemObjectAllocationFailure ): pass genome = encode(list(initializer.next())) hof.update(population) x = [] y = [] it = 0 while len(cache) < naccept and it