Fix #3: Fix lambda closure bug in default_atomic_factory — capture target_shape by value
Browse files
itt_solver/experiment_driver.py
CHANGED
|
@@ -100,13 +100,16 @@ def sweep(tasks, atomic_library_factory, grid, out_dir="experiments", max_runs=N
|
|
| 100 |
def default_atomic_factory(params, task):
|
| 101 |
import itt_solver.transforms as tr
|
| 102 |
from itt_solver.solver_core import tile_transform # ensure tile_transform is available here
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
libs = []
|
| 104 |
# always include tile and fill
|
| 105 |
-
libs.append(tr.Transform(lambda p: tile_transform(p, (
|
| 106 |
libs.append(tr.FillEnclosedHarmonic())
|
| 107 |
# optional rotations/reflections
|
| 108 |
if params.get('use_symmetry', True):
|
| 109 |
libs.append(tr.Rotate(1))
|
| 110 |
libs.append(tr.Reflect('h'))
|
| 111 |
return libs
|
| 112 |
-
|
|
|
|
| 100 |
def default_atomic_factory(params, task):
|
| 101 |
import itt_solver.transforms as tr
|
| 102 |
from itt_solver.solver_core import tile_transform # ensure tile_transform is available here
|
| 103 |
+
|
| 104 |
+
# Capture target_shape by value to avoid late-binding closure bug
|
| 105 |
+
target_h, target_w = task['target_shape'][0], task['target_shape'][1]
|
| 106 |
+
|
| 107 |
libs = []
|
| 108 |
# always include tile and fill
|
| 109 |
+
libs.append(tr.Transform(lambda p, _h=target_h, _w=target_w: tile_transform(p, (_h, _w)), "tile_to_target"))
|
| 110 |
libs.append(tr.FillEnclosedHarmonic())
|
| 111 |
# optional rotations/reflections
|
| 112 |
if params.get('use_symmetry', True):
|
| 113 |
libs.append(tr.Rotate(1))
|
| 114 |
libs.append(tr.Reflect('h'))
|
| 115 |
return libs
|
|
|