core_divide: divides a C leaf simultaneously on ALL storeys that share that path, maintaining staircase consistency as an atomic invariant rather than requiring multi-step recovery. core_undivide: reverses core_divide consistently across all floors, merging a C sub-core back into a single C leaf everywhere. level_fix: atomically moves a level-constrained room to its required floor by retyping the largest leaf there and vacating the wrong-floor leaf to C. Requires `reqs` (SpaceReq dict); disabled (zero probability) without it. mutate() gains `reqs=None` parameter; driver.search() passes its already- loaded reqs so level_fix fires during the main memetic loop. Together these let the optimiser escape the deceptive valley around the 2-fail warmstart: level_fix moves l1 to level 0 (reducing fails 2→1), then core_divide can split the C core to accommodate the displaced t3. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
33 lines
722 B
TOML
33 lines
722 B
TOML
[project]
|
|
name = "homemaker-layout"
|
|
version = "0.0.1"
|
|
description = "Programme-driven building layout search over slicing trees (Python successor to Urb)"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"pyyaml>=6.0",
|
|
"numpy>=1.26",
|
|
"scipy>=1.11",
|
|
"shapely>=2.0",
|
|
"networkx>=3.0",
|
|
"cma>=3.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
homemaker-evolve = "homemaker_layout.evolve:main"
|
|
homemaker-fitness = "homemaker_layout.fitness_cmd:main"
|
|
|
|
[project.optional-dependencies]
|
|
dev = ["pytest>=8.0", "ruff>=0.5"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=68"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["src"]
|
|
|
|
[tool.pytest.ini_options]
|
|
pythonpath = ["src"]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|