rogermt commited on
Commit
afd4a88
·
verified ·
1 Parent(s): 056be36

Fix #3: Fix lambda closure bug in default_atomic_factory — capture target_shape by value

Browse files
Files changed (1) hide show
  1. itt_solver/experiment_driver.py +5 -2
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, (task['target_shape'][0], task['target_shape'][1])), "tile_to_target"))
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