Best Python code snippet using autotest_python
cgp_py3.py
Source:cgp_py3.py
1"""2Cartesian Genetic Programming3=============================4Genetic Programming is concerned with the automatic evolution (as in 5Darwinian evolution) of computational structures (such as mathematical 6equations, computer programs, digital circuits, etc.). CGP is a highly 7efficient and flexible form of Genetic Programming that encodes a graph 8representation of a computer program. It was developed by Julian Miller9in 1999. For more information see: http://cartesiangp.co.uk/10This script written by Petr Dvoracek in 2017. http://flea.name/11"""12import random 13from copy import deepcopy14# The main pillar of this algorithm lies in the directed oriented graph in15# which each node represents a specific operation. 16# The nodes are commonly arranged in square lattice.17DEFAULT_MATRIX_SIZE = (2, 5) # ROWS, COLS18# The interconnection between columns. 19DEFAULT_LEVEL_BACK = 5 # If the value is equal to number of columns then 20 # the interconnection is maximal.21# The operation set. 22# List of tuples(`str` name, `int` arity (inputs), `function` operation). 23DEFAULT_OPERATION_SET = set([("BUF", 1, lambda *arg: arg[0]),24 ("NOT", 1, lambda *arg: ~arg[0]), 25 ("AND", 2, lambda *arg: ~(arg[0] & arg[1])), 26 ("OR", 2, lambda *arg: ~(arg[0] | arg[1])), 27 ("XOR", 2, lambda *arg: arg[0] & arg[1]), 28 ("NAND", 2, lambda *arg: arg[0] | arg[1]),29 ("NOR", 2, lambda *arg: arg[0] ^ arg[1]), 30 ("XNOR", 2, lambda *arg: ~(arg[0] ^ arg[1])),31 ])32# Lets find full adder by default.33# For all input combinations define:34DEFAULT_INPUT_DATA = [0b00001111, # A35 0b00110011, # B36 0b01010101] # Carry in37# Define output combinations38DEFAULT_TRAINING_DATA = [0b01101001, # SUM39 0b00010111] # Carry out40# The CGP is a genetic algorithm. Therefore, we need to define evolutionary parameters.41# The number of candidate solutions.42DEFAULT_POP_SIZE = 5 43# Maximal generations (how long the algorithm will run)44DEFAULT_MAX_GENERATIONS = 10000 45# This function returns the list of objects with poistion `index` in the `nested_list` (list of arrays).46# Example: get_sublist(1, [("A", 3, 5), ("C", 1), ("D", "C")]) --> [3, 1, "C"]47get_sublist = lambda index, nested_list : list(map(lambda sublist: sublist[index], nested_list))48# How many genes will be mutated.49# 10% of the chromosome length can be mutated. Chromosome length = each_node * len(node) + len(last_node); The length of node is maximal arity + the operation.50DEFAULT_MUTATIONS = int((DEFAULT_MATRIX_SIZE[0] * DEFAULT_MATRIX_SIZE[1] * (max(get_sublist(1, DEFAULT_OPERATION_SET)) + 1) + len(DEFAULT_TRAINING_DATA)) * 0.10)51#DEFAULT_MUTATIONS = 452class CGP(object):53 # Printing if we find better fitness during the evolution.54 PRINT_INFO = False55 def __set_connections(self):56 """ Calculates the set of valid connections """57 # For each column create valid connection interval from previous `l-back` connections.58 self._valid_connection = [(self.rows * (column - self.level_back), self.rows * column) for column in range(self.columns)] 59 # Filter invalid indexes which are negative -> make them 060 self._valid_connection = list(map(lambda sublist: list(map(lambda x: x if (x >= 0) else 0, sublist)), self._valid_connection))61 def __test_operation_set(self, operation_set):62 """ Check the validity of operation set.63 64 Parameters65 operation_set : list of operations66 Each opeartaion is a tuple(`str` name, `int` arity, `function` operation). 67 Raises68 CGPError69 If the operation set contains inconsistent operations.70 """71 72 # Test for empty set.73 if not operation_set:74 raise CGPError("EMPTY_SET")75 # Test if each operation has a triplet of (str, int, function) and tests the arity.76 for operation in operation_set:77 if len(operation) != 3 or type(operation[0]) is not str \78 or type(operation[1]) is not int \79 or not callable(operation[2]):80 raise CGPError("INCONSISTENT_SET", value=operation)81 # Negative arity of function is stupid. Unless, you are doing some deep shit math. 82 if operation[1] < 0: 83 raise CGPError("INCONSISTENT_ARITY", value=operation)84 def set_data(self, input_data, training_data):85 """ Set Input and output data86 87 Parameters88 input_data : list89 The list of input data. In the case of digital circuit design, 90 this contains all the input combinations. 91 training_data : list92 The target circuit.93 """94 self.input_data_range = list(range(-len(input_data), 0))95 self.input_data = input_data96 self.training_data = training_data97 def set_matrix(self, matrix, level_back=0):98 """ Initate the matrix. 99 Parameters100 matrix : tuple (int, int)101 This tuple represents the size of matrix (rows, columns)102 Other Parameters103 level_back : int104 The interconnection between columns.105 """106 self.matrix = matrix # Though, it is not used.107 self.rows = matrix[0]108 self.columns = matrix[1]109 self.level_back = level_back if level_back > 0 else matrix[1] # If `level_back` has invalid value (0 or less), then the interconnection is maximal. 110 self.__set_connections()111 112 def set_operation_set(self, operation_set):113 """ Set the operation set.114 Parameters115 operation_set : list of operations116 Each opeartaion is a tuple(`str` name, `int` arity, `function` operation). 117 Raises118 CGPError119 If the operation set contains inconsistent operations.120 """121 self.__test_operation_set(operation_set)122 self.operation_set = operation_set123 # Transpose the operation set data.124 self.operations = get_sublist(2, operation_set)125 self.operations_arity = get_sublist(1, operation_set)126 self.operations_names = get_sublist(0, operation_set)127 # Get maximal arity128 self.maximal_arity = max(self.operations_arity)129 130 def __init__(self, matrix, operation_set, input_data, training_data, level_back=0):131 """ Initate the matrix, node arrangement, operation set and i/o data. 132 Parameters133 matrix : tuple (int, int)134 This tuple represents the size of matrix (rows, columns)135 operation set : list of tuples (`str` name, `int` arity, `function` operation). 136 The operation set.137 input_data : list138 The list of input data. In the case of digital circuit design, 139 this contains all the input combinations. 140 training_data : list141 The target circuit.142 Other Parameters143 level_back : int144 The interconnection between columns.145 Raises146 CGPError147 If the operation set contains inconsistent operations.148 """149 super(CGP, self).__init__()150 151 self.set_matrix(matrix, level_back=level_back)152 self.set_operation_set(operation_set)153 self.set_data(input_data, training_data)154 def __create_chromosome(self):155 """ Initate the chromosome. 156 The chromsome encodes the interconnection of the CGP graph. See: http://www.oranchak.com/cgp/doc/fig2.jpg157 """158 # Init array for chromosome159 chromosome = []160 # This function selects random value from input data or previous node in the graph.161 connect = lambda connection: random.choice(self.input_data_range + list(range(connection[0], connection[1])))162 163 # Nodes may differ by their connection between columns. The interconnection is depended on the value of level back. 164 for column_index in range(self.columns):165 # Get valid connection range for nodes in the column166 valid_con = self._valid_connection[column_index]167 # Function for the creation of the node. Firstly creates the connections, then adds the node operation. 168 create_node = lambda: [connect(valid_con) for _ in range(self.maximal_arity)] + [random.choice(self.operations)]169 chromosome += [create_node() for _ in range(self.rows)]170 # Add last `node` which binds the primary outputs of the graph to nodes.171 valid_con = (0, len(chromosome))172 chromosome += [[connect(valid_con) for _ in self.training_data]]173 return chromosome174 def __init_pop(self, pop_size):175 """ Initiate the population of `pop_size` size """176 self.pop = [self.__create_chromosome() for _ in range(pop_size)]177 # The best individual is saved in `self.best_chrom` with the best fitness `self.fitness`.178 self.best_chrom = deepcopy(self.pop[0])179 self.best_fitness = self.max_fitness180 def __mutate_gene(self, chromosome):181 """ Mutate random value in a `chromsome`. 182 183 Parameters184 chromosome : chromsome strucutre185 The representation of candidate solution which is subject to a mutation. 186 """187 # This function selects random value from input data or previous node in the graph.188 connect = lambda connection: random.choice(self.input_data_range + list(range(connection[0], connection[1])))189 # Select some node190 random_node_idx = random.randint(0, len(chromosome) - 1)191 random_node = chromosome[random_node_idx]192 193 # And select an index from the node194 random_idx = random.randint(0, len(random_node) - 1) # Note: A <= rnd <= B195 previous_value = random_node[random_idx]196 if random_node is chromosome[-1]:197 # We mutate the last node198 while previous_value == random_node[random_idx]:199 random_node[random_idx] = connect((0, len(chromosome)))200 elif random_idx == self.maximal_arity:201 # We mutate the operation (indexing from 0)202 while previous_value == random_node[random_idx]:203 random_node[random_idx] = random.choice(self.operations)204 else:205 # We mutate the connection206 while previous_value == random_node[random_idx]:207 random_node[random_idx] = connect(self._valid_connection[ random_node_idx // self.rows ])208 def mutate(self):209 """ Creates a copy of the best solution and mutates it random-times.210 Return211 chromsome : chromosome structure212 The representation of the other candidate solution, which is similar to the best found solution.213 """214 # Copy the best chromsome215 chromosome = deepcopy(self.best_chrom)216 # And mutate it as much as possible217 for _ in range(random.randint(1, self.mutation_rate+1)): # Mutate it at least once. Else the chromsome wouldn't change.218 self.__mutate_gene(chromosome)219 return chromosome220 def init_eval(self):221 """ This function is started before the run of evolution. """222 # Buffer for the evaluation.223 buffer_data = deepcopy(self.input_data) + list(range(self.rows * self.columns + len(self.training_data)))224 buffer_indexes = list(range(-len(self.input_data), len(buffer_data) - len(self.input_data)))225 self.buffer = dict(zip(buffer_indexes, buffer_data))226 227 # Maximal fitness228 self.max_fitness = len(self.training_data) * (2 ** len(self.input_data))229 # Fitness mask.230 # V mask V The number of bites V # We are doing parallel evaluation. 231 self.bitmask = 2 ** (2 ** len(self.input_data)) - 1232 # Set generations.233 self.generation = 0234 def chrom_to_str(self, chromosome):235 """ Creates a string representation of chromosome, in which the nodes are aligned into a lattice. 236 Each node has syntax `index` : [`previous index`, ... , `previous index`, `Function name`] 237 If the node was primary output, then the node is ended with a string `<- `. 238 The primary outputs are also printed in the last line for the sake of their permutation. 239 Parameters240 chromsome : chromosome structure241 The representation of chromosome.242 Returns243 str244 The string representation of chromosome.245 """246 # Some math stuff247 max_input_strlen = len(str(self.columns * self.rows))248 max_length_of_operation_string = max(list(map(len, self.operations_names)))249 chrom_str = ""250 for i in range(self.rows):251 line = ""252 for j in range(self.columns):253 # Grab the node index 254 node_idx = j * self.rows + i255 node = chromosome[node_idx]256 # Find the inputs, and align them.257 inputs = node[:-1] # The last node is operation; the rest are the inputs.258 aligned_inputs = list(map(lambda x: str(x).rjust(max_input_strlen), inputs))259 # Find out the operation name and align it.260 operation = node[-1]261 operation_index = self.operations.index(operation)262 operation_name = self.operations_names[operation_index]263 aligned_operation_name = operation_name.rjust(max_length_of_operation_string)264 # save it265 if node_idx in chromosome[-1]:266 flag = "<- "267 else:268 flag = " "269 line += str(node_idx).rjust(max_input_strlen) + ": [" + ", ".join(aligned_inputs) + ", " + aligned_operation_name + "]" + flag270 chrom_str += line + "\n"271 return chrom_str + str(chromosome[-1])272 273 def eval(self, chromosome):274 """ Evaluates the `chromosome` and returns the fitness value. Also checks if we found a better solution.275 Parameters276 chromsome : chromosome structure277 The representation of a candidate solution.278 Returns279 int : fitness value280 The quality of the candidate solution.281 TODO282 Optimise it. Skip neutral mutations. Skip unused nodes. (Maybe use C/C++ function?)283 Move the fitness check 284 """285 fitness = 0 286 # Evaluate each node.287 for idx, node in enumerate(chromosome[:-1]):288 # TODO SKIP unused nodes289 # Save the value of the operation `node[-1]`. The arguments are given in `node[:-1]` and they are the indexes into the `buffer`.290 self.buffer[idx] = node[-1](*[self.buffer[i] for i in node[:-1]])291 # Grab the value 292 for idx, target in zip(chromosome[-1], self.training_data):293 #print idx, target, self.bitmask294 fitness += bin((self.buffer[idx] ^ target) & self.bitmask).count("1")295 # Checks if we found a better solution.296 # Shouldnt be here.297 if fitness <= self.best_fitness:298 if CGP.PRINT_INFO and fitness < self.best_fitness:299 print("Generation: " + str(self.generation).rjust(10) + "\tFitness: " + str(fitness))300 self.best_fitness = fitness301 self.best_chrom = deepcopy(chromosome)302 return fitness303 def run(self, pop_size, mutations, generations):304 """ Runs the evolution.305 Parameters306 chromsome : chromosome structure307 The representation of chromosome.308 """309 # Init evaluation310 self.init_eval()311 # Init mutation312 self.mutation_rate = mutations313 # Creates first population `self.pop` and evaluates it `self.eval`.314 self.__init_pop(pop_size)315 # Run evolution316 for self.generation in range(generations):317 # Evaluate pop318 list(map(self.eval, self.pop))319 # Mutate pop; fix the peroformance 320 new_pop = [self.mutate() for _ in self.pop]321 self.pop = new_pop322 #break323 324 def __str__(self):325 return self.chrom_to_str(self.best_chrom)326 327class CGPError(Exception):328 def __init__(self, error_code, value=""):329 """ Inits the exception. """330 self.error_code = error_code331 self.value = value332 def __str__(self):333 """ Print error message, depending on the given error code. """334 error_msg = {335 "EMPTY_SET" : "The operation set is empty.",336 "INCONSISTENT_SET" : "The operation set contains inconsistent operation: " + repr(self.value) + "\n"\337 + "Please use triplet (`str` name, `int` arity, `function` operation)",338 "INCONSISTENT_ARITY" : "The arity of operation " + repr(self.value) +" can not be negative.", # Note: if you are doing some high math sh.t, then write your own CGP with blackjack and h..kers.339 }.get(self.error_code, "Unknown error - " + repr(self.error_code))340 return error_msg341if __name__ == '__main__':342 CGP.PRINT_INFO = True343 cgp = CGP(DEFAULT_MATRIX_SIZE, DEFAULT_OPERATION_SET, DEFAULT_INPUT_DATA, DEFAULT_TRAINING_DATA)344 cgp.run(DEFAULT_POP_SIZE, DEFAULT_MUTATIONS, DEFAULT_MAX_GENERATIONS)...
cgp.py
Source:cgp.py
1"""2Cartesian Genetic Programming3=============================4Genetic Programming is concerned with the automatic evolution (as in 5Darwinian evolution) of computational structures (such as mathematical 6equations, computer programs, digital circuits, etc.). CGP is a highly 7efficient and flexible form of Genetic Programming that encodes a graph 8representation of a computer program. It was developed by Julian Miller9in 1999. For more information see: http://cartesiangp.co.uk/10This script written by Petr Dvoracek in 2017. http://flea.name/11"""12import random 13from copy import deepcopy14# The main pillar of this algorithm lies in the directed oriented graph in15# which each node represents a specific operation. 16# The nodes are commonly arranged in square lattice.17DEFAULT_MATRIX_SIZE = (2, 5) # ROWS, COLS18# The interconnection between columns. 19DEFAULT_LEVEL_BACK = 5 # If the value is equal to number of columns then 20 # the interconnection is maximal.21# The operation set. 22# List of tuples(`str` name, `int` arity (inputs), `function` operation). 23DEFAULT_OPERATION_SET = set([("BUF", 1, lambda *arg: arg[0]),24 ("NOT", 1, lambda *arg: ~arg[0]), 25 ("NAND", 2, lambda *arg: ~(arg[0] & arg[1])), 26 ("NOR", 2, lambda *arg: ~(arg[0] | arg[1])), 27 ("AND", 2, lambda *arg: arg[0] & arg[1]), 28 ("OR", 2, lambda *arg: arg[0] | arg[1]),29 ("XOR", 2, lambda *arg: arg[0] ^ arg[1]), 30 ("XNOR", 2, lambda *arg: ~(arg[0] ^ arg[1])),31 ])32# Lets find full adder by default.33# For all input combinations define:34DEFAULT_INPUT_DATA = [0b00001111, # A35 0b00110011, # B36 0b01010101] # Carry in37# Define output combinations38DEFAULT_TRAINING_DATA = [0b01101001, # SUM39 0b00010111] # Carry out40# The CGP is a genetic algorithm. Therefore, we need to define evolutionary parameters.41# The number of candidate solutions.42DEFAULT_POP_SIZE = 5 43# Maximal generations (how long the algorithm will run)44DEFAULT_MAX_GENERATIONS = 10000 45# This function returns the list of objects with poistion `index` in the `nested_list` (list of arrays).46# Example: get_sublist(1, [("A", 3, 5), ("C", 1), ("D", "C")]) --> [3, 1, "C"]47get_sublist = lambda index, nested_list : map(lambda sublist: sublist[index], nested_list)48# How many genes will be mutated.49# 10% of the chromosome length can be mutated. Chromosome length = each_node * len(node) + len(last_node); The length of node is maximal arity + the operation.50DEFAULT_MUTATIONS = int((DEFAULT_MATRIX_SIZE[0] * DEFAULT_MATRIX_SIZE[1] * (max(get_sublist(1, DEFAULT_OPERATION_SET)) + 1) + len(DEFAULT_TRAINING_DATA)) * 0.10)51#DEFAULT_MUTATIONS = 452class CGP(object):53 # Printing if we find better fitness during the evolution.54 PRINT_INFO = False55 def __set_connections(self):56 """ Calculates the set of valid connections """57 # For each column create valid connection interval from previous `l-back` connections.58 self._valid_connection = [(self.rows * (column - self.level_back), self.rows * column) for column in xrange(self.columns)] 59 # Filter invalid indexes which are negative -> make them 060 self._valid_connection = map(lambda sublist: map(lambda x: x if (x >= 0) else 0, sublist), self._valid_connection)61 def __test_operation_set(self, operation_set):62 """ Check the validity of operation set.63 64 Parameters65 operation_set : list of operations66 Each opeartaion is a tuple(`str` name, `int` arity, `function` operation). 67 Raises68 CGPError69 If the operation set contains inconsistent operations.70 """71 72 # Test for empty set.73 if not operation_set:74 raise CGPError("EMPTY_SET")75 # Test if each operation has a triplet of (str, int, function) and tests the arity.76 for operation in operation_set:77 if len(operation) != 3 or type(operation[0]) is not str \78 or type(operation[1]) is not int \79 or not callable(operation[2]):80 raise CGPError("INCONSISTENT_SET", value=operation)81 # Negative arity of function is stupid. Unless, you are doing some deep shit math. 82 if operation[1] < 0: 83 raise CGPError("INCONSISTENT_ARITY", value=operation)84 def set_data(self, input_data, training_data):85 """ Set Input and output data86 87 Parameters88 input_data : list89 The list of input data. In the case of digital circuit design, 90 this contains all the input combinations. 91 training_data : list92 The target circuit.93 """94 self.input_data_range = range(-len(input_data), 0)95 self.input_data = input_data96 self.training_data = training_data97 def set_matrix(self, matrix, level_back=0):98 """ Initate the matrix. 99 Parameters100 matrix : tuple (int, int)101 This tuple represents the size of matrix (rows, columns)102 Other Parameters103 level_back : int104 The interconnection between columns.105 """106 self.matrix = matrix # Though, it is not used.107 self.rows = matrix[0]108 self.columns = matrix[1]109 self.level_back = level_back if level_back > 0 else matrix[1] # If `level_back` has invalid value (0 or less), then the interconnection is maximal. 110 self.__set_connections()111 112 def set_operation_set(self, operation_set):113 """ Set the operation set.114 Parameters115 operation_set : list of operations116 Each opeartaion is a tuple(`str` name, `int` arity, `function` operation). 117 Raises118 CGPError119 If the operation set contains inconsistent operations.120 """121 self.__test_operation_set(operation_set)122 self.operation_set = operation_set123 # Transpose the operation set data.124 self.operations = get_sublist(2, operation_set)125 self.operations_arity = get_sublist(1, operation_set)126 self.operations_names = get_sublist(0, operation_set)127 # Get maximal arity128 self.maximal_arity = max(self.operations_arity)129 130 def __init__(self, matrix, operation_set, input_data, training_data, level_back=0):131 """ Initate the matrix, node arrangement, operation set and i/o data. 132 Parameters133 matrix : tuple (int, int)134 This tuple represents the size of matrix (rows, columns)135 operation set : list of tuples (`str` name, `int` arity, `function` operation). 136 The operation set.137 input_data : list138 The list of input data. In the case of digital circuit design, 139 this contains all the input combinations. 140 training_data : list141 The target circuit.142 Other Parameters143 level_back : int144 The interconnection between columns.145 Raises146 CGPError147 If the operation set contains inconsistent operations.148 """149 super(CGP, self).__init__()150 151 self.set_matrix(matrix, level_back=level_back)152 self.set_operation_set(operation_set)153 self.set_data(input_data, training_data)154 def __create_chromosome(self):155 """ Initate the chromosome. 156 The chromsome encodes the interconnection of the CGP graph. See: http://www.oranchak.com/cgp/doc/fig2.jpg157 """158 # Init array for chromosome159 chromosome = []160 # This function selects random value from input data or previous node in the graph.161 connect = lambda connection: random.choice(self.input_data_range + range(connection[0], connection[1]))162 163 # Nodes may differ by their connection between columns. The interconnection is depended on the value of level back. 164 for column_index in xrange(self.columns):165 # Get valid connection range for nodes in the column166 valid_con = self._valid_connection[column_index]167 # Function for the creation of the node. Firstly creates the connections, then adds the node operation. 168 create_node = lambda: [connect(valid_con) for _ in xrange(self.maximal_arity)] + [random.choice(self.operations)]169 chromosome += [create_node() for _ in xrange(self.rows)]170 # Add last `node` which binds the primary outputs of the graph to nodes.171 valid_con = (0, len(chromosome))172 chromosome += [[connect(valid_con) for _ in self.training_data]]173 return chromosome174 def __init_pop(self, pop_size):175 """ Initiate the population of `pop_size` size """176 self.pop = [self.__create_chromosome() for _ in xrange(pop_size)]177 # The best individual is saved in `self.best_chrom` with the best fitness `self.fitness`.178 self.best_chrom = deepcopy(self.pop[0])179 self.best_fitness = self.max_fitness180 def __mutate_gene(self, chromosome):181 """ Mutate random value in a `chromsome`. 182 183 Parameters184 chromosome : chromsome strucutre185 The representation of candidate solution which is subject to a mutation. 186 """187 # This function selects random value from input data or previous node in the graph.188 connect = lambda connection: random.choice(self.input_data_range + range(connection[0], connection[1]))189 # Select some node190 random_node_idx = random.randint(0, len(chromosome) - 1)191 random_node = chromosome[random_node_idx]192 193 # And select an index from the node194 random_idx = random.randint(0, len(random_node) - 1) # Note: A <= rnd <= B195 previous_value = random_node[random_idx]196 if random_node is chromosome[-1]:197 # We mutate the last node198 while previous_value == random_node[random_idx]:199 random_node[random_idx] = connect((0, len(chromosome)))200 elif random_idx == self.maximal_arity:201 # We mutate the operation (indexing from 0)202 while previous_value == random_node[random_idx]:203 random_node[random_idx] = random.choice(self.operations)204 else:205 # We mutate the connection206 while previous_value == random_node[random_idx]:207 random_node[random_idx] = connect(self._valid_connection[ random_node_idx / self.rows ])208 def mutate(self):209 """ Creates a copy of the best solution and mutates it random-times.210 Return211 chromsome : chromosome structure212 The representation of the other candidate solution, which is similar to the best found solution.213 """214 # Copy the best chromsome215 chromosome = deepcopy(self.best_chrom)216 # And mutate it as much as possible217 for _ in xrange(random.randint(1, self.mutation_rate+1)): # Mutate it at least once. Else the chromsome wouldn't change.218 self.__mutate_gene(chromosome)219 return chromosome220 def init_eval(self):221 """ This function is started before the run of evolution. """222 # Buffer for the evaluation.223 buffer_data = deepcopy(self.input_data) + range(self.rows * self.columns + len(self.training_data))224 buffer_indexes = range(-len(self.input_data), len(buffer_data) - len(self.input_data))225 self.buffer = dict(zip(buffer_indexes, buffer_data))226 227 # Maximal fitness228 self.max_fitness = len(self.training_data) * (2 ** len(self.input_data))229 # Fitness mask.230 # V mask V The number of bites V # We are doing parallel evaluation. 231 self.bitmask = 2 ** (2 ** len(self.input_data)) - 1232 # Set generations.233 self.generation = 0234 def chrom_to_str(self, chromosome):235 """ Creates a string representation of chromosome, in which the nodes are aligned into a lattice. 236 Each node has syntax `index` : [`previous index`, ... , `previous index`, `Function name`] 237 If the node was primary output, then the node is ended with a string `<- `. 238 The primary outputs are also printed in the last line for the sake of their permutation. 239 Parameters240 chromsome : chromosome structure241 The representation of chromosome.242 Returns243 str244 The string representation of chromosome.245 """246 # Some math stuff247 max_input_strlen = len(str(self.columns * self.rows))248 max_length_of_operation_string = max(map(len, self.operations_names))249 chrom_str = ""250 for i in xrange(self.rows):251 line = ""252 for j in xrange(self.columns):253 # Grab the node index 254 node_idx = j * self.rows + i255 node = chromosome[node_idx]256 # Find the inputs, and align them.257 inputs = node[:-1] # The last node is operation; the rest are the inputs.258 aligned_inputs = map(lambda x: str(x).rjust(max_input_strlen), inputs)259 # Find out the operation name and align it.260 operation = node[-1]261 operation_index = self.operations.index(operation)262 operation_name = self.operations_names[operation_index]263 aligned_operation_name = operation_name.rjust(max_length_of_operation_string)264 # save it265 if node_idx in chromosome[-1]:266 flag = "<- "267 else:268 flag = " "269 line += str(node_idx).rjust(max_input_strlen) + ": [" + ", ".join(aligned_inputs) + ", " + aligned_operation_name + "]" + flag270 chrom_str += line + "\n"271 return chrom_str + str(chromosome[-1])272 273 def eval(self, chromosome):274 """ Evaluates the `chromosome` and returns the fitness value. Also checks if we found a better solution.275 Parameters276 chromsome : chromosome structure277 The representation of a candidate solution.278 Returns279 int : fitness value280 The quality of the candidate solution.281 TODO282 Optimise it. Skip neutral mutations. Skip unused nodes. (Maybe use C/C++ function?)283 Move the fitness check 284 """285 fitness = 0 286 # Evaluate each node.287 for idx, node in enumerate(chromosome[:-1]):288 # TODO SKIP unused nodes289 # Save the value of the operation `node[-1]`. The arguments are given in `node[:-1]` and they are the indexes into the `buffer`.290 self.buffer[idx] = node[-1](*[self.buffer[i] for i in node[:-1]])291 # Grab the value 292 for idx, target in zip(chromosome[-1], self.training_data):293 #print idx, target, self.bitmask294 fitness += bin((self.buffer[idx] ^ target) & self.bitmask).count("1")295 # Checks if we found a better solution.296 # Shouldnt be here.297 if fitness <= self.best_fitness:298 if CGP.PRINT_INFO and fitness < self.best_fitness:299 print "Generation: " + str(self.generation).rjust(10) + "\tFitness: " + str(fitness)300 self.best_fitness = fitness301 self.best_chrom = deepcopy(chromosome)302 return fitness303 def run(self, pop_size, mutations, generations):304 """ Runs the evolution.305 Parameters306 chromsome : chromosome structure307 The representation of chromosome.308 """309 # Init evaluation310 self.init_eval()311 # Init mutation312 self.mutation_rate = mutations313 # Creates first population `self.pop` and evaluates it `self.eval`.314 self.__init_pop(pop_size)315 # Run evolution316 for self.generation in xrange(generations):317 # Evaluate pop318 map(self.eval, self.pop)319 # Mutate pop; fix the peroformance 320 new_pop = [self.mutate() for _ in self.pop]321 self.pop = new_pop322 #break323 324 def __str__(self):325 return self.chrom_to_str(self.best_chrom)326 327class CGPError(Exception):328 def __init__(self, error_code, value=""):329 """ Inits the exception. """330 self.error_code = error_code331 self.value = value332 def __str__(self):333 """ Print error message, depending on the given error code. """334 error_msg = {335 "EMPTY_SET" : "The operation set is empty.",336 "INCONSISTENT_SET" : "The operation set contains inconsistent operation: " + repr(self.value) + "\n"\337 + "Please use triplet (`str` name, `int` arity, `function` operation)",338 "INCONSISTENT_ARITY" : "The arity of operation " + repr(self.value) +" can not be negative.", # Note: if you are doing some high math sh.t, then write your own CGP with blackjack and h..kers.339 }.get(self.error_code, "Unknown error - " + repr(self.error_code))340 return error_msg341if __name__ == '__main__':342 CGP.PRINT_INFO = True343 cgp = CGP(DEFAULT_MATRIX_SIZE, DEFAULT_OPERATION_SET, DEFAULT_INPUT_DATA, DEFAULT_TRAINING_DATA)344 cgp.run(DEFAULT_POP_SIZE, DEFAULT_MUTATIONS, DEFAULT_MAX_GENERATIONS)...
base.py
Source:base.py
...60 self.client = DatabaseClient(self)61 self.creation = DatabaseCreation(self)62 self.introspection = DatabaseIntrospection(self)63 self.validation = DatabaseValidation()64 def _valid_connection(self):65 if self.connection is not None:66 try:67 self.connection.ping()68 return True69 except DatabaseError:70 self.connection.close()71 self.connection = None72 return False73 def _cursor(self):74 if not self._valid_connection():75 kwargs = {76 #'conv': django_conversions,77 'charset': 'utf8',78 'use_unicode': True,79 }80 settings_dict = self.settings_dict81 if settings_dict['DATABASE_USER']:82 kwargs['user'] = settings_dict['DATABASE_USER']83 if settings_dict['DATABASE_NAME']:84 kwargs['db'] = settings_dict['DATABASE_NAME']85 if settings_dict['DATABASE_PASSWORD']:86 kwargs['passwd'] = settings_dict['DATABASE_PASSWORD']87 if settings_dict['DATABASE_HOST'].startswith('/'):88 kwargs['unix_socket'] = settings_dict['DATABASE_HOST']89 elif settings_dict['DATABASE_HOST']:90 kwargs['host'] = settings_dict['DATABASE_HOST']91 if settings_dict['DATABASE_PORT']:92 kwargs['port'] = int(settings_dict['DATABASE_PORT'])93 kwargs.update(settings_dict['DATABASE_OPTIONS'])94 self.connection = eventlet.db_pool.ConnectionPool.connect(MySQLdb, 15, **kwargs)95 connection_created.send(sender=self.__class__)96 cursor = mysqldb_base.CursorWrapper(self.connection.cursor())97 return cursor98 def _rollback(self):99 try:100 BaseDatabaseWrapper._rollback(self)101 except Database.NotSupportedError:102 pass103 def get_server_version(self):104 if not self.server_version:105 if not self._valid_connection():106 self.cursor()107 self.server_version = self.connection._obj.get_server_info()108 #m = server_version_re.match(self.connection.get_server_version())109 #if not m:110 # raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_version())111 #self.server_version = tuple([int(x) for x in m.groups()])...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!