Spaces:
Sleeping
Sleeping
import random | |
from dsl import * | |
# Dictionary of DSLs or primitive functions and terminals | |
import random | |
# Dictionary of DSLs or primitive functions and terminals | |
FUNCTIONS_dictionary = { | |
'flip_horizontal': (flip_horizontal, 1), | |
'flip_vertical': (flip_vertical, 1), | |
'rotate_90': (rotate_90, 1), | |
'rotate_180': (rotate_180, 1), | |
'rotate_270': (rotate_270, 1), | |
'identity': (identity, 1), | |
'transform_blue_to_red': (transform_blue_to_red, 1), | |
'vertical_mirror': (vmirrors, 1), | |
'horizontal_mirror': (hmirror, 1), | |
'diagonal_mirror': (diamirror, 1), | |
'find_center_pixel':(find_center_pixel,1) | |
# Uncommented functions (if needed) | |
# 'extract_largest_row': (extract_largest_row, 1), | |
# 'extract_bottom_object': (extract_bottom_object, 1), | |
# 'extract_topmost_object': (extract_topmost_object, 1), | |
# 'fill_downward': (fill_downward, 1), | |
# 'keep_bottom_object': (keep_bottom_object, 1), | |
# 'remove_least_dominant_pixel': (remove_least_dominant_pixel, 1), | |
# 'remove_center_object': (remove_center_object, 1), | |
# 'remove_below_horizontal_line': (remove_below_horizontal_line, 1), | |
# 'swap_objects': (swap_objects, 1), | |
# 'draw_horizontal_vertical': (draw_horizontal_vertical, 1), | |
} | |
TERMINALS = [ | |
('input_grid', lambda: None, 0) | |
] | |
class Node: | |
_id_counter = 0 | |
def __init__(self, value, children=None): | |
self.id = Node._id_counter | |
Node._id_counter += 1 | |
self.value = value | |
self.children = children if children is not None else [] | |
def __str__(self): | |
if self.children: | |
return f"{self.value}({', '.join(str(child) for child in self.children)})" | |
else: | |
return str(self.value) | |
def evaluate(self, input_grid): | |
if not self.children: | |
if self.value == "input_grid": | |
return input_grid | |
else: | |
raise ValueError(f"Unknown terminal: {self.value}") | |
else: | |
child_values = [child.evaluate(input_grid) for child in self.children] | |
func_data = FUNCTIONS_dictionary.get(self.value) | |
if func_data is None: | |
raise ValueError(f"Unknown function: {self.value}") | |
func, _ = func_data | |
return func(*child_values) | |
def generate_random_program(max_depth, current_depth=0): | |
if current_depth >= max_depth or (current_depth > 0 and random.random() < 0.2): | |
terminal = random.choice(TERMINALS) | |
return Node(terminal[0]) | |
else: | |
func_name, (func, arity) = random.choice(list(FUNCTIONS_dictionary.items())) | |
children = [generate_random_program(max_depth, current_depth + 1) for _ in range(arity)] | |
return Node(func_name, children) | |
def get_all_nodes(program): | |
nodes = [program] | |
for child in program.children: | |
nodes.extend(get_all_nodes(child)) | |
return nodes | |
class Generation: | |
def __init__(self, best_fitness, population, mutation_rate, crossover_rate, max_depth): | |
self.best_fitness = best_fitness | |
self.population = population | |
self.mutation_rate = mutation_rate | |
self.crossover_rate = crossover_rate | |
self.max_depth = max_depth | |
def to_dict(self): | |
return { | |
"best_fitness": self.best_fitness, | |
"population": [str(individual) for individual in self.population] | |
} | |