Compare commits

...
Sign in to create a new pull request.

95 commits

Author SHA1 Message Date
Claude
d04e585d38
Coldstart runner: time runs with a clock that stops when the machine does
The runner measured elapsed_s with time.time(), i.e. CLOCK_REALTIME, which
keeps advancing while a machine is suspended. The box running bk9 was suspended
for three days, so any run spanning that would have reported elapsed_s inflated
by ~72 h -- silently, since the fail count and score are unaffected and nothing
else would look wrong.

time.monotonic() is CLOCK_MONOTONIC on Linux, which stops during suspend
(CLOCK_BOOTTIME is the variant that does not). That measures the time a run
actually had a CPU, which is what the column is for.

Nothing is corrupted yet -- no run has completed since the suspend, so the
timing column is still only the 39.12 baseline, measured on a box that stayed
awake. Noted in the module docstring so that caveat travels with the number.

Refs homemaker-py-bk9.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-09 07:00:30 +00:00
Claude
3ccbba7284
Coldstart runner: checkpoint each run, so losing the box costs hours not days
The runner never passed --checkpoint-every, so each run's only output landed at
the end. The longest single run in the first baseline took 62 h; losing the
machine at hour 61 lost all of it. That flag was added during this session
precisely for this case and then not wired into the one script that needs it.

Default is budget/20 -- 25000 evals at the 500k baseline budget, roughly every
3 h for the slowest programme. --checkpoint-every overrides it.

Also documented --slots: it is the number of concurrent runs, each single-worker
(one worker per run avoids b8g's parallel non-determinism), so it should match
the core count.

Verified end to end with a 400-eval run: the .dom.checkpoint appears alongside
the output, and the score/record/push path still works. The smoke-test artefacts
were removed rather than committed.

Refs homemaker-py-bk9.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 20:58:05 +00:00
Claude
58fe56eb55
bd: record 39.26 progress on homemaker-py-dpt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 18:11:10 +00:00
Claude
99c85ec4ee
Remove two dead paths from the objective
39.24's sweep listed two entries as DEAD rather than suspect -- inert code that
reads as live. Neither changes a score or a failure on any corpus artefact, and
that is verified rather than asserted: every artefact scores identically to its
39.25 measurement.

ratio_public_outside and ratio_private_outside. evaluate_building read both and
multiplied a gaussian into the building factor for each. Neither key exists in
CONF_DEFAULTS and no patterns.config in the repository declares either, so both
branches were guarded and never ran. Removing them also retires what fed them:
the four public_length_*/private_length_* tracking keys accumulated per leaf in
process_storey, and the _public_length/_private_length helpers, which had no
other caller.

NOT removed, because they are live: _public_access, _public_access_outside,
_public_access_pins and the has_public_access_* tracking flags, which drive real
checks and collapse_global's preserve_public_access. Only the length-ratio
machinery was dead.

The daylight quality factor. evaluate_leaf set factors["daylight"] = 1.0
unconditionally -- pinned since the URB_NO_OCCLUSION descope (6) and unable to
be anything else. It was never in _GRADED_FACTORS, so it contributed nothing to
the graded signal, and 39.18's geometric mean then had to special-case it in
factor_is_asked as a factor that is never asked. A constant that exists only to
be excluded is worth deleting. If 2g5 rebuilds occlusion it reintroduces a real
daylight factor, which would need factor_is_asked to say True anyway.

Two tests referenced the removed factor. test_leaf_grade_ignores_non_graded_keys
now names a key that genuinely does not exist; the aggregate underflow test
dropped its daylight entry, which would otherwise have been counted as asked and
changed the expected geometric mean.

Worth doing despite changing no number: 39.20 and 39.25 were both cases where
something inert looked live -- a parity test that never ran, a per-level rule
switched off in every config -- and in both the misreading cost real time and
produced a wrong conclusion. An objective with fewer things in it that do
nothing is one where "this term does nothing" is informative rather than
routine.

Still open on dpt, each needing a ruling or a rate change rather than a
measurement: quality_size's upper side, the minimum-internal-area factor as a
third statement of "build the rooms", and the 0.5**n_fails curve.

426 passed.

Refs homemaker-py-dpt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 18:11:09 +00:00
Claude
73324deff1
bd: save session memories and bring homemaker-py-bk9 current
Eight memories stored via bd remember for the next session:

  config-declares-over-defaults      a CONF_DEFAULTS value is not the live one
  absence-of-fails-means-nothing     zero fails can mean the check is disabled
  crinkliness-is-alexander-159       1/crink is depth PER WINDOW WALL
  score-is-already-a-ratio           value/cost makes per-m2 pricing proportional
  fails-are-emitted-before-aggregation
  objective-state-after-39.25        every live setting after this session
  ab-protocol-and-mdd                what 8000 evals at n=6 can and cannot resolve
  none-of-39s-changes-are-search-proven

bk9 retitled to post-39.25 and given the full brief: the seven objective
changes to re-baseline, the two left default-OFF and why, what the old
artefacts now score (and why that is not the baseline), and three quantities
39.12 did not capture that now have predictions attached -- per-storey daylit
wall supply/demand, which storey the open space lands on, and the outdoor
fraction, which is the one unmeasured risk in 39.22-39.25.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 16:31:15 +00:00
Claude
8a1b547285
bd: save session memories and re-scope bk9 for the post-39.25 objective
Memories stored via bd remember (injected at bd prime, so they survive into the
re-baseline session):

  config-declares-over-defaults      a CONF_DEFAULTS value is not the live one;
                                     the corpus configs declare their own
  absence-of-fails-means-nothing     zero fails can mean the check is disabled
  crinkliness-is-alexander-159       1/crink is depth PER WINDOW WALL
  score-is-already-a-ratio           value/cost makes per-m2 pricing
                                     proportional already
  fails-are-emitted-before-aggregation  why aggregation and rate changes cannot
                                     move the fail set
  objective-state-after-39.25        every default now live, and what is still
                                     default-OFF
  ab-protocol-and-mdd                the harness, and what 8000 evals can and
                                     cannot resolve
  none-of-39s-changes-are-search-proven

bk9 re-scoped: it was filed after 39.19 and four more changes have landed since
(39.22-39.25). Its comment now lists all six, names the two still default-OFF,
gives the rescored baseline layouts, and asks for four things beyond 39.12's
mean/sd/MDD -- per-storey daylit-wall supply/demand, the outdoor fraction (the
one unmeasured risk in 39.25), open space by storey, and corridor geometry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:48:18 +00:00
Claude
4931070602
Outdoor space: enforce the per-level rule, drop the fraction
Owner: "maybe plot_ratio is having unintended consequences, Alexander simply
says that all levels should have accessible outside space, he doesn't say how
much."

Both halves are right, and the codebase had the two rules the wrong way round.

ratio_outside is a gaussian on the outdoor FRACTION, applied as a whole-building
multiplier, and its declared targets have no stated basis and contradict each
other: health-centre targets 0.06 and sits at 0.096-0.129, so it is penalised
x0.39-x0.77 for having too MUCH; programme-house targets 0.30 and sits at
0.098-0.293, penalised x0.40-x0.999 for having too LITTLE. Penalties as large as
the ratio_circulation ones 39.24 removed, pulling two programmes in opposite
directions on the same quantity.

force_roof_garden already implements the rule Alexander actually states -- per
level, no outdoor space at all is a hard fail, no quantity attached. It has
existed all along and was switched OFF in every corpus config.

Near-miss worth recording: measuring first, I found zero "no outside space"
fails across the twelve baseline runs and briefly read that as the requirement
being met everywhere. It meant the check never ran. Same shape as 39.20's parity
tests -- no failures from a test that is not executing looks exactly like no
failures from a test that passes, and the tell was again the config, not the
code.

Enabled, it bites on 4 of 25 baseline levels: maple s0 level 1, and
programme-house level 0 in all three seeds. A house with no outdoor space on its
own ground floor is a fair criticism of the layout, and exactly what a
building-level fraction cannot catch, since 22% outdoor concentrated on one
storey satisfies it perfectly.

The upper side ratio_outside used to provide is covered in a better currency by
the minimum-internal-area factor (internal area >= 1.2x the programme's declared
room area), which is live -- binding on harbor s0 x0.920 and programme-house s0
x0.787.

This is the one change in 39.22-39.25 whose risk is NOT measured: nothing here
proves the outdoor fraction will not drift up once the search is free to raise
it, and outdoor space is profitable (1.64 return against a room's 0.66). The
re-baseline (bk9) is what shows it, and 39.25 asks for the fraction to be
recorded there.

4 hard fails added, none removed. 426 passed.

Refs homemaker-py-hxi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:41:22 +00:00
Claude
f96ec0f316
bd: close homemaker-py-hxi and homemaker-py-ssz
ssz's three candidate repairs were all tried and recorded (38.1/38.6/38.8,
superseded by 38.10/38.11), and what it was pointing at was resolved in 39.13
(the tail underflows across its whole range, rescaled, NULL), 39.14 (two-sided
gaussian double-charged surplus daylight, made one-sided) and 39.16 (the
constant is Alexander 159 and is not miscalibrated). What has substance left is
k54, and 39.17 relocated even that to per-storey frontage starvation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:29:20 +00:00
Claude
774747e482
bd: close homemaker-py-hxi; file homemaker-py-dpt (scoring-model sweep)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:28:34 +00:00
Claude
a7ef9e2fa0
Remove ratio_circulation: the score is already a ratio
Owner: "I think a corridor could be worth a sixth of a room, this is ok. maybe
we should dump the ratio_circulation altogether if there is already a pressure
in circulation caused by the cost benefit ratio per msq. this is the kind of
thing we want to root out of the scoring model: anything that is double
counting, or using a gaussian where a linear ramp is appropriate, etc."

value_circulation = 50 stands; hxi's rate question is closed.

The duplication argument is stronger than it first looks. score = value/cost is
already a ratio, so the per-m2 economics (50 against a build cost of 200) is not
merely an absolute pressure -- adding corridor moves value/cost by an amount
that depends on how much of the building is already corridor. It is ALREADY
proportional. ratio_circulation said the same thing again as a whole-building
multiplier, on a curve where twice the corridor is far more than twice as bad.

Correction to my own first measurement: I overrode ratio_circulation and got
scores going DOWN when a <=1 multiplier was removed, which is impossible. All
four corpus programmes DECLARE ratio_circulation, so the CONF_DEFAULTS value I
had changed was never in play and the two arms differed only in sigma. Same
trap as value_supported in 39.19.

Against the keep-it case, recorded because it is the one real argument: three of
four declare a POSITIVE target (harbor/maple 0.08, health-centre 0.10), making
the term formally two-sided rather than "less is better". It does not survive
the numbers -- the lower side is worth at most 13.3% on the large programmes
against 99% on the upper side, and "a building needs some circulation" is
enforced structurally by access and connectivity, which no amount of value can
buy off.

Disabled in CONF_DEFAULTS and the four corpus configs, each with the reason
inline and a note that a [target, sigma] pair re-enables it. Fail sets
unchanged; it was always a value multiplier. Scores +42% to +7712%.

39.24 also sweeps every remaining term against the owner's two tests. Verdicts:
perpendicular, proportion, width, crinkliness, access, size's lower side,
ratio_outside, staircase volume and the count/limit fails are all sound.
Filed as homemaker-py-dpt: size's UPPER side (cost already charges area; 82% of
size fails are over-target), the minimum-internal-area factor (a third
statement of "build the rooms"), the 0.5**n_fails curve (a ruling, not a
measurement), and two dead paths -- ratio_public/private_outside, which no
config declares, and the daylight factor pinned to 1.0 since the descope.

Also updated a test I added last turn which asserted ratio_circulation was the
second charge; it now pins that the linear ramp is the ONLY one.

419 passed.

Closes homemaker-py-hxi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:28:33 +00:00
Claude
f07b3865ef
No size cap on circulation: twice the corridor is twice as bad, and no worse
Owner's ruling: "as long as circulation is more expensive to build than it has
value then we have a linear ramp. a gaussian ramp is probably not appropriate
here as double the amount of corridor is simply twice as bad, so it should
score the same as two half size corridors".

Both halves check out. The linear ramp is already there -- value_circulation 50
against a build cost of 200, so every m2 of corridor is worth -150 and the
objective pushes for less of it without needing a cap. And the AMOUNT of
circulation is separately governed at building level by ratio_circulation
[0.00, 0.20], a gaussian on the circulation fraction, which is where that
question belongs. The per-leaf size gaussian was a third charge on the same
thing.

It was also the only one of the three that depended on how the corridor was cut
up. One 20 m2 corridor scored gaussian(20,0,14) = 0.360 and contributed 360;
two 10 m2 halves scored 0.775 each and contributed 775 between them. Splitting a
corridor in half multiplied its value by 2.15x -- an artefact of where the tree
happened to cut, rewarding the search for fragmenting its own spine. The
ruling's test (one 2A leaf must score as two A leaves) is exactly what a
gaussian on an amount cannot satisfy, and is now a test.

size_circulation = None; quality_size returns 1.0 for circulation and
shapecurve gives amin, amax = 0, inf.

BUG this exposed: get_space_params falls through to a habitable default when a
generic family key is missing and could not tell "missing" from "present but
null", so a corridor silently inherited a room's 16 m2 size target.
_generic_param now returns (found, value); pinned by a test. The same trap
applied to 39.22's proportion_circulation.

Fail-set effect of 39.22 and 39.23 together: 16 corridor size fails and 7
proportion fails removed, none added. harbor 33/43/42 -> 32/40/38, maple
54/73/55 -> 51/65/52, health-centre 4/9/5 -> 3/9/5, programme-house unchanged.
The layouts are identical -- these are failures the objective should never have
been reporting.

Two shape-curve tests moved fixture: both built an infeasible upper storey from
a 'C' leaf, infeasible precisely because of the bounds now removed. The fixture
is a cr1 leaf, whose infeasibility is a contradiction between two of its own
bounds (needs >= 180 m2 for its aspect bound, <= 101.5 m2 for its size bound
across the box's fixed 23.52 m span) rather than a tight fit. The invariants
they test are unchanged.

Left open on hxi: the rate gap, value_circulation 50 against value_inside 300
on identical build cost. Whether a corridor is worth a sixth of a room per m2
is a design judgement, and the linear ramp is only as steep as that number.

419 passed.

Refs homemaker-py-hxi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:01:12 +00:00
Claude
426203b154
bd: retitle homemaker-py-hxi and correct its premise
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 12:56:40 +00:00
Claude
9a8852a82b
A corridor may be corridor-shaped: no aspect cap on circulation
Owner's ruling: "there should be no cap on the proportion of a corridor,
especially for big buildings, the crinkliness rule is there to prevent these
becoming unpleasant spaces."

proportion_circulation was [1.5, 0.5], failing a corridor above aspect 2.57 --
at the 1.97 m minimum width the width factor allows, a corridor 5.1 m long; at
the 2.4 m target width, 6.2 m. The corpus shows the consequence: median
circulation leaf 14.3 m2 at aspect 1.67, a stubby room rather than a corridor.

The justification checks out arithmetically. The unpleasant space the cap was
standing in for is a long BURIED corridor -- and crinkliness already sends that
to zero, since a buried leaf has crink == 0. A long corridor along a facade
scores 0.90. Aspect cannot tell those two apart; crinkliness can, so the cap was
duplicating a rule that already exists and does the job better.

Shipped: proportion_circulation = None (no aspect requirement).
quality_proportion returns 1.0 for circulation, and shapecurve.leaf_constraints
yields rmax = inf so the DP agrees with the fitness instead of pruning
topologies the objective would accept. A habitable room's aspect target is
untouched. The narrow side still holds -- width_circulation keeps a corridor
>= 1.97 m, and "edge too long" still caps a single wall at 8 m.

Unlike 39.14/39.18/39.19 this DOES change the fail set, which is the point.
Across the twelve baseline artefacts it removes exactly 7 corridor proportion
fails and adds none: harbor 33/43/42 -> 33/42/40, maple 54/73/55 -> 54/71/54,
health-centre 4/9/5 -> 3/9/5, programme-house unchanged.

Also recorded in 39.22, and a retraction: hxi was titled "search is rewarded
for deleting the circulation spine", which 39.8 had already measured and
refuted -- 0 of the 7 connectivity-breaking deletions sampled were rewarded. My
own earlier comment on the bead restated that retracted claim; corrected, and
the bead retitled.

What binds next: removing the cap roughly doubles a corridor leaf's reach, from
proportion at ~6.2 m to size_circulation at 12.5 m (2.4 m wide hits the 30 m2
fail edge there). size_circulation's target area is ZERO, the other half of the
double-charge -- circulation priced as overhead once in value_circulation = 50
and again in a size factor whose optimum is non-existence. Not changed: it is a
distinct parameter with its own rationale, unruled, and 39.16 is a standing
reminder about inherited constants.

415 passed.

Refs homemaker-py-hxi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 12:56:39 +00:00
Claude
32973cfe95
bd: close homemaker-py-118; file homemaker-py-bk9 (re-baseline)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 07:56:24 +00:00
Claude
d0567d7a74
Remove the Perl oracle
Owner's decision: "we need to abandon the perl oracle, this was only useful
when initially porting, but I suspect many of the remaining problems have been
carried in from the perl (such as the weird scoring of outdoor and circulation
space, which definitely needs fixing)".

39 supports that second clause. Every defect the section found is inherited,
not introduced: the two-sided crinkliness gaussian that double-charges surplus
daylight (39.14), quality as a product over a variable number of factors
(39.18), value_supported priced as value_inside so a terrace was worth more per
m2 than a room (39.19), and circulation returning 0.07 per unit cost (hxi).

So parity with the oracle was never a safety net -- it was a commitment to
reproduce those defects. Each of 39.14, 39.18 and 39.19 would have been a
parity failure had parity ever been checked, and keeping the tests would have
meant reverting the fixes or explaining the failures away.

Removed: oracle.py, test_oracle.py, the two parity tests and their fixture
machinery in test_dom_corpus.py, innerloop.OracleEvaluator with its use_native
and urb_root plumbing, the same plumbing through driver, and fourteen
experiments/ scripts that could only run against Perl. Several of those are
cited in earlier DESIGN sections; the citations now point into git history,
which is the honest state -- they had been unrunnable since the oracle root
(/home/bruno/src/urb) stopped being present. run_search is superseded by
run_search_scaled, which does the same job natively.

Kept: dump_areas.pl/.py, which validate GEOMETRY against Urb (4.1) rather than
fitness, and the prose in fitness_cmd.py and dom.py explaining why the
.score/.fails formats are shaped as they are. Provenance is worth keeping; a
dead code path is not.

CLAUDE.md updated: fitness.py is the only evaluator, and "Urb did it this way"
is no longer an argument that a constant is right. 39.16 is the standing
counterweight in the other direction -- the crinkliness target WAS right and
twice looked wrong only because the code reading it was misunderstood.
Inheritance is neither evidence for nor against.

410 passed. The 69 removed cases account exactly: 64 parity (all skipped, since
no oracle .score was ever committed), 4 in test_oracle.py, and the guard test
39.20 added as a stopgap.

Closes homemaker-py-118. Files homemaker-py-bk9 for the re-baseline that 39.19
made necessary.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 07:56:24 +00:00
Claude
f47dfe60af
Record the ecx A/B: directionally positive, not resolvable at N=6
Harbor and maple, three 500k plateau starts x two RNG seeds, 8000 evals, all
arms scored under stock. Run against the pre-39.19 defaults, so "stock" is the
old objective.

  harbor  geomean          39.17 -> 39.00  1W/0L/5T  diff +0.167  MDD 0.428
  harbor  geomean+daylight 39.17 -> 39.00  1W/0L/5T  diff +0.167  MDD 0.428
  maple   geomean          60.50 -> 60.17  1W/1L/4T  diff +0.333  MDD 1.434
  maple   geomean+daylight 60.50 -> 60.00  1W/0L/5T  diff +0.500  MDD 1.285

Every margin sits below what N=6 can resolve (N ~= 26-67 needed). Unlike
39.13's ramp, which was an exact null with sd=0 and identical trajectories, the
arms here do diverge and all four land on the favourable side of zero -- worth
exactly what four coin-flips landing the same way is worth. Recorded so a later
run cannot cite it as evidence.

Also recorded: none of 39.13, 39.14 or 39.18 produced a measurable search
improvement at this budget. All were shipped on correctness grounds and 39.19
then required two of them outright. If the 39 objective changes pay off in
search terms, this corpus has not shown it yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 07:38:23 +00:00
Claude
7047a782e5
bd: file homemaker-py-118
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 19:25:19 +00:00
Claude
47079997cf
The native-vs-Perl parity tests have never run, and were self-comparing
The 39.19 objective change broke three tests. They were the right ones to
break, and how they broke matters more than the change.

test_native_fitness_score_parity and test_native_fitness_fail_set_parity read a
cached .score/.fails beside each corpus .dom and assert the native Python
fitness agrees. They are the ONLY check that the native evaluator still agrees
with the Urb oracle it was ported from, and CLAUDE.md still describes oracle.py
and the Perl tool as kept for cross-validation.

But .gitignore lines 10-11 exclude *.dom.score and *.dom.fails, and
git log --diff-filter=A over those patterns finds zero files ever added on any
branch. No oracle cache has ever existed here, so on a clean checkout all 64
parametrised cases skip.

Worse than skipping is what happens when they do not. Nothing in a .score file
records who wrote it, so a .dom left in that directory by a search run -- with
a .score written by homemaker-fitness, the NATIVE scorer -- silently becomes a
parity fixture, and the test compares the native scorer with itself. That
passes by construction whatever the native scorer says.

Three such cases were live and green: the coldstart-500000-s*.dom artefacts
committed to examples/programme-house during 39.12 and scored natively this
session. They surfaced only because 39.19 made the native scorer disagree with
its own stale output; absent an objective change, a green "native matches
oracle" would have been reported indefinitely.

Stopgap: parametrisation restricted to the Perl corpus's MD5-named files so a
session artefact cannot become a fixture again; the skip message now says
parity is UNVERIFIED rather than reading like an optional missing cache; a
guard test asserts the restriction. All 64 cases skip honestly. Regenerating
the caches with the native scorer would not have been a fix -- it would have
re-cemented the self-comparison.

Filed as homemaker-py-118 (P1): regenerate fixtures from the Perl oracle,
narrow the ignore rules so fixture caches can be tracked, and find out whether
parity still holds -- it may not, since 39.14, 39.18 and 39.19 all changed the
native objective and the oracle has none of them. If parity is being abandoned
deliberately the tests should be deleted with a note. What must not survive is
a test that looks like a guarantee and is not one.

415 passed, 64 skipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 19:25:18 +00:00
Claude
109849e438
A terrace is no longer worth more per m2 than a real internal room
Owner's ruling. Measured over the twelve baseline layouts as realised value per
m2 (rate x quality, not the rate alone):

  as shipped before this   room  67.0   terrace 294.6   violates, 4.39x
  value_supported=100 only room  67.0   terrace  98.2   violates, 1.46x
  geometric mean only      room 132.9   terrace 296.8   violates, 2.23x
  both                     room 132.9   terrace  98.9   satisfies

The 4.4x is roughly 2.2x aggregation and 2.0x rate, so neither half alone is
enough. That is why 39.18's geometric-mean aggregation moves from default-OFF
to default-ON here rather than waiting on its own A/B: it is not an optional
improvement, it is half of a ruling.

value_supported 300 -> 100, and set to value_outside rather than to a number
that makes the inequality come out -- back-solving from the corpus's measured
mean room quality would rot the moment either changed. Outdoor space is worth
the same to an occupant whatever level it sits on; the real difference between
a ground garden and a roof terrace is what it takes to BUILD, and cost already
says that (outside 10.0 vs outside_supported 110.0). Value describes worth,
cost describes structure, and the level belongs in the second.

Changed in CONF_DEFAULTS and the four corpus patterns.config files, which all
declared 300.0 explicitly. NOT changed in harbor-house-l0 (a shape-curve test
fixture) or y51-sweep-* (historical fixtures that exist to reproduce past
measurements) -- repricing those would destroy what they are for.

Neither change can move a fail, structurally rather than luckily: value rates
never enter fail emission, and evaluate_leaf emits each fail from its factor
before anything is combined. Verified corpus-wide: identical fail sets, scores
+11% to +169% (and -5% once, on a layout that is mostly terrace).

tests/test_terrace_value_ruling.py pins the ruling as an invariant of the
objective, and asserts that reverting the aggregation breaks it again, so
neither half can be quietly dropped.

The 500k cold-start baseline (39.12) is superseded -- this changes what "good"
means. The layouts stay valid and their fail counts are unchanged, but a fresh
corpus run is needed before any new number is compared with them.

Still untouched: circulation returns 0.07 per unit cost against a room's 0.66,
by far the worst thing a building can contain. That is homemaker-py-hxi.

Refs homemaker-py-ecx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 19:25:02 +00:00
Claude
a76ed3b9b8
Quality aggregation: divide out how many questions a leaf was asked
39.17 left the search's storey choice unexplained and blamed value_rate. It is
not the rate, or not only.

Measured over the twelve baseline runs, value/cost by leaf kind: outside ground
7.40, roof terrace 2.69, room 0.34, circulation 0.02. A terrace returns 2.7x
its cost where a room returns a third of it, so filling upper storeys with
terrace is not the search leaving value on the table -- it is by a wide margin
the most profitable thing the objective offers. 7% of the corpus area produces
32% of its value.

Most of that gap is mean quality: 0.986 for a terrace against 0.223 for a
room. Quality is a PRODUCT of factors and the kinds are not asked the same
number of questions -- an outside leaf is exempt from size, crinkliness and
access, so 3 of 7 factors can ever bite it against a room's 6. Each exemption
is individually right (no programme size target; uncovered outside is lit by
definition; ground-level outside needs no access). The consequence is not: a
leaf exempt from the two harshest factors out-scores one judged on them and
doing well, purely by not being asked, and quality multiplies the value rate.

Stated generally, and this is not about outside space: under a product, adding
any new quality criterion mechanically devalues every leaf it applies to,
including leaves that score 1.0 on it. The objective's scale should not depend
on how many things it measures.

quality_aggregate="geometric_mean" (default OFF, "product" is stock) divides
that out. Computed in log space so six small factors cannot underflow the
product before the root is taken; a zero factor still gives zero, so a fully
buried leaf is worth nothing either way.

Telling "exempt" from "asked and scored 1.0" needs factor_is_asked, which
restates conditions that live inside the quality_* methods. That duplication
can drift, so tests/test_fitness_aggregate.py pins it against every leaf in the
corpus: wherever the predicate says exempt, the factor really is 1.0.

Fail set byte-identical everywhere, and for a stronger reason than 39.13/39.14
had: evaluate_leaf emits each fail from the factor itself before anything is
combined, so no aggregation can move one. Score effect +37% to +169%, reaching
all four programmes where the crinkliness changes reached two; room value/cost
0.34 -> 0.66, circulation 0.02 -> 0.07.

Deliberately not fixed: a terrace still out-earns a room 4:1, which is the
rates (value_supported = value_inside = 300 against costs of 110 and 200), not
the aggregation. That is a design judgement for the programme author, and
39.16 is a standing reminder that "this inherited constant looks wrong" has
been wrong twice already in this section. Left open on ecx with the numbers.

A/B running; verdict to follow.

Refs homemaker-py-ecx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 18:57:00 +00:00
Claude
fb70193074
bd: close homemaker-py-773; file ecx
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 17:46:53 +00:00
Claude
f5612ce06c
Pre-flight: check the ground floor's frontage, not the per-storey average
39.16 relocated the crinkliness residual to a plan-form question. Four
measurements answer it, and two of them refute the premises 773 was filed on.

The search DOES build courtyards -- harbor 8 (273 m2), maple 16 (404 m2),
health-centre 13 (107 m2) over three seeds -- and they work: of 524 lit edges
44% come from the plot wall, 30% from a courtyard, 26% from a perimeter void,
and a courtyard supplies at least one side for 53% of the two-aspect leaves.
No operator is missing. (The shape-curve DP does NOT model exposure --
shapecurve.py:25 -- but per 38.24 it fires ~8 times in 500k evals, so that gap
is not what is costing anything.)

The answer is per-storey. Comparing each storey's demand, sum A_i/(1.6202*h),
with the lit wall its leaves actually hold: every harbor and maple ground floor
is below 1.0 and every top floor above 1.2, and the ratio predicts the fail
rate almost exactly -- above ~1.2 near-zero fails, below 1.0 40-55% of the
storey. health-centre and programme-house sit at 1.6-4.2 throughout and fail
essentially nothing.

That corrects 39.11, which divided demand evenly across storeys and concluded
harbor and maple were frontage-feasible "with room to spare". Programmes pin
rooms to level 0 and the ground floor cannot set itself back to buy perimeter:
harbor's pinned 347 m2 needs 71.4 m against the plot's 53.0 m, maple's 414 m2
needs 85.2 m against 55.0 m, while health-centre and programme-house have 51.0
and 14.2 m spare. Same ordering as the corpus fail counts, and fixed before any
search runs. The averaged check is not just weaker: on maple it asks for a
22 m2 courtyard where the ground floor needs 57 m2.

New third _preflight check, advisory like the others, silent on the two
programmes with slack. tests/test_evolve_preflight.py covers all three checks
and asserts the ground-floor figure exceeds the averaged one -- if they ever
agree, one has stopped earning its place. 39.11 annotated in place.

Also recorded, not acted on: the open space is on the wrong storey (harbor puts
50 m2 of courtyard on the starved ground floor and 223 m2 on the surplus first
floor), because value_rate pays an outside leaf above ground value_supported =
300 -- a room's rate -- against a cost of 110, with nothing tying its value to
whether it illuminates anything. Filed as homemaker-py-ecx.

411 passed, 72 skipped.

Refs homemaker-py-773.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 17:46:52 +00:00
Claude
6268748fcb
bd: file homemaker-py-773; record the 39.16 correction on u5q
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 16:04:45 +00:00
Claude
e92a96ac99
Correct 39.14/39.15: the crinkliness constant is Alexander 159
The owner supplied the provenance the analysis was missing. The constant is
Christopher Alexander, A Pattern Language 159, "Light on Two Sides of Every
Room", and it changes what the numbers mean.

1/crink = A/(L*h) is floor area per metre of ILLUMINATED wall over storey
height. It is not room depth -- it equals depth only for a room lit on one
side. So 5/6 * h = 2.5 m is 2.5 m of room depth PER WINDOW WALL: one side
allows 2.5 m at the peak and 4.86 m at the fail edge, two opposite sides allow
5.00 m and 9.72 m. A 4 m room scores 0.395 lit on one side and 0.902 lit on
two. The factor is the pattern stated as a ratio, and it is not
miscalibrated.

WITHDRAWN from 39.14: the "2.5 m absurd optimum" reading, and "the corpus's
realised median depth is 2.95 m, so the search built what it was paid for" --
2.95 was the median A/L, while the corpus's single-aspect leaves are a median
3.46 m deep and its two-opposite leaves 4.42 m. Ordinary rooms. Section
retitled, passage struck in place.

WITHDRAWN from 39.15: calling six specs "self-contradictory". They are large
rooms, and under Alexander a large room is supposed to need two aspects; the
audit's new column reports the pattern working, not a mis-specification. What
is real is the tension between that demand and what the plan form supplies.

SURVIVES, on a better argument: crinkliness_shape="daylight". 159 states a
MINIMUM, and a two-sided gaussian turns a minimum into a target -- 68% of the
133 leaves in the clipped region are lit on two or more sides, mean quality
0.770, docked for satisfying the pattern well, on top of the
exterior_wall/boundary_wall charge those windows already carry in cost.

New 39.16 records this and relocates the residual. Over the 430 graded
baseline leaves: unlit 77 (100% fail), one side 208 (15%), two-corner 87 (2%),
two-opposite 34 (0%), three/four 24 (4%). Light on two sides all but
guarantees a pass and only 33.7% of leaves get it, so the open question is why
a binary slicing tree on a convex plot can only give a third of its leaves two
aspects -- a plan-form question, not a scoring one. Filed as
homemaker-py-773; 39.11's courtyard finding is the same question from the
other side.

Both errors came from reading a dimensionless ratio as a length, so the
provenance and the interpretation now sit next to the constant in fitness.py,
not only in DESIGN.md.

405 passed, 72 skipped.

Refs homemaker-py-u5q.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 16:04:44 +00:00
Claude
94d112aa02
bd: close homemaker-py-9gj and homemaker-py-u5q; file k54
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 15:11:19 +00:00
Claude
84907694d0
Record what the crinkliness examination found: 39.13, 39.14, 39.15
39.13 -- the tail rescale, and its verdict. NULL, and not for want of power:
12 of 12 pairs byte-identical, both programmes, same trajectories. The failing
tail is 0.034% of corpus value, so making it orderable cannot move a search.
Kept (free, and k54 needs the region orderable) but recorded as correct and
inert, not as a fix. It also corrects gvb's premise: zero exposure is NOT
beyond the inner loop's reach -- perturbing division ratios alone moves the
zero-exposure set on 6-12 of 12 trials at +-25%, and in the direction wanted
(harbor s1 8 -> 6 buried leaves).

39.14 -- what the factor actually rewards. 1/crink is the room's depth from
its daylit wall in storey-heights, so the variable is sound and its fail
boundary (1.62h = 4.86 m) agrees with 38.3's independently-derived frontage
bound. The two-sided gaussian on it is not: the near side penalises surplus
daylight that edge_cost and outside_edge_cost already bill at 100 and 133.3
per m2, it has never once produced a fail (it needs crink > 21.5; corpus max
is 3.95), and its peak sits at a 2.5 m deep room -- an ordinary 4 m room
scores 0.395 and the corpus's realised median depth is 2.95 m. The search
built what it was paid for. A/B at pilot budget is underpowered rather than
null: the arms reach different layouts but the same fail counts.

39.15 -- the magic numbers. A sigma is not a preference, it is an acceptance
interval target +- 2.1460*sigma, so it decides failures. The blanket
hypothesis does not survive -- programme-house reaches 1 fail, structural on
two of three seeds. The specific one does, and it shows 39.1's CLEAN verdict
answered a weaker question: sweeping a spec's tolerance box asks whether SOME
shape is feasible, and all 67 pass, but at the DECLARED target area and aspect
harbor needs 7 corner rooms and maple 6, while health-centre and
programme-house need none. Within-programme, those codes fail 62% and 78% of
their instances against 26% and 31% for all others. Three declared quantities
are jointly contradictory and nothing said so; the resolution is an author
decision, not a retuned constant.

Also recorded: 82% of size fails are rooms larger than target, which is the
same shape of double-charge but explicitly NOT the same case -- size's upper
bound is the main brake on growth and must not be removed on the analogy.

405 passed, 72 skipped.

Closes homemaker-py-9gj, homemaker-py-u5q.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 15:11:11 +00:00
Claude
970e07235f
Audit: ask whether a room spec is feasible AS DECLARED, not merely somewhere
A fail is `quality < FAIL_THRESHOLD`, and every factor is a gaussian, so a
(target, sigma) pair does not express a soft preference -- it DEFINES an
acceptance interval, target +- 2.1460*sigma. Sigma is the tolerance that
decides failures, and these sigmas were inherited from Urb without a recorded
derivation.

audit_programme_config.py already swept each spec's whole tolerance box and
asked "is SOME shape in here feasible?". Every corpus spec passes that, which
is what 39.1 recorded as CLEAN. But a tolerance is not a design intent: the
author declared a target area and a target aspect, and that is the room they
asked for. Asking whether THAT room is feasible is a different question.

Six specs answer it differently -- harbor's cr1/da1/n and maple's da1/lr1/n.
Built as declared they need two exposed sides, a corner: harbor's common room
is 80 m2 at aspect 2.0, so 6.32 x 12.65 m, and 6.32 m is deeper than the
4.86 m single-aspect daylight limit. They are "feasible" in the box only at
the bottom of their area tolerance and the top of their aspect one -- the
search can satisfy them only by building something other than what was asked
for.

New `at declared target` column, plus a count of instances needing >=2 sides
as declared: harbor 7, maple 6, health-centre 0, programme-house 0. The
corner budget is reported as an inequality against storey count rather than a
fixed number, since init.dom is one storey for every corpus programme and the
search grows the rest.

_multi_aspect() replaces the duplicated substring test, and _audit_at_target
reuses the live Gaussians rather than reimplementing them.

Refs homemaker-py-u5q.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 07:46:43 +00:00
Claude
366a047a60
Make the crinkliness factor one-sided: stop billing the daylit wall twice
The tail rescale shipped in cd392e7 is a measured NULL as a search
intervention -- 12 of 12 pairs byte-identical on harbor and maple, 8000 evals
from a plateau, not merely underpowered. Of course it is: the whole failing
tail is 0.034% of corpus value. Looking at the rest of the factor, prompted by
the owner, found something much larger above the threshold.

crink = area_outside/area = (L*h)/A, so 1/crink = A/(L*h) is the room's mean
depth from its daylit wall in storey-heights. That is the right variable for a
daylight rule, and the fail boundary it implies (1/crink = 1.62, i.e. 4.86 m at
h=3) is a sensible one that agrees with 38.3's frontage bound derived
independently. What is wrong is hanging a TWO-sided gaussian on it:

* The near side penalises a room for having MORE daylit wall than target --
  while leaf_cost's siblings edge_cost and outside_edge_cost already charge
  that same wall at exterior_wall=100 and boundary_wall=133.3 per m2. The wall
  is billed once in cost and again as lost value.
* It never earns its keep as a failure either: the over-exposed branch only
  reaches FAIL_THRESHOLD above crinkliness 21.5, and the corpus maximum is
  3.95. It has never produced a single fail; it only removes value.
* 133 of the 318 passing graded leaves in the 500k baseline (42%) sit on that
  side, mean quality 0.810.

crinkliness_shape="daylight" (default OFF, "gaussian" is stock) clips it: a
room shallower than the gaussian's peak scores 1.0, because daylight is a
sufficiency requirement and surplus is the cost model's business, not this
factor's. Clipping at the PEAK rather than at FAIL_THRESHOLD is deliberate --
it keeps the factor continuous and preserves the graded approach to the
daylight limit, where clipping at the threshold would put a 10x cliff on the
exact boundary the 0.5**n fail multiplier already steps on.

Fail set byte-identical on all 21 corpus artefacts for all four
shape/tail combinations, so stock stays a valid yardstick for every arm.
Area-weighted crinkliness quality 0.480 -> 0.513, leaf quality product
0.2722 -> 0.2831; per-artefact score +0.2%..+19.6%, and unlike the ramp it
reaches health-centre and programme-house, where the tail change was 0.000%.

Note "daylight" clips the OPPOSITE side from 38.1's superseded compact_ok,
which forgives being buried; composing either with those modes is refused.

ab_9gj_ramp.py becomes ab_9gj_crinkliness.py and takes named arms, since it
now covers both changes; its first arm is the baseline and the yardstick.

Refs homemaker-py-9gj.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 07:27:02 +00:00
Claude
6d387bbe3b
Ignore the A/B harnesses' per-process shard files
Only the merged <out>.csv is worth keeping; the shards are intermediate by
construction and one per worker process.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 06:29:15 +00:00
Claude
cd392e77c5
Rescale the underflowing crinkliness tail so the failing region has an ordering
quality_uncrinkliness evaluates a gaussian at x = 1/crink, so its exponent
grows like 1/crink^2 and underflows a double to exactly zero below crink ~
1/15. Measured over the twelve 500k cold-start runs (39.12): 430 leaves carry
a minimum-exposure requirement, 112 fail it, and those 112 span quality
1e-300..1e-1 while contributing 0.034% of total value on 23% of the floor
area. Every value in that range is numerically zero beside a passing leaf's
~1, so the search cannot rank two layouts that differ only in how exposed
their under-lit rooms are.

This is wider than the bead's diagnosis (a flat 0.0 for zero-exposure leaves)
and it explains why 38.1's `floor` mode measured as a no-op: max(q, 0.01) maps
110 of the 112 onto one constant, replacing a flat zero with a flat 0.01.

crinkliness_tail="ramp" (default OFF, "gaussian" is stock) replaces the tail --
only the tail, only below FAIL_THRESHOLD, only on the compact side -- with a
straight line in crinkliness meeting the gaussian exactly at the crossing.
_crink_at_fail_threshold inverts the gaussian there using the same truncated
_E the factor is evaluated with.

Deliberately conservative: nothing at or above FAIL_THRESHOLD moves, so no
calibration changes and no leaf crosses the threshold. The fail set is
byte-identical on all 21 committed corpus artefacts, the four init.dom seeds
included -- asserted in tests/test_fitness_crinkliness_tail.py, not assumed.
That invariance is also what makes it legal to score both arms of the A/B
under stock (the 38.9 trap's one exemption). A fully buried leaf still scores
exactly 0; this restores an ordering within the failing region, it does not
forgive it. Composing with 38.1's superseded modes is refused, since both
rewrite the same tail.

Score effect on the baseline artefacts: +0.3%..+2.8% on harbor and maple,
exactly +0.000% on health-centre, programme-house, and every init.dom -- a
programme with no partially-exposed failing rooms has nothing to grade, and
neither does any starting layout. The ramp is a mid-search signal by
construction, so experiments/ab_9gj_ramp.py defaults to seeding each run from
a 500k plateau artefact rather than cold.

The module-level math import replaces a now-redundant local one.

DESIGN.md 39.13 and the A/B verdict follow in a separate commit.

Refs homemaker-py-9gj.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 06:29:02 +00:00
Claude
cc39a38317
bd: close homemaker-py-ut5
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-04 17:17:03 +00:00
Claude
4180a9eb88
Replace the stale 15-fail acceptance target with the cold-start baseline
DESIGN.md 38.7 pinned Phase 9's acceptance test to "harbor-house reaches its
known 15-fail floor". That figure was measured before 39.4, against harbor's
*effective* programme of 32 instances -- cr1/of/st1/st2 were being read as
generic circulation and silently dropped. Against the real 37-instance
programme the same artefact scores 89, so the target is not measurable; and
2v1, the fix it was the acceptance test for, closed NULL (39.8), so there is
no combined fix left to accept.

New 39.12 records:

* the five evolved-3M*.dom artefacts rescored under the current objective
  (69/85/87/89/145), and why they are not a floor -- they were evolved under
  one objective and are scored under another;
* that the bead's migration premise is stale: experiments/migrate_ju3_rename.py
  does not exist, because ju3 tightened the matching rule at source (39.3)
  instead, so the old artefacts parse correctly with no migration;
* the 4x3-seed 500k cold-start baseline (~430 h) as the reference from here,
  with each programme's sd and its minimum detectable difference at n=3 --
  harbor mean 39.3, sd 5.5, MDD 13.7;
* zero missing-space fails in all twelve runs: the dominant term in the 3M
  artefacts is not one the live search still fails on;
* crinkliness at 112 of the 321 corpus fails (35%), all soft, all in the
  regime 9gj says quality_uncrinkliness returns a flat 0.0 for -- the largest
  single component of the residual is one the objective cannot descend;
* 66 of the 84 hard fails as one access-topology family (not-adjacent-to,
  inaccessible usable space, not connected), mechanism in 39.9.

38.7's acceptance paragraph is annotated in place rather than rewritten. The
connectivity clause is demoted to a separately tracked standing defect: it
appears in 10 of the 12 baseline runs.

tests/test_collapse_insearch.py carried its own stale "82 -> 58"; the same
layout now scores 89 -> 64, so the docstring dates the figure instead of
asserting a current one.

Closes homemaker-py-ut5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-04 17:16:10 +00:00
d492b7c271 coldstart maple-court seed 2 @ 500000: 55 fails (11h/44s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-03 10:06:06 +01:00
2426760d40 coldstart health-centre seed 2 @ 500000: 5 fails (3h/2s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-03 03:44:11 +01:00
761167f6a3 coldstart programme-house seed 2 @ 500000: 1 fails (0h/1s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-02 18:10:06 +01:00
51782047f3 coldstart harbor-house seed 2 @ 500000: 42 fails (12h/30s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-02 17:53:41 +01:00
b885bd3dbd coldstart maple-court seed 1 @ 500000: 73 fails (17h/56s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-02 10:52:55 +01:00
d7ac57d131 coldstart health-centre seed 1 @ 500000: 9 fails (5h/4s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-01 20:28:37 +01:00
b39b467662 coldstart maple-court seed 0 @ 500000: 54 fails (18h/36s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-01 03:21:09 +01:00
9d99cf34f7 coldstart programme-house seed 1 @ 500000: 1 fails (1h/0s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-31 21:50:30 +01:00
2415ad6504 coldstart harbor-house seed 1 @ 500000: 43 fails (7h/36s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-31 16:50:54 +01:00
d5d99dd4f6 coldstart harbor-house seed 0 @ 500000: 33 fails (8h/25s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-31 09:46:46 +01:00
6d1eb26088 coldstart health-centre seed 0 @ 500000: 4 fails (2h/2s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-31 01:20:51 +01:00
Claude
481e83cdbf
Shape-curve warm-start cannot pay off as wired; no A/B run
With tym landed the DP finally runs on real leaf-sharing searches, so v4s
asked for the search-level A/B. No A/B was run: two structural facts make
the payoff zero before any seed is drawn, and measuring a no-op would have
produced a null that reads like a measurement rather than a fact.

Reach. driver._evaluate gates the warm-start on `x0 is None`, and every
child gets x0 = innerloop.warm_x0(...) from its parent (driver.py:764), so
it fires only for bootstrap-population individuals. Instrumented over a
4000-eval run: 8 DP solves, exactly pop_size. At the corpus baseline's 500k
budget that is 8 evaluations out of 500,000.

Applicability. Constructed-seed feasibility over 6 seeds: harbor-house 0/6
with leaf_sharing on AND off, programme-house 0/6, harbor-house-l0 4-5/6
(75% over a real search). Even those 8 bootstrap individuals get no warm
start on the real programmes; only l0, the reduced programme the DP was
validated on, is feasible.

The infeasibility is correct, checked because it is the dangerous
direction: on 4 harbor topologies the DP rejects, an NM polish minimising
the shape-fail family reaches 14/16/17/16 fails, never 0 -- 0/4 false
negatives. Full harbor is genuinely shape-infeasible per topology where l0
is not. Per topology only: programme-house reaches 0 hard / 1 soft in the
500k baseline while its constructed seeds are DP-infeasible.

shapecurve_prune is separately inert -- it acts only inside the
feasibility_max_shape_fails branch and its exact arm needs best_n_fails<=0.

tym was still worth doing: the DP now models leaf-sharing exactly (38.23)
and fires on real runs, which is what turned an untestable question into a
structural answer.

Filed homemaker-py-ldj for what would have to change: give the DP reach
beyond the bootstrap, and/or use infeasibility as a ranking signal (an
infeasible topology still has a shape-fail floor, which is what a
pre-filter wants) rather than a precondition that discards it.

Closes homemaker-py-v4s.

Lint at parity (46).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-30 07:41:16 +00:00
Claude
4c95505907
Shape-curve DP models leaf-sharing, so it can fire on real runs
shapecurve.leaf_constraints derived each leaf's feasible area from its own
type's base (target, sigma). quality_size does not: a leaf holding k
same-code rooms is centred on k*target with sigma*k, and a co-typed leaf
adds both codes' targets. The DP modelled neither, so eligible() excluded
leaf_sharing/max_share/multi_use -- and leaf_sharing defaults True in
driver.search, so the guard excluded essentially every real run. The DP was
correct and unreachable.

Why the guard could not just be dropped, measured before touching it: on 6
harbor constructed seeds, 24 of 24 shared leaves (100%) have a real area
outside the unscaled single-room bounds. Relaxing eligible without
modelling k would have made the DP call every one of those topologies
infeasible -- false negatives that prune feasible topologies and misdirect
the NM warm-start. The guard was load-bearing.

Fix: mirror quality_size by asking the SAME Fitness object -- k =
graph.leaf_share(leaf, fit._max_share) when fit._leaf_sharing, then
target*k / sigma*k, else fit._leaf_co_type for the additive case. Same
object, same flags, same branch order, deliberately not re-derived: 39.5's
cpsat._matches bug was a solver optimising a relation the scorer had moved,
and this is the same hazard class.

Verified as an exact inversion: for every shared leaf in a real seed,
quality_size evaluated at the DP's amin and amax returns FAIL_THRESHOLD to
1e-9 (k=3 n-leaf: bounds [128.50, 231.50], both 0.100000).

superpose stays excluded for a different reason than the others: it does
not rescale a target, it changes which type the leaf is scored as, and the
collapse happens after the DP has read leaf.type.

shapecurve_warmstart/shapecurve_prune remain default off, so no current run
changes -- including the cold-start baseline in progress. They are now
applicable, which unblocks homemaker-py-v4s.

Closes homemaker-py-tym.

Lint at parity (46); tests 387 passed (3 new, 1 legacy rewritten to the new
contract rather than deleted), 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 21:36:45 +00:00
Claude
104ba12237
A/Bs now report what their sample could resolve
Three times in this log a verdict rested on a sample that could not have
produced it: 38.19 (programme-house claimed at N=20, resolves at N=60),
38.21 (harbor at n=3 resolves nothing finer than ~15 fails, yet every
recorded margin is smaller), 39.5/38.20 (a 10-fail cpsat margin inside a
+-23-fail noise band). Each was found years later.

experiments/ab_report.py makes it visible when the verdict is made:

  minimum detectable difference = t_crit(0.975, N-1) * sd / sqrt(N)

A margin below the MDD is not a weak result but an absent one -- the
experiment could not have distinguished it from zero however it came out.
The report flags that, refuses to endorse a winner, and states the N needed.
Validated against both datasets measured this session, reproducing the
hand-computed figures exactly:

  programme-house N=60  +0.567 p=0.017  MDD 0.462  verdict supported
  programme-house N=20  +0.700 p=0.085  MDD 0.805  UNDERPOWERED, N~=26
  harbor N=24           +1.208 p=0.502  MDD 3.669  UNDERPOWERED, N~=202

Harbor needing ~200 seeds means it cannot answer the collapse_insearch
question at any N this project would realistically run.

Fixed a defect in my own first version: with all-ties (sd=0) the MDD
collapses to zero and the naive abs(mean) < mdd reported "margin exceeds
the MDD -- verdict supported" for a margin of 0.000, with t=nan. A reporter
that endorses a zero margin is worse than none. Degenerate cases are now
explicit and distinguish all-ties from a constant non-zero difference.

Separate correction found while validating: 38.19's published p-values for
N=20 and N=40 were 0.069 and 0.045, from a normal approximation. The exact
paired t-test gives 0.085 and 0.052 -- so N=40 did NOT reach significance
either; it took N=60. The approximation was anti-conservative, making
results look more significant than they are, the same direction of error
this thread is about. Corrected at all four citing sites, and the "needs
N >= 40" guidance raised to N >= 60.

Closes homemaker-py-tco.

Lint at parity (46); tests 384 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 19:51:47 +00:00
Claude
c747e55abe
coldstart runner: commit only its own artefacts, not the whole tree
record_and_push used `git add -A`, so each completion committed the entire
working tree. On the live local run that meant one commit carrying 49 files
and ~1.97M insertions -- three still-running programmes' partial
coldstart-*.dom, plus unrelated evolved-*.dom -- under a message naming
only programme-house seed 0. In-flight artefacts were being recorded as if
they were results, attributed to the wrong run.

Now stages and commits exactly this run's .dom/.log/.score/.fails plus the
results TSV, via `git commit --only <paths>` so it holds regardless of what
else is staged and a concurrent edit elsewhere cannot ride along.

Note for the run currently in progress: it has the old code loaded, so it
will keep sweeping until restarted. The committed .dom files for
harbor-house, maple-court and health-centre are mid-run snapshots, not
results -- their logs show 75k/87k of 500k evals -- and should be
disregarded until those runs report their own rows.

First real result is in: programme-house seed 0 @ 500k, finish collapse
28 -> 1 fails, final 1 fail (0 hard / 1 soft), 19400s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 19:40:00 +00:00
Claude
f973d5c020
Fix the tco reference and its mangled description
The 0wr commit referenced the follow-up as 'homemaker-py-...' because the
ID did not exist yet; it is homemaker-py-tco. Its description also lost the
formula to a shell backtick -- restored via stdin:

  minimum detectable difference = t_crit(0.975, N-1) * sd / sqrt(N)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 19:35:08 +00:00
Claude
caf480aa32
Harbor A/Bs at n=3 could never resolve their own margins
0wr asked which harbor A/Bs were decided by a narrow margin before 39.4.
Measuring harbor's variance makes the margin-by-margin triage moot.

Harbor's paired seed-to-seed sd is 6.19 fails (24 paired ON/OFF runs,
budget 2500), so n=3 resolves nothing finer than 15.4 fails. Every recorded
harbor margin is below that: 13.9 share_edge_cap 3.7, 20 qpk 8.3, 23 f1d
mixed, 37.1 tiering 6.3. So it is not that SOME harbor results were narrow
-- no harbor A/B run at three seeds could resolve the margin it reported,
independently of what 39.4 did to the programme. Of the 220 possible
3-seed subsets of the 24 runs, 56 (25%) show a clean 3/3 sweep for ON.

Re-measured 20's harbor arm, the one backing a live default:
  N=3    2W/1L/0T  +2.67  p=0.560
  N=12   8W/3L/1T  +3.50  p=0.076
  N=24  13W/10L/1T +1.21  p=0.502  CI [-2.46,+4.88]

Null. The published "harbor: ON wins 3/3, 80.3 -> 72.0" was a lucky draw --
even seeds 1-3 measured here give 2W/1L, not a sweep.

So 20's claim that the qpk verdict "holds at both example scales tested" is
withdrawn and annotated in place. collapse_insearch's default rests on
programme-house alone (38.19, N=60, +0.57, p=0.017). It is not refuted on
harbor -- direction positive but indistinguishable from zero -- but harbor
must not be cited as corroboration.

Harness generalised (PROG/BUDGET/WORKERS) and results kept.

Filed homemaker-py-... : A/B harnesses should report the minimum detectable
difference for the N they run, so an underpowered verdict is visible when
it is made rather than years later.

Closes homemaker-py-0wr.

Lint at parity (46).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 19:34:30 +00:00
Claude
57d8391c52
Recover most of the cpsat test-suite cost; keep the part that is real
38.20's cap fix took the suite from ~4.5 to ~10 min because the
assign_cpsat tests now solve to optimality. Recovered to ~6.8 min.

The bigger win was not the threading. The secondary-adjacency test ran the
cpsat arm THREE times and averaged, and its own comment says why: the cpsat
path "is not yet bit-reproducible (homemaker-py-fdp)", so one 10-seed
aggregate could straddle greedy's deterministic value and the test was
flaky by construction. fdp is fixed (38.15), so one pass says exactly what
three did -- that was work spent papering over a bug that no longer exists.

constructive_topology and _assign_adjacency_aware now forward an optional
cpsat_limits=(time_limit_s, deterministic_limit); default None keeps
solve_room_labels' defaults, so production is unchanged -- verified 24/24
harbor solves still OPTIMAL at the defaults. It is not a tuning knob: it
exists so a test whose claim does not depend on optimality can economise.
test_construction_assign_cpsat_yields_valid_seed asserts invariants only
and uses it, 91s -> 53s.

That test now also guards a real trap: too small a budget makes
solve_room_labels return None, _assign_adjacency_aware falls back to
greedy, and the test would pass while exercising nothing. It counts
fallbacks and fails if any occur.

The two quality comparisons keep the full budget deliberately -- their
claims are about the optimum, and cheapening them would weaken what they
assert. That is why the suite does not return to 4.5 min; the residue is
the honest price of optimal deterministic solves.

Also corrected a stale claim in the secondary-adjacency comment: it
measures only "not adjacent to" fails and is not a claim that cpsat seeds
better overall, which 38.20 measured markedly worse.

Closes homemaker-py-7t1.

Lint at parity (46); tests 384 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 18:55:54 +00:00
ac5913151a coldstart programme-house seed 0 @ 500000: 1 fails (0h/1s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 18:27:40 +01:00
Claude
6e8bcce8f3
Correct a wrong bead ID in 38.20 (2xk -> 7t1)
The follow-up issue was cited by an ID written before the issue was
created. The real one is homemaker-py-7t1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 14:47:53 +00:00
Claude
03c1c5edcf
CP-SAT seeding re-measured deterministically: it loses
39.5 concluded the exact CP-SAT seeder beats greedy (harbor 102 -> 92,
maple 156 -> 154). Re-checked because fdp made the arms deterministic and
3qj made the model 7.5x slower. Three findings.

A live bug in the cap, found on the way. solve_room_labels sets a
deterministic work-unit budget (4.0) and a wall-clock backstop, commented
as "a pathological-case backstop only". At 2.0s it had become THE BINDING
CONSTRAINT: 2 of 24 harbor solves returned FEASIBLE not OPTIMAL, wall time
hit exactly 2010 ms, and the deterministic budget was never reached (max
2.483/4.0). Those labellings were suboptimal AND load-dependent -- the wall
clock is exactly the cap 39.5 added the deterministic one to escape. Cause:
38.14's t -> n adjacency makes the model much harder, and the 2s value
dated from when solves took ~124 ms. Raised to 30s; 24/24 harbor and 36/36
maple now OPTIMAL, deterministic budget still in headroom (3.569/4.0).

The verdict reverses. Deterministic, 12 seeds, scored canonically:
  harbor  greedy 1323 (722h)  0.079 s/seed    cpsat 1548 (908h)  1.623
  maple   greedy 1764 (777h)  0.063 s/seed    cpsat 2256 (1213h) 1.327
cpsat loses on both, +225 and +492 fails at ~21x the seeding time,
concentrated in hard fails.

Time and quality have different causes. Removing t -> n from harbor takes
cpsat 1.623 -> 0.193 s/seed (8.4x faster) but it is still +205 vs greedy
(was +225) -- so the adjacency explains the time blow-up and ~9% of the
quality gap; the regression is otherwise pre-existing.

Squaring with 39.5: that section records cpsat returning 194/180/171/182
over four identical 10-seed aggregates before the determinism work. Its
10-fail harbor margin sits well inside a noise band that wide, and was
measured with fdp's id()-ordered room_slots live. The seeder-level claim
was never established rather than overturned. 39.5 annotated in place.

Absolute totals are ~6x 39.5's because the objective has changed, so they
are not comparable to that table; the within-measurement comparison is
like-for-like and is what the verdict rests on.

No default changes: assign_solver was already greedy for 37.7's independent
reason. What changes is that "cpsat wins the seeder A/B" should no longer
be cited as a reason to pursue it.

The cap fix takes the suite from ~4.5 to ~10 min and the tests cannot opt
out, since constructive_topology does not thread the solver limits through.
Filed as homemaker-py-2xk.

Closes homemaker-py-vjd.

Lint at parity (46); tests 384 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 14:47:36 +00:00
Claude
e9e7060fb4
Re-validate collapse_insearch's default under the current objective
38.18 confirmed the 1ph default-flip was sound for its own era, but that
measurement predates three changes to the objective it was measured
against -- 39.4's namespace fix, 38.10/38.11's per-space crinkliness, and
38.12's missing-space cascade -- and collapse_insearch runs collapse_global
inside every eval, valued against exactly the factors those touched. A
default carried on a superseded measurement is an assumption, not a result.

Re-ran the 1ph protocol as published on the current codebase:

                        N    OFF    ON     W/L/T     diff    t     p
  published 1ph         20   7.95   7.10   11/6/3    +0.85   2.38  0.028
  current objective     20   7.85   7.15   10/7/3    +0.70   1.82  0.069
  current objective     40   7.60   7.03   21/14/5   +0.57   2.01  0.045
  current objective     60   7.58   7.02   29/19/12  +0.57   2.45  0.017

Verdict: the default STANDS. At N=60, mean diff +0.567 fails/seed, paired
t=2.454 (df=59), p=0.0171 exact, 95% CI [+0.105, +1.029] excluding zero;
Wilcoxon signed-rank cross-check agrees (p=0.0138), which matters because
fail counts are small integers and normality is not obvious.

Two caveats. The effect is about a third smaller than published (+0.57 vs
+0.85) -- partly regression from a lucky N=20 draw, partly plausible real
erosion, since several fails collapse_global used to clear have been
redefined out of existence or made harder.

More usefully: the published N=20 can no longer detect its own effect. At
exactly that sample size the current answer is p ~= 0.069, a null by the
conventional threshold. Had I stopped at N=20 the honest report would have
been "the 1ph verdict no longer reproduces" and the default would have
looked unjustified. It took N=60 to resolve. That is the 8sh/1ph/qi6/lj3
pattern this log warns about, now biting the flagship result itself: any
future re-validation of this default needs N >= 40.

20 annotated in place so a reader of the original claim sees the current
figure. Harness takes a seed range now (APPEND=1 to extend a sweep).

Closes homemaker-py-ioe.

Lint at parity (46); tests 384 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 13:57:45 +00:00
Claude
50fb293fa5
Re-verify 1ph: the iio bug could never have touched it
d86 asked for the rigorous version of 35's spot-check -- check out the
codebase at the 1ph commit, backport the iio stale-leaf-share fix, re-run
the historical seed sets.

One constraint had to be worked around: this repository's history begins
2026-07-30, six days AFTER the 1ph commit (2026-07-24), so that checkout
does not exist here. Closest reachable stand-in is 391f510 (2026-07-30), a
genuine ancestor of the iio fix and therefore pre-iio, carrying that era's
examples/ and objective. Measured there, not at the true 1ph commit, and
that is a real limitation of the reproduction.

Protocol as published: programme-house, budget 3000, 4 workers, seeds 1-20,
ON vs OFF, both arms finished with --collapse. Run twice over one worktree,
as-is then with the 22-line iio hunk applied.

                            OFF    ON     W/L/T    mean diff  t(df=19)
  published 1ph             7.95   7.10   11/6/3   +0.85      2.38
  pre-iio 391f510           8.05   7.10   11/6/3   +0.95      2.59
  same + iio fix            8.05   7.10   11/6/3   +0.95      2.59

The published verdict reproduces, and the iio fix changes nothing: 0 of 40
(seed, arm) cells differ, per-seed counts equal cell by cell.

It could not have been otherwise. The bug needs a leaf carrying a STALE
share/share_type, and leaf-sharing only stamps a share where a code has
count > 1 -- programme-house declares count: 1 for all six codes. Over 8
constructed seeds at that commit, programme-house had share_type set on 0
of 56 leaves; harbor-house on 24 of 128. _collapse_value reads
leaf.share_type, so the bug is structurally unreachable on the 1ph
protocol. That is why 35 saw 2/3 harbor seeds diverge by 5-8 fails while
programme-house at N=20 moves not one cell: harbor has codes at counts 10,
6 and 5.

20's retroactive caveat is discharged for the 1ph section and stays live
for harbor-house/qpk, where shares exist and divergence was measured.

Kept experiments/rerun_1ph_protocol.sh and both result TSVs.

Closes homemaker-py-d86.

Lint at parity (46); tests 384 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 13:21:29 +00:00
Claude
f6eeee7191
n_workers is an algorithm parameter, not noise
14 recorded "harbor seed 2 scored 71 then 73 on byte-identical re-runs --
parallel/BLAS non-determinism", and b8g carried that forward as noise
widening the error bars on every A/B run at n_workers>1. The premise does
not survive measurement. Nothing is non-deterministic:

  score a frozen .dom, 20 repeats in one process   bit-identical
  same .dom, 8 processes, varied PYTHONHASHSEED    bit-identical
  full search, harbor seeds 0-3, n_workers 1..4,
    repeated across processes                      bit-identical PER count
  the same with OMP/OPENBLAS/MKL_NUM_THREADS=1     IDENTICAL to unpinned

The last line matters most: b8g proposed "likely a one-line env pin in the
worker pool initializer". Pinning BLAS threads changes nothing bit-for-bit,
so shipping that would have looked like a fix, done nothing, and retired
the issue.

What is real is not noise: the trajectory is a deterministic function of
n_workers. harbor seed 3, budget 1500 -- w=1/2/3 all give 64 fails with
identical bits, w=4 gives 65. Each stable across processes. The mechanism
is batch_n = min(n_workers, ...) children bred from ONE population snapshot
before any is admitted, with the shared rng consumed in a different
pattern; at w=1 each child sees the population its predecessor updated. A
4-worker run is partly generational, a 1-worker run steady-state -- same
seed, different search. Divergence is occasional (seeds 0/1/2 agreed, seed
3 did not), which is how it reads as noise when sampled.

14's observation was most likely homemaker-py-xcy, the as_completed
admission-ordering bug, which WAS non-deterministic and is fixed.

Shipped instead of a no-op env pin: driver.search's docstring states the
contract; test_search_is_reproducible_at_a_fixed_worker_count parametrises
over 2/3/4 workers, asserting each is internally stable and deliberately
NOT that they agree; test_scoring_a_frozen_design_is_deterministic guards
the floor.

The run_*_ab.sh harnesses already pin WORKERS=4, so arms inside one harness
are sound. The exposure is comparing across harnesses, or against a
historical figure whose worker count was never recorded.

Closes homemaker-py-b8g.

Lint at parity (46); tests 384 passed (3 new), 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 12:52:33 +00:00
Claude
225e673ae3
Staged harness re-scored under a different objective than it searched
run_staged_search.py reported MISMATCH on its BASELINE arm -- the
LEAFSHARE=0/MULTIUSE=0 control every A/B compares against. Two facts
combined: driver.search_staged had no collapse_insearch parameter at all,
so every inner search() call inherited search()'s True default
unconditionally; and no example patterns.config sets the key, so the final
_native_score rescore got False from a bare load_config. Search optimised
one objective, the rescore graded another.

The 7ua fix pinned the key inside a fitness.load_config monkeypatch, but
that patch was installed only `if leaf_share or multi_use` -- so it fixed
every arm except the control.

Fixed in the right place: search_staged now HAS the parameter (default
True, byte-identical to the inherited default), threaded into all three
internal search() calls. The harness chooses the arm explicitly (COLLAPSE,
default 1), passes it to the search, and passes the SAME value to
_native_score, which overrides the key rather than hoping the config
carries it. The rescore mirrors the search by construction.

Verified on programme-house, budget 150:
  baseline    MISMATCH 1.56663e-08 vs 1.51708e-08  ->  OK
  COLLAPSE=0  (knob did not exist)                 ->  OK 1.66216e-08
  LEAFSHARE=1 / MULTIUSE=1                         ->  OK

COLLAPSE=0 scoring differently confirms the knob is not a no-op, and the
default arm's search result is unchanged, so no prior staged number moves.

Audited the other three search_staged callers: run_and_capture_91f.py
already pins collapse_insearch: True; run_island_ab.py never re-scores;
probe_harbor_floor.py did NOT pin it and had the same bug -- now fixed, and
that is the harness which produced every 13.x floor number.

The recorded mitigating factor -- only the continuous score moved, the fail
count matched, and the run_*_ab.sh greps read only the count -- is true and
is exactly what made it dangerous: a harness that reports MISMATCH on its
own control, invisibly to the metric of record, trains everyone to ignore
the warning.

Closes homemaker-py-4ok.

Lint at parity (46); tests 381 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 12:11:38 +00:00
Claude
148988df14
constructive_topology was ordered by memory address on the cpsat path
assign_solver="cpsat" gave a different leaf-type signature on every run
from an identical seed, in the same process. One line:

  assignable = scope if scope is not None else set(leaves)
  noncirc = [L for L in assignable if L not in circ]      # id() order

assignable is a set of dom.Node, and Node hashes by id() -- a memory
address -- so iterating it ordered noncirc, and hence room_slots, by where
the objects happened to land in memory. That shifts between calls within
one process as allocation patterns change, with no seed involved.

Only cpsat showed it. The greedy path re-sorts every slot list with -idx[L]
as a unique tiebreak and is immune to the incoming order; CP-SAT consumes
room_slots order as its model's variable order, and the labelling problem
has many equally-optimal solutions. Greedy was not more correct, it was
masking a defect that had been there all along.

Fix: iterate the tree-ordered list, use the set only for membership.

Verified on programme-house, harbor-house and maple-court: 1 distinct
signature over 5 runs on both solvers, and 1 across 4 processes started
with different PYTHONHASHSEED, so context_types' string sets are not a
second source. test_constructive_topology_is_bit_reproducible guards both.

Method: rather than guess which set was at fault, instrument
solve_room_labels with an id-free fingerprint of inputs and outputs and
isolate the FIRST call, since later calls legitimately depend on earlier
ones through leaf types. Five runs gave five distinct first-call inputs,
placing the fault upstream of the solver in one step.

Every A/B on the cpsat path was comparing arms that differed partly by
memory layout -- 39.5's cpsat-vs-greedy verdict included, already down for
re-measurement under homemaker-py-vjd. Same id()-keying hazard as the
documented geometry._cache issue and a plausible contributor to
homemaker-py-b8g, which stays open: n_workers>1 has its own BLAS mechanism
and is not addressed here.

Closes homemaker-py-fdp.

Lint at parity (46); tests 381 passed (2 new), 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 11:45:19 +00:00
Claude
ee050532d6
Declare toilet-to-sleeping adjacency where the brief supports it
A toilet next to a sleeping room is a positive even with no door between
them (Brand): the adjacency is what makes a later knock-through possible.
The engine already scores it -- check_adjacency runs against the unfiltered
graph_base_pre -- but only where a programme declares it, and only
programme-house did.

Declared:
  harbor-house  t -> n    bathrooms serve the Neighborhoods (communal
                          sleeping); both unpinned, 6 t / 5 n
  maple-court   tt -> r   Upper Bathrooms among Individual Rooms, both
                          level 2, already 62% adjacent at seed time

NOT declared, and checking before declaring is what caught these:

  maple t -> n is IMPOSSIBLE. Adjacency is evaluated per level, and maple
  pins t to level 0, n to level 1. Declaring it would have added six
  permanently unsatisfiable fails; the 0% seed-time rate was a hard
  impossibility, not search difficulty. maple's ground floor has six
  bathrooms and one sleeping room (Clinic Room x1) -- a ground-floor WC in
  a communal building is public, so Brand does not apply anyway.

  health-centre has no dedicated WC. The ruling was that a treatment room
  "may give access to a toilet, but this would be a dedicated toilet"; t9
  is a Public WC and t10 a Staff WC. Earning the credit needs a WC added to
  the brief -- programme authoring, filed as homemaker-py-5nw.

Both declarations are reachable (best of 8 seeds 2/3 harbor, 2/2 maple), so
the search gets a gradient not a permanent penalty. evolved-3M-nols-3
84 -> 89 fails, all five the new requirement.

Cost: cpsat assignment ~7.5x slower on harbor (0.28 -> 2.11s per seed);
greedy, the default, unchanged at 0.06s. Ordinary runs pay nothing, but
39.5's cpsat-vs-greedy verdict was measured on a cheaper problem than the
corpus now poses -- filed as homemaker-py-vjd.

Two tests were over-fitted to the old seeds and are repaired to assert
their intent, not relaxed to pass: reassign now sweeps six constructive
seeds (seed 0's better-seeded design legitimately has nothing to improve,
5 of 6 others fire), and repair_circulation asserts that repair strictly
helps plus a >=85% bar rather than a sampled 100% hardened into a
guarantee (measured 25% -> 92%, stable over 6 and 12 seeds).

Closes homemaker-py-3qj.

Lint at parity (46); tests 379 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 10:57:44 +00:00
Claude
98d403b966
health-centre: enlarge the plot for a courtyard typology
39.11 found health-centre demanding 240 m2 of floor on a 183 m2 plot --
131%, single storey, nowhere for the overflow to go. Every room came out at
0.60x its declared target, 100% undersized, uniformly, and no amount of
searching could fix it.

Owner's ruling: enlarge the plot, sized assuming the building has a
courtyard. The plot is a quadrilateral here, so the courtyard is interior
space the search carves out, not a hole in the site. Sizing must therefore
allow for rooms (240, declared), circulation (~65, ~27%, NOT in demand --
the search creates C leaves) and courtyard (~36).

Scaled about the polygon centroid by k = 1.4606, chosen so the INSET area
lands on 400 m2. Centroid scaling preserves the site's irregular shape and
its one private edge: same site, larger.

  plot          183.2 -> 400.0 m2
  rooms/plot    131%  -> 60%      (harbor's ratio exactly, and harbor works)
  daylit perim  41.5  -> 61.3 m   (49.4 needed)
  median room area / (target x share)  0.60x -> 1.00x

The last figure is the one that matters -- 0.60x was the geometric
signature of the infeasibility, now level with harbor/maple's 1.01x.

The courtyard stays REQUIRED by the geometry, not merely permitted: a room
is at most 4.86 m deep before failing crinkliness, so a ~20x20 plot with a
daylit ring leaves a 106 m2 core that cannot reach an external wall.
Enlarging made room for a courtyard; it did not remove the pressure that
produces one.

evolve._preflight is now silent on health-centre.

Closes homemaker-py-7b7, unblocks homemaker-py-7xb.

Lint at parity (46); tests 379 passed, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 10:20:01 +00:00
Claude
df84bfe1e6
Missing-space cascade no longer weighted by YAML verbosity
check_space_counts emitted, per missing room instance, two base failures
plus one placeholder for each optional key the author happened to type --
has_size/has_width/has_proportion are literally "size" in c from the YAML.
So a missing room cost 3, 4 or 5 fails depending on nothing but how
verbosely its space was written, and under value *= 0.5 ** len(failures)
that is a 4x difference in penalty between two single rooms. The tiered
comparator inherits it directly, since n_hard is dominated by these
cascades -- the search's primary key was partly a measure of config style.

The two paths disagreed about the same room. A PRESENT room is checked on
all three qualities regardless of declaration: get_space_params fills width
and proportion from defaults, deriving width from size when absent, so
programme-house's t2 declares size: alone and still gets a real width
target of 1.633 it can fail on. Missing, it emitted one placeholder where
b1 emitted three. The cascade stands in for the checks that could not run,
and it stood in for the wrong number of them.

Fix: emit all three placeholders always -- a fixed 5 per missing instance,
mirroring the present-room path. 36 of 67 corpus codes were under-counted.
Max weight ratio between two single rooms 4x -> 1x (programme-house),
2x -> 1x (harbor, maple).

This makes fail counts LARGER and that is the point; it is a correctness
fix, not an improvement. harbor evolved-3M-nols-3 82 -> 84, generated
155 -> 174, evolved-3M 131 -> 144; maple generated unchanged (no missing
instances).

NOT taken: 1i8's other option, one fail per instance with the placeholders
informational. It fixes the verbosity dependence too but silently rescales
a missing room from 1/32 to 1/2, the same weight as one crinkliness fail.
Whether it SHOULD cost 1/32 is a real and separate question; bundling it
here would change the objective's priorities under cover of a bug fix.
Magnitude left exactly where it was, filed as homemaker-py-3i3.

Every historical corpus fail count is invalidated again, on top of 39.4 and
38.10/38.11 -- which is why the cold-start re-baseline belongs after the
objective work, not before it.

Closes homemaker-py-1i8.

Lint at parity (46); tests 379 passed (3 new), 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 09:33:40 +00:00
Claude
f5286dde3d
Make both failing tests assert their intent, not stale artefacts
The suite is green for the first time this session: 376 passed, 0 failed.

test_collapse_insearch_reproduces_94g_finish_time_result hard-coded both
endpoints of the 17 result -- 15 fails before collapse, 12 after. Those
were measured before 39.4, when harbor's effective programme was silently
32 instances because codes like cr1 were read as generic circulation; the
same layout now scores 82. But the guarantee the test exists to protect,
per its own docstring, is that in-search collapse reaches the SAME layout
as finish-time collapse on fixed geometry -- and two independent constants
never checked that. They can both drift and stay equal, or both hold and
mask an inequality.

Rewritten to compute both sides live and assert they agree, plus that
collapse does not make the layout worse. Measured: 82 -> 58 in-search, and
finish-time collapse independently reaches 58 at iters=3 and iters=6. The
invariant holds; only the constants were stale. Restating the reference
figure itself remains homemaker-py-ut5.

test_classify_fail_tier_covers_full_corpus globbed examples/**/*.fails and
asserted checked > 0. Git tracks ZERO .fails -- they are artefacts the
scorer writes beside a .dom -- so its docstring described files that by
design never exist in the repo, and it passed only on a machine that had
already run the scorer. Split into: a test that GENERATES fails by scoring
three corpus layouts picked for breadth (requiring >= 8 distinct kinds so
it cannot silently narrow); a test that an unclassifiable string actually
raises; and an opportunistic .fails sweep that never requires them.
Verified by moving every .fails out of the tree and re-running.

Closes homemaker-py-1ue.

Lint at parity (46).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 07:11:25 +00:00
Claude
e5eb397b52
Checkpoint long searches; the cold-start runs were lost to a reclaimed box
All four 500k runs died about 10 minutes in when the container was
reclaimed. No SIGTERM fired, so no .dom was written and 0 of 12 runs
completed. My plan committed results per finished run, which protected
nothing because no run reached its commit point. The bad assumption was
reading "reclaimed after inactivity" as CPU inactivity; it is conversation
inactivity, and background compute does not hold the box open.

Progress reached before the loss (from the tracked logs): harbor 24,960
evals / 40 fails, maple 14,880 / 79, health-centre 25,920 / 33,
programme-house 138,800 / 2.

The underlying gap is not environmental: a search's only output lands at
the very end or on SIGTERM, so ANY abrupt loss -- reclaimed container, OOM,
power cut -- takes the whole run with it. On a 3M-eval search that is 2.4
days of compute with no recoverable artefact.

  - driver.search gains checkpoint=/checkpoint_every=: the current best is
    handed to a callback at most every N evals. Rate-limited by evals, not
    improvements, which come in bursts early. A failing checkpoint is logged
    and swallowed -- losing a checkpoint is bad, losing the search because a
    checkpoint failed is worse.
  - homemaker-evolve --checkpoint-every N writes <out>.dom.checkpoint via
    mkstemp + os.replace, so a crash can never catch it half-written. It is
    deliberately NOT the output path: a checkpoint is a leaf-sharing run's
    internal best, dishonest under the canonical scorer until the finish
    stage unfolds it (homemaker-py-3l6), and must not be mistaken for the
    finished article.
  - Verified the written checkpoint re-loads as a valid .dom.

Default off, so behaviour is unchanged without the flag.

Lint at parity (46); tests 372 passed (3 new), same 2 pre-existing failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-29 05:43:58 +00:00
Claude
e13b7b1313
coldstart: track the in-progress run logs
The four seed-0 runs are live; their progress logs are the improvement
history DESIGN.md cites for a long run (cf. evolve-3M*.log). Tracking them
now so nothing is stranded if the container is reclaimed mid-run -- the
runner rewrites them on each completion anyway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 23:30:01 +00:00
Claude
4d7a3e65b9
Remove cold-start smoke-test artefacts (budget 1000, pipeline check only)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 23:29:17 +00:00
Claude
e2d5838433
coldstart programme-house seed 0 @ 1000: 7 fails (3h/4s)
Cold-start re-baseline after the DESIGN.md 38.10/38.11 objective
change. Single worker (avoids homemaker-py-b8g), scored by the
shipped scorer from the programme directory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 23:29:01 +00:00
Claude
45eff37f96
Records Room ruled a store; stays exempt
No config change -- health-centre re1 already declares crinkliness: none.
This settles the corpus classification at 14 spaces: storage,
plant/mechanical, utilities closets, records room. Replaces the hedge in
38.11 with the ruling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 23:22:02 +00:00
Claude
c9b9eafef6
Owner's daylight ruling: corridors need it; retract the 61% headline
Ruling: corridors need daylight. Only rooms not occupied from day to day --
a cupboard, a store, a plant room -- do without it.

That overturns the classification 38.8 and 38.9 rested on. Those sections
exempted internal circulation, covered courtyards, WCs, laundries and
reception on my inference rather than any ruling. None are exempt: a
corridor is occupied all day every day, a waiting room likewise, a laundry
is a room people spend time in, a sterilisation room is a workplace.

Re-measured with the classification READ FROM THE CORPUS (a space is exempt
exactly when its own patterns.config declares crinkliness: none) instead of
inferred: 24 of 271 crinkliness fails (9%) were not defects -- not 136
(50%), not 61%. Overstated by about six times.

  - uncrinkliness_circulation stays at [5/6, 1.1/3]. 38.10 called its
    equality with the habitable target the purest case of an untuned value;
    it is not a bug, it is the correct answer reached by default, since
    corridors want daylight on the same terms as rooms.
  - corpus declarations narrowed 18 -> 14. usage: utility was too coarse and
    swept in Laundry Rooms and a Sterilisation Room. What remains is
    storage, plant/mechanical, utilities closets and a records room.
  - audit_crinkliness_truth.py rebuilt to read the classification from the
    configs rather than infer it from usage:, so it cannot drift from the
    ruling again.
  - 38.8/38.9's inflated figures flagged in place, with 38.11 carrying the
    correction.

What survives, none of it dependent on the classification: the 38.6
critique of the three modes; usage_daylight being mis-keyed; the 38.8 A/B
yardstick being wrong; and the per-space crinkliness mechanism itself.

ssz's opening measurement was right but its reading was wrong -- under this
ruling a buried leaf usually IS a defect, so scoring it zero is largely
correct. The narrowed remnant is that the score is FLAT rather than low, so
two equally-buried layouts cannot be ranked. Filed as homemaker-py-9gj; it
is a search-mechanics problem, not a calibration one.

Lint at parity (46); tests 369 passed, 2 pre-existing failures (ut5's stale
baseline and 1ue), both failing identically before this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 23:14:21 +00:00
Claude
31d50ba72b
beads: correct a mangled ssz comment
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 22:42:12 +00:00
Claude
335dd9c1ff
beads: close bdf, attach ut5's failing test, file 1ue
The owner's fixture commit (0d4ae7a) took fresh-clone failures 7 -> 2, so
bdf is closed. The 2 remaining are different bugs:

- ut5 now has a failing test attached. test_collapse_insearch hard-codes
  15 fails for evolved-3M.dom; measured 86 at 0d4ae7a and 81 after the ssz
  crinkliness change. The gap is the 39.4 namespace fix (the 15 dates from
  when harbor's effective programme was 32 instances because cr1 and
  friends were read as generic circulation); the 5 is this session's
  change, in the expected direction.

- 1ue (new): test_classify_fail_tier_covers_full_corpus globs
  examples/**/*.fails and asserts checked > 0, but those are generated
  artefacts absent from a clean tree, so it asserts on the developer's
  working tree rather than on the code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 22:41:42 +00:00
Claude
055d7101cd
ssz: crinkliness is declared per space; there is no daylight attribute
Owner's ruling, and it corrects the design not just the classification: the
daylight requirement is already defined in the crinkliness. The gaussian's
compact side IS "too little exposed wall per unit floor"; its exposed side
is envelope cost. 38.9's proposed daylight: axis was redundant, and keying
it off usage: was worse than redundant.

What was actually missing: crinkliness is the only leaf quality factor with
no per-space target. size, width and proportion are all declared by the
space; crinkliness was one global number for every room in every building.

  crinkliness: none        -> no minimum-exposure requirement, may be buried
  crinkliness: [t, s]      -> this space's own target
  key absent               -> the global uncrinkliness target, as today

`none` clips the factor on the compact side, it does not switch it off:
over-exposure is still penalised, because a crinkly leaf costs envelope
whatever it holds. A store may be buried; a store may not be a starfish.

The mechanism is backward compatible -- an absent key resolves to the
global target, so shipping it changes no score. Behaviour changes only
where a config declares something, which keeps the objective change
visible per programme in config rather than hidden in a default.

Owner's classification: everything a person occupies wants a window, WCs
and reception/waiting/foyer included; only stores, plant, records and
laundry do not. migrate_crinkliness_key.py declared crinkliness: none on 18
corpus spaces. Crinkliness fails 271 -> 243, of which not-defects 136 (50%)
-> 108 (44%); the 28 that went are exactly the utility fails.

usage_daylight and needs_daylight are removed as mis-keyed, and
DAYLIGHT_USAGES with them -- a vocabulary value should exist only where the
engine treats it differently. The historical crinkliness_mode modes stay,
default off, so 38.6/38.8 remain reproducible.

uncrinkliness_circulation is now settable to none like any space, but its
default is left unchanged pending a ruling: corridors were not among the
groups ruled on and are 63% of the remaining phantom fails.

Lint at parity (46); tests 364 passed, same 7 pre-existing fixture failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-28 22:39:09 +00:00
0d4ae7ad54 Add missing test files 2026-08-28 09:46:11 +01:00
Claude
bb27a5e548
ssz: 61% of reported crinkliness fails are not defects; two corrections
Correction 1: 38.8's A/B scores every arm under stock urb, which is only
sound if stock is ground truth -- and stock is what this section shows is
miscalibrated. Scoring the repair under the objective it repairs penalises
it for repairing. That result is not evidence against usage_daylight.

The measurement that matters needs no search: are the emitted failures
true? audit_crinkliness_truth.py classifies every stock crinkliness fail by
the leaf's declared usage. 164 of 271 (61%) are reported against spaces
that want no daylight -- stores, WCs, plant, corridors, covered courtyards
-- and it holds on evolved artefacts (maple generated.dom: 64%), not just
constructed seeds. Under value *= 0.5 ** len(failures) each one halves the
fitness of a design that did nothing wrong.

Correction 2: usage: is the wrong key, and usage_daylight as written
mis-keys it. 39.7 established usage: as an ACCESS-requirement class.
"Needs no special access" and "needs no window" are different questions,
and the corpus separates them: usage: none is Waiting Room, Reception,
Reception Office, Entrance Foyer -- a waiting room plainly wants daylight
and DAYLIGHT_USAGES exempts it. The usage: bedroom half is right, but by
luck of where the access axis happened to fall.

The audit is robust to that error (61% -> 57% if none is reclassified), so
the finding stands; the design does not. Daylight needs its own declared
per-space axis, decided by the programme author as usage: was.

usage_daylight stays default off and is not the shipping fix. The
compact-side clip is the right shape for the factor, so the mechanism is
retained pending a daylight: attribute to key it on.

Higher-power A/B stopped: it was chasing a score against a flawed objective
with a mis-keyed fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 18:07:01 +00:00
Claude
6405ca1a59
ssz: record the A/B result honestly -- not a pass at n=3
Fixed-budget A/B (3000 evals, 3 seeds, harbor + maple, every arm scored
under stock urb so the permissive modes cannot win by deleting a fail
category).

usage_daylight's paired hard-fail deltas are harbor [0,-1,-10] and maple
[0,+2,-10]. The means (-3.7, -2.7) flatter it: the whole signal is seed 2
in both programmes, and seed 2 is the seed where stock itself does worst.
Two seeds in three are flat or slightly worse. On that seed soft rises as
much as hard falls (harbor -10h/+9s, maple -10h/+15s), so totals go
62->61 on harbor and 120->125 on maple.

Because the scoring is stock, that is a genuine trade of hard failures for
soft ones, not a relabelling -- progress under the tiered comparator, where
n_hard is primary, but a fail against this issue's acceptance criterion
("without inflating soft"). Which yardstick is right is now the live
question, and it is gvb's question as much as ssz's.

usage_daylight stays default off; undecided, not refuted. Higher-power run
(urb vs usage_daylight, 10 seeds) is running.

The diagnostic half stands independent of the search A/B: the objective
demands daylight of two thirds of the buried population that does not want
it, and 38.6's contrary null was an artefact of three modes that never
touched those leaves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 17:57:11 +00:00
Claude
f1831687c1
ssz A/B: results snapshot (6/30 arms; run in progress)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 16:50:28 +00:00
Claude
02967d5de7
ssz: use the module-level programme import in needs_daylight
fitness.py already imports the module as `_programme` at the top and uses
that idiom elsewhere (`_programme.SOCIABLE_USAGES`). The local re-import
sat in the per-leaf hot path for no reason.

Also snapshots the in-progress ab_ssz_search.csv; the full run is still
going and will supersede it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 16:46:59 +00:00
Claude
189efdbfc7
ssz: daylight is required of rooms that do not need it
DESIGN.md 38.6 concluded the three crinkliness modes were inert against the
circulation-deletion incentive. Two things were wrong with that measurement.
Its premise, 38.2, is retracted. And its script selected leaves with the
pre-39.4 prefix rule `type[:1].upper() in ("C","O")`, which sweeps every
programme room starting with c or o -- cr1, of1 -- in as circulation.

The simpler problem is that none of the three modes ever touched the leaves
ssz is about. quality_uncrinkliness reaches `if not crink` before any mode
logic that matters, so for a zero-exposure leaf: floor returns 0.01 (one
percent of a unit quality, multiplied into a product and weighed against a
whole leaf's cost -- inert); compact_ok is self-contradictory, announcing
that compact is not a defect and then returning the floor for the most
compact case of all; exempt_circulation reaches at most a third of them.
Measured: 0% / 0% / 0% / 21-33% of buried leaves rescued.

What the buried leaves are, now that 39.7 gives every space a usage: two
thirds of them are spaces that architecturally do not want a window --
stores, WCs, plant, corridors, covered courtyards -- scored identically
with a windowless bedroom. harbor 22/33, maple 33/46, health 9/18.

  - crinkliness_mode="usage_daylight": daylight required of the uses a
    person occupies (programme.DAYLIGHT_USAGES) and nothing else. Elsewhere
    the factor is clipped on the compact side only, so being buried stops
    being a defect while over-exposure still costs -- a crinkly leaf costs
    envelope whatever it is used for. A windowless bedroom stays the hard
    zero it is under stock: 11/11, 13/13, 9/9 still failing.
  - compact_ok repaired to score the buried limit as compact, the behaviour
    its name always claimed. It now rescues 100% including bedrooms, and is
    kept as the upper-bound control, not a candidate.
  - ab_ssz_search.py: the fixed-budget search A/B ssz's acceptance criteria
    actually asks for. Every arm is optimised under its own objective and
    re-scored under stock urb, because the permissive modes return 1.0
    where stock fails and would otherwise win by deleting a fail category.
  - ab_crinkliness_mode_ssz.py: prefix rule fixed, retracted premise
    flagged in its docstring.
  - 38.7's remaining claims from the retracted 38.2/38.3 corrected.

Default is unchanged ("urb"), byte-identical to all prior runs. Lint at
parity (46 pre-existing); tests 366 passed, 10 new, same 7 pre-existing
fixture failures (homemaker-py-bdf).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 16:45:10 +00:00
Claude
8522576467
Frontage feasibility as a pre-flight check; retract the "3x short" claim
Closes homemaker-py-tdp. The bound it was built on (every interior leaf
needs L >= A/(1.6202*h) of daylit wall) is sound, but tdp applied it to a
FULLY BUILT plot. None of these programmes ask for a fully built plot.

Recomputed against the area each programme actually demands, harbor-house
and maple-court are not frontage-infeasible: they need 49 m2 and 22 m2 of
courtyard against 277 m2 and 424 m2 of spare plot. The "2.7x / 2.9x short"
figures are withdrawn, and with them the claim that the plateau programmes
are unsatisfiable as specified -- the plateau remains unexplained.

One corpus programme is genuinely infeasible, for a much cruder reason:
health-centre demands 240 m2 of floor on a 183 m2 plot (131%), single
storey. Every room lands at 0.60x its declared target, 100% undersized,
uniformly. Filed as homemaker-py-7b7, blocking homemaker-py-7xb.

  - evolve._preflight: two closed-form checks at startup (does the demand
    fit the plot; is there enough daylit wall for it). Advisory only, it
    never blocks a run -- an author may be exploring an over-tight brief
    deliberately. Silent on programme-house.
  - diag_exposure_frontage.frontage_budget reports the full budget.
  - DESIGN.md 39.11 with the corrected corpus table; 38.3 marked PARTLY
    RETRACTED and cross-referenced.

Both measure plot area and frontage through geometry rather than the raw
init.dom corners, so they carry the wall_outer inset and plot rotation,
and "daylit" means what Fitness.area_outside means by it. A hand-rolled
first version skipped the inset and read ~1 m / ~14 m2 optimistic per
plot; 39.11 carries the corrected numbers.

Lint unchanged at 46 pre-existing findings; tests unchanged at 7
pre-existing failures (the uncommitted evolved-3M*.dom fixtures,
homemaker-py-bdf).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 16:20:52 +00:00
Claude
024311a2c2
§39.10: preserving constructed connectivity is NULL — and it reframes §39.9
§39.9 named the upstream fix: keep circulation connected DURING the resize
rather than rebuilding it after. Built and measured. It does not help, and the
reason matters more than the lever.

Both halves of the re-cut do damage, in different proportions per programme.
Freezing rotations and letting only ratios move (% levels connected, 12 seeds):
harbor 100 -> 71 -> 50, health-centre 100 -> 8 -> 8, maple 100 -> 92 -> 67. So
health-centre is destroyed entirely by the ratio and maple mostly by the
rotation; a fix must be able to give back either.

operators._size_divisions_preserving_circulation snapshots every cut, resizes,
then reverts the cuts on the tree path between each circulation pair the resize
broke -- programme fully intact, no retyping, only geometry given back. It works
on connectivity (harbor 50->92%, maple 67->97%, health-centre 8->17%) and costs
area accuracy: constructed-seed fails harbor 96.6->141.5, maple 141.8->175.8,
size fails roughly double. (A greedy single-cut revert barely moved -- it stalls
where no ONE revert helps though two would. Targeting the broken pairs is what
made connectivity work.)

The obvious defence -- raw constructed seeds understate it, the resize is only a
warm start, the inner loop should recover -- was TESTED AND FAILS. Full search,
harbor-house, 12000 evals, seed 1:
  OFF  43 fails,  9 hard, 3 connectivity
  ON   65 fails, 26 hard, 4 connectivity
Worse on every axis, including connectivity itself.

REFRAMING: §39.9's fact stands (the resize destroys 41 of 49 circulation edges)
but is NOT ACTIONABLE, because construction-time connectivity does not determine
final connectivity. The search discards and rebuilds the seeder's circulation
either way, and constraining the seed only spends area quality the search cannot
recover. Together with §39.8 (not an incentive problem) that retires the framing
this thread inherited from §38: connectivity is neither a construction problem
nor an incentive one.

Both flags (repair_circulation, preserve_circulation) stay default off with the
numbers recorded, plus byte-identical-default tests. Do not revisit either
without a new formulation -- the standing this document gives bubble.py.

356 passed (+1 new), same 7 pre-existing fixture failures, lint unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 15:11:46 +00:00
Claude
7c41069226
§39.9: level-not-connected is destroyed by the resize, not by the search
Answers homemaker-py-yql. §39.8 established the search is not PAID to sever
circulation; this establishes where connectivity actually goes.

CONSTRUCTED, THEN LOST -- at construction time, in the resize.
_assign_adjacency_aware picks circulation as a CONNECTED dominating set and
succeeds every time. _size_divisions_from_targets then moves every wall to hit
the programme's area targets and destroys it.

Measured over 20 constructed seeds per programme, fully-connected seeds:
harbor-house 1/20, health-centre 1/20, maple-court 0/20. The control -- same
seeds with proportion_aware=False, i.e. no resize -- is 100% connected on all
three. Mechanism confirmed on health-centre: 41 of 49 circulation-to-circulation
edges destroyed by the resize, surviving shared walls squeezed to 0.54-1.11 m
against door_width=1.2, so they stop counting as edges. This is the failure mode
§37.7 recorded for CP-SAT assignment, never looked for in connectivity, where it
costs 35-95 points.

§39.7 COST CHECK: zero. Identical rates under prefix-inferred vs declared
usages -- has_circulation never trims C-C edges, so last commit's usage change
could not and did not make connectivity harder to achieve.

REPAIR MEASURED NEGATIVE. operators.repair_circulation_settled applies §37.7's
own alternating-minimisation fix (re-connect against the settled geometry by
retyping the cheapest bridging leaves to C). It restores 100% connectivity on
all three programmes -- and is still the wrong trade: connectivity fails fall
0.8-1.7 per seed while missing-room fails rise 5.0-8.5, because every retyped
leaf displaces a required room at a 3-5 fail cascade (§38.5). Kept default off
with the write-up, per house style for a null lever, plus a byte-identical
default test and a test asserting it does reconnect every storey.

NEXT LEVER, FILED: preserve the connection during the resize (constrain
_size_divisions_from_targets so a shared C-C boundary cannot fall below
door_width) rather than rebuild it afterwards at the programme's expense --
a constraint on an existing solve, not a new repair pass. solver.py's existing
min_width_generic is the same idea applied to leaf width rather than to a shared
boundary, so it may belong beside it.

Adds experiments/diag_connectivity_yql.py (construct / cost / survive reports).
355 passed (+2 new), same 7 pre-existing fixture failures, lint unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 14:39:07 +00:00
Claude
3aee813ccd
§39.8: homemaker-py-2v1 connectivity weighting — MEASURED NULL, premise retracted
§38.2 concluded the objective is net-positive on severing a level's
circulation: merging a corridor into a habitable sibling gains x6
(value_inside/value_circulation), while "level N not connected" costs x0.5, so
break-even needs 0.5^w < 50/300, w > 2.58 -- "severing must cost at least 3
fails and costs 1". The arithmetic is right. The premise is wrong.

Shipped anyway, EXPERIMENTAL and default off (byte-identical):
fitness.connectivity_weight_for(value_inside, value_circulation) returns the
smallest weight making severing net-negative -- 3.0 at the defaults, DERIVED
from the rates rather than hard-coded so it tracks them if either is retuned.
conf["connectivity_weight"] takes 1.0 / "auto" / a number and counts each
connectivity failure as w failures in the 0.5^n penalty.

MEASUREMENT: at auto (=3) the §38.2 deletion test does not move at all -- 5/25
rewarded either way, median x0.26 vs x0.27. Reason: the connectivity fail count
is UNCHANGED in every rewarded deletion (115->107 fails but 5->5 connectivity;
107->99 but 3->3; 78->71 but 3->3). Weighting a fail that never fires changes
nothing.

And when a deletion DOES break connectivity, it is already punished. Every such
case, 4 seeds per programme: harbor-house 2 of 32 sampled deletions, both
punished (x0.00, x0.01); maple-court 5 of 32, all punished (x0.58 .. x0.07).
Severing costs 1-2 connectivity fails PLUS the cascade after them, which
already outweighs the x6 gain. The flat rule was never the problem.

Where §38.2 went wrong: the x4.06 "well-daylit circulation leaf" that motivated
the bead was a deletion that did NOT change the connectivity fail count. It was
rewarded for removing the leaf's own quality failures -- §38.1's zero-value
finding -- and I misread it as a pricing mechanism. §38.2 now carries the
retraction inline. Two lessons recorded: a plausible closed-form arithmetic is
not a measurement, and when a fix produces exactly no effect, suspect the
premise before the implementation.

Still standing from §38: §38.1 (buried leaves score zero quality and contribute
no value) and §38.3 (frontage budget) are direct measurements. §39.7 remains
the better lever on the same symptom -- it made the connectivity fails FIRE,
where this would only have made them cost more.

Re-opened as homemaker-py-yql: why level-not-connected persists in the best
layout when severing is already punished. Evidence now points at reachability,
not incentive, and it is newly measurable because §39.7 stopped store cupboards
standing in for corridors.

353 passed (+3 new), same 7 pre-existing fixture failures, lint unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 14:15:22 +00:00
Claude
03aadec1ba
§39.7: access requirements become a declared usage: attribute (homemaker-py-sel)
Closes the second namespace sharing a first character with programme codes: the
usage prefixes b/t/l/k, under which a room silently inherited another room's
connectivity rules from its spelling.

usage is a plain, MANDATORY attribute of the space definition -- not a lookup
table. An interim design proposed a top-level usage_classes: table binding
author-coined names to behaviour; withdrawn, because an indirect name->behaviour
mapping living apart from the thing it describes is exactly the shape of the
prefix rule §39 exists to remove, it would be the only such table in a schema
where every other space property is a plain attribute, and the need it served
was already met -- "building specific" is about what a room is CALLED, and
name: is already free text.

Rule that settles it: a usage value exists iff the engine treats it differently
somewhere. Config selects among behaviours; it cannot invent them.

- programme.USAGES (living/kitchen/bedroom/toilet/utility/none) plus the
  behaviour groupings PRIVATE_USAGES / PRIVATE_STRIPS / TOILET_STRIPS /
  SOCIABLE_USAGES. Missing or unknown usage is a load error naming the code,
  from BOTH parse paths.
- Code-level, never leaf-level: usage_of(leaf.type) is looked up fresh, so a
  retype changes the class automatically. 51 sites assign leaf.type, and
  share/share_type plus the r5a resurrection are the precedent for why
  leaf-level attributes rot.
- graph.has_circulation takes the usage map and trims on declared class;
  fitness.access and the public-access check likewise. fitness._t0 is DELETED --
  no first-character type test remains anywhere in the codebase.
- utility is distinct from bedroom (same access requirements today) because it
  is a different use and gives derive_interchange_classes an axis to relax on.
- A toilet now keeps its edge to a terminal room -- the Brand adjacency, which
  the old b-before-t loop ordering severed.
- All 107 corpus entries migrated by experiments/migrate_usage_key.py, comments
  and layout preserved.

MEASURED -- the connectivity model was ~4x too permissive. `none` is not
neutral: nothing is trimmed, so the graph may route THROUGH the room, and 34 of
52 codes had no class (Dental Surgery, Records Room, Utilities Closet all served
as corridors). Edges trimmed, prefix-inferred vs declared, 3 seeds each:
  harbor-house   18 (9%)  -> 79 (39%)   inaccessible fails 0 -> 4
  health-centre  12 (8%)  -> 59 (40%)   inaccessible fails 2 -> 3
  maple-court    53 (17%) -> 123 (39%)  inaccessible fails 1 -> 5

Re-baseline (seed 1, 20k, harbor): 58 fails (15h/43s) -> 61 (16h/45s), now
reporting 1-inaccessible-usable-space x2 plus level 0 and level 1 not connected.
The count rose because the objective got honest -- those failures were always
true of the layout and the old model could not see them. Every harbor number
before this was measured against a graph crediting routes through store
cupboards.

Sharpens §38.2: the objective pays x60-85 to delete circulation, and until now
the deleted corridors were not missed because storage stood in for them. With
that substitution gone, homemaker-py-2v1 is the remaining half -- and now
measurable, because the fails it should prevent actually fire.

350 passed (+5 new), same 7 pre-existing fixture failures, lint unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 13:39:41 +00:00
Claude
72673a2ebf
homemaker-py-sel: usage is a plain space attribute — drop the mapping table
The proposed top-level `usage_classes:` table (binding author-coined names to
engine behaviour, e.g. craft -> living) is withdrawn. Wrong three ways:

a) Same bug in another costume. An indirect name -> behaviour mapping living
   apart from the thing it describes is exactly the shape of the
   first-character prefix rule. §39 exists to remove that shape, not relocate
   it into a table.

b) Inconsistent with the schema. Every other space property is a plain
   attribute -- name, size, width, proportion, adjacency, level,
   requires_below, count, share, interchange, co_locate -- and no key anywhere
   in patterns.config is an indirection table. Verified across the corpus.

c) The need was already met. "Programmes are building specific" is about what a
   room is CALLED, and name: is already free text. usage: records ACCESS
   REQUIREMENTS, which are not building-specific -- a craft room and a lounge
   have the same ones, which is the entire reason the key exists. The earlier
   draft conflated the two.

So: spaces: ws1: {name: Workshop Space, usage: living} -- one place, no
binding step, no unbound-name error class.

Rule that falls out and is worth keeping: A USAGE VALUE EXISTS IF AND ONLY IF
THE ENGINE TREATS IT DIFFERENTLY SOMEWHERE. Config selects among behaviours; it
cannot invent them. An alias produces no behaviour that the aliased value does
not. `utility` passes the test -- not on edge-stripping, which is identical to
bedroom today, but because it is intended to drive derive_interchange_classes.

No src changes; proposal file only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 12:56:12 +00:00
Claude
d5e10172c5
homemaker-py-sel: all 52 corpus codes assigned; utility distinct; open vocabulary
Rulings settle every previously-unresolved code: zt1 Sterilisation -> utility;
ph1 Pharmacy -> bedroom (a private room, not public, like an office); n
"Neighborhood" -> bedroom (a communal sleeping area, much like a dormitory);
gh1 Greenhouse -> living (grows plants, but a living area like a conservatory);
ws1 Workshop -> living conditionally, since it is building-specific (communal
craft room vs maintenance area) and both corpus programmes carrying it are
communal living facilities.

Final: living 12, bedroom 17, utility 11, toilet 7, kitchen 2, none 3. Zero
unresolved, zero missing.

DESIGN 1 — `utility` is a distinct value, not an alias for `bedroom`. Same
edge-stripping today (identical access requirements) but separately declared,
because they are very different uses AND because it gives
programme.derive_interchange_classes (§13/§26, homemaker-py-9o5) a natural
axis: bedroom- and utility-class leaves could be interchangeable DURING search
and collapse to their real use at scoring time, which is exactly the
superposition relaxation that machinery already implements.

DESIGN 2 — vocabulary controlled but NOT closed. The earlier "closed enum,
unknown value errors" recommendation is withdrawn. The six known names drive
behaviour; a programme may coin its own (`usage: craft`) provided it binds it
in the same file via `usage_classes: {craft: living}`. An unbound name is a
load error, so naming stays building-specific without an unrecognised usage
ever falling through to a silent default.

VERIFIED — the Brand adjacency point is not an engine bug. check_adjacency runs
against graph_base_pre, the UNFILTERED graph, so a declared adjacency is
satisfied by a neighbouring room regardless of what has_circulation strips; the
stripping only denies routing, which is correct. "A toilet adjacent to a
bedroom is a positive even if there is no door" is therefore already
expressible -- but only where DECLARED, and just one corpus programme declares
it (programme-house t1 -> [b1]). harbor-house, maple-court and health-centre
leave that adaptability credit on the table. Filed separately; it is programme
authoring and can land before or after the usage key.

No src changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 12:34:03 +00:00
Claude
6bed7cc535
homemaker-py-sel: propose usage for all 52 corpus codes; scope was understated
Bruno's rulings settle the framing: usage is an ACCESS-REQUIREMENT class, not a
room-name category. li1 "Library Corner" and br1 "Staff Room" are living rooms
(same access requirements); tr1 "Treatment Room" has a bedroom's requirements
(terminal, not a circulation route); la1 "Laundry Room" is utility. Ground-floor
external cases (fuel stores, bins) need no class — level: 0 plus adjacency: [o]
already expresses that.

SCOPE CORRECTION. My "93% pure annotation, 7 entries change" estimate was
mechanically true but misleading: `none` is not neutral. Nothing is stripped, so
has_circulation MAY ROUTE THROUGH the room. 34 of 52 distinct corpus codes
currently have no usage class and are therefore modelled as permeable corridors
-- including Dental Surgery, GP Consulting, Minor Surgery, Physiotherapy,
Counselling, Records, Sterilisation, six storage rooms, four offices and
"Individual Room" (a resident's own room).

Consequence for §38: the model OVERSTATES connectivity, since a level can be
found connected through rooms that are dead ends in reality. "level N not
connected" is therefore rarer than it should be, compounding §38.2 -- the
objective already pays x60-85 to delete circulation, and the corridors it
deletes are then not missed because store cupboards stand in for them.

Adds experiments/usage_map_proposal.yaml: all 52 codes covered (47 assigned, 5
unresolved, 0 missing) -- living 10, kitchen 2, bedroom 15, toilet 7, utility
10, none 3. Nothing reads it yet; it is the review artifact and, once agreed,
the migration input.

Also verified and recorded (Q2): a dedicated toilet off a bedroom-class room
does NOT survive scoring. has_circulation runs its bedroom loop before its
toilet loop and the bedroom loop strips bedroom->toilet, so the ensuite is
severed -- for real bedrooms too. Existing Urb behaviour, neither caused nor
fixed by the usage key.

No src changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 10:47:11 +00:00
Claude
f476a5849e
beads: revise homemaker-py-sel design — mandatory code-level usage, no fallback
Records the outcome of the "how does a parallel usage key work when the leaf
name can mutate?" review. Two problems were conflated:

1. Mutation staleness dissolves if usage is CODE-level: usage_of(leaf.type) is
   looked up fresh, exactly as size/width/proportion/adjacency already are.
   Verified every corpus leaf type resolves to a declared code or a generic.
   The broken design is usage stamped ON THE LEAF — 51 sites assign leaf.type,
   and this project already hit that class twice (share needed a companion
   share_type; r5a was a real stale-stamp resurrection even with the guard).

2. Name/key divergence is real and is NOT fixed by (1). Resolved by making
   usage mandatory on every declared code with no prefix fallback, closed
   vocabulary {bedroom, toilet, living, kitchen, none}, missing key = load
   error. One source of truth; room codes become free-form identifiers.

Measured migration: 10 files, 107 entries, 100 (93%) pure annotation; only 7
change behaviour (la1 x3, li1 x2, br1, tr1) and those are the fix.
write_stage1_programme already propagates the key.

Left open as the programme author's call, not mechanical: what those four
rooms should declare — li1 "Library Corner" as living is arguably already
correct, and br1 "Staff Room" may want living rather than none. Also noted:
mandatory breaks out-of-repo configs until annotated (mitigate with an error
naming each code and its prefix-implied usage, plus a migration script), and
the 7 changed entries need their own A/B and re-baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 10:32:14 +00:00
Claude
a25dc2cb59
§39.4 completion + §39.5 retraction + §39.6: the usage namespace is NOT clean
Answering "are we clean". Generic namespace: yes. Usage namespace: no.

FINISH §39.4. The first sweep missed sites, found by a full re-grep:
graph.py's free-area budget, operators.py host-preference / keep-type /
repair-candidate, fitness.py's ("l","c","k") public-access test, bubble.py's
generic adjacency reference, and -- the important one -- cpsat.py, which was
still matching adjacency by raw startswith. graph.code_matches_requirement is
now the single public answer to "does this leaf count as the thing the
programme asked to be next to", shared by has_adjacency, has_vertical_connection
and cpsat.

RETRACT §39.5. It concluded 2g7.5's CP-SAT seeder win did not survive the
correction. That was wrong. The cause was the missed cpsat matcher above: the
exact solver was optimising a different relation than the scorer checked, so a
failing test reporting an incomplete sweep was misread as a baseline shift.
Re-measured over 6 seeds, cpsat now wins on both programmes (harbor 102/92,
maple 156/154). xfail removed.

REAL BUG UNDERNEATH: CP-SAT was never deterministic despite
num_search_workers=1 and a comment claiming it. neighbors[slot] is a set of
dom.Node, which hashes by id() -- a memory address -- so raw iteration made the
model-build order vary and CP-SAT returned a different equally-optimal
assignment each run (measured 194/180/171/182 over four identical aggregates).
sorted() on the slot indices fixes it. Also paired the wall-clock cap with
max_deterministic_time (solves run ~124ms against a 2s cap, so nothing was
timing out -- latent hazard, not the cause). solve_room_labels is now
reproducible on every captured instance; constructive_topology on the cpsat
path still is not, filed as homemaker-py-fdp (plausible contributor to b8g).

§39.6 THE SECOND NAMESPACE. Usage prefixes b/t/l/k (bedroom/toilet/living/
kitchen) classify programme codes by first letter and stay prefix-based by
design, but they are not inert: has_circulation deletes graph edges from them.
Four corpus rooms are misclassified by spelling -- la1 "Laundry Room" and li1
"Library Corner" as living, br1 "Staff Room" as bedroom, tr1 "Treatment Room"
as toilet. Measured on a health-centre seed: tr1 loses its edge to the adjacent
O, br1 loses its edge to t10 "Staff WC" -- both feed the connectivity fails §38
found persisting. Filed homemaker-py-sel; an explicit usage: key is the fix,
but it changes fitness for correctly-spelled programmes too so it needs its own
A/B.

DOCS. README gains a "Room codes and reserved names" section; CLAUDE.md and
AGENTS.md gain the same summary for agents. audit_programme_config.py now
reports the usage class each code picks up alongside the namespace and
satisfiability checks. DESIGN §37.2's note calling the c/o/s quirk "existing
product behaviour, not a bug" is annotated as superseded.

Corpus audit: zero generic-namespace violations across all ten example
programmes. 346 passed, same 7 pre-existing fixture failures, lint unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 10:09:14 +00:00
Claude
7ec4e5d121
§39.4: tighten generic-type matching, reverting the harbor rename
Supersedes the previous commit's approach. Renaming harbor's four colliding
codes fixed one programme; tightening the matching rule fixes the rule, so a
room may be called anything. cr1/of/st1/st2 are restored and the examples are
byte-identical to their pre-§39 state -- which also means existing .dom
artefacts (evolved-3M*) stay valid, so migrate_ju3_rename.py is deleted.

The rule: Urb has exactly three GENERIC structural types (get_space_types:
qw/C O S/), the leaves the search creates. Measured across the corpus: 154 C,
110 O, 1 S, not one lowercase generic -- while every programme code is
lowercase, including single-character ones (r, t, m, n). Case is the
discriminator, not length. Every generic test was type[0].lower() in (...), a
case-insensitive PREFIX that swept up any programme code starting with those
letters; they now match the generic set exactly. 30 sites across dom, fitness,
graph, operators, programme, shapecurve and bubble.

NOT applied to the SEMANTIC prefixes: l/k/b/t classify programme codes by first
letter (graph.py builds bedroom<->toilet and kitchen<->living relations from
them) and stay prefix-based. Where the namespaces were mixed in one expression
they were split -- has_circulation's ("b","l","k","c") is three semantic
prefixes plus dom.is_circulation; access()'s ("l","c","s") is semantic l plus
the generic circulation set.

New: dom.GENERIC_{CIRCULATION,OUTSIDE,TYPES} + is_generic(); fitness.
_generic_class(), replacing the _t0 dispatch in quality_size/quality_width/
quality_proportion/value_rate -- the four terms that mattered most and that a
first sweep missed, since they dispatch through a t0 variable rather than an
inline test. graph._adjacency_target resolves a generic adjacency requirement
(programmes write "adjacency: [c, o]") to the generic set while every other
requirement keeps Perl's prefix semantics.

Two subtleties: S is in both generic sets but takes the OUTSIDE parameter
families -- a first translation tested circulation first and silently gave S
the circulation params, caught by test_get_space_params_sahn_proportion. And
validate_codes survives, narrowed to a code spelled exactly C/O/S, which is a
genuine ambiguity; merely starting with c/o/s is now fine.

Invariant asserted as a test: test_scoring_is_invariant_under_programme_code_
spelling relabels one tree and its config together and re-scores. Bit-identical
across 12 comparisons (6 seeds x collapse on/off).

Re-baseline (seed 1, 20k, original names): 58 fails (15 hard / 43 soft) against
the real 37-instance programme, with cr1 at 79.1 m2 vs declared 80 (was 32.9
and 17.1), of/st1/st2 all present and in band, and one fail naming any of them.
57 -> 58 on a 5-instance-harder programme is within noise: "did not regress".

Fallout (§39.5): 2g7.5's CP-SAT seeder win does not survive. Over 6 seeds --
harbor real 102/114 (cpsat loses), harbor old-effective 98/99 (tie, so the win
was already marginal), maple-court 156/144 (cpsat wins). maple is the control:
the solver did not regress, harbor's programme changed. Test xfail'd with that
reason plus a maple companion; both assign_solver flags stay default off.
Filed homemaker-py-w6x to re-check other narrow-margin harbor A/Bs.

345 passed, 1 xfailed, same 7 pre-existing fixture failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:45:28 +00:00
Claude
697914fac8
ju3: reject programme codes colliding with the c/o/s generic type prefixes
Closes homemaker-py-ju3. DESIGN.md §39.3.

The class: key from the bead's design was deliberately NOT built. Auditing
every use of the prefix rule first showed it runs deeper than c/o/s -- l/k/b/t
carry real adjacency semantics (graph.py builds bedroom<->toilet and
kitchen<->living relations from first characters) -- so re-plumbing the type
system would invalidate the whole corpus and every baseline, for a problem
whose damage is the silence, not the convention. Two findings made the smaller
fix sufficient: no corpus programme has ever declared a bare c/o/s code, so
check_space_counts' skip only ever discarded declared rooms; and nothing
references harbor's four codes in any adjacency or co_locate list.

- programme.validate_codes raises on a reserved-prefix code, with the full
  explanation. Called from BOTH parse paths (programme._parse_spaces and
  fitness.Fitness._load_programme parse conf["spaces"] independently, so
  validating one would leave the other door open). l/k/b/t stay unreserved.
- harbor-house and harbor-house-l0 renamed: cr1->fr1, of->ao, st1->gs1,
  st2->gs2. New prefixes are unused in harbor and semantically neutral, and
  the two storage codes still share a prefix, preserving the structure
  evaluate_building's per-code plot-ratio term depends on. name: unchanged.
- experiments/migrate_ju3_rename.py migrates .dom files written before the
  rename (--check dry-runs). Pre-rename artefacts, notably evolved-3M*.dom,
  must be migrated or their leaves read as unmatched generics.
- test_collapse_global's c/o/s exclusion test now uses a generic C leaf, which
  is what the exclusion is actually for; it previously relied on a programme
  code colliding, which is no longer possible.

Re-baseline (seed 1, 20k evals, same settings as §38's run): 57 fails against
the 32-instance effective programme -> 55 against the real 37-instance one,
with all five previously-lost room instances now placed inside their declared
sigma bands (fr1 87.2 vs declared 80, was 32.9/17.1; ao/gs1/gs2 were absent
entirely) and no failure naming any of the four codes. At one seed each,
57 vs 55 is within noise -- the robust result is the room placement, not the
count. Historical harbor numbers are not comparable to post-ju3 ones; filed
homemaker-py-t3s to restate 2v1's acceptance figure once evolved-3M is
migrated.

346 passed (+10 new), same 7 pre-existing fixture failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:06:08 +00:00
Claude
fd9802e499
DESIGN.md §39: config audit — programme codes collide with the c/o/s type namespace
Answers "are any config requirements actively fighting the engine". One is.

§39.1 NEGATIVE (recorded): no room spec in any corpus programme is internally
contradictory. Using shapecurve.leaf_constraints' validated FAIL_THRESHOLD
inversions, every code admits an (area, aspect) satisfying size, width,
proportion and crinkliness at once, and none needs more than one exposed side.
The "estimated targets are mutually unsatisfiable" hypothesis is falsified.

§39.2 SEVERE: Urb's type system is prefix-based (c = circulation, o/s =
outside) and programme codes share that namespace. A code starting with those
letters is silently reinterpreted, with three unannounced consequences:
check_space_counts SKIPS it outright (never required, no missing or too-many
fail); get_space_params returns generic *_circulation/*_outside params before
consulting self.spaces; and is_circulation/is_outside flip, changing value
rate, crinkliness exemption, and whether it supplies daylight to neighbours.

harbor-house is affected (maple-court, health-centre, programme-house are
clean): cr1 "Common Room with Fireplace" has all three declared targets
overridden (size 80.0 -> 0.0/14.0) and is valued at 50/m2 not 300; of x2 and
st1/st2 lose width/proportion and are treated as outside space. 5 of 37 room
instances (14%) are silently optional.

Measured: the two cr1 leaves converged to 32.9 and 17.1 m2 against a declared
80, with no too-many-spaces fail despite count:1; of/st1/st2 are absent from
the result with zero fails. Compounds with §38.2 -- the largest room in the
programme sits on the wrong side of the x6 circulation value gap, so the
objective is paid to shrink it.

Benchmark validity: every harbor-house fail count in this document was
measured against a 32-instance effective programme, not the 37 its config
declares.

Adds experiments/audit_programme_config.py (namespace + satisfiability
reports). Filed homemaker-py-ju3 (P0). No src changes; 336 passed, same 7
pre-existing fixture failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 08:27:49 +00:00
Claude
1b3a0adc2e
beads: file homemaker-py-2v1 (connectivity mispricing, P0)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 07:40:37 +00:00
Claude
50b5cfd476
§38.2 refinement: connectivity is under-priced ~3x, not just a crinkliness bug
Follow-up measurement corrects the first draft of §38 in two ways.

1. Harbor-house's floor is 15 fails (evolved-3M-nols-3, 1.7M evals), not the
   30-40 I quoted from §13.11's 20k-budget runs. Frontage deficit predicts the
   COST of solving, not impossibility: ~150x budget gap between a
   frontage-short and a frontage-surplus programme. Table corrected.

2. Zero-exposure is only half the mechanism, and not the dominant half.
   Splitting the deletion test by lit vs buried shows a WELL-DAYLIT corridor
   (q_crink=0.736) is still worth x4.06 to delete. Cause: value_circulation=50
   vs value_inside=300, so merging corridor into room is a flat x6 gain, while
   'level N not connected' costs only x0.5. Break-even needs 0.5^k < 50/300,
   i.e. k > 2.58 -- severing must cost at least 3 fails and costs 1. Net x3.0
   predicted, x4.06 measured. The objective is net-positive on severing the
   spine even when the circulation is perfectly lit, which explains why both
   'level N not connected' fails survive in the best layout after 1.7M evals.

Adds fitness.quality_uncrinkliness crinkliness_mode (EXPERIMENTAL, default
"urb" = stock hard 0.0, byte-identical: 336 passed vs 331 before, same 7
pre-existing fixture failures). A/B harness ab_crinkliness_mode_ssz.py shows
none of the three modes removes the incentive, and the lit column is 3/8 under
every mode including stock -- clean isolation of the two mechanisms.

Filed homemaker-py-2v1 (P0) for the pricing fix; ssz/hxi now depend on it.
Acceptance test recorded up front: harbor must reach 15 fails in materially
fewer than 1.7M evals AND without either not-connected fail.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 07:40:37 +00:00
Claude
753356e47e
beads: file §38 objective-gradient findings
homemaker-py-ssz  (P1) zero-exposure leaves score hard quality=0
homemaker-py-hxi  (P1) buried circulation/outside are negative-value
homemaker-py-tdp  (P1) frontage-budget feasibility bound
homemaker-py-gvb  (P2) crinkliness mis-tiered as SOFT
homemaker-py-1i8  (P2) missing-space cascade weighted by config verbosity
homemaker-py-bdf  (P3) fresh-clone test failures from absent evolved-3M fixtures

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-25 23:18:47 +00:00
Claude
c0c47a6e2d
DESIGN.md §38: the plateau is an objective-gradient problem, not a search problem
Diagnostic investigation of why search stalls in local minima. Adds
experiments/diag_exposure_frontage.py (frontage/exposure/value reports,
no search run required) and records the findings as §38.

Core mechanism: quality_uncrinkliness returns a hard 0.0 for any leaf with
no daylit wall, and since leaf quality is a product feeding
value += quality * rate * area, every buried room contributes exactly zero
value while still costing. 45-56% of interior leaves are in this state under
the default construction stack.

Consequences measured, not inferred:
- Deleting a buried O leaf improves the score x85, a buried C leaf x62.
  Nothing pins circulation or outside space, so the search is rewarded by two
  orders of magnitude for deleting the circulation spine. This retro-explains
  §18, §21/§22 and the level-not-connected fails surviving >1M evals.
- Closed-form frontage bound: every interior leaf needs exposed wall
  L >= A/(1.6202*h). harbor-house supplies 54m against 148m needed (2.7x
  short), maple-court 56 vs 162; health-centre and programme-house are
  feasible. The corpus plateau is predicted by frontage deficit alone.
- Crinkliness is tiered SOFT but 60-100% of its fails are zero-exposure,
  which is topological, so §37.1's tiered comparator is mis-informed about
  the largest fail category.
- The missing-space cascade emits one extra fail per declared size/width/
  proportion key, so under 0.5^n a missing room is weighted 4x differently
  depending on patterns.config verbosity.

Filed as homemaker-py-ssz, hxi, tdp, gvb, 1i8 (plus bdf for the pre-existing
fresh-clone test failures found en route).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-25 23:18:20 +00:00
Claude
7046c7bd76
Ignore beads auto-import tracking marker
.auto-import-issues.jsonl is a per-machine mtime/size cache bd writes
when auto-importing issues.jsonl; it shouldn't be versioned.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-25 23:01:40 +00:00
162 changed files with 1988077 additions and 2517 deletions

3
.beads/.gitignore vendored
View file

@ -59,6 +59,9 @@ backup/
# Per-project environment file (Dolt connection config, GH#2520)
.env
# Auto-import tracking marker (local mtime/size cache, per-machine)
.auto-import-issues.jsonl
# Legacy files (from pre-Dolt versions)
*.db
*.db?*

File diff suppressed because one or more lines are too long

4
.gitignore vendored
View file

@ -14,3 +14,7 @@ scratch/
.dolt/
*.db
.beads-credential-key
# per-process shards written by the sharded A/B harnesses; the merged
# <out>.csv is the artefact worth keeping (experiments/ab_9gj_ramp.py --report)
experiments/results/*.csv.shard*

View file

@ -56,6 +56,25 @@ bd close <id> # Complete work
- Run `bd prime` for detailed command reference and session close protocol
- Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files
### Room-code namespaces (DESIGN.md §39.4/§39.6)
Leaf types share a first character across three namespaces:
- **`C` / `O` / `S`** — generic structural types (circulation / outside / sahn),
uppercase, reserved. A programme code spelled exactly one of these is rejected
at load.
- **programme room codes** — lowercase, may start with *any* letter. The generic
tests match `C`/`O`/`S` exactly, so `cr1` is a room, not circulation.
- **`usage:`** — every space declares its access-requirement class
(`living`/`kitchen`/`bedroom`/`toilet`/`utility`/`none`), mandatory, no
fallback (DESIGN.md §39.7). A code's spelling decides nothing: `name:` is free
text, `usage:` drives behaviour. There is no first-character type test left
anywhere in the codebase.
When adding or editing a programme, run
`python experiments/audit_programme_config.py` — it reports reserved-name
collisions, the usage class each code picks up, and per-room-spec satisfiability.
## Session Completion
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.

View file

@ -22,6 +22,25 @@ bd close <id> # Complete work
- Run `bd prime` for detailed command reference and session close protocol
- Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files
### Room-code namespaces (DESIGN.md §39.4/§39.6)
Leaf types share a first character across three namespaces:
- **`C` / `O` / `S`** — generic structural types (circulation / outside / sahn),
uppercase, reserved. A programme code spelled exactly one of these is rejected
at load.
- **programme room codes** — lowercase, may start with *any* letter. The generic
tests match `C`/`O`/`S` exactly, so `cr1` is a room, not circulation.
- **`usage:`** — every space declares its access-requirement class
(`living`/`kitchen`/`bedroom`/`toilet`/`utility`/`none`), mandatory, no
fallback (DESIGN.md §39.7). A code's spelling decides nothing: `name:` is free
text, `usage:` drives behaviour. There is no first-character type test left
anywhere in the codebase.
When adding or editing a programme, run
`python experiments/audit_programme_config.py` — it reports reserved-name
collisions, the usage class each code picks up, and per-room-spec satisfiability.
## Session Completion
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
@ -81,7 +100,6 @@ Key modules:
- `innerloop.py` — ratio optimisation inner loop (Nelder-Mead / CMA-ES)
- `driver.py` — memetic search outer loop
- `evolve.py``homemaker-evolve` CLI entry point
- `oracle.py` — legacy Perl shim, kept for validation only; do not use in new code
- `bubble.py` — 3D bubble-diagram adjacency fitness-signal prototype (DESIGN.md §27, `mi7`); validated NULL, not wired into `fitness.py` — reference only, do not build on without a new formulation
## Conventions & Patterns
@ -100,5 +118,14 @@ homemaker-fitness cf0b8a77e8b2325f92a7e7d150184a55.dom
The score is written to `<file>.dom.score` and failures to `<file>.dom.fails`; the numeric score is also printed to stderr.
Do **not** use `urb-fitness.pl` directly — `oracle.py` and the Perl tool are
kept only for cross-validation.
`fitness.py` is the **only** evaluator. The Perl oracle it was ported from —
`oracle.py`, `urb-fitness.pl`, and the parity tests against them — is gone
(DESIGN.md §39.21). Those parity tests had never actually run: no oracle
`.score` was ever committed, so on a clean checkout every case skipped, and the
only cases that ever executed compared the native scorer with itself (§39.20).
The corollary matters when reading the objective: a constant or a rule that
looks odd is **not** thereby validated by "Urb did it this way". Several
defects found in §39 were carried straight over from the Perl — see §39.19 on
`value_supported`, and `homemaker-py-hxi` on circulation, which the owner has
ruled needs fixing.

3340
DESIGN.md

File diff suppressed because it is too large Load diff

View file

@ -57,3 +57,46 @@ search then only explores topology + types + adjacency.
- `src/homemaker_layout/bubble.py` — 3D bubble-diagram adjacency fitness-signal
prototype (DESIGN.md §27); validated null, not wired into `fitness.py`
reference only.
## Room codes and reserved names
Leaf types live in **three namespaces that share a first character**. Only the
first is enforced; the other two are conventions the fitness function reads, so
a room's *spelling* can change how it is scored.
**1. Generic structural types — `C`, `O`, `S` (reserved).** The leaves the
search itself creates: `C` circulation, `O` outside, `S` sahn (an outside court
that also serves as circulation). Always uppercase. A programme code spelled
exactly `C`, `O` or `S` is rejected at load.
**2. Programme room codes — anything else, lowercase.** `k1`, `b1`, `cr1`,
`of`, and single-character codes like `r` or `t`. These may start with **any**
letter: since DESIGN.md §39.4 the generic tests match `C`/`O`/`S` exactly, so
naming a room `cr1` no longer makes it circulation. (Before that fix it did —
and silently dropped it from the required-space check entirely.)
**3. Access requirements — the `usage:` attribute.** Every space declares one
of `living`, `kitchen`, `bedroom`, `toilet`, `utility`, `none`. Mandatory, no
fallback, and a missing or unknown value is a load error. It replaced a
first-character convention (`b`/`t`/`l`/`k`) under which a room silently
inherited another room's connectivity rules from its spelling — `la1` "Laundry
Room" was trimmed as a living room (DESIGN.md §39.7).
```yaml
spaces:
la1:
usage: utility # controlled, drives engine behaviour
name: Laundry Room # free text, building-specific
```
A usage value exists only where the engine treats it differently, so the
vocabulary is closed: a new access class means new code, not new config. Check a
programme with:
```bash
python experiments/audit_programme_config.py
```
which reports reserved-name collisions, the usage class each code picks up, and
whether each room's size/width/proportion/crinkliness targets are mutually
satisfiable at all.

View file

@ -11,6 +11,7 @@
spaces:
cr1:
usage: living
name: Common Room with Fireplace
size:
- 80.0
@ -26,6 +27,7 @@ spaces:
- o
ef1:
usage: none
name: Entrance Foyer
size:
- 15.0
@ -37,6 +39,7 @@ spaces:
- c
da1:
usage: living
name: Dining Area
size:
- 60.0
@ -53,6 +56,7 @@ spaces:
- o
k1:
usage: kitchen
name: Kitchen
size:
- 30.0
@ -65,6 +69,7 @@ spaces:
- c
ws1:
usage: living
name: Workshop Space
size:
- 40.0
@ -80,6 +85,7 @@ spaces:
- o
m:
usage: living
name: Meeting Room
size:
- 10.0
@ -92,6 +98,7 @@ spaces:
count: 3
la1:
usage: utility
name: Laundry Room
size:
- 20.0
@ -103,6 +110,8 @@ spaces:
- c
st1:
crinkliness: none # no window needed
usage: utility
name: Ground Floor Storage
size:
- 22.0
@ -114,6 +123,8 @@ spaces:
- c
me1:
crinkliness: none # no window needed
usage: utility
name: Mechanical/Electrical Room
size:
- 25.0
@ -125,6 +136,7 @@ spaces:
- c
of:
usage: bedroom
name: Staff Office
size:
- 12.5

View file

@ -0,0 +1,448 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.3985442745073203
- 0.3985442745073203
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.3094512886869734
- 0.3094512886869734
l:
rotation: 1
division:
- 0.5940581633377823
- 0.5940581633377823
l:
type: n
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 0
division:
- 0.8043008907725491
- 0.8043008907725491
l:
rotation: 0
division:
- 0.544025432199185
- 0.544025432199185
l:
rotation: 1
division:
- 0.391341459113696
- 0.391341459113696
l:
rotation: 1
division:
- 0.7211389666113284
- 0.7211389666113284
l:
type: me1
rotation: 0
r:
type: C
rotation: 0
r:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.7235436770862052
- 0.7235436770862052
l:
type: n
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.6505939964175393
- 0.6505939964175393
l:
type: C
rotation: 0
r:
rotation: 2
division:
- 0.5868140737321261
- 0.5868140737321261
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.43644811120043386
- 0.43644811120043386
l:
rotation: 1
division:
- 0.7654752257383863
- 0.7654752257383863
l:
rotation: 1
division:
- 0.4376436987858707
- 0.4376436987858707
l:
rotation: 3
division:
- 0.8494329721993664
- 0.8494329721993664
l:
type: O
rotation: 0
r:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.6049702596175167
- 0.6049702596175167
l:
type: ws1
rotation: 0
r:
type: O
rotation: 3
r:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.3250476545214606
- 0.3250476545214606
l:
rotation: 1
division:
- 0.8461640488517912
- 0.8461640488517912
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6557435235032659
- 0.6557435235032659
l:
type: m
rotation: 1
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.561217084502605
- 0.561217084502605
l:
rotation: 1
division:
- 0.29120109801627336
- 0.29120109801627336
l:
type: ef1
rotation: 0
r:
rotation: 2
division:
- 0.8436218368250273
- 0.8436218368250273
l:
type: n
rotation: 2
r:
type: m
rotation: 0
r:
rotation: 3
division:
- 0.839483766914491
- 0.839483766914491
l:
type: n
rotation: 2
r:
type: la1
rotation: 0
above:
rotation: 0
division:
- 0.3519324875989489
- 0.3519324875989489
height: 3.0
l:
rotation: 0
division:
- 0.4256779296253242
- 0.4256779296253242
l:
rotation: 0
division:
- 0.1346153846153846
- 0.1346153846153846
l:
type: ut1
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.6726619281231458
- 0.6726619281231458
l:
type: li1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.8574647492492186
- 0.8574647492492186
l:
rotation: 0
division:
- 0.5013138993448436
- 0.5013138993448436
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 0
division:
- 0.5079366503514491
- 0.5079366503514491
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.15629392209010023
- 0.15629392209010023
l:
rotation: 0
division:
- 0.8577851940134021
- 0.8577851940134021
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: st2
rotation: 0
r:
type: st1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4126455278522538
- 0.4126455278522538
l:
rotation: 0
division:
- 0.1276875570629138
- 0.1276875570629138
l:
rotation: 0
division:
- 0.7912375002017624
- 0.7912375002017624
l:
rotation: 0
division:
- 0.5898846840065638
- 0.5898846840065638
l:
type: st2
rotation: 0
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5146378236487134
- 0.5146378236487134
l:
type: r
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.3871574227542141
- 0.3871574227542141
l:
rotation: 0
division:
- 0.30121819590152477
- 0.30121819590152477
l:
rotation: 0
division:
- 0.5333101977082233
- 0.5333101977082233
l:
rotation: 1
division:
- 0.7039689912158205
- 0.7039689912158205
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.5836803639257983
- 0.5836803639257983
l:
type: r
rotation: 2
r:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5585512945948533
- 0.5585512945948533
l:
rotation: 0
division:
- 0.821355066730113
- 0.821355066730113
l:
rotation: 2
division:
- 0.6901211782405532
- 0.6901211782405532
l:
rotation: 2
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 1
division:
- 0.5650312500000001
- 0.5650312500000001
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.7292419211112857
- 0.7292419211112857
l:
type: r
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 0

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,87 @@
15s [ 200 evals] best 2.99136e-19 (fails 58) via seed
27s [ 280 evals] best 3.01967e-19 (fails 58) via place_missing noop
39s [ 840 evals] best 3.03178e-19 (fails 58) via level_fix noop
62s [ 1400 evals] best 3.0432e-19 (fails 58) via level_fix st1: lvl1/lrlrl → lvl0/rllr
97s [ 2200 evals] best 1.22462e-18 (fails 56) via rotate 0/ll
146s [ 3480 evals] best 2.45817e-18 (fails 55) via core_undivide noop
157s [ 4040 evals] best 2.46734e-18 (fails 55) via swap 0/llllr
178s [ 4440 evals] best 2.46851e-18 (fails 55) via level_fix noop
191s [ 4760 evals] best 2.03417e-17 (fails 52) via divide 0/rllr
215s [ 5400 evals] best 2.03526e-17 (fails 52) via level_retype 1/lrrrl<->0/lrrrr
239s [ 6040 evals] best 2.03762e-17 (fails 52) via rotate 0/rllr
263s [ 6680 evals] best 2.04377e-17 (fails 52) via core_undivide noop
329s [ 8360 evals] best 1.4244e-16 (fails 49) via level_fix st1: lvl1/lrrrl → lvl0/rllrl
342s [ 8840 evals] best 1.42926e-16 (fails 49) via place_missing noop
353s [ 9080 evals] best 1.43695e-16 (fails 49) via place_missing noop
366s [ 9320 evals] best 1.4375e-16 (fails 49) via place_missing noop
378s [ 9800 evals] best 1.43884e-16 (fails 49) via place_missing noop
390s [ 10040 evals] best 1.44162e-16 (fails 49) via core_undivide noop
413s [ 10520 evals] best 1.4471e-16 (fails 49) via place_missing noop
462s [ 12040 evals] best 1.45739e-16 (fails 49) via level_compound_fix st2: lvl0 → lvl1/rllr + insert st2 into llrlrl/lvl1
487s [ 12440 evals] best 2.95169e-16 (fails 48) via level_fix noop
596s [ 15320 evals] best 3.01432e-16 (fails 48) via core_undivide noop
657s [ 17160 evals] best 3.01447e-16 (fails 48) via level_fix noop
668s [ 17320 evals] best 3.01462e-16 (fails 48) via crossover l<->l
680s [ 17640 evals] best 3.01478e-16 (fails 48) via core_undivide noop
692s [ 17960 evals] best 3.01496e-16 (fails 48) via level_compound_fix noop
704s [ 18280 evals] best 3.01513e-16 (fails 48) via place_missing noop
742s [ 19240 evals] best 3.01516e-16 (fails 48) via level_fix noop
793s [ 20520 evals] best 6.05253e-16 (fails 47) via undivide 1/lllr
828s [ 21560 evals] best 1.10265e-15 (fails 46) via crossover lrrll<->lrlr
866s [ 22360 evals] best 1.11444e-15 (fails 46) via core_undivide noop
891s [ 23000 evals] best 1.11914e-15 (fails 46) via level_compound_fix noop
967s [ 25080 evals] best 1.12384e-15 (fails 46) via level_compound_fix noop
1049s [ 27160 evals] best 1.12851e-15 (fails 46) via core_undivide noop
1097s [ 28440 evals] best 1.13191e-15 (fails 46) via level_compound_fix noop
1099s [ 28600 evals] best 7.49651e-14 (fails 40) via retype 1/rlrlll->t
1174s [ 30360 evals] best 7.55374e-14 (fails 40) via core_undivide noop
1201s [ 31160 evals] best 7.60982e-14 (fails 40) via level_compound_fix noop
1212s [ 31320 evals] best 7.65541e-14 (fails 40) via place_missing noop
1286s [ 33240 evals] best 1.54772e-13 (fails 39) via swap 0/lrrll
1363s [ 35160 evals] best 1.55395e-13 (fails 39) via place_missing noop
1398s [ 36200 evals] best 1.56143e-13 (fails 39) via level_compound_fix noop
1411s [ 36600 evals] best 1.56917e-13 (fails 39) via swap 1/llrr
1424s [ 36840 evals] best 1.57541e-13 (fails 39) via level_compound_fix noop
1451s [ 37640 evals] best 1.57782e-13 (fails 39) via place_missing noop
1474s [ 38120 evals] best 2.87312e-13 (fails 38) via crossover lrrllr<->llllrr
1524s [ 39320 evals] best 2.87802e-13 (fails 38) via crossover llllrr<->llllrl
1549s [ 39960 evals] best 2.87806e-13 (fails 38) via undivide 0/llllr
1561s [ 40440 evals] best 2.87806e-13 (fails 38) via crossover rrrr<->llllr
1634s [ 42360 evals] best 2.87813e-13 (fails 38) via crossover llll<->llll
1750s [ 45080 evals] best 2.87828e-13 (fails 38) via core_undivide noop
1761s [ 45400 evals] best 2.87858e-13 (fails 38) via level_fix noop
1774s [ 45880 evals] best 2.87884e-13 (fails 38) via core_undivide noop
1812s [ 46760 evals] best 2.87887e-13 (fails 38) via level_compound_fix noop
1825s [ 47160 evals] best 2.87899e-13 (fails 38) via core_undivide noop
1847s [ 47640 evals] best 2.87933e-13 (fails 38) via place_missing noop
1861s [ 47960 evals] best 2.8796e-13 (fails 38) via place_missing noop
2672s [ 69000 evals] best 3.0614e-13 (fails 38) via level_retype 0/rrrr<->1/rlllrr
2718s [ 70200 evals] best 5.48257e-13 (fails 37) via swap 1/rlrll
2754s [ 71240 evals] best 1.03963e-12 (fails 36) via divide 1/rlllrl
2781s [ 71720 evals] best 1.04455e-12 (fails 36) via core_undivide noop
2794s [ 72040 evals] best 1.04987e-12 (fails 36) via core_undivide noop
2915s [ 75320 evals] best 1.05549e-12 (fails 36) via core_undivide noop
2927s [ 75480 evals] best 1.05569e-12 (fails 36) via place_missing noop
2942s [ 75960 evals] best 1.0559e-12 (fails 36) via crossover rlrll<->rlrll
2989s [ 77320 evals] best 1.05608e-12 (fails 36) via core_undivide noop
3122s [ 80840 evals] best 1.05612e-12 (fails 36) via rotate 0/rlrl
3148s [ 81400 evals] best 4.19947e-12 (fails 34) via level_retype 0/lrlrr<->1/rlllrlr
3171s [ 82120 evals] best 4.22196e-12 (fails 34) via level_compound_fix noop
3184s [ 82360 evals] best 4.22276e-12 (fails 34) via level_fix noop
3232s [ 83480 evals] best 7.84445e-11 (fails 30) via divide 1/llll
3272s [ 84440 evals] best 7.86095e-11 (fails 30) via core_undivide noop
3310s [ 85640 evals] best 7.86227e-11 (fails 30) via place_missing noop
3323s [ 85960 evals] best 7.86337e-11 (fails 30) via place_missing noop
3593s [ 92680 evals] best 7.96266e-11 (fails 30) via level_retype 1/lllrr<->0/rrl
3605s [ 92760 evals] best 7.96379e-11 (fails 30) via level_retype 0/lrrlrr<->1/rlrlll
3929s [100760 evals] best 1.5021e-10 (fails 29) via swap 1/rlrll
4345s [111480 evals] best 1.55004e-10 (fails 29) via level_retype 1/llrrr<->0/lrrllr
4485s [115000 evals] best 2.64749e-10 (fails 28) via level_retype 1/llrlrr<->0/rlllrr
4498s [115160 evals] best 5.3468e-10 (fails 27) via crossover rrrr<->rrrr
4535s [116200 evals] best 5.38728e-10 (fails 27) via core_undivide noop
4586s [117400 evals] best 5.4602e-10 (fails 27) via level_fix st1: lvl1/llrrr → lvl0/rllrl
4600s [117880 evals] best 5.50955e-10 (fails 27) via core_undivide noop
4624s [118520 evals] best 5.56091e-10 (fails 27) via level_fix noop
5086s [129560 evals] best 2.35421e-09 (fails 25) via level_retype 0/lrrllr<->1/llrlrr
5181s [131800 evals] best 2.35752e-09 (fails 25) via place_missing noop
5221s [132760 evals] best 2.35752e-09 (fails 25) via place_missing noop

View file

@ -0,0 +1,8 @@
seed=evolved-3M.dom budget=150000 pop=8 workers=4 rng_seeds=[0]
[rng 0] slice: fitness=3.523e-14 fails=41 evals=150040 created=15 5835.9s
[rng 0] grid : fitness=2.358e-09 fails=25 evals=150040 created=15 5916.8s
=== SUMMARY (higher fitness = better; fewer fails = better) ===
slice: fitness 3.523e-14..3.523e-14 (mean 3.523e-14) fails 41..41 (mean 41.0)
grid : fitness 2.358e-09..2.358e-09 (mean 2.358e-09) fails 25..25 (mean 25.0)
head-to-head (fails then fitness): {'slice': 0, 'grid': 1, 'tie': 0}

View file

@ -0,0 +1,114 @@
15s [ 200 evals] best 2.78368e-25 (fails 78) via seed
24s [ 280 evals] best 2.81966e-25 (fails 78) via place_missing noop
32s [ 840 evals] best 2.83081e-25 (fails 78) via level_fix noop
49s [ 1240 evals] best 2.85681e-25 (fails 78) via undivide 1/rlrll
66s [ 1880 evals] best 2.86707e-25 (fails 78) via place_missing noop
66s [ 1960 evals] best 4.17745e-25 (fails 77) via crossover rlll<->llr
74s [ 2280 evals] best 1.76161e-24 (fails 75) via rotate 0/ll
90s [ 3080 evals] best 4.67378e-24 (fails 74) via undivide 0/rllll
118s [ 4120 evals] best 1.46076e-23 (fails 72) via level_retype 1/lrll<->0/lrlrr
144s [ 5160 evals] best 1.36798e-22 (fails 69) via place_missing n -> rllrr
309s [ 9880 evals] best 1.43611e-22 (fails 69) via crossover rlrr<->rlrr
345s [ 11000 evals] best 5.37852e-22 (fails 67) via place_missing n -> rllrrr
359s [ 11160 evals] best 5.45342e-22 (fails 67) via place_missing noop
359s [ 11400 evals] best 7.04364e-22 (fails 67) via crossover lrrlr<->lrrr
398s [ 12520 evals] best 2.63914e-21 (fails 65) via place_missing t -> rllrrrr
514s [ 16360 evals] best 1.955e-20 (fails 62) via undivide 1/lrrlr
533s [ 17000 evals] best 1.99161e-20 (fails 62) via crossover rrrr<->rrrr
542s [ 17320 evals] best 2.02902e-20 (fails 62) via core_undivide noop
543s [ 17400 evals] best 4.31819e-20 (fails 61) via rotate 0/lrrl
582s [ 18760 evals] best 1.53608e-19 (fails 59) via place_missing r -> llrll
599s [ 19160 evals] best 1.54019e-19 (fails 59) via core_undivide noop
646s [ 20840 evals] best 1.55586e-19 (fails 59) via level_compound_fix noop
700s [ 22840 evals] best 1.55593e-19 (fails 59) via level_compound_fix noop
719s [ 23320 evals] best 1.55798e-19 (fails 59) via level_fix noop
728s [ 23720 evals] best 1.5615e-19 (fails 59) via core_undivide noop
747s [ 24280 evals] best 1.57193e-19 (fails 59) via rotate 0/lrlr
769s [ 24920 evals] best 1.57705e-19 (fails 59) via level_compound_fix noop
780s [ 25400 evals] best 6.03009e-19 (fails 57) via place_missing t -> rllrrrr
807s [ 26200 evals] best 6.03785e-19 (fails 57) via level_fix noop
827s [ 27000 evals] best 6.0458e-19 (fails 57) via core_undivide noop
837s [ 27240 evals] best 6.0913e-19 (fails 57) via place_missing t -> rllrrrr
846s [ 27560 evals] best 6.11018e-19 (fails 57) via crossover rllrrrr<->rllrrrr
866s [ 28120 evals] best 6.13019e-19 (fails 57) via core_undivide noop
879s [ 28680 evals] best 6.50627e-19 (fails 57) via retype 1/llrlrl->st1
928s [ 30200 evals] best 6.52736e-19 (fails 57) via core_undivide noop
960s [ 31160 evals] best 6.55054e-19 (fails 57) via place_missing noop
980s [ 31720 evals] best 6.57339e-19 (fails 57) via crossover rllrr<->rllrr
1032s [ 33320 evals] best 6.59183e-19 (fails 57) via place_missing noop
1064s [ 34200 evals] best 6.60911e-19 (fails 57) via core_undivide noop
1080s [ 34600 evals] best 6.62724e-19 (fails 57) via place_missing noop
1101s [ 35160 evals] best 1.34695e-18 (fails 56) via level_retype 1/lrrrr<->0/rllrrl
1130s [ 36200 evals] best 1.35084e-18 (fails 56) via swap 1/llrr
1222s [ 39080 evals] best 1.3536e-18 (fails 56) via core_undivide noop
1263s [ 40280 evals] best 1.35887e-18 (fails 56) via retype 0/rrl->O
1296s [ 41240 evals] best 1.37684e-18 (fails 56) via place_missing noop
1317s [ 41960 evals] best 2.75612e-18 (fails 55) via core_undivide noop
1336s [ 42520 evals] best 2.76622e-18 (fails 55) via crossover llllrr<->llllrr
1354s [ 43160 evals] best 2.76719e-18 (fails 55) via core_undivide noop
1362s [ 43480 evals] best 2.7673e-18 (fails 55) via place_missing noop
1371s [ 44040 evals] best 2.76773e-18 (fails 55) via place_missing noop
1418s [ 45480 evals] best 2.89565e-18 (fails 55) via undivide 0/lrlr
1458s [ 46920 evals] best 2.89592e-18 (fails 55) via core_undivide noop
1478s [ 47480 evals] best 2.91016e-18 (fails 55) via divide 1/rlrlr
1688s [ 52600 evals] best 4.62272e-17 (fails 51) via place_missing n -> rllrl
1861s [ 56680 evals] best 4.63445e-17 (fails 51) via place_missing noop
1909s [ 58120 evals] best 4.736e-17 (fails 51) via crossover lrlrr<->lrll
1957s [ 58840 evals] best 4.75383e-17 (fails 51) via place_missing noop
1998s [ 60040 evals] best 4.77234e-17 (fails 51) via level_retype 0/rllrrrrr<->1/llrllrr
2024s [ 60680 evals] best 4.78944e-17 (fails 51) via place_missing noop
2094s [ 62200 evals] best 4.81054e-17 (fails 51) via core_undivide noop
2161s [ 63560 evals] best 7.68517e-16 (fails 47) via rotate 0/lrrl
2176s [ 63800 evals] best 7.7191e-16 (fails 47) via place_missing noop
2218s [ 64600 evals] best 7.75426e-16 (fails 47) via place_missing noop
2236s [ 64920 evals] best 7.79234e-16 (fails 47) via place_missing noop
2273s [ 65800 evals] best 7.82619e-16 (fails 47) via place_missing noop
2387s [ 67960 evals] best 7.86104e-16 (fails 47) via core_undivide noop
2485s [ 69560 evals] best 7.89754e-16 (fails 47) via swap 1/rlllr
2669s [ 72600 evals] best 7.9387e-16 (fails 47) via place_missing noop
2740s [ 74040 evals] best 1.09506e-15 (fails 46) via retype 0/rllll->st1
2755s [ 74440 evals] best 1.10394e-15 (fails 46) via crossover lr<->lr
2784s [ 74840 evals] best 1.11372e-15 (fails 46) via place_missing noop
2819s [ 75480 evals] best 1.12392e-15 (fails 46) via place_missing noop
2840s [ 75800 evals] best 1.13127e-15 (fails 46) via core_undivide noop
2948s [ 78040 evals] best 1.14356e-15 (fails 46) via place_missing noop
2965s [ 78600 evals] best 1.14876e-15 (fails 46) via place_missing noop
2977s [ 78760 evals] best 1.15416e-15 (fails 46) via core_undivide noop
3017s [ 79720 evals] best 1.15977e-15 (fails 46) via place_missing noop
3081s [ 81400 evals] best 1.16386e-15 (fails 46) via rotate 0/rr
3096s [ 81640 evals] best 1.16556e-15 (fails 46) via level_retype 0/rlllr<->1/llrlrr
3121s [ 82360 evals] best 1.17153e-15 (fails 46) via swap 0/rlrlr
3184s [ 84040 evals] best 1.17767e-15 (fails 46) via core_undivide noop
3222s [ 85000 evals] best 1.18184e-15 (fails 46) via core_undivide noop
3245s [ 85480 evals] best 1.18814e-15 (fails 46) via place_missing noop
3301s [ 86840 evals] best 1.19454e-15 (fails 46) via crossover lrrr<->lrrr
3313s [ 87080 evals] best 1.201e-15 (fails 46) via place_missing noop
3365s [ 88360 evals] best 1.20745e-15 (fails 46) via place_missing noop
3467s [ 90520 evals] best 1.2138e-15 (fails 46) via crossover rlrlrl<->rlrlrr
3481s [ 91000 evals] best 1.21994e-15 (fails 46) via core_undivide noop
3508s [ 91560 evals] best 1.22574e-15 (fails 46) via core_undivide noop
3508s [ 91640 evals] best 8.63614e-15 (fails 43) via level_retype 1/llll<->0/rrl
3730s [ 97080 evals] best 8.69346e-15 (fails 43) via swap 0/llllr
3756s [ 97720 evals] best 8.7509e-15 (fails 43) via place_missing noop
3858s [100360 evals] best 8.80776e-15 (fails 43) via rotate 0/llllr
3882s [100760 evals] best 8.86311e-15 (fails 43) via core_undivide noop
3896s [101080 evals] best 1.70808e-14 (fails 42) via crossover lrrrr<->lrll
3921s [101880 evals] best 1.71667e-14 (fails 42) via place_missing noop
4057s [105240 evals] best 1.72459e-14 (fails 42) via crossover lrlr<->lrlr
4132s [107320 evals] best 1.73156e-14 (fails 42) via place_missing noop
4145s [107720 evals] best 1.73708e-14 (fails 42) via place_missing noop
4196s [109000 evals] best 1.74162e-14 (fails 42) via place_missing noop
4233s [109800 evals] best 1.74389e-14 (fails 42) via place_missing noop
4272s [110760 evals] best 1.74447e-14 (fails 42) via place_missing noop
4336s [112520 evals] best 1.75219e-14 (fails 42) via rotate 0/rlrlr
4361s [112920 evals] best 1.75253e-14 (fails 42) via undivide 1/llrllr
4415s [114440 evals] best 1.76097e-14 (fails 42) via core_undivide noop
4451s [115320 evals] best 1.76189e-14 (fails 42) via crossover rlr<->rlr
4489s [116200 evals] best 1.77166e-14 (fails 42) via place_missing noop
4514s [116840 evals] best 1.78312e-14 (fails 42) via place_missing noop
4576s [118360 evals] best 1.78941e-14 (fails 42) via place_missing noop
4740s [122600 evals] best 1.79859e-14 (fails 42) via rotate 1/llrlr
4792s [123880 evals] best 3.50161e-14 (fails 41) via divide 1/llrlrl
4815s [124440 evals] best 3.51369e-14 (fails 41) via place_missing noop
4827s [124840 evals] best 3.5156e-14 (fails 41) via core_undivide noop
5698s [146680 evals] best 3.52342e-14 (fails 41) via swap 1/llrlrl

View file

@ -0,0 +1,488 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.4259239623548846
- 0.4259239623548846
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5145119957760619
- 0.5145119957760619
l:
rotation: 3
division:
- 0.7372477547323839
- 0.7372477547323839
l:
rotation: 0
division:
- 0.28333622842211925
- 0.28333622842211925
l:
type: O
rotation: 0
r:
type: cr1
rotation: 2
r:
rotation: 1
division:
- 0.5059213472651911
- 0.5059213472651911
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 2
division:
- 0.7384537617532285
- 0.7384537617532285
l:
rotation: 1
division:
- 0.8627536956652582
- 0.8627536956652582
l:
rotation: 2
division:
- 0.4768854382205807
- 0.4768854382205807
l:
type: n
rotation: 0
r:
type: n
rotation: 3
r:
rotation: 3
division:
- 0.3631426312336177
- 0.3631426312336177
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5061221341235115
- 0.5061221341235115
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.5802863978450712
- 0.5802863978450712
l:
type: me1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.8096926040364771
- 0.8096926040364771
l:
rotation: 0
division:
- 0.2963883137607755
- 0.2963883137607755
l:
rotation: 1
division:
- 0.8370154596890989
- 0.8370154596890989
l:
rotation: 2
division:
- 0.571197306229532
- 0.571197306229532
l:
type: da1
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.82867901058569
- 0.82867901058569
l:
rotation: 2
division:
- 0.1679878749678333
- 0.1679878749678333
l:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.36541227267882825
- 0.36541227267882825
l:
rotation: 1
division:
- 0.6437744025691031
- 0.6437744025691031
l:
type: ws1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.6621032068588621
- 0.6621032068588621
l:
rotation: 1
division:
- 0.821658595449267
- 0.821658595449267
l:
type: n
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5049433632607838
- 0.5049433632607838
l:
rotation: 2
division:
- 0.5839374235267318
- 0.5839374235267318
l:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.5223173908574568
- 0.5223173908574568
l:
rotation: 0
division:
- 0.5317445671635113
- 0.5317445671635113
l:
type: ef1
rotation: 0
r:
type: m
rotation: 0
r:
type: la1
rotation: 0
r:
rotation: 1
division:
- 0.5338424923830531
- 0.5338424923830531
l:
rotation: 0
division:
- 0.78561771348831
- 0.78561771348831
l:
rotation: 0
division:
- 0.2712833558776919
- 0.2712833558776919
l:
type: of
rotation: 0
r:
type: st1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 2
division:
- 0.6913472617912713
- 0.6913472617912713
l:
rotation: 1
division:
- 0.5061221341235114
- 0.5061221341235114
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5061221341235114
- 0.5061221341235114
l:
type: C
rotation: 0
r:
type: m
rotation: 0
r:
type: of
rotation: 0
above:
rotation: 0
division:
- 0.46686896603993033
- 0.46686896603993033
height: 3.0
l:
rotation: 0
division:
- 0.563819840813669
- 0.563819840813669
l:
rotation: 0
division:
- 0.7373284540420059
- 0.7373284540420059
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.375
- 0.375
l:
rotation: 0
division:
- 0.3458501249843992
- 0.3458501249843992
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5061221341235114
- 0.5061221341235114
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.3515963240672897
- 0.3515963240672897
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5061221341235114
- 0.5061221341235114
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6887574841111406
- 0.6887574841111406
l:
rotation: 0
division:
- 0.6918932843804633
- 0.6918932843804633
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5985358591149017
- 0.5985358591149017
l:
type: O
rotation: 0
r:
type: li1
rotation: 0
r:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.3181818181818182
- 0.3181818181818182
l:
type: st2
rotation: 0
r:
rotation: 0
division:
- 0.3769847420952976
- 0.3769847420952976
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.742320549254305
- 0.742320549254305
l:
rotation: 0
division:
- 0.509576911643064
- 0.509576911643064
l:
rotation: 0
division:
- 0.14285714285714285
- 0.14285714285714285
l:
type: n
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.2935968792571724
- 0.2935968792571724
l:
rotation: 0
division:
- 0.6428571428571429
- 0.6428571428571429
l:
type: n
rotation: 0
r:
type: ut1
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: C
rotation: 0

View file

@ -0,0 +1,60 @@
WARNING: 418 m2 per storey needs ~86 m of daylit wall; the plot's non-private perimeter gives 53 m. Roughly 49 m2 of courtyard closes the gap. (DESIGN.md §38.3)
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/coldstart-500000-s0.dom
[ 80 evals] best 4.30115e-34 (fails 101) via construct/0
[ 240 evals] best 6.34775e-22 (fails 62) via construct/2
[ 1760 evals] best 1.0381e-21 (fails 61) via swap 0/lrr
[ 1920 evals] best 1.07712e-21 (fails 61) via rotate 0/lrll
[ 2720 evals] best 1.67039e-20 (fails 58) via level_retype 1/lrll<->0/rllr
[ 2960 evals] best 1.75641e-20 (fails 58) via retype 1/lrrl->ws1
[ 5120 evals] best 1.79841e-20 (fails 58) via core_undivide noop
[ 5280 evals] best 3.39494e-20 (fails 57) via crossover rllll<->rllr
[ 5440 evals] best 3.5999e-20 (fails 57) via core_divide noop
[ 6720 evals] best 6.90053e-20 (fails 56) via rotate 0/ll
[ 7840 evals] best 7.05248e-20 (fails 56) via core_divide noop
[ 8080 evals] best 7.16548e-20 (fails 56) via level_retype 1/rlrl<->0/rllr
[ 9600 evals] best 1.35685e-18 (fails 52) via retype 0/lrrl->da1
[ 10000 evals] best 1.41061e-18 (fails 52) via core_divide noop
[ 15200 evals] best 1.43527e-18 (fails 52) via core_undivide noop
[ 18400 evals] best 4.70767e-18 (fails 50) via swap 0/rrr
[ 18560 evals] best 4.78877e-18 (fails 50) via crossover rlrrl<->rlllr
[ 19200 evals] best 4.96874e-18 (fails 50) via rotate 0/rrl
[ 22560 evals] best 5.00177e-18 (fails 50) via core_undivide noop
[ 23360 evals] best 5.02163e-18 (fails 50) via retype 1/rlll->of
[ 24880 evals] best 5.02826e-18 (fails 50) via core_divide noop
[ 27200 evals] best 5.02858e-18 (fails 50) via core_undivide noop
[ 29600 evals] best 8.13881e-18 (fails 50) via level_retype 1/rlrl<->0/llrr
[ 30960 evals] best 8.2257e-18 (fails 50) via core_undivide noop
[ 37440 evals] best 8.31661e-18 (fails 50) via core_divide noop
[ 39200 evals] best 8.34909e-18 (fails 50) via crossover rlr<->rlr
[ 40240 evals] best 8.43219e-18 (fails 50) via core_undivide noop
[ 46640 evals] best 8.44241e-18 (fails 50) via core_undivide noop
[ 50800 evals] best 9.76987e-18 (fails 50) via crossover rllll<->llrr
[ 51920 evals] best 1.00136e-17 (fails 49) via rotate 0/rll
[ 52000 evals] best 1.00136e-17 (fails 49) via core_divide noop
[ 52400 evals] best 1.01413e-17 (fails 49) via swap 0/llr
[ 61440 evals] best 4.26469e-17 (fails 48) via rotate 0/rlrl
[ 62800 evals] best 4.28559e-17 (fails 48) via core_divide noop
[ 63840 evals] best 4.2856e-17 (fails 48) via retype 0/lrlll->da1
[ 66560 evals] best 4.28816e-17 (fails 48) via core_undivide noop
[ 67440 evals] best 4.2888e-17 (fails 48) via rotate 0/rlll
[ 67680 evals] best 1.73994e-16 (fails 46) via level_retype 0/rllll<->1/rrr
[ 70160 evals] best 1.73995e-16 (fails 46) via core_undivide noop
[ 72240 evals] best 1.73995e-16 (fails 46) via crossover lrrl<->rrll
[ 75680 evals] best 1.73995e-16 (fails 46) via core_undivide noop

View file

@ -0,0 +1,448 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.3447706979333924
- 0.3447706979333924
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.4620968086285896
- 0.4620968086285896
l:
rotation: 0
division:
- 0.7333622728278679
- 0.7333622728278679
l:
rotation: 1
division:
- 0.3685378224774272
- 0.3685378224774272
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.6726120367713806
- 0.6726120367713806
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.4878348762492206
- 0.4878348762492206
l:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.5327266765953544
- 0.5327266765953544
l:
type: t
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.6295885542496246
- 0.6295885542496246
l:
rotation: 2
division:
- 0.346488895346572
- 0.346488895346572
l:
type: t
rotation: 0
r:
rotation: 2
division:
- 0.5736030442061457
- 0.5736030442061457
l:
type: m
rotation: 0
r:
type: st1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.7754091126054303
- 0.7754091126054303
l:
rotation: 1
division:
- 0.7618823674092534
- 0.7618823674092534
l:
type: cr1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.5694286299553355
- 0.5694286299553355
l:
rotation: 0
division:
- 0.6400166014931463
- 0.6400166014931463
l:
type: of
rotation: 0
r:
type: C
rotation: 0
r:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.8169932516637662
- 0.8169932516637662
l:
rotation: 1
division:
- 0.8143711037723886
- 0.8143711037723886
l:
rotation: 1
division:
- 0.20740642422839703
- 0.20740642422839703
l:
rotation: 1
division:
- 0.7678486305056437
- 0.7678486305056437
l:
type: da1
rotation: 0
r:
rotation: 2
division:
- 0.5942284555193714
- 0.5942284555193714
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.4222096556781277
- 0.4222096556781277
l:
rotation: 3
division:
- 0.5125
- 0.5125
l:
rotation: 0
division:
- 0.5253125
- 0.5253125
l:
type: me1
rotation: 0
r:
type: C
rotation: 0
r:
type: ws1
rotation: 0
r:
type: n
rotation: 1
r:
rotation: 1
division:
- 0.36206707098566404
- 0.36206707098566404
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4947182428246264
- 0.4947182428246264
l:
rotation: 0
division:
- 0.538125
- 0.538125
l:
type: la1
rotation: 0
r:
type: m
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.6691962396683705
- 0.6691962396683705
l:
rotation: 0
division:
- 0.5934000767031041
- 0.5934000767031041
l:
type: k1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.6979469153542825
- 0.6979469153542825
l:
type: C
rotation: 0
r:
type: of
rotation: 0
above:
rotation: 0
division:
- 0.3496587703571358
- 0.3496587703571358
height: 3.0
l:
rotation: 0
division:
- 0.4752819629962712
- 0.4752819629962712
l:
rotation: 0
division:
- 0.2600355044813971
- 0.2600355044813971
l:
rotation: 0
division:
- 0.3
- 0.3
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.7891502854072869
- 0.7891502854072869
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4263589168351488
- 0.4263589168351488
l:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.5869817670374274
- 0.5869817670374274
l:
type: t
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.6074393728221003
- 0.6074393728221003
l:
rotation: 0
division:
- 0.8707490344743036
- 0.8707490344743036
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4
- 0.4
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: r
rotation: 1
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6663490741716345
- 0.6663490741716345
l:
type: r
rotation: 1
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.7134531618423475
- 0.7134531618423475
l:
rotation: 0
division:
- 0.5816983284646627
- 0.5816983284646627
l:
rotation: 0
division:
- 0.3595520659646767
- 0.3595520659646767
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 2
division:
- 0.6207610635692363
- 0.6207610635692363
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.3
- 0.3
l:
type: li1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3401127568312368
- 0.3401127568312368
l:
rotation: 0
division:
- 0.6818181818181818
- 0.6818181818181818
l:
rotation: 0
division:
- 0.3338646386958839
- 0.3338646386958839
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5458804216964745
- 0.5458804216964745
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 2
division:
- 0.5985054852708556
- 0.5985054852708556
l:
type: ut1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.210849714592713
- 0.210849714592713
l:
type: st2
rotation: 2
r:
type: r
rotation: 0

View file

@ -0,0 +1,138 @@
WARNING: 418 m2 per storey needs ~86 m of daylit wall; the plot's non-private perimeter gives 53 m. Roughly 49 m2 of courtyard closes the gap. (DESIGN.md §38.3)
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 1
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/coldstart-500000-s1.dom
[ 80 evals] best 1.97416e-37 (fails 113) via construct/0
[ 160 evals] best 7.00325e-25 (fails 74) via construct/1
[ 800 evals] best 6.80772e-23 (fails 69) via construct/9
[ 4320 evals] best 9.1398e-23 (fails 69) via crossover rrrl<->lrlrl
[ 5520 evals] best 3.57821e-22 (fails 67) via level_retype 1/lrlr<->0/lrrr
[ 5760 evals] best 3.65686e-22 (fails 67) via level_fix noop
[ 6800 evals] best 3.79298e-22 (fails 67) via level_fix noop
[ 7760 evals] best 3.8619e-22 (fails 67) via level_fix noop
[ 7840 evals] best 1.7705e-21 (fails 65) via swap 0/rrl
[ 7920 evals] best 2.74628e-21 (fails 64) via level_compound_fix noop
[ 8800 evals] best 5.85324e-21 (fails 64) via core_divide rlrl (2 floors)
[ 12560 evals] best 1.35161e-20 (fails 62) via divide 1/rlrr
[ 12800 evals] best 3.34685e-21 (fails 61) via divide 1/rlrl
[ 13280 evals] best 5.60778e-20 (fails 60) via rotate 0/ll
[ 13440 evals] best 1.11899e-20 (fails 59) via core_divide noop
[ 15600 evals] best 1.12856e-20 (fails 59) via level_retype 0/llrr<->1/rlrlr
[ 16320 evals] best 9.59246e-20 (fails 56) via crossover lrl<->rlll
[ 17200 evals] best 3.64982e-19 (fails 54) via divide 1/rrrl
[ 17760 evals] best 3.67434e-19 (fails 54) via core_undivide noop
[ 19040 evals] best 1.24538e-17 (fails 49) via place_missing r -> rlrr
[ 19920 evals] best 2.27675e-17 (fails 48) via crossover llrl<->llrr
[ 22080 evals] best 4.47951e-17 (fails 47) via crossover llrl<->rlrl
[ 26160 evals] best 4.48735e-17 (fails 47) via core_undivide noop
[ 26640 evals] best 4.51597e-17 (fails 47) via crossover rllll<->rrll
[ 27840 evals] best 5.54956e-17 (fails 47) via core_divide noop
[ 33840 evals] best 5.58344e-17 (fails 47) via crossover rlr<->rlr
[ 34720 evals] best 5.59502e-17 (fails 47) via retype 0/lllrl->t
[ 36720 evals] best 5.62216e-17 (fails 47) via retype 1/lll->da1
[ 37760 evals] best 5.62658e-17 (fails 47) via core_undivide noop
[ 39680 evals] best 2.20153e-16 (fails 45) via swap 0/llr
[ 45520 evals] best 2.20165e-16 (fails 45) via core_undivide noop
[ 45920 evals] best 2.2103e-16 (fails 45) via core_divide noop
[ 47200 evals] best 8.87603e-16 (fails 43) via core_undivide noop
[ 53120 evals] best 7.82728e-15 (fails 40) via level_retype 1/rlrll<->0/llll
[ 54480 evals] best 7.82772e-15 (fails 40) via core_divide noop
[ 63120 evals] best 7.83773e-15 (fails 40) via swap 0/rrl
[ 63200 evals] best 8.01003e-15 (fails 40) via core_divide noop
[ 66240 evals] best 8.17685e-15 (fails 40) via core_undivide noop
[ 67840 evals] best 1.57621e-14 (fails 39) via swap 0/lllr
[ 67920 evals] best 1.60963e-14 (fails 39) via crossover lrrr<->rlrrr
[ 70720 evals] best 1.61878e-14 (fails 39) via core_undivide noop
[ 71360 evals] best 2.13599e-14 (fails 39) via crossover lr<->lr
[ 76320 evals] best 2.17444e-14 (fails 39) via core_divide noop
[ 76960 evals] best 3.01548e-14 (fails 38) via swap 0/rlrr
[ 77120 evals] best 7.07557e-14 (fails 37) via core_divide noop
[ 78240 evals] best 8.0242e-14 (fails 37) via level_retype 1/llrl<->0/rllll
[ 78880 evals] best 8.95492e-14 (fails 37) via core_undivide noop
[ 79920 evals] best 1.79545e-13 (fails 36) via core_undivide noop
[ 81440 evals] best 3.28852e-13 (fails 35) via retype 1/rlrrl->me1
[ 83200 evals] best 3.33778e-13 (fails 35) via level_retype 1/rlrrl<->0/rrlr
[ 86800 evals] best 3.4079e-13 (fails 35) via swap 0/lllr
[ 87520 evals] best 3.41583e-13 (fails 35) via retype 1/rrrlr->ut1
[ 88640 evals] best 3.47403e-13 (fails 35) via core_undivide noop
[ 89760 evals] best 1.43975e-12 (fails 33) via rotate 0/lllr
[ 96800 evals] best 2.74475e-12 (fails 32) via core_undivide noop
[ 97520 evals] best 2.79491e-12 (fails 32) via core_divide noop
[ 99200 evals] best 5.60626e-12 (fails 31) via crossover rlllr<->rlllr
[100640 evals] best 5.6397e-12 (fails 31) via level_retype 1/rrlrl<->0/rllrl
[100720 evals] best 5.69106e-12 (fails 31) via crossover l<->l
[103600 evals] best 5.72518e-12 (fails 31) via core_undivide noop
[104000 evals] best 5.72765e-12 (fails 31) via crossover rrrl<->llrr
[104880 evals] best 1.13649e-11 (fails 30) via swap 0/rlrr
[105760 evals] best 1.14675e-11 (fails 30) via core_undivide noop
[106720 evals] best 1.15509e-11 (fails 30) via core_undivide noop
[112480 evals] best 1.1616e-11 (fails 30) via swap 0/rlrr
[115600 evals] best 1.16278e-11 (fails 30) via core_divide noop
[122080 evals] best 1.16391e-11 (fails 30) via core_undivide noop
[122720 evals] best 1.1641e-11 (fails 30) via crossover rlrrl<->rlllr
[126000 evals] best 1.22712e-11 (fails 30) via rotate 0/lllr
[127360 evals] best 1.22713e-11 (fails 30) via crossover rlllr<->rlllr
[129120 evals] best 1.22713e-11 (fails 30) via core_undivide noop
[139520 evals] best 2.45561e-11 (fails 29) via divide 1/lrrl
[141680 evals] best 2.49366e-11 (fails 29) via core_divide noop
[152400 evals] best 2.52189e-11 (fails 29) via retype 1/lrrll->ut1
[156160 evals] best 2.52213e-11 (fails 29) via core_undivide noop
[158000 evals] best 2.52214e-11 (fails 29) via level_retype 1/lrlr<->0/lrlr
[158640 evals] best 2.52946e-11 (fails 29) via core_undivide noop
[161920 evals] best 2.52948e-11 (fails 29) via core_undivide noop
[176480 evals] best 2.53112e-11 (fails 29) via core_divide noop
[188480 evals] best 2.53113e-11 (fails 29) via crossover lrlr<->lrlr
[192480 evals] best 2.70108e-11 (fails 29) via retype 0/llrr->O
[220400 evals] best 5.31971e-11 (fails 28) via retype 0/lrrll->O
[221680 evals] best 5.32438e-11 (fails 28) via core_undivide noop
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 14 shared-leaf copies
[ 200 evals] best 1.10357e-23 (fails 70) via seed
[ 520 evals] best 7.90847e-23 (fails 67) via level_compound_fix st1: lvl1 → lvl0/rllrl
[ 1560 evals] best 8.0677e-23 (fails 67) via core_divide noop
[ 2280 evals] best 8.09024e-23 (fails 67) via core_undivide noop
[ 3160 evals] best 6.36622e-22 (fails 64) via level_compound_fix r: lvl0 → lvl1/rllrr
[ 4200 evals] best 1.16291e-21 (fails 63) via level_retype 0/rllrrrr<->1/rrllrr
[ 4680 evals] best 4.50812e-21 (fails 61) via crossover lllrrrl<->llrr
[ 5640 evals] best 9.50892e-21 (fails 60) via undivide 0/llrlr
[ 9400 evals] best 6.41079e-20 (fails 57) via retype 0/rllll->st2
[ 9480 evals] best 6.45739e-20 (fails 57) via retype 1/lrrrrl->t
[ 15720 evals] best 6.50643e-20 (fails 57) via core_divide noop
[ 16200 evals] best 6.55803e-20 (fails 57) via core_divide noop
[ 19000 evals] best 1.25528e-19 (fails 56) via undivide 1/rrrl
[ 19640 evals] best 1.26465e-19 (fails 56) via core_divide noop
[ 19720 evals] best 3.14136e-19 (fails 55) via level_retype 0/lrrll<->1/llll
[ 19880 evals] best 3.16683e-19 (fails 55) via core_divide noop
[ 21800 evals] best 3.19364e-19 (fails 55) via core_undivide noop
[ 22200 evals] best 3.22186e-19 (fails 55) via retype 1/lrrrrr->st2
[ 24280 evals] best 3.25155e-19 (fails 55) via core_divide noop
[ 24520 evals] best 3.2828e-19 (fails 55) via core_undivide noop
[ 27560 evals] best 3.28746e-19 (fails 55) via swap 1/lrrrr
[ 29080 evals] best 3.694e-19 (fails 55) via core_undivide noop
[ 29400 evals] best 3.70022e-19 (fails 55) via retype 0/lllrrrl->of
[ 32120 evals] best 3.70789e-19 (fails 55) via core_undivide noop
[ 33640 evals] best 6.57751e-19 (fails 54) via core_divide noop
[ 39560 evals] best 2.18305e-18 (fails 52) via level_retype 0/lllrl<->1/rrlrl
[ 39640 evals] best 2.19058e-18 (fails 52) via core_undivide noop
[ 43560 evals] best 2.19358e-18 (fails 52) via core_undivide noop
[ 45480 evals] best 4.07392e-18 (fails 51) via undivide 0/rllrr
[ 45560 evals] best 4.28145e-18 (fails 51) via swap 0/lllrrr
[ 46600 evals] best 1.5216e-17 (fails 49) via level_retype 0/rrrr<->1/lrrrrl
[ 49720 evals] best 1.61723e-17 (fails 49) via crossover rrrr<->rlllrl
[ 50920 evals] best 1.6221e-17 (fails 49) via core_undivide noop

View file

@ -0,0 +1,448 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 2
division:
- 0.6874610386484389
- 0.6874610386484389
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 0
division:
- 0.2280937436613768
- 0.2280937436613768
l:
rotation: 1
division:
- 0.5501610871830294
- 0.5501610871830294
l:
rotation: 2
division:
- 0.7625210938246068
- 0.7625210938246068
l:
rotation: 0
division:
- 0.25813360801099805
- 0.25813360801099805
l:
type: m
rotation: 0
r:
rotation: 2
division:
- 0.33221176332557584
- 0.33221176332557584
l:
type: m
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5641147148833822
- 0.5641147148833822
l:
rotation: 0
division:
- 0.33578355513625796
- 0.33578355513625796
l:
type: C
rotation: 0
r:
type: la1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.43366532078476366
- 0.43366532078476366
l:
rotation: 1
division:
- 0.8498837031667675
- 0.8498837031667675
l:
rotation: 2
division:
- 0.8892175882819691
- 0.8892175882819691
l:
type: cr1
rotation: 0
r:
type: m
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 1
division:
- 0.8677868254305496
- 0.8677868254305496
l:
rotation: 0
division:
- 0.14311549418230354
- 0.14311549418230354
l:
rotation: 1
division:
- 0.5291738964225459
- 0.5291738964225459
l:
type: of
rotation: 0
r:
rotation: 0
division:
- 0.6233177548828126
- 0.6233177548828126
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 2
division:
- 0.36160216255540684
- 0.36160216255540684
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.549017917538392
- 0.549017917538392
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 3
division:
- 0.6289158565782637
- 0.6289158565782637
l:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.46123163039245607
- 0.46123163039245607
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.6350095670424352
- 0.6350095670424352
l:
rotation: 0
division:
- 0.26561003030770847
- 0.26561003030770847
l:
rotation: 1
division:
- 0.7129605090656834
- 0.7129605090656834
l:
type: me1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.501911014155332
- 0.501911014155332
l:
rotation: 1
division:
- 0.6104391151107456
- 0.6104391151107456
l:
type: k1
rotation: 0
r:
type: C
rotation: 0
r:
type: da1
rotation: 2
r:
rotation: 1
division:
- 0.6395508396772783
- 0.6395508396772783
l:
rotation: 3
division:
- 0.7139724896730562
- 0.7139724896730562
l:
type: ws1
rotation: 0
r:
type: of
rotation: 0
r:
rotation: 1
division:
- 0.5283960567238627
- 0.5283960567238627
l:
type: C
rotation: 0
r:
type: O
rotation: 1
above:
rotation: 0
division:
- 0.5149361343277968
- 0.5149361343277968
height: 3.0
l:
rotation: 0
division:
- 0.3507062178961106
- 0.3507062178961106
l:
rotation: 0
division:
- 0.6809415061597456
- 0.6809415061597456
l:
rotation: 0
division:
- 0.7891502854072869
- 0.7891502854072869
l:
rotation: 1
division:
- 0.3
- 0.3
l:
type: r
rotation: 0
r:
rotation: 3
division:
- 0.3
- 0.3
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.33578355513625796
- 0.33578355513625796
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.5036753327043868
- 0.5036753327043868
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.25
- 0.25
l:
rotation: 0
division:
- 0.3
- 0.3
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.43979131341425537
- 0.43979131341425537
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5804993563162023
- 0.5804993563162023
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.6918932843804633
- 0.6918932843804633
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: st2
rotation: 0
r:
rotation: 0
division:
- 0.5162672160219968
- 0.5162672160219968
l:
type: t
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.3129107734502527
- 0.3129107734502527
l:
rotation: 0
division:
- 0.36063785448514774
- 0.36063785448514774
l:
rotation: 0
division:
- 0.47368421052631576
- 0.47368421052631576
l:
type: li1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.5442279297292193
- 0.5442279297292193
l:
type: C
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.1901725227372534
- 0.1901725227372534
l:
rotation: 0
division:
- 0.6818181818181818
- 0.6818181818181818
l:
rotation: 0
division:
- 0.3571923800852189
- 0.3571923800852189
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5227205562222715
- 0.5227205562222715
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: ut1
rotation: 0
r:
rotation: 0
division:
- 0.6404479340353234
- 0.6404479340353234
l:
type: C
rotation: 0
r:
type: O
rotation: 0

View file

@ -0,0 +1,307 @@
WARNING: 418 m2 per storey needs ~86 m of daylit wall; the plot's non-private perimeter gives 53 m. Roughly 49 m2 of courtyard closes the gap. (DESIGN.md §38.3)
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 2
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/coldstart-500000-s2.dom
[ 80 evals] best 1.05967e-31 (fails 96) via construct/0
[ 240 evals] best 2.81838e-21 (fails 58) via construct/2
[ 1840 evals] best 1.08828e-20 (fails 56) via swap 0/rrl
[ 2000 evals] best 2.18589e-20 (fails 55) via swap 0/lrll
[ 7680 evals] best 2.22979e-20 (fails 55) via core_undivide noop
[ 8320 evals] best 2.27491e-20 (fails 55) via level_fix noop
[ 8560 evals] best 5.4761e-20 (fails 54) via swap 0/rrr
[ 9440 evals] best 5.58534e-20 (fails 54) via core_undivide noop
[ 10720 evals] best 2.15034e-19 (fails 52) via crossover rlr<->rrl
[ 14400 evals] best 4.08743e-19 (fails 52) via core_divide noop
[ 15120 evals] best 4.18415e-19 (fails 52) via core_divide noop
[ 15680 evals] best 4.27242e-19 (fails 52) via core_undivide noop
[ 15760 evals] best 4.34498e-19 (fails 52) via crossover rlrr<->rlrlr
[ 15920 evals] best 3.34447e-19 (fails 51) via core_divide noop
[ 17920 evals] best 3.46301e-19 (fails 51) via core_divide noop
[ 19840 evals] best 6.00603e-18 (fails 48) via crossover rlr<->lrlll
[ 21840 evals] best 6.12702e-18 (fails 48) via crossover rlr<->lrlll
[ 22640 evals] best 6.20329e-18 (fails 48) via core_divide noop
[ 23200 evals] best 6.28822e-18 (fails 48) via core_divide noop
[ 23440 evals] best 6.36832e-18 (fails 48) via level_fix noop
[ 24640 evals] best 6.36835e-18 (fails 48) via level_retype 1/llll<->0/llll
[ 28400 evals] best 6.82917e-18 (fails 48) via swap 0/lrll
[ 28560 evals] best 1.141e-17 (fails 47) via divide 0/rrrr
[ 28880 evals] best 1.15021e-17 (fails 47) via level_fix noop
[ 29680 evals] best 1.15671e-17 (fails 47) via core_divide noop
[ 31520 evals] best 1.15684e-17 (fails 47) via core_divide noop
[ 31680 evals] best 1.16014e-17 (fails 47) via crossover lrllr<->rrlr
[ 76800 evals] best 4.93845e-17 (fails 45) via rotate 0/l
[ 77920 evals] best 4.97739e-17 (fails 45) via core_divide noop
[ 83440 evals] best 5.24758e-17 (fails 45) via level_fix noop
[ 84000 evals] best 1.02117e-16 (fails 44) via crossover rllr<->lllr
[ 85520 evals] best 1.02502e-16 (fails 44) via core_divide noop
[ 87120 evals] best 1.0251e-16 (fails 44) via level_retype 0/rllr<->1/lrrl
[112240 evals] best 1.03579e-16 (fails 44) via core_divide noop
[121760 evals] best 1.82946e-16 (fails 43) via retype 0/lrllr->n
[122000 evals] best 1.99829e-16 (fails 43) via crossover rrl<->lrrr
[122080 evals] best 2.00702e-16 (fails 43) via core_undivide noop
[135680 evals] best 2.05943e-16 (fails 43) via crossover rrrr<->rrrr
[149280 evals] best 2.09028e-16 (fails 43) via rotate 0/lrrr
[150560 evals] best 2.35877e-16 (fails 43) via crossover ll<->ll
[151040 evals] best 2.37613e-16 (fails 43) via core_undivide noop
[179840 evals] best 2.62645e-16 (fails 43) via core_divide noop
[180960 evals] best 5.11898e-16 (fails 42) via core_divide noop
[184560 evals] best 5.13843e-16 (fails 42) via core_undivide noop
[209360 evals] best 5.87161e-16 (fails 42) via undivide 0/rrrr
[267440 evals] best 8.76692e-16 (fails 41) via swap 0/rll
[271440 evals] best 8.90317e-16 (fails 41) via retype 0/rllr->da1
[272960 evals] best 9.43705e-16 (fails 41) via rotate 0/rll
[276960 evals] best 9.45522e-16 (fails 41) via level_retype 1/rlll<->0/rrlr
[293600 evals] best 9.80215e-16 (fails 41) via rotate 0/lrrr
[295200 evals] best 1.0343e-15 (fails 41) via undivide 0/rrrr
[301200 evals] best 1.04687e-15 (fails 41) via core_divide noop
[301760 evals] best 1.05658e-15 (fails 41) via core_divide noop
[303280 evals] best 1.06329e-15 (fails 41) via level_retype 0/rlr<->1/llrl
[305680 evals] best 1.06818e-15 (fails 41) via core_divide noop
[306960 evals] best 1.06932e-15 (fails 41) via core_undivide noop
[323680 evals] best 2.35481e-15 (fails 40) via undivide 0/rrrr
[328400 evals] best 2.36836e-15 (fails 40) via crossover llrr<->llrr
[329120 evals] best 2.37505e-15 (fails 40) via crossover lr<->lr
[388800 evals] best 1.08522e-14 (fails 38) via retype 1/rrrl->m
[388880 evals] best 1.09216e-14 (fails 38) via crossover rrr<->rrr
[390560 evals] best 1.09586e-14 (fails 38) via core_undivide noop
[390960 evals] best 1.13532e-14 (fails 38) via core_undivide noop
[459600 evals] best 1.701e-14 (fails 37) via rotate 0/root
[461360 evals] best 3.34076e-14 (fails 36) via swap 0/rrl
[461440 evals] best 3.38208e-14 (fails 36) via swap 0/rrl
[461760 evals] best 3.42308e-14 (fails 36) via core_divide noop
[464320 evals] best 3.61774e-14 (fails 36) via rotate 0/lll
[466000 evals] best 3.66295e-14 (fails 36) via core_undivide noop
[467760 evals] best 3.67664e-14 (fails 36) via retype 1/rlrl->ws1
[472960 evals] best 3.67665e-14 (fails 36) via core_undivide noop
[476080 evals] best 8.02802e-14 (fails 35) via rotate 0/rrl
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 15 shared-leaf copies
[ 200 evals] best 2.82118e-25 (fails 73) via seed
[ 440 evals] best 2.30511e-24 (fails 70) via crossover llrlr<->rrlr
[ 760 evals] best 4.49435e-24 (fails 69) via rotate 1/lllrr
[ 2840 evals] best 8.78417e-24 (fails 68) via place_missing r -> llll
[ 3000 evals] best 8.82774e-24 (fails 68) via crossover lrrlrrl<->lrrlrrr
[ 3640 evals] best 2.42458e-23 (fails 67) via level_compound_fix m: lvl1 → lvl0/lrlll + insert k1 into llll/lvl0
[ 4760 evals] best 2.05512e-23 (fails 66) via place_missing t -> llll
[ 5400 evals] best 2.11658e-23 (fails 66) via core_divide noop
[ 7160 evals] best 9.18288e-22 (fails 64) via level_compound_fix m: lvl1 → lvl0/rlr + insert da1 into rlll/lvl0
[ 9000 evals] best 9.42501e-22 (fails 64) via core_undivide noop
[ 9080 evals] best 9.49387e-22 (fails 64) via retype 0/lrrrlrr->da1
[ 13480 evals] best 1.95716e-21 (fails 63) via crossover lrrrlrl<->lrrrlrr
[ 14200 evals] best 1.76259e-20 (fails 60) via place_missing st1 -> llllr
[ 14600 evals] best 1.77822e-20 (fails 60) via core_undivide noop
[ 18280 evals] best 1.79011e-20 (fails 60) via swap 1/rrllr
[ 19320 evals] best 2.31009e-19 (fails 56) via crossover lrrrl<->lrrll
[ 20600 evals] best 2.4801e-19 (fails 56) via retype 0/rlrr->n
[ 23720 evals] best 2.53529e-19 (fails 56) via crossover rrlr<->lrllr
[ 25800 evals] best 4.9601e-19 (fails 55) via rotate 1/llrrr
[ 26360 evals] best 5.07047e-19 (fails 55) via core_undivide noop
[ 26760 evals] best 5.16496e-19 (fails 55) via core_undivide noop
[ 27480 evals] best 5.23696e-19 (fails 55) via crossover rlrll<->lrllr
[ 28200 evals] best 5.28718e-19 (fails 55) via retype 1/rrlll->da1
[ 28920 evals] best 5.30665e-19 (fails 55) via core_undivide noop
[ 29480 evals] best 5.31916e-19 (fails 55) via core_undivide noop
[ 31000 evals] best 5.35085e-19 (fails 55) via retype 0/lrlll->cr1
[ 31560 evals] best 2.09427e-18 (fails 53) via rotate 0/lrrlr
[ 31880 evals] best 2.11436e-18 (fails 53) via crossover rrlr<->lrlr
[ 32520 evals] best 2.12214e-18 (fails 53) via swap 0/lrrrl
[ 34120 evals] best 2.12721e-18 (fails 53) via crossover llllrl<->lrrrll
[ 36680 evals] best 2.13989e-18 (fails 53) via core_undivide noop
[ 36840 evals] best 2.15581e-18 (fails 53) via core_undivide noop
[ 37560 evals] best 2.17211e-18 (fails 53) via core_undivide noop
[ 43640 evals] best 2.27557e-18 (fails 53) via divide 0/lrrllr
[ 44200 evals] best 2.28734e-18 (fails 53) via crossover lrrrl<->lrllr
[ 44440 evals] best 4.58147e-18 (fails 52) via level_retype 0/llllrl<->1/lrrrl
[ 45720 evals] best 4.60723e-18 (fails 52) via retype 0/rrlr->st2
[ 46200 evals] best 4.6297e-18 (fails 52) via core_undivide noop
[ 47160 evals] best 4.64905e-18 (fails 52) via retype 1/lllll->ws1
[ 47560 evals] best 9.3872e-18 (fails 51) via undivide 0/llrlr
[ 48760 evals] best 9.43276e-18 (fails 51) via level_retype 1/lrrrl<->0/lllll
[ 51720 evals] best 9.47208e-18 (fails 51) via crossover llrlr<->rrlr
[ 52920 evals] best 9.50298e-18 (fails 51) via core_undivide noop
[ 53560 evals] best 9.50553e-18 (fails 51) via core_undivide noop
[ 54680 evals] best 9.61653e-18 (fails 51) via core_undivide noop
[ 55880 evals] best 1.92326e-17 (fails 50) via level_retype 0/lrrlrrl<->1/rlll
[ 58120 evals] best 1.92729e-17 (fails 50) via level_retype 1/lllrrl<->0/lrlr
[ 59160 evals] best 1.92773e-17 (fails 50) via core_undivide noop
[ 62920 evals] best 1.92791e-17 (fails 50) via crossover rlrll<->lrrrl
[ 64200 evals] best 1.92792e-17 (fails 50) via level_retype 1/rrrl<->0/llrll
[ 64440 evals] best 1.92793e-17 (fails 50) via level_retype 0/lrrlrl<->1/lrrrl
[ 65800 evals] best 3.8015e-17 (fails 49) via rotate 0/llr
[ 81640 evals] best 1.50706e-16 (fails 47) via rotate 0/lrrr
[ 82280 evals] best 1.5782e-16 (fails 47) via rotate 0/llr
[ 86120 evals] best 1.59101e-16 (fails 47) via level_retype 0/lllll<->1/lllrl
[ 88120 evals] best 5.88473e-16 (fails 45) via place_missing r -> llrl
[ 88760 evals] best 5.88501e-16 (fails 45) via core_undivide noop
[201000 evals] best 5.92096e-16 (fails 45) via crossover ll<->ll
[224600 evals] best 3.02462e-14 (fails 42) via divide 1/lrrl
[225720 evals] best 3.02767e-14 (fails 42) via retype 1/lllll->ef1
[226120 evals] best 3.03182e-14 (fails 42) via crossover llrlr<->lrlr
[228040 evals] best 3.03693e-14 (fails 42) via crossover rllr<->rllr
[229800 evals] best 3.03824e-14 (fails 42) via crossover rlll<->rrlr
[229880 evals] best 3.04106e-14 (fails 42) via core_undivide noop
[229960 evals] best 3.04107e-14 (fails 42) via level_retype 0/rlrlr<->1/rrrl
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 104 → 42 fails (applied)
--- done ---
elapsed : 158579.2s
evals : 750040 across 9374 topologies
best : 3.04107e-14 (42 fails) via level_retype 0/rlrlr<->1/rrrl+collapse
improvement history:
[ 80] 1.05967e-31 (share:construct/0)
[ 240] 2.81838e-21 (share:construct/2)
[ 1840] 1.08828e-20 (share:swap 0/rrl)
[ 2000] 2.18589e-20 (share:swap 0/lrll)
[ 7680] 2.22979e-20 (share:core_undivide noop)
[ 8320] 2.27491e-20 (share:level_fix noop)
[ 8560] 5.4761e-20 (share:swap 0/rrr)
[ 9440] 5.58534e-20 (share:core_undivide noop)
[ 10720] 2.15034e-19 (share:crossover rlr<->rrl)
[ 14400] 4.08743e-19 (share:core_divide noop)
[ 15120] 4.18415e-19 (share:core_divide noop)
[ 15680] 4.27242e-19 (share:core_undivide noop)
[ 15760] 4.34498e-19 (share:crossover rlrr<->rlrlr)
[ 15920] 3.34447e-19 (share:core_divide noop)
[ 17920] 3.46301e-19 (share:core_divide noop)
[ 19840] 6.00603e-18 (share:crossover rlr<->lrlll)
[ 21840] 6.12702e-18 (share:crossover rlr<->lrlll)
[ 22640] 6.20329e-18 (share:core_divide noop)
[ 23200] 6.28822e-18 (share:core_divide noop)
[ 23440] 6.36832e-18 (share:level_fix noop)
[ 24640] 6.36835e-18 (share:level_retype 1/llll<->0/llll)
[ 28400] 6.82917e-18 (share:swap 0/lrll)
[ 28560] 1.141e-17 (share:divide 0/rrrr)
[ 28880] 1.15021e-17 (share:level_fix noop)
[ 29680] 1.15671e-17 (share:core_divide noop)
[ 31520] 1.15684e-17 (share:core_divide noop)
[ 31680] 1.16014e-17 (share:crossover lrllr<->rrlr)
[ 76800] 4.93845e-17 (share:rotate 0/l)
[ 77920] 4.97739e-17 (share:core_divide noop)
[ 83440] 5.24758e-17 (share:level_fix noop)
[ 84000] 1.02117e-16 (share:crossover rllr<->lllr)
[ 85520] 1.02502e-16 (share:core_divide noop)
[ 87120] 1.0251e-16 (share:level_retype 0/rllr<->1/lrrl)
[112240] 1.03579e-16 (share:core_divide noop)
[121760] 1.82946e-16 (share:retype 0/lrllr->n)
[122000] 1.99829e-16 (share:crossover rrl<->lrrr)
[122080] 2.00702e-16 (share:core_undivide noop)
[135680] 2.05943e-16 (share:crossover rrrr<->rrrr)
[149280] 2.09028e-16 (share:rotate 0/lrrr)
[150560] 2.35877e-16 (share:crossover ll<->ll)
[151040] 2.37613e-16 (share:core_undivide noop)
[179840] 2.62645e-16 (share:core_divide noop)
[180960] 5.11898e-16 (share:core_divide noop)
[184560] 5.13843e-16 (share:core_undivide noop)
[209360] 5.87161e-16 (share:undivide 0/rrrr)
[267440] 8.76692e-16 (share:swap 0/rll)
[271440] 8.90317e-16 (share:retype 0/rllr->da1)
[272960] 9.43705e-16 (share:rotate 0/rll)
[276960] 9.45522e-16 (share:level_retype 1/rlll<->0/rrlr)
[293600] 9.80215e-16 (share:rotate 0/lrrr)
[295200] 1.0343e-15 (share:undivide 0/rrrr)
[301200] 1.04687e-15 (share:core_divide noop)
[301760] 1.05658e-15 (share:core_divide noop)
[303280] 1.06329e-15 (share:level_retype 0/rlr<->1/llrl)
[305680] 1.06818e-15 (share:core_divide noop)
[306960] 1.06932e-15 (share:core_undivide noop)
[323680] 2.35481e-15 (share:undivide 0/rrrr)
[328400] 2.36836e-15 (share:crossover llrr<->llrr)
[329120] 2.37505e-15 (share:crossover lr<->lr)
[388800] 1.08522e-14 (share:retype 1/rrrl->m)
[388880] 1.09216e-14 (share:crossover rrr<->rrr)
[390560] 1.09586e-14 (share:core_undivide noop)
[390960] 1.13532e-14 (share:core_undivide noop)
[459600] 1.701e-14 (share:rotate 0/root)
[461360] 3.34076e-14 (share:swap 0/rrl)
[461440] 3.38208e-14 (share:swap 0/rrl)
[461760] 3.42308e-14 (share:core_divide noop)
[464320] 3.61774e-14 (share:rotate 0/lll)
[466000] 3.66295e-14 (share:core_undivide noop)
[467760] 3.67664e-14 (share:retype 1/rlrl->ws1)
[472960] 3.67665e-14 (share:core_undivide noop)
[476080] 8.02802e-14 (share:rotate 0/rrl)
[500200] 2.82118e-25 (polish:seed)
[500440] 2.30511e-24 (polish:crossover llrlr<->rrlr)
[500760] 4.49435e-24 (polish:rotate 1/lllrr)
[502840] 8.78417e-24 (polish:place_missing r -> llll)
[503000] 8.82774e-24 (polish:crossover lrrlrrl<->lrrlrrr)
[503640] 2.42458e-23 (polish:level_compound_fix m: lvl1 → lvl0/lrlll + insert k1 into llll/lvl0)
[504760] 2.05512e-23 (polish:place_missing t -> llll)
[505400] 2.11658e-23 (polish:core_divide noop)
[507160] 9.18288e-22 (polish:level_compound_fix m: lvl1 → lvl0/rlr + insert da1 into rlll/lvl0)
[509000] 9.42501e-22 (polish:core_undivide noop)
[509080] 9.49387e-22 (polish:retype 0/lrrrlrr->da1)
[513480] 1.95716e-21 (polish:crossover lrrrlrl<->lrrrlrr)
[514200] 1.76259e-20 (polish:place_missing st1 -> llllr)
[514600] 1.77822e-20 (polish:core_undivide noop)
[518280] 1.79011e-20 (polish:swap 1/rrllr)
[519320] 2.31009e-19 (polish:crossover lrrrl<->lrrll)
[520600] 2.4801e-19 (polish:retype 0/rlrr->n)
[523720] 2.53529e-19 (polish:crossover rrlr<->lrllr)
[525800] 4.9601e-19 (polish:rotate 1/llrrr)
[526360] 5.07047e-19 (polish:core_undivide noop)
[526760] 5.16496e-19 (polish:core_undivide noop)
[527480] 5.23696e-19 (polish:crossover rlrll<->lrllr)
[528200] 5.28718e-19 (polish:retype 1/rrlll->da1)
[528920] 5.30665e-19 (polish:core_undivide noop)
[529480] 5.31916e-19 (polish:core_undivide noop)
[531000] 5.35085e-19 (polish:retype 0/lrlll->cr1)
[531560] 2.09427e-18 (polish:rotate 0/lrrlr)
[531880] 2.11436e-18 (polish:crossover rrlr<->lrlr)
[532520] 2.12214e-18 (polish:swap 0/lrrrl)
[534120] 2.12721e-18 (polish:crossover llllrl<->lrrrll)
[536680] 2.13989e-18 (polish:core_undivide noop)
[536840] 2.15581e-18 (polish:core_undivide noop)
[537560] 2.17211e-18 (polish:core_undivide noop)
[543640] 2.27557e-18 (polish:divide 0/lrrllr)
[544200] 2.28734e-18 (polish:crossover lrrrl<->lrllr)
[544440] 4.58147e-18 (polish:level_retype 0/llllrl<->1/lrrrl)
[545720] 4.60723e-18 (polish:retype 0/rrlr->st2)
[546200] 4.6297e-18 (polish:core_undivide noop)
[547160] 4.64905e-18 (polish:retype 1/lllll->ws1)
[547560] 9.3872e-18 (polish:undivide 0/llrlr)
[548760] 9.43276e-18 (polish:level_retype 1/lrrrl<->0/lllll)
[551720] 9.47208e-18 (polish:crossover llrlr<->rrlr)
[552920] 9.50298e-18 (polish:core_undivide noop)
[553560] 9.50553e-18 (polish:core_undivide noop)
[554680] 9.61653e-18 (polish:core_undivide noop)
[555880] 1.92326e-17 (polish:level_retype 0/lrrlrrl<->1/rlll)
[558120] 1.92729e-17 (polish:level_retype 1/lllrrl<->0/lrlr)
[559160] 1.92773e-17 (polish:core_undivide noop)
[562920] 1.92791e-17 (polish:crossover rlrll<->lrrrl)
[564200] 1.92792e-17 (polish:level_retype 1/rrrl<->0/llrll)
[564440] 1.92793e-17 (polish:level_retype 0/lrrlrl<->1/lrrrl)
[565800] 3.8015e-17 (polish:rotate 0/llr)
[581640] 1.50706e-16 (polish:rotate 0/lrrr)
[582280] 1.5782e-16 (polish:rotate 0/llr)
[586120] 1.59101e-16 (polish:level_retype 0/lllll<->1/lllrl)
[588120] 5.88473e-16 (polish:place_missing r -> llrl)
[588760] 5.88501e-16 (polish:core_undivide noop)
[701000] 5.92096e-16 (polish:crossover ll<->ll)
[724600] 3.02462e-14 (polish:divide 1/lrrl)
[725720] 3.02767e-14 (polish:retype 1/lllll->ef1)
[726120] 3.03182e-14 (polish:crossover llrlr<->lrlr)
[728040] 3.03693e-14 (polish:crossover rllr<->rllr)
[729800] 3.03824e-14 (polish:crossover rlll<->rrlr)
[729880] 3.04106e-14 (polish:core_undivide noop)
[729960] 3.04107e-14 (polish:level_retype 0/rlrlr<->1/rrrl)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/coldstart-500000-s2.dom

View file

@ -0,0 +1,85 @@
/*
* Bonsai - OpenBIM Blender Add-on
* Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
*
* This file is part of Bonsai.
*
* Bonsai is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Bonsai is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY, without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* long with Bonsai. If not, see <http://www.gnu.org/licenses/>.
*/
* { stroke-linecap: round; stroke-linejoin: round; }
text, tspan { /* 2.5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT', 'DejaVu Sans Condensed', 'Liberation Sans', 'Arial Narrow', 'Arial'; font-size: 4.13px; }
a text, a tspan { fill: blue !important; text-decoration: underline;}
a:hover { cursor: pointer; }
.cut { fill: black; stroke: black; stroke-linecap: 'round'; stroke-width: 0.35; fill-rule: evenodd; }
.projection { fill: white; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; }
.surface { stroke: none; fill: #fff; fill-rule: evenodd; }
.annotation { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; }
.IfcAnnotation { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; }
.IfcGeographicElement { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 1; }
.PredefinedType-LINEWORK { stroke: black; stroke-width: 0.25; }
.PredefinedType-LINEWORK.dashed { stroke-dasharray: 3, 2; }
.PredefinedType-LINEWORK.fine { stroke-width: 0.18; stroke: #777777; }
.PredefinedType-LINEWORK.thin { stroke-width: 0.25; }
.PredefinedType-LINEWORK.medium { stroke-width: 0.35; }
.PredefinedType-LINEWORK.thick { stroke-width: 0.5; }
.PredefinedType-LINEWORK.strong { stroke-width: 1; }
.PredefinedType-BACKGROUND { stroke: black; stroke-width: 0.18; }
.PredefinedType-GRID { marker-start: url(#grid-marker); marker-end: url(#grid-marker); }
.PredefinedType-SECTION { stroke-dasharray: 12.5, 3, 3, 3; }
.PredefinedType-SECTIONLEVEL { marker-start: url(#section-level-marker); stroke-dasharray: 12.5, 3, 3, 3; }
.PredefinedType-PLANLEVEL { marker-end: url(#plan-level-marker); }
.PredefinedType-DIMENSION { marker-start: url(#dimension-marker-start); marker-end: url(#dimension-marker-end); }
.PredefinedType-ANGLE { marker-start: url(#angle-marker-start); marker-end: url(#angle-marker-end); }
.PredefinedType-RADIUS { marker-end: url(#fall-marker-end); }
.PredefinedType-FALL { marker-end: url(#radius-marker-end); }
.PredefinedType-SLOPEANGLE { marker-end: url(#radius-marker-end); }
.PredefinedType-SLOPEPERCENT { marker-end: url(#radius-marker-end); }
.PredefinedType-SLOPEFRACTION { marker-end: url(#radius-marker-end); }
.PredefinedType-DIAMETER { marker-start: url(#diameter-marker-start); marker-end: url(#diameter-marker-end); }
.PredefinedType-STAIRARROW { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); }
.PredefinedType-BOUNDARY { fill: none; stroke: red; stroke-width: 1; stroke-dasharray: 12, 4, 3, 4, 3, 4; }
.PredefinedType-SEALANT { fill: url(#crosshatch1); stroke-width: 0.25; }
.PredefinedType-FILLAREA { fill: white; stroke: black; }
.PredefinedType-BREAKLINE { fill: none; stroke: black; stroke-width: 0.25; marker-mid: url(#breakline-marker); }
.PredefinedType-TEXT { fill: black; stroke: none; }
path.PredefinedType-TEXTLEADER { marker-end: url(#leader-marker); }
text.PredefinedType-TEXTLEADER, tspan.PredefinedType-TEXTLEADER { fill: black; stroke: none; }
text.title, tspan.title { /* 7mm */ font-size: 11.55px; }
text.header, tspan.header { /* 5mm */ font-size: 8.25px; }
text.large, tspan.large { /* 3.5mm */ font-size: 5.78px; }
text.regular, tspan.regular { /* 2.5mm */ font-size: 4.13px; }
text.small, tspan.small { /* 1.8mm */ font-size: 2.97px; }
text.GRID, tspan.GRID { /* 5mm */ font-size: 8.25px; }
.material-blank { fill: white; }
.material-diagonal1 { fill: url(#diagonal1); }
.material-diagonal2 { fill: url(#diagonal2); }
.material-diagonal3 { fill: url(#diagonal3); }
.material-crosshatch1 { fill: url(#crosshatch1); }
.material-crosshatch2 { fill: url(#crosshatch2); }
.material-crosshatch3 { fill: url(#crosshatch3); }
.material-brick { fill: url(#brick); }
.material-earth { fill: url(#earth); }
.material-glass { fill: url(#glass); }
.material-liquid { fill: url(#liquid); }
.material-grass { fill: url(#grass); }
.material-honeycomb { fill: url(#honeycomb); }
.material-sand { fill: url(#sand); }
.material-concrete { fill: url(#concrete); stroke-width: 0.5; }
.IfcSpace { fill: none; stroke: none; }
.PredefinedType-STUD { stroke: black; stroke-width: 1; }
.PredefinedType-WOOD { fill: url(#wood); stroke: black; stroke-width: 0.5; }
.PredefinedType-STEEL { fill: url(#steel); stroke: black; stroke-width: 0.5; }
.PredefinedType-CONCRETE { fill: url(#concrete); stroke: black; stroke-width: 0.5; }
.PredefinedType-PLASTERBOARD { fill: url(#sand); stroke: black; stroke-width: 0.25; }

View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="full" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Tip: https://svg-path-visualizer.netlify.app/ -->
<!-- Tip: https://www.svgviewer.dev/ -->
<marker id="eng-dimension-marker-start" markerHeight="14" markerWidth="11" orient="auto" refX="1" refY="7">
<g>
<path d="M 11 3.5 L 11 10.5 L 1 7" class="annotation" style="fill:black;" />
<path d="M 1 0 L 1 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="eng-dimension-marker-end" markerHeight="14" markerWidth="11" orient="auto" refX="10" refY="7">
<g>
<path d="M 0 3.5 L 0 10.5 L 10 7" class="annotation" style="fill:black;" />
<path d="M 10 0 L 10 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="radius-marker-end" markerHeight="14" markerWidth="11" orient="auto" refX="10" refY="7">
<g>
<path d="M 0 3.5 L 0 10.5 L 10 7" class="annotation" style="fill:black;" />
</g>
</marker>
<!-- same as for the radius -->
<marker id="fall-marker-end" markerHeight="14" markerWidth="11" orient="auto" refX="10" refY="7">
<g>
<path d="M 0 3.5 L 0 10.5 L 10 7" class="annotation" style="fill:black;" />
</g>
</marker>
<marker id="angle-marker-start" markerHeight="14" markerWidth="11" orient="auto" refX="1" refY="7">
<g>
<path d="M 11 3.5 L 11 10.5 L 1 7" class="annotation" style="fill:black;" />
<path d="M 1 0 L 1 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="angle-marker-end" markerHeight="14" markerWidth="11" orient="auto" refX="10" refY="7">
<g>
<path d="M 0 3.5 L 0 10.5 L 10 7" class="annotation" style="fill:black;" />
<path d="M 10 0 L 10 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="diameter-marker-start" markerHeight="14" markerWidth="11" orient="auto" refX="1" refY="7">
<g>
<path d="M 11 3.5 L 11 10.5 L 1 7" class="annotation" style="fill:black;" />
<path d="M 1 0 L 1 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="diameter-marker-end" markerHeight="14" markerWidth="11" orient="auto" refX="10" refY="7">
<g>
<path d="M 0 3.5 L 0 10.5 L 10 7" class="annotation" style="fill:black;" />
<path d="M 10 0 L 10 14" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="dimension-marker-start" markerHeight="30" markerWidth="20" refX="10" refY="15" orient="auto">
<g>
<path d="M 0 15 L 20 15" class="annotation" style="stroke-width:1;" />
<path d="M 10 0 L 10 30" class="annotation" style="stroke-width:1;" />
<path d="M 5 20 L 15 10" class="annotation" style="stroke-width:3;" />
</g>
</marker>
<marker id="dimension-marker-end" markerHeight="30" markerWidth="20" refX="10" refY="15" orient="auto">
<g>
<path d="M 0 15 L 20 15" class="annotation" style="stroke-width:1;" />
<path d="M 10 0 L 10 30" class="annotation" style="stroke-width:1;" />
<path d="M 5 20 L 15 10" class="annotation" style="stroke-width:3;" />
</g>
</marker>
<marker id="grid-marker" markerHeight="40" markerWidth="40" orient="auto" refX="20" refY="20">
<circle cx="20" cy="20" fill="white" stroke="black" r="17" style="stroke-width: 2"/>
</marker>
<marker id="leader-marker" markerHeight="7" markerWidth="10" orient="auto" refX="10" refY="3.5">
<path d="M 0 0 L 0 7 L 10 3.5" class="annotation" style="fill:black;" />
</marker>
<marker id="stair-marker-start" markerHeight="10" markerWidth="10" orient="auto" refX="5" refY="5">
<circle cx="5" cy="5" fill="black" stroke="none" r="5"/>
</marker>
<marker id="stair-marker-end" markerHeight="42" markerWidth="21" orient="auto" refX="21" refY="21">
<path d="M 0 0 L 21 21 L 0 42" class="annotation stair" style="stroke-width:2; marker-start: none; marker-end: none;" />
</marker>
<marker id="plan-level-marker" markerHeight="30" markerWidth="30" refX="15" refY="15" orient="auto">
<g>
<path d="M 15 0 L 15 30" class="annotation" style="stroke-width:1;" />
<path d="M 0 15 L 30 15" class="annotation" style="stroke-width:1;" />
<circle cx="15" cy="15" fill="white" stroke="black" r="7.5" style="stroke-width: 2"/>
<path d="M 15 15 L 7.5 15 A 7.5 7.5 0 0 1 15 7.5 Z" fill="black"/>
<path d="M 15 15 L 22.5 15 A 7.5 7.5 0 0 1 15 22.5 Z" fill="black"/>
</g>
</marker>
<marker id="section-level-marker" markerHeight="11" markerWidth="90" refX="20" refY="10" orient="auto-start-reverse">
<g>
<path d="M 0 1 L 20 1 L 10 11 Z" fill="black" />
<path d="M 0 1 L 90 1" class="annotation" style="stroke-width:1;" />
</g>
</marker>
<marker id="breakline-marker" markerHeight="20" markerWidth="15" refX="7.5" refY="10" orient="auto">
<g>
<path d="M 0 10 L 5 20 L 7.5 10" class="annotation" style="stroke-width:1; fill: white;" />
<path d="M 7.5 10 L 10 0 L 15 10" class="annotation" style="stroke-width:1; fill: white;" />
</g>
</marker>
<filter x="0" y="0" width="1" height="1" id="fill-background">
<feFlood flood-color="white" result="bg" />
<feMerge>
<feMergeNode in="bg"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 70 KiB

View file

@ -0,0 +1,711 @@
{
"Technical": {
"render_type": "VIEWPORT",
"raster_style": {
"bpy.data.worlds[0].color": [
1.0,
1.0,
1.0
],
"scene.render.border_max_x": 1.0,
"scene.render.border_max_y": 1.0,
"scene.render.border_min_x": 0.0,
"scene.render.border_min_y": 0.0,
"scene.render.dither_intensity": 1.0,
"scene.render.engine": "BLENDER_WORKBENCH",
"scene.render.film_transparent": false,
"scene.render.filter_size": 1.5,
"scene.render.fps": 24,
"scene.render.fps_base": 1.0,
"scene.render.frame_map_new": 100,
"scene.render.frame_map_old": 100,
"scene.render.hair_subdiv": 0,
"scene.render.hair_type": "STRAND",
"scene.render.line_thickness": 1.0,
"scene.render.line_thickness_mode": "ABSOLUTE",
"scene.render.metadata_input": "SCENE",
"scene.render.motion_blur_shutter": 0.5,
"scene.render.pixel_aspect_x": 1.0,
"scene.render.pixel_aspect_y": 1.0,
"scene.render.preview_pixel_size": "AUTO",
"scene.render.resolution_percentage": 100,
"scene.render.resolution_x": 1000,
"scene.render.resolution_y": 1000,
"scene.render.sequencer_gl_preview": "SOLID",
"scene.render.simplify_child_particles": 1.0,
"scene.render.simplify_child_particles_render": 1.0,
"scene.render.simplify_gpencil": false,
"scene.render.simplify_gpencil_antialiasing": true,
"scene.render.simplify_gpencil_modifier": true,
"scene.render.simplify_gpencil_onplay": false,
"scene.render.simplify_gpencil_shader_fx": true,
"scene.render.simplify_gpencil_tint": true,
"scene.render.simplify_gpencil_view_fill": true,
"scene.render.simplify_subdivision": 6,
"scene.render.simplify_subdivision_render": 6,
"scene.render.simplify_volumes": 1.0,
"scene.render.stamp_font_size": 12,
"scene.render.stamp_note_text": "",
"scene.render.threads": 20,
"scene.render.threads_mode": "AUTO",
"scene.render.use_border": false,
"scene.render.use_compositing": true,
"scene.render.use_crop_to_border": false,
"scene.render.use_file_extension": true,
"scene.render.use_freestyle": false,
"scene.render.use_high_quality_normals": false,
"scene.render.use_lock_interface": false,
"scene.render.use_motion_blur": false,
"scene.render.use_multiview": false,
"scene.render.use_overwrite": true,
"scene.render.use_persistent_data": false,
"scene.render.use_placeholder": false,
"scene.render.use_render_cache": false,
"scene.render.use_sequencer": true,
"scene.render.use_sequencer_override_scene_strip": false,
"scene.render.use_simplify": false,
"scene.render.use_single_layer": false,
"scene.render.use_stamp": false,
"scene.render.use_stamp_camera": true,
"scene.render.use_stamp_date": true,
"scene.render.use_stamp_filename": true,
"scene.render.use_stamp_frame": true,
"scene.render.use_stamp_frame_range": false,
"scene.render.use_stamp_hostname": false,
"scene.render.use_stamp_labels": true,
"scene.render.use_stamp_lens": false,
"scene.render.use_stamp_marker": false,
"scene.render.use_stamp_memory": false,
"scene.render.use_stamp_note": false,
"scene.render.use_stamp_render_time": true,
"scene.render.use_stamp_scene": true,
"scene.render.use_stamp_sequencer_strip": false,
"scene.render.use_stamp_time": true,
"scene.render.views_format": "STEREO_3D",
"scene.view_settings.exposure": 0.0,
"scene.view_settings.gamma": 1.0,
"scene.view_settings.look": "None",
"scene.view_settings.use_curve_mapping": false,
"scene.view_settings.view_transform": "Standard",
"scene.display.shading.aov_name": "",
"scene.display.shading.background_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.background_type": "THEME",
"scene.display.shading.cavity_ridge_factor": 1.0,
"scene.display.shading.cavity_type": "BOTH",
"scene.display.shading.cavity_valley_factor": 1.0,
"scene.display.shading.color_type": "SINGLE",
"scene.display.shading.curvature_ridge_factor": 1.0,
"scene.display.shading.curvature_valley_factor": 1.0,
"scene.display.shading.light": "FLAT",
"scene.display.shading.object_outline_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.render_pass": "COMBINED",
"scene.display.shading.shadow_intensity": 0.5,
"scene.display.shading.show_backface_culling": false,
"scene.display.shading.show_cavity": false,
"scene.display.shading.show_object_outline": true,
"scene.display.shading.show_shadows": false,
"scene.display.shading.show_specular_highlight": true,
"scene.display.shading.show_xray": false,
"scene.display.shading.show_xray_wireframe": false,
"scene.display.shading.single_color": [
1.0,
1.0,
1.0
],
"scene.display.shading.studio_light": "Default",
"scene.display.shading.studiolight_background_alpha": 0.0,
"scene.display.shading.studiolight_background_blur": 0.0,
"scene.display.shading.studiolight_intensity": 0.0,
"scene.display.shading.studiolight_rotate_z": 0.0,
"scene.display.shading.type": "SOLID",
"scene.display.shading.use_compositor": "DISABLED",
"scene.display.shading.use_dof": false,
"scene.display.shading.use_scene_lights": false,
"scene.display.shading.use_scene_lights_render": false,
"scene.display.shading.use_scene_world": false,
"scene.display.shading.use_scene_world_render": false,
"scene.display.shading.use_studiolight_view_rotation": true,
"scene.display.shading.use_world_space_lighting": false,
"scene.display.shading.wireframe_color_type": "THEME",
"scene.display.shading.xray_alpha": 0.5,
"scene.display.shading.xray_alpha_wireframe": 0.0,
"scene.display.light_direction": [
0.5,
0.5,
0.5
],
"scene.display.matcap_ssao_attenuation": 1.0,
"scene.display.matcap_ssao_distance": 0.20000000298023224,
"scene.display.matcap_ssao_samples": 16,
"scene.display.render_aa": "8",
"scene.display.shadow_focus": 0.0,
"scene.display.shadow_shift": 0.10000000149011612,
"scene.display.viewport_aa": "FXAA",
"space.overlay.bone_wire_alpha": 1.0,
"space.overlay.display_handle": "SELECTED",
"space.overlay.fade_inactive_alpha": 0.4000000059604645,
"space.overlay.gpencil_fade_layer": 0.5,
"space.overlay.gpencil_fade_objects": 0.5,
"space.overlay.gpencil_grid_opacity": 0.5,
"space.overlay.gpencil_vertex_paint_opacity": 1.0,
"space.overlay.grid_lines": 16,
"space.overlay.grid_scale": 1.0,
"space.overlay.grid_subdivisions": 10,
"space.overlay.normals_constant_screen_size": 7.0,
"space.overlay.normals_length": 0.10000000149011612,
"space.overlay.sculpt_curves_cage_opacity": 0.5,
"space.overlay.sculpt_mode_face_sets_opacity": 1.0,
"space.overlay.sculpt_mode_mask_opacity": 0.75,
"space.overlay.show_annotation": true,
"space.overlay.show_axis_x": false,
"space.overlay.show_axis_y": false,
"space.overlay.show_axis_z": false,
"space.overlay.show_bones": true,
"space.overlay.show_cursor": true,
"space.overlay.show_curve_normals": false,
"space.overlay.show_edge_bevel_weight": true,
"space.overlay.show_edge_crease": true,
"space.overlay.show_edge_seams": true,
"space.overlay.show_edge_sharp": true,
"space.overlay.show_extra_edge_angle": false,
"space.overlay.show_extra_edge_length": false,
"space.overlay.show_extra_face_angle": false,
"space.overlay.show_extra_face_area": false,
"space.overlay.show_extra_indices": false,
"space.overlay.show_extras": true,
"space.overlay.show_face_center": false,
"space.overlay.show_face_normals": false,
"space.overlay.show_face_orientation": false,
"space.overlay.show_faces": true,
"space.overlay.show_fade_inactive": false,
"space.overlay.show_floor": false,
"space.overlay.show_freestyle_edge_marks": true,
"space.overlay.show_freestyle_face_marks": true,
"space.overlay.show_look_dev": false,
"space.overlay.show_motion_paths": true,
"space.overlay.show_object_origins": false,
"space.overlay.show_object_origins_all": false,
"space.overlay.show_onion_skins": false,
"space.overlay.show_ortho_grid": true,
"space.overlay.show_outline_selected": true,
"space.overlay.show_overlays": true,
"space.overlay.show_paint_wire": false,
"space.overlay.show_relationship_lines": false,
"space.overlay.show_sculpt_curves_cage": true,
"space.overlay.show_sculpt_face_sets": true,
"space.overlay.show_sculpt_mask": true,
"space.overlay.show_split_normals": false,
"space.overlay.show_stats": false,
"space.overlay.show_statvis": false,
"space.overlay.show_text": true,
"space.overlay.show_vertex_normals": false,
"space.overlay.show_viewer_attribute": true,
"space.overlay.show_weight": false,
"space.overlay.show_wireframes": true,
"space.overlay.show_wpaint_contours": false,
"space.overlay.show_xray_bone": false,
"space.overlay.texture_paint_mode_opacity": 1.0,
"space.overlay.use_debug_freeze_view_culling": false,
"space.overlay.use_gpencil_canvas_xray": false,
"space.overlay.use_gpencil_edit_lines": true,
"space.overlay.use_gpencil_fade_gp_objects": false,
"space.overlay.use_gpencil_fade_layers": false,
"space.overlay.use_gpencil_fade_objects": false,
"space.overlay.use_gpencil_grid": false,
"space.overlay.use_gpencil_multiedit_line_only": false,
"space.overlay.use_gpencil_onion_skin": false,
"space.overlay.use_gpencil_show_directions": false,
"space.overlay.use_gpencil_show_material_name": false,
"space.overlay.use_normals_constant_screen_size": false,
"space.overlay.vertex_opacity": 1.0,
"space.overlay.vertex_paint_mode_opacity": 1.0,
"space.overlay.viewer_attribute_opacity": 1.0,
"space.overlay.weight_paint_mode_opacity": 1.0,
"space.overlay.wireframe_opacity": 1.0,
"space.overlay.wireframe_threshold": 0.0,
"space.overlay.xray_alpha_bone": 0.0
}
},
"Shaded": {
"render_type": "VIEWPORT",
"raster_style": {
"bpy.data.worlds[0].color": [
1.0,
1.0,
1.0
],
"scene.render.border_max_x": 1.0,
"scene.render.border_max_y": 1.0,
"scene.render.border_min_x": 0.0,
"scene.render.border_min_y": 0.0,
"scene.render.dither_intensity": 1.0,
"scene.render.engine": "BLENDER_WORKBENCH",
"scene.render.film_transparent": false,
"scene.render.filter_size": 1.5,
"scene.render.fps": 24,
"scene.render.fps_base": 1.0,
"scene.render.frame_map_new": 100,
"scene.render.frame_map_old": 100,
"scene.render.hair_subdiv": 0,
"scene.render.hair_type": "STRAND",
"scene.render.line_thickness": 1.0,
"scene.render.line_thickness_mode": "ABSOLUTE",
"scene.render.metadata_input": "SCENE",
"scene.render.motion_blur_shutter": 0.5,
"scene.render.pixel_aspect_x": 1.0,
"scene.render.pixel_aspect_y": 1.0,
"scene.render.preview_pixel_size": "AUTO",
"scene.render.resolution_percentage": 100,
"scene.render.resolution_x": 1000,
"scene.render.resolution_y": 1000,
"scene.render.sequencer_gl_preview": "SOLID",
"scene.render.simplify_child_particles": 1.0,
"scene.render.simplify_child_particles_render": 1.0,
"scene.render.simplify_gpencil": false,
"scene.render.simplify_gpencil_antialiasing": true,
"scene.render.simplify_gpencil_modifier": true,
"scene.render.simplify_gpencil_onplay": false,
"scene.render.simplify_gpencil_shader_fx": true,
"scene.render.simplify_gpencil_tint": true,
"scene.render.simplify_gpencil_view_fill": true,
"scene.render.simplify_subdivision": 6,
"scene.render.simplify_subdivision_render": 6,
"scene.render.simplify_volumes": 1.0,
"scene.render.stamp_font_size": 12,
"scene.render.stamp_note_text": "",
"scene.render.threads": 20,
"scene.render.threads_mode": "AUTO",
"scene.render.use_border": false,
"scene.render.use_compositing": true,
"scene.render.use_crop_to_border": false,
"scene.render.use_file_extension": true,
"scene.render.use_freestyle": false,
"scene.render.use_high_quality_normals": false,
"scene.render.use_lock_interface": false,
"scene.render.use_motion_blur": false,
"scene.render.use_multiview": false,
"scene.render.use_overwrite": true,
"scene.render.use_persistent_data": false,
"scene.render.use_placeholder": false,
"scene.render.use_render_cache": false,
"scene.render.use_sequencer": true,
"scene.render.use_sequencer_override_scene_strip": false,
"scene.render.use_simplify": false,
"scene.render.use_single_layer": false,
"scene.render.use_stamp": false,
"scene.render.use_stamp_camera": true,
"scene.render.use_stamp_date": true,
"scene.render.use_stamp_filename": true,
"scene.render.use_stamp_frame": true,
"scene.render.use_stamp_frame_range": false,
"scene.render.use_stamp_hostname": false,
"scene.render.use_stamp_labels": true,
"scene.render.use_stamp_lens": false,
"scene.render.use_stamp_marker": false,
"scene.render.use_stamp_memory": false,
"scene.render.use_stamp_note": false,
"scene.render.use_stamp_render_time": true,
"scene.render.use_stamp_scene": true,
"scene.render.use_stamp_sequencer_strip": false,
"scene.render.use_stamp_time": true,
"scene.render.views_format": "STEREO_3D",
"scene.view_settings.exposure": 0.0,
"scene.view_settings.gamma": 1.0,
"scene.view_settings.look": "None",
"scene.view_settings.use_curve_mapping": false,
"scene.view_settings.view_transform": "Standard",
"scene.display.shading.aov_name": "",
"scene.display.shading.background_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.background_type": "THEME",
"scene.display.shading.cavity_ridge_factor": 1.0,
"scene.display.shading.cavity_type": "BOTH",
"scene.display.shading.cavity_valley_factor": 1.0,
"scene.display.shading.color_type": "MATERIAL",
"scene.display.shading.curvature_ridge_factor": 1.0,
"scene.display.shading.curvature_valley_factor": 1.0,
"scene.display.shading.light": "STUDIO",
"scene.display.shading.object_outline_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.render_pass": "COMBINED",
"scene.display.shading.shadow_intensity": 0.5,
"scene.display.shading.show_backface_culling": false,
"scene.display.shading.show_cavity": true,
"scene.display.shading.show_object_outline": true,
"scene.display.shading.show_shadows": true,
"scene.display.shading.show_specular_highlight": true,
"scene.display.shading.show_xray": false,
"scene.display.shading.show_xray_wireframe": false,
"scene.display.shading.single_color": [
1.0,
1.0,
1.0
],
"scene.display.shading.studio_light": "forest.exr",
"scene.display.shading.studiolight_background_alpha": 0.0,
"scene.display.shading.studiolight_background_blur": 0.0,
"scene.display.shading.studiolight_intensity": 0.0,
"scene.display.shading.studiolight_rotate_z": 0.0,
"scene.display.shading.type": "RENDERED",
"scene.display.shading.use_compositor": "DISABLED",
"scene.display.shading.use_dof": false,
"scene.display.shading.use_scene_lights": false,
"scene.display.shading.use_scene_lights_render": false,
"scene.display.shading.use_scene_world": false,
"scene.display.shading.use_scene_world_render": false,
"scene.display.shading.use_studiolight_view_rotation": true,
"scene.display.shading.use_world_space_lighting": false,
"scene.display.shading.wireframe_color_type": "THEME",
"scene.display.shading.xray_alpha": 0.5,
"scene.display.shading.xray_alpha_wireframe": 0.0,
"scene.display.light_direction": [
0.5,
0.5,
0.5
],
"scene.display.matcap_ssao_attenuation": 1.0,
"scene.display.matcap_ssao_distance": 0.20000000298023224,
"scene.display.matcap_ssao_samples": 16,
"scene.display.render_aa": "8",
"scene.display.shadow_focus": 0.0,
"scene.display.shadow_shift": 0.10000000149011612,
"scene.display.viewport_aa": "FXAA",
"space.overlay.bone_wire_alpha": 1.0,
"space.overlay.display_handle": "SELECTED",
"space.overlay.fade_inactive_alpha": 0.4000000059604645,
"space.overlay.gpencil_fade_layer": 0.5,
"space.overlay.gpencil_fade_objects": 0.5,
"space.overlay.gpencil_grid_opacity": 0.5,
"space.overlay.gpencil_vertex_paint_opacity": 1.0,
"space.overlay.grid_lines": 16,
"space.overlay.grid_scale": 1.0,
"space.overlay.grid_subdivisions": 10,
"space.overlay.normals_constant_screen_size": 7.0,
"space.overlay.normals_length": 0.10000000149011612,
"space.overlay.sculpt_curves_cage_opacity": 0.5,
"space.overlay.sculpt_mode_face_sets_opacity": 1.0,
"space.overlay.sculpt_mode_mask_opacity": 0.75,
"space.overlay.show_annotation": true,
"space.overlay.show_axis_x": false,
"space.overlay.show_axis_y": false,
"space.overlay.show_axis_z": false,
"space.overlay.show_bones": true,
"space.overlay.show_cursor": true,
"space.overlay.show_curve_normals": false,
"space.overlay.show_edge_bevel_weight": true,
"space.overlay.show_edge_crease": true,
"space.overlay.show_edge_seams": true,
"space.overlay.show_edge_sharp": true,
"space.overlay.show_extra_edge_angle": false,
"space.overlay.show_extra_edge_length": false,
"space.overlay.show_extra_face_angle": false,
"space.overlay.show_extra_face_area": false,
"space.overlay.show_extra_indices": false,
"space.overlay.show_extras": true,
"space.overlay.show_face_center": false,
"space.overlay.show_face_normals": false,
"space.overlay.show_face_orientation": false,
"space.overlay.show_faces": true,
"space.overlay.show_fade_inactive": false,
"space.overlay.show_floor": false,
"space.overlay.show_freestyle_edge_marks": true,
"space.overlay.show_freestyle_face_marks": true,
"space.overlay.show_look_dev": false,
"space.overlay.show_motion_paths": true,
"space.overlay.show_object_origins": false,
"space.overlay.show_object_origins_all": false,
"space.overlay.show_onion_skins": false,
"space.overlay.show_ortho_grid": true,
"space.overlay.show_outline_selected": true,
"space.overlay.show_overlays": true,
"space.overlay.show_paint_wire": false,
"space.overlay.show_relationship_lines": false,
"space.overlay.show_sculpt_curves_cage": true,
"space.overlay.show_sculpt_face_sets": true,
"space.overlay.show_sculpt_mask": true,
"space.overlay.show_split_normals": false,
"space.overlay.show_stats": false,
"space.overlay.show_statvis": false,
"space.overlay.show_text": true,
"space.overlay.show_vertex_normals": false,
"space.overlay.show_viewer_attribute": true,
"space.overlay.show_weight": false,
"space.overlay.show_wireframes": false,
"space.overlay.show_wpaint_contours": false,
"space.overlay.show_xray_bone": false,
"space.overlay.texture_paint_mode_opacity": 1.0,
"space.overlay.use_debug_freeze_view_culling": false,
"space.overlay.use_gpencil_canvas_xray": false,
"space.overlay.use_gpencil_edit_lines": true,
"space.overlay.use_gpencil_fade_gp_objects": false,
"space.overlay.use_gpencil_fade_layers": false,
"space.overlay.use_gpencil_fade_objects": false,
"space.overlay.use_gpencil_grid": false,
"space.overlay.use_gpencil_multiedit_line_only": false,
"space.overlay.use_gpencil_onion_skin": false,
"space.overlay.use_gpencil_show_directions": false,
"space.overlay.use_gpencil_show_material_name": false,
"space.overlay.use_normals_constant_screen_size": false,
"space.overlay.vertex_opacity": 1.0,
"space.overlay.vertex_paint_mode_opacity": 1.0,
"space.overlay.viewer_attribute_opacity": 1.0,
"space.overlay.weight_paint_mode_opacity": 1.0,
"space.overlay.wireframe_opacity": 1.0,
"space.overlay.wireframe_threshold": 0.0,
"space.overlay.xray_alpha_bone": 0.0
}
},
"Blender Default": {
"render_type": "VIEWPORT",
"raster_style": {
"bpy.data.worlds[0].color": [
0.05087608844041824,
0.05087608844041824,
0.05087608844041824
],
"scene.eevee.use_shadows": true,
"scene.eevee.shadow_ray_count": 1,
"scene.eevee.shadow_step_count": 6,
"scene.eevee.shadow_resolution_scale": 1.0,
"scene.render.border_max_x": 1.0,
"scene.render.border_max_y": 1.0,
"scene.render.border_min_x": 0.0,
"scene.render.border_min_y": 0.0,
"scene.render.dither_intensity": 1.0,
"scene.render.engine": "BLENDER_EEVEE",
"scene.render.film_transparent": false,
"scene.render.filter_size": 1.5,
"scene.render.fps": 24,
"scene.render.fps_base": 1.0,
"scene.render.frame_map_new": 100,
"scene.render.frame_map_old": 100,
"scene.render.hair_subdiv": 0,
"scene.render.hair_type": "STRAND",
"scene.render.line_thickness": 1.0,
"scene.render.line_thickness_mode": "ABSOLUTE",
"scene.render.metadata_input": "SCENE",
"scene.render.motion_blur_shutter": 0.5,
"scene.render.pixel_aspect_x": 1.0,
"scene.render.pixel_aspect_y": 1.0,
"scene.render.preview_pixel_size": "AUTO",
"scene.render.resolution_percentage": 100,
"scene.render.resolution_x": 1000,
"scene.render.resolution_y": 1000,
"scene.render.sequencer_gl_preview": "SOLID",
"scene.render.simplify_child_particles": 1.0,
"scene.render.simplify_child_particles_render": 1.0,
"scene.render.simplify_gpencil": false,
"scene.render.simplify_gpencil_antialiasing": true,
"scene.render.simplify_gpencil_modifier": true,
"scene.render.simplify_gpencil_onplay": false,
"scene.render.simplify_gpencil_shader_fx": true,
"scene.render.simplify_gpencil_tint": true,
"scene.render.simplify_gpencil_view_fill": true,
"scene.render.simplify_subdivision": 6,
"scene.render.simplify_subdivision_render": 6,
"scene.render.simplify_volumes": 1.0,
"scene.render.stamp_font_size": 12,
"scene.render.stamp_note_text": "",
"scene.render.threads": 20,
"scene.render.threads_mode": "AUTO",
"scene.render.use_border": false,
"scene.render.use_compositing": true,
"scene.render.use_crop_to_border": false,
"scene.render.use_file_extension": true,
"scene.render.use_freestyle": false,
"scene.render.use_high_quality_normals": false,
"scene.render.use_lock_interface": false,
"scene.render.use_motion_blur": false,
"scene.render.use_multiview": false,
"scene.render.use_overwrite": true,
"scene.render.use_persistent_data": false,
"scene.render.use_placeholder": false,
"scene.render.use_render_cache": false,
"scene.render.use_sequencer": true,
"scene.render.use_sequencer_override_scene_strip": false,
"scene.render.use_simplify": false,
"scene.render.use_single_layer": false,
"scene.render.use_stamp": false,
"scene.render.use_stamp_camera": true,
"scene.render.use_stamp_date": true,
"scene.render.use_stamp_filename": true,
"scene.render.use_stamp_frame": true,
"scene.render.use_stamp_frame_range": false,
"scene.render.use_stamp_hostname": false,
"scene.render.use_stamp_labels": true,
"scene.render.use_stamp_lens": false,
"scene.render.use_stamp_marker": false,
"scene.render.use_stamp_memory": false,
"scene.render.use_stamp_note": false,
"scene.render.use_stamp_render_time": true,
"scene.render.use_stamp_scene": true,
"scene.render.use_stamp_sequencer_strip": false,
"scene.render.use_stamp_time": true,
"scene.render.views_format": "STEREO_3D",
"scene.view_settings.exposure": 0.0,
"scene.view_settings.gamma": 1.0,
"scene.view_settings.look": "None",
"scene.view_settings.use_curve_mapping": false,
"scene.view_settings.view_transform": "Filmic",
"scene.display.shading.aov_name": "",
"scene.display.shading.background_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.background_type": "THEME",
"scene.display.shading.cavity_ridge_factor": 1.0,
"scene.display.shading.cavity_type": "WORLD",
"scene.display.shading.cavity_valley_factor": 1.0,
"scene.display.shading.color_type": "MATERIAL",
"scene.display.shading.curvature_ridge_factor": 0.0,
"scene.display.shading.curvature_valley_factor": 0.0,
"scene.display.shading.light": "STUDIO",
"scene.display.shading.object_outline_color": [
0.0,
0.0,
0.0
],
"scene.display.shading.render_pass": "COMBINED",
"scene.display.shading.shadow_intensity": 0.5,
"scene.display.shading.show_backface_culling": false,
"scene.display.shading.show_cavity": false,
"scene.display.shading.show_object_outline": false,
"scene.display.shading.show_shadows": false,
"scene.display.shading.show_specular_highlight": true,
"scene.display.shading.show_xray": false,
"scene.display.shading.show_xray_wireframe": false,
"scene.display.shading.single_color": [
0.800000011920929,
0.800000011920929,
0.800000011920929
],
"scene.display.shading.studio_light": "forest.exr",
"scene.display.shading.studiolight_background_alpha": 0.0,
"scene.display.shading.studiolight_background_blur": 0.0,
"scene.display.shading.studiolight_intensity": 0.0,
"scene.display.shading.studiolight_rotate_z": 0.0,
"scene.display.shading.type": "RENDERED",
"scene.display.shading.use_compositor": "DISABLED",
"scene.display.shading.use_dof": false,
"scene.display.shading.use_scene_lights": false,
"scene.display.shading.use_scene_lights_render": false,
"scene.display.shading.use_scene_world": false,
"scene.display.shading.use_scene_world_render": false,
"scene.display.shading.use_studiolight_view_rotation": true,
"scene.display.shading.use_world_space_lighting": false,
"scene.display.shading.wireframe_color_type": "THEME",
"scene.display.shading.xray_alpha": 0.5,
"scene.display.shading.xray_alpha_wireframe": 0.0,
"scene.display.light_direction": [
0.5773502588272095,
0.5773502588272095,
0.5773502588272095
],
"scene.display.matcap_ssao_attenuation": 1.0,
"scene.display.matcap_ssao_distance": 0.20000000298023224,
"scene.display.matcap_ssao_samples": 16,
"scene.display.render_aa": "8",
"scene.display.shadow_focus": 0.0,
"scene.display.shadow_shift": 0.10000000149011612,
"scene.display.viewport_aa": "FXAA",
"space.overlay.bone_wire_alpha": 1.0,
"space.overlay.display_handle": "SELECTED",
"space.overlay.fade_inactive_alpha": 0.4000000059604645,
"space.overlay.gpencil_fade_layer": 0.5,
"space.overlay.gpencil_fade_objects": 0.5,
"space.overlay.gpencil_grid_opacity": 0.5,
"space.overlay.gpencil_vertex_paint_opacity": 1.0,
"space.overlay.grid_lines": 16,
"space.overlay.grid_scale": 1.0,
"space.overlay.grid_subdivisions": 10,
"space.overlay.normals_constant_screen_size": 7.0,
"space.overlay.normals_length": 0.10000000149011612,
"space.overlay.sculpt_curves_cage_opacity": 0.5,
"space.overlay.sculpt_mode_face_sets_opacity": 1.0,
"space.overlay.sculpt_mode_mask_opacity": 0.75,
"space.overlay.show_annotation": true,
"space.overlay.show_axis_x": true,
"space.overlay.show_axis_y": true,
"space.overlay.show_axis_z": false,
"space.overlay.show_bones": true,
"space.overlay.show_cursor": true,
"space.overlay.show_curve_normals": false,
"space.overlay.show_edge_bevel_weight": true,
"space.overlay.show_edge_crease": true,
"space.overlay.show_edge_seams": true,
"space.overlay.show_edge_sharp": true,
"space.overlay.show_extra_edge_angle": false,
"space.overlay.show_extra_edge_length": false,
"space.overlay.show_extra_face_angle": false,
"space.overlay.show_extra_face_area": false,
"space.overlay.show_extra_indices": false,
"space.overlay.show_extras": true,
"space.overlay.show_face_center": false,
"space.overlay.show_face_normals": false,
"space.overlay.show_face_orientation": false,
"space.overlay.show_faces": true,
"space.overlay.show_fade_inactive": false,
"space.overlay.show_floor": true,
"space.overlay.show_freestyle_edge_marks": true,
"space.overlay.show_freestyle_face_marks": true,
"space.overlay.show_look_dev": false,
"space.overlay.show_motion_paths": true,
"space.overlay.show_object_origins": true,
"space.overlay.show_object_origins_all": false,
"space.overlay.show_onion_skins": false,
"space.overlay.show_ortho_grid": true,
"space.overlay.show_outline_selected": true,
"space.overlay.show_overlays": true,
"space.overlay.show_paint_wire": false,
"space.overlay.show_relationship_lines": true,
"space.overlay.show_sculpt_curves_cage": true,
"space.overlay.show_sculpt_face_sets": true,
"space.overlay.show_sculpt_mask": true,
"space.overlay.show_split_normals": false,
"space.overlay.show_stats": false,
"space.overlay.show_statvis": false,
"space.overlay.show_text": true,
"space.overlay.show_vertex_normals": false,
"space.overlay.show_viewer_attribute": true,
"space.overlay.show_weight": false,
"space.overlay.show_wireframes": false,
"space.overlay.show_wpaint_contours": false,
"space.overlay.show_xray_bone": false,
"space.overlay.texture_paint_mode_opacity": 1.0,
"space.overlay.use_debug_freeze_view_culling": false,
"space.overlay.use_gpencil_canvas_xray": false,
"space.overlay.use_gpencil_edit_lines": true,
"space.overlay.use_gpencil_fade_gp_objects": false,
"space.overlay.use_gpencil_fade_layers": false,
"space.overlay.use_gpencil_fade_objects": false,
"space.overlay.use_gpencil_grid": false,
"space.overlay.use_gpencil_multiedit_line_only": false,
"space.overlay.use_gpencil_onion_skin": false,
"space.overlay.use_gpencil_show_directions": false,
"space.overlay.use_gpencil_show_material_name": false,
"space.overlay.use_normals_constant_screen_size": false,
"space.overlay.vertex_opacity": 1.0,
"space.overlay.vertex_paint_mode_opacity": 1.0,
"space.overlay.viewer_attribute_opacity": 1.0,
"space.overlay.weight_paint_mode_opacity": 1.0,
"space.overlay.wireframe_opacity": 1.0,
"space.overlay.wireframe_threshold": 1.0,
"space.overlay.xray_alpha_bone": 0.0
}
}
}

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="full" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="rectangle-tag">
<rect x="-6" y="-2.5" width="12" height="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="triangle-tag">
<path style="fill: white; stroke: black; stroke-width: 0.25;" d="M 3.1409425e-7,-7.1069207 5.7650623,2.8784603 l -11.5301246,-6e-7 z" />
</g>
<g id="hexagon-tag">
<path style="fill: white; stroke: black; stroke-width: 0.25;" d="m 0.0161133,-6.0583333 5.2339915,3.8366023 -2.031433,6.1633977 c 0,0 -6.4894866,-0.027414 -6.4894866,-0.027414 l -1.97929,-6.1803395 5.2662181,-3.7922467" />
</g>
<g id="capsule-tag">
<rect x="-6" y="-2.5" width="12" height="5" rx="2.5" ry="2.5" fill="white" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="circle-tag">
<circle r="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="door-tag">
<circle r="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
<text y="-1.75" class="regular" text-anchor="middle" dominant-baseline="middle" data-type="text-template"></text>
<line x1="-5" x2="5" style="stroke: black; stroke-width: 0.25;" />
<text y="2.5" class="regular" text-anchor="middle" dominant-baseline="middle" data-type="text-template"></text>
</g>
<g id="window-tag">
<path style="fill: white; stroke: black; stroke-width: 0.25;" d="m 0.0161133,-6.0583333 5.2339915,3.8366023 -2.031433,6.1633977 c 0,0 -6.4894866,-0.027414 -6.4894866,-0.027414 l -1.97929,-6.1803395 5.2662181,-3.7922467" />
</g>
<g id="space-tag">
<text y="-5" class="large" text-anchor="middle" dominant-baseline="middle" data-type="text-template"></text>
<rect x="-6" y="-2.5" width="12" height="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
<text class="regular" text-anchor="middle" dominant-baseline="middle" data-type="text-template"></text>
<text y="5" class="regular" text-anchor="middle" dominant-baseline="middle" data-type="text-template"></text>
</g>
<g id="elevation-arrow">
<path style="fill: black;" d="M -7.07106 0 0 -7.07106 7.07106 0" />
</g>
<g id="elevation-tag">
<circle r="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
<line x1="-5" y1="0" x2="5" y2="0" style="stroke: black; stroke-width: 0.25;" />
</g>
<g id="section-arrow">
<path style="fill: black;" d="M -7.07106 0 0 -7.07106 7.07106 0" />
</g>
<g id="section-tag">
<circle r="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
<line x1="-5" y1="0" x2="5" y2="0" style="stroke: black; stroke-width: 0.25;" />
</g>
<g id="dot">
<circle r="1" fill="black" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="setout-tag">
<circle fill="white" stroke="black" r="2.5" style="stroke-width: 0.5"/>
<path d="M 0 0 L -2.5 0 A 2.5 2.5 0 0 1 0 -2.5 Z" fill="black"/>
<path d="M 0 0 L 2.5 0 A 2.5 2.5 0 0 1 0 2.5 Z" fill="black"/>
<text x="3" y="-8" class="regular" text-anchor="start" dominant-baseline="auto" data-type="text-template"></text>
<text x="3" y="-4" class="regular" text-anchor="start" dominant-baseline="auto" data-type="text-template"></text>
</g>
<g id="setout-point">
<circle fill="white" stroke="black" r="2.5" style="stroke-width: 0.5"/>
<path d="M 0 0 L -2.5 0 A 2.5 2.5 0 0 1 0 -2.5 Z" fill="black"/>
<path d="M 0 0 L 2.5 0 A 2.5 2.5 0 0 1 0 2.5 Z" fill="black"/>
</g>
<g id="control-point">
<path style="fill: white; stroke: black; stroke-width: 0.5;" d="M 2.286165,1.4798666 H -1.0000316e-7 -2.2861651 L -1.1430826,-0.5000101 -1.0000316e-7,-2.479888 1.1430827,-0.5000101 Z" />
<circle r="0.5" fill="black" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="traverse-point">
<path style="fill: white; stroke: black; stroke-width: 0.5;" d="M -2,-2 2,2 M -2,2 2,-2" />
</g>
<g id="spot-elevation">
<path style="fill: white; stroke: black; stroke-width: 0.5;" d="M 0,-2 0,2 M -2,0 2,0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:ifc="http://www.ifcopenshell.org/ns" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="full" data-scale="1:100" height="347.2920227050781mm" id="root" version="1.1" viewBox="0 0 283.9324049042492 347.2920227050781" width="283.9324049042492mm">
<defs/>
<use transform="rotate(-90.00000250447816, 278.5086364746094, 173.64601135253906)" x="278.5086364746094" xlink:href="#elevation-arrow" y="173.64601135253906"/>
<use x="278.5086364746094" xlink:href="#elevation-tag" y="173.64601135253906"/>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="278.5086364746094" y="171.14601135253906">5</text>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="278.5086364746094" y="176.14601135253906">A001</text>
<use transform="rotate(-0.0, 141.96620178222656, 341.7720031738281)" x="141.96620178222656" xlink:href="#elevation-arrow" y="341.7720031738281"/>
<use x="141.96620178222656" xlink:href="#elevation-tag" y="341.7720031738281"/>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="141.96620178222656" y="339.2720031738281">3</text>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="141.96620178222656" y="344.2720031738281">A001</text>
<use transform="rotate(180.00000500895632, 141.96620178222656, 5.519981384277344)" x="141.96620178222656" xlink:href="#elevation-arrow" y="5.519981384277344"/>
<use x="141.96620178222656" xlink:href="#elevation-tag" y="5.519981384277344"/>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="141.96620178222656" y="3.0199813842773438">2</text>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="141.96620178222656" y="8.019981384277344">A001</text>
<use transform="rotate(90.00000250447816, 5.423786640167236, 173.64601135253906)" x="5.423786640167236" xlink:href="#elevation-arrow" y="173.64601135253906"/>
<use x="5.423786640167236" xlink:href="#elevation-tag" y="173.64601135253906"/>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="5.423786640167236" y="171.14601135253906">4</text>
<text class="ELEVATION" dominant-baseline="middle" text-anchor="middle" x="5.423786640167236" y="176.14601135253906">A001</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(104.0402603149414, 112.1025161743164) rotate(-0.0)">
<tspan class="GlobalId-14k76oIez1vxM0oh32S0GE IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Circulation</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(55.23228073120117, 162.96786499023438) rotate(-0.0)">
<tspan class="GlobalId-0MyH$XkpPDXxIUaT9Ld8Hw IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Outside</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(141.86961364746094, 151.8088836669922) rotate(-0.0)">
<tspan class="GlobalId-2PE9CsOj13Z9IrWaGXrOc2 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Bathroom</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(116.88951110839844, 48.97612762451172) rotate(-0.0)">
<tspan class="GlobalId-2Xq2z1Eh5F8gNMVVogO2GJ IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(173.82005310058594, 144.2660675048828) rotate(-0.0)">
<tspan class="GlobalId-0KyqAKW8nDBwZDBQdEj_iK IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">First floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(149.87120056152344, 255.59417724609375) rotate(-0.0)">
<tspan class="GlobalId-3rMjwhobv6_PEgdf9$K3zJ IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Circulation</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(142.7828369140625, 178.0451202392578) rotate(-0.0)">
<tspan class="GlobalId-1X0qZMsjb4UuCuoP0Lq41v IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(212.8541259765625, 285.85626220703125) rotate(-0.0)">
<tspan class="GlobalId-2YLyAyX796LwYiMGzpPr2G IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Library corner</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(88.3046875, 63.82916259765625) rotate(-0.0)">
<tspan class="GlobalId-0$IByw69TDLvnor8Ds1qWt IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(36.39326477050781, 311.0692138671875) rotate(-0.0)">
<tspan class="GlobalId-0Y8lYMSb54fOgp0QqQ7Ns4 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Stair</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(30.05246353149414, 124.2915267944336) rotate(-0.0)">
<tspan class="GlobalId-2bqHH7bW9AKuxe1Uj6OLyq IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(204.09750366210938, 173.6927032470703) rotate(-0.0)">
<tspan class="GlobalId-2bSIAbizzCYf5p7OTP8rJI IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(222.9790496826172, 112.36170959472656) rotate(-0.0)">
<tspan class="GlobalId-2lg7HOP_vAtAB5Le8xwyz8 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Ground floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(30.54391098022461, 175.71914672851562) rotate(-0.0)">
<tspan class="GlobalId-0gdzN02vf34PC6Wcl$kR8J IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Circulation</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(82.68409729003906, 243.4410400390625) rotate(-0.0)">
<tspan class="GlobalId-3hPXipzRz0S9exKDyH0Vcp IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Neighborhood</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(48.83393859863281, 93.4433822631836) rotate(-0.0)">
<tspan class="GlobalId-1I8tY$FIv0_wDthF4VjB1P IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Bathroom</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(36.00395584106445, 222.1943359375) rotate(-0.0)">
<tspan class="GlobalId-0MX6uTQTr8qOdGIROZnXYB IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(138.38088989257812, 58.71159362792969) rotate(-0.0)">
<tspan class="GlobalId-3O1qPE9qj4yxEzv9SUamLD IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(87.72796630859375, 34.609764099121094) rotate(-0.0)">
<tspan class="GlobalId-23LW3b_szBDBLnq0wZDN81 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Outside</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(36.30070877075195, 289.939697265625) rotate(-0.0)">
<tspan class="GlobalId-0g5Y0kvLv1hwBodQWzU4sm IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(194.0360107421875, 287.24896240234375) rotate(-0.0)">
<tspan class="GlobalId-2QIAqitaLFJPcCk7DoGUtY IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(219.0067138671875, 46.154258728027344) rotate(-0.0)">
<tspan class="GlobalId-247dH3OhD05Qw$82Tjf4WD IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Ground floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(29.954397201538086, 89.66910552978516) rotate(-0.0)">
<tspan class="GlobalId-1FCx3YB1X4fhemya1p0hiR IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Circulation</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(36.176292419433594, 261.53753662109375) rotate(-0.0)">
<tspan class="GlobalId-038B2S9SL0d9_I_xR1yvlW IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">First floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(101.0525131225586, 172.71115112304688) rotate(-0.0)">
<tspan class="GlobalId-3kATNz14D6dQsPKCXfltH8 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Sahn</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(55.496238708496094, 189.85069274902344) rotate(-0.0)">
<tspan class="GlobalId-3$mxc3OeX3ggdTedb7yZeS IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Bathroom</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(49.11585235595703, 127.88272094726562) rotate(-0.0)">
<tspan class="GlobalId-1_sXb7hMjA8u8EhCqXyOl4 IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Individual room</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(45.175167083740234, 49.580604553222656) rotate(-0.0)">
<tspan class="GlobalId-0KSG2qVOb0zu1v0SS_Dofk IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">First floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(83.710205078125, 303.1560974121094) rotate(-0.0)">
<tspan class="GlobalId-2Hk3oth3n8sh2h0Bf5KwNl IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">First floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(137.38067626953125, 29.91387367248535) rotate(-0.0)">
<tspan class="GlobalId-3TY70XhmHAcRtu4o63zE$T IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Bathroom</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(170.83584594726562, 77.07499694824219) rotate(-0.0)">
<tspan class="GlobalId-0Z1UUYeAf9zBPtDmFlSl5K IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">First floor storage</tspan>
</text>
<text dominant-baseline="middle" style="font-size: 0;" text-anchor="middle" transform="translate(222.19921875, 227.48216247558594) rotate(-0.0)">
<tspan class="GlobalId-114S2YEkj9CRPoowAp_8WN IfcAnnotation PredefinedType-TEXT header" dy="0em" x="0" y="0">Utilities closet</tspan>
</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.1 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

View file

@ -0,0 +1,300 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols-2.dom
[ 200 evals] best 1.20049e-11 (fails 32) via seed
[ 20520 evals] best 1.3603e-11 (fails 32) via rotate 0/rrl
[ 23240 evals] best 1.36649e-11 (fails 32) via core_undivide noop
[ 28200 evals] best 1.38185e-11 (fails 32) via core_undivide noop
[ 34520 evals] best 2.01893e-11 (fails 31) via place_missing noop
[ 35480 evals] best 2.79281e-11 (fails 31) via place_missing noop
[ 36200 evals] best 2.80872e-11 (fails 31) via place_missing noop
[ 40200 evals] best 2.8253e-11 (fails 31) via place_missing noop
[ 41880 evals] best 2.84268e-11 (fails 31) via crossover llrlr<->llrlr
[ 50920 evals] best 2.85753e-11 (fails 31) via place_missing noop
[ 62280 evals] best 2.89517e-11 (fails 30) via crossover rlrr<->llrl
[ 62600 evals] best 3.34689e-11 (fails 30) via core_undivide noop
[ 63720 evals] best 3.40595e-11 (fails 30) via level_retype 0/lllrlr<->1/rllllr
[ 64120 evals] best 3.46347e-11 (fails 30) via place_missing noop
[ 65240 evals] best 3.48699e-11 (fails 30) via place_missing noop
[ 66920 evals] best 3.50429e-11 (fails 30) via place_missing noop
[ 68200 evals] best 3.52197e-11 (fails 30) via place_missing noop
[ 69480 evals] best 3.53897e-11 (fails 30) via place_missing noop
[ 70120 evals] best 3.55584e-11 (fails 30) via core_undivide noop
[ 72120 evals] best 3.56615e-11 (fails 30) via place_missing noop
[ 77640 evals] best 7.76357e-11 (fails 29) via rotate 0/rlrr
[ 80760 evals] best 7.81409e-11 (fails 29) via place_missing noop
[ 89000 evals] best 7.86684e-11 (fails 29) via core_undivide noop
[ 92840 evals] best 7.92192e-11 (fails 29) via core_undivide noop
[ 94760 evals] best 7.97367e-11 (fails 29) via retype 0/lllrll->st1
[105640 evals] best 9.11925e-11 (fails 29) via rotate 0/rlrl
[112920 evals] best 1.43742e-10 (fails 28) via swap 0/rlrrl
[148680 evals] best 1.70784e-10 (fails 28) via swap 0/rlrrl
[191800 evals] best 1.92624e-10 (fails 28) via retype 0/rlrrll->O
[211160 evals] best 1.99568e-10 (fails 28) via rotate 0/rrrlr
[273560 evals] best 3.37479e-10 (fails 27) via divide 0/rrll
[295640 evals] best 6.6851e-10 (fails 26) via level_retype 1/lrrlrl<->0/rrllr
[300520 evals] best 6.71575e-10 (fails 26) via core_undivide noop
[304840 evals] best 6.73945e-10 (fails 26) via core_undivide noop
[305160 evals] best 6.76176e-10 (fails 26) via core_undivide noop
[308760 evals] best 6.77048e-10 (fails 26) via place_missing noop
[314360 evals] best 8.51018e-10 (fails 26) via divide 0/llrlr
[320280 evals] best 8.53835e-10 (fails 26) via level_retype 1/llrlllr<->0/rrlr
[321240 evals] best 8.54936e-10 (fails 26) via swap 0/rrrlrl
[411880 evals] best 8.80111e-10 (fails 26) via undivide 0/lllrl
[458040 evals] best 1.55881e-09 (fails 25) via crossover lllrl<->lrrr
[491720 evals] best 1.80936e-09 (fails 25) via crossover rlrrll<->llrlrr
[515000 evals] best 2.24132e-09 (fails 25) via rotate 1/lrrlr
[600440 evals] best 2.28188e-09 (fails 25) via undivide 0/rrrll
[633960 evals] best 3.87563e-09 (fails 24) via retype 1/rllrr->st1
[660680 evals] best 4.58847e-09 (fails 24) via retype 1/rllrr->C
[670120 evals] best 4.5971e-09 (fails 24) via core_undivide noop
[673000 evals] best 4.60863e-09 (fails 24) via swap 0/rrrlrl
[673720 evals] best 4.73211e-09 (fails 24) via retype 1/rrll->O
[677160 evals] best 4.7494e-09 (fails 24) via place_missing noop
[681160 evals] best 4.75775e-09 (fails 24) via core_undivide noop
[689240 evals] best 4.86041e-09 (fails 24) via undivide 1/lrrll
[695640 evals] best 4.86569e-09 (fails 24) via place_missing noop
[703480 evals] best 4.86831e-09 (fails 24) via core_undivide noop
[704360 evals] best 4.8863e-09 (fails 24) via swap 0/rrll
[705480 evals] best 4.89938e-09 (fails 24) via place_missing noop
[707000 evals] best 4.90287e-09 (fails 24) via crossover llrlrr<->rrrr
[708040 evals] best 4.90394e-09 (fails 24) via core_undivide noop
[713400 evals] best 5.00798e-09 (fails 24) via undivide 1/lrrll
[724040 evals] best 5.11809e-09 (fails 24) via undivide 1/lrrll
[735000 evals] best 5.15421e-09 (fails 24) via undivide 1/rlllr
[746200 evals] best 5.15486e-09 (fails 24) via undivide 0/rrrll
[768360 evals] best 5.26248e-09 (fails 24) via undivide 1/rlllr
[800920 evals] best 5.26644e-09 (fails 24) via undivide 1/rlllr
[827880 evals] best 5.26644e-09 (fails 24) via crossover lrllr<->llrlr
[878680 evals] best 5.32211e-09 (fails 24) via level_retype 1/llrllll<->0/rllrl
[1103320 evals] best 1.06348e-08 (fails 23) via undivide 0/rrrlrl
[1116440 evals] best 1.12572e-08 (fails 23) via divide 0/rlrrll
[1149800 evals] best 1.14984e-08 (fails 23) via undivide 1/lrrll
[1382840 evals] best 1.15051e-08 (fails 23) via undivide 1/lrrll
[1387880 evals] best 1.15251e-08 (fails 23) via rotate 0/rlrrl
[1390440 evals] best 1.33748e-08 (fails 23) via retype 1/llrrr->st1
[1437480 evals] best 1.33819e-08 (fails 23) via crossover llrlrl<->rrrr
[1438120 evals] best 1.34359e-08 (fails 23) via rotate 0/rlrrll
[1441720 evals] best 1.34477e-08 (fails 23) via core_divide noop
[1441960 evals] best 1.34988e-08 (fails 23) via place_missing noop
[1457640 evals] best 1.37468e-08 (fails 23) via undivide 0/llrllll
[1627960 evals] best 2.6523e-08 (fails 22) via level_retype 1/llrllll<->0/rrlll
[1629800 evals] best 2.65259e-08 (fails 22) via core_undivide noop
[1755560 evals] best 5.83384e-08 (fails 21) via divide 0/lllrl
[1805080 evals] best 1.18411e-07 (fails 20) via divide 0/lllrl
[1865880 evals] best 1.18411e-07 (fails 20) via undivide 0/rlrrll
[1880760 evals] best 1.88783e-07 (fails 19) via crossover rlrrll<->lrrr
[1956360 evals] best 2.10097e-07 (fails 19) via crossover rlrrlll<->lllrll
[1996840 evals] best 2.11465e-07 (fails 19) via retype 0/rlrrlll->C
[1997640 evals] best 2.11848e-07 (fails 19) via core_divide noop
[2007560 evals] best 2.35646e-07 (fails 19) via crossover rlrrlll<->lrrr
[2012360 evals] best 2.36973e-07 (fails 19) via place_missing noop
[2012760 evals] best 2.37399e-07 (fails 19) via place_missing noop
[2038680 evals] best 2.49379e-07 (fails 19) via rotate 0/rlrrl
[2045960 evals] best 4.54898e-07 (fails 18) via crossover lrrlrr<->llrlllr
[2046280 evals] best 4.55804e-07 (fails 18) via place_missing noop
[2046680 evals] best 4.56932e-07 (fails 18) via place_missing noop
[2047400 evals] best 4.57898e-07 (fails 18) via core_divide noop
[2064200 evals] best 4.58171e-07 (fails 18) via swap 0/rrll
[2064360 evals] best 4.58199e-07 (fails 18) via core_divide noop
[2065960 evals] best 4.58199e-07 (fails 18) via rotate 0/llrllll
[2066600 evals] best 4.59148e-07 (fails 18) via place_missing noop
[2067480 evals] best 4.5952e-07 (fails 18) via core_undivide noop
[2097480 evals] best 4.61537e-07 (fails 18) via place_missing noop
[2102040 evals] best 4.63543e-07 (fails 18) via place_missing noop
[2102440 evals] best 4.64431e-07 (fails 18) via core_undivide noop
[2164360 evals] best 4.72304e-07 (fails 18) via level_retype 0/lrrll<->1/lrlll
[2194440 evals] best 4.72706e-07 (fails 18) via rotate 0/lrrlr
[2195240 evals] best 4.73159e-07 (fails 18) via place_missing noop
[2197000 evals] best 4.73498e-07 (fails 18) via place_missing noop
[2209560 evals] best 4.75066e-07 (fails 18) via rotate 0/rrllr
[2280840 evals] best 4.8783e-07 (fails 18) via rotate 0/rlrrll
[2282840 evals] best 8.51649e-07 (fails 17) via level_retype 1/rrlrl<->0/llrllllr
[2288840 evals] best 8.55171e-07 (fails 17) via crossover lrrlrl<->llrlllll
[2289880 evals] best 8.55716e-07 (fails 17) via crossover lrrlrl<->llrllllr
[2291800 evals] best 8.5789e-07 (fails 17) via core_undivide noop
[2292440 evals] best 8.5798e-07 (fails 17) via place_missing noop
[2305560 evals] best 8.8011e-07 (fails 17) via undivide 1/llrrl
[2387000 evals] best 8.80152e-07 (fails 17) via undivide 1/llllr
[2389880 evals] best 8.85765e-07 (fails 17) via swap 0/rlrrll
[2390200 evals] best 8.89866e-07 (fails 17) via core_undivide noop
[2390360 evals] best 8.93447e-07 (fails 17) via place_missing noop
[2391320 evals] best 8.96723e-07 (fails 17) via place_missing noop
[2391560 evals] best 9.00224e-07 (fails 17) via place_missing noop
[2393800 evals] best 9.00342e-07 (fails 17) via core_undivide noop
[2395800 evals] best 9.00374e-07 (fails 17) via place_missing noop
[2430600 evals] best 1.02904e-06 (fails 17) via retype 0/rrlr->of
[2494040 evals] best 1.02964e-06 (fails 17) via level_retype 1/rrrlrr<->0/rrlr
[2494440 evals] best 1.03243e-06 (fails 17) via place_missing noop
[2495080 evals] best 1.03547e-06 (fails 17) via place_missing noop
[2495640 evals] best 1.03782e-06 (fails 17) via core_divide noop
[2502600 evals] best 1.04002e-06 (fails 17) via place_missing noop
[2504680 evals] best 1.04261e-06 (fails 17) via place_missing noop
[2505960 evals] best 1.04369e-06 (fails 17) via core_undivide noop
[2539560 evals] best 1.06976e-06 (fails 17) via undivide 1/rrrlrl
[2559160 evals] best 1.07167e-06 (fails 17) via undivide 1/rrrlrl
[2559720 evals] best 1.0724e-06 (fails 17) via place_missing noop
[2583720 evals] best 1.0724e-06 (fails 17) via crossover rlrrr<->lrllr
[2586280 evals] best 1.90952e-06 (fails 16) via divide 1/rlllr
[2640920 evals] best 2.00292e-06 (fails 16) via divide 1/rlllr
[2668680 evals] best 2.14664e-06 (fails 16) via divide 1/llllr
[2690200 evals] best 2.15597e-06 (fails 16) via crossover lrrl<->lrrl
[2693960 evals] best 4.1894e-06 (fails 15) via swap 1/rrrlr
[2784840 evals] best 4.19245e-06 (fails 15) via rotate 1/rrlrr
[2842120 evals] best 4.19245e-06 (fails 15) via divide 0/rrrr
--- done ---
elapsed : 308651.9s
evals : 3000040 across 37499 topologies
best : 4.19245e-06 (15 fails) via divide 0/rrrr
improvement history:
[ 200] 1.20049e-11 (seed)
[ 20520] 1.3603e-11 (rotate 0/rrl)
[ 23240] 1.36649e-11 (core_undivide noop)
[ 28200] 1.38185e-11 (core_undivide noop)
[ 34520] 2.01893e-11 (place_missing noop)
[ 35480] 2.79281e-11 (place_missing noop)
[ 36200] 2.80872e-11 (place_missing noop)
[ 40200] 2.8253e-11 (place_missing noop)
[ 41880] 2.84268e-11 (crossover llrlr<->llrlr)
[ 50920] 2.85753e-11 (place_missing noop)
[ 62280] 2.89517e-11 (crossover rlrr<->llrl)
[ 62600] 3.34689e-11 (core_undivide noop)
[ 63720] 3.40595e-11 (level_retype 0/lllrlr<->1/rllllr)
[ 64120] 3.46347e-11 (place_missing noop)
[ 65240] 3.48699e-11 (place_missing noop)
[ 66920] 3.50429e-11 (place_missing noop)
[ 68200] 3.52197e-11 (place_missing noop)
[ 69480] 3.53897e-11 (place_missing noop)
[ 70120] 3.55584e-11 (core_undivide noop)
[ 72120] 3.56615e-11 (place_missing noop)
[ 77640] 7.76357e-11 (rotate 0/rlrr)
[ 80760] 7.81409e-11 (place_missing noop)
[ 89000] 7.86684e-11 (core_undivide noop)
[ 92840] 7.92192e-11 (core_undivide noop)
[ 94760] 7.97367e-11 (retype 0/lllrll->st1)
[105640] 9.11925e-11 (rotate 0/rlrl)
[112920] 1.43742e-10 (swap 0/rlrrl)
[148680] 1.70784e-10 (swap 0/rlrrl)
[191800] 1.92624e-10 (retype 0/rlrrll->O)
[211160] 1.99568e-10 (rotate 0/rrrlr)
[273560] 3.37479e-10 (divide 0/rrll)
[295640] 6.6851e-10 (level_retype 1/lrrlrl<->0/rrllr)
[300520] 6.71575e-10 (core_undivide noop)
[304840] 6.73945e-10 (core_undivide noop)
[305160] 6.76176e-10 (core_undivide noop)
[308760] 6.77048e-10 (place_missing noop)
[314360] 8.51018e-10 (divide 0/llrlr)
[320280] 8.53835e-10 (level_retype 1/llrlllr<->0/rrlr)
[321240] 8.54936e-10 (swap 0/rrrlrl)
[411880] 8.80111e-10 (undivide 0/lllrl)
[458040] 1.55881e-09 (crossover lllrl<->lrrr)
[491720] 1.80936e-09 (crossover rlrrll<->llrlrr)
[515000] 2.24132e-09 (rotate 1/lrrlr)
[600440] 2.28188e-09 (undivide 0/rrrll)
[633960] 3.87563e-09 (retype 1/rllrr->st1)
[660680] 4.58847e-09 (retype 1/rllrr->C)
[670120] 4.5971e-09 (core_undivide noop)
[673000] 4.60863e-09 (swap 0/rrrlrl)
[673720] 4.73211e-09 (retype 1/rrll->O)
[677160] 4.7494e-09 (place_missing noop)
[681160] 4.75775e-09 (core_undivide noop)
[689240] 4.86041e-09 (undivide 1/lrrll)
[695640] 4.86569e-09 (place_missing noop)
[703480] 4.86831e-09 (core_undivide noop)
[704360] 4.8863e-09 (swap 0/rrll)
[705480] 4.89938e-09 (place_missing noop)
[707000] 4.90287e-09 (crossover llrlrr<->rrrr)
[708040] 4.90394e-09 (core_undivide noop)
[713400] 5.00798e-09 (undivide 1/lrrll)
[724040] 5.11809e-09 (undivide 1/lrrll)
[735000] 5.15421e-09 (undivide 1/rlllr)
[746200] 5.15486e-09 (undivide 0/rrrll)
[768360] 5.26248e-09 (undivide 1/rlllr)
[800920] 5.26644e-09 (undivide 1/rlllr)
[827880] 5.26644e-09 (crossover lrllr<->llrlr)
[878680] 5.32211e-09 (level_retype 1/llrllll<->0/rllrl)
[1103320] 1.06348e-08 (undivide 0/rrrlrl)
[1116440] 1.12572e-08 (divide 0/rlrrll)
[1149800] 1.14984e-08 (undivide 1/lrrll)
[1382840] 1.15051e-08 (undivide 1/lrrll)
[1387880] 1.15251e-08 (rotate 0/rlrrl)
[1390440] 1.33748e-08 (retype 1/llrrr->st1)
[1437480] 1.33819e-08 (crossover llrlrl<->rrrr)
[1438120] 1.34359e-08 (rotate 0/rlrrll)
[1441720] 1.34477e-08 (core_divide noop)
[1441960] 1.34988e-08 (place_missing noop)
[1457640] 1.37468e-08 (undivide 0/llrllll)
[1627960] 2.6523e-08 (level_retype 1/llrllll<->0/rrlll)
[1629800] 2.65259e-08 (core_undivide noop)
[1755560] 5.83384e-08 (divide 0/lllrl)
[1805080] 1.18411e-07 (divide 0/lllrl)
[1865880] 1.18411e-07 (undivide 0/rlrrll)
[1880760] 1.88783e-07 (crossover rlrrll<->lrrr)
[1956360] 2.10097e-07 (crossover rlrrlll<->lllrll)
[1996840] 2.11465e-07 (retype 0/rlrrlll->C)
[1997640] 2.11848e-07 (core_divide noop)
[2007560] 2.35646e-07 (crossover rlrrlll<->lrrr)
[2012360] 2.36973e-07 (place_missing noop)
[2012760] 2.37399e-07 (place_missing noop)
[2038680] 2.49379e-07 (rotate 0/rlrrl)
[2045960] 4.54898e-07 (crossover lrrlrr<->llrlllr)
[2046280] 4.55804e-07 (place_missing noop)
[2046680] 4.56932e-07 (place_missing noop)
[2047400] 4.57898e-07 (core_divide noop)
[2064200] 4.58171e-07 (swap 0/rrll)
[2064360] 4.58199e-07 (core_divide noop)
[2065960] 4.58199e-07 (rotate 0/llrllll)
[2066600] 4.59148e-07 (place_missing noop)
[2067480] 4.5952e-07 (core_undivide noop)
[2097480] 4.61537e-07 (place_missing noop)
[2102040] 4.63543e-07 (place_missing noop)
[2102440] 4.64431e-07 (core_undivide noop)
[2164360] 4.72304e-07 (level_retype 0/lrrll<->1/lrlll)
[2194440] 4.72706e-07 (rotate 0/lrrlr)
[2195240] 4.73159e-07 (place_missing noop)
[2197000] 4.73498e-07 (place_missing noop)
[2209560] 4.75066e-07 (rotate 0/rrllr)
[2280840] 4.8783e-07 (rotate 0/rlrrll)
[2282840] 8.51649e-07 (level_retype 1/rrlrl<->0/llrllllr)
[2288840] 8.55171e-07 (crossover lrrlrl<->llrlllll)
[2289880] 8.55716e-07 (crossover lrrlrl<->llrllllr)
[2291800] 8.5789e-07 (core_undivide noop)
[2292440] 8.5798e-07 (place_missing noop)
[2305560] 8.8011e-07 (undivide 1/llrrl)
[2387000] 8.80152e-07 (undivide 1/llllr)
[2389880] 8.85765e-07 (swap 0/rlrrll)
[2390200] 8.89866e-07 (core_undivide noop)
[2390360] 8.93447e-07 (place_missing noop)
[2391320] 8.96723e-07 (place_missing noop)
[2391560] 9.00224e-07 (place_missing noop)
[2393800] 9.00342e-07 (core_undivide noop)
[2395800] 9.00374e-07 (place_missing noop)
[2430600] 1.02904e-06 (retype 0/rrlr->of)
[2494040] 1.02964e-06 (level_retype 1/rrrlrr<->0/rrlr)
[2494440] 1.03243e-06 (place_missing noop)
[2495080] 1.03547e-06 (place_missing noop)
[2495640] 1.03782e-06 (core_divide noop)
[2502600] 1.04002e-06 (place_missing noop)
[2504680] 1.04261e-06 (place_missing noop)
[2505960] 1.04369e-06 (core_undivide noop)
[2539560] 1.06976e-06 (undivide 1/rrrlrl)
[2559160] 1.07167e-06 (undivide 1/rrrlrl)
[2559720] 1.0724e-06 (place_missing noop)
[2583720] 1.0724e-06 (crossover rlrrr<->lrllr)
[2586280] 1.90952e-06 (divide 1/rlllr)
[2640920] 2.00292e-06 (divide 1/rlllr)
[2668680] 2.14664e-06 (divide 1/llllr)
[2690200] 2.15597e-06 (crossover lrrl<->lrrl)
[2693960] 4.1894e-06 (swap 1/rrrlr)
[2784840] 4.19245e-06 (rotate 1/rrlrr)
[2842120] 4.19245e-06 (divide 0/rrrr)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols-2.dom

View file

@ -0,0 +1,83 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols-2.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols-3.dom
[ 200 evals] best 4.27026e-06 (fails 15) via seed
[ 280 evals] best 4.28413e-06 (fails 15) via place_missing noop
[ 440 evals] best 4.29565e-06 (fails 15) via place_missing noop
[ 81640 evals] best 4.29764e-06 (fails 15) via divide 0/lllrlr
[180440 evals] best 4.29764e-06 (fails 15) via crossover rrrr<->rrrrl
[182680 evals] best 4.41808e-06 (fails 15) via level_retype 1/rlllr<->0/rllll
[182920 evals] best 4.47038e-06 (fails 15) via core_divide noop
[183480 evals] best 4.48493e-06 (fails 15) via place_missing noop
[184920 evals] best 4.49102e-06 (fails 15) via core_divide noop
[204280 evals] best 4.54272e-06 (fails 15) via undivide 0/rrrr
[327400 evals] best 4.58752e-06 (fails 15) via divide 0/llrlr
[536760 evals] best 4.71291e-06 (fails 15) via level_retype 1/llrllllr<->0/rlrrlr
[538200 evals] best 4.71436e-06 (fails 15) via core_divide noop
[538760 evals] best 4.7158e-06 (fails 15) via core_undivide noop
[540840 evals] best 4.71717e-06 (fails 15) via core_divide noop
[541960 evals] best 4.7176e-06 (fails 15) via undivide 0/lllrlr
[547640 evals] best 4.71761e-06 (fails 15) via place_missing noop
[557960 evals] best 4.71761e-06 (fails 15) via place_missing noop
[617800 evals] best 4.7182e-06 (fails 15) via rotate 1/llllr
[621400 evals] best 4.7191e-06 (fails 15) via place_missing noop
[621720 evals] best 4.71951e-06 (fails 15) via place_missing noop
[626200 evals] best 4.7251e-06 (fails 15) via rotate 1/llllr
[626360 evals] best 4.72553e-06 (fails 15) via level_retype 1/llllll<->0/lllrlrl
[626760 evals] best 4.72555e-06 (fails 15) via swap 1/lrrr
[627720 evals] best 4.72555e-06 (fails 15) via core_undivide noop
[637720 evals] best 4.74589e-06 (fails 15) via rotate 0/lrrlr
[781800 evals] best 4.95673e-06 (fails 15) via undivide 0/rllr
[821880 evals] best 4.95673e-06 (fails 15) via crossover rlrrr<->lrllr
[990520 evals] best 4.95673e-06 (fails 15) via crossover llrlllr<->lllrll
[1078760 evals] best 5.12527e-06 (fails 15) via level_retype 1/lrlll<->0/lrrll
[1288600 evals] best 5.12527e-06 (fails 15) via crossover rlrrr<->rlrrlll
[1543000 evals] best 5.13676e-06 (fails 15) via undivide 1/rrrll
[1700120 evals] interrupted — returning best-so-far
--- interrupted ---
elapsed : 211447.0s
evals : 1700120 across 21250 topologies
best : 5.13676e-06 (15 fails) via undivide 1/rrrll
improvement history:
[ 200] 4.27026e-06 (seed)
[ 280] 4.28413e-06 (place_missing noop)
[ 440] 4.29565e-06 (place_missing noop)
[ 81640] 4.29764e-06 (divide 0/lllrlr)
[180440] 4.29764e-06 (crossover rrrr<->rrrrl)
[182680] 4.41808e-06 (level_retype 1/rlllr<->0/rllll)
[182920] 4.47038e-06 (core_divide noop)
[183480] 4.48493e-06 (place_missing noop)
[184920] 4.49102e-06 (core_divide noop)
[204280] 4.54272e-06 (undivide 0/rrrr)
[327400] 4.58752e-06 (divide 0/llrlr)
[536760] 4.71291e-06 (level_retype 1/llrllllr<->0/rlrrlr)
[538200] 4.71436e-06 (core_divide noop)
[538760] 4.7158e-06 (core_undivide noop)
[540840] 4.71717e-06 (core_divide noop)
[541960] 4.7176e-06 (undivide 0/lllrlr)
[547640] 4.71761e-06 (place_missing noop)
[557960] 4.71761e-06 (place_missing noop)
[617800] 4.7182e-06 (rotate 1/llllr)
[621400] 4.7191e-06 (place_missing noop)
[621720] 4.71951e-06 (place_missing noop)
[626200] 4.7251e-06 (rotate 1/llllr)
[626360] 4.72553e-06 (level_retype 1/llllll<->0/lllrlrl)
[626760] 4.72555e-06 (swap 1/lrrr)
[627720] 4.72555e-06 (core_undivide noop)
[637720] 4.74589e-06 (rotate 0/lrrlr)
[781800] 4.95673e-06 (undivide 0/rllr)
[821880] 4.95673e-06 (crossover rlrrr<->lrllr)
[990520] 4.95673e-06 (crossover llrlllr<->lllrll)
[1078760] 5.12527e-06 (level_retype 1/lrlll<->0/lrrll)
[1288600] 5.12527e-06 (crossover rlrrr<->rlrrlll)
[1543000] 5.13676e-06 (undivide 1/rrrll)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols-3.dom

View file

@ -0,0 +1,347 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 2
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols.dom
[ 80 evals] best 2.31302e-32 (fails 96) via construct/0
[ 480 evals] best 6.28664e-31 (fails 95) via construct/5
[ 560 evals] best 8.41924e-29 (fails 85) via construct/6
[ 4960 evals] best 1.34818e-27 (fails 81) via core_undivide noop
[ 6960 evals] best 2.4105e-27 (fails 80) via swap 0/llrl
[ 7200 evals] best 2.74679e-27 (fails 80) via core_undivide noop
[ 7920 evals] best 2.83639e-27 (fails 80) via level_compound_fix noop
[ 8400 evals] best 2.97407e-27 (fails 80) via core_divide noop
[ 8880 evals] best 3.06629e-25 (fails 77) via crossover rrrlr<->lllrl
[ 9280 evals] best 3.14266e-25 (fails 77) via crossover lrrr<->lrrr
[ 11600 evals] best 3.20337e-25 (fails 77) via rotate 0/rrlr
[ 13040 evals] best 3.53297e-25 (fails 77) via level_fix noop
[ 14080 evals] best 3.5972e-25 (fails 77) via level_fix noop
[ 15840 evals] best 3.63357e-25 (fails 77) via crossover llrll<->rrrlrr
[ 16400 evals] best 7.14959e-25 (fails 76) via level_fix noop
[ 16640 evals] best 1.27296e-24 (fails 75) via crossover llrll<->rrlrr
[ 17280 evals] best 1.42988e-24 (fails 75) via divide 0/lllrl
[ 18240 evals] best 1.44306e-24 (fails 75) via core_undivide noop
[ 18720 evals] best 1.45696e-24 (fails 75) via level_fix noop
[ 19760 evals] best 2.43981e-24 (fails 74) via crossover llrll<->rrlrr
[ 20000 evals] best 5.6713e-23 (fails 70) via level_retype 1/rrlr<->0/llrll
[ 20240 evals] best 5.71376e-23 (fails 70) via divide 1/rrrr
[ 22000 evals] best 5.7467e-23 (fails 70) via crossover rrlrl<->lrrr
[ 24560 evals] best 1.92643e-21 (fails 65) via divide 0/rlllr
[ 35120 evals] best 3.38477e-21 (fails 64) via swap 1/rrll
[ 36720 evals] best 4.9027e-19 (fails 57) via rotate 0/ll
[ 37280 evals] best 4.95587e-19 (fails 57) via place_missing noop
[ 37360 evals] best 4.9954e-19 (fails 57) via core_undivide noop
[ 38160 evals] best 5.00695e-19 (fails 57) via swap 1/lrrr
[ 38640 evals] best 5.03632e-19 (fails 57) via place_missing noop
[ 39280 evals] best 5.07858e-19 (fails 57) via core_undivide noop
[ 42960 evals] best 5.08967e-19 (fails 57) via core_undivide noop
[ 43440 evals] best 5.12733e-19 (fails 57) via place_missing noop
[ 48880 evals] best 5.15373e-19 (fails 57) via core_undivide noop
[ 49280 evals] best 5.16595e-19 (fails 57) via place_missing noop
[ 49680 evals] best 1.00953e-18 (fails 56) via swap 1/rrll
[ 53120 evals] best 1.01793e-18 (fails 56) via place_missing noop
[ 53760 evals] best 1.02547e-18 (fails 56) via place_missing noop
[ 54080 evals] best 1.03319e-18 (fails 56) via place_missing noop
[ 54320 evals] best 1.03737e-18 (fails 56) via place_missing noop
[ 56000 evals] best 1.03961e-18 (fails 56) via place_missing noop
[ 56240 evals] best 4.35991e-18 (fails 54) via swap 0/lrll
[ 56720 evals] best 4.36779e-18 (fails 54) via place_missing noop
[ 65120 evals] best 8.78657e-18 (fails 53) via divide 1/rllll
[ 70960 evals] best 3.31653e-17 (fails 51) via divide 0/rlrlr
[ 77360 evals] best 3.46433e-17 (fails 51) via crossover rlllrl<->rrrlrl
[ 77600 evals] best 3.47232e-17 (fails 51) via core_undivide noop
[ 77760 evals] best 6.42852e-17 (fails 50) via crossover rlllr<->lrrr
[ 78240 evals] best 6.43986e-17 (fails 50) via core_undivide noop
[ 79440 evals] best 6.95809e-17 (fails 50) via place_missing noop
[ 81120 evals] best 6.98301e-17 (fails 50) via crossover rlllrl<->llrlr
[ 81840 evals] best 7.0239e-17 (fails 50) via undivide 0/rlllr
[ 84000 evals] best 1.39756e-16 (fails 49) via place_missing noop
[ 86560 evals] best 1.4024e-16 (fails 49) via swap 0/rrlr
[ 87440 evals] best 1.40525e-16 (fails 49) via place_missing noop
[ 88480 evals] best 1.40712e-16 (fails 49) via core_undivide noop
[ 92160 evals] best 1.4085e-16 (fails 49) via core_undivide noop
[ 93760 evals] best 1.41174e-16 (fails 49) via core_undivide noop
[ 94800 evals] best 1.4133e-16 (fails 49) via crossover rllr<->rllr
[ 95520 evals] best 1.4133e-16 (fails 49) via core_undivide noop
[ 99520 evals] best 1.41365e-16 (fails 49) via rotate 0/rrlr
[102960 evals] best 1.41384e-16 (fails 49) via core_undivide noop
[109200 evals] best 1.41384e-16 (fails 49) via core_undivide noop
[111360 evals] best 1.41385e-16 (fails 49) via crossover rrlr<->rrlr
[113120 evals] best 1.41385e-16 (fails 49) via crossover llll<->llll
[113440 evals] best 1.41385e-16 (fails 49) via place_missing noop
[113520 evals] best 1.41385e-16 (fails 49) via crossover llrlr<->rrlrl
[116400 evals] best 2.66356e-16 (fails 48) via divide 1/lrrlr
[119760 evals] best 2.67137e-16 (fails 48) via crossover llrlr<->lrrr
[122480 evals] best 2.67922e-16 (fails 48) via core_undivide noop
[126800 evals] best 2.68701e-16 (fails 48) via place_missing noop
[127040 evals] best 2.69471e-16 (fails 48) via crossover rrlrr<->rlllr
[130160 evals] best 2.70232e-16 (fails 48) via swap 0/rrlr
[130720 evals] best 2.7098e-16 (fails 48) via place_missing noop
[132000 evals] best 2.71716e-16 (fails 48) via core_undivide noop
[132880 evals] best 2.72318e-16 (fails 48) via crossover rr<->rr
[135040 evals] best 2.72653e-16 (fails 48) via place_missing noop
[135280 evals] best 2.73375e-16 (fails 48) via place_missing noop
[136880 evals] best 2.73418e-16 (fails 48) via place_missing noop
[148560 evals] best 4.16474e-16 (fails 47) via retype 1/llrrr->C
[151040 evals] best 4.17372e-16 (fails 47) via place_missing noop
[151280 evals] best 4.18474e-16 (fails 47) via crossover lrlr<->lrlr
[152640 evals] best 4.18814e-16 (fails 47) via level_retype 0/lrrr<->1/rlrr
[152960 evals] best 4.19542e-16 (fails 47) via core_undivide noop
[196160 evals] best 8.32838e-16 (fails 46) via divide 0/llrlr
[196480 evals] best 8.33448e-16 (fails 46) via core_undivide noop
[218000 evals] best 8.61697e-16 (fails 46) via core_undivide noop
[218320 evals] best 1.82549e-15 (fails 45) via crossover llrlrr<->rrrlrl
[220480 evals] best 1.84041e-15 (fails 45) via place_missing noop
[224800 evals] best 1.8471e-15 (fails 45) via place_missing noop
[227920 evals] best 1.8556e-15 (fails 45) via level_retype 0/lrrl<->1/rlrll
[229040 evals] best 1.88537e-15 (fails 45) via place_missing noop
[238240 evals] best 1.88614e-15 (fails 45) via core_undivide noop
[239360 evals] best 1.88691e-15 (fails 45) via place_missing noop
[239600 evals] best 1.89068e-15 (fails 45) via place_missing noop
[248080 evals] best 1.89301e-15 (fails 45) via rotate 0/rllr
[249120 evals] best 1.89476e-15 (fails 45) via undivide 1/rrrr
[251120 evals] best 1.90302e-15 (fails 45) via place_missing noop
[251440 evals] best 1.91171e-15 (fails 45) via core_undivide noop
[256240 evals] best 1.91628e-15 (fails 45) via level_compound_fix noop
[264160 evals] best 1.91864e-15 (fails 45) via undivide 1/rrll
[298240 evals] best 1.91968e-15 (fails 45) via rotate 0/llrlr
[350640 evals] best 3.20989e-15 (fails 44) via level_retype 1/rlllr<->0/llrlrl
[354960 evals] best 3.21594e-15 (fails 44) via place_missing noop
[356000 evals] best 3.25352e-15 (fails 44) via core_undivide noop
[364480 evals] best 3.52964e-15 (fails 44) via divide 1/lrlll
[398720 evals] best 6.85608e-15 (fails 43) via crossover lrrr<->rlllr
[405840 evals] best 6.90948e-15 (fails 43) via undivide 0/lrrr
[406080 evals] best 6.91101e-15 (fails 43) via crossover lrlr<->lrlr
[418640 evals] best 7.16851e-15 (fails 43) via divide 1/rlllr
[446080 evals] best 7.26349e-15 (fails 43) via retype 0/llrlrr->O
[454160 evals] best 7.32344e-15 (fails 43) via level_retype 1/rlllr<->0/rrlrr
[454800 evals] best 7.36787e-15 (fails 43) via level_compound_fix noop
[455760 evals] best 7.40312e-15 (fails 43) via core_undivide noop
[458000 evals] best 7.44497e-15 (fails 43) via level_fix noop
[459200 evals] best 7.44541e-15 (fails 43) via level_compound_fix noop
[465280 evals] best 7.44608e-15 (fails 43) via core_undivide noop
[472800 evals] best 7.46595e-15 (fails 43) via rotate 0/rrrlr
[486560 evals] best 7.89349e-15 (fails 43) via divide 1/lrrll
[487840 evals] best 7.91275e-15 (fails 43) via undivide 1/rrrlrr
[488640 evals] best 7.93254e-15 (fails 43) via level_compound_fix noop
[488800 evals] best 1.59054e-14 (fails 42) via crossover lrl<->lrl
[489760 evals] best 1.60641e-14 (fails 42) via undivide 1/rlllll
[491760 evals] best 1.61148e-14 (fails 42) via level_compound_fix noop
[492720 evals] best 1.61666e-14 (fails 42) via place_missing noop
[496320 evals] best 1.6771e-14 (fails 42) via crossover llrlrr<->rrrlrr
[545120 evals] best 1.69985e-14 (fails 42) via retype 0/llrlrr->O
[644400 evals] best 1.70134e-14 (fails 42) via crossover rllr<->rllr
[647760 evals] best 3.33347e-14 (fails 41) via divide 1/lllrl
[649280 evals] best 3.33715e-14 (fails 41) via place_missing noop
[651600 evals] best 3.34018e-14 (fails 41) via place_missing noop
[652640 evals] best 3.34846e-14 (fails 41) via swap 1/lrrr
[654160 evals] best 6.71114e-14 (fails 40) via place_missing noop
[656880 evals] best 6.71452e-14 (fails 40) via place_missing noop
[657200 evals] best 6.73373e-14 (fails 40) via level_retype 1/rlrr<->0/rrlrr
[659840 evals] best 6.73423e-14 (fails 40) via place_missing noop
[709280 evals] best 6.73966e-14 (fails 40) via place_missing noop
[712000 evals] best 6.74016e-14 (fails 40) via core_undivide noop
[715040 evals] best 6.74798e-14 (fails 40) via rotate 0/rrrlr
[715840 evals] best 6.75045e-14 (fails 40) via crossover rr<->rr
[730720 evals] best 1.17348e-13 (fails 39) via place_missing noop
[730960 evals] best 1.1892e-13 (fails 39) via place_missing noop
[733920 evals] best 1.20289e-13 (fails 39) via place_missing noop
[744000 evals] best 1.21233e-13 (fails 39) via place_missing noop
[746480 evals] best 1.2124e-13 (fails 39) via core_undivide noop
[756000 evals] best 2.30213e-13 (fails 38) via swap 1/lrrl
[845200 evals] best 2.30492e-13 (fails 38) via undivide 0/llrll
[855520 evals] best 3.95213e-13 (fails 37) via divide 1/llrll
[858240 evals] best 3.95218e-13 (fails 37) via place_missing noop
[954720 evals] best 3.95218e-13 (fails 37) via crossover llrrl<->rlllr
[1000720 evals] best 8.99351e-13 (fails 36) via divide 1/rrlr
[1013760 evals] best 9.49614e-13 (fails 36) via crossover llrlrr<->lrllr
[1020400 evals] best 2.10451e-12 (fails 35) via swap 1/rrlr
[1023280 evals] best 2.26139e-12 (fails 34) via crossover rrrr<->llrlrl
[1035200 evals] best 2.37266e-12 (fails 34) via crossover llrlrr<->lllrl
[1036080 evals] best 4.43872e-12 (fails 33) via rotate 0/rrrlr
[1056240 evals] best 4.43872e-12 (fails 33) via divide 1/llllll
[1140880 evals] best 1.16099e-11 (fails 32) via rotate 0/rllr
[1142080 evals] best 1.16252e-11 (fails 32) via place_missing noop
[1142240 evals] best 1.16499e-11 (fails 32) via retype 1/llrlr->st1
[1145760 evals] best 1.1659e-11 (fails 32) via place_missing noop
[1213120 evals] best 1.18556e-11 (fails 32) via divide 1/rlllr
[1217840 evals] best 1.18668e-11 (fails 32) via divide 0/llrlrl
[1227920 evals] best 1.19364e-11 (fails 32) via divide 0/lllrl
[1237600 evals] interrupted — returning best-so-far
--- interrupted ---
elapsed : 54933.2s
evals : 1237600 across 15470 topologies
best : 1.19364e-11 (32 fails) via divide 0/lllrl
improvement history:
[ 80] 2.31302e-32 (construct/0)
[ 480] 6.28664e-31 (construct/5)
[ 560] 8.41924e-29 (construct/6)
[ 4960] 1.34818e-27 (core_undivide noop)
[ 6960] 2.4105e-27 (swap 0/llrl)
[ 7200] 2.74679e-27 (core_undivide noop)
[ 7920] 2.83639e-27 (level_compound_fix noop)
[ 8400] 2.97407e-27 (core_divide noop)
[ 8880] 3.06629e-25 (crossover rrrlr<->lllrl)
[ 9280] 3.14266e-25 (crossover lrrr<->lrrr)
[ 11600] 3.20337e-25 (rotate 0/rrlr)
[ 13040] 3.53297e-25 (level_fix noop)
[ 14080] 3.5972e-25 (level_fix noop)
[ 15840] 3.63357e-25 (crossover llrll<->rrrlrr)
[ 16400] 7.14959e-25 (level_fix noop)
[ 16640] 1.27296e-24 (crossover llrll<->rrlrr)
[ 17280] 1.42988e-24 (divide 0/lllrl)
[ 18240] 1.44306e-24 (core_undivide noop)
[ 18720] 1.45696e-24 (level_fix noop)
[ 19760] 2.43981e-24 (crossover llrll<->rrlrr)
[ 20000] 5.6713e-23 (level_retype 1/rrlr<->0/llrll)
[ 20240] 5.71376e-23 (divide 1/rrrr)
[ 22000] 5.7467e-23 (crossover rrlrl<->lrrr)
[ 24560] 1.92643e-21 (divide 0/rlllr)
[ 35120] 3.38477e-21 (swap 1/rrll)
[ 36720] 4.9027e-19 (rotate 0/ll)
[ 37280] 4.95587e-19 (place_missing noop)
[ 37360] 4.9954e-19 (core_undivide noop)
[ 38160] 5.00695e-19 (swap 1/lrrr)
[ 38640] 5.03632e-19 (place_missing noop)
[ 39280] 5.07858e-19 (core_undivide noop)
[ 42960] 5.08967e-19 (core_undivide noop)
[ 43440] 5.12733e-19 (place_missing noop)
[ 48880] 5.15373e-19 (core_undivide noop)
[ 49280] 5.16595e-19 (place_missing noop)
[ 49680] 1.00953e-18 (swap 1/rrll)
[ 53120] 1.01793e-18 (place_missing noop)
[ 53760] 1.02547e-18 (place_missing noop)
[ 54080] 1.03319e-18 (place_missing noop)
[ 54320] 1.03737e-18 (place_missing noop)
[ 56000] 1.03961e-18 (place_missing noop)
[ 56240] 4.35991e-18 (swap 0/lrll)
[ 56720] 4.36779e-18 (place_missing noop)
[ 65120] 8.78657e-18 (divide 1/rllll)
[ 70960] 3.31653e-17 (divide 0/rlrlr)
[ 77360] 3.46433e-17 (crossover rlllrl<->rrrlrl)
[ 77600] 3.47232e-17 (core_undivide noop)
[ 77760] 6.42852e-17 (crossover rlllr<->lrrr)
[ 78240] 6.43986e-17 (core_undivide noop)
[ 79440] 6.95809e-17 (place_missing noop)
[ 81120] 6.98301e-17 (crossover rlllrl<->llrlr)
[ 81840] 7.0239e-17 (undivide 0/rlllr)
[ 84000] 1.39756e-16 (place_missing noop)
[ 86560] 1.4024e-16 (swap 0/rrlr)
[ 87440] 1.40525e-16 (place_missing noop)
[ 88480] 1.40712e-16 (core_undivide noop)
[ 92160] 1.4085e-16 (core_undivide noop)
[ 93760] 1.41174e-16 (core_undivide noop)
[ 94800] 1.4133e-16 (crossover rllr<->rllr)
[ 95520] 1.4133e-16 (core_undivide noop)
[ 99520] 1.41365e-16 (rotate 0/rrlr)
[102960] 1.41384e-16 (core_undivide noop)
[109200] 1.41384e-16 (core_undivide noop)
[111360] 1.41385e-16 (crossover rrlr<->rrlr)
[113120] 1.41385e-16 (crossover llll<->llll)
[113440] 1.41385e-16 (place_missing noop)
[113520] 1.41385e-16 (crossover llrlr<->rrlrl)
[116400] 2.66356e-16 (divide 1/lrrlr)
[119760] 2.67137e-16 (crossover llrlr<->lrrr)
[122480] 2.67922e-16 (core_undivide noop)
[126800] 2.68701e-16 (place_missing noop)
[127040] 2.69471e-16 (crossover rrlrr<->rlllr)
[130160] 2.70232e-16 (swap 0/rrlr)
[130720] 2.7098e-16 (place_missing noop)
[132000] 2.71716e-16 (core_undivide noop)
[132880] 2.72318e-16 (crossover rr<->rr)
[135040] 2.72653e-16 (place_missing noop)
[135280] 2.73375e-16 (place_missing noop)
[136880] 2.73418e-16 (place_missing noop)
[148560] 4.16474e-16 (retype 1/llrrr->C)
[151040] 4.17372e-16 (place_missing noop)
[151280] 4.18474e-16 (crossover lrlr<->lrlr)
[152640] 4.18814e-16 (level_retype 0/lrrr<->1/rlrr)
[152960] 4.19542e-16 (core_undivide noop)
[196160] 8.32838e-16 (divide 0/llrlr)
[196480] 8.33448e-16 (core_undivide noop)
[218000] 8.61697e-16 (core_undivide noop)
[218320] 1.82549e-15 (crossover llrlrr<->rrrlrl)
[220480] 1.84041e-15 (place_missing noop)
[224800] 1.8471e-15 (place_missing noop)
[227920] 1.8556e-15 (level_retype 0/lrrl<->1/rlrll)
[229040] 1.88537e-15 (place_missing noop)
[238240] 1.88614e-15 (core_undivide noop)
[239360] 1.88691e-15 (place_missing noop)
[239600] 1.89068e-15 (place_missing noop)
[248080] 1.89301e-15 (rotate 0/rllr)
[249120] 1.89476e-15 (undivide 1/rrrr)
[251120] 1.90302e-15 (place_missing noop)
[251440] 1.91171e-15 (core_undivide noop)
[256240] 1.91628e-15 (level_compound_fix noop)
[264160] 1.91864e-15 (undivide 1/rrll)
[298240] 1.91968e-15 (rotate 0/llrlr)
[350640] 3.20989e-15 (level_retype 1/rlllr<->0/llrlrl)
[354960] 3.21594e-15 (place_missing noop)
[356000] 3.25352e-15 (core_undivide noop)
[364480] 3.52964e-15 (divide 1/lrlll)
[398720] 6.85608e-15 (crossover lrrr<->rlllr)
[405840] 6.90948e-15 (undivide 0/lrrr)
[406080] 6.91101e-15 (crossover lrlr<->lrlr)
[418640] 7.16851e-15 (divide 1/rlllr)
[446080] 7.26349e-15 (retype 0/llrlrr->O)
[454160] 7.32344e-15 (level_retype 1/rlllr<->0/rrlrr)
[454800] 7.36787e-15 (level_compound_fix noop)
[455760] 7.40312e-15 (core_undivide noop)
[458000] 7.44497e-15 (level_fix noop)
[459200] 7.44541e-15 (level_compound_fix noop)
[465280] 7.44608e-15 (core_undivide noop)
[472800] 7.46595e-15 (rotate 0/rrrlr)
[486560] 7.89349e-15 (divide 1/lrrll)
[487840] 7.91275e-15 (undivide 1/rrrlrr)
[488640] 7.93254e-15 (level_compound_fix noop)
[488800] 1.59054e-14 (crossover lrl<->lrl)
[489760] 1.60641e-14 (undivide 1/rlllll)
[491760] 1.61148e-14 (level_compound_fix noop)
[492720] 1.61666e-14 (place_missing noop)
[496320] 1.6771e-14 (crossover llrlrr<->rrrlrr)
[545120] 1.69985e-14 (retype 0/llrlrr->O)
[644400] 1.70134e-14 (crossover rllr<->rllr)
[647760] 3.33347e-14 (divide 1/lllrl)
[649280] 3.33715e-14 (place_missing noop)
[651600] 3.34018e-14 (place_missing noop)
[652640] 3.34846e-14 (swap 1/lrrr)
[654160] 6.71114e-14 (place_missing noop)
[656880] 6.71452e-14 (place_missing noop)
[657200] 6.73373e-14 (level_retype 1/rlrr<->0/rrlrr)
[659840] 6.73423e-14 (place_missing noop)
[709280] 6.73966e-14 (place_missing noop)
[712000] 6.74016e-14 (core_undivide noop)
[715040] 6.74798e-14 (rotate 0/rrrlr)
[715840] 6.75045e-14 (crossover rr<->rr)
[730720] 1.17348e-13 (place_missing noop)
[730960] 1.1892e-13 (place_missing noop)
[733920] 1.20289e-13 (place_missing noop)
[744000] 1.21233e-13 (place_missing noop)
[746480] 1.2124e-13 (core_undivide noop)
[756000] 2.30213e-13 (swap 1/lrrl)
[845200] 2.30492e-13 (undivide 0/llrll)
[855520] 3.95213e-13 (divide 1/llrll)
[858240] 3.95218e-13 (place_missing noop)
[954720] 3.95218e-13 (crossover llrrl<->rlllr)
[1000720] 8.99351e-13 (divide 1/rrlr)
[1013760] 9.49614e-13 (crossover llrlrr<->lrllr)
[1020400] 2.10451e-12 (swap 1/rrlr)
[1023280] 2.26139e-12 (crossover rrrr<->llrlrl)
[1035200] 2.37266e-12 (crossover llrlrr<->lllrl)
[1036080] 4.43872e-12 (rotate 0/rrrlr)
[1056240] 4.43872e-12 (divide 1/llllll)
[1140880] 1.16099e-11 (rotate 0/rllr)
[1142080] 1.16252e-11 (place_missing noop)
[1142240] 1.16499e-11 (retype 1/llrlr->st1)
[1145760] 1.1659e-11 (place_missing noop)
[1213120] 1.18556e-11 (divide 1/rlllr)
[1217840] 1.18668e-11 (divide 0/llrlrl)
[1227920] 1.19364e-11 (divide 0/lllrl)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M-nols.dom

View file

@ -0,0 +1,234 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 2
rng seed : 0
leaf sharing : True (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M.dom
[ 80 evals] best 1.23724e-18 (fails 51) via construct/0
[ 160 evals] best 3.60774e-14 (fails 37) via construct/1
[ 4400 evals] best 3.92553e-14 (fails 37) via level_fix noop
[ 5600 evals] best 2.5324e-13 (fails 35) via divide 0/lrrr
[ 6560 evals] best 2.54766e-13 (fails 35) via crossover rrrl<->rrrl
[ 6800 evals] best 5.12736e-13 (fails 34) via core_divide noop
[ 8240 evals] best 5.20906e-13 (fails 34) via level_compound_fix noop
[ 11040 evals] best 5.21558e-13 (fails 34) via swap 0/lrl
[ 13200 evals] best 5.24939e-13 (fails 34) via core_divide noop
[ 14960 evals] best 5.27579e-13 (fails 34) via crossover lrrl<->lrrl
[ 15200 evals] best 5.31633e-13 (fails 34) via core_undivide noop
[ 15600 evals] best 2.18076e-12 (fails 32) via crossover rrrl<->rlrr
[ 15840 evals] best 2.21022e-12 (fails 32) via level_fix noop
[ 19120 evals] best 2.24186e-12 (fails 32) via level_compound_fix noop
[ 19360 evals] best 2.26499e-12 (fails 32) via level_compound_fix noop
[ 24960 evals] best 7.39417e-11 (fails 27) via undivide 1/rrl
[ 25360 evals] best 7.49515e-11 (fails 27) via core_undivide noop
[ 29200 evals] best 7.57633e-11 (fails 27) via core_undivide noop
[ 29680 evals] best 7.74529e-11 (fails 27) via level_fix noop
[ 35280 evals] best 7.86348e-11 (fails 27) via level_fix noop
[ 36880 evals] best 3.15641e-10 (fails 25) via level_retype 1/llrl<->0/rlrr
[ 37360 evals] best 3.16e-10 (fails 25) via level_fix noop
[ 39680 evals] best 3.16841e-10 (fails 25) via level_compound_fix noop
[ 40160 evals] best 3.1945e-10 (fails 25) via rotate 0/rlr
[ 40480 evals] best 3.2002e-10 (fails 25) via level_compound_fix noop
[ 41120 evals] best 3.20176e-10 (fails 25) via core_undivide noop
[ 42240 evals] best 3.20502e-10 (fails 25) via level_fix noop
[ 44000 evals] best 1.22813e-09 (fails 22) via swap 0/rll
[ 47120 evals] best 1.24341e-09 (fails 22) via crossover llrr<->llrr
[ 48400 evals] best 1.36186e-09 (fails 22) via swap 0/rrr
[ 55280 evals] best 1.37846e-09 (fails 22) via core_divide noop
[ 56080 evals] best 1.39462e-09 (fails 22) via core_undivide noop
[ 56880 evals] best 1.41015e-09 (fails 22) via level_compound_fix noop
[ 57680 evals] best 1.42485e-09 (fails 22) via core_divide noop
[ 58880 evals] best 1.43848e-09 (fails 22) via crossover lrl<->lrl
[ 59360 evals] best 1.45094e-09 (fails 22) via core_undivide noop
[ 61760 evals] best 2.44768e-08 (fails 21) via swap 0/lrl
[ 61920 evals] best 2.49476e-08 (fails 21) via level_compound_fix noop
[ 66320 evals] best 2.54089e-08 (fails 21) via level_fix noop
[ 71440 evals] best 5.14082e-08 (fails 20) via core_undivide noop
[ 76320 evals] best 6.34704e-08 (fails 20) via crossover lrl<->lrl
[ 79200 evals] best 6.37227e-08 (fails 20) via crossover lrrrl<->lrrrl
[ 79840 evals] best 6.38312e-08 (fails 20) via core_undivide noop
[ 80720 evals] best 6.39174e-08 (fails 20) via level_fix noop
[ 81200 evals] best 6.395e-08 (fails 20) via crossover rllr<->rllr
[100240 evals] best 1.19279e-07 (fails 19) via level_fix noop
[103280 evals] best 1.21428e-07 (fails 19) via crossover rrrr<->rlrr
[111440 evals] best 1.23503e-07 (fails 19) via level_fix noop
[111920 evals] best 1.25268e-07 (fails 19) via level_compound_fix noop
[114000 evals] best 1.26206e-07 (fails 19) via rotate 0/rrr
[115280 evals] best 1.26512e-07 (fails 19) via crossover rlrr<->lrlr
[123520 evals] best 1.3089e-07 (fails 19) via crossover rrrr<->lrrrr
[123840 evals] best 1.33083e-07 (fails 19) via level_fix noop
[124160 evals] best 1.33493e-07 (fails 19) via level_compound_fix noop
[130960 evals] best 1.54739e-07 (fails 19) via divide 1/llrl
[192960 evals] best 2.09792e-07 (fails 18) via core_divide lrlr (2 floors)
[194080 evals] best 2.21668e-07 (fails 18) via level_compound_fix noop
[194640 evals] best 2.21905e-07 (fails 18) via crossover lllll<->lllll
[197120 evals] best 2.42215e-07 (fails 18) via crossover llrr<->llrr
[200160 evals] best 2.56155e-07 (fails 18) via crossover lrlrl<->lrlrl
[202800 evals] best 2.56274e-07 (fails 18) via crossover rrrr<->lrll
[207200 evals] best 2.57268e-07 (fails 18) via core_undivide noop
[217840 evals] best 2.65752e-07 (fails 18) via level_compound_fix noop
[218880 evals] best 2.66338e-07 (fails 18) via level_fix noop
[218960 evals] best 2.66409e-07 (fails 18) via swap 0/lrlr
[222960 evals] best 2.81898e-07 (fails 18) via crossover l<->l
[224480 evals] best 2.81924e-07 (fails 18) via retype 0/lrll->st2
[278800 evals] best 2.93777e-07 (fails 18) via divide 1/lrrr
[279520 evals] best 2.93793e-07 (fails 18) via level_fix noop
[320640 evals] best 2.95862e-07 (fails 18) via rotate 0/rrr
[358880 evals] best 2.97323e-07 (fails 18) via rotate 0/rr
[367120 evals] best 3.04012e-07 (fails 18) via crossover lrll<->llllr
[417280 evals] best 1.18035e-06 (fails 16) via divide 1/rlr
[423680 evals] best 1.18063e-06 (fails 16) via level_fix noop
[427120 evals] best 1.18073e-06 (fails 16) via crossover l<->l
[432960 evals] best 1.18987e-06 (fails 16) via undivide 0/lrlr
[435360 evals] best 1.19002e-06 (fails 16) via swap 1/lrlr
[440960 evals] best 1.25608e-06 (fails 16) via retype 0/lrlrr->ef1
[443920 evals] best 2.24559e-06 (fails 15) via undivide 1/lrlr
[460640 evals] best 2.4213e-06 (fails 15) via undivide 1/lrlr
[474320 evals] best 2.4213e-06 (fails 15) via swap 0/lrl
[534160 evals] best 4.65676e-06 (fails 14) via divide 1/llrlr
[541600 evals] best 9.31353e-06 (fails 13) via level_compound_fix of: lvl1 → lvl0/rllr
[570800 evals] best 9.38995e-06 (fails 13) via level_fix of: lvl1/llrlrl → lvl0/rllr
[589600 evals] best 9.49326e-06 (fails 13) via swap 0/lrlr
[590240 evals] best 9.53324e-06 (fails 13) via level_fix noop
[591120 evals] best 9.56034e-06 (fails 13) via level_compound_fix noop
[592960 evals] best 9.58028e-06 (fails 13) via level_fix noop
[644000 evals] best 9.59623e-06 (fails 13) via rotate 0/lrlr
[688880 evals] best 9.8317e-06 (fails 13) via crossover rrl<->lrrrr
[689040 evals] best 9.85084e-06 (fails 13) via level_fix noop
[689760 evals] best 9.86664e-06 (fails 13) via core_undivide noop
[697680 evals] best 9.89198e-06 (fails 13) via rotate 0/rr
[785120 evals] best 9.91323e-06 (fails 13) via rotate 1/llrlr
[787760 evals] best 9.93767e-06 (fails 13) via undivide 0/llrr
[789920 evals] best 1.00029e-05 (fails 13) via rotate 0/rrr
[828560 evals] best 1.00451e-05 (fails 13) via crossover r<->r
[889840 evals] best 1.00699e-05 (fails 13) via undivide 0/llrr
[945840 evals] best 1.01801e-05 (fails 13) via divide 1/rlrl
[946480 evals] best 1.01803e-05 (fails 13) via swap 1/rlrl
[951520 evals] best 1.02053e-05 (fails 13) via undivide 0/llrr
[1085840 evals] best 1.02214e-05 (fails 13) via rotate 0/lrlr
[1382400 evals] best 1.02289e-05 (fails 13) via undivide 0/llrr
[1383120 evals] best 1.02309e-05 (fails 13) via level_fix noop
[1445040 evals] best 1.0247e-05 (fails 13) via rotate 0/lrlr
[2198240 evals] best 1.0247e-05 (fails 13) via crossover lrlrr<->llrrr
[2649680 evals] best 1.03342e-05 (fails 13) via divide 1/llrll
[2951680 evals] best 1.03342e-05 (fails 13) via divide 0/llllr
--- done ---
elapsed : 77682.2s
evals : 3000000 across 37500 topologies
best : 1.03342e-05 (13 fails) via divide 0/llllr
improvement history:
[ 80] 1.23724e-18 (construct/0)
[ 160] 3.60774e-14 (construct/1)
[ 4400] 3.92553e-14 (level_fix noop)
[ 5600] 2.5324e-13 (divide 0/lrrr)
[ 6560] 2.54766e-13 (crossover rrrl<->rrrl)
[ 6800] 5.12736e-13 (core_divide noop)
[ 8240] 5.20906e-13 (level_compound_fix noop)
[ 11040] 5.21558e-13 (swap 0/lrl)
[ 13200] 5.24939e-13 (core_divide noop)
[ 14960] 5.27579e-13 (crossover lrrl<->lrrl)
[ 15200] 5.31633e-13 (core_undivide noop)
[ 15600] 2.18076e-12 (crossover rrrl<->rlrr)
[ 15840] 2.21022e-12 (level_fix noop)
[ 19120] 2.24186e-12 (level_compound_fix noop)
[ 19360] 2.26499e-12 (level_compound_fix noop)
[ 24960] 7.39417e-11 (undivide 1/rrl)
[ 25360] 7.49515e-11 (core_undivide noop)
[ 29200] 7.57633e-11 (core_undivide noop)
[ 29680] 7.74529e-11 (level_fix noop)
[ 35280] 7.86348e-11 (level_fix noop)
[ 36880] 3.15641e-10 (level_retype 1/llrl<->0/rlrr)
[ 37360] 3.16e-10 (level_fix noop)
[ 39680] 3.16841e-10 (level_compound_fix noop)
[ 40160] 3.1945e-10 (rotate 0/rlr)
[ 40480] 3.2002e-10 (level_compound_fix noop)
[ 41120] 3.20176e-10 (core_undivide noop)
[ 42240] 3.20502e-10 (level_fix noop)
[ 44000] 1.22813e-09 (swap 0/rll)
[ 47120] 1.24341e-09 (crossover llrr<->llrr)
[ 48400] 1.36186e-09 (swap 0/rrr)
[ 55280] 1.37846e-09 (core_divide noop)
[ 56080] 1.39462e-09 (core_undivide noop)
[ 56880] 1.41015e-09 (level_compound_fix noop)
[ 57680] 1.42485e-09 (core_divide noop)
[ 58880] 1.43848e-09 (crossover lrl<->lrl)
[ 59360] 1.45094e-09 (core_undivide noop)
[ 61760] 2.44768e-08 (swap 0/lrl)
[ 61920] 2.49476e-08 (level_compound_fix noop)
[ 66320] 2.54089e-08 (level_fix noop)
[ 71440] 5.14082e-08 (core_undivide noop)
[ 76320] 6.34704e-08 (crossover lrl<->lrl)
[ 79200] 6.37227e-08 (crossover lrrrl<->lrrrl)
[ 79840] 6.38312e-08 (core_undivide noop)
[ 80720] 6.39174e-08 (level_fix noop)
[ 81200] 6.395e-08 (crossover rllr<->rllr)
[100240] 1.19279e-07 (level_fix noop)
[103280] 1.21428e-07 (crossover rrrr<->rlrr)
[111440] 1.23503e-07 (level_fix noop)
[111920] 1.25268e-07 (level_compound_fix noop)
[114000] 1.26206e-07 (rotate 0/rrr)
[115280] 1.26512e-07 (crossover rlrr<->lrlr)
[123520] 1.3089e-07 (crossover rrrr<->lrrrr)
[123840] 1.33083e-07 (level_fix noop)
[124160] 1.33493e-07 (level_compound_fix noop)
[130960] 1.54739e-07 (divide 1/llrl)
[192960] 2.09792e-07 (core_divide lrlr (2 floors))
[194080] 2.21668e-07 (level_compound_fix noop)
[194640] 2.21905e-07 (crossover lllll<->lllll)
[197120] 2.42215e-07 (crossover llrr<->llrr)
[200160] 2.56155e-07 (crossover lrlrl<->lrlrl)
[202800] 2.56274e-07 (crossover rrrr<->lrll)
[207200] 2.57268e-07 (core_undivide noop)
[217840] 2.65752e-07 (level_compound_fix noop)
[218880] 2.66338e-07 (level_fix noop)
[218960] 2.66409e-07 (swap 0/lrlr)
[222960] 2.81898e-07 (crossover l<->l)
[224480] 2.81924e-07 (retype 0/lrll->st2)
[278800] 2.93777e-07 (divide 1/lrrr)
[279520] 2.93793e-07 (level_fix noop)
[320640] 2.95862e-07 (rotate 0/rrr)
[358880] 2.97323e-07 (rotate 0/rr)
[367120] 3.04012e-07 (crossover lrll<->llllr)
[417280] 1.18035e-06 (divide 1/rlr)
[423680] 1.18063e-06 (level_fix noop)
[427120] 1.18073e-06 (crossover l<->l)
[432960] 1.18987e-06 (undivide 0/lrlr)
[435360] 1.19002e-06 (swap 1/lrlr)
[440960] 1.25608e-06 (retype 0/lrlrr->ef1)
[443920] 2.24559e-06 (undivide 1/lrlr)
[460640] 2.4213e-06 (undivide 1/lrlr)
[474320] 2.4213e-06 (swap 0/lrl)
[534160] 4.65676e-06 (divide 1/llrlr)
[541600] 9.31353e-06 (level_compound_fix of: lvl1 → lvl0/rllr)
[570800] 9.38995e-06 (level_fix of: lvl1/llrlrl → lvl0/rllr)
[589600] 9.49326e-06 (swap 0/lrlr)
[590240] 9.53324e-06 (level_fix noop)
[591120] 9.56034e-06 (level_compound_fix noop)
[592960] 9.58028e-06 (level_fix noop)
[644000] 9.59623e-06 (rotate 0/lrlr)
[688880] 9.8317e-06 (crossover rrl<->lrrrr)
[689040] 9.85084e-06 (level_fix noop)
[689760] 9.86664e-06 (core_undivide noop)
[697680] 9.89198e-06 (rotate 0/rr)
[785120] 9.91323e-06 (rotate 1/llrlr)
[787760] 9.93767e-06 (undivide 0/llrr)
[789920] 1.00029e-05 (rotate 0/rrr)
[828560] 1.00451e-05 (crossover r<->r)
[889840] 1.00699e-05 (undivide 0/llrr)
[945840] 1.01801e-05 (divide 1/rlrl)
[946480] 1.01803e-05 (swap 1/rlrl)
[951520] 1.02053e-05 (undivide 0/llrr)
[1085840] 1.02214e-05 (rotate 0/lrlr)
[1382400] 1.02289e-05 (undivide 0/llrr)
[1383120] 1.02309e-05 (level_fix noop)
[1445040] 1.0247e-05 (rotate 0/lrlr)
[2198240] 1.0247e-05 (crossover lrlrr<->llrrr)
[2649680] 1.03342e-05 (divide 1/llrll)
[2951680] 1.03342e-05 (divide 0/llllr)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M.dom

View file

@ -0,0 +1,463 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/init.dom
programme : harbor-house
budget : 1500000
pop : 16
child_budget : 80
workers : 4
rng seed : 0
leaf sharing : True (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-anneal-3M.dom
anneal grain : (4, 3, 2) → off (polish 1500000)
[anneal] phase 1/3: grain 4, budget 500000 (construct population)
[ 80 evals] best 2.08665e-19 (fails 51) via construct/0
[ 560 evals] best 5.36487e-16 (fails 41) via construct/6
[ 880 evals] best 8.24937e-16 (fails 40) via construct/10
[ 1920 evals] best 3.40701e-15 (fails 38) via level_fix noop
[ 2560 evals] best 3.54792e-15 (fails 38) via level_retype 1/rlr<->0/rrlr
[ 5600 evals] best 7.10621e-15 (fails 37) via divide 1/lllr
[ 5840 evals] best 7.22073e-15 (fails 37) via core_divide noop
[ 8720 evals] best 8.05574e-15 (fails 37) via core_divide noop
[ 9520 evals] best 9.60644e-15 (fails 37) via level_compound_fix noop
[ 9760 evals] best 9.70633e-15 (fails 37) via core_divide noop
[ 10240 evals] best 9.7388e-15 (fails 37) via crossover rrl<->rrl
[ 11360 evals] best 9.73885e-15 (fails 37) via core_undivide noop
[ 11440 evals] best 9.76347e-15 (fails 37) via core_undivide noop
[ 12560 evals] best 9.76353e-15 (fails 37) via level_fix noop
[ 13120 evals] best 9.80676e-15 (fails 37) via core_divide noop
[ 13200 evals] best 9.81434e-15 (fails 37) via core_undivide noop
[ 13760 evals] best 2.19875e-14 (fails 36) via swap 0/rrl
[ 14640 evals] best 2.21351e-14 (fails 36) via core_undivide noop
[ 16640 evals] best 3.12145e-14 (fails 35) via swap 0/lrl
[ 20080 evals] best 6.11965e-14 (fails 34) via rotate 0/lrr
[ 24560 evals] best 6.12446e-14 (fails 34) via core_undivide noop
[ 27280 evals] best 9.09789e-14 (fails 34) via undivide 0/llr
[ 29200 evals] best 9.09792e-14 (fails 34) via core_undivide noop
[ 31120 evals] best 9.09795e-14 (fails 34) via core_divide noop
[ 33120 evals] best 9.09799e-14 (fails 34) via core_divide noop
[ 33360 evals] best 9.09802e-14 (fails 34) via core_divide noop
[ 34640 evals] best 1.59113e-13 (fails 33) via crossover r<->r
[ 36720 evals] best 1.59546e-13 (fails 33) via core_divide noop
[ 45520 evals] best 1.98045e-13 (fails 33) via swap 0/rl
[ 47360 evals] best 1.98703e-13 (fails 33) via swap 0/rrl
[ 49520 evals] best 1.99037e-13 (fails 33) via core_divide noop
[ 50240 evals] best 7.31388e-13 (fails 31) via swap 0/rll
[ 50480 evals] best 7.31391e-13 (fails 31) via crossover rr<->rr
[ 52240 evals] best 7.31395e-13 (fails 31) via core_undivide noop
[ 58560 evals] best 7.31891e-13 (fails 31) via undivide 1/lllr
[ 58960 evals] best 7.31896e-13 (fails 31) via undivide 1/lllr
[ 65600 evals] best 7.31896e-13 (fails 31) via core_undivide noop
[ 67680 evals] best 7.31897e-13 (fails 31) via core_divide noop
[ 68160 evals] best 7.31897e-13 (fails 31) via retype 1/lllr->st2
[ 95360 evals] best 8.30056e-12 (fails 29) via divide 1/rrl
[ 99440 evals] best 8.30058e-12 (fails 29) via core_divide noop
[101840 evals] best 8.39142e-12 (fails 29) via level_retype 1/rlr<->0/rlr
[105200 evals] best 8.39887e-12 (fails 29) via core_divide noop
[112720 evals] best 8.41871e-12 (fails 29) via core_undivide noop
[117440 evals] best 8.44275e-12 (fails 29) via undivide 1/lrll
[117760 evals] best 8.4503e-12 (fails 29) via core_undivide noop
[122640 evals] best 8.47017e-12 (fails 29) via core_divide noop
[165280 evals] best 1.43128e-11 (fails 28) via divide 0/rrrrr
[168000 evals] best 1.45749e-11 (fails 28) via core_undivide noop
[170400 evals] best 1.68382e-11 (fails 28) via divide 1/rll
[172640 evals] best 1.71204e-11 (fails 28) via core_undivide noop
[178720 evals] best 1.79457e-11 (fails 28) via divide 0/lrr
[183680 evals] best 1.82521e-11 (fails 28) via core_divide noop
[190480 evals] best 1.85485e-11 (fails 28) via core_undivide noop
[190960 evals] best 1.89079e-11 (fails 28) via core_divide noop
[192000 evals] best 1.92475e-11 (fails 28) via core_undivide noop
[192240 evals] best 3.98705e-11 (fails 27) via rotate 0/lrr
[196400 evals] best 4.00667e-11 (fails 27) via divide 1/rrlr
[197760 evals] best 4.00667e-11 (fails 27) via retype 1/rrlrr->st2
[261200 evals] best 7.87414e-11 (fails 26) via crossover l<->l
[271200 evals] best 7.87477e-11 (fails 26) via core_divide noop
[274240 evals] best 7.96497e-11 (fails 26) via core_divide noop
[275040 evals] best 8.05626e-11 (fails 26) via core_undivide noop
[277040 evals] best 1.4805e-10 (fails 25) via undivide 0/rlll
[277600 evals] best 1.51268e-10 (fails 25) via core_divide noop
[283040 evals] best 3.12178e-10 (fails 24) via rotate 0/lrr
[313680 evals] best 3.12896e-10 (fails 24) via level_retype 1/rlr<->0/rlr
[340000 evals] best 6.89781e-10 (fails 23) via divide 1/rlll
[351440 evals] best 6.89742e-09 (fails 23) via core_undivide noop
[353280 evals] best 6.94596e-09 (fails 23) via core_undivide noop
[358400 evals] best 7.00355e-09 (fails 23) via core_undivide noop
[362720 evals] best 7.0692e-09 (fails 23) via swap 0/rrrrr
[364560 evals] best 7.14137e-09 (fails 23) via core_undivide noop
[365520 evals] best 7.20308e-09 (fails 23) via core_undivide noop
[365920 evals] best 7.23862e-09 (fails 23) via core_undivide noop
[373840 evals] best 7.23862e-09 (fails 23) via crossover rrrrrl<->rrll
[390880 evals] best 7.24269e-09 (fails 23) via rotate 0/lrr
[402480 evals] best 7.2467e-09 (fails 23) via crossover rrll<->lrrr
[422480 evals] best 1.02386e-08 (fails 23) via divide 1/rlll
[422720 evals] best 2.05575e-08 (fails 22) via divide 1/lrll
[455120 evals] best 2.30337e-08 (fails 22) via crossover lrrr<->rllr
[463120 evals] best 2.38566e-08 (fails 22) via level_retype 0/rlrl<->1/rlr
[466080 evals] best 4.78825e-08 (fails 21) via core_divide rrll (2 floors)
[483840 evals] best 9.76421e-08 (fails 20) via divide 1/lrll
[497440 evals] best 1.95284e-07 (fails 19) via crossover rrllr<->rrllr
[anneal] phase 2/3: grain 3, budget 500000 — unfolded 96 leaf-copies (share>3)
[ 200 evals] best 1.83626e-13 (fails 39) via anneal-seed/0
[ 4320 evals] best 1.83638e-13 (fails 39) via level_retype 0/lrrr<->1/rrlr
[ 7680 evals] best 1.83641e-13 (fails 39) via swap 1/llrrl
[ 8880 evals] best 3.62008e-13 (fails 38) via undivide 1/lrrr
[ 17120 evals] best 3.6202e-13 (fails 38) via core_undivide noop
[ 18080 evals] best 7.35588e-13 (fails 37) via undivide 1/llrrl
[ 18640 evals] best 7.35612e-13 (fails 37) via core_undivide noop
[ 28400 evals] best 1.3318e-12 (fails 36) via retype 1/lrrr->O
[ 48240 evals] best 1.39362e-12 (fails 36) via level_retype 1/llrrlr<->0/rllr
[ 48880 evals] best 1.39398e-12 (fails 36) via swap 1/llrrr
[ 53920 evals] best 1.4572e-12 (fails 36) via crossover rr<->rr
[ 56960 evals] best 1.45745e-12 (fails 36) via core_undivide noop
[ 60880 evals] best 1.7726e-12 (fails 35) via level_retype 0/llr<->1/rrlr
[ 63520 evals] best 5.87208e-12 (fails 34) via divide 1/rrrr
[ 66880 evals] best 1.22536e-11 (fails 33) via retype 0/rrrrrl->r
[ 68640 evals] best 2.42529e-11 (fails 32) via rotate 0/rrrrr
[ 71760 evals] best 2.43119e-11 (fails 32) via crossover lrl<->lrl
[ 72080 evals] best 2.43801e-11 (fails 32) via core_undivide noop
[ 78160 evals] best 2.43839e-11 (fails 32) via level_retype 0/lrrr<->1/rllr
[ 91600 evals] best 2.4769e-11 (fails 32) via level_retype 0/rllr<->1/rlr
[ 93760 evals] best 2.48387e-11 (fails 32) via divide 1/rlr
[ 96800 evals] best 2.50941e-11 (fails 32) via core_undivide noop
[103280 evals] best 2.51131e-11 (fails 32) via core_undivide noop
[119920 evals] best 2.51267e-11 (fails 32) via rotate 1/llrrr
[122800 evals] best 2.53283e-11 (fails 32) via core_undivide noop
[123600 evals] best 2.53618e-11 (fails 32) via core_undivide noop
[125520 evals] best 5.07696e-11 (fails 31) via crossover rrrrrr<->rlrr
[137680 evals] best 5.10394e-11 (fails 31) via retype 1/lrlll->of
[141280 evals] best 5.23793e-11 (fails 31) via undivide 0/rrrrr
[150320 evals] best 5.24022e-11 (fails 31) via core_undivide noop
[151200 evals] best 4.10836e-10 (fails 28) via crossover lrrl<->rrll
[186000 evals] best 4.11313e-10 (fails 28) via level_retype 1/llll<->0/rlrr
[192320 evals] best 4.11815e-10 (fails 28) via core_undivide noop
[202560 evals] best 4.12887e-10 (fails 28) via rotate 0/rlr
[216800 evals] best 8.7845e-10 (fails 27) via core_divide rrlll (2 floors)
[223120 evals] best 8.98065e-10 (fails 27) via core_divide rrlll (2 floors)
[225040 evals] best 9.19804e-10 (fails 27) via core_undivide noop
[228880 evals] best 9.3217e-10 (fails 27) via core_undivide noop
[233600 evals] best 9.87021e-10 (fails 27) via crossover rrrl<->rrrl
[234880 evals] best 9.90066e-10 (fails 27) via core_undivide noop
[235360 evals] best 1.88613e-09 (fails 26) via crossover rlrl<->lrrr
[243040 evals] best 1.88635e-09 (fails 26) via core_undivide noop
[288320 evals] best 1.88635e-09 (fails 26) via crossover lr<->lr
[310320 evals] best 7.90852e-09 (fails 24) via retype 0/rrlllr->r
[389200 evals] best 1.51646e-08 (fails 23) via rotate 1/llrll
[392960 evals] best 1.51781e-08 (fails 23) via undivide 0/rlr
[396000 evals] best 1.51869e-08 (fails 23) via undivide 1/llrll
[418240 evals] best 1.61363e-08 (fails 23) via divide 1/rlll
[419600 evals] best 3.04324e-08 (fails 22) via swap 0/rll
[444640 evals] best 3.11245e-08 (fails 22) via core_undivide noop
[453680 evals] best 5.97513e-08 (fails 21) via core_undivide noop
[458480 evals] best 6.06147e-08 (fails 21) via undivide 1/llrll
[459440 evals] best 6.14333e-08 (fails 21) via crossover rlrl<->rrllr
[464560 evals] best 6.19713e-08 (fails 21) via level_retype 0/lrrr<->1/lrlll
[467600 evals] best 6.2383e-08 (fails 21) via crossover llr<->llr
[468000 evals] best 6.25855e-08 (fails 21) via undivide 0/rlr
[anneal] phase 3/3: grain 2, budget 500000 — unfolded 128 leaf-copies (share>2)
[ 200 evals] best 3.28383e-15 (fails 45) via anneal-seed/0
[ 2400 evals] best 1.27109e-14 (fails 43) via anneal-seed/11
[ 4160 evals] best 1.27122e-14 (fails 43) via core_undivide noop
[ 4960 evals] best 1.27133e-14 (fails 43) via core_undivide noop
[ 5440 evals] best 1.27141e-14 (fails 43) via crossover rl<->rl
[ 6400 evals] best 2.54301e-14 (fails 42) via core_undivide noop
[ 8960 evals] best 2.54321e-14 (fails 42) via swap 0/llllr
[ 9760 evals] best 2.54342e-14 (fails 42) via swap 1/llrlr
[ 9920 evals] best 2.54547e-14 (fails 42) via undivide 0/rlr
[ 22960 evals] best 2.54569e-14 (fails 42) via core_undivide noop
[ 26080 evals] best 5.14279e-14 (fails 41) via rotate 0/lrlrr
[ 28720 evals] best 5.15142e-14 (fails 41) via core_undivide noop
[ 29040 evals] best 5.15186e-14 (fails 41) via core_undivide noop
[ 30000 evals] best 5.15297e-14 (fails 41) via swap 1/llrll
[ 31760 evals] best 5.15349e-14 (fails 41) via core_undivide noop
[ 32480 evals] best 5.20851e-14 (fails 41) via divide 1/llrlrl
[ 38160 evals] best 5.26944e-14 (fails 41) via core_undivide noop
[ 40160 evals] best 5.32798e-14 (fails 41) via crossover rrlrrl<->rrlrrl
[ 47040 evals] best 1.03522e-13 (fails 40) via divide 1/llrlrl
[ 54000 evals] best 3.8649e-13 (fails 38) via divide 0/rrlrrl
[ 54320 evals] best 3.88486e-13 (fails 38) via core_undivide noop
[ 65040 evals] best 3.89607e-13 (fails 38) via divide 1/lrrr
[ 66960 evals] best 3.89689e-13 (fails 38) via level_retype 0/lrrr<->1/rllr
[ 69840 evals] best 3.97558e-13 (fails 38) via swap 1/llrlrl
[ 71840 evals] best 4.01654e-13 (fails 38) via core_undivide noop
[ 74960 evals] best 2.66422e-11 (fails 32) via level_retype 1/lrlrrr<->0/rlrl
[ 79760 evals] best 2.67443e-11 (fails 32) via swap 1/llrll
[ 90480 evals] best 2.67755e-11 (fails 32) via core_undivide noop
[ 95840 evals] best 2.84823e-11 (fails 32) via divide 1/rrlr
[106080 evals] best 2.85064e-11 (fails 32) via core_undivide noop
[242160 evals] best 1.10468e-10 (fails 30) via level_retype 0/rrlllr<->1/lrlrl
[261840 evals] best 1.13005e-10 (fails 30) via rotate 0/lrlrr
[294080 evals] best 2.25842e-10 (fails 29) via level_retype 1/llrlrll<->0/rrlrrll
[304880 evals] best 4.3164e-10 (fails 28) via swap 0/rlr
[346880 evals] best 4.36981e-10 (fails 28) via rotate 0/lrlrr
[359680 evals] best 4.40945e-10 (fails 28) via swap 1/llrlrl
[381840 evals] best 9.00576e-10 (fails 27) via divide 0/lllr
[449040 evals] best 9.20992e-10 (fails 27) via rotate 0/lrlrr
[anneal] finish: de-share (grain off), polish 1500000 evals — unfolded 32 leaf-copies
[ 200 evals] best 1.79588e-12 (fails 36) via anneal-seed/0
[ 4800 evals] best 1.79593e-12 (fails 36) via place_missing noop
[ 15360 evals] best 1.79623e-12 (fails 36) via rotate 0/rrlrr
[ 36240 evals] best 3.50817e-12 (fails 35) via level_retype 1/llrrr<->0/rrlrl
[103120 evals] best 3.52062e-12 (fails 35) via undivide 1/rrrl
[123200 evals] best 1.26003e-11 (fails 33) via crossover llllrlr<->rrrrr
[127040 evals] best 1.26851e-11 (fails 33) via core_undivide noop
[128800 evals] best 1.27772e-11 (fails 33) via core_undivide noop
[131840 evals] best 2.32615e-11 (fails 32) via core_divide rrllr (2 floors)
[134480 evals] best 2.33823e-11 (fails 32) via place_missing noop
[135360 evals] best 2.34449e-11 (fails 32) via level_retype 1/rrrr<->0/rrlrrlr
[140880 evals] best 2.34579e-11 (fails 32) via place_missing noop
[141920 evals] best 2.34703e-11 (fails 32) via place_missing noop
[149040 evals] best 2.5583e-11 (fails 32) via level_retype 0/llllrlrl<->1/llrrl
[165520 evals] best 4.43277e-11 (fails 31) via undivide 0/rrllr
[173760 evals] best 4.5392e-11 (fails 31) via divide 1/lrlll
[174400 evals] best 4.55799e-11 (fails 31) via crossover l<->l
[181440 evals] best 4.57067e-11 (fails 31) via place_missing noop
[199920 evals] best 1.82608e-10 (fails 29) via level_retype 0/rrlrl<->1/rrllrr
[201600 evals] best 1.83115e-10 (fails 29) via core_undivide noop
[205360 evals] best 1.83224e-10 (fails 29) via swap 1/lrrll
[206960 evals] best 1.84394e-10 (fails 29) via place_missing noop
[207280 evals] best 1.85542e-10 (fails 29) via place_missing noop
[211360 evals] best 1.85715e-10 (fails 29) via undivide 0/lllr
[394320 evals] best 1.85916e-10 (fails 29) via rotate 0/lrlrr
[395200 evals] best 1.87069e-10 (fails 29) via place_missing noop
[396640 evals] best 1.87243e-10 (fails 29) via place_missing noop
[429680 evals] best 1.95082e-10 (fails 29) via level_retype 0/lrlrrr<->1/llrlrll
[531200 evals] best 7.98394e-10 (fails 27) via level_retype 0/llllrlrl<->1/llrlrll
[617520 evals] best 8.06466e-10 (fails 27) via undivide 0/lrll
[797200 evals] best 8.47009e-10 (fails 27) via level_retype 1/llrr<->0/lrrr
[846480 evals] best 8.84037e-10 (fails 27) via level_retype 1/lrlrrl<->0/rrlrrll
[969760 evals] best 8.94046e-10 (fails 27) via rotate 1/llrlrl
[1083680 evals] best 1.60805e-09 (fails 26) via swap 0/llllrlr
[1198960 evals] best 6.4322e-09 (fails 24) via level_retype 0/rrrrrl<->1/lrlrrl
[1357200 evals] best 1.21534e-08 (fails 23) via crossover rlr<->llllrlr
[1453360 evals] best 1.25851e-08 (fails 23) via swap 1/lrrll
[1454560 evals] best 1.25997e-08 (fails 23) via place_missing noop
[1455440 evals] best 1.26006e-08 (fails 23) via place_missing noop
[1465600 evals] best 1.26006e-08 (fails 23) via undivide 0/lllr
[1492400 evals] best 1.26278e-08 (fails 23) via undivide 1/llrlrll
--- done ---
elapsed : 79027.6s
evals : 3000000 across 37428 topologies
best : 1.26278e-08 (23 fails) via undivide 1/llrlrll
improvement history:
[ 80] 2.08665e-19 (g4:construct/0)
[ 560] 5.36487e-16 (g4:construct/6)
[ 880] 8.24937e-16 (g4:construct/10)
[ 1920] 3.40701e-15 (g4:level_fix noop)
[ 2560] 3.54792e-15 (g4:level_retype 1/rlr<->0/rrlr)
[ 5600] 7.10621e-15 (g4:divide 1/lllr)
[ 5840] 7.22073e-15 (g4:core_divide noop)
[ 8720] 8.05574e-15 (g4:core_divide noop)
[ 9520] 9.60644e-15 (g4:level_compound_fix noop)
[ 9760] 9.70633e-15 (g4:core_divide noop)
[ 10240] 9.7388e-15 (g4:crossover rrl<->rrl)
[ 11360] 9.73885e-15 (g4:core_undivide noop)
[ 11440] 9.76347e-15 (g4:core_undivide noop)
[ 12560] 9.76353e-15 (g4:level_fix noop)
[ 13120] 9.80676e-15 (g4:core_divide noop)
[ 13200] 9.81434e-15 (g4:core_undivide noop)
[ 13760] 2.19875e-14 (g4:swap 0/rrl)
[ 14640] 2.21351e-14 (g4:core_undivide noop)
[ 16640] 3.12145e-14 (g4:swap 0/lrl)
[ 20080] 6.11965e-14 (g4:rotate 0/lrr)
[ 24560] 6.12446e-14 (g4:core_undivide noop)
[ 27280] 9.09789e-14 (g4:undivide 0/llr)
[ 29200] 9.09792e-14 (g4:core_undivide noop)
[ 31120] 9.09795e-14 (g4:core_divide noop)
[ 33120] 9.09799e-14 (g4:core_divide noop)
[ 33360] 9.09802e-14 (g4:core_divide noop)
[ 34640] 1.59113e-13 (g4:crossover r<->r)
[ 36720] 1.59546e-13 (g4:core_divide noop)
[ 45520] 1.98045e-13 (g4:swap 0/rl)
[ 47360] 1.98703e-13 (g4:swap 0/rrl)
[ 49520] 1.99037e-13 (g4:core_divide noop)
[ 50240] 7.31388e-13 (g4:swap 0/rll)
[ 50480] 7.31391e-13 (g4:crossover rr<->rr)
[ 52240] 7.31395e-13 (g4:core_undivide noop)
[ 58560] 7.31891e-13 (g4:undivide 1/lllr)
[ 58960] 7.31896e-13 (g4:undivide 1/lllr)
[ 65600] 7.31896e-13 (g4:core_undivide noop)
[ 67680] 7.31897e-13 (g4:core_divide noop)
[ 68160] 7.31897e-13 (g4:retype 1/lllr->st2)
[ 95360] 8.30056e-12 (g4:divide 1/rrl)
[ 99440] 8.30058e-12 (g4:core_divide noop)
[101840] 8.39142e-12 (g4:level_retype 1/rlr<->0/rlr)
[105200] 8.39887e-12 (g4:core_divide noop)
[112720] 8.41871e-12 (g4:core_undivide noop)
[117440] 8.44275e-12 (g4:undivide 1/lrll)
[117760] 8.4503e-12 (g4:core_undivide noop)
[122640] 8.47017e-12 (g4:core_divide noop)
[165280] 1.43128e-11 (g4:divide 0/rrrrr)
[168000] 1.45749e-11 (g4:core_undivide noop)
[170400] 1.68382e-11 (g4:divide 1/rll)
[172640] 1.71204e-11 (g4:core_undivide noop)
[178720] 1.79457e-11 (g4:divide 0/lrr)
[183680] 1.82521e-11 (g4:core_divide noop)
[190480] 1.85485e-11 (g4:core_undivide noop)
[190960] 1.89079e-11 (g4:core_divide noop)
[192000] 1.92475e-11 (g4:core_undivide noop)
[192240] 3.98705e-11 (g4:rotate 0/lrr)
[196400] 4.00667e-11 (g4:divide 1/rrlr)
[197760] 4.00667e-11 (g4:retype 1/rrlrr->st2)
[261200] 7.87414e-11 (g4:crossover l<->l)
[271200] 7.87477e-11 (g4:core_divide noop)
[274240] 7.96497e-11 (g4:core_divide noop)
[275040] 8.05626e-11 (g4:core_undivide noop)
[277040] 1.4805e-10 (g4:undivide 0/rlll)
[277600] 1.51268e-10 (g4:core_divide noop)
[283040] 3.12178e-10 (g4:rotate 0/lrr)
[313680] 3.12896e-10 (g4:level_retype 1/rlr<->0/rlr)
[340000] 6.89781e-10 (g4:divide 1/rlll)
[351440] 6.89742e-09 (g4:core_undivide noop)
[353280] 6.94596e-09 (g4:core_undivide noop)
[358400] 7.00355e-09 (g4:core_undivide noop)
[362720] 7.0692e-09 (g4:swap 0/rrrrr)
[364560] 7.14137e-09 (g4:core_undivide noop)
[365520] 7.20308e-09 (g4:core_undivide noop)
[365920] 7.23862e-09 (g4:core_undivide noop)
[373840] 7.23862e-09 (g4:crossover rrrrrl<->rrll)
[390880] 7.24269e-09 (g4:rotate 0/lrr)
[402480] 7.2467e-09 (g4:crossover rrll<->lrrr)
[422480] 1.02386e-08 (g4:divide 1/rlll)
[422720] 2.05575e-08 (g4:divide 1/lrll)
[455120] 2.30337e-08 (g4:crossover lrrr<->rllr)
[463120] 2.38566e-08 (g4:level_retype 0/rlrl<->1/rlr)
[466080] 4.78825e-08 (g4:core_divide rrll (2 floors))
[483840] 9.76421e-08 (g4:divide 1/lrll)
[497440] 1.95284e-07 (g4:crossover rrllr<->rrllr)
[500200] 1.83626e-13 (g3:anneal-seed/0)
[504320] 1.83638e-13 (g3:level_retype 0/lrrr<->1/rrlr)
[507680] 1.83641e-13 (g3:swap 1/llrrl)
[508880] 3.62008e-13 (g3:undivide 1/lrrr)
[517120] 3.6202e-13 (g3:core_undivide noop)
[518080] 7.35588e-13 (g3:undivide 1/llrrl)
[518640] 7.35612e-13 (g3:core_undivide noop)
[528400] 1.3318e-12 (g3:retype 1/lrrr->O)
[548240] 1.39362e-12 (g3:level_retype 1/llrrlr<->0/rllr)
[548880] 1.39398e-12 (g3:swap 1/llrrr)
[553920] 1.4572e-12 (g3:crossover rr<->rr)
[556960] 1.45745e-12 (g3:core_undivide noop)
[560880] 1.7726e-12 (g3:level_retype 0/llr<->1/rrlr)
[563520] 5.87208e-12 (g3:divide 1/rrrr)
[566880] 1.22536e-11 (g3:retype 0/rrrrrl->r)
[568640] 2.42529e-11 (g3:rotate 0/rrrrr)
[571760] 2.43119e-11 (g3:crossover lrl<->lrl)
[572080] 2.43801e-11 (g3:core_undivide noop)
[578160] 2.43839e-11 (g3:level_retype 0/lrrr<->1/rllr)
[591600] 2.4769e-11 (g3:level_retype 0/rllr<->1/rlr)
[593760] 2.48387e-11 (g3:divide 1/rlr)
[596800] 2.50941e-11 (g3:core_undivide noop)
[603280] 2.51131e-11 (g3:core_undivide noop)
[619920] 2.51267e-11 (g3:rotate 1/llrrr)
[622800] 2.53283e-11 (g3:core_undivide noop)
[623600] 2.53618e-11 (g3:core_undivide noop)
[625520] 5.07696e-11 (g3:crossover rrrrrr<->rlrr)
[637680] 5.10394e-11 (g3:retype 1/lrlll->of)
[641280] 5.23793e-11 (g3:undivide 0/rrrrr)
[650320] 5.24022e-11 (g3:core_undivide noop)
[651200] 4.10836e-10 (g3:crossover lrrl<->rrll)
[686000] 4.11313e-10 (g3:level_retype 1/llll<->0/rlrr)
[692320] 4.11815e-10 (g3:core_undivide noop)
[702560] 4.12887e-10 (g3:rotate 0/rlr)
[716800] 8.7845e-10 (g3:core_divide rrlll (2 floors))
[723120] 8.98065e-10 (g3:core_divide rrlll (2 floors))
[725040] 9.19804e-10 (g3:core_undivide noop)
[728880] 9.3217e-10 (g3:core_undivide noop)
[733600] 9.87021e-10 (g3:crossover rrrl<->rrrl)
[734880] 9.90066e-10 (g3:core_undivide noop)
[735360] 1.88613e-09 (g3:crossover rlrl<->lrrr)
[743040] 1.88635e-09 (g3:core_undivide noop)
[788320] 1.88635e-09 (g3:crossover lr<->lr)
[810320] 7.90852e-09 (g3:retype 0/rrlllr->r)
[889200] 1.51646e-08 (g3:rotate 1/llrll)
[892960] 1.51781e-08 (g3:undivide 0/rlr)
[896000] 1.51869e-08 (g3:undivide 1/llrll)
[918240] 1.61363e-08 (g3:divide 1/rlll)
[919600] 3.04324e-08 (g3:swap 0/rll)
[944640] 3.11245e-08 (g3:core_undivide noop)
[953680] 5.97513e-08 (g3:core_undivide noop)
[958480] 6.06147e-08 (g3:undivide 1/llrll)
[959440] 6.14333e-08 (g3:crossover rlrl<->rrllr)
[964560] 6.19713e-08 (g3:level_retype 0/lrrr<->1/lrlll)
[967600] 6.2383e-08 (g3:crossover llr<->llr)
[968000] 6.25855e-08 (g3:undivide 0/rlr)
[1000200] 3.28383e-15 (g2:anneal-seed/0)
[1002400] 1.27109e-14 (g2:anneal-seed/11)
[1004160] 1.27122e-14 (g2:core_undivide noop)
[1004960] 1.27133e-14 (g2:core_undivide noop)
[1005440] 1.27141e-14 (g2:crossover rl<->rl)
[1006400] 2.54301e-14 (g2:core_undivide noop)
[1008960] 2.54321e-14 (g2:swap 0/llllr)
[1009760] 2.54342e-14 (g2:swap 1/llrlr)
[1009920] 2.54547e-14 (g2:undivide 0/rlr)
[1022960] 2.54569e-14 (g2:core_undivide noop)
[1026080] 5.14279e-14 (g2:rotate 0/lrlrr)
[1028720] 5.15142e-14 (g2:core_undivide noop)
[1029040] 5.15186e-14 (g2:core_undivide noop)
[1030000] 5.15297e-14 (g2:swap 1/llrll)
[1031760] 5.15349e-14 (g2:core_undivide noop)
[1032480] 5.20851e-14 (g2:divide 1/llrlrl)
[1038160] 5.26944e-14 (g2:core_undivide noop)
[1040160] 5.32798e-14 (g2:crossover rrlrrl<->rrlrrl)
[1047040] 1.03522e-13 (g2:divide 1/llrlrl)
[1054000] 3.8649e-13 (g2:divide 0/rrlrrl)
[1054320] 3.88486e-13 (g2:core_undivide noop)
[1065040] 3.89607e-13 (g2:divide 1/lrrr)
[1066960] 3.89689e-13 (g2:level_retype 0/lrrr<->1/rllr)
[1069840] 3.97558e-13 (g2:swap 1/llrlrl)
[1071840] 4.01654e-13 (g2:core_undivide noop)
[1074960] 2.66422e-11 (g2:level_retype 1/lrlrrr<->0/rlrl)
[1079760] 2.67443e-11 (g2:swap 1/llrll)
[1090480] 2.67755e-11 (g2:core_undivide noop)
[1095840] 2.84823e-11 (g2:divide 1/rrlr)
[1106080] 2.85064e-11 (g2:core_undivide noop)
[1242160] 1.10468e-10 (g2:level_retype 0/rrlllr<->1/lrlrl)
[1261840] 1.13005e-10 (g2:rotate 0/lrlrr)
[1294080] 2.25842e-10 (g2:level_retype 1/llrlrll<->0/rrlrrll)
[1304880] 4.3164e-10 (g2:swap 0/rlr)
[1346880] 4.36981e-10 (g2:rotate 0/lrlrr)
[1359680] 4.40945e-10 (g2:swap 1/llrlrl)
[1381840] 9.00576e-10 (g2:divide 0/lllr)
[1449040] 9.20992e-10 (g2:rotate 0/lrlrr)
[1500200] 1.79588e-12 (polish:anneal-seed/0)
[1504800] 1.79593e-12 (polish:place_missing noop)
[1515360] 1.79623e-12 (polish:rotate 0/rrlrr)
[1536240] 3.50817e-12 (polish:level_retype 1/llrrr<->0/rrlrl)
[1603120] 3.52062e-12 (polish:undivide 1/rrrl)
[1623200] 1.26003e-11 (polish:crossover llllrlr<->rrrrr)
[1627040] 1.26851e-11 (polish:core_undivide noop)
[1628800] 1.27772e-11 (polish:core_undivide noop)
[1631840] 2.32615e-11 (polish:core_divide rrllr (2 floors))
[1634480] 2.33823e-11 (polish:place_missing noop)
[1635360] 2.34449e-11 (polish:level_retype 1/rrrr<->0/rrlrrlr)
[1640880] 2.34579e-11 (polish:place_missing noop)
[1641920] 2.34703e-11 (polish:place_missing noop)
[1649040] 2.5583e-11 (polish:level_retype 0/llllrlrl<->1/llrrl)
[1665520] 4.43277e-11 (polish:undivide 0/rrllr)
[1673760] 4.5392e-11 (polish:divide 1/lrlll)
[1674400] 4.55799e-11 (polish:crossover l<->l)
[1681440] 4.57067e-11 (polish:place_missing noop)
[1699920] 1.82608e-10 (polish:level_retype 0/rrlrl<->1/rrllrr)
[1701600] 1.83115e-10 (polish:core_undivide noop)
[1705360] 1.83224e-10 (polish:swap 1/lrrll)
[1706960] 1.84394e-10 (polish:place_missing noop)
[1707280] 1.85542e-10 (polish:place_missing noop)
[1711360] 1.85715e-10 (polish:undivide 0/lllr)
[1894320] 1.85916e-10 (polish:rotate 0/lrlrr)
[1895200] 1.87069e-10 (polish:place_missing noop)
[1896640] 1.87243e-10 (polish:place_missing noop)
[1929680] 1.95082e-10 (polish:level_retype 0/lrlrrr<->1/llrlrll)
[2031200] 7.98394e-10 (polish:level_retype 0/llllrlrl<->1/llrlrll)
[2117520] 8.06466e-10 (polish:undivide 0/lrll)
[2297200] 8.47009e-10 (polish:level_retype 1/llrr<->0/lrrr)
[2346480] 8.84037e-10 (polish:level_retype 1/lrlrrl<->0/rrlrrll)
[2469760] 8.94046e-10 (polish:rotate 1/llrlrl)
[2583680] 1.60805e-09 (polish:swap 0/llllrlr)
[2698960] 6.4322e-09 (polish:level_retype 0/rrrrrl<->1/lrlrrl)
[2857200] 1.21534e-08 (polish:crossover rlr<->llllrlr)
[2953360] 1.25851e-08 (polish:swap 1/lrrll)
[2954560] 1.25997e-08 (polish:place_missing noop)
[2955440] 1.26006e-08 (polish:place_missing noop)
[2965600] 1.26006e-08 (polish:undivide 0/lllr)
[2992400] 1.26278e-08 (polish:undivide 1/llrlrll)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-anneal-3M.dom

View file

@ -0,0 +1,102 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-unfold.dom
programme : harbor-house
budget : 2200000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-unfold.dom
[ 200 evals] best 4.51297e-07 (fails 18) via seed
[116920 evals] best 4.58937e-07 (fails 18) via level_retype 0/rrl<->1/rrrr
[117400 evals] best 4.59593e-07 (fails 18) via place_missing noop
[118680 evals] best 4.59745e-07 (fails 18) via crossover rl<->rl
[118840 evals] best 4.59956e-07 (fails 18) via crossover lrrlrrl<->rlrlr
[119080 evals] best 4.60039e-07 (fails 18) via level_compound_fix st2: lvl0 → lvl1/rllr + insert st2 into llrlll/lvl1
[119320 evals] best 4.6052e-07 (fails 18) via crossover rlllrrl<->rrrll
[121800 evals] best 4.607e-07 (fails 18) via crossover lrrlrl<->rlrr
[122440 evals] best 4.60858e-07 (fails 18) via core_undivide noop
[122840 evals] best 4.60995e-07 (fails 18) via core_undivide noop
[155800 evals] best 4.60996e-07 (fails 18) via core_undivide noop
[208680 evals] best 4.62556e-07 (fails 18) via rotate 0/lrrlrr
[212120 evals] best 4.62561e-07 (fails 18) via core_undivide noop
[219960 evals] best 4.62609e-07 (fails 18) via rotate 0/lrlr
[293960 evals] best 4.62609e-07 (fails 18) via divide 0/rllr
[394120 evals] best 4.64255e-07 (fails 18) via crossover lrr<->lrr
[724200 evals] best 4.64744e-07 (fails 18) via level_retype 1/lrrlrr<->0/rrl
[761640 evals] best 4.64933e-07 (fails 18) via divide 0/lrrlrl
[766280 evals] best 4.64992e-07 (fails 18) via place_missing noop
[769560 evals] best 4.65067e-07 (fails 18) via place_missing noop
[770920 evals] best 4.65088e-07 (fails 18) via level_fix st2: lvl0/llrr → lvl1/rllr
[822680 evals] best 4.77975e-07 (fails 18) via level_retype 0/llrr<->1/llll
[826280 evals] best 9.39855e-07 (fails 17) via level_retype 1/lrrll<->0/rrl
[835400 evals] best 9.4021e-07 (fails 17) via rotate 0/rlrl
[856520 evals] best 1.12377e-06 (fails 17) via swap 0/llr
[858120 evals] best 1.12983e-06 (fails 17) via divide 1/llrlllr
[862600 evals] best 1.13527e-06 (fails 17) via core_undivide noop
[868600 evals] best 1.13594e-06 (fails 17) via level_retype 0/rllr<->1/llll
[942600 evals] best 1.15623e-06 (fails 17) via swap 0/rlllrr
[1054920 evals] best 1.15695e-06 (fails 17) via swap 1/lrrrl
[1200760 evals] best 1.20729e-06 (fails 17) via level_retype 1/lrll<->0/rrl
[1209240 evals] best 1.20801e-06 (fails 17) via crossover rlllr<->rlllr
[1495480 evals] best 2.38115e-06 (fails 16) via divide 0/rllr
[1571720 evals] best 2.38261e-06 (fails 16) via crossover rlllrr<->rlllrr
[1606120 evals] best 2.38363e-06 (fails 16) via rotate 0/rlrl
[1702040 evals] best 4.04178e-06 (fails 15) via divide 0/llrr
[1704520 evals] best 4.08878e-06 (fails 15) via divide 0/llllrll
[1706040 evals] best 4.13629e-06 (fails 15) via place_missing noop
[1706600 evals] best 4.18784e-06 (fails 15) via place_missing noop
[1707480 evals] best 4.19055e-06 (fails 15) via core_undivide noop
[1731800 evals] best 4.19125e-06 (fails 15) via core_undivide noop
[1791400 evals] best 4.19234e-06 (fails 15) via rotate 0/rlrl
--- done ---
elapsed : 155812.8s
evals : 2200040 across 27499 topologies
best : 4.19234e-06 (15 fails) via rotate 0/rlrl
improvement history:
[ 200] 4.51297e-07 (seed)
[116920] 4.58937e-07 (level_retype 0/rrl<->1/rrrr)
[117400] 4.59593e-07 (place_missing noop)
[118680] 4.59745e-07 (crossover rl<->rl)
[118840] 4.59956e-07 (crossover lrrlrrl<->rlrlr)
[119080] 4.60039e-07 (level_compound_fix st2: lvl0 → lvl1/rllr + insert st2 into llrlll/lvl1)
[119320] 4.6052e-07 (crossover rlllrrl<->rrrll)
[121800] 4.607e-07 (crossover lrrlrl<->rlrr)
[122440] 4.60858e-07 (core_undivide noop)
[122840] 4.60995e-07 (core_undivide noop)
[155800] 4.60996e-07 (core_undivide noop)
[208680] 4.62556e-07 (rotate 0/lrrlrr)
[212120] 4.62561e-07 (core_undivide noop)
[219960] 4.62609e-07 (rotate 0/lrlr)
[293960] 4.62609e-07 (divide 0/rllr)
[394120] 4.64255e-07 (crossover lrr<->lrr)
[724200] 4.64744e-07 (level_retype 1/lrrlrr<->0/rrl)
[761640] 4.64933e-07 (divide 0/lrrlrl)
[766280] 4.64992e-07 (place_missing noop)
[769560] 4.65067e-07 (place_missing noop)
[770920] 4.65088e-07 (level_fix st2: lvl0/llrr → lvl1/rllr)
[822680] 4.77975e-07 (level_retype 0/llrr<->1/llll)
[826280] 9.39855e-07 (level_retype 1/lrrll<->0/rrl)
[835400] 9.4021e-07 (rotate 0/rlrl)
[856520] 1.12377e-06 (swap 0/llr)
[858120] 1.12983e-06 (divide 1/llrlllr)
[862600] 1.13527e-06 (core_undivide noop)
[868600] 1.13594e-06 (level_retype 0/rllr<->1/llll)
[942600] 1.15623e-06 (swap 0/rlllrr)
[1054920] 1.15695e-06 (swap 1/lrrrl)
[1200760] 1.20729e-06 (level_retype 1/lrll<->0/rrl)
[1209240] 1.20801e-06 (crossover rlllr<->rlllr)
[1495480] 2.38115e-06 (divide 0/rllr)
[1571720] 2.38261e-06 (crossover rlllrr<->rlllrr)
[1606120] 2.38363e-06 (rotate 0/rlrl)
[1702040] 4.04178e-06 (divide 0/llrr)
[1704520] 4.08878e-06 (divide 0/llllrll)
[1706040] 4.13629e-06 (place_missing noop)
[1706600] 4.18784e-06 (place_missing noop)
[1707480] 4.19055e-06 (core_undivide noop)
[1731800] 4.19125e-06 (core_undivide noop)
[1791400] 4.19234e-06 (rotate 0/rlrl)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-unfold.dom

View file

@ -0,0 +1,305 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/materialised-3M.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-unfold.dom
[ 200 evals] best 2.99136e-19 (fails 58) via seed
[ 280 evals] best 3.01967e-19 (fails 58) via place_missing noop
[ 760 evals] best 3.03178e-19 (fails 58) via level_fix noop
[ 1080 evals] best 1.22315e-18 (fails 56) via undivide 1/rlrll
[ 1960 evals] best 4.88154e-18 (fails 54) via undivide 1/lllr
[ 4040 evals] best 4.88961e-18 (fails 54) via level_compound_fix noop
[ 7320 evals] best 4.99058e-18 (fails 54) via divide 0/rllr
[ 9560 evals] best 4.99975e-18 (fails 54) via undivide 0/llllr
[ 10680 evals] best 5.01755e-18 (fails 54) via place_missing noop
[ 11480 evals] best 9.99951e-18 (fails 53) via retype 0/rllrl->st1
[ 12840 evals] best 1.03122e-17 (fails 53) via crossover rrl<->lrrlrr
[ 12920 evals] best 4.06483e-17 (fails 51) via retype 0/rrrr->C
[ 16760 evals] best 7.97622e-17 (fails 50) via undivide 1/rlrll
[ 17800 evals] best 8.02921e-17 (fails 50) via rotate 0/llllr
[ 18120 evals] best 8.08633e-17 (fails 50) via swap 0/lrlr
[ 19160 evals] best 8.14312e-17 (fails 50) via level_fix noop
[ 22120 evals] best 1.21571e-15 (fails 46) via swap 0/lrrlr
[ 23640 evals] best 1.22179e-15 (fails 46) via level_fix noop
[ 30040 evals] best 1.22195e-15 (fails 46) via level_compound_fix noop
[ 30600 evals] best 1.22269e-15 (fails 46) via core_undivide noop
[ 31160 evals] best 1.22417e-15 (fails 46) via level_compound_fix noop
[ 31400 evals] best 1.22707e-15 (fails 46) via level_compound_fix noop
[ 31560 evals] best 1.22821e-15 (fails 46) via place_missing noop
[ 31800 evals] best 1.23179e-15 (fails 46) via place_missing noop
[ 32680 evals] best 1.23254e-15 (fails 46) via level_fix noop
[ 33560 evals] best 1.23401e-15 (fails 46) via core_undivide noop
[ 33880 evals] best 1.23468e-15 (fails 46) via place_missing noop
[ 34360 evals] best 4.40771e-15 (fails 44) via level_retype 0/rlllrl<->1/lrlrr
[ 37320 evals] best 4.45896e-15 (fails 44) via level_fix noop
[ 38280 evals] best 4.5458e-15 (fails 44) via undivide 1/llrr
[ 39080 evals] best 9.29164e-15 (fails 43) via level_compound_fix noop
[ 42040 evals] best 9.42528e-15 (fails 43) via core_undivide noop
[ 43160 evals] best 9.93886e-15 (fails 43) via level_fix noop
[ 44680 evals] best 9.96278e-15 (fails 43) via level_compound_fix noop
[ 47640 evals] best 9.97578e-15 (fails 43) via level_fix noop
[ 47800 evals] best 9.97622e-15 (fails 43) via place_missing noop
[ 48040 evals] best 9.99008e-15 (fails 43) via place_missing noop
[ 48920 evals] best 9.99411e-15 (fails 43) via level_fix noop
[ 49720 evals] best 1.03773e-14 (fails 43) via level_fix noop
[ 51560 evals] best 1.03962e-14 (fails 43) via level_fix noop
[ 52040 evals] best 1.03962e-14 (fails 43) via crossover llllrl<->llllrr
[ 53400 evals] best 1.77761e-14 (fails 42) via level_retype 0/lrlrl<->1/lllr
[ 53480 evals] best 1.77762e-14 (fails 42) via level_fix noop
[ 53640 evals] best 1.77763e-14 (fails 42) via rotate 0/llllr
[ 56600 evals] best 7.00332e-14 (fails 40) via place_missing r -> lrrrl
[ 58760 evals] best 7.07195e-14 (fails 40) via level_fix noop
[ 59240 evals] best 7.10585e-14 (fails 40) via level_fix noop
[ 59640 evals] best 7.16534e-14 (fails 40) via swap 0/lrlr
[ 63640 evals] best 5.51149e-13 (fails 37) via level_retype 1/lrrrlr<->0/llrr
[ 64120 evals] best 5.51653e-13 (fails 37) via core_undivide noop
[ 79880 evals] best 5.84975e-13 (fails 37) via crossover llrl<->rlllrl
[ 85720 evals] best 2.46536e-12 (fails 35) via divide 0/rllr
[ 86440 evals] best 2.46952e-12 (fails 35) via place_missing noop
[ 86760 evals] best 2.47109e-12 (fails 35) via place_missing noop
[ 87800 evals] best 2.47704e-12 (fails 35) via level_retype 0/lrrll<->1/llll
[ 89320 evals] best 2.47709e-12 (fails 35) via rotate 1/llrll
[ 90200 evals] best 2.48831e-12 (fails 35) via core_undivide noop
[ 96600 evals] best 2.49053e-12 (fails 35) via level_retype 0/lrll<->1/rlllrr
[100200 evals] best 2.49075e-12 (fails 35) via place_missing noop
[100440 evals] best 5.49415e-12 (fails 34) via retype 1/llrlll->st1
[101240 evals] best 5.51519e-12 (fails 34) via core_undivide noop
[102200 evals] best 5.53436e-12 (fails 34) via core_undivide noop
[102280 evals] best 2.14555e-11 (fails 32) via level_retype 0/lrll<->1/lllr
[108520 evals] best 2.57994e-11 (fails 32) via level_compound_fix ws1: lvl1 → lvl0/llr + insert n into rrrl/lvl0
[109560 evals] best 2.5808e-11 (fails 32) via place_missing noop
[110360 evals] best 2.59325e-11 (fails 32) via swap 0/rlrlr
[111560 evals] best 2.59762e-11 (fails 32) via place_missing noop
[112280 evals] best 2.60214e-11 (fails 32) via core_undivide noop
[113160 evals] best 2.60487e-11 (fails 32) via rotate 0/rllr
[115640 evals] best 2.60965e-11 (fails 32) via crossover lr<->lr
[124920 evals] best 2.6127e-11 (fails 32) via place_missing noop
[125720 evals] best 2.61617e-11 (fails 32) via place_missing noop
[128760 evals] best 2.62337e-11 (fails 32) via swap 0/rlllr
[130280 evals] best 2.62639e-11 (fails 32) via core_undivide noop
[130520 evals] best 2.63194e-11 (fails 32) via place_missing noop
[135080 evals] best 2.63387e-11 (fails 32) via place_missing noop
[136520 evals] best 2.6388e-11 (fails 32) via level_retype 0/rrl<->1/rllll
[138040 evals] best 2.68627e-11 (fails 32) via swap 0/rlrlr
[148680 evals] best 5.4017e-11 (fails 31) via place_missing noop
[151160 evals] best 5.41523e-11 (fails 31) via place_missing noop
[151560 evals] best 5.41822e-11 (fails 31) via level_retype 1/lrrrlr<->0/lrrlrl
[154440 evals] best 5.4205e-11 (fails 31) via core_undivide noop
[166760 evals] best 5.57913e-11 (fails 31) via core_undivide noop
[167880 evals] best 5.5935e-11 (fails 31) via place_missing noop
[168040 evals] best 5.59648e-11 (fails 31) via core_undivide noop
[178120 evals] best 5.59873e-11 (fails 31) via place_missing noop
[186120 evals] best 2.24215e-10 (fails 29) via undivide 0/rlrlr
[189880 evals] best 2.25927e-10 (fails 29) via place_missing noop
[194680 evals] best 2.28011e-10 (fails 29) via crossover lrrrr<->llllrr
[195640 evals] best 2.33239e-10 (fails 29) via place_missing noop
[196280 evals] best 2.34613e-10 (fails 29) via level_retype 1/lllr<->0/rlrr
[199080 evals] best 2.35322e-10 (fails 29) via place_missing noop
[199480 evals] best 2.35804e-10 (fails 29) via place_missing noop
[200760 evals] best 2.36673e-10 (fails 29) via undivide 0/llllrr
[201080 evals] best 2.37395e-10 (fails 29) via core_undivide noop
[201480 evals] best 4.60074e-10 (fails 28) via crossover llllr<->rlrr
[202920 evals] best 1.99463e-09 (fails 26) via level_retype 0/rrrll<->1/rllll
[203640 evals] best 1.99916e-09 (fails 26) via core_undivide noop
[204600 evals] best 2.00522e-09 (fails 26) via place_missing noop
[204920 evals] best 2.00871e-09 (fails 26) via core_undivide noop
[206120 evals] best 2.01305e-09 (fails 26) via place_missing noop
[208440 evals] best 3.93349e-09 (fails 25) via crossover lrrll<->lrll
[227320 evals] best 3.93912e-09 (fails 25) via undivide 1/lrrrl
[255400 evals] best 4.01887e-09 (fails 25) via crossover llllrr<->rlrr
[255960 evals] best 4.03512e-09 (fails 25) via level_retype 1/llrlll<->0/rllrr
[261960 evals] best 4.04022e-09 (fails 25) via place_missing noop
[265080 evals] best 4.04521e-09 (fails 25) via core_undivide noop
[265720 evals] best 4.05035e-09 (fails 25) via place_missing noop
[268600 evals] best 4.05563e-09 (fails 25) via place_missing noop
[271320 evals] best 4.06105e-09 (fails 25) via place_missing noop
[272680 evals] best 4.0666e-09 (fails 25) via place_missing noop
[272840 evals] best 4.07228e-09 (fails 25) via place_missing noop
[275160 evals] best 4.07807e-09 (fails 25) via core_undivide noop
[280280 evals] best 4.07877e-09 (fails 25) via crossover lrrlrl<->rlrr
[284680 evals] best 8.83242e-09 (fails 24) via level_retype 0/llllrl<->1/lrrlrl
[284920 evals] best 8.83285e-09 (fails 24) via core_undivide noop
[287400 evals] best 8.83313e-09 (fails 24) via place_missing noop
[288760 evals] best 8.83334e-09 (fails 24) via swap 0/rlrl
[324760 evals] best 8.89227e-09 (fails 24) via swap 0/lrlr
[363400 evals] best 8.90188e-09 (fails 24) via swap 0/lrlr
[363800 evals] best 9.01895e-09 (fails 24) via swap 1/lrrrl
[368440 evals] best 9.047e-09 (fails 24) via rotate 1/llrl
[378920 evals] best 9.04743e-09 (fails 24) via place_missing noop
[379000 evals] best 9.10808e-09 (fails 24) via swap 0/lrlr
[392760 evals] best 9.22733e-09 (fails 24) via swap 1/lrrrl
[408840 evals] best 1.66708e-08 (fails 23) via divide 0/rlllrl
[410440 evals] best 1.67345e-08 (fails 23) via place_missing noop
[418440 evals] best 1.68009e-08 (fails 23) via core_undivide noop
[418600 evals] best 1.68677e-08 (fails 23) via core_undivide noop
[419080 evals] best 1.69062e-08 (fails 23) via place_missing noop
[456760 evals] best 3.38125e-08 (fails 22) via level_retype 0/rllrr<->1/llrlll
[508200 evals] best 3.49835e-08 (fails 22) via swap 0/rlllr
[551560 evals] best 3.52155e-08 (fails 22) via place_missing noop
[560760 evals] best 3.53974e-08 (fails 22) via core_undivide noop
[578680 evals] best 3.54026e-08 (fails 22) via rotate 0/lrrlrr
[579480 evals] best 3.54182e-08 (fails 22) via place_missing noop
[581400 evals] best 3.54231e-08 (fails 22) via crossover lrrlrrl<->rlrll
[615720 evals] best 3.59145e-08 (fails 22) via swap 0/rlllrr
[627560 evals] best 1.07816e-07 (fails 20) via divide 0/llr
[628280 evals] best 1.07831e-07 (fails 20) via core_undivide noop
[699800 evals] best 1.09564e-07 (fails 20) via swap 0/rlllrr
[736360 evals] best 1.09566e-07 (fails 20) via rotate 0/rlrl
[874840 evals] best 4.45103e-07 (fails 18) via level_retype 1/llll<->0/rlllrrl
[952040 evals] interrupted — returning best-so-far
--- interrupted ---
elapsed : 66433.5s
evals : 952040 across 11899 topologies
best : 4.45103e-07 (18 fails) via level_retype 1/llll<->0/rlllrrl
improvement history:
[ 200] 2.99136e-19 (seed)
[ 280] 3.01967e-19 (place_missing noop)
[ 760] 3.03178e-19 (level_fix noop)
[ 1080] 1.22315e-18 (undivide 1/rlrll)
[ 1960] 4.88154e-18 (undivide 1/lllr)
[ 4040] 4.88961e-18 (level_compound_fix noop)
[ 7320] 4.99058e-18 (divide 0/rllr)
[ 9560] 4.99975e-18 (undivide 0/llllr)
[ 10680] 5.01755e-18 (place_missing noop)
[ 11480] 9.99951e-18 (retype 0/rllrl->st1)
[ 12840] 1.03122e-17 (crossover rrl<->lrrlrr)
[ 12920] 4.06483e-17 (retype 0/rrrr->C)
[ 16760] 7.97622e-17 (undivide 1/rlrll)
[ 17800] 8.02921e-17 (rotate 0/llllr)
[ 18120] 8.08633e-17 (swap 0/lrlr)
[ 19160] 8.14312e-17 (level_fix noop)
[ 22120] 1.21571e-15 (swap 0/lrrlr)
[ 23640] 1.22179e-15 (level_fix noop)
[ 30040] 1.22195e-15 (level_compound_fix noop)
[ 30600] 1.22269e-15 (core_undivide noop)
[ 31160] 1.22417e-15 (level_compound_fix noop)
[ 31400] 1.22707e-15 (level_compound_fix noop)
[ 31560] 1.22821e-15 (place_missing noop)
[ 31800] 1.23179e-15 (place_missing noop)
[ 32680] 1.23254e-15 (level_fix noop)
[ 33560] 1.23401e-15 (core_undivide noop)
[ 33880] 1.23468e-15 (place_missing noop)
[ 34360] 4.40771e-15 (level_retype 0/rlllrl<->1/lrlrr)
[ 37320] 4.45896e-15 (level_fix noop)
[ 38280] 4.5458e-15 (undivide 1/llrr)
[ 39080] 9.29164e-15 (level_compound_fix noop)
[ 42040] 9.42528e-15 (core_undivide noop)
[ 43160] 9.93886e-15 (level_fix noop)
[ 44680] 9.96278e-15 (level_compound_fix noop)
[ 47640] 9.97578e-15 (level_fix noop)
[ 47800] 9.97622e-15 (place_missing noop)
[ 48040] 9.99008e-15 (place_missing noop)
[ 48920] 9.99411e-15 (level_fix noop)
[ 49720] 1.03773e-14 (level_fix noop)
[ 51560] 1.03962e-14 (level_fix noop)
[ 52040] 1.03962e-14 (crossover llllrl<->llllrr)
[ 53400] 1.77761e-14 (level_retype 0/lrlrl<->1/lllr)
[ 53480] 1.77762e-14 (level_fix noop)
[ 53640] 1.77763e-14 (rotate 0/llllr)
[ 56600] 7.00332e-14 (place_missing r -> lrrrl)
[ 58760] 7.07195e-14 (level_fix noop)
[ 59240] 7.10585e-14 (level_fix noop)
[ 59640] 7.16534e-14 (swap 0/lrlr)
[ 63640] 5.51149e-13 (level_retype 1/lrrrlr<->0/llrr)
[ 64120] 5.51653e-13 (core_undivide noop)
[ 79880] 5.84975e-13 (crossover llrl<->rlllrl)
[ 85720] 2.46536e-12 (divide 0/rllr)
[ 86440] 2.46952e-12 (place_missing noop)
[ 86760] 2.47109e-12 (place_missing noop)
[ 87800] 2.47704e-12 (level_retype 0/lrrll<->1/llll)
[ 89320] 2.47709e-12 (rotate 1/llrll)
[ 90200] 2.48831e-12 (core_undivide noop)
[ 96600] 2.49053e-12 (level_retype 0/lrll<->1/rlllrr)
[100200] 2.49075e-12 (place_missing noop)
[100440] 5.49415e-12 (retype 1/llrlll->st1)
[101240] 5.51519e-12 (core_undivide noop)
[102200] 5.53436e-12 (core_undivide noop)
[102280] 2.14555e-11 (level_retype 0/lrll<->1/lllr)
[108520] 2.57994e-11 (level_compound_fix ws1: lvl1 → lvl0/llr + insert n into rrrl/lvl0)
[109560] 2.5808e-11 (place_missing noop)
[110360] 2.59325e-11 (swap 0/rlrlr)
[111560] 2.59762e-11 (place_missing noop)
[112280] 2.60214e-11 (core_undivide noop)
[113160] 2.60487e-11 (rotate 0/rllr)
[115640] 2.60965e-11 (crossover lr<->lr)
[124920] 2.6127e-11 (place_missing noop)
[125720] 2.61617e-11 (place_missing noop)
[128760] 2.62337e-11 (swap 0/rlllr)
[130280] 2.62639e-11 (core_undivide noop)
[130520] 2.63194e-11 (place_missing noop)
[135080] 2.63387e-11 (place_missing noop)
[136520] 2.6388e-11 (level_retype 0/rrl<->1/rllll)
[138040] 2.68627e-11 (swap 0/rlrlr)
[148680] 5.4017e-11 (place_missing noop)
[151160] 5.41523e-11 (place_missing noop)
[151560] 5.41822e-11 (level_retype 1/lrrrlr<->0/lrrlrl)
[154440] 5.4205e-11 (core_undivide noop)
[166760] 5.57913e-11 (core_undivide noop)
[167880] 5.5935e-11 (place_missing noop)
[168040] 5.59648e-11 (core_undivide noop)
[178120] 5.59873e-11 (place_missing noop)
[186120] 2.24215e-10 (undivide 0/rlrlr)
[189880] 2.25927e-10 (place_missing noop)
[194680] 2.28011e-10 (crossover lrrrr<->llllrr)
[195640] 2.33239e-10 (place_missing noop)
[196280] 2.34613e-10 (level_retype 1/lllr<->0/rlrr)
[199080] 2.35322e-10 (place_missing noop)
[199480] 2.35804e-10 (place_missing noop)
[200760] 2.36673e-10 (undivide 0/llllrr)
[201080] 2.37395e-10 (core_undivide noop)
[201480] 4.60074e-10 (crossover llllr<->rlrr)
[202920] 1.99463e-09 (level_retype 0/rrrll<->1/rllll)
[203640] 1.99916e-09 (core_undivide noop)
[204600] 2.00522e-09 (place_missing noop)
[204920] 2.00871e-09 (core_undivide noop)
[206120] 2.01305e-09 (place_missing noop)
[208440] 3.93349e-09 (crossover lrrll<->lrll)
[227320] 3.93912e-09 (undivide 1/lrrrl)
[255400] 4.01887e-09 (crossover llllrr<->rlrr)
[255960] 4.03512e-09 (level_retype 1/llrlll<->0/rllrr)
[261960] 4.04022e-09 (place_missing noop)
[265080] 4.04521e-09 (core_undivide noop)
[265720] 4.05035e-09 (place_missing noop)
[268600] 4.05563e-09 (place_missing noop)
[271320] 4.06105e-09 (place_missing noop)
[272680] 4.0666e-09 (place_missing noop)
[272840] 4.07228e-09 (place_missing noop)
[275160] 4.07807e-09 (core_undivide noop)
[280280] 4.07877e-09 (crossover lrrlrl<->rlrr)
[284680] 8.83242e-09 (level_retype 0/llllrl<->1/lrrlrl)
[284920] 8.83285e-09 (core_undivide noop)
[287400] 8.83313e-09 (place_missing noop)
[288760] 8.83334e-09 (swap 0/rlrl)
[324760] 8.89227e-09 (swap 0/lrlr)
[363400] 8.90188e-09 (swap 0/lrlr)
[363800] 9.01895e-09 (swap 1/lrrrl)
[368440] 9.047e-09 (rotate 1/llrl)
[378920] 9.04743e-09 (place_missing noop)
[379000] 9.10808e-09 (swap 0/lrlr)
[392760] 9.22733e-09 (swap 1/lrrrl)
[408840] 1.66708e-08 (divide 0/rlllrl)
[410440] 1.67345e-08 (place_missing noop)
[418440] 1.68009e-08 (core_undivide noop)
[418600] 1.68677e-08 (core_undivide noop)
[419080] 1.69062e-08 (place_missing noop)
[456760] 3.38125e-08 (level_retype 0/rllrr<->1/llrlll)
[508200] 3.49835e-08 (swap 0/rlllr)
[551560] 3.52155e-08 (place_missing noop)
[560760] 3.53974e-08 (core_undivide noop)
[578680] 3.54026e-08 (rotate 0/lrrlrr)
[579480] 3.54182e-08 (place_missing noop)
[581400] 3.54231e-08 (crossover lrrlrrl<->rlrll)
[615720] 3.59145e-08 (swap 0/rlllrr)
[627560] 1.07816e-07 (divide 0/llr)
[628280] 1.07831e-07 (core_undivide noop)
[699800] 1.09564e-07 (swap 0/rlllrr)
[736360] 1.09566e-07 (rotate 0/rlrl)
[874840] 4.45103e-07 (level_retype 1/llll<->0/rlllrrl)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-unfold.dom

View file

@ -0,0 +1,479 @@
seed : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-3M.dom
programme : harbor-house
budget : 3000000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : False (factor=3)
superpose : False
output : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-warmshare.dom
[ 200 evals] best 7.13373e-29 (fails 90) via seed
[ 680 evals] best 7.13374e-29 (fails 90) via level_fix noop
[ 1800 evals] best 1.43878e-28 (fails 89) via place_missing r -> lrrrl
[ 4200 evals] best 2.61821e-28 (fails 88) via place_missing t -> rllrr
[ 4360 evals] best 1.39503e-27 (fails 86) via core_divide rlrr (2 floors)
[ 4440 evals] best 2.20221e-27 (fails 85) via divide 0/rllrl
[ 7560 evals] best 3.47487e-27 (fails 85) via core_undivide noop
[ 8040 evals] best 4.94517e-26 (fails 81) via retype 0/rrl->r
[ 9000 evals] best 3.79585e-25 (fails 78) via place_missing r -> lrrrl
[ 9720 evals] best 3.93644e-25 (fails 78) via place_missing n -> rllr
[ 10920 evals] best 6.00163e-24 (fails 74) via place_missing r -> lrrrl
[ 12120 evals] best 6.11587e-24 (fails 74) via level_fix noop
[ 12920 evals] best 6.29222e-24 (fails 74) via core_undivide noop
[ 15000 evals] best 1.71947e-23 (fails 72) via place_missing m -> lrrl
[ 15480 evals] best 1.73099e-23 (fails 72) via level_fix noop
[ 19560 evals] best 6.08444e-23 (fails 70) via place_missing n -> rllrrr
[ 27640 evals] best 6.14994e-23 (fails 70) via level_fix noop
[ 28520 evals] best 6.20043e-23 (fails 70) via level_fix noop
[ 29000 evals] best 6.23843e-23 (fails 70) via core_undivide noop
[ 30120 evals] best 6.25916e-23 (fails 70) via core_undivide noop
[ 30760 evals] best 6.26442e-23 (fails 70) via core_undivide noop
[ 31320 evals] best 1.23029e-22 (fails 70) via undivide 0/rllrrr
[ 31640 evals] best 1.85407e-21 (fails 65) via crossover rrl<->rlrr
[ 33800 evals] best 1.8746e-21 (fails 65) via core_undivide noop
[ 34040 evals] best 1.88627e-21 (fails 65) via core_undivide noop
[ 35880 evals] best 1.89096e-21 (fails 65) via core_undivide noop
[ 36200 evals] best 8.63218e-21 (fails 64) via swap 1/lrrrr
[ 40680 evals] best 8.70626e-21 (fails 64) via level_compound_fix noop
[ 41080 evals] best 1.67189e-20 (fails 63) via place_missing r -> llrlrl
[ 41640 evals] best 1.67761e-20 (fails 63) via level_compound_fix noop
[ 44920 evals] best 7.29193e-20 (fails 61) via crossover lrrlr<->rllrl
[ 45960 evals] best 7.31576e-20 (fails 61) via level_compound_fix noop
[ 47080 evals] best 1.36215e-19 (fails 60) via place_missing t -> rrrr
[ 47480 evals] best 1.36247e-19 (fails 60) via level_fix noop
[ 48360 evals] best 1.36406e-19 (fails 60) via level_fix noop
[ 48600 evals] best 1.36485e-19 (fails 60) via crossover lrrlr<->rllrl
[ 49160 evals] best 1.36534e-19 (fails 60) via level_compound_fix noop
[ 50760 evals] best 1.36993e-19 (fails 60) via rotate 0/lrlr
[ 57880 evals] best 1.37008e-19 (fails 60) via level_fix noop
[ 57960 evals] best 1.37024e-19 (fails 60) via core_undivide noop
[ 59320 evals] best 1.37041e-19 (fails 60) via level_fix noop
[ 63160 evals] best 1.37057e-19 (fails 60) via core_undivide noop
[ 63320 evals] best 1.37735e-19 (fails 60) via rotate 0/lrr
[ 66600 evals] best 2.94829e-19 (fails 59) via level_retype 1/lrrrlrl<->0/llllrl
[ 71800 evals] best 2.94872e-19 (fails 59) via core_undivide noop
[ 74280 evals] best 5.90024e-19 (fails 58) via divide 0/rrrrr
[ 75240 evals] best 7.62368e-19 (fails 57) via level_retype 0/rlll<->1/rlrlr
[ 81320 evals] best 7.69032e-19 (fails 57) via level_retype 1/rlrlll<->0/rrrrl
[ 83160 evals] best 1.03682e-18 (fails 57) via level_retype 1/lrlrl<->0/rllrrr
[ 83480 evals] best 1.04208e-18 (fails 57) via rotate 0/rrrrr
[ 89320 evals] best 1.04721e-18 (fails 57) via core_undivide noop
[ 90760 evals] best 1.05258e-18 (fails 57) via core_undivide noop
[ 92040 evals] best 1.22112e-18 (fails 57) via rotate 0/rrrr
[ 96200 evals] best 1.54735e-18 (fails 56) via crossover lrrrr<->llllrl
[ 98680 evals] best 1.54777e-18 (fails 56) via place_missing noop
[ 99640 evals] best 1.54818e-18 (fails 56) via core_undivide noop
[100600 evals] best 1.54858e-18 (fails 56) via core_undivide noop
[102920 evals] best 1.54897e-18 (fails 56) via place_missing noop
[103560 evals] best 1.54911e-18 (fails 56) via place_missing noop
[104360 evals] best 1.62548e-18 (fails 56) via undivide 0/lrlr
[105800 evals] best 1.62563e-18 (fails 56) via level_retype 0/rlrrr<->1/lrrrrl
[106040 evals] best 1.62578e-18 (fails 56) via place_missing noop
[109000 evals] best 1.62595e-18 (fails 56) via place_missing noop
[109240 evals] best 1.62612e-18 (fails 56) via place_missing noop
[109400 evals] best 1.6263e-18 (fails 56) via place_missing noop
[110440 evals] best 1.62644e-18 (fails 56) via core_undivide noop
[110520 evals] best 1.62653e-18 (fails 56) via crossover lrlr<->lrlrl
[111160 evals] best 3.25423e-18 (fails 55) via divide 0/rrrrr
[115320 evals] best 3.25464e-18 (fails 55) via place_missing noop
[117800 evals] best 3.25582e-18 (fails 55) via level_retype 1/lrrrrr<->0/lrrrr
[118360 evals] best 3.25868e-18 (fails 55) via place_missing noop
[119640 evals] best 3.74625e-18 (fails 55) via place_missing r -> lrrl
[120280 evals] best 3.74647e-18 (fails 55) via place_missing noop
[120360 evals] best 3.74667e-18 (fails 55) via place_missing noop
[123320 evals] best 3.74676e-18 (fails 55) via core_undivide noop
[123720 evals] best 6.40395e-18 (fails 54) via divide 1/llrr
[123880 evals] best 2.88855e-17 (fails 52) via place_missing r -> lrrl
[124840 evals] best 2.89001e-17 (fails 52) via level_retype 0/lrrrr<->1/llrlrll
[126600 evals] best 2.89018e-17 (fails 52) via place_missing noop
[127480 evals] best 2.89033e-17 (fails 52) via place_missing noop
[128360 evals] best 4.59545e-16 (fails 48) via level_compound_fix st1: lvl1 → lvl0/rllr
[129800 evals] best 4.59566e-16 (fails 48) via core_undivide noop
[133800 evals] best 4.59579e-16 (fails 48) via place_missing noop
[138360 evals] best 9.21879e-16 (fails 47) via level_retype 0/lrrll<->1/rlrlr
[138920 evals] best 9.21905e-16 (fails 47) via undivide 1/lrrrlr
[177400 evals] best 1.02387e-15 (fails 47) via undivide 1/rrl
[179960 evals] best 2.0557e-15 (fails 46) via divide 0/rrrrr
[180440 evals] best 2.05953e-15 (fails 46) via level_retype 1/rllr<->0/rrrrrr
[180760 evals] best 2.0647e-15 (fails 46) via crossover rlllrlrr<->rlllrlrr
[185960 evals] best 4.03185e-15 (fails 45) via divide 0/lrrrl
[189560 evals] best 4.04284e-15 (fails 45) via core_undivide noop
[191560 evals] best 4.26565e-15 (fails 45) via crossover rrl<->rlrrr
[192760 evals] best 4.27557e-15 (fails 45) via place_missing noop
[194200 evals] best 8.22369e-15 (fails 44) via crossover llllrr<->rrrrr
[194600 evals] best 1.65717e-14 (fails 43) via crossover rrrr<->rlllrlr
[197640 evals] best 1.66031e-14 (fails 43) via core_undivide noop
[201400 evals] best 3.39094e-14 (fails 42) via divide 0/rllr
[205560 evals] best 4.33243e-14 (fails 41) via level_fix st2: lvl0/llllrrr → lvl1/rlll
[206200 evals] best 8.67874e-14 (fails 40) via core_undivide noop
[208360 evals] best 9.28664e-14 (fails 40) via level_fix of: lvl1/lrrll → lvl0/rllr
[209960 evals] best 9.86678e-14 (fails 40) via level_fix of: lvl1/lrrll → lvl0/rllr
[211640 evals] best 9.89888e-14 (fails 40) via place_missing noop
[212440 evals] best 9.93193e-14 (fails 40) via core_undivide noop
[214200 evals] best 9.96673e-14 (fails 40) via place_missing noop
[216520 evals] best 1.0003e-13 (fails 40) via place_missing noop
[220440 evals] best 1.96926e-13 (fails 39) via undivide 1/lrlr
[221720 evals] best 1.99592e-13 (fails 39) via undivide 1/lrlr
[222200 evals] best 2.00319e-13 (fails 39) via core_undivide noop
[224040 evals] best 2.01076e-13 (fails 39) via place_missing noop
[225800 evals] best 2.01871e-13 (fails 39) via level_retype 0/llllrrr<->1/lrrlrrr
[228920 evals] best 3.94547e-13 (fails 38) via undivide 0/lrrl
[229640 evals] best 3.9913e-13 (fails 38) via crossover lrrl<->lrrl
[230600 evals] best 1.03507e-12 (fails 37) via place_missing n -> rllr
[232600 evals] best 1.0387e-12 (fails 37) via swap 0/rrrr
[232760 evals] best 1.03877e-12 (fails 37) via place_missing n -> rllr
[235560 evals] best 1.21726e-13 (fails 36) via divide 1/rrrl
[239640 evals] best 2.9842e-12 (fails 35) via place_missing noop
[241560 evals] best 2.99774e-12 (fails 35) via place_missing noop
[244200 evals] best 3.00495e-12 (fails 35) via core_undivide noop
[244920 evals] best 3.01614e-12 (fails 35) via level_retype 0/llllrrr<->1/llrlrlr
[245000 evals] best 3.16105e-12 (fails 35) via rotate 1/lrrlrr
[245800 evals] best 3.21175e-12 (fails 35) via place_missing noop
[248760 evals] best 3.21456e-12 (fails 35) via place_missing noop
[250760 evals] best 3.2718e-12 (fails 35) via place_missing noop
[251000 evals] best 3.28567e-12 (fails 35) via place_missing noop
[251480 evals] best 3.33817e-12 (fails 35) via divide 0/rllr
[251640 evals] best 3.41781e-12 (fails 35) via place_missing noop
[252680 evals] best 3.44722e-12 (fails 35) via core_undivide noop
[255160 evals] best 3.48209e-12 (fails 35) via core_undivide noop
[258040 evals] best 3.50923e-12 (fails 35) via crossover rrl<->lrrrlr
[258440 evals] best 3.56524e-12 (fails 35) via place_missing noop
[259240 evals] best 7.13048e-12 (fails 34) via rotate 0/rllr
[261560 evals] best 7.15069e-12 (fails 34) via place_missing noop
[263720 evals] best 1.3349e-11 (fails 33) via swap 0/rllr
[268200 evals] best 1.33728e-11 (fails 33) via place_missing noop
[269560 evals] best 1.33841e-11 (fails 33) via place_missing noop
[269720 evals] best 1.35872e-11 (fails 33) via place_missing noop
[276360 evals] best 2.722e-11 (fails 32) via swap 0/lrl
[277400 evals] best 2.731e-11 (fails 32) via core_undivide noop
[278280 evals] best 5.46451e-11 (fails 31) via level_fix st2: lvl0/rllrl → lvl1/rlll
[282120 evals] best 5.47747e-11 (fails 31) via place_missing noop
[283400 evals] best 5.49101e-11 (fails 31) via retype 0/llllrrl->st2
[284360 evals] best 5.49984e-11 (fails 31) via core_undivide noop
[287240 evals] best 5.50909e-11 (fails 31) via rotate 0/rlllr
[287720 evals] best 5.53032e-11 (fails 31) via place_missing noop
[288520 evals] best 5.544e-11 (fails 31) via place_missing noop
[289560 evals] best 5.55504e-11 (fails 31) via core_undivide noop
[291560 evals] best 5.56508e-11 (fails 31) via rotate 0/lrrrl
[291960 evals] best 5.57529e-11 (fails 31) via place_missing noop
[294120 evals] best 5.59089e-11 (fails 31) via place_missing noop
[296120 evals] best 5.60467e-11 (fails 31) via place_missing noop
[300440 evals] best 5.61355e-11 (fails 31) via core_undivide noop
[301720 evals] best 5.62247e-11 (fails 31) via place_missing noop
[303160 evals] best 5.63495e-11 (fails 31) via place_missing noop
[305240 evals] best 6.24375e-11 (fails 30) via rotate 0/rlrr
[309560 evals] best 6.2556e-11 (fails 30) via place_missing noop
[313080 evals] best 6.27168e-11 (fails 30) via core_undivide noop
[315480 evals] best 6.28651e-11 (fails 30) via place_missing noop
[317240 evals] best 6.29148e-11 (fails 30) via place_missing noop
[317560 evals] best 6.33648e-11 (fails 30) via divide 0/rrl
[319800 evals] best 6.48073e-11 (fails 30) via crossover rrll<->rrrrl
[335160 evals] best 6.5715e-11 (fails 30) via swap 1/rrrl
[355640 evals] best 6.61765e-11 (fails 30) via rotate 0/rr
[367240 evals] best 1.41943e-10 (fails 29) via level_retype 0/rrl<->1/lrrrll
[369080 evals] best 1.4196e-10 (fails 29) via place_missing noop
[378440 evals] best 1.42097e-10 (fails 29) via place_missing noop
[380520 evals] best 1.42479e-10 (fails 29) via place_missing noop
[381640 evals] best 1.43053e-10 (fails 29) via core_undivide noop
[384680 evals] best 1.43342e-10 (fails 29) via core_undivide noop
[397960 evals] best 5.77526e-10 (fails 27) via rotate 0/rrr
[406600 evals] best 5.77589e-10 (fails 27) via place_missing noop
[421160 evals] best 6.00074e-10 (fails 27) via place_missing noop
[470040 evals] best 6.03394e-10 (fails 27) via swap 1/llrll
[496760 evals] best 6.12296e-10 (fails 27) via crossover llllrr<->rrrrr
[513240 evals] best 6.12376e-10 (fails 27) via swap 0/rrrr
[541400 evals] best 2.44951e-09 (fails 25) via level_retype 1/rlrlr<->0/llllrl
[638920 evals] best 2.44988e-09 (fails 25) via rotate 0/rrrr
[641880 evals] best 3.74964e-09 (fails 24) via crossover rrl<->rrrr
[649560 evals] best 3.77483e-09 (fails 24) via swap 0/rrl
[657240 evals] best 3.7751e-09 (fails 24) via core_undivide noop
[660920 evals] best 3.82849e-09 (fails 24) via swap 0/rlllrl
[661400 evals] best 3.84511e-09 (fails 24) via core_undivide noop
[661880 evals] best 3.84837e-09 (fails 24) via place_missing noop
[662680 evals] best 3.84862e-09 (fails 24) via place_missing noop
[665960 evals] best 3.84862e-09 (fails 24) via level_retype 1/llrllr<->0/lrlr
[670120 evals] best 3.85159e-09 (fails 24) via rotate 0/llllr
[671400 evals] best 3.85159e-09 (fails 24) via crossover r<->r
[681960 evals] best 3.85482e-09 (fails 24) via swap 0/rrrr
[682840 evals] best 3.85582e-09 (fails 24) via place_missing noop
[693080 evals] best 3.85764e-09 (fails 24) via rotate 1/lrrlr
[701960 evals] best 3.87466e-09 (fails 24) via rotate 0/llllr
[708760 evals] best 4.4024e-09 (fails 24) via level_retype 0/rlllrr<->1/lrrrll
[709080 evals] best 7.90799e-09 (fails 23) via rotate 0/rlllr
[713160 evals] best 7.90837e-09 (fails 23) via core_undivide noop
[722600 evals] best 7.90905e-09 (fails 23) via rotate 0/rrrr
[734520 evals] best 9.17808e-09 (fails 23) via retype 1/llrllr->O
[735000 evals] best 9.18197e-09 (fails 23) via rotate 0/rlr
[735800 evals] best 9.18331e-09 (fails 23) via rotate 0/rrrr
[809480 evals] best 2.30234e-08 (fails 22) via core_divide lrlr (2 floors)
[809960 evals] best 2.34106e-08 (fails 22) via place_missing noop
[847320 evals] best 2.46791e-08 (fails 22) via swap 0/llllr
[922120 evals] best 2.49586e-08 (fails 22) via swap 0/rrl
[974440 evals] best 4.80041e-08 (fails 21) via level_retype 1/llll<->0/llllrr
[974760 evals] best 4.80092e-08 (fails 21) via crossover lrrrlr<->lrlrrl
[988280 evals] best 4.80353e-08 (fails 21) via retype 0/rllrr->st2
[989560 evals] best 4.83453e-08 (fails 21) via place_missing noop
[993240 evals] best 4.86695e-08 (fails 21) via place_missing noop
[994360 evals] best 4.87958e-08 (fails 21) via level_fix st2: lvl0/rllrr → lvl1/rlll
[998200 evals] best 4.89159e-08 (fails 21) via core_undivide noop
[1002600 evals] best 4.89367e-08 (fails 21) via place_missing noop
[1009720 evals] best 4.8962e-08 (fails 21) via place_missing noop
[1011880 evals] best 4.89682e-08 (fails 21) via place_missing noop
[1022200 evals] best 4.91525e-08 (fails 21) via place_missing noop
[1023080 evals] best 4.92746e-08 (fails 21) via level_fix st2: lvl0/rllrr → lvl1/rlll
[1023880 evals] best 4.93868e-08 (fails 21) via core_undivide noop
[1028360 evals] best 4.94032e-08 (fails 21) via place_missing noop
[1029720 evals] best 4.94208e-08 (fails 21) via place_missing noop
[1029960 evals] best 4.94221e-08 (fails 21) via place_missing noop
[1058760 evals] best 8.61399e-08 (fails 20) via rotate 0/rlllr
[1060200 evals] best 8.62097e-08 (fails 20) via place_missing noop
[1063880 evals] best 8.62206e-08 (fails 20) via place_missing noop
[1083320 evals] best 8.62206e-08 (fails 20) via undivide 0/rllr
[1087160 evals] best 8.62355e-08 (fails 20) via rotate 0/rlllrr
[1088040 evals] best 8.62463e-08 (fails 20) via core_undivide noop
[1178920 evals] best 8.62463e-08 (fails 20) via undivide 0/rllr
[1645640 evals] best 8.64196e-08 (fails 20) via level_retype 1/rlrllr<->0/rrlr
[1651080 evals] best 8.66028e-08 (fails 20) via undivide 0/rrl
[1783320 evals] best 8.66028e-08 (fails 20) via undivide 0/rllr
[1846200 evals] best 8.66287e-08 (fails 20) via rotate 0/rlllrr
[1955720 evals] best 8.66287e-08 (fails 20) via undivide 0/rllr
[2308920 evals] interrupted — returning best-so-far
--- interrupted ---
elapsed : 210772.1s
evals : 2308920 across 28860 topologies
best : 8.66287e-08 (20 fails) via undivide 0/rllr
improvement history:
[ 200] 7.13373e-29 (seed)
[ 680] 7.13374e-29 (level_fix noop)
[ 1800] 1.43878e-28 (place_missing r -> lrrrl)
[ 4200] 2.61821e-28 (place_missing t -> rllrr)
[ 4360] 1.39503e-27 (core_divide rlrr (2 floors))
[ 4440] 2.20221e-27 (divide 0/rllrl)
[ 7560] 3.47487e-27 (core_undivide noop)
[ 8040] 4.94517e-26 (retype 0/rrl->r)
[ 9000] 3.79585e-25 (place_missing r -> lrrrl)
[ 9720] 3.93644e-25 (place_missing n -> rllr)
[ 10920] 6.00163e-24 (place_missing r -> lrrrl)
[ 12120] 6.11587e-24 (level_fix noop)
[ 12920] 6.29222e-24 (core_undivide noop)
[ 15000] 1.71947e-23 (place_missing m -> lrrl)
[ 15480] 1.73099e-23 (level_fix noop)
[ 19560] 6.08444e-23 (place_missing n -> rllrrr)
[ 27640] 6.14994e-23 (level_fix noop)
[ 28520] 6.20043e-23 (level_fix noop)
[ 29000] 6.23843e-23 (core_undivide noop)
[ 30120] 6.25916e-23 (core_undivide noop)
[ 30760] 6.26442e-23 (core_undivide noop)
[ 31320] 1.23029e-22 (undivide 0/rllrrr)
[ 31640] 1.85407e-21 (crossover rrl<->rlrr)
[ 33800] 1.8746e-21 (core_undivide noop)
[ 34040] 1.88627e-21 (core_undivide noop)
[ 35880] 1.89096e-21 (core_undivide noop)
[ 36200] 8.63218e-21 (swap 1/lrrrr)
[ 40680] 8.70626e-21 (level_compound_fix noop)
[ 41080] 1.67189e-20 (place_missing r -> llrlrl)
[ 41640] 1.67761e-20 (level_compound_fix noop)
[ 44920] 7.29193e-20 (crossover lrrlr<->rllrl)
[ 45960] 7.31576e-20 (level_compound_fix noop)
[ 47080] 1.36215e-19 (place_missing t -> rrrr)
[ 47480] 1.36247e-19 (level_fix noop)
[ 48360] 1.36406e-19 (level_fix noop)
[ 48600] 1.36485e-19 (crossover lrrlr<->rllrl)
[ 49160] 1.36534e-19 (level_compound_fix noop)
[ 50760] 1.36993e-19 (rotate 0/lrlr)
[ 57880] 1.37008e-19 (level_fix noop)
[ 57960] 1.37024e-19 (core_undivide noop)
[ 59320] 1.37041e-19 (level_fix noop)
[ 63160] 1.37057e-19 (core_undivide noop)
[ 63320] 1.37735e-19 (rotate 0/lrr)
[ 66600] 2.94829e-19 (level_retype 1/lrrrlrl<->0/llllrl)
[ 71800] 2.94872e-19 (core_undivide noop)
[ 74280] 5.90024e-19 (divide 0/rrrrr)
[ 75240] 7.62368e-19 (level_retype 0/rlll<->1/rlrlr)
[ 81320] 7.69032e-19 (level_retype 1/rlrlll<->0/rrrrl)
[ 83160] 1.03682e-18 (level_retype 1/lrlrl<->0/rllrrr)
[ 83480] 1.04208e-18 (rotate 0/rrrrr)
[ 89320] 1.04721e-18 (core_undivide noop)
[ 90760] 1.05258e-18 (core_undivide noop)
[ 92040] 1.22112e-18 (rotate 0/rrrr)
[ 96200] 1.54735e-18 (crossover lrrrr<->llllrl)
[ 98680] 1.54777e-18 (place_missing noop)
[ 99640] 1.54818e-18 (core_undivide noop)
[100600] 1.54858e-18 (core_undivide noop)
[102920] 1.54897e-18 (place_missing noop)
[103560] 1.54911e-18 (place_missing noop)
[104360] 1.62548e-18 (undivide 0/lrlr)
[105800] 1.62563e-18 (level_retype 0/rlrrr<->1/lrrrrl)
[106040] 1.62578e-18 (place_missing noop)
[109000] 1.62595e-18 (place_missing noop)
[109240] 1.62612e-18 (place_missing noop)
[109400] 1.6263e-18 (place_missing noop)
[110440] 1.62644e-18 (core_undivide noop)
[110520] 1.62653e-18 (crossover lrlr<->lrlrl)
[111160] 3.25423e-18 (divide 0/rrrrr)
[115320] 3.25464e-18 (place_missing noop)
[117800] 3.25582e-18 (level_retype 1/lrrrrr<->0/lrrrr)
[118360] 3.25868e-18 (place_missing noop)
[119640] 3.74625e-18 (place_missing r -> lrrl)
[120280] 3.74647e-18 (place_missing noop)
[120360] 3.74667e-18 (place_missing noop)
[123320] 3.74676e-18 (core_undivide noop)
[123720] 6.40395e-18 (divide 1/llrr)
[123880] 2.88855e-17 (place_missing r -> lrrl)
[124840] 2.89001e-17 (level_retype 0/lrrrr<->1/llrlrll)
[126600] 2.89018e-17 (place_missing noop)
[127480] 2.89033e-17 (place_missing noop)
[128360] 4.59545e-16 (level_compound_fix st1: lvl1 → lvl0/rllr)
[129800] 4.59566e-16 (core_undivide noop)
[133800] 4.59579e-16 (place_missing noop)
[138360] 9.21879e-16 (level_retype 0/lrrll<->1/rlrlr)
[138920] 9.21905e-16 (undivide 1/lrrrlr)
[177400] 1.02387e-15 (undivide 1/rrl)
[179960] 2.0557e-15 (divide 0/rrrrr)
[180440] 2.05953e-15 (level_retype 1/rllr<->0/rrrrrr)
[180760] 2.0647e-15 (crossover rlllrlrr<->rlllrlrr)
[185960] 4.03185e-15 (divide 0/lrrrl)
[189560] 4.04284e-15 (core_undivide noop)
[191560] 4.26565e-15 (crossover rrl<->rlrrr)
[192760] 4.27557e-15 (place_missing noop)
[194200] 8.22369e-15 (crossover llllrr<->rrrrr)
[194600] 1.65717e-14 (crossover rrrr<->rlllrlr)
[197640] 1.66031e-14 (core_undivide noop)
[201400] 3.39094e-14 (divide 0/rllr)
[205560] 4.33243e-14 (level_fix st2: lvl0/llllrrr → lvl1/rlll)
[206200] 8.67874e-14 (core_undivide noop)
[208360] 9.28664e-14 (level_fix of: lvl1/lrrll → lvl0/rllr)
[209960] 9.86678e-14 (level_fix of: lvl1/lrrll → lvl0/rllr)
[211640] 9.89888e-14 (place_missing noop)
[212440] 9.93193e-14 (core_undivide noop)
[214200] 9.96673e-14 (place_missing noop)
[216520] 1.0003e-13 (place_missing noop)
[220440] 1.96926e-13 (undivide 1/lrlr)
[221720] 1.99592e-13 (undivide 1/lrlr)
[222200] 2.00319e-13 (core_undivide noop)
[224040] 2.01076e-13 (place_missing noop)
[225800] 2.01871e-13 (level_retype 0/llllrrr<->1/lrrlrrr)
[228920] 3.94547e-13 (undivide 0/lrrl)
[229640] 3.9913e-13 (crossover lrrl<->lrrl)
[230600] 1.03507e-12 (place_missing n -> rllr)
[232600] 1.0387e-12 (swap 0/rrrr)
[232760] 1.03877e-12 (place_missing n -> rllr)
[235560] 1.21726e-13 (divide 1/rrrl)
[239640] 2.9842e-12 (place_missing noop)
[241560] 2.99774e-12 (place_missing noop)
[244200] 3.00495e-12 (core_undivide noop)
[244920] 3.01614e-12 (level_retype 0/llllrrr<->1/llrlrlr)
[245000] 3.16105e-12 (rotate 1/lrrlrr)
[245800] 3.21175e-12 (place_missing noop)
[248760] 3.21456e-12 (place_missing noop)
[250760] 3.2718e-12 (place_missing noop)
[251000] 3.28567e-12 (place_missing noop)
[251480] 3.33817e-12 (divide 0/rllr)
[251640] 3.41781e-12 (place_missing noop)
[252680] 3.44722e-12 (core_undivide noop)
[255160] 3.48209e-12 (core_undivide noop)
[258040] 3.50923e-12 (crossover rrl<->lrrrlr)
[258440] 3.56524e-12 (place_missing noop)
[259240] 7.13048e-12 (rotate 0/rllr)
[261560] 7.15069e-12 (place_missing noop)
[263720] 1.3349e-11 (swap 0/rllr)
[268200] 1.33728e-11 (place_missing noop)
[269560] 1.33841e-11 (place_missing noop)
[269720] 1.35872e-11 (place_missing noop)
[276360] 2.722e-11 (swap 0/lrl)
[277400] 2.731e-11 (core_undivide noop)
[278280] 5.46451e-11 (level_fix st2: lvl0/rllrl → lvl1/rlll)
[282120] 5.47747e-11 (place_missing noop)
[283400] 5.49101e-11 (retype 0/llllrrl->st2)
[284360] 5.49984e-11 (core_undivide noop)
[287240] 5.50909e-11 (rotate 0/rlllr)
[287720] 5.53032e-11 (place_missing noop)
[288520] 5.544e-11 (place_missing noop)
[289560] 5.55504e-11 (core_undivide noop)
[291560] 5.56508e-11 (rotate 0/lrrrl)
[291960] 5.57529e-11 (place_missing noop)
[294120] 5.59089e-11 (place_missing noop)
[296120] 5.60467e-11 (place_missing noop)
[300440] 5.61355e-11 (core_undivide noop)
[301720] 5.62247e-11 (place_missing noop)
[303160] 5.63495e-11 (place_missing noop)
[305240] 6.24375e-11 (rotate 0/rlrr)
[309560] 6.2556e-11 (place_missing noop)
[313080] 6.27168e-11 (core_undivide noop)
[315480] 6.28651e-11 (place_missing noop)
[317240] 6.29148e-11 (place_missing noop)
[317560] 6.33648e-11 (divide 0/rrl)
[319800] 6.48073e-11 (crossover rrll<->rrrrl)
[335160] 6.5715e-11 (swap 1/rrrl)
[355640] 6.61765e-11 (rotate 0/rr)
[367240] 1.41943e-10 (level_retype 0/rrl<->1/lrrrll)
[369080] 1.4196e-10 (place_missing noop)
[378440] 1.42097e-10 (place_missing noop)
[380520] 1.42479e-10 (place_missing noop)
[381640] 1.43053e-10 (core_undivide noop)
[384680] 1.43342e-10 (core_undivide noop)
[397960] 5.77526e-10 (rotate 0/rrr)
[406600] 5.77589e-10 (place_missing noop)
[421160] 6.00074e-10 (place_missing noop)
[470040] 6.03394e-10 (swap 1/llrll)
[496760] 6.12296e-10 (crossover llllrr<->rrrrr)
[513240] 6.12376e-10 (swap 0/rrrr)
[541400] 2.44951e-09 (level_retype 1/rlrlr<->0/llllrl)
[638920] 2.44988e-09 (rotate 0/rrrr)
[641880] 3.74964e-09 (crossover rrl<->rrrr)
[649560] 3.77483e-09 (swap 0/rrl)
[657240] 3.7751e-09 (core_undivide noop)
[660920] 3.82849e-09 (swap 0/rlllrl)
[661400] 3.84511e-09 (core_undivide noop)
[661880] 3.84837e-09 (place_missing noop)
[662680] 3.84862e-09 (place_missing noop)
[665960] 3.84862e-09 (level_retype 1/llrllr<->0/lrlr)
[670120] 3.85159e-09 (rotate 0/llllr)
[671400] 3.85159e-09 (crossover r<->r)
[681960] 3.85482e-09 (swap 0/rrrr)
[682840] 3.85582e-09 (place_missing noop)
[693080] 3.85764e-09 (rotate 1/lrrlr)
[701960] 3.87466e-09 (rotate 0/llllr)
[708760] 4.4024e-09 (level_retype 0/rlllrr<->1/lrrrll)
[709080] 7.90799e-09 (rotate 0/rlllr)
[713160] 7.90837e-09 (core_undivide noop)
[722600] 7.90905e-09 (rotate 0/rrrr)
[734520] 9.17808e-09 (retype 1/llrllr->O)
[735000] 9.18197e-09 (rotate 0/rlr)
[735800] 9.18331e-09 (rotate 0/rrrr)
[809480] 2.30234e-08 (core_divide lrlr (2 floors))
[809960] 2.34106e-08 (place_missing noop)
[847320] 2.46791e-08 (swap 0/llllr)
[922120] 2.49586e-08 (swap 0/rrl)
[974440] 4.80041e-08 (level_retype 1/llll<->0/llllrr)
[974760] 4.80092e-08 (crossover lrrrlr<->lrlrrl)
[988280] 4.80353e-08 (retype 0/rllrr->st2)
[989560] 4.83453e-08 (place_missing noop)
[993240] 4.86695e-08 (place_missing noop)
[994360] 4.87958e-08 (level_fix st2: lvl0/rllrr → lvl1/rlll)
[998200] 4.89159e-08 (core_undivide noop)
[1002600] 4.89367e-08 (place_missing noop)
[1009720] 4.8962e-08 (place_missing noop)
[1011880] 4.89682e-08 (place_missing noop)
[1022200] 4.91525e-08 (place_missing noop)
[1023080] 4.92746e-08 (level_fix st2: lvl0/rllrr → lvl1/rlll)
[1023880] 4.93868e-08 (core_undivide noop)
[1028360] 4.94032e-08 (place_missing noop)
[1029720] 4.94208e-08 (place_missing noop)
[1029960] 4.94221e-08 (place_missing noop)
[1058760] 8.61399e-08 (rotate 0/rlllr)
[1060200] 8.62097e-08 (place_missing noop)
[1063880] 8.62206e-08 (place_missing noop)
[1083320] 8.62206e-08 (undivide 0/rllr)
[1087160] 8.62355e-08 (rotate 0/rlllrr)
[1088040] 8.62463e-08 (core_undivide noop)
[1178920] 8.62463e-08 (undivide 0/rllr)
[1645640] 8.64196e-08 (level_retype 1/rlrllr<->0/rrlr)
[1651080] 8.66028e-08 (undivide 0/rrl)
[1783320] 8.66028e-08 (undivide 0/rllr)
[1846200] 8.66287e-08 (rotate 0/rlllrr)
[1955720] 8.66287e-08 (undivide 0/rllr)
written : /home/bruno/src/homemaker-layout/examples/harbor-house/evolved-warmshare.dom

View file

@ -0,0 +1,616 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5453707551767608
- 0.5453707551767608
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5522887920141253
- 0.5522887920141253
l:
rotation: 3
division:
- 0.5422240475759911
- 0.5422240475759911
l:
rotation: 3
division:
- 0.5884031332206187
- 0.5884031332206187
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.4351188444584838
- 0.4351188444584838
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: st1
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5858843654327277
- 0.5858843654327277
l:
rotation: 1
division:
- 0.6692443578136734
- 0.6692443578136734
l:
rotation: 3
division:
- 0.7222802898935807
- 0.7222802898935807
l:
rotation: 0
division:
- 0.5791570312500001
- 0.5791570312500001
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: cr1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: O
rotation: 1
r:
type: ws1
rotation: 0
r:
rotation: 1
division:
- 0.6234470574437853
- 0.6234470574437853
l:
rotation: 0
division:
- 0.5902842616284559
- 0.5902842616284559
l:
rotation: 1
division:
- 0.7339337357234825
- 0.7339337357234825
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.7824086560875603
- 0.7824086560875603
l:
rotation: 0
division:
- 0.7039689912158207
- 0.7039689912158207
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: st1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: C
rotation: 1
r:
rotation: 1
division:
- 0.6570350194962238
- 0.6570350194962238
l:
rotation: 0
division:
- 0.38409579126711796
- 0.38409579126711796
l:
rotation: 3
division:
- 0.7722513353285644
- 0.7722513353285644
l:
rotation: 0
division:
- 0.5566301900554915
- 0.5566301900554915
l:
type: me1
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 3
division:
- 0.41924682120742435
- 0.41924682120742435
l:
type: t
rotation: 0
r:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.5923752795527412
- 0.5923752795527412
l:
rotation: 3
division:
- 0.8429374722623478
- 0.8429374722623478
l:
type: n
rotation: 0
r:
type: la1
rotation: 0
r:
rotation: 1
division:
- 0.6090773265385678
- 0.6090773265385678
l:
rotation: 3
division:
- 0.7764295659905632
- 0.7764295659905632
l:
rotation: 3
division:
- 0.6385206269531251
- 0.6385206269531251
l:
type: st2
rotation: 0
r:
type: C
rotation: 3
r:
type: t
rotation: 0
r:
type: O
rotation: 1
r:
rotation: 1
division:
- 0.6421146395641212
- 0.6421146395641212
l:
rotation: 2
division:
- 0.22974356566741397
- 0.22974356566741397
l:
rotation: 3
division:
- 0.6084768559570314
- 0.6084768559570314
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.968265351741025
- 0.968265351741025
l:
type: t
rotation: 0
r:
type: st2
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 1
division:
- 0.8784173200136786
- 0.8784173200136786
l:
rotation: 0
division:
- 0.4059970339301521
- 0.4059970339301521
l:
type: m
rotation: 1
r:
type: C
rotation: 1
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
above:
rotation: 0
division:
- 0.5326764625682993
- 0.5326764625682993
height: 3.0
l:
rotation: 0
division:
- 0.5536579163160164
- 0.5536579163160164
l:
rotation: 0
division:
- 0.4853471066909839
- 0.4853471066909839
l:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
rotation: 0
division:
- 0.7297117619482362
- 0.7297117619482362
l:
rotation: 3
division:
- 0.7579431477526928
- 0.7579431477526928
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.6236887773559573
- 0.6236887773559573
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.551578125
- 0.551578125
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.43356671101589384
- 0.43356671101589384
l:
rotation: 0
division:
- 0.13133577297899704
- 0.13133577297899704
l:
rotation: 1
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5797285677939966
- 0.5797285677939966
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.551578125
- 0.551578125
l:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.670845733692627
- 0.670845733692627
l:
type: li1
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.781888627381648
- 0.781888627381648
l:
rotation: 0
division:
- 0.38499157916891213
- 0.38499157916891213
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4444444444444444
- 0.4444444444444444
l:
rotation: 0
division:
- 0.9730225242044375
- 0.9730225242044375
l:
type: r
rotation: 2
r:
rotation: 1
division:
- 0.5004934210526315
- 0.5004934210526315
l:
type: st2
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5945754854305073
- 0.5945754854305073
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4902664331159802
- 0.4902664331159802
l:
rotation: 0
division:
- 0.6499007975748095
- 0.6499007975748095
l:
rotation: 0
division:
- 0.5193481864706366
- 0.5193481864706366
l:
rotation: 0
division:
- 0.26078324488789595
- 0.26078324488789595
l:
rotation: 0
division:
- 0.5010799367804276
- 0.5010799367804276
l:
type: ut1
rotation: 3
r:
type: O
rotation: 0
r:
type: m
rotation: 3
r:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.2873334582149999
- 0.2873334582149999
l:
rotation: 0
division:
- 0.375
- 0.375
l:
type: n
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4595786624530838
- 0.4595786624530838
l:
rotation: 0
division:
- 0.9210526315789473
- 0.9210526315789473
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.7294856269372924
- 0.7294856269372924
l:
type: st1
rotation: 0
r:
rotation: 1
division:
- 0.7039689912158207
- 0.7039689912158207
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5559478988311726
- 0.5559478988311726
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: C
rotation: 3
r:
type: t
rotation: 1
r:
type: O
rotation: 2

View file

@ -0,0 +1,600 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5453707551767608
- 0.5453707551767608
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5522887920141253
- 0.5522887920141253
l:
rotation: 3
division:
- 0.5422240475759911
- 0.5422240475759911
l:
rotation: 3
division:
- 0.5884031332206187
- 0.5884031332206187
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.4351188444584838
- 0.4351188444584838
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: st1
rotation: 3
r:
type: me1
rotation: 0
r:
rotation: 1
division:
- 0.5858843654327277
- 0.5858843654327277
l:
rotation: 1
division:
- 0.6692443578136734
- 0.6692443578136734
l:
rotation: 3
division:
- 0.7222802898935807
- 0.7222802898935807
l:
rotation: 0
division:
- 0.5791570312500001
- 0.5791570312500001
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: cr1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: O
rotation: 1
r:
type: ws1
rotation: 0
r:
rotation: 1
division:
- 0.6234470574437853
- 0.6234470574437853
l:
rotation: 0
division:
- 0.5902842616284559
- 0.5902842616284559
l:
rotation: 1
division:
- 0.7385208215717542
- 0.7385208215717542
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.7824086560875603
- 0.7824086560875603
l:
rotation: 0
division:
- 0.7215682159962162
- 0.7215682159962162
l:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: st1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: C
rotation: 1
r:
rotation: 1
division:
- 0.6570350194962238
- 0.6570350194962238
l:
rotation: 0
division:
- 0.38409579126711796
- 0.38409579126711796
l:
rotation: 3
division:
- 0.7722513353285644
- 0.7722513353285644
l:
rotation: 0
division:
- 0.629026904149584
- 0.629026904149584
l:
type: m
rotation: 0
r:
type: C
rotation: 3
r:
type: ef1
rotation: 3
r:
rotation: 1
division:
- 0.5923752795527412
- 0.5923752795527412
l:
rotation: 3
division:
- 0.8429374722623478
- 0.8429374722623478
l:
type: n
rotation: 0
r:
type: la1
rotation: 0
r:
rotation: 1
division:
- 0.6090773265385678
- 0.6090773265385678
l:
rotation: 3
division:
- 0.9561064910184571
- 0.9561064910184571
l:
rotation: 3
division:
- 0.6385206269531251
- 0.6385206269531251
l:
type: st2
rotation: 0
r:
type: C
rotation: 3
r:
type: O
rotation: 0
r:
type: O
rotation: 1
r:
rotation: 1
division:
- 0.646127856061397
- 0.646127856061397
l:
rotation: 2
division:
- 0.23548715480909932
- 0.23548715480909932
l:
rotation: 3
division:
- 0.6084768559570314
- 0.6084768559570314
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.9564169654832019
- 0.9564169654832019
l:
type: t
rotation: 0
r:
type: st2
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 1
division:
- 0.8784173200136786
- 0.8784173200136786
l:
rotation: 0
division:
- 0.4161469597784059
- 0.4161469597784059
l:
type: m
rotation: 1
r:
type: C
rotation: 1
r:
type: O
rotation: 1
above:
rotation: 0
division:
- 0.5326764625682993
- 0.5326764625682993
height: 3.0
l:
rotation: 0
division:
- 0.5536579163160164
- 0.5536579163160164
l:
rotation: 0
division:
- 0.4853471066909839
- 0.4853471066909839
l:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
rotation: 0
division:
- 0.7297117619482362
- 0.7297117619482362
l:
rotation: 3
division:
- 0.7579431477526928
- 0.7579431477526928
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.6236887773559573
- 0.6236887773559573
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.5650312500000001
- 0.5650312500000001
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.551578125
- 0.551578125
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.43356671101589384
- 0.43356671101589384
l:
rotation: 0
division:
- 0.13133577297899704
- 0.13133577297899704
l:
rotation: 1
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5797285677939966
- 0.5797285677939966
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.551578125
- 0.551578125
l:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.670845733692627
- 0.670845733692627
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.781888627381648
- 0.781888627381648
l:
rotation: 0
division:
- 0.38499157916891213
- 0.38499157916891213
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4444444444444444
- 0.4444444444444444
l:
rotation: 0
division:
- 0.9730225242044375
- 0.9730225242044375
l:
type: r
rotation: 2
r:
rotation: 1
division:
- 0.5004934210526315
- 0.5004934210526315
l:
type: st2
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5945754854305073
- 0.5945754854305073
l:
type: r
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.4902664331159802
- 0.4902664331159802
l:
rotation: 0
division:
- 0.6499007975748095
- 0.6499007975748095
l:
rotation: 0
division:
- 0.5193481864706366
- 0.5193481864706366
l:
rotation: 0
division:
- 0.26078324488789595
- 0.26078324488789595
l:
rotation: 0
division:
- 0.5136069351999384
- 0.5136069351999384
l:
type: ut1
rotation: 3
r:
type: O
rotation: 0
r:
type: li1
rotation: 3
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.2873334582149999
- 0.2873334582149999
l:
rotation: 0
division:
- 0.375
- 0.375
l:
type: n
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4595786624530838
- 0.4595786624530838
l:
rotation: 0
division:
- 0.9210526315789473
- 0.9210526315789473
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.7294856269372924
- 0.7294856269372924
l:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.7039689912158207
- 0.7039689912158207
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5559478988311726
- 0.5559478988311726
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: C
rotation: 3
r:
type: r
rotation: 1
r:
type: O
rotation: 2

View file

@ -0,0 +1,600 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5453707551767608
- 0.5453707551767608
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5522887920141253
- 0.5522887920141253
l:
rotation: 3
division:
- 0.5422240475759911
- 0.5422240475759911
l:
rotation: 3
division:
- 0.5884031332206187
- 0.5884031332206187
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.4351188444584838
- 0.4351188444584838
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: st1
rotation: 3
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5858843654327277
- 0.5858843654327277
l:
rotation: 1
division:
- 0.6692443578136734
- 0.6692443578136734
l:
rotation: 3
division:
- 0.7222802898935807
- 0.7222802898935807
l:
rotation: 0
division:
- 0.5791570312500001
- 0.5791570312500001
l:
rotation: 3
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: cr1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: O
rotation: 1
r:
type: ws1
rotation: 0
r:
rotation: 1
division:
- 0.6234470574437853
- 0.6234470574437853
l:
rotation: 0
division:
- 0.5902842616284559
- 0.5902842616284559
l:
rotation: 1
division:
- 0.7385208215717542
- 0.7385208215717542
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.7824086560875603
- 0.7824086560875603
l:
rotation: 0
division:
- 0.7215682159962162
- 0.7215682159962162
l:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: st1
rotation: 0
r:
type: cr1
rotation: 0
r:
type: C
rotation: 1
r:
rotation: 1
division:
- 0.6570350194962238
- 0.6570350194962238
l:
rotation: 0
division:
- 0.38409579126711796
- 0.38409579126711796
l:
rotation: 3
division:
- 0.7722513353285644
- 0.7722513353285644
l:
rotation: 0
division:
- 0.629026904149584
- 0.629026904149584
l:
type: m
rotation: 0
r:
type: C
rotation: 3
r:
type: ef1
rotation: 3
r:
rotation: 1
division:
- 0.5923752795527412
- 0.5923752795527412
l:
rotation: 3
division:
- 0.8429374722623478
- 0.8429374722623478
l:
type: n
rotation: 0
r:
type: la1
rotation: 0
r:
rotation: 1
division:
- 0.6090773265385678
- 0.6090773265385678
l:
rotation: 3
division:
- 0.9561064910184571
- 0.9561064910184571
l:
rotation: 3
division:
- 0.6385206269531251
- 0.6385206269531251
l:
type: st2
rotation: 0
r:
type: C
rotation: 3
r:
type: O
rotation: 0
r:
type: O
rotation: 1
r:
rotation: 1
division:
- 0.646127856061397
- 0.646127856061397
l:
rotation: 2
division:
- 0.23548715480909932
- 0.23548715480909932
l:
rotation: 3
division:
- 0.6084768559570314
- 0.6084768559570314
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.9564169654832019
- 0.9564169654832019
l:
type: t
rotation: 0
r:
type: st2
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 1
division:
- 0.8784173200136786
- 0.8784173200136786
l:
rotation: 0
division:
- 0.4161469597784059
- 0.4161469597784059
l:
type: m
rotation: 1
r:
type: C
rotation: 1
r:
type: O
rotation: 1
above:
rotation: 0
division:
- 0.5326764625682993
- 0.5326764625682993
height: 3.0
l:
rotation: 0
division:
- 0.5536579163160164
- 0.5536579163160164
l:
rotation: 0
division:
- 0.4853471066909839
- 0.4853471066909839
l:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
rotation: 0
division:
- 0.7297117619482362
- 0.7297117619482362
l:
rotation: 3
division:
- 0.7579431477526928
- 0.7579431477526928
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.6236887773559573
- 0.6236887773559573
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.5650312500000001
- 0.5650312500000001
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.551578125
- 0.551578125
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.43356671101589384
- 0.43356671101589384
l:
rotation: 0
division:
- 0.13133577297899704
- 0.13133577297899704
l:
rotation: 1
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5797285677939966
- 0.5797285677939966
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.551578125
- 0.551578125
l:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.670845733692627
- 0.670845733692627
l:
type: li1
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.781888627381648
- 0.781888627381648
l:
rotation: 0
division:
- 0.38499157916891213
- 0.38499157916891213
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4444444444444444
- 0.4444444444444444
l:
rotation: 0
division:
- 0.9730225242044375
- 0.9730225242044375
l:
type: r
rotation: 2
r:
rotation: 1
division:
- 0.5004934210526315
- 0.5004934210526315
l:
type: st2
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5945754854305073
- 0.5945754854305073
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4902664331159802
- 0.4902664331159802
l:
rotation: 0
division:
- 0.6499007975748095
- 0.6499007975748095
l:
rotation: 0
division:
- 0.5193481864706366
- 0.5193481864706366
l:
rotation: 0
division:
- 0.26078324488789595
- 0.26078324488789595
l:
rotation: 0
division:
- 0.5136069351999384
- 0.5136069351999384
l:
type: ut1
rotation: 3
r:
type: O
rotation: 0
r:
type: me1
rotation: 3
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.2873334582149999
- 0.2873334582149999
l:
rotation: 0
division:
- 0.375
- 0.375
l:
type: n
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4595786624530838
- 0.4595786624530838
l:
rotation: 0
division:
- 0.9210526315789473
- 0.9210526315789473
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.7294856269372924
- 0.7294856269372924
l:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.7039689912158207
- 0.7039689912158207
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5559478988311726
- 0.5559478988311726
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5936359570312502
- 0.5936359570312502
l:
type: C
rotation: 3
r:
type: t
rotation: 1
r:
type: O
rotation: 2

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,536 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5386377828906278
- 0.5386377828906278
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5517443075001449
- 0.5517443075001449
l:
rotation: 3
division:
- 0.5158947481748943
- 0.5158947481748943
l:
rotation: 3
division:
- 0.5878230446896753
- 0.5878230446896753
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.43468987418790384
- 0.43468987418790384
l:
rotation: 2
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5179419369082577
- 0.5179419369082577
l:
rotation: 1
division:
- 0.6367472099130139
- 0.6367472099130139
l:
rotation: 3
division:
- 0.7039689912158207
- 0.7039689912158207
l:
type: t
rotation: 0
r:
type: cr1
rotation: 0
r:
rotation: 1
division:
- 0.7035502113281252
- 0.7035502113281252
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5139609239961543
- 0.5139609239961543
l:
type: C
rotation: 0
r:
type: ws1
rotation: 0
r:
rotation: 1
division:
- 0.5931737335114493
- 0.5931737335114493
l:
rotation: 0
division:
- 0.5616212557627989
- 0.5616212557627989
l:
rotation: 1
division:
- 0.7153269981002015
- 0.7153269981002015
l:
type: m
rotation: 0
r:
type: O
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.7258279395694767
- 0.7258279395694767
l:
type: n
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.6563872689019125
- 0.6563872689019125
l:
rotation: 0
division:
- 0.3837171230535781
- 0.3837171230535781
l:
rotation: 3
division:
- 0.7714899965162132
- 0.7714899965162132
l:
rotation: 0
division:
- 0.5543490846014826
- 0.5543490846014826
l:
type: me1
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 3
division:
- 0.4188334986758365
- 0.4188334986758365
l:
type: m
rotation: 0
r:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.5917912750050387
- 0.5917912750050387
l:
rotation: 1
division:
- 0.8215672645503999
- 0.8215672645503999
l:
type: n
rotation: 0
r:
type: la1
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.6105714203573651
- 0.6105714203573651
l:
rotation: 0
division:
- 0.13738512099882866
- 0.13738512099882866
l:
type: t
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.8352659754204284
- 0.8352659754204284
l:
rotation: 0
division:
- 0.3860528485005146
- 0.3860528485005146
l:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.6121720340397159
- 0.6121720340397159
l:
rotation: 1
division:
- 0.5125
- 0.5125
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
type: O
rotation: 0
above:
rotation: 0
division:
- 0.5326764625682993
- 0.5326764625682993
height: 3.0
l:
rotation: 0
division:
- 0.5536579163160164
- 0.5536579163160164
l:
rotation: 0
division:
- 0.4853471066909839
- 0.4853471066909839
l:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
rotation: 0
division:
- 0.5993870419844443
- 0.5993870419844443
l:
rotation: 3
division:
- 0.7571959149418948
- 0.7571959149418948
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.7211389666113284
- 0.7211389666113284
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.43356671101589384
- 0.43356671101589384
l:
rotation: 0
division:
- 0.13133577297899704
- 0.13133577297899704
l:
rotation: 1
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5791570312500001
- 0.5791570312500001
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3350957664191451
- 0.3350957664191451
l:
type: li1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.781888627381648
- 0.781888627381648
l:
rotation: 0
division:
- 0.38499157916891213
- 0.38499157916891213
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4444444444444444
- 0.4444444444444444
l:
rotation: 0
division:
- 0.7997188424651172
- 0.7997188424651172
l:
type: r
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.538125
- 0.538125
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4902664331159802
- 0.4902664331159802
l:
rotation: 0
division:
- 0.6499007975748095
- 0.6499007975748095
l:
rotation: 0
division:
- 0.5193481864706366
- 0.5193481864706366
l:
rotation: 0
division:
- 0.26078324488789595
- 0.26078324488789595
l:
rotation: 0
division:
- 0.5005859374999999
- 0.5005859374999999
l:
type: ut1
rotation: 3
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.7987297048921393
- 0.7987297048921393
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.2873334582149999
- 0.2873334582149999
l:
rotation: 0
division:
- 0.375
- 0.375
l:
type: n
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4595786624530838
- 0.4595786624530838
l:
rotation: 0
division:
- 0.9210526315789473
- 0.9210526315789473
l:
type: r
rotation: 0
r:
rotation: 3
division:
- 0.6233177548828126
- 0.6233177548828126
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5559478988311726
- 0.5559478988311726
l:
rotation: 0
division:
- 0.2012702951078606
- 0.2012702951078606
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 3
r:
type: O
rotation: 2

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,336 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.4888900105484264
- 0.4888900105484264
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5938247521970288
- 0.5938247521970288
l:
rotation: 0
division:
- 0.5472887522186323
- 0.5472887522186323
l:
rotation: 1
division:
- 0.7482565199547276
- 0.7482565199547276
l:
rotation: 2
division:
- 0.7634740326506355
- 0.7634740326506355
l:
type: da1
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: O
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.48227518337297415
- 0.48227518337297415
l:
type: ws1
rotation: 0
r:
type: C
rotation: 2
r:
rotation: 1
division:
- 0.2876274429075646
- 0.2876274429075646
l:
rotation: 1
division:
- 0.4977615341676925
- 0.4977615341676925
l:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.5260108852851195
- 0.5260108852851195
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6397932334327496
- 0.6397932334327496
l:
type: t
share: 3
rotation: 0
r:
rotation: 1
division:
- 0.554484404426573
- 0.554484404426573
l:
type: la1
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 1
division:
- 0.8502200490349778
- 0.8502200490349778
l:
rotation: 0
division:
- 0.8442580239222437
- 0.8442580239222437
l:
rotation: 1
division:
- 0.3758880797422988
- 0.3758880797422988
l:
type: n
share: 3
rotation: 0
r:
type: of
rotation: 0
r:
rotation: 3
division:
- 0.5154341184740678
- 0.5154341184740678
l:
type: m
share: 3
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.2616194760651602
- 0.2616194760651602
l:
type: st1
rotation: 0
r:
rotation: 2
division:
- 0.5989008688013605
- 0.5989008688013605
l:
type: me1
rotation: 0
r:
type: O
rotation: 0
above:
rotation: 0
division:
- 0.5662620679201393
- 0.5662620679201393
height: 3.0
l:
rotation: 0
division:
- 0.5300569106355991
- 0.5300569106355991
l:
rotation: 0
division:
- 0.0863852684329759
- 0.0863852684329759
l:
type: t
share: 3
rotation: 0
r:
rotation: 0
division:
- 0.369644807975687
- 0.369644807975687
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.5125
- 0.5125
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6910915096691898
- 0.6910915096691898
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: n
share: 2
rotation: 0
r:
rotation: 0
division:
- 0.4566953630047795
- 0.4566953630047795
l:
rotation: 0
division:
- 0.16593799911395812
- 0.16593799911395812
l:
type: ut1
rotation: 0
r:
rotation: 3
division:
- 0.525234375
- 0.525234375
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
type: r
share: 3
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5670341721910087
- 0.5670341721910087
l:
rotation: 0
division:
- 0.5878540477469637
- 0.5878540477469637
l:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
type: r
share: 3
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.6580826806640626
- 0.6580826806640626
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.6164728327412322
- 0.6164728327412322
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6
- 0.6
l:
type: r
share: 3
rotation: 0
r:
type: li1
rotation: 0

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,464 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.6286425603099974
- 0.6286425603099974
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.6961787241446729
- 0.6961787241446729
l:
rotation: 1
division:
- 0.6961137205157485
- 0.6961137205157485
l:
rotation: 1
division:
- 0.8000952839254911
- 0.8000952839254911
l:
rotation: 0
division:
- 0.34228096821276366
- 0.34228096821276366
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.5134228458906376
- 0.5134228458906376
l:
rotation: 3
division:
- 0.7589264352872361
- 0.7589264352872361
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.6715791695479109
- 0.6715791695479109
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 2
division:
- 0.5008445945945945
- 0.5008445945945945
l:
type: O
rotation: 0
r:
type: st2
rotation: 0
r:
type: da1
rotation: 1
r:
rotation: 1
division:
- 0.6306097307187415
- 0.6306097307187415
l:
rotation: 0
division:
- 0.6050962605989646
- 0.6050962605989646
l:
type: ws1
rotation: 0
r:
rotation: 3
division:
- 0.41604578538190495
- 0.41604578538190495
l:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.5801999047842895
- 0.5801999047842895
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5554214466016547
- 0.5554214466016547
l:
rotation: 3
division:
- 0.6634630133762056
- 0.6634630133762056
l:
type: la1
rotation: 0
r:
type: C
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.3183073798142892
- 0.3183073798142892
l:
rotation: 1
division:
- 0.7288929527865818
- 0.7288929527865818
l:
rotation: 0
division:
- 0.6129209569176637
- 0.6129209569176637
l:
type: t
rotation: 0
r:
type: me1
rotation: 1
r:
rotation: 1
division:
- 0.7246951206523857
- 0.7246951206523857
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5017094185511319
- 0.5017094185511319
l:
rotation: 1
division:
- 0.30105918664949827
- 0.30105918664949827
l:
rotation: 1
division:
- 0.6638579318365495
- 0.6638579318365495
l:
rotation: 0
division:
- 0.5009003374542805
- 0.5009003374542805
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 2
r:
rotation: 1
division:
- 0.6870827721339403
- 0.6870827721339403
l:
type: n
rotation: 0
r:
rotation: 3
division:
- 0.6682526461519316
- 0.6682526461519316
l:
rotation: 0
division:
- 0.5327773503483957
- 0.5327773503483957
l:
type: m
rotation: 0
r:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.4214065690013669
- 0.4214065690013669
l:
type: k1
rotation: 0
r:
rotation: 3
division:
- 0.745677282404668
- 0.745677282404668
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.6917928468541735
- 0.6917928468541735
l:
type: m
rotation: 0
r:
type: C
rotation: 0
above:
rotation: 0
division:
- 0.5861099820713479
- 0.5861099820713479
height: 3.0
l:
rotation: 0
division:
- 0.8082997680406668
- 0.8082997680406668
l:
rotation: 0
division:
- 0.513508155522566
- 0.513508155522566
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: O
rotation: 2
r:
rotation: 0
division:
- 0.8221134914602137
- 0.8221134914602137
l:
rotation: 1
division:
- 0.5801999047842894
- 0.5801999047842894
l:
type: st2
rotation: 3
r:
rotation: 3
division:
- 0.723190234494442
- 0.723190234494442
l:
rotation: 0
division:
- 0.5910581976888503
- 0.5910581976888503
l:
type: r
rotation: 2
r:
type: ut1
rotation: 0
r:
type: r
rotation: 0
r:
type: st1
rotation: 1
r:
rotation: 0
division:
- 0.48717948717948717
- 0.48717948717948717
l:
rotation: 0
division:
- 0.5263157894736842
- 0.5263157894736842
l:
rotation: 2
division:
- 0.5804589225989242
- 0.5804589225989242
l:
rotation: 3
division:
- 0.5797902238175673
- 0.5797902238175673
l:
type: li1
rotation: 0
r:
type: st2
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5660486875944284
- 0.5660486875944284
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3426142512905777
- 0.3426142512905777
l:
rotation: 0
division:
- 0.14221480598659772
- 0.14221480598659772
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4470578082838084
- 0.4470578082838084
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 1
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 2
division:
- 0.5008445945945945
- 0.5008445945945945
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.19149268227071817
- 0.19149268227071817
l:
type: r
rotation: 0
r:
type: O
rotation: 0

View file

@ -0,0 +1,448 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5002414199166638
- 0.5002414199166638
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.6198201272472108
- 0.6198201272472108
l:
rotation: 2
division:
- 0.5217605220117958
- 0.5217605220117958
l:
rotation: 1
division:
- 0.7590430919985613
- 0.7590430919985613
l:
rotation: 2
division:
- 0.7938419737388742
- 0.7938419737388742
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.7498144387419106
- 0.7498144387419106
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: ws1
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 1
division:
- 0.2911433327061006
- 0.2911433327061006
l:
rotation: 1
division:
- 0.5088642132269535
- 0.5088642132269535
l:
type: t
rotation: 3
r:
rotation: 1
division:
- 0.5335936515673456
- 0.5335936515673456
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6472234492470668
- 0.6472234492470668
l:
rotation: 1
division:
- 0.43747481716202774
- 0.43747481716202774
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.6165142552980367
- 0.6165142552980367
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6134920533416099
- 0.6134920533416099
l:
type: m
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.5765395746194787
- 0.5765395746194787
l:
type: la1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.8472678521275332
- 0.8472678521275332
l:
rotation: 0
division:
- 0.8550118963253994
- 0.8550118963253994
l:
rotation: 1
division:
- 0.3775424828064208
- 0.3775424828064208
l:
rotation: 1
division:
- 0.47923829168651655
- 0.47923829168651655
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.7502693114328789
- 0.7502693114328789
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.6229469531250001
- 0.6229469531250001
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
type: of
rotation: 1
r:
rotation: 3
division:
- 0.5326035404958387
- 0.5326035404958387
l:
rotation: 2
division:
- 0.5011097383268266
- 0.5011097383268266
l:
type: m
rotation: 0
r:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.25132830102773074
- 0.25132830102773074
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.7173370258933403
- 0.7173370258933403
l:
rotation: 0
division:
- 0.2593642963194206
- 0.2593642963194206
l:
type: t
rotation: 0
r:
type: me1
rotation: 0
r:
type: C
rotation: 3
above:
rotation: 0
division:
- 0.5662620679201393
- 0.5662620679201393
height: 3.0
l:
rotation: 0
division:
- 0.5300569106355991
- 0.5300569106355991
l:
rotation: 0
division:
- 0.0863852684329759
- 0.0863852684329759
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: n
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5060943172283778
- 0.5060943172283778
l:
rotation: 0
division:
- 0.5599478567102678
- 0.5599478567102678
l:
rotation: 1
division:
- 0.7232561306495806
- 0.7232561306495806
l:
type: st1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.7185803637162013
- 0.7185803637162013
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.4566953630047795
- 0.4566953630047795
l:
rotation: 0
division:
- 0.16593799911395812
- 0.16593799911395812
l:
type: ut1
rotation: 0
r:
rotation: 3
division:
- 0.525234375
- 0.525234375
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.54782581409007
- 0.54782581409007
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5670341721910087
- 0.5670341721910087
l:
rotation: 0
division:
- 0.5878540477469637
- 0.5878540477469637
l:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.6580826806640626
- 0.6580826806640626
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.6164728327412322
- 0.6164728327412322
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6
- 0.6
l:
rotation: 0
division:
- 0.33824255258409636
- 0.33824255258409636
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5072078035781677
- 0.5072078035781677
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: li1
rotation: 0

View file

@ -0,0 +1,488 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.5066158952271099
- 0.5066158952271099
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.6277119594295387
- 0.6277119594295387
l:
rotation: 2
division:
- 0.5217907300660787
- 0.5217907300660787
l:
rotation: 1
division:
- 0.7976448943474054
- 0.7976448943474054
l:
rotation: 2
division:
- 0.8143512774678288
- 0.8143512774678288
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.7504256284125047
- 0.7504256284125047
l:
rotation: 0
division:
- 0.26287034668662324
- 0.26287034668662324
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: st1
rotation: 0
r:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5004075606170104
- 0.5004075606170104
l:
type: n
rotation: 0
r:
rotation: 2
division:
- 0.6077531250000001
- 0.6077531250000001
l:
type: ws1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.29138064981873296
- 0.29138064981873296
l:
rotation: 1
division:
- 0.5092789992523881
- 0.5092789992523881
l:
type: t
rotation: 3
r:
rotation: 1
division:
- 0.5473793099601537
- 0.5473793099601537
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6477510148237042
- 0.6477510148237042
l:
rotation: 1
division:
- 0.4599966274161975
- 0.4599966274161975
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.6170167891586066
- 0.6170167891586066
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6608090231764574
- 0.6608090231764574
l:
type: m
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.6058600004824546
- 0.6058600004824546
l:
type: la1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.8476974185476288
- 0.8476974185476288
l:
rotation: 0
division:
- 0.8549420379712187
- 0.8549420379712187
l:
rotation: 1
division:
- 0.3825733535221625
- 0.3825733535221625
l:
rotation: 1
division:
- 0.47962892899422604
- 0.47962892899422604
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.7508808718798621
- 0.7508808718798621
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.6234547304141608
- 0.6234547304141608
l:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 3
division:
- 0.5330376769510112
- 0.5330376769510112
l:
rotation: 2
division:
- 0.514056158602989
- 0.514056158602989
l:
type: m
rotation: 0
r:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.25153316406260884
- 0.25153316406260884
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.772781059439281
- 0.772781059439281
l:
rotation: 0
division:
- 0.3007138460938997
- 0.3007138460938997
l:
type: t
rotation: 0
r:
type: me1
rotation: 0
r:
type: C
rotation: 3
above:
rotation: 0
division:
- 0.5662620679201393
- 0.5662620679201393
height: 3.0
l:
rotation: 0
division:
- 0.5300569106355991
- 0.5300569106355991
l:
rotation: 0
division:
- 0.0863852684329759
- 0.0863852684329759
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5060943172283778
- 0.5060943172283778
l:
rotation: 0
division:
- 0.5604042820982167
- 0.5604042820982167
l:
rotation: 1
division:
- 0.7238456720793089
- 0.7238456720793089
l:
rotation: 0
division:
- 0.2502037803085052
- 0.2502037803085052
l:
type: st2
rotation: 0
r:
type: O
rotation: 1
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.7551243985204674
- 0.7551243985204674
l:
type: O
rotation: 0
r:
type: t
rotation: 1
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.4566953630047795
- 0.4566953630047795
l:
rotation: 0
division:
- 0.16593799911395812
- 0.16593799911395812
l:
type: ut1
rotation: 0
r:
rotation: 3
division:
- 0.525234375
- 0.525234375
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: li1
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.5482723585436795
- 0.5482723585436795
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5670341721910087
- 0.5670341721910087
l:
rotation: 0
division:
- 0.5878540477469637
- 0.5878540477469637
l:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.6580826806640626
- 0.6580826806640626
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.6164728327412322
- 0.6164728327412322
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6
- 0.6
l:
rotation: 0
division:
- 0.33824255258409636
- 0.33824255258409636
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5076212394289253
- 0.5076212394289253
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: r
rotation: 0

View file

@ -0,0 +1,459 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.4768163386613117
- 0.4768163386613117
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5944126599075639
- 0.5944126599075639
l:
rotation: 0
division:
- 0.5472804939816485
- 0.5472804939816485
l:
rotation: 1
division:
- 0.7402807143631926
- 0.7402807143631926
l:
rotation: 2
division:
- 0.7843005082023522
- 0.7843005082023522
l:
type: da1
rotation: 0
r:
rotation: 1
division:
- 0.6889510427688464
- 0.6889510427688464
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.5333081519606917
- 0.5333081519606917
l:
type: ws1
rotation: 0
r:
type: C
rotation: 2
r:
rotation: 1
division:
- 0.2885286993072057
- 0.2885286993072057
l:
rotation: 1
division:
- 0.4993212280676509
- 0.4993212280676509
l:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.5131825417010754
- 0.5131825417010754
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.7080034437357043
- 0.7080034437357043
l:
type: n
rotation: 2
r:
rotation: 1
division:
- 0.6139648311552325
- 0.6139648311552325
l:
rotation: 0
division:
- 0.5013591397304015
- 0.5013591397304015
l:
type: la1
rotation: 0
r:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.8722311548278028
- 0.8722311548278028
l:
rotation: 0
division:
- 0.8869957889673794
- 0.8869957889673794
l:
rotation: 1
division:
- 0.5312823722636988
- 0.5312823722636988
l:
rotation: 3
division:
- 0.44509745921579624
- 0.44509745921579624
l:
type: n
rotation: 0
r:
rotation: 2
division:
- 0.5617079338312922
- 0.5617079338312922
l:
type: st1
rotation: 2
r:
rotation: 1
division:
- 0.6898964202090871
- 0.6898964202090871
l:
rotation: 2
division:
- 0.5669044052004197
- 0.5669044052004197
l:
type: C
rotation: 0
r:
type: m
rotation: 0
r:
type: m
share: 3
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 3
division:
- 0.6363875026179511
- 0.6363875026179511
l:
type: m
share: 3
rotation: 0
r:
rotation: 0
division:
- 0.5269585225340474
- 0.5269585225340474
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 3
division:
- 0.29672041388757975
- 0.29672041388757975
l:
type: C
rotation: 2
r:
rotation: 0
division:
- 0.6007774742994366
- 0.6007774742994366
l:
type: me1
rotation: 0
r:
rotation: 2
division:
- 0.5278913421225281
- 0.5278913421225281
l:
type: C
rotation: 0
r:
type: t
rotation: 0
above:
rotation: 0
division:
- 0.5662620679201393
- 0.5662620679201393
height: 3.0
l:
rotation: 0
division:
- 0.5300569106355991
- 0.5300569106355991
l:
rotation: 0
division:
- 0.0863852684329759
- 0.0863852684329759
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 0
division:
- 0.369644807975687
- 0.369644807975687
l:
rotation: 0
division:
- 0.5141058756429728
- 0.5141058756429728
l:
rotation: 1
division:
- 0.5745701513392769
- 0.5745701513392769
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.7647707778293122
- 0.7647707778293122
l:
rotation: 2
division:
- 0.5156049090595325
- 0.5156049090595325
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: n
share: 2
rotation: 0
r:
rotation: 0
division:
- 0.4566953630047795
- 0.4566953630047795
l:
rotation: 0
division:
- 0.16593799911395812
- 0.16593799911395812
l:
type: ut1
rotation: 0
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 2
division:
- 0.5952496254604416
- 0.5952496254604416
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.36607851965817206
- 0.36607851965817206
l:
type: r
rotation: 0
r:
rotation: 2
division:
- 0.46749737177241624
- 0.46749737177241624
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.3650199894489847
- 0.3650199894489847
l:
type: n
rotation: 0
r:
type: O
rotation: 1
r:
rotation: 3
division:
- 0.32003090758775143
- 0.32003090758775143
l:
type: t
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5670341721910087
- 0.5670341721910087
l:
rotation: 0
division:
- 0.5878540477469637
- 0.5878540477469637
l:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
type: st2
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.7022341111436592
- 0.7022341111436592
l:
rotation: 2
division:
- 0.5954960653711328
- 0.5954960653711328
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6164728327412322
- 0.6164728327412322
l:
type: r
rotation: 2
r:
rotation: 0
division:
- 0.6
- 0.6
l:
rotation: 2
division:
- 0.553406681267078
- 0.553406681267078
l:
type: r
rotation: 0
r:
type: n
rotation: 0
r:
type: li1
rotation: 0

View file

@ -0,0 +1,448 @@
node:
- - 0.0
- 0.0
- - 25.0
- 2.0
- - 23.0
- 31.0
- - 0.0
- 31.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 1
division:
- 0.4888900105484264
- 0.4888900105484264
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5938247521970288
- 0.5938247521970288
l:
rotation: 0
division:
- 0.5472887522186323
- 0.5472887522186323
l:
rotation: 1
division:
- 0.7482565199547276
- 0.7482565199547276
l:
rotation: 2
division:
- 0.7634740326506355
- 0.7634740326506355
l:
type: da1
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
type: st1
rotation: 0
r:
type: O
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.48227518337297415
- 0.48227518337297415
l:
type: ws1
rotation: 0
r:
type: C
rotation: 2
r:
rotation: 1
division:
- 0.2876274429075646
- 0.2876274429075646
l:
rotation: 1
division:
- 0.4977615341676925
- 0.4977615341676925
l:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.5260108852851195
- 0.5260108852851195
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6397932334327496
- 0.6397932334327496
l:
rotation: 1
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.554484404426573
- 0.554484404426573
l:
type: la1
rotation: 0
r:
type: st1
rotation: 0
r:
rotation: 1
division:
- 0.8502200490349778
- 0.8502200490349778
l:
rotation: 0
division:
- 0.8442580239222437
- 0.8442580239222437
l:
rotation: 1
division:
- 0.3758880797422988
- 0.3758880797422988
l:
rotation: 1
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
type: of
rotation: 0
r:
rotation: 3
division:
- 0.5154341184740678
- 0.5154341184740678
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: m
rotation: 0
r:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.2616194760651602
- 0.2616194760651602
l:
type: st1
rotation: 0
r:
rotation: 2
division:
- 0.5989008688013605
- 0.5989008688013605
l:
type: me1
rotation: 0
r:
type: O
rotation: 0
above:
rotation: 0
division:
- 0.5662620679201393
- 0.5662620679201393
height: 3.0
l:
rotation: 0
division:
- 0.5300569106355991
- 0.5300569106355991
l:
rotation: 0
division:
- 0.0863852684329759
- 0.0863852684329759
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.369644807975687
- 0.369644807975687
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.5125
- 0.5125
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6910915096691898
- 0.6910915096691898
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.4566953630047795
- 0.4566953630047795
l:
rotation: 0
division:
- 0.16593799911395812
- 0.16593799911395812
l:
type: ut1
rotation: 0
r:
rotation: 3
division:
- 0.525234375
- 0.525234375
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5670341721910087
- 0.5670341721910087
l:
rotation: 0
division:
- 0.5878540477469637
- 0.5878540477469637
l:
rotation: 0
division:
- 0.2988974834269737
- 0.2988974834269737
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: st2
rotation: 0
r:
rotation: 3
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.6580826806640626
- 0.6580826806640626
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.6164728327412322
- 0.6164728327412322
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.6
- 0.6
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: li1
rotation: 0

View file

@ -7,6 +7,7 @@
spaces:
# GROUND FLOOR - Main Community Areas
cr1:
usage: living
name: Common Room with Fireplace
size:
- 80.0
@ -23,6 +24,7 @@ spaces:
- o
ef1:
usage: none
name: Entrance Foyer
size:
- 15.0
@ -40,6 +42,7 @@ spaces:
- m
da1:
usage: living
name: Dining Area
size:
- 60.0
@ -57,6 +60,7 @@ spaces:
- o
k1:
usage: kitchen
name: Kitchen
size:
- 30.0
@ -71,6 +75,7 @@ spaces:
# SLEEPING AREAS - Anonymous neighborhoods (5 total, 2 ground + 3 first)
n:
usage: bedroom
name: Neighborhood
size:
- 60.0
@ -87,6 +92,7 @@ spaces:
# GROUND FLOOR - Activity Spaces
ws1:
usage: living
name: Workshop Space
size:
- 40.0
@ -104,6 +110,7 @@ spaces:
# MEETING ROOMS - Anonymous interchangeable (3 total)
m:
usage: living
name: Meeting Room
size:
- 10.0
@ -121,6 +128,7 @@ spaces:
# GROUND FLOOR - Service Areas
# BATHROOMS - Ground floor (3 total)
t:
usage: toilet
name: Bathroom
size:
- 6.0
@ -130,9 +138,11 @@ spaces:
- 0.5
adjacency:
- c
- n # Brand: a WC beside sleeping space can be knocked through later
count: 6 # 3 ground + 3 first floor
la1:
usage: utility
name: Laundry Room
size:
- 20.0
@ -149,6 +159,8 @@ spaces:
- me1
st1:
crinkliness: none # no window needed
usage: utility
name: Ground Floor Storage
size:
- 22.0
@ -161,6 +173,8 @@ spaces:
- c
me1:
crinkliness: none # no window needed
usage: utility
name: Mechanical/Electrical Room
size:
- 25.0
@ -176,6 +190,7 @@ spaces:
# STAFF OFFICES - Anonymous (2 total)
of:
usage: bedroom
name: Staff Office
size:
- 12.5
@ -190,6 +205,7 @@ spaces:
# FIRST FLOOR - Community Areas
li1:
usage: living
name: Library Corner
size:
- 20.0
@ -203,6 +219,7 @@ spaces:
# FIRST FLOOR - Individual Rooms (10 anonymous rooms)
r:
usage: bedroom
name: Individual Room
size:
- 10.0
@ -217,6 +234,8 @@ spaces:
# FIRST FLOOR - Storage
st2:
crinkliness: none # no window needed
usage: utility
name: First Floor Storage
size:
- 18.0
@ -229,6 +248,8 @@ spaces:
- c
ut1:
crinkliness: none # no window needed
usage: utility
name: Utilities Closet
size:
- 14.0
@ -243,17 +264,28 @@ spaces:
# Building constraints
storey_minimum: 2
storey_limit: 3
force_roof_garden: 0
# homemaker-py-hxi (DESIGN.md §39.25): ENABLED. Fails a level that has no
# outdoor space at all -- Alexander's actual requirement, per level and with no
# quantity attached. It had been off in every corpus config, so the only thing
# expressing outdoor space was ratio_outside's arbitrary fraction.
force_roof_garden: 1
# Circulation ratio (allow more circulation for larger building)
# homemaker-py-hxi (DESIGN.md §39.24): disabled. The score is value/cost, a
# ratio, so the per-m2 economics (circulation worth 50 against a build cost of
# 200) is ALREADY a proportional pressure against circulation -- this said the
# same thing a second time, and with a curve where twice the corridor is far
# more than twice as bad. Its other side, "a building needs some circulation",
# was worth at most 13% here and is enforced structurally anyway by the access
# and connectivity checks. Set a [target, sigma] pair to re-enable.
ratio_circulation:
- 0.08
- 0.15
# Outside space ratio (courtyard requirement)
# homemaker-py-hxi (DESIGN.md §39.25): disabled. Alexander says every level
# should have accessible outside space; he does not say how much. The
# qualitative requirement is force_roof_garden below. Set a [target, sigma]
# pair to re-enable this quantitative one.
ratio_outside:
- 0.15
- 0.10
# Staircase requirements (main + secondary)
staircase_min: 2
@ -263,4 +295,9 @@ staircase_max: 2
value_inside: 300.0
value_circulation: 50.0
value_outside: 100.0
value_supported: 300.0
# homemaker-py-ecx (DESIGN.md §39.19): an upper-level terrace is worth what
# outdoor space is worth (value_outside); it is the COST that differs by level
# (outside 10.0 vs outside_supported 110.0), not the value. At 300.0 -- the
# `value_inside` rate -- a terrace was worth more per square metre than a real
# internal room, which the owner ruled out.
value_supported: 100.0

View file

@ -0,0 +1,292 @@
node:
- - -2.499098
- 3.896165
- - 16.284033
- 8.678435
- - 11.155808
- 29.106947
- - -8.073955
- 25.262724
perimeter:
a: private
b: null
c: null
d: null
rotation: 1
division:
- 0.5286180805540397
- 0.5286180805540397
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5548181096225262
- 0.5548181096225262
l:
rotation: 1
division:
- 0.4910959187486891
- 0.4910959187486891
l:
rotation: 1
division:
- 0.39165065346821715
- 0.39165065346821715
l:
rotation: 1
division:
- 0.5286747953765261
- 0.5286747953765261
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.5073915709272532
- 0.5073915709272532
l:
type: C
rotation: 0
r:
type: t9
rotation: 0
r:
rotation: 0
division:
- 0.6789833554643051
- 0.6789833554643051
l:
type: wa1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.37936865556483007
- 0.37936865556483007
l:
rotation: 1
division:
- 0.5751518803895523
- 0.5751518803895523
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3434916386608414
- 0.3434916386608414
l:
type: ph1
rotation: 0
r:
type: pt1
rotation: 0
r:
rotation: 1
division:
- 0.5472482550512459
- 0.5472482550512459
l:
rotation: 1
division:
- 0.5717924171555203
- 0.5717924171555203
l:
rotation: 1
division:
- 0.4409813747940315
- 0.4409813747940315
l:
type: C
rotation: 0
r:
type: br1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.41364489805177573
- 0.41364489805177573
l:
rotation: 1
division:
- 0.5482954695086615
- 0.5482954695086615
l:
type: mo1
rotation: 0
r:
type: dp1
rotation: 0
r:
rotation: 0
division:
- 0.5212170858325074
- 0.5212170858325074
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.46373341702925686
- 0.46373341702925686
l:
type: t9
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.4407559182834302
- 0.4407559182834302
l:
rotation: 1
division:
- 0.4417442809854565
- 0.4417442809854565
l:
rotation: 3
division:
- 0.7274378846643093
- 0.7274378846643093
l:
rotation: 0
division:
- 0.6618005954237105
- 0.6618005954237105
l:
type: tr1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.31747964545355944
- 0.31747964545355944
l:
type: t10
rotation: 0
r:
type: re1
rotation: 0
r:
rotation: 1
division:
- 0.5771110251494367
- 0.5771110251494367
l:
rotation: 1
division:
- 0.44296062164922595
- 0.44296062164922595
l:
rotation: 3
division:
- 0.5024066201491242
- 0.5024066201491242
l:
type: zt1
rotation: 0
r:
type: O
rotation: 0
r:
type: ao1
rotation: 0
r:
rotation: 1
division:
- 0.6268769335384348
- 0.6268769335384348
l:
rotation: 1
division:
- 0.5125
- 0.5125
l:
type: qr1
rotation: 0
r:
type: rc1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 2
division:
- 0.6240746638398098
- 0.6240746638398098
l:
rotation: 1
division:
- 0.5496871290519072
- 0.5496871290519072
l:
rotation: 1
division:
- 0.4840187454075916
- 0.4840187454075916
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.505063907726268
- 0.505063907726268
l:
type: C
rotation: 0
r:
type: kt1
rotation: 0
r:
rotation: 1
division:
- 0.7274159015455219
- 0.7274159015455219
l:
type: ms1
rotation: 0
r:
type: me1
rotation: 0
r:
rotation: 1
division:
- 0.7182885358197997
- 0.7182885358197997
l:
rotation: 0
division:
- 0.7129912566129764
- 0.7129912566129764
l:
type: de1
rotation: 0
r:
type: C
rotation: 0
r:
type: gp1
rotation: 3

View file

@ -0,0 +1,86 @@
seed : /home/bruno/src/homemaker-layout/examples/health-centre/init.dom
programme : health-centre
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/health-centre/coldstart-500000-s0.dom
[ 80 evals] best 8.18513e-10 (fails 22) via construct/0
[ 1920 evals] best 1.44035e-09 (fails 21) via level_compound_fix noop
[ 2720 evals] best 2.97297e-09 (fails 21) via place_missing t9 -> rlrll
[ 2880 evals] best 3.17196e-09 (fails 21) via crossover rrlrr<->llrrl
[ 2960 evals] best 3.38093e-09 (fails 21) via level_retype noop
[ 3280 evals] best 3.95337e-08 (fails 18) via place_missing me1 -> lrrrr
[ 3440 evals] best 1.55555e-07 (fails 16) via place_missing mo1 -> lrrrr
[ 4480 evals] best 1.63054e-07 (fails 16) via level_delete noop
[ 4960 evals] best 1.68058e-07 (fails 16) via core_divide noop
[ 5200 evals] best 1.73172e-07 (fails 16) via level_compound_fix noop
[ 6480 evals] best 1.32598e-05 (fails 9) via crossover rrll<->lllr
[ 8160 evals] best 1.5086e-05 (fails 9) via core_divide noop
[ 8800 evals] best 1.59072e-05 (fails 9) via swap 0/rrlr
[ 9280 evals] best 1.68254e-05 (fails 9) via core_divide noop
[ 9360 evals] best 1.79867e-05 (fails 9) via swap 0/rllr
[ 11280 evals] best 1.9237e-05 (fails 8) via level_delete noop
[ 12800 evals] best 3.78619e-05 (fails 8) via retype 0/rrlrr->tr1
[ 13040 evals] best 0.000117921 (fails 6) via swap 0/llll
[ 13360 evals] best 0.000135727 (fails 6) via level_compound_fix noop
[ 14080 evals] best 0.0002732 (fails 5) via crossover rrrr<->rllr
[ 15040 evals] best 0.000306904 (fails 5) via level_retype noop
[ 15840 evals] best 0.000324217 (fails 5) via retype 0/lllrl->qr1
[ 16160 evals] best 0.000342695 (fails 5) via level_fix noop
[ 20400 evals] best 0.000360157 (fails 5) via level_delete noop
[ 20960 evals] best 0.000378411 (fails 5) via level_compound_fix noop
[ 21360 evals] best 0.000141908 (fails 4) via crossover rrll<->llll
[ 22080 evals] best 0.000169723 (fails 4) via core_undivide noop
[ 22400 evals] best 0.000170498 (fails 4) via rotate 0/lrrrr
[ 23200 evals] best 0.000181366 (fails 4) via level_compound_fix noop
[ 26560 evals] best 0.000182185 (fails 4) via level_compound_fix noop
[ 27520 evals] best 0.000194431 (fails 4) via level_fix noop
[ 28320 evals] best 0.000206958 (fails 4) via core_divide noop
[ 29120 evals] best 0.000220107 (fails 4) via level_retype noop
[ 31760 evals] best 0.000230833 (fails 4) via core_divide noop
[ 32000 evals] best 0.000395146 (fails 3) via crossover rllrl<->rrlrr
[ 32320 evals] best 0.000420102 (fails 3) via swap 0/rrlr
[ 32960 evals] best 0.000439878 (fails 3) via crossover rrrrr<->llllrr
[ 33120 evals] best 0.000458971 (fails 3) via level_fix noop
[ 34160 evals] best 0.000478749 (fails 3) via level_fix noop
[ 34640 evals] best 0.000744 (fails 3) via undivide 0/lrlr
[ 39280 evals] best 0.000770381 (fails 3) via level_fix noop
[ 40800 evals] best 0.00079688 (fails 3) via level_compound_fix noop
[ 40880 evals] best 0.000821741 (fails 3) via core_undivide noop
[ 41200 evals] best 0.000841435 (fails 3) via core_undivide noop
[ 46480 evals] best 0.000867499 (fails 3) via level_delete noop
[ 47360 evals] best 0.00127332 (fails 3) via crossover rlrrr<->rrllrl
[ 50880 evals] best 0.00131277 (fails 3) via crossover rrrlr<->rrllrl
[ 52240 evals] best 0.0013505 (fails 3) via core_undivide noop
[ 53120 evals] best 0.00137937 (fails 3) via level_retype noop
[ 53840 evals] best 0.00139966 (fails 3) via level_retype noop
[ 57040 evals] best 0.00142768 (fails 3) via core_divide noop
[ 59920 evals] best 0.00145592 (fails 3) via level_compound_fix noop
[ 60080 evals] best 0.00148344 (fails 3) via level_fix noop
[ 65920 evals] best 0.00151078 (fails 3) via level_retype noop
[ 68720 evals] best 0.00154496 (fails 3) via core_undivide noop
[ 68880 evals] best 0.00157101 (fails 3) via retype 0/rrrrr->dp1
[ 70480 evals] best 0.00159557 (fails 3) via crossover lrlll<->lrlll
[ 70640 evals] best 0.00161909 (fails 3) via level_fix noop
[ 70880 evals] best 0.00164187 (fails 3) via core_divide noop
[ 75200 evals] best 0.0016633 (fails 3) via crossover rlrlr<->rlrlr
[ 75760 evals] best 0.00168434 (fails 3) via core_undivide noop
[ 76080 evals] best 0.00172043 (fails 3) via level_compound_fix noop
[ 77360 evals] best 0.00174777 (fails 3) via level_fix noop
[ 77440 evals] best 0.00175949 (fails 3) via core_undivide noop
[ 81360 evals] best 0.00178352 (fails 3) via crossover rrll<->llll
[ 81440 evals] best 0.00181117 (fails 3) via level_fix noop
[ 84000 evals] best 0.00181757 (fails 3) via crossover lllll<->llrlr
[ 87920 evals] best 0.00181815 (fails 3) via core_divide noop

View file

@ -0,0 +1,260 @@
node:
- - -2.499098
- 3.896165
- - 16.284033
- 8.678435
- - 11.155808
- 29.106947
- - -8.073955
- 25.262724
perimeter:
a: private
b: null
c: null
d: null
rotation: 1
division:
- 0.5701666606862493
- 0.5701666606862493
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.4840271488806444
- 0.4840271488806444
l:
rotation: 1
division:
- 0.5354807534159516
- 0.5354807534159516
l:
rotation: 1
division:
- 0.5244535547136123
- 0.5244535547136123
l:
rotation: 1
division:
- 0.5266921686935456
- 0.5266921686935456
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.509959364564228
- 0.509959364564228
l:
type: re1
rotation: 1
r:
type: O
rotation: 0
r:
type: pt1
rotation: 1
r:
rotation: 1
division:
- 0.51615828542533
- 0.51615828542533
l:
rotation: 1
division:
- 0.5156401493228953
- 0.5156401493228953
l:
type: O
rotation: 0
r:
type: mo1
rotation: 0
r:
rotation: 1
division:
- 0.61768114817708
- 0.61768114817708
l:
type: gp1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.6584193216875921
- 0.6584193216875921
l:
rotation: 1
division:
- 0.7950283540618827
- 0.7950283540618827
l:
rotation: 2
division:
- 0.702320213548134
- 0.702320213548134
l:
rotation: 1
division:
- 0.5150591948587837
- 0.5150591948587837
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6462482590826826
- 0.6462482590826826
l:
type: rc1
rotation: 0
r:
type: O
rotation: 0
r:
type: br1
rotation: 0
r:
type: ph1
rotation: 1
r:
rotation: 1
division:
- 0.49713045553185103
- 0.49713045553185103
l:
type: C
rotation: 0
r:
type: wa1
rotation: 0
r:
rotation: 1
division:
- 0.6427828114917011
- 0.6427828114917011
l:
rotation: 0
division:
- 0.7223946504418148
- 0.7223946504418148
l:
rotation: 1
division:
- 0.7230237530995272
- 0.7230237530995272
l:
rotation: 1
division:
- 0.556601514753792
- 0.556601514753792
l:
rotation: 1
division:
- 0.6903707936703987
- 0.6903707936703987
l:
rotation: 3
division:
- 0.5424393697846557
- 0.5424393697846557
l:
type: me1
rotation: 0
r:
type: dp1
rotation: 0
r:
type: C
rotation: 0
r:
type: ms1
rotation: 0
r:
rotation: 1
division:
- 0.7762930779409527
- 0.7762930779409527
l:
type: ao1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6699089068785757
- 0.6699089068785757
l:
rotation: 2
division:
- 0.548549015630394
- 0.548549015630394
l:
type: qr1
rotation: 1
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: t9
rotation: 0
r:
type: t9
rotation: 0
r:
type: O
rotation: 2
r:
rotation: 1
division:
- 0.49413504987498297
- 0.49413504987498297
l:
rotation: 1
division:
- 0.5753083563813634
- 0.5753083563813634
l:
type: tr1
rotation: 1
r:
rotation: 1
division:
- 0.8047412705277578
- 0.8047412705277578
l:
type: C
rotation: 0
r:
type: t10
rotation: 0
r:
rotation: 1
division:
- 0.629162144943071
- 0.629162144943071
l:
type: de1
rotation: 1
r:
rotation: 1
division:
- 0.6632706380144355
- 0.6632706380144355
l:
type: kt1
rotation: 0
r:
type: zt1
rotation: 0

View file

@ -0,0 +1,312 @@
seed : /home/bruno/src/homemaker-layout/examples/health-centre/init.dom
programme : health-centre
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 1
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/health-centre/coldstart-500000-s1.dom
[ 80 evals] best 3.1736e-10 (fails 22) via construct/0
[ 1680 evals] best 3.50032e-10 (fails 22) via divide 0/rrrlr
[ 1760 evals] best 7.19233e-10 (fails 21) via crossover llrrl<->lrllr
[ 3280 evals] best 1.03739e-09 (fails 21) via divide 0/rrllr
[ 4960 evals] best 1.22255e-09 (fails 21) via level_compound_fix noop
[ 5280 evals] best 4.22556e-09 (fails 21) via core_divide noop
[ 5600 evals] best 5.51514e-09 (fails 21) via undivide 0/lrrl
[ 5680 evals] best 8.91318e-09 (fails 20) via core_divide noop
[ 6160 evals] best 9.30404e-09 (fails 20) via swap 0/rllr
[ 6240 evals] best 9.84227e-09 (fails 20) via level_fix noop
[ 6880 evals] best 3.11282e-08 (fails 18) via swap 0/lllr
[ 7920 evals] best 3.54361e-08 (fails 18) via core_undivide noop
[ 8720 evals] best 3.87738e-08 (fails 18) via level_retype noop
[ 9440 evals] best 4.0316e-08 (fails 18) via core_undivide noop
[ 10160 evals] best 4.28614e-08 (fails 18) via level_retype noop
[ 11280 evals] best 4.44456e-08 (fails 18) via level_retype noop
[ 11680 evals] best 4.57955e-08 (fails 18) via core_divide noop
[ 11760 evals] best 4.70161e-08 (fails 18) via level_fix noop
[ 12080 evals] best 4.80406e-08 (fails 18) via core_divide noop
[ 12480 evals] best 4.88839e-08 (fails 18) via crossover llll<->llrr
[ 13680 evals] best 5.00536e-08 (fails 18) via core_undivide noop
[ 13920 evals] best 5.1903e-08 (fails 18) via core_divide noop
[ 15360 evals] best 1.07206e-07 (fails 17) via rotate 0/lrll
[ 16000 evals] best 1.11145e-07 (fails 17) via level_retype noop
[ 16960 evals] best 1.15107e-07 (fails 17) via level_compound_fix noop
[ 20160 evals] best 1.18837e-07 (fails 17) via level_compound_fix noop
[ 20720 evals] best 1.23415e-07 (fails 17) via core_divide noop
[ 21600 evals] best 1.28355e-07 (fails 17) via core_undivide noop
[ 22640 evals] best 1.45451e-07 (fails 17) via crossover rllrr<->rrlll
[ 22720 evals] best 2.11935e-07 (fails 15) via divide 0/rllll
[ 23360 evals] best 2.59099e-07 (fails 15) via level_compound_fix noop
[ 24560 evals] best 2.70734e-07 (fails 15) via level_retype noop
[ 24880 evals] best 2.831e-07 (fails 15) via crossover rlrll<->rrrrl
[ 26640 evals] best 2.96078e-07 (fails 15) via level_fix noop
[ 29360 evals] best 2.23985e-07 (fails 12) via crossover llllr<->llrll
[ 30640 evals] best 3.33889e-07 (fails 12) via retype 0/lllrr->qr1
[ 30880 evals] best 7.38785e-07 (fails 12) via undivide 0/lllr
[ 32400 evals] best 8.40919e-07 (fails 12) via core_undivide noop
[ 32800 evals] best 9.27558e-07 (fails 12) via level_retype noop
[ 33520 evals] best 9.64174e-07 (fails 12) via level_compound_fix noop
[ 34480 evals] best 1.00228e-06 (fails 12) via level_compound_fix noop
[ 35200 evals] best 2.78977e-06 (fails 11) via crossover rllr<->lrlr
[ 35920 evals] best 2.85975e-06 (fails 11) via core_undivide noop
[ 36960 evals] best 2.92802e-06 (fails 11) via crossover rrlll<->lrrrl
[ 40160 evals] best 2.99391e-06 (fails 11) via core_undivide noop
[ 42240 evals] best 3.05636e-06 (fails 11) via core_undivide noop
[ 43520 evals] best 3.79692e-06 (fails 11) via level_fix noop
[ 44000 evals] best 3.86939e-06 (fails 11) via level_compound_fix noop
[ 44560 evals] best 3.92184e-06 (fails 11) via core_divide noop
[ 45200 evals] best 4.00078e-06 (fails 11) via level_retype noop
[ 46640 evals] best 4.07573e-06 (fails 11) via crossover lrrll<->rrrll
[ 49120 evals] best 4.1134e-06 (fails 11) via core_undivide noop
[ 49520 evals] best 4.13763e-06 (fails 11) via level_compound_fix noop
[ 49920 evals] best 4.14563e-06 (fails 11) via core_divide noop
[ 50240 evals] best 4.14854e-06 (fails 11) via level_fix noop
[ 50720 evals] best 4.28298e-06 (fails 11) via level_fix noop
[ 51280 evals] best 4.28373e-06 (fails 11) via retype 0/lrlll->me1
[ 55120 evals] best 9.85033e-07 (fails 10) via crossover lrlll<->llll
[ 55360 evals] best 1.01968e-06 (fails 10) via level_compound_fix noop
[ 57280 evals] best 1.4741e-06 (fails 10) via undivide 0/lrrr
[ 58640 evals] best 1.50576e-06 (fails 10) via level_fix noop
[ 59040 evals] best 1.54157e-06 (fails 10) via level_retype noop
[ 60320 evals] best 1.58245e-06 (fails 10) via core_undivide noop
[ 62080 evals] best 1.60981e-06 (fails 10) via crossover lrr<->lrr
[ 63840 evals] best 2.74194e-06 (fails 9) via retype 0/rrrrr->mo1
[ 64400 evals] best 2.81093e-06 (fails 9) via core_divide noop
[ 64560 evals] best 2.89773e-06 (fails 9) via core_divide noop
[ 66080 evals] best 1.42037e-05 (fails 8) via crossover lrr<->rrll
[ 66880 evals] best 1.48441e-05 (fails 8) via rotate 0/rlrr
[ 68080 evals] best 1.52409e-05 (fails 8) via level_fix noop
[ 68560 evals] best 1.56119e-05 (fails 8) via level_retype noop
[ 69120 evals] best 1.59331e-05 (fails 8) via level_compound_fix noop
[ 70880 evals] best 1.61441e-05 (fails 8) via level_compound_fix noop
[ 71120 evals] best 3.42507e-05 (fails 7) via undivide 0/rrrl
[ 72640 evals] best 3.47537e-05 (fails 7) via core_undivide noop
[ 75840 evals] best 3.49427e-05 (fails 7) via level_retype noop
[ 77040 evals] best 3.49682e-05 (fails 7) via core_divide noop
[ 77520 evals] best 3.50353e-05 (fails 7) via retype 0/rrrl->qr1
[ 78800 evals] best 3.64925e-05 (fails 7) via level_fix noop
[ 81280 evals] best 3.7884e-05 (fails 7) via core_undivide noop
[ 81520 evals] best 3.89932e-05 (fails 7) via core_divide noop
[ 82640 evals] best 3.98419e-05 (fails 7) via core_divide noop
[ 85360 evals] best 4.05998e-05 (fails 7) via level_retype noop
[ 87440 evals] best 4.128e-05 (fails 7) via level_retype noop
[ 88160 evals] best 4.17275e-05 (fails 7) via core_undivide noop
[ 90080 evals] best 4.20007e-05 (fails 7) via level_retype noop
[ 92560 evals] best 4.21287e-05 (fails 7) via level_compound_fix noop
[ 92960 evals] best 4.22968e-05 (fails 7) via level_delete noop
[ 97360 evals] best 4.24328e-05 (fails 7) via level_compound_fix noop
[102000 evals] best 4.24811e-05 (fails 7) via level_retype noop
[105200 evals] best 4.25673e-05 (fails 7) via core_divide noop
[106080 evals] best 4.29149e-05 (fails 7) via crossover rlrl<->rrrr
[107200 evals] best 4.32068e-05 (fails 7) via retype 0/rrllr->qr1
[107520 evals] best 4.32209e-05 (fails 7) via retype 0/rrrl->dp1
[113520 evals] best 4.32209e-05 (fails 7) via crossover lrrr<->rrrl
[122880 evals] best 9.30692e-05 (fails 7) via undivide 0/rlrr
[123520 evals] best 9.32949e-05 (fails 7) via level_fix noop
[124480 evals] best 9.33002e-05 (fails 7) via level_fix noop
[144400 evals] best 0.000107422 (fails 7) via undivide 0/rlrr
[148560 evals] best 0.000113564 (fails 7) via retype 0/lrlllrl->t10
[150640 evals] best 0.000117071 (fails 7) via level_compound_fix noop
[151040 evals] best 0.000121829 (fails 7) via level_retype noop
[153040 evals] best 0.000124879 (fails 7) via level_retype noop
[157680 evals] best 0.000126775 (fails 7) via crossover lrlllrr<->llrll
[158800 evals] best 0.000240095 (fails 7) via undivide 0/rrll
[163680 evals] best 0.000499652 (fails 6) via level_retype noop
[164640 evals] best 0.000508459 (fails 6) via core_undivide noop
[165440 evals] best 0.00050947 (fails 6) via level_retype noop
[174400 evals] best 0.000510996 (fails 6) via core_undivide noop
[201200 evals] best 0.000521531 (fails 6) via rotate 0/rrrr
[202800 evals] best 0.000524554 (fails 6) via level_compound_fix noop
[216400 evals] best 0.000524554 (fails 6) via crossover rlllr<->rrll
[231680 evals] best 0.000581588 (fails 6) via crossover llrr<->rllr
[232800 evals] best 0.000631983 (fails 6) via crossover rllllr<->rllllr
[233600 evals] best 0.000663972 (fails 6) via rotate 0/rlllll
[234400 evals] best 0.000679543 (fails 6) via rotate 0/lr
[235120 evals] best 0.000680799 (fails 6) via level_compound_fix noop
[235280 evals] best 0.000704214 (fails 6) via level_fix noop
[235360 evals] best 0.00070883 (fails 6) via level_compound_fix noop
[235600 evals] best 0.000710322 (fails 6) via level_fix noop
[282720 evals] best 0.000710418 (fails 6) via level_retype noop
[283200 evals] best 0.000710928 (fails 6) via core_divide noop
[288800 evals] best 0.000783033 (fails 6) via swap 0/llllr
[299600 evals] best 0.000806961 (fails 6) via undivide 0/lrlr
[405760 evals] best 0.00148576 (fails 5) via level_compound_fix noop
[405840 evals] best 0.00148617 (fails 5) via core_divide noop
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 2 shared-leaf copies
[ 200 evals] best 1.47634e-06 (fails 15) via seed
[ 280 evals] best 1.49152e-06 (fails 15) via level_retype noop
[ 600 evals] best 1.50542e-06 (fails 15) via level_compound_fix noop
[ 680 evals] best 1.51829e-06 (fails 15) via level_fix noop
[ 840 evals] best 4.82862e-05 (fails 10) via undivide 0/rrrrr
[ 1880 evals] best 4.84983e-05 (fails 10) via crossover rlrlrr<->llllrl
[ 38440 evals] best 8.15165e-05 (fails 9) via swap 0/rlrlr
[ 41960 evals] best 8.32787e-05 (fails 9) via core_undivide noop
[ 42120 evals] best 9.93915e-05 (fails 9) via crossover rrrr<->rlrlr
[114680 evals] best 0.000100561 (fails 9) via retype 0/rrrrr->zt1
[182760 evals] best 0.000100577 (fails 9) via crossover rlllllr<->llrrl
[184200 evals] best 0.000101129 (fails 9) via core_undivide noop
[186920 evals] best 0.000101234 (fails 9) via level_fix noop
[187160 evals] best 0.000101292 (fails 9) via retype 0/rllllll->dp1
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 97 → 9 fails (applied)
--- done ---
elapsed : 124897.0s
evals : 750040 across 9374 topologies
best : 0.000101292 (9 fails) via retype 0/rllllll->dp1+collapse
improvement history:
[ 80] 3.1736e-10 (share:construct/0)
[ 1680] 3.50032e-10 (share:divide 0/rrrlr)
[ 1760] 7.19233e-10 (share:crossover llrrl<->lrllr)
[ 3280] 1.03739e-09 (share:divide 0/rrllr)
[ 4960] 1.22255e-09 (share:level_compound_fix noop)
[ 5280] 4.22556e-09 (share:core_divide noop)
[ 5600] 5.51514e-09 (share:undivide 0/lrrl)
[ 5680] 8.91318e-09 (share:core_divide noop)
[ 6160] 9.30404e-09 (share:swap 0/rllr)
[ 6240] 9.84227e-09 (share:level_fix noop)
[ 6880] 3.11282e-08 (share:swap 0/lllr)
[ 7920] 3.54361e-08 (share:core_undivide noop)
[ 8720] 3.87738e-08 (share:level_retype noop)
[ 9440] 4.0316e-08 (share:core_undivide noop)
[ 10160] 4.28614e-08 (share:level_retype noop)
[ 11280] 4.44456e-08 (share:level_retype noop)
[ 11680] 4.57955e-08 (share:core_divide noop)
[ 11760] 4.70161e-08 (share:level_fix noop)
[ 12080] 4.80406e-08 (share:core_divide noop)
[ 12480] 4.88839e-08 (share:crossover llll<->llrr)
[ 13680] 5.00536e-08 (share:core_undivide noop)
[ 13920] 5.1903e-08 (share:core_divide noop)
[ 15360] 1.07206e-07 (share:rotate 0/lrll)
[ 16000] 1.11145e-07 (share:level_retype noop)
[ 16960] 1.15107e-07 (share:level_compound_fix noop)
[ 20160] 1.18837e-07 (share:level_compound_fix noop)
[ 20720] 1.23415e-07 (share:core_divide noop)
[ 21600] 1.28355e-07 (share:core_undivide noop)
[ 22640] 1.45451e-07 (share:crossover rllrr<->rrlll)
[ 22720] 2.11935e-07 (share:divide 0/rllll)
[ 23360] 2.59099e-07 (share:level_compound_fix noop)
[ 24560] 2.70734e-07 (share:level_retype noop)
[ 24880] 2.831e-07 (share:crossover rlrll<->rrrrl)
[ 26640] 2.96078e-07 (share:level_fix noop)
[ 29360] 2.23985e-07 (share:crossover llllr<->llrll)
[ 30640] 3.33889e-07 (share:retype 0/lllrr->qr1)
[ 30880] 7.38785e-07 (share:undivide 0/lllr)
[ 32400] 8.40919e-07 (share:core_undivide noop)
[ 32800] 9.27558e-07 (share:level_retype noop)
[ 33520] 9.64174e-07 (share:level_compound_fix noop)
[ 34480] 1.00228e-06 (share:level_compound_fix noop)
[ 35200] 2.78977e-06 (share:crossover rllr<->lrlr)
[ 35920] 2.85975e-06 (share:core_undivide noop)
[ 36960] 2.92802e-06 (share:crossover rrlll<->lrrrl)
[ 40160] 2.99391e-06 (share:core_undivide noop)
[ 42240] 3.05636e-06 (share:core_undivide noop)
[ 43520] 3.79692e-06 (share:level_fix noop)
[ 44000] 3.86939e-06 (share:level_compound_fix noop)
[ 44560] 3.92184e-06 (share:core_divide noop)
[ 45200] 4.00078e-06 (share:level_retype noop)
[ 46640] 4.07573e-06 (share:crossover lrrll<->rrrll)
[ 49120] 4.1134e-06 (share:core_undivide noop)
[ 49520] 4.13763e-06 (share:level_compound_fix noop)
[ 49920] 4.14563e-06 (share:core_divide noop)
[ 50240] 4.14854e-06 (share:level_fix noop)
[ 50720] 4.28298e-06 (share:level_fix noop)
[ 51280] 4.28373e-06 (share:retype 0/lrlll->me1)
[ 55120] 9.85033e-07 (share:crossover lrlll<->llll)
[ 55360] 1.01968e-06 (share:level_compound_fix noop)
[ 57280] 1.4741e-06 (share:undivide 0/lrrr)
[ 58640] 1.50576e-06 (share:level_fix noop)
[ 59040] 1.54157e-06 (share:level_retype noop)
[ 60320] 1.58245e-06 (share:core_undivide noop)
[ 62080] 1.60981e-06 (share:crossover lrr<->lrr)
[ 63840] 2.74194e-06 (share:retype 0/rrrrr->mo1)
[ 64400] 2.81093e-06 (share:core_divide noop)
[ 64560] 2.89773e-06 (share:core_divide noop)
[ 66080] 1.42037e-05 (share:crossover lrr<->rrll)
[ 66880] 1.48441e-05 (share:rotate 0/rlrr)
[ 68080] 1.52409e-05 (share:level_fix noop)
[ 68560] 1.56119e-05 (share:level_retype noop)
[ 69120] 1.59331e-05 (share:level_compound_fix noop)
[ 70880] 1.61441e-05 (share:level_compound_fix noop)
[ 71120] 3.42507e-05 (share:undivide 0/rrrl)
[ 72640] 3.47537e-05 (share:core_undivide noop)
[ 75840] 3.49427e-05 (share:level_retype noop)
[ 77040] 3.49682e-05 (share:core_divide noop)
[ 77520] 3.50353e-05 (share:retype 0/rrrl->qr1)
[ 78800] 3.64925e-05 (share:level_fix noop)
[ 81280] 3.7884e-05 (share:core_undivide noop)
[ 81520] 3.89932e-05 (share:core_divide noop)
[ 82640] 3.98419e-05 (share:core_divide noop)
[ 85360] 4.05998e-05 (share:level_retype noop)
[ 87440] 4.128e-05 (share:level_retype noop)
[ 88160] 4.17275e-05 (share:core_undivide noop)
[ 90080] 4.20007e-05 (share:level_retype noop)
[ 92560] 4.21287e-05 (share:level_compound_fix noop)
[ 92960] 4.22968e-05 (share:level_delete noop)
[ 97360] 4.24328e-05 (share:level_compound_fix noop)
[102000] 4.24811e-05 (share:level_retype noop)
[105200] 4.25673e-05 (share:core_divide noop)
[106080] 4.29149e-05 (share:crossover rlrl<->rrrr)
[107200] 4.32068e-05 (share:retype 0/rrllr->qr1)
[107520] 4.32209e-05 (share:retype 0/rrrl->dp1)
[113520] 4.32209e-05 (share:crossover lrrr<->rrrl)
[122880] 9.30692e-05 (share:undivide 0/rlrr)
[123520] 9.32949e-05 (share:level_fix noop)
[124480] 9.33002e-05 (share:level_fix noop)
[144400] 0.000107422 (share:undivide 0/rlrr)
[148560] 0.000113564 (share:retype 0/lrlllrl->t10)
[150640] 0.000117071 (share:level_compound_fix noop)
[151040] 0.000121829 (share:level_retype noop)
[153040] 0.000124879 (share:level_retype noop)
[157680] 0.000126775 (share:crossover lrlllrr<->llrll)
[158800] 0.000240095 (share:undivide 0/rrll)
[163680] 0.000499652 (share:level_retype noop)
[164640] 0.000508459 (share:core_undivide noop)
[165440] 0.00050947 (share:level_retype noop)
[174400] 0.000510996 (share:core_undivide noop)
[201200] 0.000521531 (share:rotate 0/rrrr)
[202800] 0.000524554 (share:level_compound_fix noop)
[216400] 0.000524554 (share:crossover rlllr<->rrll)
[231680] 0.000581588 (share:crossover llrr<->rllr)
[232800] 0.000631983 (share:crossover rllllr<->rllllr)
[233600] 0.000663972 (share:rotate 0/rlllll)
[234400] 0.000679543 (share:rotate 0/lr)
[235120] 0.000680799 (share:level_compound_fix noop)
[235280] 0.000704214 (share:level_fix noop)
[235360] 0.00070883 (share:level_compound_fix noop)
[235600] 0.000710322 (share:level_fix noop)
[282720] 0.000710418 (share:level_retype noop)
[283200] 0.000710928 (share:core_divide noop)
[288800] 0.000783033 (share:swap 0/llllr)
[299600] 0.000806961 (share:undivide 0/lrlr)
[405760] 0.00148576 (share:level_compound_fix noop)
[405840] 0.00148617 (share:core_divide noop)
[500200] 1.47634e-06 (polish:seed)
[500280] 1.49152e-06 (polish:level_retype noop)
[500600] 1.50542e-06 (polish:level_compound_fix noop)
[500680] 1.51829e-06 (polish:level_fix noop)
[500840] 4.82862e-05 (polish:undivide 0/rrrrr)
[501880] 4.84983e-05 (polish:crossover rlrlrr<->llllrl)
[538440] 8.15165e-05 (polish:swap 0/rlrlr)
[541960] 8.32787e-05 (polish:core_undivide noop)
[542120] 9.93915e-05 (polish:crossover rrrr<->rlrlr)
[614680] 0.000100561 (polish:retype 0/rrrrr->zt1)
[682760] 0.000100577 (polish:crossover rlllllr<->llrrl)
[684200] 0.000101129 (polish:core_undivide noop)
[686920] 0.000101234 (polish:level_fix noop)
[687160] 0.000101292 (polish:retype 0/rllllll->dp1)
written : /home/bruno/src/homemaker-layout/examples/health-centre/coldstart-500000-s1.dom

View file

@ -0,0 +1,292 @@
node:
- - -2.499098
- 3.896165
- - 16.284033
- 8.678435
- - 11.155808
- 29.106947
- - -8.073955
- 25.262724
perimeter:
a: private
b: null
c: null
d: null
rotation: 1
division:
- 0.48350786040303545
- 0.48350786040303545
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.49887946927642934
- 0.49887946927642934
l:
rotation: 1
division:
- 0.4414323695000621
- 0.4414323695000621
l:
rotation: 1
division:
- 0.5656219609158839
- 0.5656219609158839
l:
rotation: 0
division:
- 0.5575995303769351
- 0.5575995303769351
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5008275645532423
- 0.5008275645532423
l:
type: me1
rotation: 0
r:
type: dp1
rotation: 0
r:
rotation: 1
division:
- 0.4272816108227617
- 0.4272816108227617
l:
rotation: 0
division:
- 0.7517694036847098
- 0.7517694036847098
l:
type: ao1
rotation: 0
r:
type: re1
rotation: 0
r:
rotation: 1
division:
- 0.622114173808394
- 0.622114173808394
l:
rotation: 3
division:
- 0.5581406250000001
- 0.5581406250000001
l:
type: mo1
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.6444996495996157
- 0.6444996495996157
l:
rotation: 1
division:
- 0.5477557605024861
- 0.5477557605024861
l:
rotation: 0
division:
- 0.5334309189072651
- 0.5334309189072651
l:
rotation: 3
division:
- 0.6385206269531251
- 0.6385206269531251
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.5353212004316293
- 0.5353212004316293
l:
type: qr1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.7162671590109604
- 0.7162671590109604
l:
type: de1
rotation: 0
r:
type: zt1
rotation: 0
r:
rotation: 1
division:
- 0.7184141335179154
- 0.7184141335179154
l:
rotation: 2
division:
- 0.6239648658741919
- 0.6239648658741919
l:
type: gp1
rotation: 0
r:
type: C
rotation: 0
r:
type: O
rotation: 1
r:
rotation: 1
division:
- 0.5115649835368756
- 0.5115649835368756
l:
rotation: 1
division:
- 0.4270312669479709
- 0.4270312669479709
l:
rotation: 1
division:
- 0.7430403014990321
- 0.7430403014990321
l:
rotation: 0
division:
- 0.6663937131288937
- 0.6663937131288937
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.4754643090679284
- 0.4754643090679284
l:
type: t9
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.64403101149484
- 0.64403101149484
l:
type: C
rotation: 0
r:
type: t9
rotation: 0
r:
rotation: 1
division:
- 0.28890429372955984
- 0.28890429372955984
l:
rotation: 1
division:
- 0.615434093952136
- 0.615434093952136
l:
type: rc1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.429760652966943
- 0.429760652966943
l:
type: tr1
rotation: 0
r:
type: pt1
rotation: 1
r:
rotation: 1
division:
- 0.536560684331618
- 0.536560684331618
l:
rotation: 1
division:
- 0.24759832579856278
- 0.24759832579856278
l:
rotation: 3
division:
- 0.7787526870507764
- 0.7787526870507764
l:
type: kt1
rotation: 0
r:
type: t10
rotation: 0
r:
rotation: 0
division:
- 0.4685508896253494
- 0.4685508896253494
l:
type: br1
rotation: 0
r:
type: ms1
rotation: 0
r:
rotation: 1
division:
- 0.4340907678745429
- 0.4340907678745429
l:
rotation: 1
division:
- 0.6014012954809093
- 0.6014012954809093
l:
type: ph1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.9768278199443412
- 0.9768278199443412
l:
type: wa1
rotation: 0
r:
type: O
rotation: 0

View file

@ -0,0 +1,418 @@
seed : /home/bruno/src/homemaker-layout/examples/health-centre/init.dom
programme : health-centre
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 2
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/health-centre/coldstart-500000-s2.dom
[ 80 evals] best 3.04007e-12 (fails 28) via construct/0
[ 160 evals] best 7.74528e-12 (fails 28) via construct/1
[ 240 evals] best 1.27278e-10 (fails 25) via construct/2
[ 1040 evals] best 2.05075e-09 (fails 19) via construct/12
[ 2080 evals] best 4.22403e-09 (fails 18) via rotate 0/lrrl
[ 3120 evals] best 1.23776e-08 (fails 18) via undivide 0/lrrr
[ 3760 evals] best 1.39455e-08 (fails 18) via level_retype noop
[ 4800 evals] best 1.59195e-08 (fails 18) via level_fix noop
[ 4880 evals] best 1.78293e-08 (fails 18) via undivide 0/lrll
[ 4960 evals] best 2.07039e-08 (fails 18) via core_divide noop
[ 5440 evals] best 2.26527e-08 (fails 18) via rotate 0/rlrr
[ 6160 evals] best 2.28963e-08 (fails 18) via core_undivide noop
[ 7280 evals] best 2.60466e-08 (fails 18) via level_compound_fix noop
[ 8000 evals] best 2.66315e-08 (fails 18) via core_undivide noop
[ 8640 evals] best 4.07528e-08 (fails 16) via crossover rlrrr<->rrrl
[ 9840 evals] best 4.73414e-08 (fails 16) via core_undivide noop
[ 9920 evals] best 4.98649e-08 (fails 16) via core_undivide noop
[ 11280 evals] best 5.22342e-08 (fails 16) via core_undivide noop
[ 11760 evals] best 5.44617e-08 (fails 16) via core_undivide noop
[ 13760 evals] best 2.18035e-07 (fails 14) via rotate 0/lllr
[ 14000 evals] best 2.27326e-07 (fails 14) via level_retype noop
[ 15840 evals] best 2.37305e-07 (fails 14) via rotate 0/lrll
[ 16320 evals] best 2.47589e-07 (fails 14) via rotate 0/lrrl
[ 16640 evals] best 2.57045e-07 (fails 14) via level_fix noop
[ 17600 evals] best 2.66584e-07 (fails 14) via core_undivide noop
[ 17760 evals] best 2.75666e-07 (fails 14) via crossover rrrll<->lllrr
[ 18000 evals] best 2.85305e-07 (fails 14) via level_fix noop
[ 18080 evals] best 2.95039e-07 (fails 14) via swap 0/lllr
[ 19520 evals] best 3.04447e-07 (fails 14) via core_undivide noop
[ 20160 evals] best 3.1362e-07 (fails 14) via crossover lllrl<->rrlll
[ 21760 evals] best 2.18239e-07 (fails 13) via retype 0/lrllr->O
[ 22080 evals] best 2.49021e-07 (fails 13) via swap 0/lllr
[ 22240 evals] best 2.73668e-07 (fails 13) via level_fix noop
[ 23120 evals] best 2.86925e-07 (fails 13) via core_undivide noop
[ 23520 evals] best 2.9861e-07 (fails 13) via core_divide noop
[ 25600 evals] best 5.65963e-07 (fails 12) via core_undivide noop
[ 25840 evals] best 5.91044e-07 (fails 12) via core_divide noop
[ 26880 evals] best 6.19759e-07 (fails 12) via core_divide noop
[ 28560 evals] best 6.49777e-07 (fails 12) via retype 0/lllrl->re1
[ 29680 evals] best 6.73724e-07 (fails 12) via core_undivide noop
[ 30160 evals] best 6.91667e-07 (fails 12) via core_undivide noop
[ 32240 evals] best 7.05032e-07 (fails 12) via core_divide noop
[ 35440 evals] best 7.20936e-07 (fails 12) via level_retype noop
[ 36400 evals] best 7.36371e-07 (fails 12) via level_compound_fix noop
[ 37760 evals] best 7.50241e-07 (fails 12) via crossover llrr<->llrr
[ 38560 evals] best 7.86556e-07 (fails 12) via level_fix noop
[ 40880 evals] best 8.21898e-07 (fails 12) via crossover lllrl<->lrrlr
[ 41120 evals] best 8.45967e-07 (fails 12) via swap 0/llrl
[ 41280 evals] best 8.48915e-07 (fails 12) via core_undivide noop
[ 41600 evals] best 2.19176e-06 (fails 12) via crossover lrrl<->rlrrr
[ 41760 evals] best 2.22064e-06 (fails 12) via core_undivide noop
[ 42800 evals] best 2.24919e-06 (fails 12) via crossover rlrll<->rlrll
[ 44160 evals] best 2.25054e-06 (fails 12) via level_fix noop
[ 44320 evals] best 2.26364e-06 (fails 12) via level_retype noop
[ 45840 evals] best 2.31398e-06 (fails 12) via level_compound_fix noop
[ 46080 evals] best 2.39771e-06 (fails 12) via level_compound_fix noop
[ 46400 evals] best 2.40706e-06 (fails 12) via level_compound_fix noop
[ 47120 evals] best 2.42409e-06 (fails 12) via swap 0/rlrl
[ 52720 evals] best 2.46086e-06 (fails 12) via level_retype noop
[ 53520 evals] best 2.46716e-06 (fails 12) via core_divide noop
[ 56720 evals] best 3.3283e-06 (fails 12) via crossover rllrl<->llrrr
[ 58320 evals] best 3.33649e-06 (fails 12) via swap 0/lrlr
[ 59280 evals] best 3.36563e-06 (fails 12) via core_undivide noop
[ 59920 evals] best 3.37434e-06 (fails 12) via level_retype noop
[ 61520 evals] best 3.37454e-06 (fails 12) via level_retype noop
[ 73520 evals] best 3.54736e-06 (fails 12) via crossover rrlll<->lrlrl
[ 75760 evals] best 3.7656e-06 (fails 12) via core_divide noop
[ 76880 evals] best 3.83549e-06 (fails 12) via retype 0/lrlrr->mo1
[ 77600 evals] best 3.88306e-06 (fails 12) via level_compound_fix noop
[ 82480 evals] best 5.2071e-06 (fails 12) via undivide 0/rlrrr
[ 83280 evals] best 5.26703e-06 (fails 12) via level_fix noop
[ 86800 evals] best 5.30023e-06 (fails 12) via level_fix noop
[ 90320 evals] best 5.30798e-06 (fails 12) via level_retype noop
[122160 evals] best 3.21459e-05 (fails 9) via rotate 0/rrll
[146560 evals] best 3.24042e-05 (fails 9) via crossover r<->r
[162000 evals] best 3.26798e-05 (fails 9) via rotate 0/lrrl
[166880 evals] best 3.93491e-05 (fails 9) via undivide 0/rlrrr
[167840 evals] best 3.97222e-05 (fails 9) via level_compound_fix noop
[169760 evals] best 3.99788e-05 (fails 9) via retype 0/rrlrr->kt1
[172240 evals] best 4.05111e-05 (fails 9) via retype 0/llrlr->me1
[174560 evals] best 4.05659e-05 (fails 9) via level_compound_fix noop
[175520 evals] best 4.0576e-05 (fails 9) via crossover rrrrl<->llrll
[176240 evals] best 4.05784e-05 (fails 9) via level_retype noop
[180640 evals] best 4.55645e-05 (fails 9) via rotate 0/lrrl
[182800 evals] best 4.72012e-05 (fails 9) via core_divide noop
[184080 evals] best 4.7299e-05 (fails 9) via level_fix noop
[184160 evals] best 4.73067e-05 (fails 9) via core_undivide noop
[184800 evals] best 4.88281e-05 (fails 9) via level_retype noop
[185200 evals] best 4.88309e-05 (fails 9) via level_compound_fix noop
[194880 evals] best 4.88309e-05 (fails 9) via crossover rlrr<->llrl
[199760 evals] best 4.88662e-05 (fails 9) via level_retype noop
[201440 evals] best 4.88717e-05 (fails 9) via level_compound_fix noop
[202240 evals] best 4.88744e-05 (fails 9) via core_undivide noop
[208960 evals] best 4.91615e-05 (fails 9) via rotate 0/lllr
[209840 evals] best 4.9167e-05 (fails 9) via retype 0/rlrlr->br1
[209920 evals] best 4.94457e-05 (fails 9) via level_compound_fix noop
[212640 evals] best 5.03271e-05 (fails 9) via core_divide noop
[212880 evals] best 5.03298e-05 (fails 9) via core_undivide noop
[215200 evals] best 5.82446e-05 (fails 9) via place_missing ph1 -> lrllr
[216320 evals] best 5.85273e-05 (fails 9) via level_fix noop
[216960 evals] best 5.87137e-05 (fails 9) via level_retype noop
[217760 evals] best 6.01725e-05 (fails 9) via level_fix noop
[221760 evals] best 6.05548e-05 (fails 9) via crossover rllrr<->rlrlr
[224080 evals] best 6.07621e-05 (fails 9) via level_compound_fix noop
[225920 evals] best 6.22317e-05 (fails 9) via crossover lrrlr<->rlrrl
[277520 evals] best 9.80017e-05 (fails 8) via crossover rlll<->llll
[278160 evals] best 9.94913e-05 (fails 8) via crossover rrrlr<->rrrlr
[290880 evals] best 0.000119142 (fails 8) via place_missing ao1 -> rlllr
[294240 evals] best 0.000120131 (fails 8) via level_compound_fix noop
[296240 evals] best 0.000136504 (fails 8) via level_retype noop
[296400 evals] best 0.000144238 (fails 8) via core_divide noop
[297600 evals] best 0.000148308 (fails 8) via core_divide noop
[298160 evals] best 0.000153088 (fails 8) via retype 0/rrlrl->wa1
[298400 evals] best 0.00015708 (fails 8) via level_fix noop
[298960 evals] best 0.00016023 (fails 8) via level_retype noop
[299120 evals] best 0.000164088 (fails 8) via core_divide noop
[300480 evals] best 0.000161836 (fails 7) via crossover rlrll<->rllrl
[301200 evals] best 0.000165874 (fails 7) via level_compound_fix noop
[304320 evals] best 0.000175611 (fails 7) via retype 0/lllrr->qr1
[306080 evals] best 0.000179641 (fails 7) via core_divide noop
[310880 evals] best 0.000183423 (fails 7) via level_retype noop
[311600 evals] best 0.00020186 (fails 7) via core_undivide noop
[314080 evals] best 0.000206088 (fails 7) via core_undivide noop
[314320 evals] best 0.00020928 (fails 7) via level_fix noop
[315920 evals] best 0.000212285 (fails 7) via core_undivide noop
[316080 evals] best 0.000215156 (fails 7) via core_undivide noop
[316880 evals] best 0.000217485 (fails 7) via crossover rlrll<->lrrlr
[320000 evals] best 0.00021922 (fails 7) via core_divide noop
[321760 evals] best 0.000221004 (fails 7) via crossover rrrll<->llrll
[322480 evals] best 0.000221908 (fails 7) via level_retype noop
[334560 evals] best 0.000222939 (fails 7) via core_divide noop
[336560 evals] best 0.000224675 (fails 7) via level_compound_fix noop
[336720 evals] best 0.000226466 (fails 7) via core_undivide noop
[353600 evals] best 0.000226721 (fails 7) via level_fix noop
[358240 evals] best 0.000228547 (fails 7) via level_fix noop
[358320 evals] best 0.000229603 (fails 7) via level_compound_fix noop
[362480 evals] best 0.000230019 (fails 7) via core_undivide noop
[363920 evals] best 0.000231184 (fails 7) via core_undivide noop
[387040 evals] best 0.000246099 (fails 7) via rotate 0/rrrr
[387120 evals] best 0.000262652 (fails 7) via core_undivide noop
[387200 evals] best 0.000280293 (fails 7) via core_divide noop
[388160 evals] best 0.000298055 (fails 7) via level_compound_fix noop
[389040 evals] best 0.000319938 (fails 7) via core_divide noop
[396640 evals] best 0.000321628 (fails 7) via level_fix noop
[398320 evals] best 0.000323351 (fails 7) via core_divide noop
[406160 evals] best 0.000364098 (fails 7) via undivide 0/rlrl
[406880 evals] best 0.000371359 (fails 7) via undivide 0/rlrl
[407040 evals] best 0.000386031 (fails 7) via level_fix noop
[409520 evals] best 0.000390844 (fails 7) via level_fix noop
[410160 evals] best 0.000533031 (fails 6) via crossover rlrl<->lrllr
[410800 evals] best 0.000594646 (fails 6) via core_divide noop
[411840 evals] best 0.000606993 (fails 6) via level_fix noop
[412480 evals] best 0.000624444 (fails 6) via level_fix noop
[412720 evals] best 0.000639509 (fails 6) via retype 0/rlrrr->ph1
[413680 evals] best 0.000646054 (fails 6) via core_undivide noop
[421040 evals] best 0.000662382 (fails 6) via retype 0/rlllrl->gp1
[421120 evals] best 0.000679955 (fails 6) via level_fix noop
[423120 evals] best 0.000692401 (fails 6) via core_divide noop
[424400 evals] best 0.000694282 (fails 6) via core_undivide noop
[425360 evals] best 0.000710894 (fails 6) via level_compound_fix noop
[426160 evals] best 0.00075164 (fails 6) via core_divide noop
[427760 evals] best 0.00076103 (fails 6) via level_retype noop
[429600 evals] best 0.000769686 (fails 6) via level_fix noop
[430320 evals] best 0.00078154 (fails 6) via core_divide noop
[431440 evals] best 0.00078639 (fails 6) via level_compound_fix noop
[433680 evals] best 0.000793532 (fails 6) via crossover lrlrl<->rlrrl
[433760 evals] best 0.000793974 (fails 6) via level_delete noop
[435280 evals] best 0.000796904 (fails 6) via level_compound_fix noop
[439520 evals] best 0.000798566 (fails 6) via level_fix noop
[440320 evals] best 0.000807961 (fails 6) via level_delete noop
[440800 evals] best 0.000814519 (fails 6) via level_fix noop
[440960 evals] best 0.000818432 (fails 6) via level_fix noop
[442080 evals] best 0.000823555 (fails 6) via level_fix noop
[444320 evals] best 0.000824738 (fails 6) via core_undivide noop
[446640 evals] best 0.000824751 (fails 6) via core_undivide noop
[446960 evals] best 0.000826176 (fails 6) via level_retype noop
[478400 evals] best 0.000846488 (fails 6) via retype 0/llrll->re1
[478480 evals] best 0.000854724 (fails 6) via retype 0/lllrr->t9
[478640 evals] best 0.000869142 (fails 6) via level_fix noop
[479200 evals] best 0.000889042 (fails 6) via core_undivide noop
[479520 evals] best 0.000905278 (fails 6) via crossover llrll<->rrlrr
[483040 evals] best 0.000908676 (fails 6) via level_fix noop
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 0 shared-leaf copies
[ 200 evals] best 0.000921035 (fails 6) via seed
[ 55320 evals] best 0.00143789 (fails 5) via swap 0/lrrl
[ 56600 evals] best 0.0014446 (fails 5) via level_fix noop
[ 57240 evals] best 0.00145004 (fails 5) via swap 0/llrl
[120440 evals] best 0.00145004 (fails 5) via crossover lrrr<->rlrlr
[157480 evals] best 0.00146631 (fails 5) via divide 0/lrlll
[160760 evals] best 0.00146672 (fails 5) via level_compound_fix noop
[161000 evals] best 0.00146707 (fails 5) via retype 0/lrlrr->de1
[161080 evals] best 0.00146735 (fails 5) via level_fix noop
[161880 evals] best 0.00146754 (fails 5) via level_retype noop
[162440 evals] best 0.00146757 (fails 5) via level_fix noop
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 91 → 5 fails (applied)
--- done ---
elapsed : 112525.3s
evals : 750040 across 9374 topologies
best : 0.00146757 (5 fails) via level_fix noop+collapse
improvement history:
[ 80] 3.04007e-12 (share:construct/0)
[ 160] 7.74528e-12 (share:construct/1)
[ 240] 1.27278e-10 (share:construct/2)
[ 1040] 2.05075e-09 (share:construct/12)
[ 2080] 4.22403e-09 (share:rotate 0/lrrl)
[ 3120] 1.23776e-08 (share:undivide 0/lrrr)
[ 3760] 1.39455e-08 (share:level_retype noop)
[ 4800] 1.59195e-08 (share:level_fix noop)
[ 4880] 1.78293e-08 (share:undivide 0/lrll)
[ 4960] 2.07039e-08 (share:core_divide noop)
[ 5440] 2.26527e-08 (share:rotate 0/rlrr)
[ 6160] 2.28963e-08 (share:core_undivide noop)
[ 7280] 2.60466e-08 (share:level_compound_fix noop)
[ 8000] 2.66315e-08 (share:core_undivide noop)
[ 8640] 4.07528e-08 (share:crossover rlrrr<->rrrl)
[ 9840] 4.73414e-08 (share:core_undivide noop)
[ 9920] 4.98649e-08 (share:core_undivide noop)
[ 11280] 5.22342e-08 (share:core_undivide noop)
[ 11760] 5.44617e-08 (share:core_undivide noop)
[ 13760] 2.18035e-07 (share:rotate 0/lllr)
[ 14000] 2.27326e-07 (share:level_retype noop)
[ 15840] 2.37305e-07 (share:rotate 0/lrll)
[ 16320] 2.47589e-07 (share:rotate 0/lrrl)
[ 16640] 2.57045e-07 (share:level_fix noop)
[ 17600] 2.66584e-07 (share:core_undivide noop)
[ 17760] 2.75666e-07 (share:crossover rrrll<->lllrr)
[ 18000] 2.85305e-07 (share:level_fix noop)
[ 18080] 2.95039e-07 (share:swap 0/lllr)
[ 19520] 3.04447e-07 (share:core_undivide noop)
[ 20160] 3.1362e-07 (share:crossover lllrl<->rrlll)
[ 21760] 2.18239e-07 (share:retype 0/lrllr->O)
[ 22080] 2.49021e-07 (share:swap 0/lllr)
[ 22240] 2.73668e-07 (share:level_fix noop)
[ 23120] 2.86925e-07 (share:core_undivide noop)
[ 23520] 2.9861e-07 (share:core_divide noop)
[ 25600] 5.65963e-07 (share:core_undivide noop)
[ 25840] 5.91044e-07 (share:core_divide noop)
[ 26880] 6.19759e-07 (share:core_divide noop)
[ 28560] 6.49777e-07 (share:retype 0/lllrl->re1)
[ 29680] 6.73724e-07 (share:core_undivide noop)
[ 30160] 6.91667e-07 (share:core_undivide noop)
[ 32240] 7.05032e-07 (share:core_divide noop)
[ 35440] 7.20936e-07 (share:level_retype noop)
[ 36400] 7.36371e-07 (share:level_compound_fix noop)
[ 37760] 7.50241e-07 (share:crossover llrr<->llrr)
[ 38560] 7.86556e-07 (share:level_fix noop)
[ 40880] 8.21898e-07 (share:crossover lllrl<->lrrlr)
[ 41120] 8.45967e-07 (share:swap 0/llrl)
[ 41280] 8.48915e-07 (share:core_undivide noop)
[ 41600] 2.19176e-06 (share:crossover lrrl<->rlrrr)
[ 41760] 2.22064e-06 (share:core_undivide noop)
[ 42800] 2.24919e-06 (share:crossover rlrll<->rlrll)
[ 44160] 2.25054e-06 (share:level_fix noop)
[ 44320] 2.26364e-06 (share:level_retype noop)
[ 45840] 2.31398e-06 (share:level_compound_fix noop)
[ 46080] 2.39771e-06 (share:level_compound_fix noop)
[ 46400] 2.40706e-06 (share:level_compound_fix noop)
[ 47120] 2.42409e-06 (share:swap 0/rlrl)
[ 52720] 2.46086e-06 (share:level_retype noop)
[ 53520] 2.46716e-06 (share:core_divide noop)
[ 56720] 3.3283e-06 (share:crossover rllrl<->llrrr)
[ 58320] 3.33649e-06 (share:swap 0/lrlr)
[ 59280] 3.36563e-06 (share:core_undivide noop)
[ 59920] 3.37434e-06 (share:level_retype noop)
[ 61520] 3.37454e-06 (share:level_retype noop)
[ 73520] 3.54736e-06 (share:crossover rrlll<->lrlrl)
[ 75760] 3.7656e-06 (share:core_divide noop)
[ 76880] 3.83549e-06 (share:retype 0/lrlrr->mo1)
[ 77600] 3.88306e-06 (share:level_compound_fix noop)
[ 82480] 5.2071e-06 (share:undivide 0/rlrrr)
[ 83280] 5.26703e-06 (share:level_fix noop)
[ 86800] 5.30023e-06 (share:level_fix noop)
[ 90320] 5.30798e-06 (share:level_retype noop)
[122160] 3.21459e-05 (share:rotate 0/rrll)
[146560] 3.24042e-05 (share:crossover r<->r)
[162000] 3.26798e-05 (share:rotate 0/lrrl)
[166880] 3.93491e-05 (share:undivide 0/rlrrr)
[167840] 3.97222e-05 (share:level_compound_fix noop)
[169760] 3.99788e-05 (share:retype 0/rrlrr->kt1)
[172240] 4.05111e-05 (share:retype 0/llrlr->me1)
[174560] 4.05659e-05 (share:level_compound_fix noop)
[175520] 4.0576e-05 (share:crossover rrrrl<->llrll)
[176240] 4.05784e-05 (share:level_retype noop)
[180640] 4.55645e-05 (share:rotate 0/lrrl)
[182800] 4.72012e-05 (share:core_divide noop)
[184080] 4.7299e-05 (share:level_fix noop)
[184160] 4.73067e-05 (share:core_undivide noop)
[184800] 4.88281e-05 (share:level_retype noop)
[185200] 4.88309e-05 (share:level_compound_fix noop)
[194880] 4.88309e-05 (share:crossover rlrr<->llrl)
[199760] 4.88662e-05 (share:level_retype noop)
[201440] 4.88717e-05 (share:level_compound_fix noop)
[202240] 4.88744e-05 (share:core_undivide noop)
[208960] 4.91615e-05 (share:rotate 0/lllr)
[209840] 4.9167e-05 (share:retype 0/rlrlr->br1)
[209920] 4.94457e-05 (share:level_compound_fix noop)
[212640] 5.03271e-05 (share:core_divide noop)
[212880] 5.03298e-05 (share:core_undivide noop)
[215200] 5.82446e-05 (share:place_missing ph1 -> lrllr)
[216320] 5.85273e-05 (share:level_fix noop)
[216960] 5.87137e-05 (share:level_retype noop)
[217760] 6.01725e-05 (share:level_fix noop)
[221760] 6.05548e-05 (share:crossover rllrr<->rlrlr)
[224080] 6.07621e-05 (share:level_compound_fix noop)
[225920] 6.22317e-05 (share:crossover lrrlr<->rlrrl)
[277520] 9.80017e-05 (share:crossover rlll<->llll)
[278160] 9.94913e-05 (share:crossover rrrlr<->rrrlr)
[290880] 0.000119142 (share:place_missing ao1 -> rlllr)
[294240] 0.000120131 (share:level_compound_fix noop)
[296240] 0.000136504 (share:level_retype noop)
[296400] 0.000144238 (share:core_divide noop)
[297600] 0.000148308 (share:core_divide noop)
[298160] 0.000153088 (share:retype 0/rrlrl->wa1)
[298400] 0.00015708 (share:level_fix noop)
[298960] 0.00016023 (share:level_retype noop)
[299120] 0.000164088 (share:core_divide noop)
[300480] 0.000161836 (share:crossover rlrll<->rllrl)
[301200] 0.000165874 (share:level_compound_fix noop)
[304320] 0.000175611 (share:retype 0/lllrr->qr1)
[306080] 0.000179641 (share:core_divide noop)
[310880] 0.000183423 (share:level_retype noop)
[311600] 0.00020186 (share:core_undivide noop)
[314080] 0.000206088 (share:core_undivide noop)
[314320] 0.00020928 (share:level_fix noop)
[315920] 0.000212285 (share:core_undivide noop)
[316080] 0.000215156 (share:core_undivide noop)
[316880] 0.000217485 (share:crossover rlrll<->lrrlr)
[320000] 0.00021922 (share:core_divide noop)
[321760] 0.000221004 (share:crossover rrrll<->llrll)
[322480] 0.000221908 (share:level_retype noop)
[334560] 0.000222939 (share:core_divide noop)
[336560] 0.000224675 (share:level_compound_fix noop)
[336720] 0.000226466 (share:core_undivide noop)
[353600] 0.000226721 (share:level_fix noop)
[358240] 0.000228547 (share:level_fix noop)
[358320] 0.000229603 (share:level_compound_fix noop)
[362480] 0.000230019 (share:core_undivide noop)
[363920] 0.000231184 (share:core_undivide noop)
[387040] 0.000246099 (share:rotate 0/rrrr)
[387120] 0.000262652 (share:core_undivide noop)
[387200] 0.000280293 (share:core_divide noop)
[388160] 0.000298055 (share:level_compound_fix noop)
[389040] 0.000319938 (share:core_divide noop)
[396640] 0.000321628 (share:level_fix noop)
[398320] 0.000323351 (share:core_divide noop)
[406160] 0.000364098 (share:undivide 0/rlrl)
[406880] 0.000371359 (share:undivide 0/rlrl)
[407040] 0.000386031 (share:level_fix noop)
[409520] 0.000390844 (share:level_fix noop)
[410160] 0.000533031 (share:crossover rlrl<->lrllr)
[410800] 0.000594646 (share:core_divide noop)
[411840] 0.000606993 (share:level_fix noop)
[412480] 0.000624444 (share:level_fix noop)
[412720] 0.000639509 (share:retype 0/rlrrr->ph1)
[413680] 0.000646054 (share:core_undivide noop)
[421040] 0.000662382 (share:retype 0/rlllrl->gp1)
[421120] 0.000679955 (share:level_fix noop)
[423120] 0.000692401 (share:core_divide noop)
[424400] 0.000694282 (share:core_undivide noop)
[425360] 0.000710894 (share:level_compound_fix noop)
[426160] 0.00075164 (share:core_divide noop)
[427760] 0.00076103 (share:level_retype noop)
[429600] 0.000769686 (share:level_fix noop)
[430320] 0.00078154 (share:core_divide noop)
[431440] 0.00078639 (share:level_compound_fix noop)
[433680] 0.000793532 (share:crossover lrlrl<->rlrrl)
[433760] 0.000793974 (share:level_delete noop)
[435280] 0.000796904 (share:level_compound_fix noop)
[439520] 0.000798566 (share:level_fix noop)
[440320] 0.000807961 (share:level_delete noop)
[440800] 0.000814519 (share:level_fix noop)
[440960] 0.000818432 (share:level_fix noop)
[442080] 0.000823555 (share:level_fix noop)
[444320] 0.000824738 (share:core_undivide noop)
[446640] 0.000824751 (share:core_undivide noop)
[446960] 0.000826176 (share:level_retype noop)
[478400] 0.000846488 (share:retype 0/llrll->re1)
[478480] 0.000854724 (share:retype 0/lllrr->t9)
[478640] 0.000869142 (share:level_fix noop)
[479200] 0.000889042 (share:core_undivide noop)
[479520] 0.000905278 (share:crossover llrll<->rrlrr)
[483040] 0.000908676 (share:level_fix noop)
[500200] 0.000921035 (polish:seed)
[555320] 0.00143789 (polish:swap 0/lrrl)
[556600] 0.0014446 (polish:level_fix noop)
[557240] 0.00145004 (polish:swap 0/llrl)
[620440] 0.00145004 (polish:crossover lrrr<->rlrlr)
[657480] 0.00146631 (polish:divide 0/lrlll)
[660760] 0.00146672 (polish:level_compound_fix noop)
[661000] 0.00146707 (polish:retype 0/lrlrr->de1)
[661080] 0.00146735 (polish:level_fix noop)
[661880] 0.00146754 (polish:level_retype noop)
[662440] 0.00146757 (polish:level_fix noop)
written : /home/bruno/src/homemaker-layout/examples/health-centre/coldstart-500000-s2.dom

View file

@ -1,18 +1,17 @@
---
node:
- - -0.40619466787232916
- 7.945534625317068
- - 12.453678259018824
- 11.219717050727425
- - 8.942638574000743
- 25.206100654545047
- - -4.223021280218349
- 22.57415280833146
- - -2.499098
- 3.896165
- - 16.284033
- 8.678435
- - 11.155808
- 29.106947
- - -8.073955
- 25.262724
perimeter:
a: private
b: ~
c: ~
d: ~
b: null
c: null
d: null
type: O
rotation: 0
height: 3

View file

@ -24,6 +24,7 @@
spaces:
# ---- PUBLIC / RECEPTION ----
rc1:
usage: none
name: Reception
size:
- 10.0
@ -40,6 +41,7 @@ spaces:
- o
wa1:
usage: none
name: Waiting Room
size:
- 28.0
@ -57,6 +59,7 @@ spaces:
- rc1
ph1:
usage: bedroom
name: Pharmacy / Dispensary
size:
- 12.0
@ -75,6 +78,7 @@ spaces:
# ---- CLINICAL ----
gp1:
usage: bedroom
name: GP Consulting Room
size:
- 14.0
@ -89,6 +93,7 @@ spaces:
- c
ms1:
usage: bedroom
name: Minor Surgery Room
size:
- 20.0
@ -107,6 +112,7 @@ spaces:
- de1
de1:
usage: bedroom
name: Dental Surgery
size:
- 18.0
@ -124,6 +130,7 @@ spaces:
- ms1
zt1:
usage: utility
name: Sterilisation Room
size:
- 6.0
@ -139,6 +146,7 @@ spaces:
- de1
pt1:
usage: bedroom
name: Physiotherapy Room
size:
- 24.0
@ -153,6 +161,7 @@ spaces:
- c
qr1:
usage: bedroom
name: Counselling Room
size:
- 9.0
@ -167,6 +176,7 @@ spaces:
- c
tr1:
usage: bedroom
name: Treatment Room
size:
- 16.0
@ -182,6 +192,7 @@ spaces:
# ---- ADMIN / STAFF ----
mo1:
usage: bedroom
name: Manager's Office
size:
- 10.0
@ -200,6 +211,7 @@ spaces:
- ao1
ao1:
usage: bedroom
name: Admin Office
size:
- 14.0
@ -217,6 +229,8 @@ spaces:
- br1
re1:
crinkliness: none # no window needed
usage: utility
name: Records Room
size:
- 7.0
@ -234,6 +248,7 @@ spaces:
- dp1
br1:
usage: living
name: Staff Room
size:
- 16.0
@ -250,6 +265,7 @@ spaces:
- ao1
kt1:
usage: kitchen
name: Staff Kitchenette
size:
- 8.0
@ -266,6 +282,8 @@ spaces:
# ---- SERVICE ----
me1:
crinkliness: none # no window needed
usage: utility
name: Plant / Mechanical Room
size:
- 9.0
@ -280,6 +298,8 @@ spaces:
- c
dp1:
crinkliness: none # no window needed
usage: utility
name: General Storage
size:
- 8.0
@ -296,6 +316,7 @@ spaces:
- re1
t9:
usage: toilet
name: Public WC
size:
- 4.0
@ -311,6 +332,7 @@ spaces:
count: 2
t10:
usage: toilet
name: Staff WC
size:
- 3.0
@ -327,15 +349,26 @@ spaces:
# Building constraints
storey_minimum: 1
storey_limit: 2
force_roof_garden: 0
# homemaker-py-hxi (DESIGN.md §39.25): ENABLED. Fails a level that has no
# outdoor space at all -- Alexander's actual requirement, per level and with no
# quantity attached. It had been off in every corpus config, so the only thing
# expressing outdoor space was ratio_outside's arbitrary fraction.
force_roof_garden: 1
# homemaker-py-hxi (DESIGN.md §39.24): disabled. The score is value/cost, a
# ratio, so the per-m2 economics (circulation worth 50 against a build cost of
# 200) is ALREADY a proportional pressure against circulation -- this said the
# same thing a second time, and with a curve where twice the corridor is far
# more than twice as bad. Its other side, "a building needs some circulation",
# was worth at most 13% here and is enforced structurally anyway by the access
# and connectivity checks. Set a [target, sigma] pair to re-enable.
ratio_circulation:
- 0.10
- 0.12
# homemaker-py-hxi (DESIGN.md §39.25): disabled. Alexander says every level
# should have accessible outside space; he does not say how much. The
# qualitative requirement is force_roof_garden below. Set a [target, sigma]
# pair to re-enable this quantitative one.
ratio_outside:
- 0.06
- 0.05
staircase_min: 1
staircase_max: 2
@ -343,4 +376,9 @@ staircase_max: 2
value_inside: 300.0
value_circulation: 50.0
value_outside: 100.0
value_supported: 300.0
# homemaker-py-ecx (DESIGN.md §39.19): an upper-level terrace is worth what
# outdoor space is worth (value_outside); it is the COST that differs by level
# (outside 10.0 vs outside_supported 110.0), not the value. At 300.0 -- the
# `value_inside` rate -- a terrace was worth more per square metre than a real
# internal room, which the owner ruled out.
value_supported: 100.0

View file

@ -0,0 +1,660 @@
node:
- - 0.0
- 0.0
- - 30.0
- 1.5
- - 29.0
- 28.0
- - 0.0
- 27.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 0
division:
- 0.5464598645587564
- 0.5464598645587564
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 3
division:
- 0.45299793782128434
- 0.45299793782128434
l:
rotation: 1
division:
- 0.5070312495911672
- 0.5070312495911672
l:
rotation: 1
division:
- 0.5033641421290929
- 0.5033641421290929
l:
rotation: 3
division:
- 0.6010610183987953
- 0.6010610183987953
l:
type: me1
rotation: 0
r:
rotation: 1
division:
- 0.416309216883104
- 0.416309216883104
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.501217497085463
- 0.501217497085463
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.5023793410843957
- 0.5023793410843957
l:
type: ur1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.46235803879777526
- 0.46235803879777526
l:
rotation: 1
division:
- 0.7112823022024215
- 0.7112823022024215
l:
rotation: 1
division:
- 0.5297305616953958
- 0.5297305616953958
l:
type: ef1
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.46080415559703575
- 0.46080415559703575
l:
rotation: 3
division:
- 0.7855477410849808
- 0.7855477410849808
l:
rotation: 0
division:
- 0.7755916235918977
- 0.7755916235918977
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.3598376157982003
- 0.3598376157982003
l:
type: m
rotation: 0
r:
rotation: 2
division:
- 0.5394353312382297
- 0.5394353312382297
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.41991934342105464
- 0.41991934342105464
l:
rotation: 1
division:
- 0.33955324217012417
- 0.33955324217012417
l:
type: C
rotation: 0
r:
type: ws1
rotation: 1
r:
rotation: 3
division:
- 0.530948242932189
- 0.530948242932189
l:
rotation: 1
division:
- 0.6139595936852689
- 0.6139595936852689
l:
type: O
rotation: 0
r:
type: rc1
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.4294138772787426
- 0.4294138772787426
l:
rotation: 1
division:
- 0.5882291917680589
- 0.5882291917680589
l:
rotation: 1
division:
- 0.7118312482034173
- 0.7118312482034173
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.551578125
- 0.551578125
l:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.7197887008888686
- 0.7197887008888686
l:
type: da1
rotation: 0
r:
type: la1
rotation: 0
r:
rotation: 0
division:
- 0.7419831333522663
- 0.7419831333522663
l:
rotation: 0
division:
- 0.6937168238978216
- 0.6937168238978216
l:
rotation: 1
division:
- 0.7276257285510321
- 0.7276257285510321
l:
type: lr1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.6330880335881911
- 0.6330880335881911
l:
rotation: 2
division:
- 0.553345914363554
- 0.553345914363554
l:
type: C
rotation: 0
r:
type: m
rotation: 0
r:
type: ph1
rotation: 0
r:
rotation: 1
division:
- 0.5281099669161189
- 0.5281099669161189
l:
type: O
rotation: 0
r:
type: gh1
rotation: 0
above:
rotation: 0
division:
- 0.4238388578453006
- 0.4238388578453006
height: 3.0
l:
rotation: 0
division:
- 0.46438575333518434
- 0.46438575333518434
l:
rotation: 0
division:
- 0.4166401264441752
- 0.4166401264441752
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.7142077220782733
- 0.7142077220782733
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5009062001080014
- 0.5009062001080014
l:
type: lo1
rotation: 0
r:
type: en1
rotation: 0
r:
rotation: 0
division:
- 0.722466738677041
- 0.722466738677041
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: li1
rotation: 3
r:
rotation: 0
division:
- 0.375
- 0.375
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5057497794729796
- 0.5057497794729796
l:
rotation: 0
division:
- 0.9009009009009009
- 0.9009009009009009
l:
rotation: 0
division:
- 0.9
- 0.9
l:
type: n
rotation: 0
r:
type: ur2
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5759435403447517
- 0.5759435403447517
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.3
- 0.3
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
rotation: 2
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: py
rotation: 0
r:
type: py
rotation: 0
r:
rotation: 0
division:
- 0.6521739130434783
- 0.6521739130434783
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.501217497085463
- 0.501217497085463
l:
type: em
rotation: 0
r:
type: em
rotation: 0
above:
rotation: 0
division:
- 0.4630736037244258
- 0.4630736037244258
height: 3.0
l:
rotation: 0
division:
- 0.39191302769825365
- 0.39191302769825365
l:
rotation: 0
division:
- 0.6962360322921977
- 0.6962360322921977
l:
rotation: 0
division:
- 0.8262218507206094
- 0.8262218507206094
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.6244638253246562
- 0.6244638253246562
l:
rotation: 2
division:
- 0.5802219050635611
- 0.5802219050635611
l:
type: r
rotation: 0
r:
type: tt
rotation: 0
r:
type: tt
rotation: 0
r:
rotation: 0
division:
- 0.7142857142857143
- 0.7142857142857143
l:
rotation: 0
division:
- 0.4480527946704407
- 0.4480527946704407
l:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.5262783719397363
- 0.5262783719397363
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.7296421643247618
- 0.7296421643247618
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 2
division:
- 0.36486892968750007
- 0.36486892968750007
l:
type: gy1
rotation: 0
r:
type: O
rotation: 0
r:
type: O
rotation: 3
r:
rotation: 0
division:
- 0.5172413793103449
- 0.5172413793103449
l:
rotation: 0
division:
- 0.36861414301279055
- 0.36861414301279055
l:
type: ur3
rotation: 0
r:
rotation: 0
division:
- 0.5667442448821649
- 0.5667442448821649
l:
type: ut1
rotation: 0
r:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5048892464944565
- 0.5048892464944565
l:
rotation: 0
division:
- 0.2420950004581947
- 0.2420950004581947
l:
rotation: 0
division:
- 0.4
- 0.4
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.7124538661857902
- 0.7124538661857902
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.6099584935544302
- 0.6099584935544302
l:
type: tt
rotation: 0
r:
type: tt
rotation: 0
r:
rotation: 0
division:
- 0.5964611517116011
- 0.5964611517116011
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.7728737084050409
- 0.7728737084050409
l:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.30217800720576415
- 0.30217800720576415
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
rotation: 2
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
type: q1
rotation: 0
r:
rotation: 0
division:
- 0.34782608695652173
- 0.34782608695652173
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: r
rotation: 0
r:
type: r
rotation: 0

Binary file not shown.

View file

@ -0,0 +1,628 @@
node:
- - 0.0
- 0.0
- - 30.0
- 1.5
- - 29.0
- 28.0
- - 0.0
- 27.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 0
division:
- 0.4217954377679881
- 0.4217954377679881
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.6532494109246466
- 0.6532494109246466
l:
rotation: 0
division:
- 0.44711624955524865
- 0.44711624955524865
l:
type: lr1
rotation: 1
r:
rotation: 1
division:
- 0.7493166529948532
- 0.7493166529948532
l:
rotation: 0
division:
- 0.3863510884777275
- 0.3863510884777275
l:
rotation: 3
division:
- 0.5821724940175944
- 0.5821724940175944
l:
type: O
rotation: 0
r:
type: m
rotation: 0
r:
type: da1
rotation: 0
r:
rotation: 3
division:
- 0.793622065044247
- 0.793622065044247
l:
type: k1
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.5627507124161697
- 0.5627507124161697
l:
rotation: 1
division:
- 0.7176946455382021
- 0.7176946455382021
l:
type: ws1
rotation: 0
r:
rotation: 3
division:
- 0.8411548172275364
- 0.8411548172275364
l:
type: O
rotation: 0
r:
type: t
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.5441129737239778
- 0.5441129737239778
l:
rotation: 0
division:
- 0.7336405346012067
- 0.7336405346012067
l:
rotation: 1
division:
- 0.8147640010719923
- 0.8147640010719923
l:
rotation: 0
division:
- 0.7370554352753373
- 0.7370554352753373
l:
rotation: 3
division:
- 0.5516324878760346
- 0.5516324878760346
l:
type: C
rotation: 3
r:
rotation: 1
division:
- 0.5253642741676521
- 0.5253642741676521
l:
type: gh1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.4385942026805069
- 0.4385942026805069
l:
rotation: 0
division:
- 0.5280476136214016
- 0.5280476136214016
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
type: la1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.43281488988313327
- 0.43281488988313327
l:
type: me1
rotation: 1
r:
rotation: 0
division:
- 0.5029024891632398
- 0.5029024891632398
l:
type: C
rotation: 0
r:
type: ef1
rotation: 0
r:
rotation: 1
division:
- 0.7169837502876616
- 0.7169837502876616
l:
rotation: 1
division:
- 0.37098199882002875
- 0.37098199882002875
l:
rotation: 3
division:
- 0.5586244518828078
- 0.5586244518828078
l:
rotation: 0
division:
- 0.3790996831083391
- 0.3790996831083391
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.5029024891632397
- 0.5029024891632397
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
rotation: 0
division:
- 0.3352683261088271
- 0.3352683261088271
l:
type: t
rotation: 0
r:
type: rc1
rotation: 0
r:
rotation: 2
division:
- 0.7358470481881225
- 0.7358470481881225
l:
rotation: 1
division:
- 0.7846898094392847
- 0.7846898094392847
l:
rotation: 0
division:
- 0.3855657020783567
- 0.3855657020783567
l:
type: ph1
rotation: 0
r:
type: O
rotation: 0
r:
type: m
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.4468629575793792
- 0.4468629575793792
l:
type: ur1
rotation: 0
r:
type: r
rotation: 0
above:
rotation: 0
division:
- 0.37008565034413465
- 0.37008565034413465
height: 3.0
l:
rotation: 0
division:
- 0.3989190519783494
- 0.3989190519783494
l:
rotation: 0
division:
- 0.4445387996631358
- 0.4445387996631358
l:
rotation: 0
division:
- 0.5029024891632397
- 0.5029024891632397
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.498454417675536
- 0.498454417675536
l:
rotation: 0
division:
- 0.5262522543849433
- 0.5262522543849433
l:
type: n
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5235229688700246
- 0.5235229688700246
l:
rotation: 1
division:
- 0.5686495246625086
- 0.5686495246625086
l:
type: py
rotation: 0
r:
type: em
rotation: 0
r:
type: en1
rotation: 0
r:
rotation: 0
division:
- 0.457233409542185
- 0.457233409542185
l:
rotation: 0
division:
- 0.43055564736619417
- 0.43055564736619417
l:
rotation: 0
division:
- 0.6612900749499223
- 0.6612900749499223
l:
rotation: 0
division:
- 0.3
- 0.3
l:
type: O
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5821724940175945
- 0.5821724940175945
l:
type: li1
rotation: 0
r:
type: ur2
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.7601464538562697
- 0.7601464538562697
l:
rotation: 0
division:
- 0.9090909090909091
- 0.9090909090909091
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: lo1
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: em
rotation: 0
r:
type: py
rotation: 0
r:
type: O
rotation: 0
r:
type: C
rotation: 0
above:
rotation: 0
division:
- 0.3892208111732773
- 0.3892208111732773
height: 3.0
l:
rotation: 0
division:
- 0.43255331098925165
- 0.43255331098925165
l:
rotation: 0
division:
- 0.28066838730628463
- 0.28066838730628463
l:
rotation: 0
division:
- 0.16666666666666666
- 0.16666666666666666
l:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.34155460722336733
- 0.34155460722336733
l:
rotation: 1
division:
- 0.5029024891632397
- 0.5029024891632397
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.8447025420273533
- 0.8447025420273533
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.7009836427732035
- 0.7009836427732035
l:
type: r
rotation: 0
r:
type: tt
rotation: 0
r:
rotation: 0
division:
- 0.6434201292371758
- 0.6434201292371758
l:
rotation: 0
division:
- 0.27709722975684414
- 0.27709722975684414
l:
rotation: 0
division:
- 0.4082488946798416
- 0.4082488946798416
l:
type: ut1
rotation: 0
r:
rotation: 1
division:
- 0.6120090509180269
- 0.6120090509180269
l:
type: ur3
rotation: 0
r:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.3333333333333333
- 0.3333333333333333
l:
type: q1
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.3352683261088271
- 0.3352683261088271
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.5974374068485503
- 0.5974374068485503
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5690539691736006
- 0.5690539691736006
l:
rotation: 0
division:
- 0.34088632491204374
- 0.34088632491204374
l:
rotation: 0
division:
- 0.8670584703450476
- 0.8670584703450476
l:
type: O
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.4484330800758139
- 0.4484330800758139
l:
type: gy1
rotation: 3
r:
rotation: 0
division:
- 0.7327434282057801
- 0.7327434282057801
l:
type: C
rotation: 0
r:
rotation: 1
division:
- 0.3352683261088271
- 0.3352683261088271
l:
type: tt
rotation: 0
r:
rotation: 1
division:
- 0.5060456297205106
- 0.5060456297205106
l:
type: tt
rotation: 0
r:
type: tt
rotation: 0
r:
rotation: 0
division:
- 0.21941800051545024
- 0.21941800051545024
l:
rotation: 0
division:
- 0.36363636363636365
- 0.36363636363636365
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5442952443728626
- 0.5442952443728626
l:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.4671703321376224
- 0.4671703321376224
l:
type: r
rotation: 0
r:
type: O
rotation: 0

View file

@ -0,0 +1,543 @@
WARNING: 338 m2 per storey needs ~70 m of daylit wall; the plot's non-private perimeter gives 55 m. Roughly 22 m2 of courtyard closes the gap. (DESIGN.md §38.3)
seed : /home/bruno/src/homemaker-layout/examples/maple-court/init.dom
programme : maple-court
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 1
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/maple-court/coldstart-500000-s1.dom
[ 80 evals] best 7.48546e-46 (fails 141) via construct/0
[ 160 evals] best 4.82423e-42 (fails 127) via construct/1
[ 480 evals] best 8.67067e-42 (fails 124) via construct/5
[ 800 evals] best 4.80398e-39 (fails 122) via construct/9
[ 1440 evals] best 6.36848e-40 (fails 118) via place_missing r -> rrrr
[ 2160 evals] best 1.32118e-39 (fails 117) via level_fix noop
[ 2400 evals] best 1.60106e-38 (fails 114) via place_missing em -> rlll
[ 3040 evals] best 3.2838e-38 (fails 113) via rotate 0/rrll
[ 3760 evals] best 3.65129e-38 (fails 113) via core_undivide noop
[ 4320 evals] best 5.79431e-37 (fails 109) via place_missing r -> rrrl
[ 4400 evals] best 5.8784e-37 (fails 109) via core_undivide noop
[ 4640 evals] best 2.78722e-36 (fails 107) via retype 1/rlllr->py
[ 5760 evals] best 4.90785e-34 (fails 100) via crossover lrrl<->rrrl
[ 8480 evals] best 5.06412e-34 (fails 100) via level_retype 2/rrlr<->0/rrrl
[ 8960 evals] best 1.00937e-33 (fails 99) via retype 1/rrlr->O
[ 9840 evals] best 2.11427e-33 (fails 98) via swap 0/lrr
[ 10480 evals] best 2.17495e-33 (fails 98) via swap 0/rlrl
[ 11040 evals] best 2.25388e-33 (fails 98) via core_divide noop
[ 12480 evals] best 4.78668e-33 (fails 98) via undivide 2/llr
[ 12720 evals] best 4.80876e-33 (fails 98) via core_divide noop
[ 13760 evals] best 9.1709e-33 (fails 96) via divide 2/llrr
[ 14560 evals] best 1.84586e-32 (fails 95) via core_undivide noop
[ 16880 evals] best 1.85284e-32 (fails 95) via crossover llrlr<->rlllr
[ 19840 evals] best 7.42595e-32 (fails 93) via core_undivide noop
[ 20800 evals] best 1.48504e-31 (fails 92) via core_undivide noop
[ 23680 evals] best 1.48739e-31 (fails 92) via core_undivide noop
[ 24560 evals] best 1.55172e-31 (fails 92) via core_divide noop
[ 25680 evals] best 1.56264e-31 (fails 92) via core_undivide noop
[ 26080 evals] best 6.36171e-31 (fails 90) via swap 2/rrr
[ 27040 evals] best 6.41788e-31 (fails 90) via level_retype 0/rrrl<->2/rllr
[ 28240 evals] best 1.02644e-30 (fails 89) via crossover lrl<->lrr
[ 29200 evals] best 1.04874e-30 (fails 89) via crossover llrrr<->llrrr
[ 30320 evals] best 3.66451e-30 (fails 88) via level_compound_fix k1: lvl2 → lvl0/rllll + insert lr1 into lrlr/lvl0
[ 30960 evals] best 1.09242e-29 (fails 86) via crossover rrlrr<->llrrl
[ 33120 evals] best 3.5356e-29 (fails 84) via crossover llrll<->lrll
[ 36160 evals] best 3.56494e-29 (fails 84) via level_retype 0/lrrr<->2/rllr
[ 40320 evals] best 4.93101e-29 (fails 84) via crossover lr<->lr
[ 40960 evals] best 4.96131e-29 (fails 84) via crossover rlrrr<->rlrrr
[ 42240 evals] best 8.67773e-29 (fails 83) via retype 2/rrrrr->t
[ 43920 evals] best 1.52112e-28 (fails 81) via crossover lllr<->rlrr
[ 46480 evals] best 1.52992e-28 (fails 81) via crossover lrr<->lrr
[ 48720 evals] best 3.06138e-28 (fails 80) via level_retype 2/lllr<->0/rlrlr
[ 51120 evals] best 3.07068e-28 (fails 80) via swap 2/llrr
[ 53440 evals] best 3.07434e-28 (fails 80) via swap 0/rlrr
[ 54560 evals] best 3.44534e-28 (fails 80) via crossover lrrl<->lllrl
[ 57600 evals] best 3.45695e-28 (fails 80) via core_divide noop
[ 58240 evals] best 3.46141e-28 (fails 80) via core_undivide noop
[ 61440 evals] best 3.46205e-28 (fails 80) via core_divide noop
[ 61840 evals] best 3.4624e-28 (fails 80) via core_divide noop
[ 62720 evals] best 3.46265e-28 (fails 80) via core_divide noop
[ 62800 evals] best 3.46265e-28 (fails 80) via core_undivide noop
[ 64880 evals] best 3.51879e-28 (fails 79) via level_fix k1: lvl2/rrlr → lvl0/rllll
[ 66240 evals] best 3.53264e-28 (fails 79) via retype 1/lrll->gh1
[ 66480 evals] best 3.55549e-28 (fails 79) via core_divide noop
[ 66800 evals] best 3.57445e-28 (fails 79) via crossover llrll<->llrll
[ 68000 evals] best 2.06412e-27 (fails 77) via level_fix k1: lvl2/rrlr → lvl0/rllll
[ 69120 evals] best 2.06883e-27 (fails 77) via core_divide noop
[ 71520 evals] best 2.76174e-27 (fails 76) via rotate 0/lr
[ 72640 evals] best 2.76227e-27 (fails 76) via core_undivide noop
[ 73520 evals] best 2.76276e-27 (fails 76) via core_divide noop
[ 75600 evals] best 2.7632e-27 (fails 76) via core_divide noop
[ 76320 evals] best 2.76358e-27 (fails 76) via core_undivide noop
[ 76960 evals] best 2.76389e-27 (fails 76) via core_undivide noop
[ 78880 evals] best 1.83174e-26 (fails 75) via level_retype 0/rrlrlr<->2/rlll
[ 78960 evals] best 1.87802e-26 (fails 75) via core_divide noop
[ 79360 evals] best 3.90146e-26 (fails 74) via swap 0/rlrl
[ 79520 evals] best 3.95859e-26 (fails 74) via rotate 0/llrr
[ 79600 evals] best 3.96056e-26 (fails 74) via crossover lrrl<->lllrl
[ 82720 evals] best 3.98751e-26 (fails 74) via core_undivide noop
[ 84240 evals] best 8.37192e-26 (fails 73) via crossover llrl<->lrr
[ 84640 evals] best 8.42852e-26 (fails 73) via rotate 2/rrrr
[ 84800 evals] best 3.5634e-25 (fails 71) via crossover rllr<->lrrl
[ 87040 evals] best 3.59072e-25 (fails 71) via rotate 0/rrll
[ 89120 evals] best 3.61957e-25 (fails 71) via retype 1/rlllr->lr1
[ 90800 evals] best 1.19078e-24 (fails 70) via crossover rlrrl<->rrlrr
[ 97680 evals] best 5.2661e-24 (fails 68) via rotate 0/lrl
[ 98560 evals] best 5.54831e-24 (fails 68) via retype 0/rlrlr->ur3
[103360 evals] best 5.61335e-24 (fails 68) via level_retype 2/llll<->1/rllll
[104400 evals] best 5.65917e-24 (fails 68) via core_divide noop
[106240 evals] best 5.68365e-24 (fails 68) via core_undivide noop
[108800 evals] best 1.16147e-23 (fails 67) via core_divide noop
[109760 evals] best 2.26647e-23 (fails 66) via swap 0/lrl
[112160 evals] best 2.27596e-23 (fails 66) via core_undivide noop
[112800 evals] best 9.05097e-23 (fails 64) via level_retype 0/llrll<->2/rrll
[115920 evals] best 9.55098e-23 (fails 64) via core_undivide noop
[117200 evals] best 9.59197e-23 (fails 64) via rotate 0/rlrl
[120080 evals] best 9.62542e-23 (fails 64) via core_undivide noop
[120160 evals] best 3.45118e-22 (fails 62) via crossover rrlrl<->rlrrr
[120400 evals] best 3.4623e-22 (fails 62) via core_divide noop
[121280 evals] best 3.47395e-22 (fails 62) via core_divide noop
[127040 evals] best 3.48617e-22 (fails 62) via crossover llrrr<->lrlr
[130400 evals] best 3.49897e-22 (fails 62) via crossover ll<->ll
[141760 evals] best 6.80652e-22 (fails 61) via swap 0/lrl
[143680 evals] best 9.54701e-22 (fails 61) via crossover rlrrl<->lrll
[151440 evals] best 9.57869e-22 (fails 61) via level_retype 2/rllr<->1/lrll
[153120 evals] best 9.61188e-22 (fails 61) via retype 0/llrll->n
[157360 evals] best 9.64666e-22 (fails 61) via retype 0/rlrlr->tt
[159680 evals] best 1.85943e-21 (fails 60) via undivide 0/rlrr
[161040 evals] best 1.86564e-21 (fails 60) via core_undivide noop
[161440 evals] best 1.87142e-21 (fails 60) via retype 1/lrrr->gh1
[170240 evals] best 2.15038e-21 (fails 60) via swap 0/llrr
[172160 evals] best 2.16303e-21 (fails 60) via core_undivide noop
[180800 evals] best 2.17437e-21 (fails 60) via swap 0/rlrl
[188640 evals] best 2.18483e-21 (fails 60) via core_undivide noop
[192560 evals] best 2.1924e-21 (fails 60) via core_undivide noop
[197280 evals] best 2.19779e-21 (fails 60) via crossover rlrlr<->rlrlr
[199040 evals] best 2.20487e-21 (fails 60) via swap 0/lrl
[205040 evals] best 2.21102e-21 (fails 60) via crossover rrr<->rrr
[206480 evals] best 2.21103e-21 (fails 60) via retype 0/rrlrll->gh1
[212000 evals] best 2.21402e-21 (fails 60) via core_undivide noop
[215760 evals] best 2.21403e-21 (fails 60) via retype 2/llrrl->tt
[215920 evals] best 2.21422e-21 (fails 60) via retype 0/rrlrll->gh1
[225600 evals] best 2.21422e-21 (fails 60) via rotate 2/llrr
[227200 evals] best 2.21441e-21 (fails 60) via rotate 2/llrr
[230720 evals] best 2.21445e-21 (fails 60) via core_undivide noop
[234720 evals] best 2.21445e-21 (fails 60) via swap 0/rrll
[240240 evals] best 2.7509e-20 (fails 56) via level_fix ws1: lvl1/rllll → lvl0/rllll
[268800 evals] best 6.17587e-20 (fails 55) via swap 0/lr
[271440 evals] best 6.21537e-20 (fails 55) via rotate 2/llrr
[272480 evals] best 6.21597e-20 (fails 55) via swap 0/lrr
[275920 evals] best 6.23221e-20 (fails 55) via core_undivide noop
[279920 evals] best 6.23222e-20 (fails 55) via core_undivide noop
[290320 evals] best 2.47209e-19 (fails 53) via undivide 0/lrr
[290640 evals] best 2.47209e-19 (fails 53) via level_retype 2/rrrrl<->0/llrlr
[338880 evals] best 2.54027e-19 (fails 53) via undivide 0/llrll
[344000 evals] best 2.54987e-19 (fails 53) via core_undivide noop
[345120 evals] best 2.54991e-19 (fails 53) via core_undivide noop
[365760 evals] best 2.54992e-19 (fails 53) via rotate 0/rrll
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 20 shared-leaf copies
[ 200 evals] best 5.2212e-35 (fails 105) via seed
[ 600 evals] best 5.31288e-35 (fails 105) via core_undivide noop
[ 4600 evals] best 5.34535e-35 (fails 105) via swap 0/rlrl
[ 5480 evals] best 5.50561e-35 (fails 105) via core_undivide noop
[ 8600 evals] best 5.91954e-35 (fails 105) via core_undivide noop
[ 11640 evals] best 5.95296e-35 (fails 105) via crossover lrlr<->lrlr
[ 12120 evals] best 1.08246e-34 (fails 104) via core_undivide noop
[ 12280 evals] best 2.18762e-34 (fails 103) via core_undivide noop
[ 13480 evals] best 4.4404e-34 (fails 102) via swap 2/lllr
[ 15720 evals] best 4.49169e-34 (fails 102) via crossover rlrlr<->rlllrl
[ 18120 evals] best 9.17439e-34 (fails 101) via divide 2/rlrl
[ 18200 evals] best 9.24149e-34 (fails 101) via core_undivide noop
[ 18360 evals] best 1.01588e-33 (fails 101) via undivide 2/rlrl
[ 20040 evals] best 1.02041e-33 (fails 101) via crossover rrllrr<->rrllrr
[ 20440 evals] best 1.09867e-33 (fails 101) via swap 0/rlrl
[ 23080 evals] best 1.10286e-33 (fails 101) via swap 0/rrr
[ 24920 evals] best 1.10506e-33 (fails 101) via level_retype 0/rllll<->1/lrrr
[ 28920 evals] best 1.11142e-33 (fails 101) via core_undivide noop
[ 29560 evals] best 1.11302e-33 (fails 101) via crossover rrlll<->rrlll
[ 30760 evals] best 2.88758e-33 (fails 100) via undivide 0/lll
[ 31640 evals] best 2.91448e-33 (fails 100) via core_undivide noop
[ 32680 evals] best 5.24826e-33 (fails 99) via crossover llrll<->rrlrl
[ 35560 evals] best 5.54405e-33 (fails 99) via retype 0/rlllrrr->rc1
[ 39080 evals] best 5.5603e-33 (fails 99) via rotate 0/rrlll
[ 39160 evals] best 5.57739e-33 (fails 99) via core_undivide noop
[ 42600 evals] best 5.5943e-33 (fails 99) via retype 0/rlrlr->li1
[ 42760 evals] best 5.69106e-33 (fails 99) via crossover rrllrr<->rrlllr
[ 42920 evals] best 6.73164e-33 (fails 99) via rotate 0/llrl
[ 51480 evals] best 6.83512e-33 (fails 99) via rotate 0/rlllr
[ 52200 evals] best 6.87955e-33 (fails 99) via core_undivide noop
[ 52680 evals] best 6.88824e-33 (fails 99) via core_undivide noop
[ 53080 evals] best 6.89371e-33 (fails 99) via retype 2/rlrrrl->lr1
[ 57160 evals] best 1.20103e-32 (fails 98) via rotate 0/rrl
[ 57480 evals] best 1.29e-32 (fails 98) via crossover llrlr<->rrlrll
[ 58280 evals] best 1.85811e-31 (fails 94) via rotate 0/rrllrr
[ 59560 evals] best 1.86354e-31 (fails 94) via crossover rrllrrr<->rrllrrr
[ 60360 evals] best 1.86497e-31 (fails 94) via retype 1/lllr->k1
[ 63000 evals] best 4.31216e-31 (fails 93) via crossover rrlll<->rrllr
[ 66120 evals] best 4.44199e-31 (fails 93) via level_retype 2/rlrrrrr<->1/rlllr
[ 66760 evals] best 4.51891e-31 (fails 93) via level_retype 2/llrrl<->0/rrllll
[ 67320 evals] best 8.4029e-31 (fails 92) via crossover rlrlr<->rrlrr
[ 69160 evals] best 8.60511e-31 (fails 92) via swap 0/rrlrl
[ 71400 evals] best 8.63911e-31 (fails 92) via core_undivide noop
[ 72600 evals] best 8.79881e-31 (fails 92) via crossover rrlll<->rrllrr
[ 73080 evals] best 8.83116e-31 (fails 92) via core_undivide noop
[ 74200 evals] best 8.85642e-31 (fails 92) via retype 1/rllrl->em
[ 75800 evals] best 8.87862e-31 (fails 92) via core_undivide noop
[ 76760 evals] best 8.8989e-31 (fails 92) via level_retype 0/rlrlr<->2/lrrrrl
[ 82040 evals] best 8.91395e-31 (fails 92) via crossover rrlllr<->rlrlr
[ 82120 evals] best 1.73329e-30 (fails 91) via undivide 0/rlrl
[ 83000 evals] best 1.77156e-30 (fails 91) via core_undivide noop
[ 83080 evals] best 1.78496e-30 (fails 91) via retype 0/llrll->me1
[ 83480 evals] best 3.57354e-30 (fails 90) via swap 2/lrrrr
[ 83960 evals] best 3.57541e-30 (fails 90) via crossover lr<->lr
[ 84120 evals] best 4.01301e-30 (fails 90) via divide 0/rlrr
[ 87400 evals] best 8.58213e-30 (fails 89) via crossover llrll<->lrlr
[ 88760 evals] best 9.11271e-30 (fails 89) via undivide 0/rrlll
[ 89320 evals] best 1.41927e-29 (fails 88) via rotate 0/rrlrl
[ 89720 evals] best 6.87803e-29 (fails 86) via undivide 0/rlrl
[ 93640 evals] best 6.98647e-29 (fails 86) via crossover rrllrrl<->rlrlr
[ 94280 evals] best 7.1026e-29 (fails 86) via level_retype 0/lrr<->1/rrr
[ 97800 evals] best 7.14826e-29 (fails 86) via retype 0/llrllr->m
[100760 evals] best 7.2509e-29 (fails 86) via rotate 2/rlrrrr
[101320 evals] best 7.2509e-29 (fails 86) via retype 2/llrrl->la1
[101640 evals] best 7.28113e-29 (fails 86) via level_retype 1/lrrll<->2/lrrrrl
[101960 evals] best 7.30664e-29 (fails 86) via level_retype 2/lllrlr<->1/rllrl
[106280 evals] best 7.34119e-29 (fails 86) via level_retype 1/llll<->0/rrllrrr
[111560 evals] best 7.34119e-29 (fails 86) via retype 1/rrllrl->lr1
[115320 evals] best 7.38547e-29 (fails 86) via core_undivide noop
[116040 evals] best 7.42718e-29 (fails 86) via crossover rlllrrl<->rrllll
[116760 evals] best 7.42718e-29 (fails 86) via retype 1/rllrl->ur2
[117080 evals] best 8.03623e-29 (fails 86) via retype 2/lllrrr->ws1
[118120 evals] best 8.09228e-29 (fails 86) via level_retype 0/rrlrlr<->2/rlrl
[118760 evals] best 8.1446e-29 (fails 86) via retype 1/rrlll->ws1
[121000 evals] best 3.02477e-28 (fails 84) via rotate 0/rl
[121480 evals] best 3.08711e-28 (fails 84) via retype 2/lrrrrr->ws1
[122760 evals] best 3.38962e-28 (fails 84) via retype 0/rrrr->ws1
[123400 evals] best 3.38962e-28 (fails 84) via crossover rlrl<->lrll
[123640 evals] best 3.50344e-28 (fails 84) via crossover lrr<->lrr
[124520 evals] best 3.52045e-28 (fails 84) via retype 2/rlrrrrl->me1
[124600 evals] best 3.56494e-28 (fails 84) via core_undivide noop
[125800 evals] best 6.73688e-28 (fails 83) via undivide 0/rlrr
[126760 evals] best 6.77494e-28 (fails 83) via crossover rrlll<->rrlll
[130280 evals] best 7.25183e-28 (fails 83) via rotate 2/rlrrrr
[131800 evals] best 1.43538e-27 (fails 82) via core_undivide noop
[132840 evals] best 1.43967e-27 (fails 82) via level_retype 2/rlrl<->1/rllrr
[134200 evals] best 1.44785e-27 (fails 82) via crossover rrllrrl<->rlllrrr
[143320 evals] best 1.45449e-27 (fails 82) via retype 2/lrrrl->la1
[143560 evals] best 1.45909e-27 (fails 82) via swap 0/rrr
[146120 evals] best 1.46026e-27 (fails 82) via retype 1/lrrr->rc1
[148520 evals] best 1.48466e-27 (fails 82) via retype 1/rllrr->q1
[150600 evals] best 3.27114e-27 (fails 80) via crossover rllll<->lr
[153800 evals] best 3.32861e-27 (fails 80) via retype 0/rrlrlll->py
[155640 evals] best 3.33504e-27 (fails 80) via retype 0/rrllll->la1
[159160 evals] best 2.55427e-26 (fails 77) via crossover rllllrr<->llrlll
[161720 evals] best 2.56973e-26 (fails 77) via level_retype 2/rrrrl<->0/rllllrl
[161800 evals] best 2.58293e-26 (fails 77) via core_undivide noop
[166040 evals] best 2.59423e-26 (fails 77) via core_undivide noop
[172440 evals] best 2.60068e-26 (fails 77) via core_undivide noop
[173960 evals] best 2.60902e-26 (fails 77) via crossover llrrl<->llrllr
[175080 evals] best 2.64008e-26 (fails 77) via rotate 2/lrrrr
[177240 evals] best 2.64316e-26 (fails 77) via retype 2/llll->rc1
[177400 evals] best 2.70036e-26 (fails 77) via level_retype 2/rlrrrrr<->0/rrlllr
[178040 evals] best 2.70318e-26 (fails 77) via level_retype 1/llll<->2/llrrl
[178920 evals] best 4.94916e-26 (fails 76) via swap 0/rlllr
[182120 evals] best 5.18746e-26 (fails 76) via core_undivide noop
[185240 evals] best 5.26932e-26 (fails 76) via swap 1/lll
[190120 evals] best 9.41818e-26 (fails 75) via core_undivide noop
[194760 evals] best 9.45567e-26 (fails 75) via swap 0/rlllrl
[197240 evals] best 9.49813e-26 (fails 75) via core_undivide noop
[201960 evals] best 9.55548e-26 (fails 75) via crossover llrrl<->rrrl
[202280 evals] best 9.62796e-26 (fails 75) via level_retype 2/rlrl<->0/rlllrll
[207320 evals] best 9.7119e-26 (fails 75) via core_undivide noop
[207800 evals] best 9.80185e-26 (fails 75) via swap 2/lrrrr
[213480 evals] best 9.83175e-26 (fails 75) via core_undivide noop
[220440 evals] best 9.8571e-26 (fails 75) via core_undivide noop
[222680 evals] best 9.93164e-26 (fails 75) via swap 0/rrll
[226360 evals] best 9.97687e-26 (fails 75) via rotate 2/llrr
[227080 evals] best 9.98918e-26 (fails 75) via swap 2/lrrrr
[228040 evals] best 1.02173e-25 (fails 75) via crossover rrllll<->rrllrl
[232200 evals] best 1.03412e-25 (fails 75) via core_undivide noop
[232920 evals] best 1.03464e-25 (fails 75) via crossover rrlrlll<->rrlrlll
[235160 evals] best 1.03475e-25 (fails 75) via crossover lrll<->lrll
[239320 evals] best 1.03698e-25 (fails 75) via core_undivide noop
[240040 evals] best 1.037e-25 (fails 75) via retype 1/lrrr->q1
[246760 evals] best 1.03703e-25 (fails 75) via level_retype 0/llrlr<->2/lrrrl
[249560 evals] best 4.61196e-25 (fails 73) via level_retype 0/rlrrr<->2/lrrrl
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 227 → 73 fails (applied)
--- done ---
elapsed : 207109.5s
evals : 750040 across 9374 topologies
best : 4.61196e-25 (73 fails) via level_retype 0/rlrrr<->2/lrrrl+collapse
improvement history:
[ 80] 7.48546e-46 (share:construct/0)
[ 160] 4.82423e-42 (share:construct/1)
[ 480] 8.67067e-42 (share:construct/5)
[ 800] 4.80398e-39 (share:construct/9)
[ 1440] 6.36848e-40 (share:place_missing r -> rrrr)
[ 2160] 1.32118e-39 (share:level_fix noop)
[ 2400] 1.60106e-38 (share:place_missing em -> rlll)
[ 3040] 3.2838e-38 (share:rotate 0/rrll)
[ 3760] 3.65129e-38 (share:core_undivide noop)
[ 4320] 5.79431e-37 (share:place_missing r -> rrrl)
[ 4400] 5.8784e-37 (share:core_undivide noop)
[ 4640] 2.78722e-36 (share:retype 1/rlllr->py)
[ 5760] 4.90785e-34 (share:crossover lrrl<->rrrl)
[ 8480] 5.06412e-34 (share:level_retype 2/rrlr<->0/rrrl)
[ 8960] 1.00937e-33 (share:retype 1/rrlr->O)
[ 9840] 2.11427e-33 (share:swap 0/lrr)
[ 10480] 2.17495e-33 (share:swap 0/rlrl)
[ 11040] 2.25388e-33 (share:core_divide noop)
[ 12480] 4.78668e-33 (share:undivide 2/llr)
[ 12720] 4.80876e-33 (share:core_divide noop)
[ 13760] 9.1709e-33 (share:divide 2/llrr)
[ 14560] 1.84586e-32 (share:core_undivide noop)
[ 16880] 1.85284e-32 (share:crossover llrlr<->rlllr)
[ 19840] 7.42595e-32 (share:core_undivide noop)
[ 20800] 1.48504e-31 (share:core_undivide noop)
[ 23680] 1.48739e-31 (share:core_undivide noop)
[ 24560] 1.55172e-31 (share:core_divide noop)
[ 25680] 1.56264e-31 (share:core_undivide noop)
[ 26080] 6.36171e-31 (share:swap 2/rrr)
[ 27040] 6.41788e-31 (share:level_retype 0/rrrl<->2/rllr)
[ 28240] 1.02644e-30 (share:crossover lrl<->lrr)
[ 29200] 1.04874e-30 (share:crossover llrrr<->llrrr)
[ 30320] 3.66451e-30 (share:level_compound_fix k1: lvl2 → lvl0/rllll + insert lr1 into lrlr/lvl0)
[ 30960] 1.09242e-29 (share:crossover rrlrr<->llrrl)
[ 33120] 3.5356e-29 (share:crossover llrll<->lrll)
[ 36160] 3.56494e-29 (share:level_retype 0/lrrr<->2/rllr)
[ 40320] 4.93101e-29 (share:crossover lr<->lr)
[ 40960] 4.96131e-29 (share:crossover rlrrr<->rlrrr)
[ 42240] 8.67773e-29 (share:retype 2/rrrrr->t)
[ 43920] 1.52112e-28 (share:crossover lllr<->rlrr)
[ 46480] 1.52992e-28 (share:crossover lrr<->lrr)
[ 48720] 3.06138e-28 (share:level_retype 2/lllr<->0/rlrlr)
[ 51120] 3.07068e-28 (share:swap 2/llrr)
[ 53440] 3.07434e-28 (share:swap 0/rlrr)
[ 54560] 3.44534e-28 (share:crossover lrrl<->lllrl)
[ 57600] 3.45695e-28 (share:core_divide noop)
[ 58240] 3.46141e-28 (share:core_undivide noop)
[ 61440] 3.46205e-28 (share:core_divide noop)
[ 61840] 3.4624e-28 (share:core_divide noop)
[ 62720] 3.46265e-28 (share:core_divide noop)
[ 62800] 3.46265e-28 (share:core_undivide noop)
[ 64880] 3.51879e-28 (share:level_fix k1: lvl2/rrlr → lvl0/rllll)
[ 66240] 3.53264e-28 (share:retype 1/lrll->gh1)
[ 66480] 3.55549e-28 (share:core_divide noop)
[ 66800] 3.57445e-28 (share:crossover llrll<->llrll)
[ 68000] 2.06412e-27 (share:level_fix k1: lvl2/rrlr → lvl0/rllll)
[ 69120] 2.06883e-27 (share:core_divide noop)
[ 71520] 2.76174e-27 (share:rotate 0/lr)
[ 72640] 2.76227e-27 (share:core_undivide noop)
[ 73520] 2.76276e-27 (share:core_divide noop)
[ 75600] 2.7632e-27 (share:core_divide noop)
[ 76320] 2.76358e-27 (share:core_undivide noop)
[ 76960] 2.76389e-27 (share:core_undivide noop)
[ 78880] 1.83174e-26 (share:level_retype 0/rrlrlr<->2/rlll)
[ 78960] 1.87802e-26 (share:core_divide noop)
[ 79360] 3.90146e-26 (share:swap 0/rlrl)
[ 79520] 3.95859e-26 (share:rotate 0/llrr)
[ 79600] 3.96056e-26 (share:crossover lrrl<->lllrl)
[ 82720] 3.98751e-26 (share:core_undivide noop)
[ 84240] 8.37192e-26 (share:crossover llrl<->lrr)
[ 84640] 8.42852e-26 (share:rotate 2/rrrr)
[ 84800] 3.5634e-25 (share:crossover rllr<->lrrl)
[ 87040] 3.59072e-25 (share:rotate 0/rrll)
[ 89120] 3.61957e-25 (share:retype 1/rlllr->lr1)
[ 90800] 1.19078e-24 (share:crossover rlrrl<->rrlrr)
[ 97680] 5.2661e-24 (share:rotate 0/lrl)
[ 98560] 5.54831e-24 (share:retype 0/rlrlr->ur3)
[103360] 5.61335e-24 (share:level_retype 2/llll<->1/rllll)
[104400] 5.65917e-24 (share:core_divide noop)
[106240] 5.68365e-24 (share:core_undivide noop)
[108800] 1.16147e-23 (share:core_divide noop)
[109760] 2.26647e-23 (share:swap 0/lrl)
[112160] 2.27596e-23 (share:core_undivide noop)
[112800] 9.05097e-23 (share:level_retype 0/llrll<->2/rrll)
[115920] 9.55098e-23 (share:core_undivide noop)
[117200] 9.59197e-23 (share:rotate 0/rlrl)
[120080] 9.62542e-23 (share:core_undivide noop)
[120160] 3.45118e-22 (share:crossover rrlrl<->rlrrr)
[120400] 3.4623e-22 (share:core_divide noop)
[121280] 3.47395e-22 (share:core_divide noop)
[127040] 3.48617e-22 (share:crossover llrrr<->lrlr)
[130400] 3.49897e-22 (share:crossover ll<->ll)
[141760] 6.80652e-22 (share:swap 0/lrl)
[143680] 9.54701e-22 (share:crossover rlrrl<->lrll)
[151440] 9.57869e-22 (share:level_retype 2/rllr<->1/lrll)
[153120] 9.61188e-22 (share:retype 0/llrll->n)
[157360] 9.64666e-22 (share:retype 0/rlrlr->tt)
[159680] 1.85943e-21 (share:undivide 0/rlrr)
[161040] 1.86564e-21 (share:core_undivide noop)
[161440] 1.87142e-21 (share:retype 1/lrrr->gh1)
[170240] 2.15038e-21 (share:swap 0/llrr)
[172160] 2.16303e-21 (share:core_undivide noop)
[180800] 2.17437e-21 (share:swap 0/rlrl)
[188640] 2.18483e-21 (share:core_undivide noop)
[192560] 2.1924e-21 (share:core_undivide noop)
[197280] 2.19779e-21 (share:crossover rlrlr<->rlrlr)
[199040] 2.20487e-21 (share:swap 0/lrl)
[205040] 2.21102e-21 (share:crossover rrr<->rrr)
[206480] 2.21103e-21 (share:retype 0/rrlrll->gh1)
[212000] 2.21402e-21 (share:core_undivide noop)
[215760] 2.21403e-21 (share:retype 2/llrrl->tt)
[215920] 2.21422e-21 (share:retype 0/rrlrll->gh1)
[225600] 2.21422e-21 (share:rotate 2/llrr)
[227200] 2.21441e-21 (share:rotate 2/llrr)
[230720] 2.21445e-21 (share:core_undivide noop)
[234720] 2.21445e-21 (share:swap 0/rrll)
[240240] 2.7509e-20 (share:level_fix ws1: lvl1/rllll → lvl0/rllll)
[268800] 6.17587e-20 (share:swap 0/lr)
[271440] 6.21537e-20 (share:rotate 2/llrr)
[272480] 6.21597e-20 (share:swap 0/lrr)
[275920] 6.23221e-20 (share:core_undivide noop)
[279920] 6.23222e-20 (share:core_undivide noop)
[290320] 2.47209e-19 (share:undivide 0/lrr)
[290640] 2.47209e-19 (share:level_retype 2/rrrrl<->0/llrlr)
[338880] 2.54027e-19 (share:undivide 0/llrll)
[344000] 2.54987e-19 (share:core_undivide noop)
[345120] 2.54991e-19 (share:core_undivide noop)
[365760] 2.54992e-19 (share:rotate 0/rrll)
[500200] 5.2212e-35 (polish:seed)
[500600] 5.31288e-35 (polish:core_undivide noop)
[504600] 5.34535e-35 (polish:swap 0/rlrl)
[505480] 5.50561e-35 (polish:core_undivide noop)
[508600] 5.91954e-35 (polish:core_undivide noop)
[511640] 5.95296e-35 (polish:crossover lrlr<->lrlr)
[512120] 1.08246e-34 (polish:core_undivide noop)
[512280] 2.18762e-34 (polish:core_undivide noop)
[513480] 4.4404e-34 (polish:swap 2/lllr)
[515720] 4.49169e-34 (polish:crossover rlrlr<->rlllrl)
[518120] 9.17439e-34 (polish:divide 2/rlrl)
[518200] 9.24149e-34 (polish:core_undivide noop)
[518360] 1.01588e-33 (polish:undivide 2/rlrl)
[520040] 1.02041e-33 (polish:crossover rrllrr<->rrllrr)
[520440] 1.09867e-33 (polish:swap 0/rlrl)
[523080] 1.10286e-33 (polish:swap 0/rrr)
[524920] 1.10506e-33 (polish:level_retype 0/rllll<->1/lrrr)
[528920] 1.11142e-33 (polish:core_undivide noop)
[529560] 1.11302e-33 (polish:crossover rrlll<->rrlll)
[530760] 2.88758e-33 (polish:undivide 0/lll)
[531640] 2.91448e-33 (polish:core_undivide noop)
[532680] 5.24826e-33 (polish:crossover llrll<->rrlrl)
[535560] 5.54405e-33 (polish:retype 0/rlllrrr->rc1)
[539080] 5.5603e-33 (polish:rotate 0/rrlll)
[539160] 5.57739e-33 (polish:core_undivide noop)
[542600] 5.5943e-33 (polish:retype 0/rlrlr->li1)
[542760] 5.69106e-33 (polish:crossover rrllrr<->rrlllr)
[542920] 6.73164e-33 (polish:rotate 0/llrl)
[551480] 6.83512e-33 (polish:rotate 0/rlllr)
[552200] 6.87955e-33 (polish:core_undivide noop)
[552680] 6.88824e-33 (polish:core_undivide noop)
[553080] 6.89371e-33 (polish:retype 2/rlrrrl->lr1)
[557160] 1.20103e-32 (polish:rotate 0/rrl)
[557480] 1.29e-32 (polish:crossover llrlr<->rrlrll)
[558280] 1.85811e-31 (polish:rotate 0/rrllrr)
[559560] 1.86354e-31 (polish:crossover rrllrrr<->rrllrrr)
[560360] 1.86497e-31 (polish:retype 1/lllr->k1)
[563000] 4.31216e-31 (polish:crossover rrlll<->rrllr)
[566120] 4.44199e-31 (polish:level_retype 2/rlrrrrr<->1/rlllr)
[566760] 4.51891e-31 (polish:level_retype 2/llrrl<->0/rrllll)
[567320] 8.4029e-31 (polish:crossover rlrlr<->rrlrr)
[569160] 8.60511e-31 (polish:swap 0/rrlrl)
[571400] 8.63911e-31 (polish:core_undivide noop)
[572600] 8.79881e-31 (polish:crossover rrlll<->rrllrr)
[573080] 8.83116e-31 (polish:core_undivide noop)
[574200] 8.85642e-31 (polish:retype 1/rllrl->em)
[575800] 8.87862e-31 (polish:core_undivide noop)
[576760] 8.8989e-31 (polish:level_retype 0/rlrlr<->2/lrrrrl)
[582040] 8.91395e-31 (polish:crossover rrlllr<->rlrlr)
[582120] 1.73329e-30 (polish:undivide 0/rlrl)
[583000] 1.77156e-30 (polish:core_undivide noop)
[583080] 1.78496e-30 (polish:retype 0/llrll->me1)
[583480] 3.57354e-30 (polish:swap 2/lrrrr)
[583960] 3.57541e-30 (polish:crossover lr<->lr)
[584120] 4.01301e-30 (polish:divide 0/rlrr)
[587400] 8.58213e-30 (polish:crossover llrll<->lrlr)
[588760] 9.11271e-30 (polish:undivide 0/rrlll)
[589320] 1.41927e-29 (polish:rotate 0/rrlrl)
[589720] 6.87803e-29 (polish:undivide 0/rlrl)
[593640] 6.98647e-29 (polish:crossover rrllrrl<->rlrlr)
[594280] 7.1026e-29 (polish:level_retype 0/lrr<->1/rrr)
[597800] 7.14826e-29 (polish:retype 0/llrllr->m)
[600760] 7.2509e-29 (polish:rotate 2/rlrrrr)
[601320] 7.2509e-29 (polish:retype 2/llrrl->la1)
[601640] 7.28113e-29 (polish:level_retype 1/lrrll<->2/lrrrrl)
[601960] 7.30664e-29 (polish:level_retype 2/lllrlr<->1/rllrl)
[606280] 7.34119e-29 (polish:level_retype 1/llll<->0/rrllrrr)
[611560] 7.34119e-29 (polish:retype 1/rrllrl->lr1)
[615320] 7.38547e-29 (polish:core_undivide noop)
[616040] 7.42718e-29 (polish:crossover rlllrrl<->rrllll)
[616760] 7.42718e-29 (polish:retype 1/rllrl->ur2)
[617080] 8.03623e-29 (polish:retype 2/lllrrr->ws1)
[618120] 8.09228e-29 (polish:level_retype 0/rrlrlr<->2/rlrl)
[618760] 8.1446e-29 (polish:retype 1/rrlll->ws1)
[621000] 3.02477e-28 (polish:rotate 0/rl)
[621480] 3.08711e-28 (polish:retype 2/lrrrrr->ws1)
[622760] 3.38962e-28 (polish:retype 0/rrrr->ws1)
[623400] 3.38962e-28 (polish:crossover rlrl<->lrll)
[623640] 3.50344e-28 (polish:crossover lrr<->lrr)
[624520] 3.52045e-28 (polish:retype 2/rlrrrrl->me1)
[624600] 3.56494e-28 (polish:core_undivide noop)
[625800] 6.73688e-28 (polish:undivide 0/rlrr)
[626760] 6.77494e-28 (polish:crossover rrlll<->rrlll)
[630280] 7.25183e-28 (polish:rotate 2/rlrrrr)
[631800] 1.43538e-27 (polish:core_undivide noop)
[632840] 1.43967e-27 (polish:level_retype 2/rlrl<->1/rllrr)
[634200] 1.44785e-27 (polish:crossover rrllrrl<->rlllrrr)
[643320] 1.45449e-27 (polish:retype 2/lrrrl->la1)
[643560] 1.45909e-27 (polish:swap 0/rrr)
[646120] 1.46026e-27 (polish:retype 1/lrrr->rc1)
[648520] 1.48466e-27 (polish:retype 1/rllrr->q1)
[650600] 3.27114e-27 (polish:crossover rllll<->lr)
[653800] 3.32861e-27 (polish:retype 0/rrlrlll->py)
[655640] 3.33504e-27 (polish:retype 0/rrllll->la1)
[659160] 2.55427e-26 (polish:crossover rllllrr<->llrlll)
[661720] 2.56973e-26 (polish:level_retype 2/rrrrl<->0/rllllrl)
[661800] 2.58293e-26 (polish:core_undivide noop)
[666040] 2.59423e-26 (polish:core_undivide noop)
[672440] 2.60068e-26 (polish:core_undivide noop)
[673960] 2.60902e-26 (polish:crossover llrrl<->llrllr)
[675080] 2.64008e-26 (polish:rotate 2/lrrrr)
[677240] 2.64316e-26 (polish:retype 2/llll->rc1)
[677400] 2.70036e-26 (polish:level_retype 2/rlrrrrr<->0/rrlllr)
[678040] 2.70318e-26 (polish:level_retype 1/llll<->2/llrrl)
[678920] 4.94916e-26 (polish:swap 0/rlllr)
[682120] 5.18746e-26 (polish:core_undivide noop)
[685240] 5.26932e-26 (polish:swap 1/lll)
[690120] 9.41818e-26 (polish:core_undivide noop)
[694760] 9.45567e-26 (polish:swap 0/rlllrl)
[697240] 9.49813e-26 (polish:core_undivide noop)
[701960] 9.55548e-26 (polish:crossover llrrl<->rrrl)
[702280] 9.62796e-26 (polish:level_retype 2/rlrl<->0/rlllrll)
[707320] 9.7119e-26 (polish:core_undivide noop)
[707800] 9.80185e-26 (polish:swap 2/lrrrr)
[713480] 9.83175e-26 (polish:core_undivide noop)
[720440] 9.8571e-26 (polish:core_undivide noop)
[722680] 9.93164e-26 (polish:swap 0/rrll)
[726360] 9.97687e-26 (polish:rotate 2/llrr)
[727080] 9.98918e-26 (polish:swap 2/lrrrr)
[728040] 1.02173e-25 (polish:crossover rrllll<->rrllrl)
[732200] 1.03412e-25 (polish:core_undivide noop)
[732920] 1.03464e-25 (polish:crossover rrlrlll<->rrlrlll)
[735160] 1.03475e-25 (polish:crossover lrll<->lrll)
[739320] 1.03698e-25 (polish:core_undivide noop)
[740040] 1.037e-25 (polish:retype 1/lrrr->q1)
[746760] 1.03703e-25 (polish:level_retype 0/llrlr<->2/lrrrl)
[749560] 4.61196e-25 (polish:level_retype 0/rlrrr<->2/lrrrl)
written : /home/bruno/src/homemaker-layout/examples/maple-court/coldstart-500000-s1.dom

View file

@ -0,0 +1,660 @@
node:
- - 0.0
- 0.0
- - 30.0
- 1.5
- - 29.0
- 28.0
- - 0.0
- 27.0
perimeter:
a: private
b: private
c: null
d: null
rotation: 0
division:
- 0.495698600316231
- 0.495698600316231
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.5683709666370568
- 0.5683709666370568
l:
rotation: 1
division:
- 0.46215929132095285
- 0.46215929132095285
l:
rotation: 1
division:
- 0.7471387331846713
- 0.7471387331846713
l:
type: lr1
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 3
division:
- 0.5304544217540867
- 0.5304544217540867
l:
rotation: 0
division:
- 0.6993298617044272
- 0.6993298617044272
l:
type: ws1
rotation: 0
r:
rotation: 1
division:
- 0.7877828260442032
- 0.7877828260442032
l:
type: C
rotation: 0
r:
type: t
rotation: 0
r:
type: da1
rotation: 0
r:
rotation: 3
division:
- 0.2568045109603507
- 0.2568045109603507
l:
rotation: 3
division:
- 0.43406506895086583
- 0.43406506895086583
l:
type: ph1
rotation: 0
r:
rotation: 0
division:
- 0.5074640705726834
- 0.5074640705726834
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
type: k1
rotation: 0
r:
rotation: 1
division:
- 0.7412499070689885
- 0.7412499070689885
l:
rotation: 0
division:
- 0.727687073818417
- 0.727687073818417
l:
rotation: 1
division:
- 0.5103475723684812
- 0.5103475723684812
l:
rotation: 1
division:
- 0.5585575406250274
- 0.5585575406250274
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 2
division:
- 0.6111449714698093
- 0.6111449714698093
l:
type: C
rotation: 0
r:
rotation: 3
division:
- 0.48669281705872525
- 0.48669281705872525
l:
type: m
rotation: 0
r:
rotation: 0
division:
- 0.5059079614653703
- 0.5059079614653703
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
type: gh1
rotation: 1
r:
rotation: 3
division:
- 0.5565594979517862
- 0.5565594979517862
l:
rotation: 0
division:
- 0.44353147517713065
- 0.44353147517713065
l:
type: la1
rotation: 0
r:
type: me1
rotation: 0
r:
rotation: 0
division:
- 0.6680420876810539
- 0.6680420876810539
l:
type: ur1
rotation: 0
r:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.5957265680465451
- 0.5957265680465451
l:
rotation: 0
division:
- 0.5559722706874881
- 0.5559722706874881
l:
rotation: 1
division:
- 0.717257064976556
- 0.717257064976556
l:
rotation: 3
division:
- 0.7437776174633095
- 0.7437776174633095
l:
type: ef1
rotation: 0
r:
type: C
rotation: 0
r:
type: rc1
rotation: 0
r:
rotation: 3
division:
- 0.5733232068406672
- 0.5733232068406672
l:
rotation: 0
division:
- 0.33542653619771207
- 0.33542653619771207
l:
type: t
rotation: 0
r:
rotation: 1
division:
- 0.5059792656599588
- 0.5059792656599588
l:
type: t
rotation: 0
r:
type: t
rotation: 0
r:
type: m
rotation: 0
r:
rotation: 1
division:
- 0.6279974814441083
- 0.6279974814441083
l:
type: O
rotation: 3
r:
type: C
rotation: 0
above:
rotation: 0
division:
- 0.3470841095800587
- 0.3470841095800587
height: 3.0
l:
rotation: 0
division:
- 0.3308121716241943
- 0.3308121716241943
l:
rotation: 0
division:
- 0.7142077220782733
- 0.7142077220782733
l:
rotation: 2
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: ur2
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: n
rotation: 0
r:
type: n
rotation: 0
r:
rotation: 0
division:
- 0.5226049692080454
- 0.5226049692080454
l:
rotation: 0
division:
- 0.3244080692865534
- 0.3244080692865534
l:
type: py
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.5311431206405173
- 0.5311431206405173
l:
type: n
rotation: 0
r:
rotation: 1
division:
- 0.3089291397165622
- 0.3089291397165622
l:
type: em
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.35573412281977423
- 0.35573412281977423
l:
rotation: 0
division:
- 0.2938645997045906
- 0.2938645997045906
l:
rotation: 0
division:
- 0.38461538461538464
- 0.38461538461538464
l:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5229240775023966
- 0.5229240775023966
l:
type: n
rotation: 0
r:
type: em
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 3
division:
- 0.3
- 0.3
l:
type: py
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.7488857483298845
- 0.7488857483298845
l:
rotation: 0
division:
- 0.25
- 0.25
l:
type: lo1
rotation: 0
r:
type: li1
rotation: 0
r:
rotation: 0
division:
- 0.22366883102487625
- 0.22366883102487625
l:
type: en1
rotation: 0
r:
type: C
rotation: 0
above:
rotation: 0
division:
- 0.47357426572751193
- 0.47357426572751193
height: 3.0
l:
rotation: 0
division:
- 0.4441993871185282
- 0.4441993871185282
l:
rotation: 0
division:
- 0.6006620198037802
- 0.6006620198037802
l:
rotation: 0
division:
- 0.8159341477596873
- 0.8159341477596873
l:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4311802854294584
- 0.4311802854294584
l:
rotation: 1
division:
- 0.5187523557449092
- 0.5187523557449092
l:
type: tt
rotation: 0
r:
type: tt
rotation: 0
r:
rotation: 1
division:
- 0.5013640478121326
- 0.5013640478121326
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.5252799507324595
- 0.5252799507324595
l:
type: O
rotation: 1
r:
rotation: 0
division:
- 0.3680417219349658
- 0.3680417219349658
l:
rotation: 1
division:
- 0.5194148364333797
- 0.5194148364333797
l:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.46010581808809997
- 0.46010581808809997
l:
rotation: 0
division:
- 0.1517364388825379
- 0.1517364388825379
l:
type: ur3
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: r
rotation: 0
r:
rotation: 0
division:
- 0.27709722975684414
- 0.27709722975684414
l:
rotation: 0
division:
- 0.34577528339320307
- 0.34577528339320307
l:
type: tt
rotation: 0
r:
rotation: 1
division:
- 0.6621162517562142
- 0.6621162517562142
l:
type: gy1
rotation: 0
r:
type: r
rotation: 3
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.46010581808809997
- 0.46010581808809997
l:
rotation: 0
division:
- 0.4891616829369616
- 0.4891616829369616
l:
rotation: 0
division:
- 0.13294152965495246
- 0.13294152965495246
l:
rotation: 1
division:
- 0.8326531307680889
- 0.8326531307680889
l:
type: r
rotation: 0
r:
rotation: 1
division:
- 0.6320128817423628
- 0.6320128817423628
l:
type: r
rotation: 0
r:
type: C
rotation: 0
r:
rotation: 0
division:
- 0.4581335263739215
- 0.4581335263739215
l:
type: r
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.16973381519774997
- 0.16973381519774997
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.5
- 0.5
l:
rotation: 0
division:
- 0.27709722975684414
- 0.27709722975684414
l:
rotation: 0
division:
- 0.46514955816425135
- 0.46514955816425135
l:
type: C
rotation: 0
r:
type: ut1
rotation: 1
r:
rotation: 3
division:
- 0.6585943771196408
- 0.6585943771196408
l:
rotation: 3
division:
- 0.5386344295901344
- 0.5386344295901344
l:
type: r
rotation: 0
r:
type: tt
rotation: 0
r:
type: C
rotation: 3
r:
rotation: 0
division:
- 0.27709722975684414
- 0.27709722975684414
l:
rotation: 0
division:
- 0.5516021415935491
- 0.5516021415935491
l:
type: q1
rotation: 0
r:
type: r
rotation: 1
r:
type: C
rotation: 0

View file

@ -0,0 +1,537 @@
WARNING: 338 m2 per storey needs ~70 m of daylit wall; the plot's non-private perimeter gives 55 m. Roughly 22 m2 of courtyard closes the gap. (DESIGN.md §38.3)
seed : /home/bruno/src/homemaker-layout/examples/maple-court/init.dom
programme : maple-court
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 2
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/maple-court/coldstart-500000-s2.dom
[ 80 evals] best 4.31031e-40 (fails 120) via construct/0
[ 1360 evals] best 5.82834e-38 (fails 118) via core_undivide noop
[ 1520 evals] best 1.66001e-37 (fails 117) via place_missing n -> rlrl
[ 1840 evals] best 3.62731e-36 (fails 107) via crossover rlll<->llrll
[ 2800 evals] best 3.14742e-35 (fails 104) via swap 0/llrr
[ 3600 evals] best 4.59088e-33 (fails 102) via place_missing tt -> rllr
[ 4160 evals] best 9.2155e-33 (fails 101) via swap 2/llrl
[ 4320 evals] best 9.28173e-33 (fails 101) via crossover lllll<->rlrll
[ 4400 evals] best 2.12991e-31 (fails 97) via level_retype 2/rlrl<->0/lrrll
[ 7440 evals] best 4.82473e-31 (fails 97) via core_divide rrrr (3 floors)
[ 8240 evals] best 8.3715e-31 (fails 95) via place_missing py -> rlrl
[ 10320 evals] best 1.73553e-29 (fails 90) via crossover rllll<->llrlr
[ 15120 evals] best 5.50371e-29 (fails 89) via swap 0/rrl
[ 16560 evals] best 1.36527e-28 (fails 87) via divide 1/rlrr
[ 17360 evals] best 1.3874e-28 (fails 87) via level_retype 0/lrrlr<->2/llrll
[ 18240 evals] best 4.52246e-26 (fails 80) via core_divide lrlr (3 floors)
[ 23200 evals] best 5.93841e-26 (fails 80) via divide 1/lll
[ 23360 evals] best 1.7257e-25 (fails 78) via place_missing py -> lrrr
[ 23760 evals] best 2.23563e-25 (fails 78) via crossover rlrrl<->lllll
[ 24240 evals] best 9.34508e-25 (fails 76) via crossover rlrrl<->rrlrr
[ 25920 evals] best 2.26323e-24 (fails 75) via crossover llllr<->rrrl
[ 27760 evals] best 2.14476e-24 (fails 74) via swap 0/rrll
[ 29520 evals] best 5.22955e-24 (fails 74) via level_fix ut1: lvl0/lrlrr → lvl2/rlll
[ 30320 evals] best 1.66122e-23 (fails 72) via place_missing n -> lrrr
[ 30560 evals] best 1.6949e-23 (fails 72) via rotate 0/rll
[ 31120 evals] best 1.92888e-23 (fails 72) via level_retype 0/lllr<->2/lrrr
[ 31840 evals] best 3.88073e-23 (fails 71) via rotate 2/llrl
[ 33520 evals] best 3.98572e-23 (fails 71) via undivide 0/rlrl
[ 35920 evals] best 7.53511e-23 (fails 70) via swap 0/llll
[ 36560 evals] best 7.94808e-23 (fails 70) via retype 1/rrlr->rc1
[ 37520 evals] best 8.1121e-23 (fails 70) via core_undivide noop
[ 37600 evals] best 1.56464e-22 (fails 69) via crossover rllrl<->rlrrr
[ 38160 evals] best 1.63217e-22 (fails 69) via divide 1/rllr
[ 39040 evals] best 1.64548e-22 (fails 69) via retype 1/rrrl->tt
[ 40400 evals] best 1.65094e-22 (fails 69) via retype 1/rrlr->O
[ 42400 evals] best 1.65488e-22 (fails 69) via level_retype 1/llll<->2/lrlr
[ 42560 evals] best 1.66645e-22 (fails 69) via rotate 0/rlr
[ 46320 evals] best 3.19675e-22 (fails 68) via undivide 2/llrl
[ 48240 evals] best 6.91742e-22 (fails 67) via crossover llll<->llrll
[ 48320 evals] best 6.95777e-22 (fails 67) via core_undivide noop
[ 48480 evals] best 7.14958e-22 (fails 67) via crossover rrlrr<->rlrrr
[ 48800 evals] best 7.16285e-22 (fails 67) via core_undivide noop
[ 50480 evals] best 7.17477e-22 (fails 67) via core_undivide noop
[ 50640 evals] best 1.39355e-21 (fails 66) via level_fix ph1: lvl2/rrlrlr → lvl0/lrr
[ 53200 evals] best 5.77265e-21 (fails 64) via rotate 0/rlr
[ 55600 evals] best 5.79924e-21 (fails 64) via crossover rlrll<->rlrrl
[ 58400 evals] best 5.81883e-21 (fails 64) via retype 1/rlrll->ur1
[ 62400 evals] best 9.76592e-21 (fails 63) via core_undivide noop
[ 63280 evals] best 1.07501e-20 (fails 63) via crossover rlrll<->rllrl
[ 65680 evals] best 1.15706e-20 (fails 63) via swap 0/rllr
[ 66320 evals] best 1.1586e-20 (fails 63) via level_retype 0/llll<->1/lrrl
[ 69680 evals] best 1.20599e-20 (fails 63) via core_undivide noop
[ 70800 evals] best 1.28103e-20 (fails 63) via retype 1/rlrlr->t
[ 71760 evals] best 1.82742e-20 (fails 62) via undivide 2/rllr
[ 73040 evals] best 2.56638e-20 (fails 62) via level_fix ur1: lvl1/rlrll → lvl0/lrr
[ 74000 evals] best 2.63265e-20 (fails 62) via swap 0/rrl
[ 74480 evals] best 6.24895e-20 (fails 61) via divide 2/rlll
[ 78960 evals] best 6.26967e-20 (fails 61) via swap 0/rlrl
[ 80560 evals] best 6.26967e-20 (fails 61) via core_undivide noop
[ 88560 evals] best 2.11893e-19 (fails 59) via crossover r<->r
[ 95840 evals] best 2.13379e-19 (fails 59) via crossover rrllr<->rrllr
[ 97360 evals] best 2.14849e-19 (fails 59) via core_undivide noop
[102080 evals] best 4.89088e-19 (fails 58) via swap 2/rllr
[115920 evals] best 5.35652e-19 (fails 58) via core_undivide noop
[116240 evals] best 5.39906e-19 (fails 58) via core_undivide noop
[117920 evals] best 5.40548e-19 (fails 58) via crossover llrr<->llrll
[125760 evals] best 8.66067e-19 (fails 57) via rotate 0/rlrl
[144640 evals] best 2.83792e-18 (fails 55) via crossover llrr<->lrl
[153040 evals] best 2.85323e-18 (fails 55) via core_undivide noop
[155600 evals] best 2.86486e-18 (fails 55) via core_undivide noop
[157760 evals] best 3.22807e-18 (fails 55) via divide 0/llrlr
[158400 evals] best 5.72902e-18 (fails 54) via undivide 2/rrlrl
[163600 evals] best 7.12352e-18 (fails 54) via swap 2/rllr
[164000 evals] best 7.23944e-18 (fails 54) via rotate 0/rlrr
[165680 evals] best 7.27269e-18 (fails 54) via level_retype 0/lrll<->2/llrl
[167840 evals] best 7.30749e-18 (fails 54) via swap 0/rrr
[168720 evals] best 7.3439e-18 (fails 54) via retype 0/rlrlr->ef1
[188800 evals] best 1.43357e-17 (fails 53) via swap 0/llrl
[193840 evals] best 3.11483e-17 (fails 52) via rotate 0/lr
[194080 evals] best 3.13028e-17 (fails 52) via level_retype 0/lrr<->2/rllrl
[196800 evals] best 3.13837e-17 (fails 52) via core_undivide noop
[207920 evals] best 3.1393e-17 (fails 52) via core_undivide noop
[208160 evals] best 3.17987e-17 (fails 52) via crossover rrll<->rrll
[222320 evals] best 3.72977e-17 (fails 52) via core_divide lrlr (3 floors)
[223920 evals] best 6.33334e-17 (fails 51) via swap 0/llrl
[227280 evals] best 7.07114e-17 (fails 51) via level_fix k1: lvl1/lrlrr → lvl0/lrr
[233200 evals] best 7.61239e-17 (fails 51) via retype 2/rrlrr->O
[239680 evals] best 1.33703e-16 (fails 50) via level_fix rc1: lvl2/lrlrr → lvl0/lrr
[255520 evals] best 1.34474e-16 (fails 50) via level_fix rc1: lvl2/lrlrr → lvl0/lrr
[255920 evals] best 1.34475e-16 (fails 50) via retype 1/lllr->ph1
[267200 evals] best 1.43929e-16 (fails 50) via level_fix k1: lvl1/lrlrr → lvl0/lrr
[280880 evals] best 1.44209e-16 (fails 50) via swap 0/rlrl
[285760 evals] best 1.44897e-16 (fails 50) via crossover rlr<->rlr
[290640 evals] best 1.46495e-16 (fails 50) via rotate 0/rlrr
[294800 evals] best 1.4687e-16 (fails 50) via swap 2/rrlr
[302240 evals] best 1.47593e-16 (fails 50) via core_undivide noop
[303200 evals] best 1.51095e-16 (fails 50) via crossover rrrl<->llrlr
[308400 evals] best 1.51414e-16 (fails 50) via crossover lrll<->rrlrr
[310560 evals] best 1.51745e-16 (fails 50) via retype 1/rrlr->m
[313120 evals] best 1.52084e-16 (fails 50) via retype 1/rrll->ur2
[314960 evals] best 1.52441e-16 (fails 50) via level_retype 1/rrll<->0/rlrrr
[316240 evals] best 1.5514e-16 (fails 50) via core_undivide noop
[316400 evals] best 2.98902e-16 (fails 49) via core_undivide noop
[319440 evals] best 3.04842e-16 (fails 49) via level_retype 0/rrllll<->1/lrrrl
[320800 evals] best 3.06083e-16 (fails 49) via swap 0/rlrl
[323040 evals] best 3.07396e-16 (fails 49) via core_undivide noop
[324320 evals] best 3.17316e-16 (fails 49) via undivide 0/rrrl
[326800 evals] best 3.18549e-16 (fails 49) via crossover rlrll<->lrll
[327600 evals] best 3.19798e-16 (fails 49) via crossover rrllll<->rlllrr
[333040 evals] best 3.22121e-16 (fails 49) via core_undivide noop
[334400 evals] best 3.29134e-16 (fails 49) via crossover rrrr<->lrlrl
[337200 evals] best 3.29777e-16 (fails 49) via level_retype 1/rrrr<->0/rllll
[349760 evals] best 3.30314e-16 (fails 49) via core_undivide noop
[353440 evals] best 3.34503e-16 (fails 49) via undivide 0/rrrl
[353680 evals] best 5.9728e-16 (fails 48) via rotate 0/rrl
[369600 evals] best 5.98058e-16 (fails 48) via core_undivide noop
[371920 evals] best 5.98874e-16 (fails 48) via retype 0/rllr->gh1
[377520 evals] best 5.99301e-16 (fails 48) via core_undivide noop
[381760 evals] best 5.99551e-16 (fails 48) via crossover rllr<->rllr
[390160 evals] best 6.19047e-16 (fails 48) via crossover rlrl<->rlrr
[403440 evals] best 6.54129e-16 (fails 48) via swap 2/rrlr
[408960 evals] best 6.55008e-16 (fails 48) via retype 0/rlrll->n
[413440 evals] best 6.55469e-16 (fails 48) via crossover rrllll<->rrllr
[413680 evals] best 6.55739e-16 (fails 48) via core_undivide noop
[445280 evals] best 6.56519e-16 (fails 48) via core_undivide noop
[446960 evals] best 6.57378e-16 (fails 48) via retype 2/llrl->k1
[447840 evals] best 6.57828e-16 (fails 48) via retype 0/rlrll->ut1
[451040 evals] best 6.58047e-16 (fails 48) via core_undivide noop
[471120 evals] best 6.81318e-16 (fails 48) via rotate 0/rlrl
[471840 evals] best 6.81796e-16 (fails 48) via crossover rrlrl<->rrlrl
[472960 evals] best 6.83308e-16 (fails 48) via swap 0/rlllr
[488880 evals] best 2.62087e-15 (fails 46) via retype 2/rlllrr->C
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 16 shared-leaf copies
[ 200 evals] best 1.97032e-30 (fails 96) via seed
[ 520 evals] best 2.08938e-30 (fails 96) via level_fix lo1: lvl2/rrlrl → lvl1/rlll
[ 2680 evals] best 8.05781e-30 (fails 94) via core_undivide noop
[ 4600 evals] best 1.67532e-29 (fails 93) via undivide 2/rrrlr
[ 5080 evals] best 6.36782e-29 (fails 91) via core_undivide noop
[ 7240 evals] best 6.69626e-29 (fails 91) via rotate 0/rrlr
[ 8040 evals] best 1.28594e-28 (fails 90) via core_undivide noop
[ 8760 evals] best 2.58909e-28 (fails 89) via crossover rrlrll<->rlrrr
[ 9400 evals] best 2.63823e-28 (fails 89) via crossover rlllrrl<->rlllrrl
[ 10520 evals] best 2.68237e-28 (fails 89) via level_retype 0/llrll<->1/rrrl
[ 11240 evals] best 2.70487e-28 (fails 89) via retype 0/rlllrl->ut1
[ 12120 evals] best 2.83799e-28 (fails 89) via level_fix k1: lvl2/llrl → lvl0/lrr
[ 12680 evals] best 2.15148e-27 (fails 86) via divide 2/lllrrr
[ 14600 evals] best 2.15702e-27 (fails 86) via core_undivide noop
[ 15720 evals] best 2.16177e-27 (fails 86) via retype 2/rrlll->gh1
[ 18440 evals] best 2.16617e-27 (fails 86) via level_retype 0/rlrll<->1/rllrl
[ 20680 evals] best 9.04856e-27 (fails 84) via level_retype 2/rrlrl<->1/rlll
[ 21960 evals] best 9.08795e-27 (fails 84) via retype 2/lrll->ef1
[ 23080 evals] best 9.09323e-27 (fails 84) via rotate 0/rlllr
[ 25000 evals] best 9.09677e-27 (fails 84) via retype 1/lrrrl->r
[ 26360 evals] best 9.09918e-27 (fails 84) via crossover rrlrr<->rrlrr
[ 26520 evals] best 1.81375e-26 (fails 83) via rotate 2/rrllr
[ 27240 evals] best 1.81551e-26 (fails 83) via crossover rrlrll<->rrlrr
[ 29000 evals] best 1.81633e-26 (fails 83) via core_undivide noop
[ 31880 evals] best 1.81666e-26 (fails 83) via retype 0/rllr->t
[ 32280 evals] best 3.6551e-26 (fails 82) via swap 2/llrr
[ 32520 evals] best 3.77014e-26 (fails 82) via core_undivide noop
[ 36120 evals] best 3.79918e-26 (fails 82) via level_retype 0/rlllrrrl<->2/llrrll
[ 36600 evals] best 3.80959e-26 (fails 82) via rotate 0/rlllrr
[ 38760 evals] best 3.81721e-26 (fails 82) via core_undivide noop
[ 39400 evals] best 3.82451e-26 (fails 82) via crossover llr<->llr
[ 40200 evals] best 3.83189e-26 (fails 82) via retype 0/rlrrl->tt
[ 40360 evals] best 3.83775e-26 (fails 82) via core_undivide noop
[ 43720 evals] best 7.93753e-26 (fails 81) via swap 2/lllr
[ 44360 evals] best 2.94032e-25 (fails 79) via rotate 0/llr
[ 46040 evals] best 2.94247e-25 (fails 79) via swap 0/rlr
[ 49880 evals] best 2.9432e-25 (fails 79) via retype 0/rlrll->py
[ 51720 evals] best 2.97242e-25 (fails 79) via level_retype 2/rrlll<->0/llrll
[ 53480 evals] best 6.13057e-25 (fails 78) via swap 2/lllr
[ 56120 evals] best 1.17142e-24 (fails 77) via swap 0/rlllr
[ 58360 evals] best 1.17179e-24 (fails 77) via swap 0/rrlrlr
[ 60200 evals] best 1.2077e-24 (fails 77) via divide 2/lllrr
[ 65640 evals] best 1.21155e-24 (fails 77) via rotate 0/rlllr
[ 66760 evals] best 1.21184e-24 (fails 77) via level_retype 2/rrlrl<->0/rlllrl
[ 67560 evals] best 1.2148e-24 (fails 77) via retype 0/rrllll->ws1
[ 68200 evals] best 2.453e-24 (fails 76) via divide 2/lllrl
[ 70040 evals] best 4.72814e-24 (fails 75) via crossover rlrrl<->rlrrr
[ 73480 evals] best 1.84713e-23 (fails 73) via divide 2/rrlrl
[ 74280 evals] best 3.49568e-23 (fails 72) via level_fix t: lvl2/llrrll → lvl0/lrr
[ 74360 evals] best 3.71306e-23 (fails 72) via level_retype 1/rrll<->0/rlrrr
[ 74440 evals] best 3.73449e-23 (fails 72) via core_undivide noop
[ 76200 evals] best 7.31239e-23 (fails 71) via swap 0/rlrl
[ 76600 evals] best 7.47722e-23 (fails 71) via rotate 0/rrll
[ 82520 evals] best 7.51045e-23 (fails 71) via divide 2/lrrr
[ 83400 evals] best 7.52013e-23 (fails 71) via level_retype 2/rlrr<->0/lrlrr
[ 83800 evals] best 7.55416e-23 (fails 71) via retype 2/llrrlr->la1
[ 85960 evals] best 7.58616e-23 (fails 71) via core_undivide noop
[ 86280 evals] best 2.33507e-21 (fails 66) via crossover llrlrl<->rlrrr
[ 88920 evals] best 2.34342e-21 (fails 66) via swap 0/rrlrlr
[ 91240 evals] best 2.3512e-21 (fails 66) via level_retype 1/llrl<->0/rlrlr
[ 93560 evals] best 4.27125e-21 (fails 65) via rotate 0/llrlr
[ 95240 evals] best 4.2813e-21 (fails 65) via retype 1/llrl->q1
[ 96840 evals] best 4.29019e-21 (fails 65) via crossover rrlrll<->rrllr
[ 97000 evals] best 8.2752e-21 (fails 64) via core_undivide noop
[103560 evals] best 1.69921e-20 (fails 63) via level_retype 2/rrlll<->1/rlll
[103640 evals] best 1.70564e-20 (fails 63) via core_undivide noop
[104440 evals] best 1.70857e-20 (fails 63) via retype 2/llrrll->k1
[106840 evals] best 3.11621e-20 (fails 62) via level_fix k1: lvl1/rrrl → lvl0/lrr
[107640 evals] best 3.12166e-20 (fails 62) via core_undivide noop
[111400 evals] best 6.83341e-20 (fails 61) via undivide 2/lrrlrr
[113960 evals] best 6.85765e-20 (fails 61) via crossover rrlrll<->rrlrll
[118360 evals] best 6.88217e-20 (fails 61) via crossover lr<->lr
[122120 evals] best 6.94995e-20 (fails 61) via retype 1/rrll->rc1
[122440 evals] best 6.96038e-20 (fails 61) via core_undivide noop
[127640 evals] best 1.37224e-19 (fails 60) via rotate 2/rrlrl
[128040 evals] best 1.37417e-19 (fails 60) via core_undivide noop
[128200 evals] best 1.37589e-19 (fails 60) via crossover rrlrlrr<->rrlrlrl
[128520 evals] best 1.37737e-19 (fails 60) via retype 0/rlllrrl->me1
[129240 evals] best 1.37857e-19 (fails 60) via core_undivide noop
[133320 evals] best 1.39644e-19 (fails 60) via retype 2/llrrll->en1
[139320 evals] best 2.68968e-19 (fails 59) via swap 0/llrlr
[140040 evals] best 2.69157e-19 (fails 59) via retype 0/rrlrr->n
[141080 evals] best 2.69496e-19 (fails 59) via retype 2/lllrll->em
[145240 evals] best 2.70023e-19 (fails 59) via retype 2/lllrrl->ph1
[145800 evals] best 2.7045e-19 (fails 59) via crossover rlllrrrr<->rlllrrrr
[146600 evals] best 5.91845e-19 (fails 58) via swap 0/lll
[146840 evals] best 5.92808e-19 (fails 58) via core_undivide noop
[148360 evals] best 5.93267e-19 (fails 58) via crossover rlllrrl<->rrlrlrr
[149320 evals] best 5.93688e-19 (fails 58) via core_undivide noop
[153160 evals] best 5.94023e-19 (fails 58) via crossover rrlrll<->rrlrlrl
[156440 evals] best 6.27259e-19 (fails 58) via crossover rllll<->lrlr
[159720 evals] best 6.27401e-19 (fails 58) via level_retype 0/lrll<->2/lrrll
[162840 evals] best 6.27428e-19 (fails 58) via core_undivide noop
[168760 evals] best 6.27429e-19 (fails 58) via level_retype 0/llrlrr<->2/llrrr
[169080 evals] best 6.27429e-19 (fails 58) via retype 0/rlrlr->me1
[170040 evals] best 6.2743e-19 (fails 58) via core_undivide noop
[170200 evals] best 6.2743e-19 (fails 58) via retype 2/rllrl->la1
[170840 evals] best 6.2743e-19 (fails 58) via level_retype 2/rrlrll<->0/rlrrl
[185960 evals] best 6.30704e-19 (fails 58) via undivide 2/rrllr
[186280 evals] best 6.31736e-19 (fails 58) via core_undivide noop
[188760 evals] best 6.32694e-19 (fails 58) via retype 0/rlrlr->ef1
[189160 evals] best 6.33027e-19 (fails 58) via swap 2/llrrl
[192040 evals] best 2.52641e-18 (fails 56) via rotate 0/rrlll
[199000 evals] best 2.53262e-18 (fails 56) via core_undivide noop
[203400 evals] best 2.5385e-18 (fails 56) via core_undivide noop
[204840 evals] best 2.54413e-18 (fails 56) via retype 0/lrr->tt
[205320 evals] best 2.54413e-18 (fails 56) via core_undivide noop
[205640 evals] best 2.54413e-18 (fails 56) via level_retype 2/llrrlr<->1/rlll
[209560 evals] best 2.54413e-18 (fails 56) via level_retype 2/rrlrll<->1/rlrll
[210680 evals] best 2.54413e-18 (fails 56) via core_undivide noop
[211400 evals] best 2.54413e-18 (fails 56) via core_undivide noop
[215560 evals] best 2.54413e-18 (fails 56) via core_undivide noop
[224360 evals] best 2.54414e-18 (fails 56) via core_undivide noop
[226840 evals] best 2.59039e-18 (fails 56) via divide 2/rrllr
[227400 evals] best 2.59059e-18 (fails 56) via swap 2/llrrl
[232680 evals] best 2.59124e-18 (fails 56) via core_undivide noop
[234120 evals] best 2.59193e-18 (fails 56) via rotate 0/rlllr
[235320 evals] best 1.79054e-17 (fails 53) via level_compound_fix r: lvl1 → lvl2/rllll
[235800 evals] best 1.79122e-17 (fails 53) via swap 2/lllr
[239880 evals] best 1.7918e-17 (fails 53) via swap 0/rlrr
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 181 → 55 fails (applied)
--- done ---
elapsed : 197085.4s
evals : 750040 across 9374 topologies
best : 4.66229e-18 (55 fails) via swap 0/rlrr+collapse
improvement history:
[ 80] 4.31031e-40 (share:construct/0)
[ 1360] 5.82834e-38 (share:core_undivide noop)
[ 1520] 1.66001e-37 (share:place_missing n -> rlrl)
[ 1840] 3.62731e-36 (share:crossover rlll<->llrll)
[ 2800] 3.14742e-35 (share:swap 0/llrr)
[ 3600] 4.59088e-33 (share:place_missing tt -> rllr)
[ 4160] 9.2155e-33 (share:swap 2/llrl)
[ 4320] 9.28173e-33 (share:crossover lllll<->rlrll)
[ 4400] 2.12991e-31 (share:level_retype 2/rlrl<->0/lrrll)
[ 7440] 4.82473e-31 (share:core_divide rrrr (3 floors))
[ 8240] 8.3715e-31 (share:place_missing py -> rlrl)
[ 10320] 1.73553e-29 (share:crossover rllll<->llrlr)
[ 15120] 5.50371e-29 (share:swap 0/rrl)
[ 16560] 1.36527e-28 (share:divide 1/rlrr)
[ 17360] 1.3874e-28 (share:level_retype 0/lrrlr<->2/llrll)
[ 18240] 4.52246e-26 (share:core_divide lrlr (3 floors))
[ 23200] 5.93841e-26 (share:divide 1/lll)
[ 23360] 1.7257e-25 (share:place_missing py -> lrrr)
[ 23760] 2.23563e-25 (share:crossover rlrrl<->lllll)
[ 24240] 9.34508e-25 (share:crossover rlrrl<->rrlrr)
[ 25920] 2.26323e-24 (share:crossover llllr<->rrrl)
[ 27760] 2.14476e-24 (share:swap 0/rrll)
[ 29520] 5.22955e-24 (share:level_fix ut1: lvl0/lrlrr → lvl2/rlll)
[ 30320] 1.66122e-23 (share:place_missing n -> lrrr)
[ 30560] 1.6949e-23 (share:rotate 0/rll)
[ 31120] 1.92888e-23 (share:level_retype 0/lllr<->2/lrrr)
[ 31840] 3.88073e-23 (share:rotate 2/llrl)
[ 33520] 3.98572e-23 (share:undivide 0/rlrl)
[ 35920] 7.53511e-23 (share:swap 0/llll)
[ 36560] 7.94808e-23 (share:retype 1/rrlr->rc1)
[ 37520] 8.1121e-23 (share:core_undivide noop)
[ 37600] 1.56464e-22 (share:crossover rllrl<->rlrrr)
[ 38160] 1.63217e-22 (share:divide 1/rllr)
[ 39040] 1.64548e-22 (share:retype 1/rrrl->tt)
[ 40400] 1.65094e-22 (share:retype 1/rrlr->O)
[ 42400] 1.65488e-22 (share:level_retype 1/llll<->2/lrlr)
[ 42560] 1.66645e-22 (share:rotate 0/rlr)
[ 46320] 3.19675e-22 (share:undivide 2/llrl)
[ 48240] 6.91742e-22 (share:crossover llll<->llrll)
[ 48320] 6.95777e-22 (share:core_undivide noop)
[ 48480] 7.14958e-22 (share:crossover rrlrr<->rlrrr)
[ 48800] 7.16285e-22 (share:core_undivide noop)
[ 50480] 7.17477e-22 (share:core_undivide noop)
[ 50640] 1.39355e-21 (share:level_fix ph1: lvl2/rrlrlr → lvl0/lrr)
[ 53200] 5.77265e-21 (share:rotate 0/rlr)
[ 55600] 5.79924e-21 (share:crossover rlrll<->rlrrl)
[ 58400] 5.81883e-21 (share:retype 1/rlrll->ur1)
[ 62400] 9.76592e-21 (share:core_undivide noop)
[ 63280] 1.07501e-20 (share:crossover rlrll<->rllrl)
[ 65680] 1.15706e-20 (share:swap 0/rllr)
[ 66320] 1.1586e-20 (share:level_retype 0/llll<->1/lrrl)
[ 69680] 1.20599e-20 (share:core_undivide noop)
[ 70800] 1.28103e-20 (share:retype 1/rlrlr->t)
[ 71760] 1.82742e-20 (share:undivide 2/rllr)
[ 73040] 2.56638e-20 (share:level_fix ur1: lvl1/rlrll → lvl0/lrr)
[ 74000] 2.63265e-20 (share:swap 0/rrl)
[ 74480] 6.24895e-20 (share:divide 2/rlll)
[ 78960] 6.26967e-20 (share:swap 0/rlrl)
[ 80560] 6.26967e-20 (share:core_undivide noop)
[ 88560] 2.11893e-19 (share:crossover r<->r)
[ 95840] 2.13379e-19 (share:crossover rrllr<->rrllr)
[ 97360] 2.14849e-19 (share:core_undivide noop)
[102080] 4.89088e-19 (share:swap 2/rllr)
[115920] 5.35652e-19 (share:core_undivide noop)
[116240] 5.39906e-19 (share:core_undivide noop)
[117920] 5.40548e-19 (share:crossover llrr<->llrll)
[125760] 8.66067e-19 (share:rotate 0/rlrl)
[144640] 2.83792e-18 (share:crossover llrr<->lrl)
[153040] 2.85323e-18 (share:core_undivide noop)
[155600] 2.86486e-18 (share:core_undivide noop)
[157760] 3.22807e-18 (share:divide 0/llrlr)
[158400] 5.72902e-18 (share:undivide 2/rrlrl)
[163600] 7.12352e-18 (share:swap 2/rllr)
[164000] 7.23944e-18 (share:rotate 0/rlrr)
[165680] 7.27269e-18 (share:level_retype 0/lrll<->2/llrl)
[167840] 7.30749e-18 (share:swap 0/rrr)
[168720] 7.3439e-18 (share:retype 0/rlrlr->ef1)
[188800] 1.43357e-17 (share:swap 0/llrl)
[193840] 3.11483e-17 (share:rotate 0/lr)
[194080] 3.13028e-17 (share:level_retype 0/lrr<->2/rllrl)
[196800] 3.13837e-17 (share:core_undivide noop)
[207920] 3.1393e-17 (share:core_undivide noop)
[208160] 3.17987e-17 (share:crossover rrll<->rrll)
[222320] 3.72977e-17 (share:core_divide lrlr (3 floors))
[223920] 6.33334e-17 (share:swap 0/llrl)
[227280] 7.07114e-17 (share:level_fix k1: lvl1/lrlrr → lvl0/lrr)
[233200] 7.61239e-17 (share:retype 2/rrlrr->O)
[239680] 1.33703e-16 (share:level_fix rc1: lvl2/lrlrr → lvl0/lrr)
[255520] 1.34474e-16 (share:level_fix rc1: lvl2/lrlrr → lvl0/lrr)
[255920] 1.34475e-16 (share:retype 1/lllr->ph1)
[267200] 1.43929e-16 (share:level_fix k1: lvl1/lrlrr → lvl0/lrr)
[280880] 1.44209e-16 (share:swap 0/rlrl)
[285760] 1.44897e-16 (share:crossover rlr<->rlr)
[290640] 1.46495e-16 (share:rotate 0/rlrr)
[294800] 1.4687e-16 (share:swap 2/rrlr)
[302240] 1.47593e-16 (share:core_undivide noop)
[303200] 1.51095e-16 (share:crossover rrrl<->llrlr)
[308400] 1.51414e-16 (share:crossover lrll<->rrlrr)
[310560] 1.51745e-16 (share:retype 1/rrlr->m)
[313120] 1.52084e-16 (share:retype 1/rrll->ur2)
[314960] 1.52441e-16 (share:level_retype 1/rrll<->0/rlrrr)
[316240] 1.5514e-16 (share:core_undivide noop)
[316400] 2.98902e-16 (share:core_undivide noop)
[319440] 3.04842e-16 (share:level_retype 0/rrllll<->1/lrrrl)
[320800] 3.06083e-16 (share:swap 0/rlrl)
[323040] 3.07396e-16 (share:core_undivide noop)
[324320] 3.17316e-16 (share:undivide 0/rrrl)
[326800] 3.18549e-16 (share:crossover rlrll<->lrll)
[327600] 3.19798e-16 (share:crossover rrllll<->rlllrr)
[333040] 3.22121e-16 (share:core_undivide noop)
[334400] 3.29134e-16 (share:crossover rrrr<->lrlrl)
[337200] 3.29777e-16 (share:level_retype 1/rrrr<->0/rllll)
[349760] 3.30314e-16 (share:core_undivide noop)
[353440] 3.34503e-16 (share:undivide 0/rrrl)
[353680] 5.9728e-16 (share:rotate 0/rrl)
[369600] 5.98058e-16 (share:core_undivide noop)
[371920] 5.98874e-16 (share:retype 0/rllr->gh1)
[377520] 5.99301e-16 (share:core_undivide noop)
[381760] 5.99551e-16 (share:crossover rllr<->rllr)
[390160] 6.19047e-16 (share:crossover rlrl<->rlrr)
[403440] 6.54129e-16 (share:swap 2/rrlr)
[408960] 6.55008e-16 (share:retype 0/rlrll->n)
[413440] 6.55469e-16 (share:crossover rrllll<->rrllr)
[413680] 6.55739e-16 (share:core_undivide noop)
[445280] 6.56519e-16 (share:core_undivide noop)
[446960] 6.57378e-16 (share:retype 2/llrl->k1)
[447840] 6.57828e-16 (share:retype 0/rlrll->ut1)
[451040] 6.58047e-16 (share:core_undivide noop)
[471120] 6.81318e-16 (share:rotate 0/rlrl)
[471840] 6.81796e-16 (share:crossover rrlrl<->rrlrl)
[472960] 6.83308e-16 (share:swap 0/rlllr)
[488880] 2.62087e-15 (share:retype 2/rlllrr->C)
[500200] 1.97032e-30 (polish:seed)
[500520] 2.08938e-30 (polish:level_fix lo1: lvl2/rrlrl → lvl1/rlll)
[502680] 8.05781e-30 (polish:core_undivide noop)
[504600] 1.67532e-29 (polish:undivide 2/rrrlr)
[505080] 6.36782e-29 (polish:core_undivide noop)
[507240] 6.69626e-29 (polish:rotate 0/rrlr)
[508040] 1.28594e-28 (polish:core_undivide noop)
[508760] 2.58909e-28 (polish:crossover rrlrll<->rlrrr)
[509400] 2.63823e-28 (polish:crossover rlllrrl<->rlllrrl)
[510520] 2.68237e-28 (polish:level_retype 0/llrll<->1/rrrl)
[511240] 2.70487e-28 (polish:retype 0/rlllrl->ut1)
[512120] 2.83799e-28 (polish:level_fix k1: lvl2/llrl → lvl0/lrr)
[512680] 2.15148e-27 (polish:divide 2/lllrrr)
[514600] 2.15702e-27 (polish:core_undivide noop)
[515720] 2.16177e-27 (polish:retype 2/rrlll->gh1)
[518440] 2.16617e-27 (polish:level_retype 0/rlrll<->1/rllrl)
[520680] 9.04856e-27 (polish:level_retype 2/rrlrl<->1/rlll)
[521960] 9.08795e-27 (polish:retype 2/lrll->ef1)
[523080] 9.09323e-27 (polish:rotate 0/rlllr)
[525000] 9.09677e-27 (polish:retype 1/lrrrl->r)
[526360] 9.09918e-27 (polish:crossover rrlrr<->rrlrr)
[526520] 1.81375e-26 (polish:rotate 2/rrllr)
[527240] 1.81551e-26 (polish:crossover rrlrll<->rrlrr)
[529000] 1.81633e-26 (polish:core_undivide noop)
[531880] 1.81666e-26 (polish:retype 0/rllr->t)
[532280] 3.6551e-26 (polish:swap 2/llrr)
[532520] 3.77014e-26 (polish:core_undivide noop)
[536120] 3.79918e-26 (polish:level_retype 0/rlllrrrl<->2/llrrll)
[536600] 3.80959e-26 (polish:rotate 0/rlllrr)
[538760] 3.81721e-26 (polish:core_undivide noop)
[539400] 3.82451e-26 (polish:crossover llr<->llr)
[540200] 3.83189e-26 (polish:retype 0/rlrrl->tt)
[540360] 3.83775e-26 (polish:core_undivide noop)
[543720] 7.93753e-26 (polish:swap 2/lllr)
[544360] 2.94032e-25 (polish:rotate 0/llr)
[546040] 2.94247e-25 (polish:swap 0/rlr)
[549880] 2.9432e-25 (polish:retype 0/rlrll->py)
[551720] 2.97242e-25 (polish:level_retype 2/rrlll<->0/llrll)
[553480] 6.13057e-25 (polish:swap 2/lllr)
[556120] 1.17142e-24 (polish:swap 0/rlllr)
[558360] 1.17179e-24 (polish:swap 0/rrlrlr)
[560200] 1.2077e-24 (polish:divide 2/lllrr)
[565640] 1.21155e-24 (polish:rotate 0/rlllr)
[566760] 1.21184e-24 (polish:level_retype 2/rrlrl<->0/rlllrl)
[567560] 1.2148e-24 (polish:retype 0/rrllll->ws1)
[568200] 2.453e-24 (polish:divide 2/lllrl)
[570040] 4.72814e-24 (polish:crossover rlrrl<->rlrrr)
[573480] 1.84713e-23 (polish:divide 2/rrlrl)
[574280] 3.49568e-23 (polish:level_fix t: lvl2/llrrll → lvl0/lrr)
[574360] 3.71306e-23 (polish:level_retype 1/rrll<->0/rlrrr)
[574440] 3.73449e-23 (polish:core_undivide noop)
[576200] 7.31239e-23 (polish:swap 0/rlrl)
[576600] 7.47722e-23 (polish:rotate 0/rrll)
[582520] 7.51045e-23 (polish:divide 2/lrrr)
[583400] 7.52013e-23 (polish:level_retype 2/rlrr<->0/lrlrr)
[583800] 7.55416e-23 (polish:retype 2/llrrlr->la1)
[585960] 7.58616e-23 (polish:core_undivide noop)
[586280] 2.33507e-21 (polish:crossover llrlrl<->rlrrr)
[588920] 2.34342e-21 (polish:swap 0/rrlrlr)
[591240] 2.3512e-21 (polish:level_retype 1/llrl<->0/rlrlr)
[593560] 4.27125e-21 (polish:rotate 0/llrlr)
[595240] 4.2813e-21 (polish:retype 1/llrl->q1)
[596840] 4.29019e-21 (polish:crossover rrlrll<->rrllr)
[597000] 8.2752e-21 (polish:core_undivide noop)
[603560] 1.69921e-20 (polish:level_retype 2/rrlll<->1/rlll)
[603640] 1.70564e-20 (polish:core_undivide noop)
[604440] 1.70857e-20 (polish:retype 2/llrrll->k1)
[606840] 3.11621e-20 (polish:level_fix k1: lvl1/rrrl → lvl0/lrr)
[607640] 3.12166e-20 (polish:core_undivide noop)
[611400] 6.83341e-20 (polish:undivide 2/lrrlrr)
[613960] 6.85765e-20 (polish:crossover rrlrll<->rrlrll)
[618360] 6.88217e-20 (polish:crossover lr<->lr)
[622120] 6.94995e-20 (polish:retype 1/rrll->rc1)
[622440] 6.96038e-20 (polish:core_undivide noop)
[627640] 1.37224e-19 (polish:rotate 2/rrlrl)
[628040] 1.37417e-19 (polish:core_undivide noop)
[628200] 1.37589e-19 (polish:crossover rrlrlrr<->rrlrlrl)
[628520] 1.37737e-19 (polish:retype 0/rlllrrl->me1)
[629240] 1.37857e-19 (polish:core_undivide noop)
[633320] 1.39644e-19 (polish:retype 2/llrrll->en1)
[639320] 2.68968e-19 (polish:swap 0/llrlr)
[640040] 2.69157e-19 (polish:retype 0/rrlrr->n)
[641080] 2.69496e-19 (polish:retype 2/lllrll->em)
[645240] 2.70023e-19 (polish:retype 2/lllrrl->ph1)
[645800] 2.7045e-19 (polish:crossover rlllrrrr<->rlllrrrr)
[646600] 5.91845e-19 (polish:swap 0/lll)
[646840] 5.92808e-19 (polish:core_undivide noop)
[648360] 5.93267e-19 (polish:crossover rlllrrl<->rrlrlrr)
[649320] 5.93688e-19 (polish:core_undivide noop)
[653160] 5.94023e-19 (polish:crossover rrlrll<->rrlrlrl)
[656440] 6.27259e-19 (polish:crossover rllll<->lrlr)
[659720] 6.27401e-19 (polish:level_retype 0/lrll<->2/lrrll)
[662840] 6.27428e-19 (polish:core_undivide noop)
[668760] 6.27429e-19 (polish:level_retype 0/llrlrr<->2/llrrr)
[669080] 6.27429e-19 (polish:retype 0/rlrlr->me1)
[670040] 6.2743e-19 (polish:core_undivide noop)
[670200] 6.2743e-19 (polish:retype 2/rllrl->la1)
[670840] 6.2743e-19 (polish:level_retype 2/rrlrll<->0/rlrrl)
[685960] 6.30704e-19 (polish:undivide 2/rrllr)
[686280] 6.31736e-19 (polish:core_undivide noop)
[688760] 6.32694e-19 (polish:retype 0/rlrlr->ef1)
[689160] 6.33027e-19 (polish:swap 2/llrrl)
[692040] 2.52641e-18 (polish:rotate 0/rrlll)
[699000] 2.53262e-18 (polish:core_undivide noop)
[703400] 2.5385e-18 (polish:core_undivide noop)
[704840] 2.54413e-18 (polish:retype 0/lrr->tt)
[705320] 2.54413e-18 (polish:core_undivide noop)
[705640] 2.54413e-18 (polish:level_retype 2/llrrlr<->1/rlll)
[709560] 2.54413e-18 (polish:level_retype 2/rrlrll<->1/rlrll)
[710680] 2.54413e-18 (polish:core_undivide noop)
[711400] 2.54413e-18 (polish:core_undivide noop)
[715560] 2.54413e-18 (polish:core_undivide noop)
[724360] 2.54414e-18 (polish:core_undivide noop)
[726840] 2.59039e-18 (polish:divide 2/rrllr)
[727400] 2.59059e-18 (polish:swap 2/llrrl)
[732680] 2.59124e-18 (polish:core_undivide noop)
[734120] 2.59193e-18 (polish:rotate 0/rlllr)
[735320] 1.79054e-17 (polish:level_compound_fix r: lvl1 → lvl2/rllll)
[735800] 1.79122e-17 (polish:swap 2/lllr)
[739880] 1.7918e-17 (polish:swap 0/rlrr)
written : /home/bruno/src/homemaker-layout/examples/maple-court/coldstart-500000-s2.dom

View file

@ -15,6 +15,7 @@
spaces:
# ---- GROUND FLOOR (level 0): community + service ----
lr1:
usage: living
name: Common Living Room
size:
- 80.0
@ -31,6 +32,7 @@ spaces:
- o
ef1:
usage: none
name: Entrance Foyer
size:
- 15.0
@ -43,6 +45,7 @@ spaces:
- c
da1:
usage: living
name: Dining Area
size:
- 60.0
@ -60,6 +63,7 @@ spaces:
- o
k1:
usage: kitchen
name: Kitchen
size:
- 30.0
@ -73,6 +77,7 @@ spaces:
- c
ws1:
usage: living
name: Workshop Space
size:
- 40.0
@ -89,6 +94,7 @@ spaces:
- o
la1:
usage: utility
name: Laundry Room
size:
- 20.0
@ -101,6 +107,8 @@ spaces:
- c
me1:
crinkliness: none # no window needed
usage: utility
name: Mechanical/Electrical Room
size:
- 25.0
@ -113,6 +121,8 @@ spaces:
- c
ur1:
crinkliness: none # no window needed
usage: utility
name: Ground Floor Storage
size:
- 22.0
@ -125,6 +135,7 @@ spaces:
- c
rc1:
usage: none
name: Reception Office
size:
- 14.0
@ -137,6 +148,7 @@ spaces:
- c
ph1:
usage: bedroom
name: Clinic Room
size:
- 18.0
@ -149,6 +161,7 @@ spaces:
- c
gh1:
usage: living
name: Greenhouse
size:
- 24.0
@ -163,6 +176,7 @@ spaces:
# Meeting rooms - anonymous interchangeable (3 total, ground floor)
m:
usage: living
name: Meeting Room
size:
- 10.0
@ -177,6 +191,7 @@ spaces:
# Ground-floor bathrooms (6 total)
t:
usage: toilet
name: Bathroom
size:
- 6.0
@ -191,6 +206,7 @@ spaces:
# ---- FIRST FLOOR (level 1): residents' shared + neighborhoods ----
li1:
usage: living
name: Library Corner
size:
- 20.0
@ -203,6 +219,7 @@ spaces:
- c
lo1:
usage: living
name: Lounge
size:
- 30.0
@ -220,6 +237,7 @@ spaces:
# Staff offices - anonymous (2 total)
em:
usage: bedroom
name: Staff Office
size:
- 12.5
@ -234,6 +252,7 @@ spaces:
# Sleeping neighborhoods - anonymous interchangeable (4 total)
n:
usage: bedroom
name: Neighborhood
size:
- 60.0
@ -250,6 +269,8 @@ spaces:
count: 4
ur2:
crinkliness: none # no window needed
usage: utility
name: First Floor Storage
size:
- 18.0
@ -262,6 +283,7 @@ spaces:
- c
en1:
usage: living
name: TV / Media Room
size:
- 22.0
@ -275,6 +297,7 @@ spaces:
# Therapy rooms - anonymous (2 total)
py:
usage: bedroom
name: Therapy Room
size:
- 16.0
@ -290,6 +313,7 @@ spaces:
# ---- SECOND FLOOR (level 2): individual rooms + amenity ----
# Individual resident rooms - anonymous (12 total)
r:
usage: bedroom
name: Individual Room
size:
- 10.0
@ -303,6 +327,7 @@ spaces:
count: 12
gy1:
usage: living
name: Exercise Room
size:
- 28.0
@ -319,6 +344,8 @@ spaces:
- o
ut1:
crinkliness: none # no window needed
usage: utility
name: Utilities Closet
size:
- 14.0
@ -331,6 +358,8 @@ spaces:
- c
ur3:
crinkliness: none # no window needed
usage: utility
name: Second Floor Storage
size:
- 16.0
@ -344,6 +373,7 @@ spaces:
# Second-floor bathrooms (4 total)
tt:
usage: toilet
name: Upper Bathroom
size:
- 6.0
@ -354,9 +384,11 @@ spaces:
level: 2
adjacency:
- c
- r # Brand: a WC beside sleeping space can be knocked through later
count: 4
q1:
usage: bedroom
name: Quiet Room
size:
- 12.0
@ -371,17 +403,28 @@ spaces:
# Building constraints
storey_minimum: 3
storey_limit: 4
force_roof_garden: 0
# homemaker-py-hxi (DESIGN.md §39.25): ENABLED. Fails a level that has no
# outdoor space at all -- Alexander's actual requirement, per level and with no
# quantity attached. It had been off in every corpus config, so the only thing
# expressing outdoor space was ratio_outside's arbitrary fraction.
force_roof_garden: 1
# Circulation ratio (allow more circulation for larger building)
# homemaker-py-hxi (DESIGN.md §39.24): disabled. The score is value/cost, a
# ratio, so the per-m2 economics (circulation worth 50 against a build cost of
# 200) is ALREADY a proportional pressure against circulation -- this said the
# same thing a second time, and with a curve where twice the corridor is far
# more than twice as bad. Its other side, "a building needs some circulation",
# was worth at most 13% here and is enforced structurally anyway by the access
# and connectivity checks. Set a [target, sigma] pair to re-enable.
ratio_circulation:
- 0.08
- 0.15
# Outside space ratio (courtyard requirement)
# homemaker-py-hxi (DESIGN.md §39.25): disabled. Alexander says every level
# should have accessible outside space; he does not say how much. The
# qualitative requirement is force_roof_garden below. Set a [target, sigma]
# pair to re-enable this quantitative one.
ratio_outside:
- 0.15
- 0.10
# Staircase requirements (main + secondary)
staircase_min: 2
@ -391,4 +434,9 @@ staircase_max: 2
value_inside: 300.0
value_circulation: 50.0
value_outside: 100.0
value_supported: 300.0
# homemaker-py-ecx (DESIGN.md §39.19): an upper-level terrace is worth what
# outdoor space is worth (value_outside); it is the COST that differs by level
# (outside 10.0 vs outside_supported 110.0), not the value. At 300.0 -- the
# `value_inside` rate -- a terrace was worth more per square metre than a real
# internal room, which the owner ruled out.
value_supported: 100.0

View file

@ -0,0 +1,96 @@
node:
- - 1.67100188077385
- 11.9169190395339
- - 8.72124918939699
- 13.7119442286569
- - 6.79637028658874
- 21.3797854212389
- - -0.42152047183069
- 19.9368564494913
perimeter:
a: private
b: null
c: null
d: null
rotation: 3
division:
- 0.4404714364553455
- 0.4404714364553455
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.7110151156970064
- 0.7110151156970064
l:
type: b2
rotation: 0
r:
rotation: 1
division:
- 0.6031384135803968
- 0.6031384135803968
l:
type: C
rotation: 0
r:
type: t3
rotation: 0
r:
rotation: 1
division:
- 0.6798158021111778
- 0.6798158021111778
l:
type: l1
rotation: 0
r:
rotation: 1
division:
- 0.5251755040884536
- 0.5251755040884536
l:
type: t2
rotation: 0
r:
type: C
rotation: 0
above:
rotation: 0
division:
- 0.61355312064873
- 0.61355312064873
height: 3.0
l:
rotation: 0
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.8
- 0.8
l:
type: b1
rotation: 0
r:
rotation: 2
division:
- 0.5
- 0.5
l:
type: t1
rotation: 0
r:
type: C
rotation: 0

View file

@ -0,0 +1,134 @@
seed : /home/bruno/src/homemaker-layout/examples/programme-house/init.dom
programme : programme-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 0
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s0.dom
[ 80 evals] best 9.96032e-11 (fails 17) via construct/0
[ 160 evals] best 5.18243e-09 (fails 16) via construct/1
[ 320 evals] best 9.65534e-06 (fails 7) via construct/3
[ 1920 evals] best 1.96478e-05 (fails 7) via place_missing noop
[ 2480 evals] best 1.9751e-05 (fails 7) via place_missing noop
[ 3360 evals] best 1.99208e-05 (fails 7) via core_undivide noop
[ 3600 evals] best 7.04674e-05 (fails 5) via undivide 0/rl
[ 5200 evals] best 0.000116027 (fails 5) via undivide 0/rr
[ 6480 evals] best 0.000116602 (fails 5) via place_missing noop
[ 6720 evals] best 1.52309e-05 (fails 4) via level_fix l1: lvl1/lr → lvl0/ll
[ 7440 evals] best 1.67782e-05 (fails 4) via place_missing noop
[ 9520 evals] best 1.80279e-05 (fails 4) via retype 1/rr->b2
[ 13600 evals] best 4.43351e-05 (fails 2) via undivide 0/rl
[ 13680 evals] best 4.4362e-05 (fails 2) via level_fix noop
[ 15280 evals] best 4.43676e-05 (fails 2) via level_fix noop
[ 17840 evals] best 4.43679e-05 (fails 2) via crossover rl<->ll
[ 17920 evals] best 4.67272e-05 (fails 2) via level_add (3 storeys)
[ 20000 evals] best 4.93528e-05 (fails 2) via retype 0/ll->t2
[ 21360 evals] best 5.11016e-05 (fails 2) via crossover rl<->ll
[ 21600 evals] best 5.12228e-05 (fails 2) via core_undivide noop
[ 23040 evals] best 5.13069e-05 (fails 2) via crossover lr<->lr
[ 24320 evals] best 5.13735e-05 (fails 2) via core_undivide noop
[ 25280 evals] best 0.000434895 (fails 2) via retype 2/ll->O
[ 25920 evals] best 0.000435111 (fails 2) via core_undivide noop
[ 26480 evals] best 0.000435218 (fails 2) via level_fix noop
[ 34240 evals] best 0.000435236 (fails 2) via crossover root<->root
[ 34480 evals] best 0.000435344 (fails 2) via level_compound_fix noop
[ 35600 evals] best 0.000435397 (fails 2) via crossover rr<->rr
[ 65840 evals] best 0.000460088 (fails 2) via level_fix noop
[ 66400 evals] best 0.000462499 (fails 2) via core_undivide noop
[ 67200 evals] best 0.000462633 (fails 2) via level_fix noop
[ 70160 evals] best 0.00195825 (fails 2) via retype 1/ll->O
[ 70400 evals] best 6.42152e-05 (fails 1) via level_delete (2 storeys)
[ 77040 evals] best 6.45477e-05 (fails 1) via level_delete (2 storeys)
[ 80960 evals] best 6.45918e-05 (fails 1) via level_retype 1/rl<->0/rrl
[ 86320 evals] best 6.45969e-05 (fails 1) via crossover rrl<->rrl
[105200 evals] best 6.4915e-05 (fails 1) via level_delete (2 storeys)
[106400 evals] best 6.49234e-05 (fails 1) via crossover lrl<->rrr
[107200 evals] best 6.49603e-05 (fails 1) via level_delete (2 storeys)
[154720 evals] best 0.0022262 (fails 1) via retype 1/ll->O
[160240 evals] best 0.00223095 (fails 1) via crossover r<->r
[167520 evals] best 0.00223373 (fails 1) via crossover lrr<->lrr
[169280 evals] best 0.0022349 (fails 1) via core_undivide noop
[173200 evals] best 0.00223525 (fails 1) via crossover ll<->ll
[174160 evals] best 0.00223545 (fails 1) via crossover lrl<->rrr
[177760 evals] best 0.00223574 (fails 1) via core_undivide noop
[233840 evals] best 0.00511709 (fails 1) via retype 1/lr->O
[238560 evals] best 0.00578375 (fails 1) via core_undivide noop
[243040 evals] best 0.00587257 (fails 1) via level_retype 0/rrr<->1/rrr
[243920 evals] best 0.00587423 (fails 1) via crossover root<->root
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 0 shared-leaf copies
[ 200 evals] best 0.00587685 (fails 1) via seed
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 28 → 1 fails (applied)
--- done ---
elapsed : 19387.7s
evals : 750040 across 9374 topologies
best : 0.00587685 (1 fails) via seed+collapse
improvement history:
[ 80] 9.96032e-11 (share:construct/0)
[ 160] 5.18243e-09 (share:construct/1)
[ 320] 9.65534e-06 (share:construct/3)
[ 1920] 1.96478e-05 (share:place_missing noop)
[ 2480] 1.9751e-05 (share:place_missing noop)
[ 3360] 1.99208e-05 (share:core_undivide noop)
[ 3600] 7.04674e-05 (share:undivide 0/rl)
[ 5200] 0.000116027 (share:undivide 0/rr)
[ 6480] 0.000116602 (share:place_missing noop)
[ 6720] 1.52309e-05 (share:level_fix l1: lvl1/lr → lvl0/ll)
[ 7440] 1.67782e-05 (share:place_missing noop)
[ 9520] 1.80279e-05 (share:retype 1/rr->b2)
[ 13600] 4.43351e-05 (share:undivide 0/rl)
[ 13680] 4.4362e-05 (share:level_fix noop)
[ 15280] 4.43676e-05 (share:level_fix noop)
[ 17840] 4.43679e-05 (share:crossover rl<->ll)
[ 17920] 4.67272e-05 (share:level_add (3 storeys))
[ 20000] 4.93528e-05 (share:retype 0/ll->t2)
[ 21360] 5.11016e-05 (share:crossover rl<->ll)
[ 21600] 5.12228e-05 (share:core_undivide noop)
[ 23040] 5.13069e-05 (share:crossover lr<->lr)
[ 24320] 5.13735e-05 (share:core_undivide noop)
[ 25280] 0.000434895 (share:retype 2/ll->O)
[ 25920] 0.000435111 (share:core_undivide noop)
[ 26480] 0.000435218 (share:level_fix noop)
[ 34240] 0.000435236 (share:crossover root<->root)
[ 34480] 0.000435344 (share:level_compound_fix noop)
[ 35600] 0.000435397 (share:crossover rr<->rr)
[ 65840] 0.000460088 (share:level_fix noop)
[ 66400] 0.000462499 (share:core_undivide noop)
[ 67200] 0.000462633 (share:level_fix noop)
[ 70160] 0.00195825 (share:retype 1/ll->O)
[ 70400] 6.42152e-05 (share:level_delete (2 storeys))
[ 77040] 6.45477e-05 (share:level_delete (2 storeys))
[ 80960] 6.45918e-05 (share:level_retype 1/rl<->0/rrl)
[ 86320] 6.45969e-05 (share:crossover rrl<->rrl)
[105200] 6.4915e-05 (share:level_delete (2 storeys))
[106400] 6.49234e-05 (share:crossover lrl<->rrr)
[107200] 6.49603e-05 (share:level_delete (2 storeys))
[154720] 0.0022262 (share:retype 1/ll->O)
[160240] 0.00223095 (share:crossover r<->r)
[167520] 0.00223373 (share:crossover lrr<->lrr)
[169280] 0.0022349 (share:core_undivide noop)
[173200] 0.00223525 (share:crossover ll<->ll)
[174160] 0.00223545 (share:crossover lrl<->rrr)
[177760] 0.00223574 (share:core_undivide noop)
[233840] 0.00511709 (share:retype 1/lr->O)
[238560] 0.00578375 (share:core_undivide noop)
[243040] 0.00587257 (share:level_retype 0/rrr<->1/rrr)
[243920] 0.00587423 (share:crossover root<->root)
[500200] 0.00587685 (polish:seed)
written : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s0.dom

View file

@ -0,0 +1,96 @@
node:
- - 1.67100188077385
- 11.9169190395339
- - 8.72124918939699
- 13.7119442286569
- - 6.79637028658874
- 21.3797854212389
- - -0.42152047183069
- 19.9368564494913
perimeter:
a: private
b: null
c: null
d: null
rotation: 1
division:
- 0.678520486748628
- 0.678520486748628
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.4857106780525208
- 0.4857106780525208
l:
rotation: 1
division:
- 0.6020205699844519
- 0.6020205699844519
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: l1
rotation: 1
r:
rotation: 1
division:
- 0.30659045622347697
- 0.30659045622347697
l:
type: t3
rotation: 0
r:
type: b2
rotation: 0
above:
rotation: 0
division:
- 0.5096611719837818
- 0.5096611719837818
height: 3.0
l:
rotation: 0
division:
- 0.810439317043183
- 0.810439317043183
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: O
rotation: 0
r:
type: C
rotation: 0
r:
type: b1
rotation: 0
r:
rotation: 0
division:
- 0.15762442509997923
- 0.15762442509997923
l:
type: t2
rotation: 0
r:
rotation: 1
division:
- 0.4162714156244671
- 0.4162714156244671
l:
type: C
rotation: 0
r:
type: t1
rotation: 0

View file

@ -0,0 +1,122 @@
seed : /home/bruno/src/homemaker-layout/examples/programme-house/init.dom
programme : programme-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 1
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s1.dom
[ 80 evals] best 4.73547e-07 (fails 11) via construct/0
[ 160 evals] best 9.37107e-07 (fails 9) via construct/1
[ 2720 evals] best 2.72402e-05 (fails 7) via swap 0/ll
[ 2800 evals] best 1.02861e-05 (fails 6) via crossover llr<->llr
[ 3040 evals] best 1.08389e-05 (fails 6) via level_fix noop
[ 3600 evals] best 2.65188e-05 (fails 5) via undivide 0/ll
[ 3920 evals] best 2.68577e-05 (fails 5) via retype 1/rl->b2
[ 6960 evals] best 2.71134e-05 (fails 5) via level_compound_fix noop
[ 8080 evals] best 0.000534598 (fails 3) via swap 0/rr
[ 9520 evals] best 0.000552787 (fails 3) via retype 1/rl->t3
[ 11760 evals] best 0.000562919 (fails 3) via core_undivide noop
[ 18080 evals] best 0.000614306 (fails 3) via place_missing t2 -> ll
[ 18400 evals] best 0.000650367 (fails 3) via level_retype 1/lll<->0/rl
[ 22400 evals] best 0.00094194 (fails 3) via divide 1/rr
[ 23440 evals] best 0.000998712 (fails 3) via crossover llr<->llr
[ 23920 evals] best 0.00117838 (fails 3) via core_undivide noop
[ 24080 evals] best 0.00122788 (fails 3) via core_divide noop
[ 24720 evals] best 0.00123449 (fails 3) via place_missing noop
[ 26560 evals] best 0.00124116 (fails 3) via crossover l<->l
[ 26800 evals] best 0.00125494 (fails 3) via level_compound_fix noop
[ 27200 evals] best 0.000596296 (fails 2) via crossover llr<->rrr
[ 27520 evals] best 0.000664798 (fails 2) via retype 0/llr->C
[ 28160 evals] best 0.000764779 (fails 2) via level_retype 0/rr<->1/lr
[ 28240 evals] best 0.00077279 (fails 2) via core_divide noop
[ 29520 evals] best 0.000806654 (fails 2) via rotate 0/root
[ 29680 evals] best 0.000834624 (fails 2) via level_compound_fix noop
[ 30720 evals] best 0.000844674 (fails 2) via swap 0/r
[ 31120 evals] best 0.000845753 (fails 2) via core_divide noop
[ 32240 evals] best 0.00085792 (fails 2) via undivide 0/ll
[ 32560 evals] best 0.000858981 (fails 2) via place_missing noop
[ 38560 evals] best 0.000859059 (fails 2) via level_compound_fix noop
[176480 evals] best 0.00412056 (fails 1) via divide 1/ll
[178160 evals] best 0.00427693 (fails 1) via level_retype 1/lr<->0/rl
[184640 evals] best 0.00436811 (fails 1) via place_missing noop
[185280 evals] best 0.00439571 (fails 1) via level_fix noop
[185360 evals] best 0.00440821 (fails 1) via level_compound_fix noop
[212320 evals] best 0.00518807 (fails 1) via rotate 0/ll
[212960 evals] best 0.00526235 (fails 1) via crossover r<->r
[213040 evals] best 0.00526441 (fails 1) via place_missing noop
[214080 evals] best 0.00526462 (fails 1) via place_missing noop
[215600 evals] best 0.00526787 (fails 1) via swap 0/r
[217440 evals] best 0.00527131 (fails 1) via swap 0/ll
[279840 evals] best 0.00533313 (fails 1) via crossover lr<->lr
[280720 evals] best 0.00534008 (fails 1) via level_retype 0/rl<->1/lr
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 0 shared-leaf copies
[ 200 evals] best 0.0053408 (fails 1) via seed
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 5 → 1 fails (applied)
--- done ---
elapsed : 17963.6s
evals : 750040 across 9374 topologies
best : 0.0053408 (1 fails) via seed+collapse
improvement history:
[ 80] 4.73547e-07 (share:construct/0)
[ 160] 9.37107e-07 (share:construct/1)
[ 2720] 2.72402e-05 (share:swap 0/ll)
[ 2800] 1.02861e-05 (share:crossover llr<->llr)
[ 3040] 1.08389e-05 (share:level_fix noop)
[ 3600] 2.65188e-05 (share:undivide 0/ll)
[ 3920] 2.68577e-05 (share:retype 1/rl->b2)
[ 6960] 2.71134e-05 (share:level_compound_fix noop)
[ 8080] 0.000534598 (share:swap 0/rr)
[ 9520] 0.000552787 (share:retype 1/rl->t3)
[ 11760] 0.000562919 (share:core_undivide noop)
[ 18080] 0.000614306 (share:place_missing t2 -> ll)
[ 18400] 0.000650367 (share:level_retype 1/lll<->0/rl)
[ 22400] 0.00094194 (share:divide 1/rr)
[ 23440] 0.000998712 (share:crossover llr<->llr)
[ 23920] 0.00117838 (share:core_undivide noop)
[ 24080] 0.00122788 (share:core_divide noop)
[ 24720] 0.00123449 (share:place_missing noop)
[ 26560] 0.00124116 (share:crossover l<->l)
[ 26800] 0.00125494 (share:level_compound_fix noop)
[ 27200] 0.000596296 (share:crossover llr<->rrr)
[ 27520] 0.000664798 (share:retype 0/llr->C)
[ 28160] 0.000764779 (share:level_retype 0/rr<->1/lr)
[ 28240] 0.00077279 (share:core_divide noop)
[ 29520] 0.000806654 (share:rotate 0/root)
[ 29680] 0.000834624 (share:level_compound_fix noop)
[ 30720] 0.000844674 (share:swap 0/r)
[ 31120] 0.000845753 (share:core_divide noop)
[ 32240] 0.00085792 (share:undivide 0/ll)
[ 32560] 0.000858981 (share:place_missing noop)
[ 38560] 0.000859059 (share:level_compound_fix noop)
[176480] 0.00412056 (share:divide 1/ll)
[178160] 0.00427693 (share:level_retype 1/lr<->0/rl)
[184640] 0.00436811 (share:place_missing noop)
[185280] 0.00439571 (share:level_fix noop)
[185360] 0.00440821 (share:level_compound_fix noop)
[212320] 0.00518807 (share:rotate 0/ll)
[212960] 0.00526235 (share:crossover r<->r)
[213040] 0.00526441 (share:place_missing noop)
[214080] 0.00526462 (share:place_missing noop)
[215600] 0.00526787 (share:swap 0/r)
[217440] 0.00527131 (share:swap 0/ll)
[279840] 0.00533313 (share:crossover lr<->lr)
[280720] 0.00534008 (share:level_retype 0/rl<->1/lr)
[500200] 0.0053408 (polish:seed)
written : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s1.dom

View file

@ -0,0 +1,148 @@
node:
- - 1.67100188077385
- 11.9169190395339
- - 8.72124918939699
- 13.7119442286569
- - 6.79637028658874
- 21.3797854212389
- - -0.42152047183069
- 19.9368564494913
perimeter:
a: private
b: null
c: null
d: null
rotation: 1
division:
- 0.5356815548737125
- 0.5356815548737125
height: 3.0
elevation: 0.0
wall_inner: 0.08
wall_outer: 0.25
l:
rotation: 1
division:
- 0.48744474801155124
- 0.48744474801155124
l:
rotation: 3
division:
- 0.5040666628633002
- 0.5040666628633002
l:
type: C
rotation: 0
r:
type: C
rotation: 0
r:
type: C
rotation: 1
r:
rotation: 1
division:
- 0.5430891656879034
- 0.5430891656879034
l:
rotation: 2
division:
- 0.6357435711673266
- 0.6357435711673266
l:
type: l1
rotation: 0
r:
type: t3
rotation: 0
r:
type: b2
rotation: 0
above:
rotation: 0
division:
- 0.422710624129746
- 0.422710624129746
height: 3.0
l:
rotation: 0
division:
- 0.8171577162760618
- 0.8171577162760618
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: t1
rotation: 0
r:
type: b1
rotation: 0
r:
rotation: 0
division:
- 0.4016497398054913
- 0.4016497398054913
l:
type: O
rotation: 0
r:
type: O
rotation: 0
above:
rotation: 0
division:
- 0.422710624129746
- 0.422710624129746
height: 3.0
l:
rotation: 0
division:
- 0.8171577162760618
- 0.8171577162760618
l:
rotation: 1
division:
- 0.5
- 0.5
l:
type: C
rotation: 0
r:
type: t2
rotation: 0
r:
rotation: 1
division:
- 0.5002825736306157
- 0.5002825736306157
l:
type: O
rotation: 0
r:
type: O
rotation: 0
r:
rotation: 0
division:
- 0.4016497398054913
- 0.4016497398054913
l:
type: O
rotation: 0
r:
rotation: 1
division:
- 0.5020331882778841
- 0.5020331882778841
l:
type: O
rotation: 0
r:
type: O
rotation: 0

View file

@ -0,0 +1,168 @@
seed : /home/bruno/src/homemaker-layout/examples/programme-house/init.dom
programme : programme-house
budget : 500000
pop : 16
child_budget : 80
workers : 1
rng seed : 2
leaf sharing : True (factor=3)
superpose : False
multi_use : False
conn grade : False
use tiers : False
bridge circulation : False
ruin recreate : False
collapse in-search : True
shapecurve warmstart : False
shapecurve prune : False
output : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s2.dom
[ 80 evals] best 8.34088e-08 (fails 14) via construct/0
[ 160 evals] best 3.25056e-07 (fails 13) via construct/1
[ 480 evals] best 4.05065e-07 (fails 8) via construct/5
[ 2320 evals] best 4.76094e-07 (fails 8) via core_divide noop
[ 2640 evals] best 4.87216e-07 (fails 8) via core_divide noop
[ 4800 evals] best 5.01285e-07 (fails 8) via swap 0/lr
[ 5040 evals] best 1.05925e-06 (fails 7) via swap 0/ll
[ 5200 evals] best 1.15811e-06 (fails 7) via place_missing noop
[ 6080 evals] best 1.15978e-06 (fails 7) via place_missing noop
[ 6480 evals] best 1.15987e-06 (fails 7) via place_missing noop
[ 6720 evals] best 4.22518e-06 (fails 4) via level_retype 2/rl<->0/lll
[ 7200 evals] best 7.78334e-06 (fails 4) via retype 0/rrr->t2
[ 7360 evals] best 4.89625e-05 (fails 4) via level_retype 0/rl<->1/rr
[ 8400 evals] best 3.13343e-05 (fails 3) via crossover llr<->lll
[ 9120 evals] best 5.70453e-05 (fails 3) via core_undivide noop
[ 11040 evals] best 7.50021e-05 (fails 3) via level_fix noop
[ 11360 evals] best 2.80185e-05 (fails 2) via level_retype 0/llr<->2/lrl
[ 11600 evals] best 3.37736e-05 (fails 2) via retype 1/lr->l1
[ 12480 evals] best 0.000635808 (fails 2) via undivide 2/lr
[ 13760 evals] best 0.0007325 (fails 2) via level_compound_fix noop
[ 14800 evals] best 0.000782161 (fails 2) via crossover rrr<->rrr
[ 15280 evals] best 0.000823097 (fails 2) via level_retype 2/rr<->0/rrl
[ 15760 evals] best 0.000825665 (fails 2) via core_undivide noop
[ 16480 evals] best 0.000826726 (fails 2) via level_fix noop
[ 16800 evals] best 0.00082769 (fails 2) via crossover rl<->rl
[ 16960 evals] best 0.000846272 (fails 2) via swap 0/ll
[ 17040 evals] best 0.000862002 (fails 2) via crossover llr<->llr
[ 19680 evals] best 0.000879214 (fails 2) via level_fix noop
[ 21600 evals] best 0.00127147 (fails 1) via retype 2/rl->O
[ 27280 evals] best 0.00127374 (fails 1) via crossover rrr<->rrr
[ 29200 evals] best 0.00127915 (fails 1) via level_fix noop
[ 38320 evals] best 0.00131908 (fails 1) via undivide 0/lr
[ 39200 evals] best 0.00131972 (fails 1) via level_fix noop
[ 49280 evals] best 0.00133897 (fails 1) via swap 0/ll
[ 68720 evals] best 0.00136878 (fails 1) via rotate 0/rr
[ 68880 evals] best 0.00144686 (fails 1) via undivide 0/lr
[ 71840 evals] best 0.00151517 (fails 1) via level_fix noop
[ 72000 evals] best 0.00153784 (fails 1) via crossover rl<->rl
[ 72960 evals] best 0.00154496 (fails 1) via level_fix noop
[ 80400 evals] best 0.00158092 (fails 1) via divide 2/rr
[ 81040 evals] best 0.00162435 (fails 1) via level_retype 0/llr<->2/lll
[ 84960 evals] best 0.00162755 (fails 1) via core_undivide noop
[ 85440 evals] best 0.00165285 (fails 1) via level_fix noop
[ 94640 evals] best 0.00165285 (fails 1) via undivide 0/lr
[ 95920 evals] best 0.00166211 (fails 1) via swap 2/rr
[103200 evals] best 0.00178978 (fails 1) via level_retype 1/rl<->0/rrl
[103440 evals] best 0.00182512 (fails 1) via level_retype 0/rrr<->1/lr
[103600 evals] best 0.00183656 (fails 1) via crossover rrr<->rrr
[111120 evals] best 0.00184342 (fails 1) via level_fix noop
[119680 evals] best 0.00200171 (fails 1) via rotate 0/ll
[120320 evals] best 0.00201261 (fails 1) via core_undivide noop
[121040 evals] best 0.00201391 (fails 1) via retype 0/rl->t1
[122640 evals] best 0.00203552 (fails 1) via rotate 0/ll
[122880 evals] best 0.00204467 (fails 1) via level_fix noop
[152160 evals] best 0.00216646 (fails 1) via level_fix noop
[154880 evals] best 0.00221636 (fails 1) via level_fix noop
[174080 evals] best 0.00222694 (fails 1) via level_compound_fix noop
[182480 evals] best 0.00222773 (fails 1) via retype 0/rlr->b2
[184160 evals] best 0.00225027 (fails 1) via crossover l<->l
[185120 evals] best 0.00225822 (fails 1) via level_fix noop
[206640 evals] best 0.00225918 (fails 1) via crossover llr<->lll
[208240 evals] best 0.00226116 (fails 1) via crossover r<->r
[211760 evals] best 0.00226381 (fails 1) via level_retype 2/lll<->1/lll
[224560 evals] best 0.00226381 (fails 1) via crossover l<->l
[281520 evals] best 0.00226563 (fails 1) via divide 2/rr
[346400 evals] best 0.00226631 (fails 1) via divide 1/rr
[480000 evals] best 0.00226655 (fails 1) via divide 2/lr
--- finishing (homemaker-py-3l6): unfold + polish 250000 evals ---
[finish] unfold: materialised 0 shared-leaf copies
[ 200 evals] best 0.00226757 (fails 1) via seed
--- collapse (homemaker-py-94g): finish-time cell→room relabel ---
[finish] collapse: 13 → 1 fails (applied)
--- done ---
elapsed : 26218.8s
evals : 750040 across 9374 topologies
best : 0.00226757 (1 fails) via seed+collapse
improvement history:
[ 80] 8.34088e-08 (share:construct/0)
[ 160] 3.25056e-07 (share:construct/1)
[ 480] 4.05065e-07 (share:construct/5)
[ 2320] 4.76094e-07 (share:core_divide noop)
[ 2640] 4.87216e-07 (share:core_divide noop)
[ 4800] 5.01285e-07 (share:swap 0/lr)
[ 5040] 1.05925e-06 (share:swap 0/ll)
[ 5200] 1.15811e-06 (share:place_missing noop)
[ 6080] 1.15978e-06 (share:place_missing noop)
[ 6480] 1.15987e-06 (share:place_missing noop)
[ 6720] 4.22518e-06 (share:level_retype 2/rl<->0/lll)
[ 7200] 7.78334e-06 (share:retype 0/rrr->t2)
[ 7360] 4.89625e-05 (share:level_retype 0/rl<->1/rr)
[ 8400] 3.13343e-05 (share:crossover llr<->lll)
[ 9120] 5.70453e-05 (share:core_undivide noop)
[ 11040] 7.50021e-05 (share:level_fix noop)
[ 11360] 2.80185e-05 (share:level_retype 0/llr<->2/lrl)
[ 11600] 3.37736e-05 (share:retype 1/lr->l1)
[ 12480] 0.000635808 (share:undivide 2/lr)
[ 13760] 0.0007325 (share:level_compound_fix noop)
[ 14800] 0.000782161 (share:crossover rrr<->rrr)
[ 15280] 0.000823097 (share:level_retype 2/rr<->0/rrl)
[ 15760] 0.000825665 (share:core_undivide noop)
[ 16480] 0.000826726 (share:level_fix noop)
[ 16800] 0.00082769 (share:crossover rl<->rl)
[ 16960] 0.000846272 (share:swap 0/ll)
[ 17040] 0.000862002 (share:crossover llr<->llr)
[ 19680] 0.000879214 (share:level_fix noop)
[ 21600] 0.00127147 (share:retype 2/rl->O)
[ 27280] 0.00127374 (share:crossover rrr<->rrr)
[ 29200] 0.00127915 (share:level_fix noop)
[ 38320] 0.00131908 (share:undivide 0/lr)
[ 39200] 0.00131972 (share:level_fix noop)
[ 49280] 0.00133897 (share:swap 0/ll)
[ 68720] 0.00136878 (share:rotate 0/rr)
[ 68880] 0.00144686 (share:undivide 0/lr)
[ 71840] 0.00151517 (share:level_fix noop)
[ 72000] 0.00153784 (share:crossover rl<->rl)
[ 72960] 0.00154496 (share:level_fix noop)
[ 80400] 0.00158092 (share:divide 2/rr)
[ 81040] 0.00162435 (share:level_retype 0/llr<->2/lll)
[ 84960] 0.00162755 (share:core_undivide noop)
[ 85440] 0.00165285 (share:level_fix noop)
[ 94640] 0.00165285 (share:undivide 0/lr)
[ 95920] 0.00166211 (share:swap 2/rr)
[103200] 0.00178978 (share:level_retype 1/rl<->0/rrl)
[103440] 0.00182512 (share:level_retype 0/rrr<->1/lr)
[103600] 0.00183656 (share:crossover rrr<->rrr)
[111120] 0.00184342 (share:level_fix noop)
[119680] 0.00200171 (share:rotate 0/ll)
[120320] 0.00201261 (share:core_undivide noop)
[121040] 0.00201391 (share:retype 0/rl->t1)
[122640] 0.00203552 (share:rotate 0/ll)
[122880] 0.00204467 (share:level_fix noop)
[152160] 0.00216646 (share:level_fix noop)
[154880] 0.00221636 (share:level_fix noop)
[174080] 0.00222694 (share:level_compound_fix noop)
[182480] 0.00222773 (share:retype 0/rlr->b2)
[184160] 0.00225027 (share:crossover l<->l)
[185120] 0.00225822 (share:level_fix noop)
[206640] 0.00225918 (share:crossover llr<->lll)
[208240] 0.00226116 (share:crossover r<->r)
[211760] 0.00226381 (share:level_retype 2/lll<->1/lll)
[224560] 0.00226381 (share:crossover l<->l)
[281520] 0.00226563 (share:divide 2/rr)
[346400] 0.00226631 (share:divide 1/rr)
[480000] 0.00226655 (share:divide 2/lr)
[500200] 0.00226757 (polish:seed)
written : /home/bruno/src/homemaker-layout/examples/programme-house/coldstart-500000-s2.dom

View file

@ -8,6 +8,7 @@
# Building programme: 2-bedroom house with ensuite
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -21,6 +22,7 @@ spaces:
adjacency:
- c
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -31,6 +33,7 @@ spaces:
adjacency:
- b1
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -41,6 +44,7 @@ spaces:
adjacency:
- c
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -48,6 +52,7 @@ spaces:
adjacency:
- c
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 35.0
@ -62,6 +67,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0
@ -73,17 +79,28 @@ spaces:
# Building constraints
storey_minimum: 2
storey_limit: 5
force_roof_garden: 0
# homemaker-py-hxi (DESIGN.md §39.25): ENABLED. Fails a level that has no
# outdoor space at all -- Alexander's actual requirement, per level and with no
# quantity attached. It had been off in every corpus config, so the only thing
# expressing outdoor space was ratio_outside's arbitrary fraction.
force_roof_garden: 1
# Circulation ratio (penalise excessive corridors)
# homemaker-py-hxi (DESIGN.md §39.24): disabled. The score is value/cost, a
# ratio, so the per-m2 economics (circulation worth 50 against a build cost of
# 200) is ALREADY a proportional pressure against circulation -- this said the
# same thing a second time, and with a curve where twice the corridor is far
# more than twice as bad. Its other side, "a building needs some circulation",
# was worth at most 13% here and is enforced structurally anyway by the access
# and connectivity checks. Set a [target, sigma] pair to re-enable.
ratio_circulation:
- 0.00
- 0.15
# Outside space ratio
# homemaker-py-hxi (DESIGN.md §39.25): disabled. Alexander says every level
# should have accessible outside space; he does not say how much. The
# qualitative requirement is force_roof_garden below. Set a [target, sigma]
# pair to re-enable this quantitative one.
ratio_outside:
- 0.30
- 0.15
# Staircase requirements
staircase_min: 1
@ -93,4 +110,9 @@ staircase_max: 1
value_inside: 300.0
value_circulation: 50.0
value_outside: 100.0
value_supported: 300.0
# homemaker-py-ecx (DESIGN.md §39.19): an upper-level terrace is worth what
# outdoor space is worth (value_outside); it is the COST that differs by level
# (outside 10.0 vs outside_supported 110.0), not the value. At 300.0 -- the
# `value_inside` rate -- a terrace was worth more per square metre than a real
# internal room, which the owner ruled out.
value_supported: 100.0

View file

@ -12,6 +12,7 @@
# Building programme: 2-bedroom house with ensuite
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -25,6 +26,7 @@ spaces:
adjacency:
- c
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -35,6 +37,7 @@ spaces:
adjacency:
- b1
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -45,6 +48,7 @@ spaces:
adjacency:
- c
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -52,6 +56,7 @@ spaces:
adjacency:
- c
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 25.0
@ -65,6 +70,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0

View file

@ -5,6 +5,7 @@
# parameters (storey limits, ratios, adjacency, room-type mix) unchanged.
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -19,6 +20,7 @@ spaces:
- c
count: 2
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -30,6 +32,7 @@ spaces:
- b1
count: 2
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -41,6 +44,7 @@ spaces:
- c
count: 2
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -49,6 +53,7 @@ spaces:
- c
count: 2
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 35.0
@ -63,6 +68,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0

View file

@ -5,6 +5,7 @@
# parameters (storey limits, ratios, adjacency, room-type mix) unchanged.
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -19,6 +20,7 @@ spaces:
- c
count: 3
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -30,6 +32,7 @@ spaces:
- b1
count: 3
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -41,6 +44,7 @@ spaces:
- c
count: 3
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -49,6 +53,7 @@ spaces:
- c
count: 3
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 35.0
@ -63,6 +68,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0

View file

@ -5,6 +5,7 @@
# parameters (storey limits, ratios, adjacency, room-type mix) unchanged.
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -19,6 +20,7 @@ spaces:
- c
count: 4
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -30,6 +32,7 @@ spaces:
- b1
count: 4
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -41,6 +44,7 @@ spaces:
- c
count: 4
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -49,6 +53,7 @@ spaces:
- c
count: 4
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 35.0
@ -63,6 +68,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0

View file

@ -5,6 +5,7 @@
# parameters (storey limits, ratios, adjacency, room-type mix) unchanged.
spaces:
b1:
usage: bedroom
name: Master Bedroom
size:
- 16.0
@ -19,6 +20,7 @@ spaces:
- c
count: 5
t1:
usage: toilet
name: Ensuite Bathroom
size:
- 5.0
@ -30,6 +32,7 @@ spaces:
- b1
count: 5
b2:
usage: bedroom
name: Second Bedroom
size:
- 12.0
@ -41,6 +44,7 @@ spaces:
- c
count: 5
t2:
usage: toilet
name: Guest Bathroom
size:
- 4.0
@ -49,6 +53,7 @@ spaces:
- c
count: 5
l1:
usage: living
name: Living/Dining/Kitchen
size:
- 35.0
@ -63,6 +68,7 @@ spaces:
adjacency:
- c
t3:
usage: toilet
name: Ground Floor WC
size:
- 3.0

View file

@ -0,0 +1,271 @@
"""Search A/B for the crinkliness reformulation (`homemaker-py-9gj`).
Two independent changes to `quality_uncrinkliness`, either or both:
crinkliness_tail="ramp" below FAIL_THRESHOLD. The factor evaluates a
gaussian at `x = 1/crink`, whose exponent
grows like 1/crink^2, so the failing tail
spans quality 1e-300..1e-1 -- all of it
numerically zero beside a passing leaf's ~1.
The ramp makes that tail a straight line in
crinkliness. (DESIGN.md §39.13. Measured a
complete null on its own: 12 of 12 pairs
byte-identical.)
crinkliness_shape="daylight" above it. `1/crink` is the room's mean depth
from its daylit wall in storey-heights, and
the stock gaussian is TWO-sided on it, so a
room with more daylight than target is
penalised for it -- while the cost model
already charges that wall via
`exterior_wall`/`boundary_wall`. "daylight"
clips that side to 1.0. (DESIGN.md §39.14.)
**Why stock scoring is valid here** (the §38.9 trap, and the one case the
`9gj` bead flags as exempt): the ramp is continuous at FAIL_THRESHOLD and
strictly below it, so no leaf changes which side of the threshold it is on.
The fail set is byte-identical on every corpus artefact -- asserted in
`tests/test_fitness_crinkliness_tail.py`, not assumed here. An arm therefore
cannot win by deleting a fail category, and both arms are scored under stock.
**Two experiment shapes**, because they answer different questions:
--start plateau (default) seed each run from that programme's
`coldstart-500000-s<k>.dom`. This is the ESCAPE
test the bead asks for: the ramp has signal only
where a search has already built partially-lit
rooms, and the corpus `init.dom` files show a
+0.000% score delta -- there is nothing for it to
grade at the start of a search.
--start init cold start, for comparison.
Pairing is on (starting layout, RNG seed), so `--seeds N` over `--starts M`
gives N*M paired samples per programme.
Usage::
python experiments/ab_9gj_crinkliness.py --budget 8000 --seeds 2 --starts 3
python experiments/ab_9gj_crinkliness.py --start init --budget 8000 --seeds 6
Sharding, because one run is minutes and the job list is 4x that. Each shard
keeps BOTH arms of a pair together, so the two halves of a comparison never
land on differently-loaded processes::
for i in 0 1 2 3; do
python experiments/ab_9gj_crinkliness.py --budget 8000 --seeds 2 --starts 3 \
--shard $i --nshards 4 &
done; wait
python experiments/ab_9gj_crinkliness.py --report
A POWERED run needs more than the in-session pilot could afford. §39.12 puts
harbor's minimum detectable difference at n=3 at 13.7 fails; the plateau-escape
deltas here are single-digit, so budget for n >= 8 pairs per programme
(`--seeds 3 --starts 3` gives 9) and a budget large enough for either arm to
move at all -- the pilot's 8000 evals is 1.6% of what produced the plateau::
for i in $(seq 0 3); do
python experiments/ab_9gj_crinkliness.py --budget 100000 --seeds 3 --starts 3 \
--shard $i --nshards 4 &
done; wait
"""
from __future__ import annotations
import argparse
import collections
import copy
import csv
import time
from pathlib import Path
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness
CORPUS = ["examples/harbor-house", "examples/maple-court"]
# Each arm names a crinkliness configuration. "stock" must stay first: it is
# the baseline every other arm is paired against, and the yardstick all arms
# are SCORED under.
ARM_CONF = {
"stock": {},
"ramp": {"crinkliness_tail": "ramp"},
"daylight": {"crinkliness_shape": "daylight"},
"daylight+ramp": {"crinkliness_shape": "daylight",
"crinkliness_tail": "ramp"},
# homemaker-py-ecx (§39.18): orthogonal to the crinkliness arms -- it
# changes how the factors are COMBINED, not what any of them says.
"geomean": {"quality_aggregate": "geometric_mean"},
"geomean+daylight": {"quality_aggregate": "geometric_mean",
"crinkliness_shape": "daylight",
"crinkliness_tail": "ramp"},
}
ARMS = ["stock", "daylight", "daylight+ramp"]
def _with_arm(arm: str):
"""Patch `fitness.load_config` so every evaluator built during the run --
the driver's, the inner loop's, the seeder's -- sees the arm's overrides.
`driver.search` has no parameter for them and `driver._fitness_for` is
lru_cached, so the cache is cleared around the patch (see ab_ssz_search).
"""
orig = fitness.load_config
arm_ov = ARM_CONF[arm]
def patched(directory, overrides=None):
ov = dict(overrides or {})
ov.update(arm_ov)
return orig(directory, overrides=ov)
return orig, patched
def tiers(fails) -> tuple[int, int]:
c = collections.Counter(fitness.classify_fail_tier(f) for f in fails)
return c["hard"], c["soft"]
def run_arm(progdir: str, start: Path, seed: int, tail: str, budget: int,
child_budget: int) -> dict:
orig, patched = _with_arm(tail)
fitness.load_config = patched
driver._fitness_for.cache_clear()
t0 = time.perf_counter()
try:
res = driver.search(dom_mod.load(str(start)), progdir, budget=budget,
seed=seed, child_budget=child_budget, n_workers=1)
root = copy.deepcopy(res.best.root)
finally:
fitness.load_config = orig
driver._fitness_for.cache_clear()
conf, cost = orig(progdir, overrides={"leaf_sharing": True,
"collapse_insearch": True})
score, fails = fitness.Fitness(conf, cost).score_with_fails(copy.deepcopy(root))
h, s = tiers(fails)
return dict(programme=Path(progdir).name, start=start.name, seed=seed,
tail=tail, hard=h, soft=s, total=h + s, score=score,
elapsed_s=round(time.perf_counter() - t0, 1))
def starting_points(progdir: str, kind: str, n: int) -> list[Path]:
"""The distinct layouts to start from.
`--starts` applies to plateau mode only: there is exactly one `init.dom`,
and repeating it would give several jobs the same (start, seed) pairing key,
which `_report` would silently collapse to one. In init mode the RNG seed
is the only sampling dimension, so use `--seeds`.
"""
d = Path(progdir)
if kind == "init":
return [d / "init.dom"]
found = sorted(d.glob("coldstart-500000-s*.dom"))[:n]
if not found:
raise SystemExit(f"no coldstart-500000-s*.dom in {d} for --start plateau")
return found
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("--budget", type=int, default=8000)
ap.add_argument("--child-budget", type=int, default=80)
ap.add_argument("--seeds", type=int, default=2, help="RNG seeds per start")
ap.add_argument("--starts", type=int, default=3,
help="plateau layouts to start from (plateau mode only)")
ap.add_argument("--start", choices=("plateau", "init"), default="plateau")
ap.add_argument("--corpus", nargs="+", default=CORPUS)
ap.add_argument("--arms", nargs="+", default=ARMS,
choices=sorted(ARM_CONF), help="first arm is the baseline")
ap.add_argument("--out", default="experiments/results/ab_9gj_crinkliness.csv")
ap.add_argument("--shard", type=int, default=0,
help="run only jobs i where i %% nshards == shard")
ap.add_argument("--nshards", type=int, default=1,
help="split the job list across N processes; each writes "
"<out>.shard<i>. Use --report to merge and analyse.")
ap.add_argument("--report", action="store_true",
help="merge <out>.shard* (or <out>) and print the analysis "
"only -- runs nothing")
args = ap.parse_args()
out = Path(args.out)
out.parent.mkdir(parents=True, exist_ok=True)
if args.report:
rows = []
shards = sorted(out.parent.glob(out.name + ".shard*")) or (
[out] if out.exists() else [])
for sh in shards:
with sh.open() as fh:
for r in csv.DictReader(fh):
for k in ("total", "hard", "soft", "seed"):
r[k] = int(r[k])
r["score"] = float(r["score"])
rows.append(r)
if len(shards) > 1:
with out.open("w", newline="") as fh:
w = csv.DictWriter(fh, fieldnames=list(rows[0]))
w.writeheader()
w.writerows(rows)
_report(rows, args.corpus, args.arms)
print(f"\nmerged {len(rows)} runs from {len(shards)} file(s) into {out}")
return
# Build the whole job list first so sharding is deterministic and every
# (start, seed) pair keeps BOTH arms in the same shard -- the comparison is
# paired, and splitting a pair across processes would let machine load
# differ between the two halves of one pair.
jobs = []
for progdir in args.corpus:
for start in starting_points(progdir, args.start, args.starts):
for seed in range(args.seeds):
jobs.append((progdir, start, seed))
rows: list[dict] = []
dest = (out if args.nshards == 1
else out.with_name(out.name + f".shard{args.shard}"))
for i, (progdir, start, seed) in enumerate(jobs):
if i % args.nshards != args.shard:
continue
for tail in args.arms:
r = run_arm(progdir, start, seed, tail, args.budget,
args.child_budget)
rows.append(r)
print(f" {r['programme']:<14} {start.name:<26} seed={seed} "
f"{tail:<9} {r['hard']}h/{r['soft']}s = {r['total']:3d} "
f"score {r['score']:.4g} {r['elapsed_s']}s", flush=True)
with dest.open("w", newline="") as fh:
w = csv.DictWriter(fh, fieldnames=list(rows[0]))
w.writeheader()
w.writerows(rows)
if args.nshards == 1:
_report(rows, args.corpus, args.arms)
print(f"\nwrote {dest}")
def _report(rows, corpus, arms=None) -> None:
"""homemaker-py-tco: state what this N could resolve, beside the result."""
from ab_report import format_report, paired_report
seen = []
for r in rows:
if r["tail"] not in seen:
seen.append(r["tail"])
arms = [a for a in (arms or seen) if a in seen] or seen
base = arms[0]
for progdir in corpus:
name = Path(progdir).name
by: dict[tuple, dict] = {}
for r in rows:
if r["programme"] == name:
by.setdefault((r["start"], r["seed"]), {})[r["tail"]] = r["total"]
for arm in arms[1:]:
keys = sorted(k for k, v in by.items() if base in v and arm in v)
if len(keys) < 2:
continue
print(f"\n--- {name}: {arm} vs {base} (stock-scored total fails) ---")
print(format_report(paired_report(
[by[k][base] for k in keys], [by[k][arm] for k in keys],
base, arm)))
if __name__ == "__main__":
main()

View file

@ -0,0 +1,167 @@
"""A/B the `crinkliness_mode` repairs against the circulation-deletion incentive.
Evidence for `homemaker-py-ssz` / `homemaker-py-2v1` (DESIGN.md §38.6). The
test: on a constructed layout, delete each unpinned circulation/outside leaf
(by undividing its parent, which merges it into its sibling) and re-score. A
healthy objective should not pay you to do that.
Reports the count of deletions that still improve the score, and the median
score ratio, per mode. Splitting the rows by whether the deleted leaf was
buried or lit is what separates the two mechanisms:
* buried leaves are rewarded because ``quality_uncrinkliness`` returns a hard
0.0, so they contribute zero value (§38.1);
* **lit** leaves are rewarded because ``value_circulation`` (50) is one sixth
of ``value_inside`` (300), so merging corridor into room is a flat ×6 gain
against a ×0.5 connectivity penalty (§38.2 refinement) which no
``crinkliness_mode`` can touch.
.. warning::
**The premise of this test is RETRACTED see §38.2 and §38.8.** The ×6-vs-
×0.5 arithmetic assumed severing the spine costs one connectivity fail;
measured, the connectivity count is unchanged in every rewarded deletion, so
this script is not measuring what its docstring says. It is kept because the
per-mode buried/lit split is still a useful description of what each mode
touches, but a mode does **not** pass or fail on these numbers. The A/B that
decides `ssz` is ``experiments/ab_ssz_search.py`` (fixed-budget search,
scored under the stock objective).
Usage::
python experiments/ab_crinkliness_mode_ssz.py
python experiments/ab_crinkliness_mode_ssz.py --seeds 5 --progdir examples/maple-court
"""
from __future__ import annotations
import argparse
import copy
import numpy as np
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness, geometry
from homemaker_layout import graph as graph_mod
from homemaker_layout import operators, programme
MODES = ("urb", "floor", "compact_ok", "exempt_circulation")
def make_fitness(progdir: str, mode: str) -> fitness.Fitness:
"""Evaluator matching ``driver.search``'s defaults, with one mode override."""
overrides = dict(driver._overrides_for(
leaf_sharing=True, superpose=False, max_share=None, conn_grade=False,
collapse_insearch=True, multi_use=False) or {})
overrides["crinkliness_mode"] = mode
conf, cost = fitness.load_config(progdir, overrides=overrides)
return fitness.Fitness(conf, cost)
def constructed_seed(progdir: str, seed: int) -> dom_mod.Node:
reqs = programme.load_programme_dir(progdir)
return operators.constructive_topology(
dom_mod.load(f"{progdir}/init.dom"), reqs, np.random.default_rng(seed),
sorted(reqs) + ["C", "O"],
min_storeys=programme.storey_minimum(progdir),
adjacency_aware=True, proportion_aware=True, circ_divisor=3,
leaf_sharing=True, leaf_share_factor=3, depth_balanced=True,
interior_outside=True, outside_divisor=3)
def unpinned_leaves(fit: fitness.Fitness, root: dom_mod.Node) -> list[tuple]:
"""(level, id, type, exposed_area) for circulation/outside leaves — the ones
no missing-space cascade pins in place."""
tree = copy.deepcopy(root)
geometry.clear_cache()
dom_mod.canonicalize_shares(tree)
fit.preprocess_building(tree)
dom_mod.merge_divided(tree)
geometry.clear_cache()
graphs = graph_mod.build_graphs(tree, fit.conf("door_width") or 1.2)
out = []
for li, lvl in enumerate(dom_mod.levels(tree)):
for leaf in lvl.leaves():
if dom_mod.is_outside(leaf) and not dom_mod.is_covered(leaf):
continue
# §39.4: generic structural types are EXACT `C`/`O`/`S`, never a
# first-character prefix -- `cr1` is a programme room. This script
# predates that rule and its original `type[:1].upper() in ("C","O")`
# test swept programme rooms into the "unpinned" set, which is one
# reason the §38.6 numbers do not reproduce.
if not dom_mod.is_generic(leaf.type):
continue
out.append((li, leaf.id, leaf.type,
fit.area_outside(leaf, graphs[li], {})))
return out
def delete_leaf(root: dom_mod.Node, li: int, lid: str) -> "dom_mod.Node | None":
"""Undivide the leaf's parent, merging it into its sibling. None if the cut
is inherited (not owned at this storey) or the sibling is itself divided."""
cand = copy.deepcopy(root)
lvls = dom_mod.levels(cand)
if li >= len(lvls):
return None
node = lvls[li].by_id(lid)
if node is None or node.parent is None:
return None
parent = node.parent
if parent.below is not None and parent.below.divided:
return None
sibling = parent.right if parent.left is node else parent.left
if sibling is None or sibling.divided:
return None
parent.division = None
parent.left = parent.right = None
parent.type = sibling.type
dom_mod.link(cand)
geometry.clear_cache()
return cand
def run(progdir: str, seeds: int) -> None:
print(f"programme: {progdir}, {seeds} constructed seeds")
print("a healthy objective rewards NO deletions\n")
header = f"{'mode':<20}{'buried':<14}{'lit':<14}{'all':<14}median x"
print(header)
print("-" * len(header))
for mode in MODES:
fit = make_fitness(progdir, mode)
counts = {"buried": [0, 0], "lit": [0, 0]}
ratios = []
for s in range(seeds):
root = constructed_seed(progdir, s)
base, _ = fit.score_with_fails(copy.deepcopy(root))
for li, lid, _typ, exposed in unpinned_leaves(fit, root):
cand = delete_leaf(root, li, lid)
if cand is None:
continue
score, _ = fit.score_with_fails(copy.deepcopy(cand))
bucket = "buried" if exposed == 0 else "lit"
counts[bucket][1] += 1
ratios.append(score / base)
if score > base:
counts[bucket][0] += 1
tot = [counts["buried"][0] + counts["lit"][0],
counts["buried"][1] + counts["lit"][1]]
median = sorted(ratios)[len(ratios) // 2] if ratios else float("nan")
buried = "%d/%d" % tuple(counts["buried"])
lit = "%d/%d" % tuple(counts["lit"])
both = "%d/%d" % tuple(tot)
print(f"{mode:<20}{buried:<14}{lit:<14}{both:<14}x{median:.2f}")
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("--progdir", default="examples/harbor-house")
ap.add_argument("--seeds", type=int, default=3)
args = ap.parse_args()
run(args.progdir, args.seeds)
if __name__ == "__main__":
main()

168
experiments/ab_report.py Normal file
View file

@ -0,0 +1,168 @@
"""Paired A/B reporting that states what the sample could actually resolve.
Motivation (`homemaker-py-tco`). Two findings in DESIGN.md §38.19 and §38.21 say
this project's A/B protocols are routinely underpowered for the margins they
report:
* programme-house needed N=60 to resolve an effect its own protocol claimed at
N=20 -- at N=20 the current answer is p ~= 0.069, a null;
* harbor's paired sd is ~6.2 fails, so n=3 resolves nothing finer than ~15
fails. Every recorded harbor margin is below that, and 25% of 3-seed subsets
show a clean 3/3 sweep by chance.
Both were only discovered years later. The cheap prevention is to print, beside
every verdict, the smallest difference the sample could have detected -- so an
underpowered result is visible AT THE POINT IT IS MADE.
minimum detectable difference (MDD) = t_crit(0.975, N-1) * sd / sqrt(N)
A margin below the MDD is not a weak result, it is an ABSENT one: the experiment
could not have distinguished it from zero however it came out. `paired_report`
flags exactly that, and reports the N that would be needed instead.
Usage as a library::
from ab_report import paired_report, format_report
print(format_report(paired_report(off_list, on_list, "OFF", "ON")))
Usage as a CLI over a results TSV with `tag seed arm value [...]` rows::
python experiments/ab_report.py results/0wr_qpk_harbor_n24.tsv off on
"""
from __future__ import annotations
import csv
import math
import statistics
import sys
try: # scipy is a hard dep of the
from scipy import stats as _sps # project, but keep the
except ImportError: # report usable without it
_sps = None
def _t_crit(df: int, alpha: float = 0.05) -> float:
if _sps is not None:
return float(_sps.t.ppf(1 - alpha / 2, df))
return 1.96 if df > 30 else 2.2 # crude, only for a scipy-less fallback
def paired_report(a: list[float], b: list[float],
label_a: str = "A", label_b: str = "B",
alpha: float = 0.05) -> dict:
"""Paired comparison of two arms measured on the same seeds.
``a`` and ``b`` are aligned per seed. Positive ``mean_diff`` means ``b``
scored LOWER than ``a`` -- for fail counts, that is ``b`` winning.
"""
if len(a) != len(b):
raise ValueError(f"unpaired input: {len(a)} vs {len(b)}")
n = len(a)
if n < 2:
raise ValueError("need at least 2 paired observations")
diffs = [x - y for x, y in zip(a, b)]
mean = statistics.mean(diffs)
sd = statistics.stdev(diffs)
se = sd / math.sqrt(n)
tc = _t_crit(n - 1, alpha)
mdd = tc * se # smallest |mean| this N could resolve
# Degenerate case: every seed gave the SAME difference, so sd == 0 and the
# MDD collapses to 0. Without this, an all-ties comparison (mean 0, sd 0)
# reports "margin exceeds the MDD" and endorses a zero margin as a verdict,
# which is worse than saying nothing. t/p are nan here too.
degenerate = sd == 0.0
out = {
"n": n, "label_a": label_a, "label_b": label_b,
"mean_a": statistics.mean(a), "mean_b": statistics.mean(b),
"wins_b": sum(1 for d in diffs if d > 0),
"losses_b": sum(1 for d in diffs if d < 0),
"ties": sum(1 for d in diffs if d == 0),
"mean_diff": mean, "sd": sd, "se": se,
"ci": (mean - tc * se, mean + tc * se),
"mdd": mdd,
"degenerate": degenerate,
"identical": degenerate and mean == 0.0,
"underpowered": (not degenerate) and abs(mean) < mdd,
"t": None, "p": None, "wilcoxon_p": None, "n_needed": None,
}
if _sps is not None and not degenerate:
t, p = _sps.ttest_rel(a, b)
out["t"], out["p"] = float(t), float(p)
if any(d != 0 for d in diffs):
try:
out["wilcoxon_p"] = float(_sps.wilcoxon(a, b).pvalue)
except ValueError:
pass
if mean and not degenerate: # N that would resolve THIS margin
k = n
while k < 100000 and _t_crit(k - 1, alpha) * sd / math.sqrt(k) >= abs(mean):
k += 1
out["n_needed"] = k
return out
def format_report(r: dict, indent: str = " ") -> str:
L = []
A, B = r["label_a"], r["label_b"]
L.append(f"{indent}N={r['n']} {A} mean {r['mean_a']:.2f} {B} mean {r['mean_b']:.2f} "
f"{r['wins_b']}W/{r['losses_b']}L/{r['ties']}T (for {B})")
L.append(f"{indent}mean diff {r['mean_diff']:+.3f} sd {r['sd']:.3f} "
f"95% CI [{r['ci'][0]:+.3f}, {r['ci'][1]:+.3f}]")
if r["p"] is not None:
w = "" if r["wilcoxon_p"] is None else f" wilcoxon p={r['wilcoxon_p']:.4f}"
L.append(f"{indent}t={r['t']:.3f} p={r['p']:.4f}{w}")
if r["identical"]:
L.append(f"{indent}** NO DIFFERENCE: the two arms scored identically on every seed.")
L.append(f"{indent} Nothing to test -- do not report a winner.")
return "\n".join(L)
if r["degenerate"]:
L.append(f"{indent}** Every seed gave the same difference ({r['mean_diff']:+.3f}), "
f"so the variance is zero.")
L.append(f"{indent} Consistent, but a t-test is undefined here; treat N as the "
f"evidence and check the arms are genuinely independent.")
return "\n".join(L)
L.append(f"{indent}minimum detectable difference at N={r['n']}: {r['mdd']:.3f}")
if r["underpowered"]:
need = r["n_needed"]
L.append(f"{indent}** UNDERPOWERED: the observed margin ({abs(r['mean_diff']):.3f}) is "
f"BELOW what N={r['n']} can resolve.")
L.append(f"{indent} This experiment could not distinguish it from zero however it "
f"came out. Do not declare a winner.")
if need:
L.append(f"{indent} N ~= {need} would be needed for a margin this size.")
else:
L.append(f"{indent} margin exceeds the MDD -- the sample can support a verdict.")
return "\n".join(L)
def main() -> int:
if len(sys.argv) < 4:
print(__doc__.strip().splitlines()[-1], file=sys.stderr)
print("usage: ab_report.py <results.tsv> <arm_a> <arm_b> [value_col=3]",
file=sys.stderr)
return 2
path, arm_a, arm_b = sys.argv[1], sys.argv[2], sys.argv[3]
col = int(sys.argv[4]) if len(sys.argv) > 4 else 3
by: dict = {}
with open(path) as fh:
for row in csv.reader(fh, delimiter="\t"):
if len(row) <= col or not row[1].lstrip("-").isdigit():
continue # header / short row
by.setdefault(int(row[1]), {})[row[2]] = float(row[col])
seeds = sorted(s for s, v in by.items() if arm_a in v and arm_b in v)
if len(seeds) < 2:
print(f"only {len(seeds)} paired seed(s) for {arm_a!r}/{arm_b!r}", file=sys.stderr)
return 1
a = [by[s][arm_a] for s in seeds]
b = [by[s][arm_b] for s in seeds]
print(f"{path} {arm_a} vs {arm_b}")
print(format_report(paired_report(a, b, arm_a, arm_b)))
return 0
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -0,0 +1,165 @@
"""Fixed-budget search A/B for the crinkliness modes (`homemaker-py-ssz`).
DESIGN.md §38.6 A/B'd the modes against the §38.2 *deletion test*, which has
since been retracted, and it used the pre-§39.4 `type[:1] in ("C","O")` prefix
rule that mislabels programme rooms as circulation. So the modes have never
been measured against what `ssz`'s acceptance criteria actually asks for: a
fixed-budget search, hard/soft fail split, on harbor-house and maple-court.
**The scoring discipline is the point of this script.** `compact_ok`,
`exempt_circulation` and `compact_ok` all return 1.0 for leaves that stock
scores below FAIL_THRESHOLD, so scoring an arm under its own objective deletes
a fail category for free and every arm "wins". Two numbers are therefore
reported per arm:
urb the arm's final layout re-scored under the STOCK objective. This is
the comparable yardstick, and the one that answers "did optimising
under this variant steer the search to a better building?"
own the same layout under the arm's own objective. Lower than `urb` by
construction for the permissive modes; it is reported only so the
size of the definitional discount is visible, never as the result.
A mode passes on `urb`, not on `own`.
Usage::
python experiments/ab_ssz_search.py --budget 3000 --seeds 3
python experiments/ab_ssz_search.py --modes urb compact_ok --seeds 2
"""
from __future__ import annotations
import argparse
import collections
import copy
import csv
import time
from pathlib import Path
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness
CORPUS = ["examples/harbor-house", "examples/maple-court"]
MODES = ["urb", "floor", "compact_ok", "exempt_circulation"]
def _with_mode(mode: str):
"""Patch `fitness.load_config` so every evaluator built during the run --
the driver's, the inner loop's, the seeder's -- sees `crinkliness_mode`.
`driver.search` has no parameter for it, and `driver._fitness_for` is
lru_cached on its arguments, so the cache is cleared around the patch or a
later arm would silently reuse the previous arm's evaluator.
"""
orig = fitness.load_config
def patched(directory, overrides=None):
ov = dict(overrides or {})
ov["crinkliness_mode"] = mode
return orig(directory, overrides=ov)
return orig, patched
def tiers(fails) -> tuple[int, int]:
c = collections.Counter(fitness.classify_fail_tier(f) for f in fails)
return c["hard"], c["soft"]
def run_arm(progdir: str, seed: int, mode: str, budget: int,
child_budget: int) -> dict:
orig, patched = _with_mode(mode)
fitness.load_config = patched
driver._fitness_for.cache_clear()
t0 = time.perf_counter()
try:
res = driver.search(
dom_mod.load(f"{progdir}/init.dom"), progdir,
budget=budget, seed=seed, child_budget=child_budget, n_workers=1)
root = copy.deepcopy(res.best.root)
own_conf, own_cost = patched(progdir, overrides={"leaf_sharing": True,
"collapse_insearch": True})
_, own_fails = fitness.Fitness(own_conf, own_cost).score_with_fails(
copy.deepcopy(root))
finally:
fitness.load_config = orig
driver._fitness_for.cache_clear()
# the comparable yardstick: stock objective, same layout
conf, cost = orig(progdir, overrides={"leaf_sharing": True,
"collapse_insearch": True})
_, urb_fails = fitness.Fitness(conf, cost).score_with_fails(copy.deepcopy(root))
uh, us = tiers(urb_fails)
oh, os_ = tiers(own_fails)
return dict(programme=Path(progdir).name, seed=seed, mode=mode,
urb_hard=uh, urb_soft=us, urb_total=uh + us,
own_hard=oh, own_soft=os_, own_total=oh + os_,
elapsed_s=round(time.perf_counter() - t0, 1))
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("--budget", type=int, default=3000)
ap.add_argument("--child-budget", type=int, default=80)
ap.add_argument("--seeds", type=int, default=3)
ap.add_argument("--modes", nargs="+", default=MODES)
ap.add_argument("--corpus", nargs="+", default=CORPUS)
ap.add_argument("--out", default="experiments/results/ab_ssz_search.csv")
args = ap.parse_args()
rows = []
out = Path(args.out)
out.parent.mkdir(parents=True, exist_ok=True)
for progdir in args.corpus:
for mode in args.modes:
for seed in range(args.seeds):
r = run_arm(progdir, seed, mode, args.budget, args.child_budget)
rows.append(r)
print(f" {r['programme']:<14} {mode:<20} seed={seed} "
f"urb {r['urb_hard']}h/{r['urb_soft']}s "
f"(own {r['own_hard']}h/{r['own_soft']}s) "
f"{r['elapsed_s']}s", flush=True)
with out.open("w", newline="") as fh:
w = csv.DictWriter(fh, fieldnames=list(rows[0]))
w.writeheader()
w.writerows(rows)
# homemaker-py-tco: report what this N could actually resolve, beside the
# result, so an underpowered verdict is visible when it is made. §38.19 and
# §38.21 are both cases where that was only noticed years later.
from ab_report import format_report, paired_report
base = args.modes[0]
for progdir in args.corpus:
name = Path(progdir).name
for mode in args.modes[1:]:
by = {}
for r in rows:
if r["programme"] == name and r["mode"] in (base, mode):
by.setdefault(r["seed"], {})[r["mode"]] = r["urb_hard"] + r["urb_soft"]
seeds = sorted(s for s, v in by.items() if base in v and mode in v)
if len(seeds) < 2:
continue
print(f"\n--- {name}: {mode} vs {base} (stock-scored total fails) ---")
print(format_report(paired_report(
[by[s][base] for s in seeds], [by[s][mode] for s in seeds], base, mode)))
print(f"\n=== stock-objective (urb) fail counts, budget {args.budget} ===")
print(f" {'programme':<14}{'mode':<22}{'hard':<14}{'soft':<14}total")
print(" " + "-" * 70)
for progdir in args.corpus:
name = Path(progdir).name
for mode in args.modes:
sel = [r for r in rows if r["programme"] == name and r["mode"] == mode]
if not sel:
continue
h = sum(r["urb_hard"] for r in sel) / len(sel)
s = sum(r["urb_soft"] for r in sel) / len(sel)
print(f" {name:<14}{mode:<22}{h:<14.1f}{s:<14.1f}{h + s:.1f}")
print(f"\nwrote {out}")
if __name__ == "__main__":
main()

View file

@ -1,81 +0,0 @@
#!/usr/bin/env python3
"""Acceptance run for the geometry inner loop (homemaker-py-1p0).
Gate (DESIGN.md §4.5, issue acceptance criteria): reproduce or exceed the
Nelder-Mead diagnostic gains x1.24 / x1.67 / x1.59, no new failures on
2f45907, candidate-002 and c964435, using the batched compass search.
Usage: accept_innerloop.py [budget] [method] (default: 200 oracle evals, cma)
"""
from __future__ import annotations
import shutil
import sys
import tempfile
import time
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import dom, innerloop, oracle # noqa: E402
URB = Path("/home/bruno/src/urb")
EX = URB / "examples" / "programme-house"
# name -> reference x-gain. Current bars are the occlusion-disabled re-baseline
# (homemaker-py-gp2): the deterministic-seed CMA run at budget 400 under
# URB_NO_OCCLUSION=1 — set that env var to reproduce. (The original §4.5
# Nelder-Mead bars, flag-off, were 1.24 / 1.67 / 1.59; the inner loop met them
# within noise, homemaker-py-1p0.)
GATE = {
"2f45907abd9accac2a124d311732f749.dom": 1.63,
"candidate-002.dom": 1.70,
"c964435454c459f86c3ed9a5a7621132.dom": 1.68,
}
# Bars are single optimiser draws and per-run variance brackets them
# (candidate-002 drew 0.0117-0.0160 against a 0.0123 flag-off bar).
# Reproduction within 1% counts as met — decision approved 2026-06-12
# (homemaker-py-1p0); chasing the last fraction with seed rolls would be
# cherry-picking.
NOISE_TOL = 0.99
def main() -> int:
budget = int(sys.argv[1]) if len(sys.argv) > 1 else 200
method = sys.argv[2] if len(sys.argv) > 2 else "cma"
print(f"method={method} budget={budget}")
all_ok = True
with tempfile.TemporaryDirectory(prefix="accept_innerloop_") as tmp:
scratch = Path(tmp)
shutil.copy(EX / "patterns.config", scratch)
for name, bar in GATE.items():
# Baseline = the UNMODIFIED original file, exactly as §4.5 measured
# it. The inner loop's own x0 score is the equal-offset *projection*
# of the original (a==b forced, clipped), which is lower for legacy
# designs with unequal cuts — gains must not be measured from there.
s_orig = oracle.score(shutil.copy(EX / name, scratch), URB)
root = dom.load(str(EX / name))
t0 = time.perf_counter()
r = innerloop.optimise(root, EX, budget=budget, method=method, urb_root=URB)
dt = time.perf_counter() - t0
gain = r.fitness / s_orig.fitness if s_orig.fitness else float("inf")
ok = gain >= bar * NOISE_TOL and r.n_fails <= s_orig.n_fails
all_ok &= ok
print(
f"{name:42s} dof={len(r.x):2d} "
f"orig={s_orig.fitness:.6g}(fails {s_orig.n_fails}) "
f"projected x0={r.x0_fitness:.6g}(fails {r.x0_n_fails}) "
f"opt={r.fitness:.6g}(fails {r.n_fails}) "
f"x{gain:.2f} (bar x{bar:.2f}) "
f"{r.n_evals} evals / {r.n_oracle_calls} oracle calls / {dt:.0f}s "
f"{'PASS' if ok else 'FAIL'}",
flush=True,
)
print("\nGATE " + ("PASSED" if all_ok else "FAILED"))
return 0 if all_ok else 1
if __name__ == "__main__":
sys.exit(main())

View file

@ -0,0 +1,156 @@
"""Are the crinkliness failures the objective emits real defects? (`homemaker-py-ssz`)
Not an A/B. This asks a correctness question the search cannot answer: of the
`crinkliness` failures the GLOBAL-target objective reports -- one daylight
requirement for every space, which is what the engine did before §38.10 -- how
many are on a space that does not want daylight at all?
A `crinkliness` fail says "this leaf has too little exposed wall for its area".
For anything occupied day to day that is a real defect. For a cupboard, a store
or a plant room it is not.
**The classification is read from the corpus, not guessed here.** A fail counts
as a non-defect exactly when that space declares `crinkliness: none` in its own
`patterns.config`. An earlier version of this script inferred it from `usage:`
instead and got a much larger, wrong answer -- it exempted corridors, WCs,
laundries and reception, none of which the owner exempts (DESIGN.md §38.11).
Corridors, courtyards and every occupied room want daylight.
Usage::
python experiments/audit_crinkliness_truth.py
python experiments/audit_crinkliness_truth.py --seeds 5
python experiments/audit_crinkliness_truth.py --dom examples/harbor-house/generated.dom
"""
from __future__ import annotations
import argparse
import collections
import copy
from pathlib import Path
import numpy as np
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness, geometry
from homemaker_layout import graph as graph_mod
from homemaker_layout import operators, programme
CORPUS = ["examples/harbor-house", "examples/maple-court", "examples/health-centre"]
# Ruled by the project owner: only rooms that are not occupied from day to day
# -- a cupboard, a store, a plant room -- do without daylight. Corridors need
# it. So does everything else: WCs, laundries, reception, waiting rooms,
# offices, consulting rooms. Which spaces those are is read from the configs
# themselves (a declared `crinkliness: none`), never inferred here.
def stock_fitness(progdir: str) -> fitness.Fitness:
"""Stock objective -- `crinkliness_mode` left at its "urb" default."""
ov = dict(driver._overrides_for(
leaf_sharing=True, superpose=False, max_share=None, conn_grade=False,
collapse_insearch=True, multi_use=False) or {})
conf, cost = fitness.load_config(progdir, overrides=ov)
return fitness.Fitness(conf, cost)
def constructed(progdir: str, s: int) -> dom_mod.Node:
reqs = programme.load_programme_dir(progdir)
return operators.constructive_topology(
dom_mod.load(f"{progdir}/init.dom"), reqs, np.random.default_rng(s),
sorted(reqs) + ["C", "O"], min_storeys=programme.storey_minimum(progdir),
adjacency_aware=True, proportion_aware=True, circ_divisor=3,
leaf_sharing=True, leaf_share_factor=3, depth_balanced=True,
interior_outside=True, outside_divisor=3)
def audit(fit: fitness.Fitness, root: dom_mod.Node) -> collections.Counter:
"""label -> count over the leaves that fail under ONE GLOBAL daylight target.
Each is labelled with the leaf's usage, and marked exempt when that space
declares `crinkliness: none` -- i.e. when the failure the old objective
emitted was not a defect.
"""
tree = copy.deepcopy(root)
geometry.clear_cache()
dom_mod.canonicalize_shares(tree)
fit.preprocess_building(tree)
dom_mod.merge_divided(tree)
geometry.clear_cache()
graphs = graph_mod.build_graphs(tree, fit.conf("door_width") or 1.2)
out: collections.Counter = collections.Counter()
for li, lvl in enumerate(dom_mod.levels(tree)):
groups = geometry.boundary_groups(lvl)
for leaf in lvl.leaves():
if dom_mod.is_outside(leaf) and not dom_mod.is_covered(leaf):
continue
# the PRE-§38.10 objective: one global target for every leaf
crink = fit.crinkliness(leaf, graphs[li], groups)
if crink:
distance, sigma = fit.conf("uncrinkliness")
q = fitness.gaussian(1 / crink, 1.0, distance, sigma)
else:
q = 0.0
if q >= fitness.FAIL_THRESHOLD:
continue # not a failure even then
label = fit.usage_of(leaf) or f"<generic {leaf.type}>"
if fit.crinkliness_params(leaf) is None:
label += " [declares crinkliness: none]"
out[label] += 1
return out
def report(label: str, tally: collections.Counter) -> tuple[int, int]:
total = sum(tally.values())
real = sum(n for u, n in tally.items() if "crinkliness: none" not in u)
print(f"=== {label}: {total} crinkliness fails")
if not total:
print(" none\n")
return 0, 0
for usage, n in tally.most_common():
verdict = ("not a defect -- not occupied day to day"
if "crinkliness: none" in usage else "REAL DEFECT")
print(f" {usage:<44}{n:>4} {verdict}")
print(f" -> {total - real}/{total} ({100 * (total - real) / total:.0f}%) "
f"are reported against spaces that do not want daylight\n")
return real, total
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("--seeds", type=int, default=3)
ap.add_argument("--corpus", nargs="+", default=CORPUS)
ap.add_argument("--dom", nargs="*", default=[],
help="also audit these evolved .dom files (programme dir inferred)")
args = ap.parse_args()
print("Stock objective. Every fail classified by the leaf's declared usage.\n")
grand_real = grand_total = 0
for progdir in args.corpus:
fit = stock_fitness(progdir)
tally: collections.Counter = collections.Counter()
for s in range(args.seeds):
tally += audit(fit, constructed(progdir, s))
r, t = report(f"{Path(progdir).name} ({args.seeds} constructed seeds)", tally)
grand_real += r
grand_total += t
for dom_path in args.dom:
progdir = str(Path(dom_path).parent)
fit = stock_fitness(progdir)
r, t = report(f"{dom_path} (evolved)", audit(fit, dom_mod.load(dom_path)))
grand_real += r
grand_total += t
if grand_total:
print(f"OVERALL: {grand_total - grand_real}/{grand_total} "
f"({100 * (grand_total - grand_real) / grand_total:.0f}%) of the "
f"crinkliness failures the objective reports are not defects.")
if __name__ == "__main__":
main()

View file

@ -0,0 +1,339 @@
"""Per-room-spec satisfiability audit of `patterns.config` targets.
Evidence for `homemaker-py-2v1`/`ssz`/`tdp` (DESIGN.md §38/§39). The corpus
configs were estimated years ago on the principle that exact values do not
matter for getting the engine working. This asks the opposite question: **does
any individual room spec make itself impossible to satisfy?**
For one room code, model the leaf as a rectangle of area ``A`` and aspect
``r = w/h >= 1`` (``h`` is `length_narrowest`, the width metric). The
FAIL_THRESHOLD-inverted bounds come from the already-validated
``shapecurve.leaf_constraints`` (§37.2), so this is not a reimplementation of
the Gaussians:
* size ``amin <= A <= amax``
* width ``h >= wmin`` => ``r <= A / wmin^2``
* proportion ``r <= rmax``
* crinkliness ``L_exposed >= A / (X * height)`` with ``X = 1.6202`` (§38.3)
The last one depends on how much of the leaf's boundary is external, which is a
*placement* property, not a spec property so the audit reports the **minimum
number of exposed sides** each spec needs. A spec needing 2 adjacent sides is
demanding a corner; a rectangular storey has only four corners, so a programme
wanting more corner rooms than the plot has corners is over-subscribed before
the search starts.
**Two different questions, and §39.1 answered only the weaker one**
(`homemaker-py-u5q`, DESIGN.md §39.15). Sweeping the whole tolerance box asks
"is SOME shape in this spec's box feasible?" and every corpus spec passes it.
But a tolerance is not a design intent: the author declared a target area and a
target aspect, and those are the room they asked for. Asking "is the room AS
DECLARED feasible?" is a different question, and six corpus specs fail it —
all on daylight, all of them the big rooms. `at-target` below is that column.
A spec can be "feasible" only at the bottom of its area tolerance and the top
of its aspect tolerance, which means the search can satisfy it only by building
something the author did not ask for.
Usage::
python experiments/audit_programme_config.py
python experiments/audit_programme_config.py examples/harbor-house --verbose
"""
from __future__ import annotations
import argparse
import math
from pathlib import Path
import numpy as np
import yaml
from homemaker_layout import dom, fitness, programme, shapecurve
from homemaker_layout.dom import Node
# 1/crink bounds from §38.3; recomputed from the live conf, never hard-coded.
def crink_bounds(fit: fitness.Fitness, circulation: bool = False) -> tuple[float, float]:
key = "uncrinkliness_circulation" if circulation else "uncrinkliness"
target, sigma = fit.conf(key)
k = math.sqrt(-2 * sigma * sigma
* math.log(fitness.FAIL_THRESHOLD) / math.log(fitness._E))
return target + k, max(1e-12, target - k)
# Exposure patterns, cheapest first: name -> exposed length given (w, h), w >= h.
EXPOSURE = [
("1 short side", lambda w, h: h),
("1 long side", lambda w, h: w),
("2 adjacent (corner)", lambda w, h: w + h),
("2 opposite long", lambda w, h: 2 * w),
("3 sides", lambda w, h: 2 * h + w),
("4 sides (freestanding)", lambda w, h: 2 * (w + h)),
]
def _synthetic_leaf(code: str) -> Node:
"""A bare typed leaf — ``leaf_constraints`` reads only its type/flags."""
return Node(node=[[0.0, 0.0], [4.0, 0.0], [4.0, 4.0], [0.0, 4.0]], type=code)
def audit_code(fit: fitness.Fitness, code: str, height: float,
grid: int = 240) -> dict:
"""Feasibility of one room spec, and the exposure it needs."""
bounds = shapecurve.leaf_constraints(fit, _synthetic_leaf(code))
amin, amax, wmin, rmax = bounds.amin, bounds.amax, bounds.wmin, bounds.rmax
if not math.isfinite(amax):
amax = max(amin * 4, 200.0)
hi, lo = crink_bounds(fit, circulation=code[:1].lower() == "c")
areas = np.linspace(max(amin, 1e-6), amax, grid)
ratios = np.linspace(1.0, max(rmax, 1.0), grid)
A, R = np.meshgrid(areas, ratios, indexing="ij")
W, H = np.sqrt(A * R), np.sqrt(A / R)
swp = (H >= wmin) & (R <= rmax) # size is satisfied by construction
result = {"code": code, "amin": amin, "amax": amax, "wmin": wmin,
"rmax": rmax, "swp": bool(swp.any()), "needs": None,
"swp_only_at": None}
if not result["swp"]:
return result
# smallest square-ish area that satisfies width at r=1, for the report
result["swp_only_at"] = float(max(amin, wmin * wmin))
for name, length_of in EXPOSURE:
L = length_of(W, H)
crink_ok = (L >= A / (hi * height)) & (L <= A / (lo * height))
if bool((swp & crink_ok).any()):
result["needs"] = name
break
# ...and the sharper question: the room AS DECLARED, not merely some room
# inside its tolerances. Target area at target aspect is what the author
# asked for; a spec feasible only at the edge of its box is one the search
# can satisfy only by building something else. (u5q, §39.15)
result.update(_audit_at_target(fit, code, height, hi, lo))
return result
def _audit_at_target(fit: fitness.Fitness, code: str, height: float,
hi: float, lo: float) -> dict:
"""Score the declared target area at the declared target aspect."""
sp = fit.spaces.get(code)
if sp is None:
return {"at_target": None, "at_target_needs": None}
size = fit.get_space_params(code, "size")
prop = fit.get_space_params(code, "proportion")
wid = fit.get_space_params(code, "width")
area, ratio = size[0], prop[0]
if not (area > 0 and ratio >= 1):
return {"at_target": None, "at_target_needs": None}
long_side, short_side = math.sqrt(area * ratio), math.sqrt(area / ratio)
bad = []
if fitness.gaussian(area, 1.0, size[0], size[1]) < fitness.FAIL_THRESHOLD:
bad.append("size")
if fitness._clipped_gaussian(short_side, wid[0], wid[1],
"above") < fitness.FAIL_THRESHOLD:
bad.append("width")
if fitness._clipped_gaussian(ratio, prop[0], prop[1],
"below") < fitness.FAIL_THRESHOLD:
bad.append("proportion")
needs = None
declares_light = "crinkliness" not in sp or sp.get("crinkliness") is not None
if declares_light:
for name, length_of in EXPOSURE:
L = length_of(long_side, short_side)
if area / (hi * height) <= L <= area / (lo * height):
needs = name
break
if needs is None:
bad.append("crinkliness")
return {"at_target": bad, "at_target_needs": needs}
# The SEMANTIC (usage) prefixes. Unlike the generic types these classify
# PROGRAMME CODES by first letter, and they are still prefix-based by design —
# it is how Urb encodes room usage. graph.has_circulation strips edges based on
# them (a "bedroom" loses its edges to living/kitchen/bedroom/toilet; a "toilet"
# loses its edges to outside/living/kitchen/toilet), and fitness.access /
# public-access read them too. So a code that picks one up by accident is
# silently given another room's connectivity rules.
USAGE_PREFIXES = {"b": "bedroom", "t": "toilet", "l": "living", "k": "kitchen"}
def audit_usage(progdir: str) -> list[tuple[str, str, str]]:
"""Report which programme codes acquire a usage class from their spelling."""
reqs = programme.load_programme_dir(progdir)
hits = [(c, USAGE_PREFIXES[c[:1].lower()], reqs[c].name)
for c in sorted(reqs) if c[:1].lower() in USAGE_PREFIXES]
if not hits:
print(f"=== {Path(progdir).name}: no code carries a usage prefix\n")
return []
print(f"=== {Path(progdir).name}: {len(hits)} code(s) carry a usage prefix")
for code, usage, name in hits:
# crude but useful: does the human-readable name agree with the usage?
agrees = usage[:3] in (name or "").lower() or {
"toilet": ("wc", "bathroom", "toilet", "ensuite"),
"bedroom": ("bedroom",), "living": ("living", "lounge"),
"kitchen": ("kitchen",)}.get(usage, ())
ok = any(w in (name or "").lower() for w in (
agrees if isinstance(agrees, tuple) else (usage,)))
flag = "" if ok else " <-- name disagrees with the usage it is given"
print(f" {code:<6} -> {usage:<8} (name: {name}){flag}")
print()
return hits
def audit_namespace(progdir: str) -> int:
"""Report programme codes that collide with the generic type prefixes.
Urb's type system is prefix-based — a type starting with ``c`` is
circulation, ``o``/``s`` is outside and programme codes live in the *same
namespace*. So a room code that happens to start with one of those letters
is silently reinterpreted as a generic type. Three separate consequences,
none of them announced anywhere in the output:
1. ``graph.check_space_counts`` **skips the code entirely**
(``if code[0].lower() in ("c", "o", "s"): continue``) the room is never
required, never counted, and never produces a missing/too-many failure.
2. ``Fitness.get_space_params`` returns the generic
``*_circulation``/``*_outside`` parameters *before* consulting the
programme, so declared size/width/proportion are overridden.
3. ``dom.is_circulation``/``is_outside`` become true, changing the leaf's
value rate, its crinkliness treatment, and whether it supplies daylight
to its neighbours.
"""
reqs = programme.load_programme_dir(progdir)
conf, cost = fitness.load_config(progdir)
fit = fitness.Fitness(conf, cost)
spaces = conf.get("spaces") or {}
hits = [c for c in sorted(reqs) if c[:1].lower() in ("c", "o", "s")]
total = sum(r.count for r in reqs.values())
if not hits:
print(f"=== {Path(progdir).name}: namespace clean "
f"({len(reqs)} codes / {total} instances)\n")
return 0
skipped = sum(reqs[c].count for c in hits)
print(f"=== {Path(progdir).name}: {len(hits)} code(s) collide with the "
f"generic c/o/s type prefixes")
print(f" {skipped} of {total} room instances ({100 * skipped / total:.0f}%) "
f"are SILENTLY OPTIONAL — check_space_counts skips them\n")
for code in hits:
spec = spaces.get(code, {})
leaf = _synthetic_leaf(code)
print(f" {code} \"{reqs[code].name}\" (count {reqs[code].count})")
for param in ("size", "width", "proportion"):
declared = spec.get(param)
effective = fit.get_space_params(code, param)
flag = "" if declared == effective else " <-- OVERRIDDEN"
print(f" {param:<11} declared={str(declared):<16} "
f"effective={effective}{flag}")
print(f" is_circulation={dom.is_circulation(leaf)} "
f"is_outside={dom.is_outside(leaf)} "
f"value_rate={fit.value_rate(leaf)} (inside={fit.conf('value_inside')})")
print()
return skipped
def _multi_aspect(pattern: str) -> bool:
"""True if this exposure pattern needs more than one wall to the outside."""
return any(k in pattern for k in ("corner", "opposite", "3 sides", "4 sides"))
def audit(progdir: str, verbose: bool) -> tuple[int, int]:
reqs = programme.load_programme_dir(progdir)
conf, cost = fitness.load_config(progdir)
fit = fitness.Fitness(conf, cost)
seed = yaml.safe_load(open(f"{progdir}/init.dom"))
height = seed.get("height") or 3.0
print(f"=== {Path(progdir).name} (height {height} m)")
hdr = (f" {'code':<7}{'count':<7}{'area ok':<18}{'min width':<11}"
f"{'max aspect':<12}{'needs (anywhere in box)':<26}at declared target")
print(hdr)
print(" " + "-" * (len(hdr) - 2))
impossible = corner_demand = as_declared = as_declared_corner = 0
for code in sorted(reqs) + ["C", "O"]:
count = reqs[code].count if code in reqs else 0
r = audit_code(fit, code, height)
at = r.get("at_target")
if at:
as_declared += max(count, 1)
target_col = "FAILS " + ",".join(at)
elif at is None:
target_col = "-"
else:
target_col = (r.get("at_target_needs") or "ok")
if _multi_aspect(target_col):
as_declared_corner += max(count, 1)
if not r["swp"]:
verdict = "IMPOSSIBLE (size/width/proportion contradict)"
impossible += max(count, 1)
elif r["needs"] is None:
verdict = "IMPOSSIBLE even fully exposed (crinkliness)"
impossible += max(count, 1)
else:
verdict = r["needs"]
if _multi_aspect(verdict):
corner_demand += max(count, 1)
area_col = "%.1f-%.1f m2" % (r["amin"], r["amax"])
width_col = "%.2f m" % r["wmin"]
aspect_col = "%.2f" % r["rmax"]
count_col = str(count) if count else "-"
print(f" {code:<7}{count_col:<7}{area_col:<18}"
f"{width_col:<11}{aspect_col:<12}{verdict:<26}{target_col}")
print(f"\n room instances that are impossible as specified : {impossible}")
print(f" room instances requiring >=2 exposed sides : {corner_demand}"
f" (a rectangular storey has 4 corners)")
print(f" room instances that FAIL AS DECLARED : {as_declared}"
f" (target area at target aspect)")
print(f" room instances needing >=2 sides AS DECLARED : "
f"{as_declared_corner}")
if as_declared_corner:
need = -(-as_declared_corner // 4) # ceil
print(f" ^ a rectangular storey offers 4 corners, so these alone need "
f">= {need} storey(s)\n"
f" and claim {as_declared_corner} of the 4*S corners a "
f"S-storey building has, leaving\n"
f" 4*S - {as_declared_corner} for every other room. They are "
f"satisfiable single-aspect only by\n"
f" shrinking toward the bottom of their area tolerance and "
f"stretching toward the\n"
f" top of their aspect one -- i.e. by building something "
f"other than what was\n"
f" asked for. (The seed init.dom is one storey for every "
f"corpus programme;\n"
f" the search grows the rest, so the corner budget is not "
f"fixed in advance.)")
print()
return impossible, corner_demand
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("progdir", nargs="?", default=None)
ap.add_argument("--verbose", action="store_true")
args = ap.parse_args()
dirs = [args.progdir] if args.progdir else [
"examples/harbor-house", "examples/maple-court",
"examples/health-centre", "examples/programme-house"]
print("### namespace collisions (generic C/O/S structural types)\n")
for d in dirs:
audit_namespace(d)
print("### usage prefixes (b/t/l/k -- still prefix-based, by design)\n")
for d in dirs:
audit_usage(d)
print("### per-room-spec satisfiability\n")
for d in dirs:
audit(d, args.verbose)
if __name__ == "__main__":
main()

View file

@ -1,224 +0,0 @@
#!/usr/bin/env python3
"""Inner-loop optimiser bake-off at equal oracle budgets (homemaker-py-d0s).
DESIGN.md §7 Phase 1(b), §8.3. DOF is only rooms1 (67 on the corpus), so
the question is fitness gained per oracle evaluation, not asymptotic power.
Candidates:
nm multi-start Nelder-Mead (scipy) the §4.5 diagnostic optimiser.
Inherently sequential: ONE dom per oracle call, so the Perl
startup never amortises (§4.6).
cma multi-phase CMA-ES (innerloop.cma_search), one batched oracle
call per generation.
compass single-start batched compass search with pattern moves + random
augmentation (innerloop.compass_search).
compass-ms multi-start compass: budget split across restarts (x0 first,
then random starts), global best kept.
Protocol: cold start from each file's equal-offset projection (x_current),
one run per (method, file, seed), best-so-far recorded after every oracle
call. Fitness-at-budget-B is read off the trace (evals B), so methods are
compared at exactly equal budgets regardless of batch granularity; checkpoint
budgets bracket the driver's real operating points (child_budget=80 warm,
seed_budget=200 cold). Wall-clock and oracle-invocation counts are recorded
per run.
Runs under URB_NO_OCCLUSION=1 (set by this script the gp2 re-baseline flag;
all benchmarks must use it).
Usage: python3 experiments/bakeoff_innerloop.py [budget] [out.json]
(defaults: budget 200, experiments/bakeoff_innerloop.json)
"""
from __future__ import annotations
import json
import os
import shutil
import sys
import tempfile
import time
from pathlib import Path
import numpy as np
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import dom, innerloop, oracle # noqa: E402
URB = Path("/home/bruno/src/urb")
EX = URB / "examples" / "programme-house"
FILES = (
"2f45907abd9accac2a124d311732f749.dom",
"candidate-002.dom",
"c964435454c459f86c3ed9a5a7621132.dom",
)
SEEDS = (0, 1, 2)
CHECKPOINTS = (40, 80, 120, 200)
class TracingEvaluator(innerloop.OracleEvaluator):
"""Records (cumulative evals, batch-best fitness) after every oracle call."""
def __init__(self, *a, **kw):
super().__init__(*a, **kw)
self.trace: list[tuple[int, float]] = []
def evaluate(self, xs):
scores = super().evaluate(xs)
self.trace.append((self.n_evals, max(s.fitness for s in scores)))
return scores
def best_at(self, budget: int) -> float:
vals = [f for n, f in self.trace if n <= budget]
return max(vals) if vals else float("nan")
class _BudgetExhausted(Exception):
pass
def nm_search(ev, x0, budget=200, seed=0):
"""Multi-start Nelder-Mead: x0 first, random restarts until the budget is
spent. Sequential every evaluation is its own oracle invocation."""
from scipy.optimize import minimize
rng = np.random.default_rng(seed)
n = len(x0)
x = np.clip(np.asarray(x0, dtype=float), innerloop._EPS, 1 - innerloop._EPS)
s = ev.evaluate([x])[0]
best = innerloop.Result(
x=x.copy(), fitness=s.fitness, n_fails=s.n_fails, fail_lines=s.fail_lines,
x0_fitness=s.fitness, x0_n_fails=s.n_fails, n_evals=0, n_oracle_calls=0,
)
def f(xi):
if ev.n_evals >= budget:
raise _BudgetExhausted
sc = ev.evaluate([np.asarray(xi, dtype=float)])[0]
if sc.fitness > best.fitness:
best.x = np.asarray(xi, dtype=float).copy()
best.fitness = sc.fitness
best.n_fails = sc.n_fails
best.fail_lines = sc.fail_lines
return -sc.fitness
start = x.copy()
while ev.n_evals < budget:
try:
minimize(
f, start, method="Nelder-Mead",
bounds=[(innerloop._EPS, 1 - innerloop._EPS)] * n,
options={"maxfev": budget - ev.n_evals, "xatol": 1e-3, "fatol": 1e-10},
)
except _BudgetExhausted:
break
start = rng.uniform(0.1, 0.9, n) # restart
best.n_evals = ev.n_evals
best.n_oracle_calls = ev.n_oracle_calls
return best
def compass_ms_search(ev, x0, budget=200, seed=0, n_starts=3):
"""Multi-start compass: budget split evenly; first start is x0, the rest
random. compass_search counts against ev.n_evals, so phase budgets are
cumulative caps."""
rng = np.random.default_rng(seed)
n = len(x0)
best = None
for phase in range(n_starts):
phase_end = ev.n_evals + (budget - ev.n_evals) // (n_starts - phase)
start = np.asarray(x0, dtype=float) if phase == 0 else rng.uniform(0.1, 0.9, n)
r = innerloop.compass_search(ev, start, budget=phase_end, seed=seed + phase)
if best is None or r.fitness > best.fitness:
keep_x0 = best.x0_fitness if best is not None else r.x0_fitness
keep_x0f = best.x0_n_fails if best is not None else r.x0_n_fails
best = r
best.x0_fitness, best.x0_n_fails = keep_x0, keep_x0f
if ev.n_evals >= budget:
break
best.n_evals = ev.n_evals
best.n_oracle_calls = ev.n_oracle_calls
return best
METHODS = {
"nm": nm_search,
"cma": innerloop.cma_search,
"compass": innerloop.compass_search,
"compass-ms": compass_ms_search,
}
def main() -> int:
budget = int(sys.argv[1]) if len(sys.argv) > 1 else 200
out_path = Path(sys.argv[2]) if len(sys.argv) > 2 else (
Path(__file__).parent / "bakeoff_innerloop.json")
os.environ["URB_NO_OCCLUSION"] = "1"
checkpoints = [c for c in CHECKPOINTS if c <= budget] or [budget]
if checkpoints[-1] != budget:
checkpoints.append(budget)
# Baselines: the UNMODIFIED originals (gains measured from there, not from
# the equal-offset projection — accept_innerloop.py convention).
orig: dict[str, oracle.Score] = {}
with tempfile.TemporaryDirectory(prefix="bakeoff_orig_") as tmp:
shutil.copy(EX / "patterns.config", tmp)
for name in FILES:
orig[name] = oracle.score(shutil.copy(EX / name, tmp), URB)
runs = []
for name in FILES:
for method in METHODS:
for seed in SEEDS:
root = dom.load(str(EX / name))
with TracingEvaluator(root, EX, URB) as ev:
x0 = ev.x_current
t0 = time.perf_counter()
r = METHODS[method](ev, x0, budget=budget, seed=seed)
dt = time.perf_counter() - t0
run = {
"file": name, "method": method, "seed": seed,
"dof": len(x0),
"orig_fitness": orig[name].fitness,
"orig_n_fails": orig[name].n_fails,
"x0_fitness": r.x0_fitness, "x0_n_fails": r.x0_n_fails,
"best_at": {str(c): ev.best_at(c) for c in checkpoints},
"final_fitness": r.fitness, "final_n_fails": r.n_fails,
"n_evals": ev.n_evals, "n_oracle_calls": ev.n_oracle_calls,
"wall_s": dt,
}
runs.append(run)
gains = " ".join(
f"@{c}:x{run['best_at'][str(c)] / orig[name].fitness:.2f}"
for c in checkpoints)
print(
f"{name[:12]:12s} {method:10s} seed={seed} {gains} "
f"fails {orig[name].n_fails}->{r.n_fails} "
f"{ev.n_evals}ev/{ev.n_oracle_calls}calls {dt:.0f}s",
flush=True,
)
out_path.write_text(json.dumps(
{"budget": budget, "checkpoints": checkpoints, "runs": runs}, indent=1))
print(f"\nwrote {out_path}")
# Summary: mean gain over original at each checkpoint, mean s/eval.
print(f"\n{'method':10s} " + "".join(f"{'x@' + str(c):>8s}" for c in checkpoints)
+ f"{'s/eval':>8s}{'calls':>7s}{'fails+':>7s}")
for method in METHODS:
rs = [r for r in runs if r["method"] == method]
cols = ""
for c in checkpoints:
g = np.mean([r["best_at"][str(c)] / r["orig_fitness"] for r in rs])
cols += f"{g:8.2f}"
spe = np.mean([r["wall_s"] / r["n_evals"] for r in rs])
calls = np.mean([r["n_oracle_calls"] for r in rs])
newf = sum(r["final_n_fails"] > r["orig_n_fails"] for r in rs)
print(f"{method:10s} {cols}{spe:8.2f}{calls:7.0f}{newf:7d}")
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -1,207 +0,0 @@
#!/usr/bin/env python3
"""Inner-loop optimiser bake-off with native fitness (homemaker-py-d6d).
Re-runs the Phase 1 oracle bakeoff (bakeoff_innerloop.py / homemaker-py-d0s)
using the native Python fitness evaluator instead of the Perl oracle. The
oracle's 1 s/eval startup cost previously penalised sequential methods (NM);
with native fitness at ~70 evals/s that constraint is gone.
Candidates: nm, cma, compass, compass-ms (same as Phase 1).
Protocol: cold start from each file's equal-offset projection, one run per
(method, file, seed), best-so-far traced after every eval. Gains measured
relative to native baseline (native score of the unmodified original).
Usage: python3 experiments/bakeoff_native.py [budget] [out.json]
(defaults: budget 200, experiments/bakeoff_native.json)
"""
from __future__ import annotations
import json
import os
import sys
import time
from pathlib import Path
import numpy as np
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import dom, fitness as fit_mod, innerloop, solver # noqa: E402
EX = Path("/home/bruno/src/urb/examples/programme-house")
FILES = (
"2f45907abd9accac2a124d311732f749.dom",
"candidate-002.dom",
"c964435454c459f86c3ed9a5a7621132.dom",
)
SEEDS = (0, 1, 2)
CHECKPOINTS = (40, 80, 120, 200)
class NativeTracingEvaluator(innerloop.NativeEvaluator):
"""NativeEvaluator that records (cumulative evals, batch-best fitness)."""
def __init__(self, *a, **kw):
super().__init__(*a, **kw)
self.trace: list[tuple[int, float]] = []
def evaluate(self, xs):
scores = super().evaluate(xs)
self.trace.append((self.n_evals, max(s.fitness for s in scores)))
return scores
def best_at(self, budget: int) -> float:
vals = [f for n, f in self.trace if n <= budget]
return max(vals) if vals else float("nan")
class _BudgetExhausted(Exception):
pass
def nm_search(ev, x0, budget=200, seed=0):
"""Multi-start Nelder-Mead: x0 first, random restarts until budget spent."""
from scipy.optimize import minimize
rng = np.random.default_rng(seed)
n = len(x0)
x = np.clip(np.asarray(x0, dtype=float), innerloop._EPS, 1 - innerloop._EPS)
s = ev.evaluate([x])[0]
best = innerloop.Result(
x=x.copy(), fitness=s.fitness, n_fails=s.n_fails, fail_lines=s.fail_lines,
x0_fitness=s.fitness, x0_n_fails=s.n_fails, n_evals=0, n_oracle_calls=0,
)
def f(xi):
if ev.n_evals >= budget:
raise _BudgetExhausted
sc = ev.evaluate([np.asarray(xi, dtype=float)])[0]
if sc.fitness > best.fitness:
best.x = np.asarray(xi, dtype=float).copy()
best.fitness = sc.fitness
best.n_fails = sc.n_fails
best.fail_lines = sc.fail_lines
return -sc.fitness
start = x.copy()
while ev.n_evals < budget:
try:
minimize(
f, start, method="Nelder-Mead",
bounds=[(innerloop._EPS, 1 - innerloop._EPS)] * n,
options={"maxfev": budget - ev.n_evals, "xatol": 1e-3, "fatol": 1e-10},
)
except _BudgetExhausted:
break
start = rng.uniform(0.1, 0.9, n)
best.n_evals = ev.n_evals
best.n_oracle_calls = ev.n_oracle_calls
return best
def compass_ms_search(ev, x0, budget=200, seed=0, n_starts=3):
"""Multi-start compass: budget split evenly; first start is x0."""
rng = np.random.default_rng(seed)
n = len(x0)
best = None
for phase in range(n_starts):
phase_end = ev.n_evals + (budget - ev.n_evals) // (n_starts - phase)
start = np.asarray(x0, dtype=float) if phase == 0 else rng.uniform(0.1, 0.9, n)
r = innerloop.compass_search(ev, start, budget=phase_end, seed=seed + phase)
if best is None or r.fitness > best.fitness:
keep_x0 = best.x0_fitness if best is not None else r.x0_fitness
keep_x0f = best.x0_n_fails if best is not None else r.x0_n_fails
best = r
best.x0_fitness, best.x0_n_fails = keep_x0, keep_x0f
if ev.n_evals >= budget:
break
best.n_evals = ev.n_evals
best.n_oracle_calls = ev.n_oracle_calls
return best
METHODS = {
"nm": nm_search,
"cma": innerloop.cma_search,
"compass": innerloop.compass_search,
"compass-ms": compass_ms_search,
}
def native_baseline(path: Path) -> innerloop._NativeScore:
"""Native fitness of the unmodified file."""
root = dom.load(str(path))
conf, cost = fit_mod.load_config(EX)
fit = fit_mod.Fitness(conf, cost)
score, fails = fit.score_with_fails(root)
return innerloop._NativeScore(fitness=score, fail_lines=tuple(fails))
def main() -> int:
budget = int(sys.argv[1]) if len(sys.argv) > 1 else 200
out_path = Path(sys.argv[2]) if len(sys.argv) > 2 else (
Path(__file__).parent / "bakeoff_native.json")
os.environ["URB_NO_OCCLUSION"] = "1"
checkpoints = [c for c in CHECKPOINTS if c <= budget] or [budget]
if checkpoints[-1] != budget:
checkpoints.append(budget)
orig: dict[str, innerloop._NativeScore] = {}
for name in FILES:
orig[name] = native_baseline(EX / name)
runs = []
for name in FILES:
for method in METHODS:
for seed in SEEDS:
root = dom.load(str(EX / name))
ev = NativeTracingEvaluator(root, EX)
x0 = ev.x_current
t0 = time.perf_counter()
r = METHODS[method](ev, x0, budget=budget, seed=seed)
dt = time.perf_counter() - t0
run = {
"file": name, "method": method, "seed": seed,
"dof": len(x0),
"orig_fitness": orig[name].fitness,
"orig_n_fails": orig[name].n_fails,
"x0_fitness": r.x0_fitness, "x0_n_fails": r.x0_n_fails,
"best_at": {str(c): ev.best_at(c) for c in checkpoints},
"final_fitness": r.fitness, "final_n_fails": r.n_fails,
"n_evals": ev.n_evals, "n_oracle_calls": ev.n_oracle_calls,
"wall_s": dt,
}
runs.append(run)
gains = " ".join(
f"@{c}:x{run['best_at'][str(c)] / orig[name].fitness:.2f}"
for c in checkpoints)
print(
f"{name[:12]:12s} {method:10s} seed={seed} {gains} "
f"fails {orig[name].n_fails}->{r.n_fails} "
f"{ev.n_evals}ev {dt:.1f}s",
flush=True,
)
out_path.write_text(json.dumps(
{"budget": budget, "checkpoints": checkpoints, "runs": runs}, indent=1))
print(f"\nwrote {out_path}")
print(f"\n{'method':10s} " + "".join(f"{'x@' + str(c):>8s}" for c in checkpoints)
+ f"{'s/eval':>8s}{'fails+':>7s}")
for method in METHODS:
rs = [r for r in runs if r["method"] == method]
cols = ""
for c in checkpoints:
g = np.mean([r["best_at"][str(c)] / r["orig_fitness"] for r in rs])
cols += f"{g:8.3f}"
spe = np.mean([r["wall_s"] / r["n_evals"] for r in rs])
newf = sum(r["final_n_fails"] > r["orig_n_fails"] for r in rs)
print(f"{method:10s} {cols}{spe:8.4f}{newf:7d}")
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -1,67 +0,0 @@
#!/usr/bin/env python3
"""Validate and benchmark the batched oracle (homemaker-py-av5).
Copies the 35-file programme-house corpus into a scratch directory, scores
every file via single-file oracle calls and again via one batched invocation,
then checks the per-file fitness and failure sets are identical and reports
measured s/dom for both modes.
"""
from __future__ import annotations
import math
import shutil
import sys
import tempfile
import time
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import oracle # noqa: E402
URB = Path("/home/bruno/src/urb")
CORPUS = URB / "examples" / "programme-house"
def main() -> int:
with tempfile.TemporaryDirectory(prefix="bench_batch_") as tmp:
scratch = Path(tmp)
shutil.copy(CORPUS / "patterns.config", scratch)
doms = sorted(CORPUS.glob("*.dom"))
paths = [shutil.copy(d, scratch) for d in doms]
paths = [Path(p) for p in paths]
print(f"{len(paths)} corpus files -> {scratch}")
t0 = time.perf_counter()
singles = [oracle.score(p, URB) for p in paths]
t_single = time.perf_counter() - t0
t0 = time.perf_counter()
batch = oracle.score_batch(paths, URB)
t_batch = time.perf_counter() - t0
# Urb's score is nondeterministic at the ~1 ULP level (Perl hash-order
# summation), so compare fitness with a tight relative tolerance; any
# real semantic difference (e.g. occlusion handling) would be far larger.
mismatches = 0
for p, s, b in zip(paths, singles, batch):
if not math.isclose(s.fitness, b.fitness, rel_tol=1e-12) or s.fail_lines != b.fail_lines:
mismatches += 1
print(f"MISMATCH {p.name}: single {s.fitness:.12g} ({s.n_fails} fails) "
f"vs batch {b.fitness:.12g} ({b.n_fails} fails)")
print(f" single-only: {sorted(set(s.fail_lines) - set(b.fail_lines))}")
print(f" batch-only: {sorted(set(b.fail_lines) - set(s.fail_lines))}")
n = len(paths)
print(f"\nsingle-file: {t_single:.2f} s total, {t_single / n:.3f} s/dom")
print(f"batched: {t_batch:.2f} s total, {t_batch / n:.3f} s/dom")
print(f"speedup: x{t_single / t_batch:.2f}")
if mismatches:
print(f"\nFAIL: {mismatches}/{n} files differ between single and batch")
return 1
print(f"\nOK: all {n} files identical (fitness to 1e-12 rel, exact failure set) in both modes")
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -1,133 +0,0 @@
#!/usr/bin/env python3
"""Phase-2 gate: memetic loop vs urb-evolve at equal oracle-eval budgets
(homemaker-py-way).
Protocol: 3 seed designs x 2000-evaluation runs; the 1000-eval tier is read
from each run's own best-so-far log (no extra oracle time). urb-evolve runs
at two population sizes (its default 128, which only allows ~16 generations
at this budget, and 16, which allows ~130) and gets credit for its better
one. urb-evolve counts evaluations via the MAX_EVALS patch; the memetic
driver accounts natively. Both run under URB_NO_OCCLUSION=1 with the same
patterns.config; every final design is re-scored through urb-fitness.pl as
the common deterministic yardstick.
URB_NO_OCCLUSION=1 python3 experiments/benchmark_vs_urbevolve.py [budget]
"""
from __future__ import annotations
import os
import re
import shutil
import subprocess
import sys
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import oracle # noqa: E402
URB = Path("/home/bruno/src/urb")
EX = URB / "examples" / "programme-house"
HERE = Path(__file__).resolve().parent
WORK = HERE.parent / "scratch" / "benchmark"
SEEDS = ["init.dom", "c964435454c459f86c3ed9a5a7621132.dom",
"2f45907abd9accac2a124d311732f749.dom"]
CHECKPOINT_FRACTION = 0.5
def run_homemaker(seed: str, budget: int, cell: Path) -> dict:
out = cell / "best.dom"
proc = subprocess.run(
[sys.executable, str(HERE / "run_search.py"), str(budget), "0",
str(EX / seed), str(out)],
capture_output=True, text=True, env={**os.environ, "URB_NO_OCCLUSION": "1"},
)
(cell / "run.log").write_text(proc.stdout + proc.stderr)
series = [(int(m[1]), float(m[2])) for m in
re.finditer(r"\[\s*(\d+) evals\] best ([\d.e-]+)", proc.stdout)]
return {"series": series, "best_dom": out, "log_ok": proc.returncode == 0}
def run_urbevolve(seed: str, budget: int, cell: Path, pop: int) -> dict:
shutil.copy(EX / "patterns.config", cell)
shutil.copy(EX / seed, cell)
proc = subprocess.run(
["perl", f"-I{URB}/lib", str(URB / "bin" / "urb-evolve.pl"), seed],
cwd=cell, capture_output=True, text=True,
env={**os.environ, "URB_NO_OCCLUSION": "1", "MAX_EVALS": str(budget),
"MAX_POP": str(pop), "MAX_ITERATIONS": "100000"},
)
(cell / "run.log").write_text(proc.stderr)
series = []
evals = None
for line in proc.stderr.splitlines():
if m := re.search(r"Evals: (\d+)", line):
evals = int(m[1])
elif (m := re.search(r"Fitness: ([\d.e-]+)", line)) and evals is not None:
series.append((evals, float(m[1])))
out_hash = proc.stdout.strip().split()[-1] if proc.stdout.strip() else None
best = cell / f"{out_hash}.dom" if out_hash else None
return {"series": series, "best_dom": best,
"log_ok": proc.returncode == 0 and best is not None and best.exists()}
def best_at(series: list[tuple[int, float]], budget: int) -> float:
vals = [f for e, f in series if e <= budget]
return max(vals) if vals else float("nan")
def main() -> int:
budget = int(sys.argv[1]) if len(sys.argv) > 1 else 2000
checkpoint = int(budget * CHECKPOINT_FRACTION)
if WORK.exists():
shutil.rmtree(WORK)
cells = []
for seed in SEEDS:
cells.append((seed, "memetic", run_homemaker, {}))
cells.append((seed, "urb-evolve p16", run_urbevolve, {"pop": 16}))
cells.append((seed, "urb-evolve p128", run_urbevolve, {"pop": 128}))
def run_cell(args):
seed, label, fn, kw = args
cell = WORK / f"{seed.split('.')[0][:8]}_{label.replace(' ', '_')}"
cell.mkdir(parents=True, exist_ok=True)
print(f"start: {seed} / {label}", flush=True)
res = fn(seed, budget, cell, **kw)
print(f"done: {seed} / {label} ({len(res['series'])} log points)", flush=True)
return (seed, label), res
with ThreadPoolExecutor(max_workers=3) as pool:
results = dict(pool.map(run_cell, cells))
# common yardstick: re-score every final design through urb-fitness.pl
for key, res in results.items():
if res["best_dom"] and Path(res["best_dom"]).exists():
s = oracle.score(res["best_dom"], URB)
res["final"], res["fails"] = s.fitness, s.n_fails
else:
res["final"], res["fails"] = float("nan"), -1
print(f"\n{'seed':10s} {'system':16s} {'best@' + str(checkpoint):>12s} "
f"{'final@' + str(budget):>12s} {'fails':>6s}")
verdicts = []
for seed in SEEDS:
rows = {label: results[(seed, label)] for label in
("memetic", "urb-evolve p16", "urb-evolve p128")}
for label, res in rows.items():
print(f"{seed[:10]:10s} {label:16s} {best_at(res['series'], checkpoint):12.6g} "
f"{res['final']:12.6g} {res['fails']:6d}")
hm = rows["memetic"]["final"]
urb = max(rows["urb-evolve p16"]["final"], rows["urb-evolve p128"]["final"])
verdicts.append(hm > urb)
print(f"{'':10s} -> memetic {'BEATS' if hm > urb else 'LOSES TO'} "
f"urb-evolve ({hm:.6g} vs {urb:.6g})")
print(f"\nGATE: memetic wins {sum(verdicts)}/{len(verdicts)} seeds "
f"-> {'GO' if all(verdicts) else 'REVIEW'}")
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -21,7 +21,6 @@ from scipy.optimize import minimize
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from homemaker_layout import dom, innerloop # noqa: E402
URB = Path("/home/bruno/src/urb")
EX = URB / "examples" / "programme-house"
NAME = "2f45907abd9accac2a124d311732f749.dom"
@ -52,7 +51,7 @@ def main() -> None:
f"({ev.n_evals - n0} evals)", flush=True)
root = dom.load(str(EX / NAME))
r = innerloop.optimise(root, EX, budget=200, method="cma", sigmas=(0.05,), urb_root=URB)
r = innerloop.optimise(root, EX, budget=200, method="cma", sigmas=(0.05,))
print(f"CMA sigma 0.05: {r.fitness:.6g} fails {r.n_fails} ({r.n_evals} evals)")

View file

@ -0,0 +1,167 @@
"""Why does `level N not connected` persist? (`homemaker-py-yql`, DESIGN.md §39.9)
`homemaker-py-2v1` closed NULL: severing a level's circulation is already
punished, so the fail is not something the search is paid to create. This asks
the follow-on question is a connected layout **rarely constructed**, or
**constructed and then lost**?
`level N not connected` fires from `graph.connected_circulation`, which keeps
only the generic circulation leaves (`C`/`S`) and asks whether *they* form one
connected component. It runs on `graph_circ`, i.e. AFTER
`graph.has_circulation` has trimmed edges, so §39.7's usage change can in
principle reach it report (b) measures whether it did.
Three reports:
construct what fraction of constructed seeds start connected, per level
cost the same, prefix-inferred usages vs declared (the §39.7 cost)
survive from a CONNECTED layout, how often does one mutation break
connectivity, and would the outer comparator keep the mutant
Usage::
python experiments/diag_connectivity_yql.py construct
python experiments/diag_connectivity_yql.py cost
python experiments/diag_connectivity_yql.py survive --seeds 40
"""
from __future__ import annotations
import argparse
import copy
from pathlib import Path
import numpy as np
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness, geometry
from homemaker_layout import graph as graph_mod
from homemaker_layout import operators, programme
CORPUS = ["examples/harbor-house", "examples/health-centre", "examples/maple-court"]
LEGACY_PREFIX = {"b": "bedroom", "t": "toilet", "l": "living", "k": "kitchen"}
def make_fitness(progdir: str) -> fitness.Fitness:
overrides = driver._overrides_for(
leaf_sharing=True, superpose=False, max_share=None, conn_grade=False,
collapse_insearch=True, multi_use=False)
conf, cost = fitness.load_config(progdir, overrides=dict(overrides or {}))
return fitness.Fitness(conf, cost)
def constructed_seed(progdir: str, seed: int) -> dom_mod.Node:
reqs = programme.load_programme_dir(progdir)
return operators.constructive_topology(
dom_mod.load(f"{progdir}/init.dom"), reqs, np.random.default_rng(seed),
sorted(reqs) + ["C", "O"],
min_storeys=programme.storey_minimum(progdir),
adjacency_aware=True, proportion_aware=True, circ_divisor=3,
leaf_sharing=True, leaf_share_factor=3, depth_balanced=True,
interior_outside=True, outside_divisor=3)
def connectivity(root: dom_mod.Node, usages: dict[str, str]) -> tuple[int, int]:
"""``(levels_connected, levels_total)`` for one tree.
Mirrors the scorer: build the circ graphs, then ask
``connected_circulation`` per level on a copy, exactly as
``process_storey`` does.
"""
tree = copy.deepcopy(root)
geometry.clear_cache()
dom_mod.canonicalize_shares(tree)
_, circ = graph_mod.build_graphs_with_circ(tree, 1.2, lambda _f: None, usages)
connected = sum(1 for gc in circ
if graph_mod.connected_circulation(gc.copy()))
return connected, len(circ)
def report_construct(seeds: int) -> None:
print(f"how often does a CONSTRUCTED seed start connected? ({seeds} seeds)\n")
print(f" {'programme':<18}{'levels connected':<20}{'seeds fully connected'}")
print(" " + "-" * 62)
for progdir in CORPUS:
fit = make_fitness(progdir)
usages = fit.usages()
ok = tot = full = 0
for s in range(seeds):
c, n = connectivity(constructed_seed(progdir, s), usages)
ok += c
tot += n
full += (c == n)
print(f" {Path(progdir).name:<18}{f'{ok}/{tot} ({100*ok/max(tot,1):.0f}%)':<20}"
f"{full}/{seeds}")
def report_cost(seeds: int) -> None:
"""Did §39.7's usage change make level connectivity harder to achieve?"""
print("§39.7 cost check — prefix-inferred usages vs declared "
f"({seeds} seeds)\n")
print(f" {'programme':<18}{'prefix-inferred':<20}{'declared':<20}delta")
print(" " + "-" * 68)
for progdir in CORPUS:
reqs = programme.load_programme_dir(progdir)
declared = {c: r.usage for c, r in reqs.items()}
legacy = {c: LEGACY_PREFIX.get(c[:1].lower(), "none") for c in reqs}
res = {}
for label, usages in (("legacy", legacy), ("declared", declared)):
ok = tot = 0
for s in range(seeds):
c, n = connectivity(constructed_seed(progdir, s), usages)
ok += c
tot += n
res[label] = (ok, tot)
(a, ta), (b, tb) = res["legacy"], res["declared"]
delta = 100 * b / max(tb, 1) - 100 * a / max(ta, 1)
print(f" {Path(progdir).name:<18}"
f"{f'{a}/{ta} ({100*a/max(ta,1):.0f}%)':<20}"
f"{f'{b}/{tb} ({100*b/max(tb,1):.0f}%)':<20}{delta:+.0f} pts")
def report_survive(seeds: int) -> None:
"""From a CONNECTED level, how fragile is that connectivity under one
mutation and would the comparator keep the mutant anyway?"""
print(f"survival of connectivity under one mutation ({seeds} trials)\n")
print(f" {'programme':<18}{'started connected':<20}{'broken by mutation':<22}"
f"{'…and kept by comparator'}")
print(" " + "-" * 82)
for progdir in CORPUS:
fit = make_fitness(progdir)
usages = fit.usages()
reqs = programme.load_programme_dir(progdir)
types = sorted(reqs) + ["C", "O"]
started = broken = kept = 0
rng = np.random.default_rng(0)
for s in range(seeds):
root = constructed_seed(progdir, s)
c, n = connectivity(root, usages)
if c != n:
continue # only study layouts that ARE connected
started += 1
base_score, base_fails = fit.score_with_fails(copy.deepcopy(root))
child, _desc = operators.mutate(root, rng, types, reqs=reqs)
c2, n2 = connectivity(child, usages)
if c2 == n2:
continue
broken += 1
# would the outer loop admit it? lexicographic (-n_fails, fitness)
score, fails = fit.score_with_fails(copy.deepcopy(child))
if (-len(fails), score) > (-len(base_fails), base_score):
kept += 1
print(f" {Path(progdir).name:<18}{f'{started}/{seeds}':<20}"
f"{f'{broken}/{max(started,1)}':<22}{kept}")
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("report", choices=("construct", "cost", "survive"))
ap.add_argument("--seeds", type=int, default=20)
args = ap.parse_args()
{"construct": report_construct, "cost": report_cost,
"survive": report_survive}[args.report](args.seeds)
if __name__ == "__main__":
main()

View file

@ -129,7 +129,7 @@ def _measure(fit, pdir, seed_root, reqs, types, s, balanced, sharing, factor):
after_tree = copy.deepcopy(topo)
with _force_sharing(sharing):
innerloop.optimise(after_tree, str(pdir), x0=None, budget=BUDGET,
method="nm", use_native=True)
method="nm")
_s2, fails2 = fit.score_with_fails(copy.deepcopy(after_tree))
after = {"n_leaves": n_leaves, "total": len(fails2), **_bucket(fails2),
**_maldist(after_tree, fit, reqs)}

View file

@ -0,0 +1,271 @@
"""Exposure / frontage diagnostic for the crinkliness residual.
Evidence for `homemaker-py-ssz` / `hxi` / `tdp` (DESIGN.md §38). Three reports,
none of which needs a search run:
1. ``exposure`` decompose crinkliness failures into ZERO-EXPOSURE (the leaf
has no daylit wall at all, so ``quality_uncrinkliness`` returns a hard 0.0
and the leaf's whole quality product collapses to zero) vs. wrong-ratio
(exposed, but off the uncrinkliness target). Run on constructed seeds under
the driver's real default stack, or on a ``.dom`` from disk.
2. ``value`` measure what a buried leaf is worth to the objective, by
deleting one (undividing its parent) and re-scoring. Circulation/outside
leaves carry no missing-space requirement, so nothing offsets their removal.
3. ``frontage`` the closed-form feasibility bound. Crinkliness fails when
``1/crink > X`` with ``crink = L*h/A``, so every interior leaf needs exposed
wall ``L >= A/(X*h)``; per storey that is ``A_storey/(X*h)`` metres. Compare
against the daylit plot perimeter (``area_outside`` skips ``private`` and
``fortified`` edges) to get the deficit.
Usage::
python experiments/diag_exposure_frontage.py frontage
python experiments/diag_exposure_frontage.py exposure examples/harbor-house
python experiments/diag_exposure_frontage.py exposure --dom out.dom examples/harbor-house
python experiments/diag_exposure_frontage.py value examples/harbor-house
"""
from __future__ import annotations
import argparse
import copy
import math
from pathlib import Path
import numpy as np
from homemaker_layout import dom as dom_mod
from homemaker_layout import driver, fitness, geometry
from homemaker_layout import graph as graph_mod
from homemaker_layout import operators, programme
CORPUS = ["examples/harbor-house", "examples/maple-court",
"examples/health-centre", "examples/programme-house"]
def fail_bounds() -> tuple[float, float]:
"""Solve ``gaussian(x, 1, 5/6, 1.1/3) == FAIL_THRESHOLD`` for x.
Returns ``(buried_above, exposed_below)``: a leaf fails crinkliness when
``1/crink`` exceeds the first (too buried) or falls below the second (too
exposed). Derived from the real constants, never hard-coded.
"""
b, c = fitness.CONF_DEFAULTS["uncrinkliness"]
k = math.sqrt(-2 * c * c * math.log(fitness.FAIL_THRESHOLD) / math.log(fitness._E))
return b + k, b - k
def _fit(progdir: str) -> fitness.Fitness:
"""Evaluator configured exactly as ``driver.search`` builds it by default."""
ov = driver._overrides_for(leaf_sharing=True, superpose=False, max_share=None,
conn_grade=False, collapse_insearch=True,
multi_use=False)
conf, cost = fitness.load_config(progdir, overrides=ov)
return fitness.Fitness(conf, cost)
def _seed(progdir: str, seed: int) -> dom_mod.Node:
"""One constructed seed under ``driver.search``'s own default arguments."""
reqs = programme.load_programme_dir(progdir)
return operators.constructive_topology(
dom_mod.load(f"{progdir}/init.dom"), reqs, np.random.default_rng(seed),
sorted(reqs) + ["C", "O"],
min_storeys=programme.storey_minimum(progdir),
adjacency_aware=True, proportion_aware=True, circ_divisor=3,
leaf_sharing=True, leaf_share_factor=3, depth_balanced=True,
interior_outside=True, outside_divisor=3)
def _exposure_rows(fit: fitness.Fitness, root: dom_mod.Node) -> list[tuple]:
"""Per interior/covered leaf: (level, id, type, area, exposed_area, quality).
Reproduces the state ``_evaluate_full`` reaches at storey processing
in-search collapse, preprocess, merge so the numbers match a real eval.
"""
tree = copy.deepcopy(root)
geometry.clear_cache()
dom_mod.canonicalize_shares(tree)
if fit._collapse_insearch:
fit.collapse_global(tree, adjacency=True, objective="threshold",
preserve_public_access=True, iters=3)
fit.preprocess_building(tree)
dom_mod.merge_divided(tree)
geometry.clear_cache()
graphs = graph_mod.build_graphs(tree, fit.conf("door_width") or 1.2)
rows = []
for li, lvl in enumerate(dom_mod.levels(tree)):
for leaf in lvl.leaves():
if dom_mod.is_outside(leaf) and not dom_mod.is_covered(leaf):
continue # exempt by quality_uncrinkliness
rows.append((li, leaf.id, leaf.type, geometry.area(leaf),
fit.area_outside(leaf, graphs[li], {}),
fit.quality_uncrinkliness(leaf, graphs[li], {})))
return rows
def report_exposure(progdir: str, seeds: range, dom_path: str | None) -> None:
fit = _fit(progdir)
roots = ([dom_mod.load(dom_path)] if dom_path
else [_seed(progdir, s) for s in seeds])
ok = zero = ratio = 0
n_fails = n_crink = 0
for root in roots:
_, fails = fit.score_with_fails(copy.deepcopy(root))
n_fails += len(fails)
n_crink += sum("crinkliness" in f for f in fails)
for _, _, _, _, exposed, q in _exposure_rows(fit, root):
if exposed == 0:
zero += 1
elif q < fitness.FAIL_THRESHOLD:
ratio += 1
else:
ok += 1
total = ok + zero + ratio
label = dom_path or f"{len(roots)} constructed seeds"
print(f"=== {progdir} ({label})")
print(f" mean fails/design {n_fails / len(roots):.1f}, of which crinkliness "
f"{n_crink / len(roots):.1f}")
print(f" interior leaves: ok={ok} ZERO-EXPOSURE={zero} wrong-ratio={ratio}")
if total:
print(f" -> {100 * zero / total:.0f}% of interior leaves have NO daylit wall: "
f"hard quality=0, unreachable by any ratio assignment")
def report_value(progdir: str, seed: int, limit: int) -> None:
"""What is a buried leaf worth? Delete one and re-score."""
fit = _fit(progdir)
root = _seed(progdir, seed)
base_score, base_fails = fit.score_with_fails(copy.deepcopy(root))
print(f"=== {progdir} seed {seed}: baseline score {base_score:.4g}, "
f"{len(base_fails)} fails")
buried = [(li, lid, typ) for li, lid, typ, _, exposed, _
in _exposure_rows(fit, root) if exposed == 0]
print(f" {len(buried)} buried leaves; deleting each (undivide its parent):")
tried = 0
for li, lid, typ in buried:
if tried >= limit:
break
cand = copy.deepcopy(root)
lvls = dom_mod.levels(cand)
if li >= len(lvls):
continue
node = lvls[li].by_id(lid)
if node is None or node.parent is None:
continue
parent = node.parent
if parent.below is not None and parent.below.divided:
continue # inherited cut, not owned here
sibling = parent.right if parent.left is node else parent.left
if sibling is None or sibling.divided:
continue
parent.division = None
parent.left = parent.right = None
parent.type = sibling.type
dom_mod.link(cand)
geometry.clear_cache()
score, fails = fit.score_with_fails(copy.deepcopy(cand))
tried += 1
verdict = "BETTER" if score > base_score else "worse"
print(f" delete {lid:<8s} type={typ:<5s}: score x{score / base_score:>8.2f} "
f"({verdict}), fails {len(base_fails)} -> {len(fails)}")
def frontage_budget(progdir: str) -> dict:
"""Feasibility of a programme on its plot, before any search runs.
Two independent checks, in the order they bite:
1. **Does the programme fit the plot at all?** ``demand / storeys`` against
the plot area. health-centre asks for 240 on a 183 plot 131%
and every room comes out at 0.60x its target no matter what the search
does.
2. **Is there enough daylit wall for the area it does demand?** Every
interior leaf needs ``L >= A/(X*h)`` (§38.3), so a storey building
``A_built`` needs ``A_built/(X*h)`` metres. The plot's non-``private``
perimeter supplies some; interior courtyard supplies the rest, at roughly
``2 * area / width`` metres per courtyard slot.
NB this must be computed against the area the programme actually DEMANDS,
not a fully built plot see §39.11 for the correction.
"""
root = dom_mod.load(f"{progdir}/init.dom")
per = root.perimeter or {}
height = root.height or 3.0
# measured exactly as `Fitness.area_outside` does: an external boundary is
# daylit unless its perimeter type is `private` or `fortified`. Going
# through `geometry` rather than the raw YAML corners also picks up the
# `wall_outer` inset and the plot rotation, so these are the metres and the
# square metres the leaves actually get.
daylit = sum(geometry.edge_length(root, e) for e in range(4)
if (per.get(geometry.boundary_id(root, e)) or "").lower()
not in ("private", "fortified"))
plot = geometry.area(root)
reqs = programme.load_programme_dir(progdir)
storeys = max(programme.n_storeys_required(reqs),
programme.storey_minimum(progdir))
demand = sum(r.size * r.count for r in reqs.values())
built = demand / storeys
x_buried, _ = fail_bounds()
needed = built / (x_buried * height)
gap = needed - daylit
court = max(0.0, gap) * 3.0 / 2.0 # 3 m courtyard slots
spare = plot - built
return dict(plot=plot, daylit=daylit, height=height, storeys=storeys,
demand=demand, built=built, needed=needed, gap=gap,
court=court, spare=spare,
fits_plot=built <= plot,
frontage_ok=court <= spare)
def report_frontage(progdirs: list[str]) -> None:
x_buried, x_exposed = fail_bounds()
print(f"crinkliness fails when 1/crink > {x_buried:.4f} (buried) "
f"or < {x_exposed:.4f} (over-exposed)")
print(f"=> every interior leaf needs exposed wall L >= A / ({x_buried:.4f} * h)\n")
for progdir in progdirs:
b = frontage_budget(progdir)
print(f"=== {Path(progdir).name}")
print(f" plot {b['plot']:.0f} m2, daylit perimeter {b['daylit']:.0f} m, "
f"{b['storeys']} storeys, h={b['height']:g}")
pct = 100 * b["built"] / b["plot"]
verdict = "OK" if b["fits_plot"] else "DOES NOT FIT THE PLOT"
print(f" 1. programme demands {b['demand']:.0f} m2 -> {b['built']:.0f} m2 "
f"per storey = {pct:.0f}% of the plot [{verdict}]")
print(f" 2. that needs {b['needed']:.0f} m of daylit wall; perimeter gives "
f"{b['daylit']:.0f} m -> gap {b['gap']:+.0f} m")
if b["gap"] > 0:
print(f" closing it takes ~{b['court']:.0f} m2 of 3 m courtyard; "
f"spare plot {b['spare']:.0f} m2 "
f"[{'OK' if b['frontage_ok'] else 'NOT ENOUGH ROOM'}]")
else:
print(" perimeter alone is sufficient")
print()
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("report", choices=("exposure", "value", "frontage"))
ap.add_argument("progdir", nargs="?", default=None)
ap.add_argument("--dom", default=None, help="score this .dom instead of seeds")
ap.add_argument("--seeds", type=int, default=3)
ap.add_argument("--limit", type=int, default=5, help="deletions to try (value)")
args = ap.parse_args()
if args.report == "frontage":
report_frontage([args.progdir] if args.progdir else CORPUS)
elif args.report == "exposure":
for d in ([args.progdir] if args.progdir else CORPUS):
report_exposure(d, range(args.seeds), args.dom)
else:
report_value(args.progdir or CORPUS[0], seed=0, limit=args.limit)
if __name__ == "__main__":
main()

View file

@ -105,7 +105,7 @@ def _measure(fit, pdir, seed_root, reqs, types, s, sharing, factor):
after_tree = copy.deepcopy(topo)
with _force_sharing(sharing):
innerloop.optimise(after_tree, str(pdir), x0=None, budget=BUDGET,
method="nm", use_native=True)
method="nm")
_s2, fails2 = fit.score_with_fails(copy.deepcopy(after_tree))
after = {"n_leaves": n_leaves, "total": len(fails2), **_bucket(fails2)}
return before, after

Some files were not shown because too many files have changed in this diff Show more