variations.py
4.7 kB · python · 147 lines
1import copy2from mrlypy.core.state import choice, bool3from mrlypy.two import Cell2d, carpet_2d4import mrlypy.tile5from mrlypy.tile import Tile, build, random_design, random_rotation6from mrlypy.tile.enums import Design, Group7from config import MAX_CANVAS, MAX_MASK, MAX_TILE, MIN_CANVAS, MIN_MASK, MIN_TILE8from enums import Path9from models import Task1011def setup_grid(tile: Tile, max_canvas: int) -> Tile:12 print(f"Setting up grid for tile")13 possible_grid_sizes = []14 base_size = tile.max_unit_size15 for i in [1, 3, 5, 7, 9, 11]:16 if base_size * i <= max_canvas:17 possible_grid_sizes.append(i)18 if not possible_grid_sizes:19 possible_grid_sizes = [1]20 print(f"Possible grid sizes: {possible_grid_sizes}")21 tile.grid_size = choice(possible_grid_sizes)22 print(f"Chosen grid size: {tile.grid_size}")23 tile.grid_unit_width = tile.unit_width * tile.grid_size24 tile.grid_unit_height = tile.unit_height * tile.grid_size25 return tile2627def setup_tile(task: Task) -> Task:28 print(f"Setting up tile for variation: {task.key}")29 tile_config = mrlypy.tile.Config(30 min_size=MIN_TILE,31 max_size=MAX_TILE32 )33 tile = mrlypy.tile.create(tile_config)34 tile = setup_grid(tile, MAX_CANVAS)35 tile = build(tile)36 task.tile = tile37 return task3839def setup_canvas(task: Task) -> Task:40 print(f"Setting up canvas for variation: {task.key}")41 initial_size = task.tile.max_grid_unit_size42 possible_sizes = []43 for i in [1, 3, 5, 7, 9, 11]:44 size = initial_size * i45 if MIN_CANVAS <= size <= MAX_CANVAS:46 possible_sizes.append(i)47 if not possible_sizes:48 possible_sizes = [1]49 print(f"Possible canvas sizes: {possible_sizes}")50 task.canvas_size = choice(possible_sizes)51 print(f"Chosen canvas size: {task.canvas_size}")52 task.canvas_unit_width = task.canvas_size * task.tile.grid_unit_width53 task.canvas_unit_height = task.canvas_size * task.tile.grid_unit_height54 return task5556def pop_center(cell: Cell2d) -> Cell2d:57 center_index = cell.types.shape[0] // 258 cell.types[center_index, center_index] = 059 return cell6061def copy_mask(tile: Tile) -> Tile:62 t = copy.deepcopy(tile)63 if bool():64 t.invert = not t.invert65 t.cell.invert()66 return t6768def simple_mask() -> Tile:69 tile = Tile()70 tile.group = Group.GENERAL71 tile.design = [random_design()]72 tile.number = [3]73 tile.level = [1]74 tile.rotation = [random_rotation(tile.design[0])]75 tile.invert = bool() if tile.design[0] == Design.TREE else False76 tile = build(tile)77 pop_center(tile.cell)78 size = tile.number[0]79 tile.unit_width = size80 tile.unit_height = size81 tile.grid_size = 182 tile.grid_unit_width = size83 tile.grid_unit_height = size84 return tile8586def basic_mask(min_size: int, max_size: int) -> Tile:87 tile_config = mrlypy.tile.Config(groups=[Group.GENERAL, Group.FRACTAL, Group.MAGIC], min_size=min_size, max_size=max_size)88 tile = mrlypy.tile.create(tile_config)89 tile = build(tile)90 return tile9192def moore_mask() -> Tile:93 print(f"Setting up Moore mask")94 tile = Tile()95 tile.group = Group.GENERAL96 tile.design = [Design.CARPET]97 tile.number = [3]98 tile.level = [1]99 tile.cell = carpet_2d(3)100 size = tile.number[0]101 tile.unit_width = size102 tile.unit_height = size103 tile.grid_size = 1104 tile.grid_unit_width = size105 tile.grid_unit_height = size106 return tile107108def setup_mask(task: Task) -> Task:109 print(f"Setting up mask for variation: {task.key}")110 paths = [Path.SIMPLE, Path.BASIC]111 tile_size = task.tile.max_unit_size112 max_mask = min(MAX_MASK, task.canvas_unit_width, task.canvas_unit_height)113 print(f"Tile size: {tile_size}, max mask: {max_mask}")114 if MIN_MASK <= tile_size <= max_mask:115 paths.append(Path.COPY)116 print(f"Possible paths: {[p.value for p in paths]}")117 path = choice(paths)118 print(f"Chosen path: {path}")119 match path:120 case Path.SIMPLE:121 task.mask = simple_mask()122 case Path.BASIC:123 task.mask = basic_mask(MIN_MASK, max_mask)124 case Path.COPY:125 task.mask = copy_mask(task.tile)126 task.path = path127 task.mask.cell = pop_center(task.mask.cell)128 return task129130def setup_variations(task: Task) -> Task:131 print(f"Setting up variations for variation: {task.key}")132 task = setup_tile(task)133 task = setup_canvas(task)134 task = setup_mask(task)135 return task136137def tile_from_grid(grid: Cell2d) -> Tile:138 h, w = grid.types.shape139 tile = Tile()140 tile.cell = grid141 tile.unit_width = w142 tile.unit_height = h143 tile.grid_size = 1144 tile.grid_unit_width = w145 tile.grid_unit_height = h146 tile.invert = False147 return tile