阁楼终于能住,宽门廊也能拼:第五轮自动建房


这次仍然只发送 continue。模型让阁楼有了楼梯、家具和灯,并让门廊横跨多个房间。这里比较第四轮与第五轮,解释测试结果,也能实际运行 Python 看新旧各种建筑。

第五轮 · 同一会话续跑 · 第一轮 · 第二轮 · 第三轮 · 第四轮 · 自己生成 · 看外观和内部

266 / 266最终自动测试通过
161 / 172实际试建成功,另 11 次拒绝
36 / 4040 个指定房屋输入中的主结构数
0修改的共用内核文件

01 · 这次终于把阁楼用起来了

这是一套用 Python 自动搭 Minecraft 建筑的工具,叫 Hearth。目标是让用户用简短代码安排房间与零件,由共用的库负责摆方块、检查支撑和通路,并记住“这块玻璃属于哪扇窗、哪栋房子”。我们想要的是可扩展的建筑积木库,而不是只能从固定几种房型中挑一个。

第五轮仍然只向原会话发送了 continue。 模型沿用已有任务和代码,把重点放在可使用的阁楼、通往阁楼的楼梯、横跨多个房间的门廊,以及烟囱和屋顶三角墙的外观。

这次最实在的进步是:屋顶下面不再只是一个空壳。明确要求阁楼时,程序要造出有用途、有家具、有灯、能从楼梯到达的房间。外层代码只需要说“这里要阁楼卧室”,不用自己补楼板、开楼梯洞或逐格安床。

它仍没有达到八张 lodge 参考图的精致程度。 房间和窗户太整齐,屋顶形式偏少,一些室内较空,庭院与地景比较简单。这是功能与组合能力的进步,不是审美目标已经完成。

要分清的事情 本轮最终结果 这说明什么
自动测试 266 项通过,0 项失败 正常组合能运行,故意破坏或越权也能被检查出来;报告另做独立重跑
正常范围内的实际试建 156 次全部建成 覆盖指定房屋、地形和组合,并不代表任意参数都合法
困难地形试建 16 次中 5 次建成,11 次拒绝 那 11 次地面高差为 6–19 格,超过现有 5 格上限;没有偷偷换一组输入
最终实际试建合计 172 次,161 次建成,11 次拒绝 与“266 项测试”是不同统计,不能混为一谈
开发中发生的错误 有,且保留日志 包括造房规则的缺陷,也包括新测试自身写错;下面逐项解释

报告额外发现一个既有缺陷:村落编号 314 会失败。 路灯柱占了道路通行空间;浏览器和原生 Python 都能复现,第四轮也一样。这不在模型的 172 次最终单栋/地形试建中,因此那组数字保持原样,额外失败在本文单独列出。

02 · 第四轮到第五轮,变化放在一张表里

对照项目 第四轮 第五轮 对使用者意味着什么
新发给模型的话 continue continue 都接着原会话做,没有另写任务
库版本 1.4.0 1.5.0 同一版本、代码与输入可复现;升级版本后同一个编号可以生成不同内容
阁楼 屋顶下的非居住空间 可要求卧室、书房或储物间 必需阁楼不能因为难放就被悄悄省略
到阁楼的楼梯 没有完整的阁楼房间接入 根据屋脊方向对齐楼梯洞、平台与上层通路 不应出现有床却上不去的阁楼
阁楼内部 没有专用布置 至少两组可使用家具、实际吊灯、楼梯口护栏和适配的横梁 家具要能走到,灯要有吊挂支撑
多个屋顶如何相接 原有屋顶组合 先准备楼板,再造高屋顶,随后造低屋顶 避免早放的小装饰挡住后造的墙,引发缝隙
门廊 主要服务入口所在房间 可横跨相邻的两间或三间房,加中间柱子 宽门廊仍要对齐真实入口,不能栏杆正好挡门
烟囱 顶盖较宽大 默认顶盖跟随烟囱截面,并收敛顶部高度 外观不再那么笨重;不是只改渲染图
屋顶三角墙上的窗 窗台碰到门廊顶棚时可能整窗取消 玻璃面能放得下,就改用贴平墙面的窗 避免本可开窗的墙无故变成空白
新的轻量组合程序 新增 U 形庭院住宅 新增阁楼住宅和另一个三间宽门廊组合 通过公开接口安排房间与屋顶,未在用户代码里补方块
原有住宅 三种 lodge 风格例子 原来的房间选择保留,明确申请阁楼功能 不只新展示样例能用阁楼
自动测试 230 项通过 266 项通过 旧 230 项源码未改,新增 36 种检查情形
正常范围内试建 124/124 建成 156/156 建成 多 32 次:8 个新住宅、16 组独立地形、8 个额外组合
困难地形 5/16 建成 仍是 5/16 没有增加高差容忍范围,也没有放宽这个限制
默认五栋村落 128,055 方块、1,005 部件 127,985 方块、1,031 部件 少 70 个方块、多 26 个部件;方块数不是质量分数
原 CLI 随机编号 1 91,211 方块、658 部件,3 栋 91,199 方块、680 部件,3 栋 入口命令没变,生成内容升级
村落编号 314(报告额外检查) 道路被路灯占用,生成失败 相同问题仍在 既有库组合缺陷,不是网页或这轮阁楼新增问题
保存后完整核对 22 对文件、5,635 个部件记录 31 对文件、8,022 个部件记录 同时核对建筑方块和部件关系,不只看截图
成品视图 25 张,5 栋各 5 个视角 30 张,5 栋各 6 个视角 新增阁楼内部视图
共享内核与保存机制 上轮沿用 本轮继续未改 新东西主要在部件、房屋组合和检查规则层

结构种类不能直接拿两个数字相减

第四轮在 32 个指定房屋输入中测得 26 种主要结构。第五轮在 40 个指定房屋输入中测得 36 种,但本轮也修改了统计方法:纳入阁楼平台结构,排除阁楼家具与灯、可选门廊座椅等细节。样本也增加了。因此不能写成“多样性提升了 38%”。

这个“结构”主要看实际房间用途、位置、连接、屋顶形状与主要附属构件,不靠改颜色凑数。它只说明有限样本里的差异,不是整个库能生成的建筑总数,更不是审美评分。

统计第四轮第五轮
Python 文件数8692
Python 行数(含空行注释)81499109
原文件变化基线13 修改 / 0 删除
新增 Python 文件—6

代码统计包含库、示例与测试,不含网页和参考程序。代码长短不是评分标准。完整文件对比。

查看哪些文件新增或修改
变化文件
新增examples/building_space.py
新增examples/roof_home.py
新增hearth/components/circulation.py
新增hearth/components/lofts.py
新增hearth/navigation.py
新增test/test_building_space.py
修改examples/building_views.py
修改hearth/__init__.py
修改hearth/components/__init__.py
修改hearth/components/building.py
修改hearth/components/furnishing.py
修改hearth/components/interior.py
修改hearth/components/masonry.py
修改hearth/components/roofcraft.py
修改hearth/components/roofs.py
修改hearth/lodges.py
修改hearth/programs.py
修改hearth/quality_assessment.py
修改hearth/validators.py

03 · 自己动手生成建筑

不需要会写代码:先点“运行并生成”,再用鼠标拖动建筑、滚轮缩放。点“换随机编号生成”看同类建筑的新样子;点“换一种场景生成”轮流尝试不同例子,房屋布局等设置也会跟着变化。生成后可以点“打开屋顶看里面”,或点一块玻璃查看它属于哪扇窗、哪栋房子。

这是真正在你的浏览器中运行 Python 建筑程序,每次点击不会再去询问模型。第一次需要下载运行工具,可能要稍等;多栋房屋通常比单栋慢,可以随时停止。程序会检查建筑,并把保存的文件重新打开,核对内容是否一致。

下载本轮默认五栋房屋

已知问题:村落编号 314 会因路灯挡路而拒绝生成,第四轮和本轮都能复现;页面会保留报错,不自动换编号。详情见网页实测记录。

默认展示本轮新增加的带阁楼住宅。要手动改变房间、屋顶等设置,请选择“自己调整房间、屋顶和阳台”,再点“使用这个例子”;其他例子只读取菜单下方写明的设置。控件值不会自动改写任意 Python 代码。

这些控件对应哪些 Python 变量(写代码时查看)

相同版本、代码、参数和随机编号会重复生成同一结果。换编号也可能撞上同一种设计;如果把所有选择都写死,换编号不一定改变建筑。“换随机编号”保留当前代码;“换一种场景”会载入公开的轮换程序,连续 18 次尝试新阁楼住宅、宽门廊住宅、阁楼水边适配、U 形庭院住宅、三种原房屋、水边适配、村落、中庭、原来的住宅/工坊/公共用房,以及第二轮的建筑群、大厅、桥和围墙。每次也随机结构参数,不只是换颜色。这覆盖列出的现有例子,不代表穷尽整套库的可能组合。遇到拒绝会显示原因,不会偷偷重抽。

轮换程序的完整 Python 代码
# Report-owned sampler of public examples, not a library family selector. programs = ('roof_home', 'roof_held', 'roof_pair', 'court', 'home', 'hall', 'high', 'adaptation', 'settlement', 'courtyard', 'commons', 'atelier', 'dwelling', 'campus', 'perimeter', 'sample_hall', 'sample_connector', 'sample_boundary') program = programs[SEED % len(programs)] if program == 'roof_home': from examples.roof_home import roof_home from hearth.lodges import lodge_scene scene = lodge_scene(roof_home(SEED), seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'roof_held': from hearth import Scene, Box from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.components import adapted # Same frozen-field recipe used by the experiment; no sample substitution. es = int(ENV_SEED) rng = Scope(es).stream('roof-space-environment') domain = Box((-10, -4, -20), (52, 72, 52)) field = (gradient(rng.choice((-.025, 0, .025)), rng.choice((-.02, 0, .02)), 4) + wave(.3, .13, .09, rng.random() * 6)).blend(gradient(-.02, .02, 4) + radial(18, 18, 36, .5), radial(8, 10, 44, .6)).clamp(2, 6) water = rng.choice((None, 4, 5)) environment = Scene(es, domain=domain) environment.place('land', Terrain(domain, field, water)) environment.finalize() scene = environment.fork(seed=SEED) from examples.building_space import held_out_design scene.compose_choice(adapted("building", held_out_design(SEED), "/land")) scene.finalize() elif program == 'roof_pair': from hearth import Scene, Box from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.components import adapted # Same frozen-field recipe used by the experiment; no sample substitution. es = int(ENV_SEED) rng = Scope(es).stream('roof-space-environment') domain = Box((-10, -4, -20), (52, 72, 52)) field = (gradient(rng.choice((-.025, 0, .025)), rng.choice((-.02, 0, .02)), 4) + wave(.3, .13, .09, rng.random() * 6)).blend(gradient(-.02, .02, 4) + radial(18, 18, 36, .5), radial(8, 10, 44, .6)).clamp(2, 6) water = rng.choice((None, 4, 5)) environment = Scene(es, domain=domain) environment.place('land', Terrain(domain, field, water)) environment.finalize() scene = environment.fork(seed=SEED) from examples.roof_home import roof_home scene.compose_choice(adapted("building", roof_home(SEED), "/land")) scene.finalize() elif program == 'court': from examples.garden_house import garden_house from hearth.lodges import lodge_scene scene = lodge_scene(garden_house(SEED), seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'home': from hearth.lodges import hillside_home, lodge_scene scene = lodge_scene(hillside_home(SEED), seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'hall': from hearth.lodges import gabled_hall, lodge_scene scene = lodge_scene(gabled_hall(SEED), seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'high': from hearth.lodges import high_house, lodge_scene scene = lodge_scene(high_house(SEED), seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'adaptation': from hearth import Scene from hearth.environment import Terrain from hearth.assessment import adaptation_expression from hearth.components.building import adapted from hearth.lodges import hillside_home from hearth.quality_assessment import DOMAIN field, water = adaptation_expression(int(ENV_SEED)) environment = Scene(int(ENV_SEED), domain=DOMAIN) environment.place('land', Terrain(DOMAIN, field, water)) environment.finalize() scene = environment.fork(seed=SEED) scene.compose_choice(adapted('building', hillside_home(SEED), '/land')) scene.finalize() elif program == 'settlement': from hearth.programs import settlement_scene # Same public entry point used by the delivered generate.py. # This program consumes SEED and COUNT. Other controls are unused. scene = settlement_scene(seed=SEED, count=COUNT) elif program == 'courtyard': from examples.courtyard import build scene = build(SEED) elif program == 'commons': from hearth.programs import building_scene, commons scene = building_scene(commons(SEED), seed=SEED) elif program == 'atelier': from hearth.programs import building_scene, atelier scene = building_scene(atelier(SEED), seed=SEED) elif program == 'dwelling': from hearth.programs import building_scene, dwelling scene = building_scene(dwelling(SEED), seed=SEED) elif program == 'campus': from hearth_extensions.programs import extension_scene, branching_campus scene = extension_scene(branching_campus, seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'perimeter': from hearth_extensions.programs import extension_scene, perimeter_cluster scene = extension_scene(perimeter_cluster, seed=SEED, environment_seed=int(ENV_SEED)) elif program == 'sample_hall': from hearth_extensions.assessment import hall_scene scene = hall_scene(SEED, int(ENV_SEED)) elif program == 'sample_connector': from hearth_extensions.assessment import freeze_probe, connector_scene scene = connector_scene(freeze_probe(int(ENV_SEED)), SEED) elif program == 'sample_boundary': from hearth import Scene from hearth.environment import Terrain from hearth_extensions.assessment import PROBE_DOMAIN, probe_expression, boundary_scene field, _ = probe_expression(int(ENV_SEED)) environment = Scene(int(ENV_SEED), domain=PROBE_DOMAIN) environment.place('land', Terrain(PROBE_DOMAIN, field)) environment.finalize() scene = boundary_scene(environment, SEED) print('Explored program: ' + program)

准备就绪。点击运行,开始真正的 Python 生成。

本轮阁楼住宅预览

这是之前生成的示意图。运行后会换成你这一次生成的建筑。

切开查看会暂时隐藏切线外侧的方块,下载的仍是完整建筑。单击方块查看归属,按住鼠标拖动则旋转。选中整扇窗或整栋房子时,也会包含它里面的小部件和共用支撑。

这块方块属于哪里?

下面会按“小部件 → 大部件”的顺序显示归属。点其中一个名称,再勾选“只看选中的部件”,可以单独查看它。X、Y、Z 是方块位置,其中 Y 表示高度。

方块归属的详细数据(开发者用)
尚未生成
建造结果的详细数据(开发者用)
尚未生成
运行日志和错误详情
尚未运行

下载包里有 Minecraft 建筑文件、记录“方块属于哪个部件”的文件,以及重新生成它所需的 Python 代码和设置。请一起保留:只有建筑文件,无法查询这份部件关系记录。

05 · 怎样保持“拼积木”的结构

“接口”可以理解为零件附带的安装说明:它告诉别的零件哪里能接、朝哪个方向、占多大地方、必须留出什么空间。高层程序根据这些说明组合,不需要知道低层怎样逐格画墙。

这轮增加或修改的说明 用大白话说 哪层负责
房间的上层通道 upper-floor-access 这里是楼梯洞、这里是落脚点,这一块头顶不能堵 房间与楼梯部件
阁楼支撑平台 RoofPlatform 先铺楼板、留出洞口、补齐屋檐边矮墙,再让屋顶接上 支撑部件与房屋建造顺序
屋顶内部安装范围 roof-interior 可以往这里装阁楼房间,但不能因此拆屋顶 屋顶部件的公开接口
可居住屋顶 InhabitedRoof 把天气防护屋顶、楼板接入和室内组合成一个可复用大零件 组合部件
阁楼内饰 LoftInterior 指定用途,摆家具与灯,留通道,保护楼梯口 房间内部组合
家具的占地与使用位置 家具不只要放得下,前面也要留出人能站的位置 家具接口与通路规划
房间封闭检查 enclosed-volume 从室内的空气格向外找路,不能从意外墙缝跑到室外;只允许声明的楼梯洞 库里的验证规则
门廊宽度 porch_bays 横跨连续的前排房间,入口仍对齐,并按跨度加柱子 门廊与房屋组合

没有改权限、事务撤销、自动归属等共享内核,也没有改保存协议。 改了房间、楼梯、屋顶、门廊、导航与验证函数等库代码。内核没改不等于所有验证代码都没改,也不代表全部工作只是高层用户程序。

点击阁楼家具时,底层应给出“家具组 → 阁楼房间 → 屋顶 → 可居住屋顶组合 → 房屋”。同时还有“这个阁楼由哪个平台支撑、接到哪个下层房间”的关系。房间内的地板仍归实际建造它的平台所有;位置在房间内不代表必须把所有权改成房间。记录由底层自动产生,不是为了网页效果手填的标签。

用户代码只表达安排和用途,例如下面的手动示例。库负责找合适的空间、建造与检查;它不是只有网页下拉框里的几种“家族”。下拉框只是报告收集的一组可运行示例。

查看实际运行的高层 Python 代码
from hearth.components.building import Blueprint, RoomSpec from hearth.components.facades import FacadeDesign from hearth.components.roofcraft import RoofDesign from hearth.lodges import lodge_scene rooms = [RoomSpec(0, 0, level, purpose) for level, purpose in enumerate(('living', 'library', 'bedroom')[:FLOORS])] if WING: rooms.append(RoomSpec(1, 0, 0, 'kitchen')) plan = Blueprint(tuple(rooms), bay=BAY, porch=True, roof_design=RoofDesign(tuple(int(v) for v in RISE.split(',')), DORMER_SPACING), porch_depth=PORCH_DEPTH, balcony=BALCONY, chimney=CHIMNEY, attic_purpose=ATTIC_PURPOSE or None, facade_design=FacadeDesign(width=WINDOW_WIDTH, height=WINDOW_HEIGHT, planters=WINDOW_BOXES), rail_material='dark_oak' if CONTRAST_RAILS else 'spruce') scene = lodge_scene(plan, seed=SEED, environment_seed=int(ENV_SEED), garden=GARDEN)

原 Blueprint 参数的默认值保持兼容:不要求阁楼,就仍然可以只造天气防护屋顶。现有三个 lodge 例子主动要求阁楼;默认村落只对支持相应接口的屋顶策略启用它。部件作者仍须遵守坐标、楼梯洞、支撑和空间约定。接口变化原文。

06 · 266 项测试具体测什么,测的是哪层

主要测试对象是 library,也就是共用库;同时包含少量实际调用高层程序的检查。 不能把它们全叫“用户代码测试”。本轮新增 15 个测试函数,按尺寸、方向、编号展开为 36 项;旧 230 项测试源码逐字保留。

新增检查 项数 实际怎样测 主要层级
三种房间尺寸 × 两个屋脊方向 6 必须有可用阁楼、至少两组家具、灯和封闭要求,整栋通过验证 库的房屋组合、阁楼部件
公开上层通道与屋顶接口 1 外部程序能发现真正的楼梯洞与屋顶内部安装位置 库接口
转向四个方向再保存读回 4 楼梯朝向、吊灯支撑、家具归属、部件关系和物品记录一致 库部件、归属与保存
新阁楼住宅编号 0–7 8 实际调用轻量 roof_home,每个要求的屋顶都有对应用途的阁楼 高层例子与库的集成
故意拆坏六种东西 6 拆外墙、支撑、楼梯踏步、床的一半、横梁、洞口护栏,检查能定位问题 库验证规则
灯、家具和箱中物品 1 删灯、删床、写入不合法物品数量,都要被发现 库的照明、功能和物品检查
后放装饰堵住楼梯或落脚点 1 放置被拒绝,拒绝后场景不留下半成品 库通路保护与内核撤销
阁楼安装者越权拆屋顶或装错方向 1 越权/接口不匹配被拒绝,场景不被破坏 库接口和内核权限
把有阁楼的房屋改成没有,再改回来 1 旧部件与关系不残留,重建后与新造结果一致 库重建、依赖与保存
两间宽与三间宽门廊 2 有中间承重柱,门口位置正确,跨度非法时不允许修改 库门廊部件与房屋规划
参数边界 1 未提供合适屋顶策略、未知阁楼用途、吊灯没支撑时明确拒绝 库接口
外部程序直接拼可居住屋顶 1 不经整栋房屋快捷入口也能组合,还能替换公开屋顶策略 库扩展接口
伪造楼梯洞信息 1 不能把外墙漏洞谎报成“合法洞口”来逃过检查 库验证规则
后加绿化与结构统计 1 在已建房屋旁增加植物,房屋原方块不变;只换墙体颜色时主结构统计不变 库组合隔离与统计工具
门廊顶棚旁的三角墙窗 1 窗台放不下但玻璃面能放下时,使用贴平的窗而不是留白墙 库屋顶与窗部件
合计 36 加上旧 230 项,共 266 项 库为主,兼有高层调用与端到端保存

这些检查有些会故意破坏建筑。“预期坏建筑会被拒绝,而且确实拒绝了”算测试通过。这和生成时无意出错、测试没有通过,是两回事。也没有一项自动测试能证明所有随机建筑都漂亮。

报告独立重跑的完整 pytest 输出
........................................................................ [ 27%] ........................................................................ [ 54%] ........................................................................ [ 81%] .................................................. [100%] 266 passed in 240.92s (0:04:00)

第一次报告复测拷贝了归档的只读目录权限,导致测试无法创建临时文件;发现后停止,修正报告工作副本的目录权限再完整重跑。没有修改归档、库或测试源码。保留的环境错误日志。这个问题属于报告复测环境,不是生成库的缺陷。

那些曾经没通过的检查,到底是什么问题?

保留的开发记录/现象 是什么错误 哪一层的 mistake 最终如何处理
新接口探测一开始找不到上层通道 当时房间还没提供新功能需要的接口 库房间接口,属于实现中的缺口 加入真实洞口与落脚点说明
阁楼初测 4 项失败,随后还有 1 项楼梯净空失败 不同尺寸、方向的阁楼空间和楼梯上方没有协调好 库部件与组合规则 统一楼梯布局,限制会挡楼梯的可选老虎窗
建筑编号 4 的屋内空气能通到室外 多个屋顶交界处真的漏了,装饰/墙/楼板的先后顺序不合适 库的建造顺序与闭合处理 先准备楼板,先高屋顶后低屋顶,贴边位置不突出多余装饰
新测试某次为 29 通过、3 失败 两个旋转用例取了坐标最小的方块,转向后取到普通支撑块,却要求它有楼梯朝向;另一处拆墙没有拆穿双层墙 新测试代码,不等于三个真实建筑缺陷 改为查询真正的踏步并核对朝向;拆穿两层墙后再检查漏通
直接组合屋顶的测试曾显示下层房间未完成 测试用例在组合尚未完成时就要求最终验收 新测试/调用生命周期 按公开生命周期完成组合后再验收
图片里门廊顶棚旁的三角墙太空 原窗台突出会冲突,程序因此取消了整扇窗 库窗户放置规则,也影响美观 玻璃面有空间时改为贴平的窗,新增回归测试
报告独立检查:村落编号 314 失败 路灯柱的石砖底座与栅栏进入道路上方要留空的位置 库里的村落道路/路灯组合代码;不是用户那几行调用代码 第四、第五轮均可复现,本报告保留错误,没有修改原库或自动重抽
最后仍有 11 次困难场地不建 地面高差超过现有 5 格范围 库能力边界,不是测试框架失败 没有放宽或藏掉失败;如要支持,需增加接地方案

开发日志中的部分失败是模型主动先写检查再实现的中间状态。最终 266 项全通过,不抹掉这些中间错误,也不能用中间失败宣称最终仍有同一个 bug。首次阁楼检查 · 楼梯净空错误 · 室外漏通诊断 · 新测试三处失败 · 最终实验测试日志。

07 · 试建范围与多样性,有多少证据

最终统计只使用 building-space/final/ 下的四批记录,不把开发中重复尝试的 assessment-first、release 混进总数。地形先生成并固定,再放建筑;保留输入编号、公式与内容摘要,没有把失败编号换掉。

试建内容 成功 / 输入数 地基候选接受 / 尝试数 说明
三种原 lodge 房屋,各 8 个编号 24/24 48/48 本轮明确要求阁楼
原房屋与独立地形配对 64/64 84/128 两种接地策略比较,不重抽输入
新阁楼住宅 8/8 16/16 后翼、上层、屋脊等变化
新阁楼住宅与独立地形 16/16 20/32 8 个地形 × 2 个房屋编号
另写的三间宽门廊组合 8/8 9/16 检查已有部件能否支持另一种高层组合
上轮 U 形庭院住宅 8/8 16/16 保留功能重测
上轮庭院独立地形配对 12/12 19/24 保留功能重测
以前额外的混合/变换地形 16/16 16/32 现在属于已知回归样本,不再冒充新的盲测
困难场地 5/16 6/32 11 次因高差超限拒绝
全部 161/172 234/344 正常范围内 156/156,困难范围 5/16

“候选”是同一个输入下比较的两个有限接地方案。正常输入有 312 个候选,228 个被接受,84 个未接受;只要至少一个可用,那个输入仍能建成。候选拒绝不等于重抽了 84 次随机输入。 最终记录里的重新尝试次数为 0。

按输入计数:成功拿到建筑,或因高差超限没有建成。
本轮统一方法下,五个指定房屋程序各运行 8 次,共测得 36 种主结构。不是整个库的总数量。

全部 156 个正常输入合起来测得 44 种主要结构和 128 种接地方式记录。前者排除配色、植物与内部小家具扰动,后者单独描述建筑怎样接上地面。它们都依赖统计定义,也都来自有限样本。

地基填补共计 14,386 格,单次 0–257 格;实际挖土量为 0,所以不能声称这轮验证了广泛开挖能力。场地施工占用 16,687 格,其中 11,661 格替换原有格子、5,026 格是新占用;这三者不可相加当作挖土量。

试建程序记录正常输入耗时之和 347.064 秒,困难输入 9.441 秒;这包括选定样本的保存核对,不含预先生成地形、渲染和独立 pytest。耗时与机器有关。采样规则 · 总统计。

172 次最终试建的逐条记录(可搜索和点表头排序)
试建编号建造结果建筑编号地形编号方块数部件数原始记录
home-0建造成功0013518303
查看数据
{ "label": "home-0", "inputs": { "client": "home", "structure_seed": 0, "environment_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "7714371c3a0efe1724331c95d4b80bf56cbeace583f54cbd8794b7851e2e1709", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 95, "excavation": 0, "sitework_occupied_cells": 140, "replaced_cells": 33, "new_sitework_cells": 107, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "a1068cb5e91bf85f05b3e5a840c10beb409f4669235a254473c49c4f7cd6f916", "bearing_fill": 1 }, "blocks": 13518, "nodes": 303, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.85 ], [ 1, 1.17 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/home-0.litematic", "audit": { "queries": 277, "inventories": 45, "nodes": 303, "digest": "7714371c3a0efe1724331c95d4b80bf56cbeace583f54cbd8794b7851e2e1709" }, "seconds": 3.7247 }
home-1建造成功1114541281
查看数据
{ "label": "home-1", "inputs": { "client": "home", "structure_seed": 1, "environment_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "009541312389f0722c4109728ce840d4d9d103c422ad495ef9e4c8359905f149", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 83, "excavation": 0, "sitework_occupied_cells": 119, "replaced_cells": 30, "new_sitework_cells": 89, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "1cc7153d51c75b87ff27cf9ab1a0fee847fd057606bbf4c4d81a8dd018e6fb68", "bearing_fill": 3 }, "blocks": 14541, "nodes": 281, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.01 ], [ 0, 1.1 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/home-1.litematic", "audit": { "queries": 251, "inventories": 45, "nodes": 281, "digest": "009541312389f0722c4109728ce840d4d9d103c422ad495ef9e4c8359905f149" }, "seconds": 3.5068 }
home-2建造成功2214290274
查看数据
{ "label": "home-2", "inputs": { "client": "home", "structure_seed": 2, "environment_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ba33a60bae8d743e9c4054910945cfe238bdfab36a95aac226e883429c1cd49a", "principal_signature": "c73a8d5598317085104e59424ff85e8ab8e7301efd64ae43c6f73b6bac8eb159", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 108, "excavation": 0, "sitework_occupied_cells": 147, "replaced_cells": 30, "new_sitework_cells": 117, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "d995de1fe84840233e3ef9f80a05697c7dd7ca84bc7333cb8fafb53b16580792", "bearing_fill": 3 }, "blocks": 14290, "nodes": 274, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.2 ], [ 0, 1.32 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.242 }
home-3建造成功3312393246
查看数据
{ "label": "home-3", "inputs": { "client": "home", "structure_seed": 3, "environment_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "af971713029f2a07f48c822ae844b8e06547fa177efe54dfd02f951d21bcb3d9", "principal_signature": "155767c47db4b98ad24e7f45f4e956a076bc428a90d7a65bf9bbec265369b350", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 22, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "c1d6f13b8c28655d5147a04faf49e1b2c3cc27a2a3fa54229cb41f9219866412" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "fab2383b4a2c0116d0b4f8202d29606f1d18d922c64a45681ef3b7d2721add60" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 67, "excavation": 0, "sitework_occupied_cells": 114, "replaced_cells": 30, "new_sitework_cells": 84, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "514b816a5239b2d8f925eebd0ef8689336d8d9bcf4954795c81361ec5dba62db", "bearing_fill": 2 }, "blocks": 12393, "nodes": 246, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.64 ], [ 0, 0.78 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5968 }
home-4建造成功4414783324
查看数据
{ "label": "home-4", "inputs": { "client": "home", "structure_seed": 4, "environment_seed": 4 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "27e52c746a7f199648170a21c48adfaa81e23465c5cf79273f4f0aff968ea282", "principal_signature": "f5a8dcc414f6edfb27a77edb60668a878fbb5ceec768c7ef600dbe0fbfb1733a", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "0dfc3106094ec8d461ea41254c23a7395b2f36e637efd274e63445a5beb3d54e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "7abab47e29db00358e710cbe9ac87e4addd6abdb3a0aad504f6c6b15eb50da5e" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c17a69916beaf9f30003d3cdfdea6899cd03b6bc89a082c61290ef89b9952e45" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 36, "excavation": 0, "sitework_occupied_cells": 70, "replaced_cells": 33, "new_sitework_cells": 37, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "fe12a458d77c8d61dca5f965a877a523edfe90125b0c53d95cf4ffe0463c320f", "bearing_fill": 2 }, "blocks": 14783, "nodes": 324, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.49 ], [ 1, 0.82 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.1822 }
home-5建造成功5514756291
查看数据
{ "label": "home-5", "inputs": { "client": "home", "structure_seed": 5, "environment_seed": 5 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "1e3ec62d835b7599b529a53f9612de9fab3c5b4dde41ffe7fadeec76633ad000", "principal_signature": "568bbdfdaf874180c9ff1a9321ce3023fd25d9b4c6917d7d0520b96cd4f45032", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 94, "excavation": 0, "sitework_occupied_cells": 130, "replaced_cells": 30, "new_sitework_cells": 100, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "15a6f65b83bba55f18eb056a56bd476a56e155106cc8b2fa99f9f7536bc565fa", "bearing_fill": 1 }, "blocks": 14756, "nodes": 291, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.03 ], [ 0, 1.12 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.1036 }
home-6建造成功6611934248
查看数据
{ "label": "home-6", "inputs": { "client": "home", "structure_seed": 6, "environment_seed": 6 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "42a8075cc382e774e7a7cdf95a5dbaa68e986d54993c254f57ee6d2b41b05095", "principal_signature": "155767c47db4b98ad24e7f45f4e956a076bc428a90d7a65bf9bbec265369b350", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 22, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "c1d6f13b8c28655d5147a04faf49e1b2c3cc27a2a3fa54229cb41f9219866412" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "fab2383b4a2c0116d0b4f8202d29606f1d18d922c64a45681ef3b7d2721add60" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 33, "replaced_cells": 33, "new_sitework_cells": 0, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "47df3ba9586b88f3f40e1e919c69663a74a70e5ff24c7627a31def353bee09dd", "bearing_fill": 0 }, "blocks": 11934, "nodes": 248, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/home-6.litematic", "audit": { "queries": 218, "inventories": 32, "nodes": 248, "digest": "42a8075cc382e774e7a7cdf95a5dbaa68e986d54993c254f57ee6d2b41b05095" }, "seconds": 2.3858 }
home-7建造成功7714287288
查看数据
{ "label": "home-7", "inputs": { "client": "home", "structure_seed": 7, "environment_seed": 7 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "2ea22db06156cb90d5cd2707cb74d83dd14280e170e86f9a6944db4ed21a8043", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 27, "excavation": 0, "sitework_occupied_cells": 66, "replaced_cells": 33, "new_sitework_cells": 33, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "28e5adba18aefa1ed9386488d3ad955254e51cb665b8fccd0d9a3b3ccfce15ba", "bearing_fill": 0 }, "blocks": 14287, "nodes": 288, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.27 ], [ 1, 0.65 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0898 }
hall-0建造成功0014368318
查看数据
{ "label": "hall-0", "inputs": { "client": "hall", "structure_seed": 0, "environment_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "7af4b91da0136a6971932a91b1c9c4d62ad7208610ee7702aa50eeda434aab77", "principal_signature": "1a1d8f9633db5fe981cb92f0497e14617b05f346cadb354eff5fe77611bac78b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 12, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "db00b3775aa9d29db1da457824978af96035a6d07255b21c2bc8559e0243b364" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "b8a40090675df40e5fb4764ed00c6ddfa63cc29e5d33a16a454fd24052af7002" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 101, "excavation": 0, "sitework_occupied_cells": 140, "replaced_cells": 30, "new_sitework_cells": 110, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "599db4c6ac49dc568994157f713b6b25e631575add19a7a7deb5c5a4ddfcd51e", "bearing_fill": 1 }, "blocks": 14368, "nodes": 318, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.96 ], [ 1, 1.22 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/hall-0.litematic", "audit": { "queries": 293, "inventories": 37, "nodes": 318, "digest": "7af4b91da0136a6971932a91b1c9c4d62ad7208610ee7702aa50eeda434aab77" }, "seconds": 3.1203 }
hall-1建造成功1112302266
查看数据
{ "label": "hall-1", "inputs": { "client": "hall", "structure_seed": 1, "environment_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "74318b571e97828570875340a209e0d163c01a0e51940bc190626f2f44739944", "principal_signature": "aa07c18640ec90da2b29a2c3768c999bce26d258bd85adf0f87ffd3e98aa572e", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 15, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 8 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 9, "rise": [ 1, 2 ] }, "3ee20ecaff6391cb161b1ce9163b55591d680f5d16cba58e64d86688618b4110" ], [ "roof.profile", [ 0, 7, 9 ], { "axis": "x", "span": 9, "rise": [ 1, 2 ] }, "e497aa8d02aff15f35cdbd97d05a288b17e48d4a44ccab3259a05704169ac397" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "ef83d9a5eb4d203e9d3bbe4d7a7a9f5734310d36cbf2a96c15eabceb268edd7e" ], [ "room", [ 0, 6, 9 ], "room.loft.library", [ "landing" ], false, "a1d245413a3b1c1d35d6d64ac9ed2f0069f56da8dee0fa6361cace24a159af43" ], [ "room", [ 9, 0, 9 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 19, "excavation": 0, "sitework_occupied_cells": 49, "replaced_cells": 30, "new_sitework_cells": 19, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "e6582d5804795152c3f514ebd35f2b953dd923854850f928d6d724868063bddf", "bearing_fill": 1 }, "blocks": 12302, "nodes": 266, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.3 ], [ 1, 0.68 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/hall-1.litematic", "audit": { "queries": 239, "inventories": 30, "nodes": 266, "digest": "74318b571e97828570875340a209e0d163c01a0e51940bc190626f2f44739944" }, "seconds": 2.2619 }
hall-2建造成功2215712311
查看数据
{ "label": "hall-2", "inputs": { "client": "hall", "structure_seed": 2, "environment_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "5da0e55431e2c5484c580c5244ce109309aa423d42bad08ad5c93b801f4af9ab", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 121, "excavation": 0, "sitework_occupied_cells": 155, "replaced_cells": 27, "new_sitework_cells": 128, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "87f7261f488834ac78be15dc3eca393b2530f185746c065d5ac5830f946ce66b", "bearing_fill": 3 }, "blocks": 15712, "nodes": 311, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.34 ], [ 0, 1.57 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.1878 }
hall-3建造成功3315757300
查看数据
{ "label": "hall-3", "inputs": { "client": "hall", "structure_seed": 3, "environment_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "79a3589f9a19e2d5f037b67edbc63f8944f9b89564d6988fb7e318ceee9f65e0", "principal_signature": "30122b0bd78717f5a9041519ccee916d366193d2b05bfbe721a4705b8342b6fe", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 16 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 12 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "79f4a3ff70b1d43485df24f7be70ad59b88769ecf41a0b2ec26e5e3bb4ca1a52" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "cd712dd1b27087c4a1df5bb8af780655baa7f719006b6b3d85dc60dd0f9c7488" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "bababbf1ce522065f7a5179560438de468c2194e77c7619b2c0c0c52e35259a0" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 113, "excavation": 0, "sitework_occupied_cells": 157, "replaced_cells": 27, "new_sitework_cells": 130, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "0540b6e1bf18564ee462558e3ec6b0b3fbf9dee014aa06756eff89abdea1a2e4", "bearing_fill": 3 }, "blocks": 15757, "nodes": 300, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.1 ], [ 0, 1.3 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0739 }
hall-4建造成功4412285281
查看数据
{ "label": "hall-4", "inputs": { "client": "hall", "structure_seed": 4, "environment_seed": 4 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "27c886ebca8785f981fd274dae1b0fbe4d8ffb5c4a8f7248e46422db4147453b", "principal_signature": "ef7a5f7a9fcc0cbc0c5979f637e8bc781f38c27376263700f68344cdff1de538", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 15, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 8, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "b9339628a9c29e6249a6f84e3777ea353742f7c278daf1de40d52d96f6b16247" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "ac1c9da3571f54d7ad1d8fccc06670fdae3895b167ef09656853e00e22ad6865" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.living", [ "north", "east" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ], [ "room", [ 9, 0, 0 ], "room.workshop", [ "south", "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 0, 9 ], "room.kitchen", [ "north", "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ] ] ], "contact": { "fill": 20, "excavation": 0, "sitework_occupied_cells": 50, "replaced_cells": 29, "new_sitework_cells": 21, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "98287dd56614591fd5265eecce59d047b1fdec74e67527933bbd5f05276cfc0c", "bearing_fill": 0 }, "blocks": 12285, "nodes": 281, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.35 ], [ 1, 0.64 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.6989 }
hall-5建造成功5513034294
查看数据
{ "label": "hall-5", "inputs": { "client": "hall", "structure_seed": 5, "environment_seed": 5 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "30127403930604291f5052dad414c1ab3f303fec9a6f29a8a289d6664063e849", "principal_signature": "ef7a5f7a9fcc0cbc0c5979f637e8bc781f38c27376263700f68344cdff1de538", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 15, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 8, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "b9339628a9c29e6249a6f84e3777ea353742f7c278daf1de40d52d96f6b16247" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "ac1c9da3571f54d7ad1d8fccc06670fdae3895b167ef09656853e00e22ad6865" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.living", [ "north", "east" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ], [ "room", [ 9, 0, 0 ], "room.workshop", [ "south", "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 0, 9 ], "room.kitchen", [ "north", "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ] ] ], "contact": { "fill": 21, "excavation": 0, "sitework_occupied_cells": 51, "replaced_cells": 30, "new_sitework_cells": 21, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "b04cf71b4e449c7d4859f74b64577d3e2e74a7123b57241d97b8a08acf061a91", "bearing_fill": 2 }, "blocks": 13034, "nodes": 294, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.35 ], [ 1, 0.73 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.7323 }
hall-6建造成功6613314309
查看数据
{ "label": "hall-6", "inputs": { "client": "hall", "structure_seed": 6, "environment_seed": 6 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8408e068cfa801c867450128066cbfaaf3e14afb2d023c97a22e1c12d19612b2", "principal_signature": "8e267ea8272c6f5b0aba822d0d9b04265c9ff4113ece28905793075677614f99", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 21, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 12 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 9 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "0e45272d512ead81a7ca77adbd1e9b1781247379ff6b5bd9e6623f66e8d8902f" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "c70fcb1eba253676a089c0214e36b239ad20776bb0cb0da472657e07c3b604cf" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "13913a34cf27563a0e719f3d0caecd0e06c0c0b9c177a0e6e41bd277d9b7e83b" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 9 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 9 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.workshop", [ "south", "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 0, 9 ], "room.kitchen", [ "north", "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ] ] ], "contact": { "fill": 22, "excavation": 0, "sitework_occupied_cells": 52, "replaced_cells": 30, "new_sitework_cells": 22, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "98ff63f7ed246d3350d0b4da6132e8a8a64421e6552e38fb56d6b8cae4ee09c9", "bearing_fill": 1 }, "blocks": 13314, "nodes": 309, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.33 ], [ 1, 0.69 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "left", 14, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/hall-6.litematic", "audit": { "queries": 276, "inventories": 48, "nodes": 309, "digest": "8408e068cfa801c867450128066cbfaaf3e14afb2d023c97a22e1c12d19612b2" }, "seconds": 2.8872 }
hall-7建造成功7716114340
查看数据
{ "label": "hall-7", "inputs": { "client": "hall", "structure_seed": 7, "environment_seed": 7 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "4974ddf7fb31123b2ba8cb59e6b1c1e04bd8ff49e05c14ef468c8c5de9c703b5", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 16, "excavation": 0, "sitework_occupied_cells": 46, "replaced_cells": 30, "new_sitework_cells": 16, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "0ba3342e93c171059f2622893a2af5c5d501fc3f71134db2f227ed400d1ebeee", "bearing_fill": 0 }, "blocks": 16114, "nodes": 340, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.28 ], [ 1, 0.66 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.7125 }
high-0建造成功0010045265
查看数据
{ "label": "high-0", "inputs": { "client": "high", "structure_seed": 0, "environment_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "44b84583463b7e83ea5592e1927e9908c99a07de25fbb43defaaa8dd20da77be", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 52, "excavation": 0, "sitework_occupied_cells": 90, "replaced_cells": 33, "new_sitework_cells": 57, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "a8051fc01efd986390bc69db773f9f186134db17cf6b17885a6ae9d0eadf8091", "bearing_fill": 1 }, "blocks": 10045, "nodes": 265, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.51 ], [ 1, 0.79 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/high-0.litematic", "audit": { "queries": 241, "inventories": 28, "nodes": 265, "digest": "44b84583463b7e83ea5592e1927e9908c99a07de25fbb43defaaa8dd20da77be" }, "seconds": 2.0209 }
high-1建造成功1113389319
查看数据
{ "label": "high-1", "inputs": { "client": "high", "structure_seed": 1, "environment_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "f9fe8c1c76136bfbbbc2117395b81115686dbc750e591155688215b10d464679", "principal_signature": "970f31879eb26a26223e0c4f3f167c0b927b2086d7bd9d043b8ff0218ce3ffa5", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 29, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "14d6ff0b37f6e45a10ac4485b4fc85dba306fe38d1b93092e5d61eec78c8b2ee" ], [ "roof.profile", [ 11, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "05b229b99ddaf2ee979454422a781325920eaaaf5ebc5740a500b49f6cbf02bc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 6, 0 ], "room.workshop", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 67, "excavation": 0, "sitework_occupied_cells": 103, "replaced_cells": 30, "new_sitework_cells": 73, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "ca44a5148645dc4898b6b77fe6de4f5f16e3d7a973a2ea4c07b989caf0b9cd36", "bearing_fill": 2 }, "blocks": 13389, "nodes": 319, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.85 ], [ 0, 1.04 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/high-1.litematic", "audit": { "queries": 288, "inventories": 47, "nodes": 319, "digest": "f9fe8c1c76136bfbbbc2117395b81115686dbc750e591155688215b10d464679" }, "seconds": 3.038 }
high-2建造成功2212666297
查看数据
{ "label": "high-2", "inputs": { "client": "high", "structure_seed": 2, "environment_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "1e77addc3587246714b61487299968dbeb329a616732fc8211cd6efafe1b02de", "principal_signature": "4a49832e9487346f3aab8070c9df545149c08a6b440f7707a39317ef571a6e4a", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 29, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "14d6ff0b37f6e45a10ac4485b4fc85dba306fe38d1b93092e5d61eec78c8b2ee" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "05b229b99ddaf2ee979454422a781325920eaaaf5ebc5740a500b49f6cbf02bc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 91, "excavation": 0, "sitework_occupied_cells": 128, "replaced_cells": 30, "new_sitework_cells": 98, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "a76b432710671b78008ca91e92e3d455d816ec35c0730339419103815d231ac9", "bearing_fill": 2 }, "blocks": 12666, "nodes": 297, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.04 ], [ 0, 1.26 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.759 }
high-3建造成功3310763245
查看数据
{ "label": "high-3", "inputs": { "client": "high", "structure_seed": 3, "environment_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8061bd05cfaefca53c2d271cb6c7bf6b5a37942489132c3861debfe81df8f5a7", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 54, "excavation": 0, "sitework_occupied_cells": 96, "replaced_cells": 30, "new_sitework_cells": 66, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "6439dbe885ca23ef1e0f9d59c4c81f57dac81b5648e72d3c9de331b62fa0ed78", "bearing_fill": 2 }, "blocks": 10763, "nodes": 245, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.6 ], [ 0, 0.72 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.1837 }
high-4建造成功4410024250
查看数据
{ "label": "high-4", "inputs": { "client": "high", "structure_seed": 4, "environment_seed": 4 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ff5ab0af3eb9642d01966489d9e66b6a8df303441654fe044bc19ee2a31058d1", "principal_signature": "0ecbac502e5c14df5f525bc7b969259b270209c6058778f3ea7a1b90c459b8d7", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 10, "excavation": 0, "sitework_occupied_cells": 43, "replaced_cells": 33, "new_sitework_cells": 10, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "1a2cf64b042be7578b3d52b3e4a61f014c19526123637bd3f6948270894a8735", "bearing_fill": 0 }, "blocks": 10024, "nodes": 250, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.17 ], [ 1, 0.56 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.2258 }
high-5建造成功5511008287
查看数据
{ "label": "high-5", "inputs": { "client": "high", "structure_seed": 5, "environment_seed": 5 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "63d71d09a15ccf74e0f785777db25aa2d0cee608d08202632623927f162b53df", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 6, "excavation": 0, "sitework_occupied_cells": 39, "replaced_cells": 33, "new_sitework_cells": 6, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "1c56a60f6163350c1891e7d0657c11ca9e3b03c8358dca9c65e23b77b5de960a", "bearing_fill": 1 }, "blocks": 11008, "nodes": 287, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.2 ], [ 1, 0.58 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3364 }
high-6建造成功6612616280
查看数据
{ "label": "high-6", "inputs": { "client": "high", "structure_seed": 6, "environment_seed": 6 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "fd42864159339e5666d8ca58fe9360de670f8d5604eba4521e3bef60c70b08fe", "principal_signature": "93221a536f1bdc7abc04de870c405e2cca657b925776177d81cbaa900eaca0d3", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 29, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "14d6ff0b37f6e45a10ac4485b4fc85dba306fe38d1b93092e5d61eec78c8b2ee" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "05b229b99ddaf2ee979454422a781325920eaaaf5ebc5740a500b49f6cbf02bc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 33, "replaced_cells": 33, "new_sitework_cells": 0, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "47df3ba9586b88f3f40e1e919c69663a74a70e5ff24c7627a31def353bee09dd", "bearing_fill": 0 }, "blocks": 12616, "nodes": 280, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/high-6.litematic", "audit": { "queries": 249, "inventories": 34, "nodes": 280, "digest": "fd42864159339e5666d8ca58fe9360de670f8d5604eba4521e3bef60c70b08fe" }, "seconds": 2.705 }
high-7建造成功7710788280
查看数据
{ "label": "high-7", "inputs": { "client": "high", "structure_seed": 7, "environment_seed": 7 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "6475259f6df1828d1e82706bbd9a8bffc68de08147c0d894df24f0d329e6b8f7", "principal_signature": "7501b0e9657f60678aea722a055e824b1273033e54bbde6d3405abb80cfa0726", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north", "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 15, "excavation": 0, "sitework_occupied_cells": 48, "replaced_cells": 33, "new_sitework_cells": 15, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "68f816e940120a70ab0185eec04060c8cd9bb51e9a72c0ad730f3d2eac74b526", "bearing_fill": 0 }, "blocks": 10788, "nodes": 280, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.27 ], [ 1, 0.65 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3368 }
adaptation-00建造成功0034868145
查看数据
{ "label": "adaptation-00", "inputs": { "environment_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 3.734703416353409 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "84e4d5ef660eb9573a0b335b554fd074ded4b6c5decba1743d63a458d7581f78", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "08d289f6b7daf26f19c836162ac417ecb6058f39ce22a6ecc1b9266ad6afde3c", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 160, "excavation": 0, "sitework_occupied_cells": 166, "replaced_cells": 163, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "9f3f203c3f0e70d3683099b2ae4392d6f85b45d595b8a06946a06450ce7336c9", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.92 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/adaptation-00.litematic", "audit": { "queries": 130, "inventories": 45, "nodes": 145, "digest": "08d289f6b7daf26f19c836162ac417ecb6058f39ce22a6ecc1b9266ad6afde3c" }, "seconds": 3.2378 }
adaptation-01建造成功1034783150
查看数据
{ "label": "adaptation-01", "inputs": { "environment_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 3.734703416353409 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "84e4d5ef660eb9573a0b335b554fd074ded4b6c5decba1743d63a458d7581f78", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "39c4006aa9423cd15929ab97121924ada9192fb184d567f2a4d0107881cb6545", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 160, "excavation": 0, "sitework_occupied_cells": 166, "replaced_cells": 163, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "9f3f203c3f0e70d3683099b2ae4392d6f85b45d595b8a06946a06450ce7336c9", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.92 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.306 }
adaptation-02建造成功2035078184
查看数据
{ "label": "adaptation-02", "inputs": { "environment_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 3.734703416353409 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "84e4d5ef660eb9573a0b335b554fd074ded4b6c5decba1743d63a458d7581f78", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "9a72efcf87f78acf07615fb0106245188006ae25a8d0ce689647aeb7e436dedb", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 202, "excavation": 0, "sitework_occupied_cells": 208, "replaced_cells": 205, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "fb889a40efd56f5b9c62fcd6a6b487a53c92e3e4d6cc0f484ba699eec202cdfb", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.18 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3483 }
adaptation-03建造成功3033786147
查看数据
{ "label": "adaptation-03", "inputs": { "environment_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 3.734703416353409 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "84e4d5ef660eb9573a0b335b554fd074ded4b6c5decba1743d63a458d7581f78", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "2b0aac41adf66eb2f6f654f0077163507cab7c24daef4b34b09737c25ed28f6d", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 71, "excavation": 0, "sitework_occupied_cells": 77, "replaced_cells": 74, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "f2e0f1c8993f8638dbf03b92cfef2b9a78336b814eaa3f1d5071af11f0e6ad38", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.25 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.7543 }
adaptation-04建造成功0130640145
查看数据
{ "label": "adaptation-04", "inputs": { "environment_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 5.044220228402418 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.7 ] } ] }, 2, 7 ] }, "water": null, "digest": "06de23238b6ccf3a76afec91a322bd15ad2c4b2b7c356183ee8bacde06115865", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "098a7f7bb253cfc99e6fb6f10cc119c72f1e7a0144e63d90da626c535be19adc", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 91, "excavation": 0, "sitework_occupied_cells": 103, "replaced_cells": 3, "new_sitework_cells": 100, "strategies": [ "piers" ], "signature": "e33259d98b792b6b19e8f39e470f53bd26b683ded299218bb41fb5d3c3644581", "bearing_fill": 3 }, "blocks": 30640, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.09 ], [ 0, 1.23 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8554 }
adaptation-05建造成功1130555150
查看数据
{ "label": "adaptation-05", "inputs": { "environment_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 5.044220228402418 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.7 ] } ] }, 2, 7 ] }, "water": null, "digest": "06de23238b6ccf3a76afec91a322bd15ad2c4b2b7c356183ee8bacde06115865", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "1d19a86cb09ce8e0c9b48818d5e700762da3ed0cdee65a2ff9bf99cf66e4ea7b", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 91, "excavation": 0, "sitework_occupied_cells": 103, "replaced_cells": 3, "new_sitework_cells": 100, "strategies": [ "piers" ], "signature": "e33259d98b792b6b19e8f39e470f53bd26b683ded299218bb41fb5d3c3644581", "bearing_fill": 3 }, "blocks": 30555, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.09 ], [ 0, 1.23 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8614 }
adaptation-06建造成功2130873184
查看数据
{ "label": "adaptation-06", "inputs": { "environment_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 5.044220228402418 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.7 ] } ] }, 2, 7 ] }, "water": null, "digest": "06de23238b6ccf3a76afec91a322bd15ad2c4b2b7c356183ee8bacde06115865", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "fc97e890f6858a5b0fa479b8a16b57741830a733c3d2aa1ad8f2ae78fe90a660", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 114, "excavation": 0, "sitework_occupied_cells": 126, "replaced_cells": 3, "new_sitework_cells": 123, "strategies": [ "piers" ], "signature": "3a87d4d5b3a048943a78f3aecef13528a3339fb39461af806910cb910ab868ec", "bearing_fill": 3 }, "blocks": 30873, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.32 ], [ 0, 1.52 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9413 }
adaptation-07建造成功3129523147
查看数据
{ "label": "adaptation-07", "inputs": { "environment_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 5.044220228402418 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.7 ] } ] }, 2, 7 ] }, "water": null, "digest": "06de23238b6ccf3a76afec91a322bd15ad2c4b2b7c356183ee8bacde06115865", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "c266d41d1ace4cc3b1bbeb1af93ac9447e285c086a91ac04ce68d96609c55976", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 56, "excavation": 0, "sitework_occupied_cells": 68, "replaced_cells": 3, "new_sitework_cells": 65, "strategies": [ "piers" ], "signature": "9ee500055ac0acbab069a8a150677790a570b5abfa67f50e693124d9482a80a7", "bearing_fill": 2 }, "blocks": 29523, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.74 ], [ 0, 0.94 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.056 }
adaptation-08建造成功0238017145
查看数据
{ "label": "adaptation-08", "inputs": { "environment_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.998757701772476 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f3ff6572715b99e6ac24b42963c7f0b7ce38c7a885dac8614550de6de1a36682", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "3100342d962371986eb7428b1b81880af9d3c8a98ea67e89bb50ef20d63b923d", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 129, "excavation": 0, "sitework_occupied_cells": 138, "replaced_cells": 135, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "2f2ecde66dbb2f344ecbf341b10bf398bb28fa25d6d7814eab4d45bbf15a2cf7", "bearing_fill": 3 }, "blocks": 38017, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.08 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/adaptation-08.litematic", "audit": { "queries": 130, "inventories": 45, "nodes": 145, "digest": "3100342d962371986eb7428b1b81880af9d3c8a98ea67e89bb50ef20d63b923d" }, "seconds": 3.3554 }
adaptation-09建造成功1237932150
查看数据
{ "label": "adaptation-09", "inputs": { "environment_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.998757701772476 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f3ff6572715b99e6ac24b42963c7f0b7ce38c7a885dac8614550de6de1a36682", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "27748d13ef8e3322ab18ff7f1f9d727572c4d0543f36af876e487a94139746af", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 129, "excavation": 0, "sitework_occupied_cells": 138, "replaced_cells": 135, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "2f2ecde66dbb2f344ecbf341b10bf398bb28fa25d6d7814eab4d45bbf15a2cf7", "bearing_fill": 3 }, "blocks": 37932, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.08 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3072 }
adaptation-10建造成功2238227184
查看数据
{ "label": "adaptation-10", "inputs": { "environment_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.998757701772476 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f3ff6572715b99e6ac24b42963c7f0b7ce38c7a885dac8614550de6de1a36682", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "485737ab356a00355d85ac4ceeff6b48d384e470973c1f70e9500ecb99b4c1d6", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 145, "excavation": 0, "sitework_occupied_cells": 154, "replaced_cells": 151, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "b051894534fbd092ed94de1bf5d0d6d6775c30e8244729323eb7846b7e101d13", "bearing_fill": 3 }, "blocks": 38227, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.56 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3597 }
adaptation-11建造成功3236935147
查看数据
{ "label": "adaptation-11", "inputs": { "environment_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.998757701772476 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f3ff6572715b99e6ac24b42963c7f0b7ce38c7a885dac8614550de6de1a36682", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "d71d397216c844eb055281567e81a95e3ac00345dc11ed934d46f81f7234237b", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 86, "excavation": 0, "sitework_occupied_cells": 95, "replaced_cells": 92, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "b22f29cea133dd0e8bd2f35fda8a4883f73f7a62d9b7e31402626935fdbcb379", "bearing_fill": 2 }, "blocks": 36935, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.79 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.7721 }
adaptation-12建造成功0331773149
查看数据
{ "label": "adaptation-12", "inputs": { "environment_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.814364809860294 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": null, "digest": "96e0db82efdbdbe26b58630f206491efaf5f3aa5e2e72c90fe18c6e3983556ac", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "a2e13a81ddb5db5f328d3b2d9f71d5d4b14dd17fc94572533bddc7361b6dd2be", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "de4c2a6c9d2752a79195e3ff5b4929bca547a3d6c8ed5cfcab3f7f594e5a45f8", "bearing_fill": 0 }, "blocks": 31773, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8944 }
adaptation-13建造成功1331662149
查看数据
{ "label": "adaptation-13", "inputs": { "environment_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.814364809860294 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": null, "digest": "96e0db82efdbdbe26b58630f206491efaf5f3aa5e2e72c90fe18c6e3983556ac", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "f2f92f6a28deda004d29e33560c4d81168d489ba112831bf2613487a143586c0", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "de4c2a6c9d2752a79195e3ff5b4929bca547a3d6c8ed5cfcab3f7f594e5a45f8", "bearing_fill": 0 }, "blocks": 31662, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8399 }
adaptation-14建造成功2331957183
查看数据
{ "label": "adaptation-14", "inputs": { "environment_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.814364809860294 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": null, "digest": "96e0db82efdbdbe26b58630f206491efaf5f3aa5e2e72c90fe18c6e3983556ac", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "0e97baf01c12b057deda8c816d39ae1d06e61b1c0f5406206109b273ebfdb1ec", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "cca78d91e91dfd946f51e58967315f184d53ed2dd9fbddd7eb63cfff4b7c336d", "bearing_fill": 0 }, "blocks": 31957, "nodes": 183, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.926 }
adaptation-15建造成功3330671147
查看数据
{ "label": "adaptation-15", "inputs": { "environment_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.814364809860294 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": null, "digest": "96e0db82efdbdbe26b58630f206491efaf5f3aa5e2e72c90fe18c6e3983556ac", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "a883bdc459126f36917c1bdddb724654ae0db19260db157eacc26ee47505a985", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "cf7b488deddbabdfc1cd4a449f672c728a32364891b571911cac52cb174eceeb", "bearing_fill": 0 }, "blocks": 30671, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.0578 }
adaptation-16建造成功0434868145
查看数据
{ "label": "adaptation-16", "inputs": { "environment_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.5187285716175347 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 5, "digest": "5c90903c03656a5eeedc1ab2a56ba88feed142de9ac82ea0911c8da1eaa171bf", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "a754e008cc82e4e085d53e66e967eedf7407edc294cdae8c76c7aa6215bc7e86", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 145, "excavation": 0, "sitework_occupied_cells": 154, "replaced_cells": 151, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "20332c7080ab09dc2bae5881fbf9e680c0d34916e3a51e7cbeb741a56629afd5", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.56 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.2877 }
adaptation-17建造成功1434783150
查看数据
{ "label": "adaptation-17", "inputs": { "environment_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.5187285716175347 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 5, "digest": "5c90903c03656a5eeedc1ab2a56ba88feed142de9ac82ea0911c8da1eaa171bf", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "9141c8ccd5f4d3a9bb9de0f4f46b7ead8402c8652651aa705cd3b67f1c0bb844", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 145, "excavation": 0, "sitework_occupied_cells": 154, "replaced_cells": 151, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "20332c7080ab09dc2bae5881fbf9e680c0d34916e3a51e7cbeb741a56629afd5", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.56 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.2934 }
adaptation-18建造成功2435078184
查看数据
{ "label": "adaptation-18", "inputs": { "environment_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.5187285716175347 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 5, "digest": "5c90903c03656a5eeedc1ab2a56ba88feed142de9ac82ea0911c8da1eaa171bf", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "f0cc873f0397c6fd896645e3c1064eafda6dfd107ca632210e50ef43daab5370", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 146, "excavation": 0, "sitework_occupied_cells": 155, "replaced_cells": 152, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "7cf981d71cc1c920e19b5d9341415f417760af5c0224119e26c9734537dcae0f", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3544 }
adaptation-19建造成功3433786147
查看数据
{ "label": "adaptation-19", "inputs": { "environment_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.5187285716175347 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 5, "digest": "5c90903c03656a5eeedc1ab2a56ba88feed142de9ac82ea0911c8da1eaa171bf", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "3af995513abe134b9092e4c154cc2bac47dcbc307b6e1c21e735886799916075", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 72, "excavation": 0, "sitework_occupied_cells": 80, "replaced_cells": 77, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "78fdbb20364d0aafbaa2fe5f81ddf8acb64aa0f46e5a60fc6cecc3f927750625", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.34 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.7512 }
adaptation-20建造成功0537979145
查看数据
{ "label": "adaptation-20", "inputs": { "environment_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 4.831610348091849 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "4e20d6bb4f9f3cf14a5b7fb428e127f4eda875814caaa64784748d7a652ed422", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8990b87bd710f30cb599d52b3bbe126fe31c12e6998908a450a511f0aaa00423", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 230, "excavation": 0, "sitework_occupied_cells": 242, "replaced_cells": 239, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "d7ba3bc2c15e9e263c3bb85222d01631b98628187a7eb8d3aa96c945bb1be992", "bearing_fill": 3 }, "blocks": 37979, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 7.2 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3077 }
adaptation-21建造成功1537894150
查看数据
{ "label": "adaptation-21", "inputs": { "environment_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 4.831610348091849 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "4e20d6bb4f9f3cf14a5b7fb428e127f4eda875814caaa64784748d7a652ed422", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "3b59d6c752607e03bdf91cca7d409dd30416c3c58e38be22f98046120585728d", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 230, "excavation": 0, "sitework_occupied_cells": 242, "replaced_cells": 239, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "d7ba3bc2c15e9e263c3bb85222d01631b98628187a7eb8d3aa96c945bb1be992", "bearing_fill": 3 }, "blocks": 37894, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 7.2 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3309 }
adaptation-22建造成功2538189184
查看数据
{ "label": "adaptation-22", "inputs": { "environment_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 4.831610348091849 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "4e20d6bb4f9f3cf14a5b7fb428e127f4eda875814caaa64784748d7a652ed422", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "848dac355825463990649064de674c89eb67d821f84e036718fb972b3970486b", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 235, "excavation": 0, "sitework_occupied_cells": 247, "replaced_cells": 244, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "509554f360f76ebc820323daef650470c5db963a424f24b0f7226c771b8bf4a7", "bearing_fill": 3 }, "blocks": 38189, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 7.35 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.61 }
adaptation-23建造成功3536897147
查看数据
{ "label": "adaptation-23", "inputs": { "environment_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 4.831610348091849 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "4e20d6bb4f9f3cf14a5b7fb428e127f4eda875814caaa64784748d7a652ed422", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "b3b3edb6aff23e69e1d647deff36ce017ff1fd5ce077fa6e1a92b74bfc2281fe", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 128, "excavation": 0, "sitework_occupied_cells": 140, "replaced_cells": 137, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "cd2ba461c8b8a0d20cb9c420627b9b1af2944dc29fb6f251102d890cfd23c575", "bearing_fill": 2 }, "blocks": 36897, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.14 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.7765 }
adaptation-24建造成功0634868145
查看数据
{ "label": "adaptation-24", "inputs": { "environment_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.6542444831229557 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "8d11645017e24042cbb11bc5adb63ce365eadbfb6f13163e43c4ebfb0c4338d9", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8c986b182b403fd0c966476000600ce8a2ec758f4e0f43430bf4f5cecd5c77a3", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 144, "excavation": 0, "sitework_occupied_cells": 150, "replaced_cells": 147, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "5b9514b098a8e3178502f498ed552c6dabd458150e6b20b601a0297bb25b374a", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.44 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3615 }
adaptation-25建造成功1634783150
查看数据
{ "label": "adaptation-25", "inputs": { "environment_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.6542444831229557 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "8d11645017e24042cbb11bc5adb63ce365eadbfb6f13163e43c4ebfb0c4338d9", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "02cf1e43c0a739f805cf26d3f7248f30d543069e4d8ca14964f6bc72dd915125", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 144, "excavation": 0, "sitework_occupied_cells": 150, "replaced_cells": 147, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "5b9514b098a8e3178502f498ed552c6dabd458150e6b20b601a0297bb25b374a", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.44 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.6579 }
adaptation-26建造成功2635078184
查看数据
{ "label": "adaptation-26", "inputs": { "environment_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.6542444831229557 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "8d11645017e24042cbb11bc5adb63ce365eadbfb6f13163e43c4ebfb0c4338d9", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "832853c053e1a6ad5f762ae9fa4d821dd30a77ce88f726347c4a3cb8a337735d", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 152, "excavation": 0, "sitework_occupied_cells": 158, "replaced_cells": 155, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "f6d898f6bd30749f8131b00f76c23ba1a066d484cf36925efa1978a9ff25813f", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.68 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5647 }
adaptation-27建造成功3633786147
查看数据
{ "label": "adaptation-27", "inputs": { "environment_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 0.6542444831229557 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0.4 ] } ] }, 2, 7 ] }, "water": 5, "digest": "8d11645017e24042cbb11bc5adb63ce365eadbfb6f13163e43c4ebfb0c4338d9", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "47c2581072a3d50f2bea8c2ffaac216967fc4a92c7a24f19694684ef89950beb", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 64, "excavation": 0, "sitework_occupied_cells": 70, "replaced_cells": 67, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "83048d139205f241eb0779a4f4d0f99bee6b2b26701716c2691f723782d808c4", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.04 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8857 }
adaptation-28建造成功0737979145
查看数据
{ "label": "adaptation-28", "inputs": { "environment_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.4943872051732314 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "9fdea9ccf78cba68cae1b77dabb0f36997911b40e650447bbb7bf3b45b3baa16", "held_out_composition": false, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "fc491d456d3cb269f2ea6c59017f3dee77653efc8f46af1ab7fd303530c30d53", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 180, "excavation": 0, "sitework_occupied_cells": 192, "replaced_cells": 189, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "386c566c78ebafc637086d9ad8bb030a5f7fde883a97942f6da90526c79a6795", "bearing_fill": 3 }, "blocks": 37979, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.7 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5182 }
adaptation-29建造成功1737894150
查看数据
{ "label": "adaptation-29", "inputs": { "environment_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.4943872051732314 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "9fdea9ccf78cba68cae1b77dabb0f36997911b40e650447bbb7bf3b45b3baa16", "held_out_composition": false, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "d4b5f0026baa714bf5f881d52502a5c2780340aa4889b2629e1857d88e15343a", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 180, "excavation": 0, "sitework_occupied_cells": 192, "replaced_cells": 189, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "386c566c78ebafc637086d9ad8bb030a5f7fde883a97942f6da90526c79a6795", "bearing_fill": 3 }, "blocks": 37894, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.7 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.4902 }
adaptation-30建造成功2738189184
查看数据
{ "label": "adaptation-30", "inputs": { "environment_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.4943872051732314 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "9fdea9ccf78cba68cae1b77dabb0f36997911b40e650447bbb7bf3b45b3baa16", "held_out_composition": false, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "2d208eaefd746245452c1e9c7a358fb40dd69276755377f15868d9db2a4f65d3", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 201, "excavation": 0, "sitework_occupied_cells": 213, "replaced_cells": 210, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "7c0dc86b803fa8bafa3c68abcc38c0872c67072c4866f333e062ceb8508659bb", "bearing_fill": 3 }, "blocks": 38189, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.33 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5991 }
adaptation-31建造成功3736897147
查看数据
{ "label": "adaptation-31", "inputs": { "environment_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 0.4943872051732314 ] } ] }, { "op": "radial", "args": [ 7, 8, 22, 0 ] } ] }, 2, 7 ] }, "water": 6, "digest": "9fdea9ccf78cba68cae1b77dabb0f36997911b40e650447bbb7bf3b45b3baa16", "held_out_composition": false, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "42095a085b244c49a5187326e2d01a3a32df3b031cd8a90e590fafa307668602", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 105, "excavation": 0, "sitework_occupied_cells": 117, "replaced_cells": 114, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "0d9746456de3366089412138642bc61869856f0eec23f52196b03eeb72aeaa9c", "bearing_fill": 2 }, "blocks": 36897, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.45 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8854 }
adaptation-32建造成功0830380149
查看数据
{ "label": "adaptation-32", "inputs": { "environment_seed": 8, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.4906793537687184 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "2e63123e44f63ed6bb126e0206d18e6702dc1de0fcb11befe7fb54245248c2a8", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "3c274d90f3a8569e9f7843c343bd502808f282daed8fe2a7513ed76cfcbf7b16", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 40, "excavation": 0, "sitework_occupied_cells": 46, "replaced_cells": 3, "new_sitework_cells": 43, "strategies": [ "stepped" ], "signature": "2479400e5e09b4a3a99ac253ae9a04f853f7c3f9d86fa205dac8d8abd3fd9342", "bearing_fill": 1 }, "blocks": 30380, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.52 ], [ 1, 0.92 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.1385 }
adaptation-33建造成功1830269149
查看数据
{ "label": "adaptation-33", "inputs": { "environment_seed": 8, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.4906793537687184 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "2e63123e44f63ed6bb126e0206d18e6702dc1de0fcb11befe7fb54245248c2a8", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "c0ed5cdf18cce3a64d9fdc8c8680cf418be8ac1804a4f1d1b64c0b792a7a39b2", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 40, "excavation": 0, "sitework_occupied_cells": 46, "replaced_cells": 3, "new_sitework_cells": 43, "strategies": [ "stepped" ], "signature": "2479400e5e09b4a3a99ac253ae9a04f853f7c3f9d86fa205dac8d8abd3fd9342", "bearing_fill": 1 }, "blocks": 30269, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.52 ], [ 1, 0.92 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0352 }
adaptation-34建造成功2830608183
查看数据
{ "label": "adaptation-34", "inputs": { "environment_seed": 8, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.4906793537687184 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "2e63123e44f63ed6bb126e0206d18e6702dc1de0fcb11befe7fb54245248c2a8", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ca1306b5f06cb0d3b3536e6bbff4a254dede1621dacaf80056e34572c1b4d7bb", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 84, "excavation": 0, "sitework_occupied_cells": 90, "replaced_cells": 3, "new_sitework_cells": 87, "strategies": [ "stepped" ], "signature": "964daf58bf2502bfc352524d9988d6b32a90dbe9eefbf021d835120162e96e84", "bearing_fill": 1 }, "blocks": 30608, "nodes": 183, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.96 ], [ 1, 1.27 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9638 }
adaptation-35建造成功3829262147
查看数据
{ "label": "adaptation-35", "inputs": { "environment_seed": 8, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.4906793537687184 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "2e63123e44f63ed6bb126e0206d18e6702dc1de0fcb11befe7fb54245248c2a8", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ffafe7f78490caa2e83aaeea698da305f1128aafd8019863b491215607703d9e", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 24, "excavation": 0, "sitework_occupied_cells": 30, "replaced_cells": 3, "new_sitework_cells": 27, "strategies": [ "stepped" ], "signature": "413e4d26c3d97b6be9e90e464620a3c2d3a1742b6dfc9c19f722184429905df4", "bearing_fill": 1 }, "blocks": 29262, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.36 ], [ 1, 0.71 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/adaptation-35.litematic", "audit": { "queries": 134, "inventories": 28, "nodes": 147, "digest": "ffafe7f78490caa2e83aaeea698da305f1128aafd8019863b491215607703d9e" }, "seconds": 2.6003 }
adaptation-36建造成功0937979145
查看数据
{ "label": "adaptation-36", "inputs": { "environment_seed": 9, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 5.129876042788569 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "b1ad2b18771e9590495fad037971e5ae73d8c9362c543546a2ca47b773efe6c0", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8b9cd8ba0dc13256277d0c64a4de9ed8693ace20c9ba05ffb5e98be4e7c5a67a", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 205, "excavation": 0, "sitework_occupied_cells": 214, "replaced_cells": 211, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "0afef37099a081ec8f36a5d41d07bfee1349e1ce1c325f5f7254b2c86901f326", "bearing_fill": 3 }, "blocks": 37979, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.36 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3785 }
adaptation-37建造成功1937894150
查看数据
{ "label": "adaptation-37", "inputs": { "environment_seed": 9, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 5.129876042788569 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "b1ad2b18771e9590495fad037971e5ae73d8c9362c543546a2ca47b773efe6c0", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "7c59407b55906b167c328aba7afabe289e23d133e692415fc63b094e63575b9a", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 205, "excavation": 0, "sitework_occupied_cells": 214, "replaced_cells": 211, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "0afef37099a081ec8f36a5d41d07bfee1349e1ce1c325f5f7254b2c86901f326", "bearing_fill": 3 }, "blocks": 37894, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.36 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3589 }
adaptation-38建造成功2938189184
查看数据
{ "label": "adaptation-38", "inputs": { "environment_seed": 9, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 5.129876042788569 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "b1ad2b18771e9590495fad037971e5ae73d8c9362c543546a2ca47b773efe6c0", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "9d8054c6d78a71ecf44c91dfdf82c2ba4fcfc251ca93cc26d7782412428921f5", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 256, "excavation": 0, "sitework_occupied_cells": 265, "replaced_cells": 262, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "0da5b1a01a81e3f180bf7fe6d46e5d7b0e32ea9790f4ae3d4fa247313b0267d1", "bearing_fill": 3 }, "blocks": 38189, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 7.89 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5646 }
adaptation-39建造成功3936897147
查看数据
{ "label": "adaptation-39", "inputs": { "environment_seed": 9, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 5.129876042788569 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "b1ad2b18771e9590495fad037971e5ae73d8c9362c543546a2ca47b773efe6c0", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "b0eb0550c250801a38af8932d0bbc117b511e1a255b6314a74b72418385afe41", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 109, "excavation": 0, "sitework_occupied_cells": 118, "replaced_cells": 115, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "f37e67a01fb0f3f69f56c8c83d54cde3c43c46aec2eab7f4b00f692d270d12b4", "bearing_fill": 2 }, "blocks": 36897, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.48 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8899 }
adaptation-40建造成功01030748149
查看数据
{ "label": "adaptation-40", "inputs": { "environment_seed": 10, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.544802917156937 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "42908eba4ec4346b89d7b0a3d64976055aeeb4f3cfbe89ebf337af41ba8f597e", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8aa210c8dadba4cb790dddc6eb238a752f01c74591b7ec01ff722af07f37f59c", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 67, "excavation": 0, "sitework_occupied_cells": 74, "replaced_cells": 1, "new_sitework_cells": 73, "strategies": [ "stepped" ], "signature": "a7a78fb73ef80a289270539975e22a2811a6137afbcee1c966c2c9d8f997967f", "bearing_fill": 1 }, "blocks": 30748, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.76 ], [ 1, 1.06 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0013 }
adaptation-41建造成功11030637149
查看数据
{ "label": "adaptation-41", "inputs": { "environment_seed": 10, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.544802917156937 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "42908eba4ec4346b89d7b0a3d64976055aeeb4f3cfbe89ebf337af41ba8f597e", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "2aa4468f5eee97547cc30520f06c6c322686f4cd351dfe041afa860c6bfbf23a", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 67, "excavation": 0, "sitework_occupied_cells": 74, "replaced_cells": 1, "new_sitework_cells": 73, "strategies": [ "stepped" ], "signature": "a7a78fb73ef80a289270539975e22a2811a6137afbcee1c966c2c9d8f997967f", "bearing_fill": 1 }, "blocks": 30637, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.76 ], [ 1, 1.06 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.836 }
adaptation-42建造成功21030912183
查看数据
{ "label": "adaptation-42", "inputs": { "environment_seed": 10, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.544802917156937 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "42908eba4ec4346b89d7b0a3d64976055aeeb4f3cfbe89ebf337af41ba8f597e", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "d22d4e8a226756d9b6bcd3e9d414aa2a27c733868debe5451309fdcd3e73cd56", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 47, "excavation": 0, "sitework_occupied_cells": 54, "replaced_cells": 1, "new_sitework_cells": 53, "strategies": [ "stepped" ], "signature": "519ec2cba7eea84018df6372e79e703778cd9990ec187b6804050cf1638c3b20", "bearing_fill": 0 }, "blocks": 30912, "nodes": 183, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.56 ], [ 1, 0.81 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0685 }
adaptation-43建造成功31029609147
查看数据
{ "label": "adaptation-43", "inputs": { "environment_seed": 10, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 4.544802917156937 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "42908eba4ec4346b89d7b0a3d64976055aeeb4f3cfbe89ebf337af41ba8f597e", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "21e3348e75f0ccbdd8de4bdf2731699eef0c53532aa0278f41101f188e6251b4", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 33, "excavation": 0, "sitework_occupied_cells": 39, "replaced_cells": 3, "new_sitework_cells": 36, "strategies": [ "stepped" ], "signature": "8865f7bb2eb8cda3204332725a05b3a0e416d6721c290a01464d3257e9255a4a", "bearing_fill": 1 }, "blocks": 29609, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.45 ], [ 1, 0.74 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.2583 }
adaptation-44建造成功01134868145
查看数据
{ "label": "adaptation-44", "inputs": { "environment_seed": 11, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 2.1696793309977784 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "ccacffc044d46bc8047e50542aaf10b28a68de02a9d472912996fbe30ebe01d2", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "0c9e2b8960d583643f158519632800250c413b1470369613b2895ba7ae36cc1e", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 135, "excavation": 0, "sitework_occupied_cells": 141, "replaced_cells": 138, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "7de531d181925ba6e83ebecf4e2740498e54d4b6027e17568c7cc4148c6f50f0", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.17 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5996 }
adaptation-45建造成功11134783150
查看数据
{ "label": "adaptation-45", "inputs": { "environment_seed": 11, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 2.1696793309977784 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "ccacffc044d46bc8047e50542aaf10b28a68de02a9d472912996fbe30ebe01d2", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "75e8d2ea6c1bdeb5711f3f926c73f057a919940b1f8acbbef6b582440deaea16", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 135, "excavation": 0, "sitework_occupied_cells": 141, "replaced_cells": 138, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "7de531d181925ba6e83ebecf4e2740498e54d4b6027e17568c7cc4148c6f50f0", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.17 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.6004 }
adaptation-46建造成功21135078184
查看数据
{ "label": "adaptation-46", "inputs": { "environment_seed": 11, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 2.1696793309977784 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "ccacffc044d46bc8047e50542aaf10b28a68de02a9d472912996fbe30ebe01d2", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "b99320533462623855bb5437d6558736720e32bf6ec78e80c5eff1d6b3fa3da0", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 192, "excavation": 0, "sitework_occupied_cells": 198, "replaced_cells": 195, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "a167157c62c21831e4d05a4c0174c8b355f4b947b2b82736f613f944ba0f6293", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.88 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.606 }
adaptation-47建造成功31133786147
查看数据
{ "label": "adaptation-47", "inputs": { "environment_seed": 11, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 2.1696793309977784 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "ccacffc044d46bc8047e50542aaf10b28a68de02a9d472912996fbe30ebe01d2", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "3fadb921ef5b1ed0a22b0277090c7f5683b9e0bbc8fcc640ec248e0bf787364e", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 73, "excavation": 0, "sitework_occupied_cells": 79, "replaced_cells": 76, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "a41f52908bd3bbebc2e2bc08214a90ebb86957304464ff536e155e09991c58ee", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.31 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8526 }
adaptation-48建造成功01234868145
查看数据
{ "label": "adaptation-48", "inputs": { "environment_seed": 12, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.3321687906112092 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "e4ac69d47cbe020b99a63996c2d154f16254095a539a9b3e62dfb8c67d621cf1", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "93ef6fc6f3a4aeec785e5553d3dbed6d182df768affc5727eb87e3aa7db39497", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 137, "excavation": 0, "sitework_occupied_cells": 144, "replaced_cells": 141, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "1be5a9b8c5feaa4af98fb24ba60e9c025a55e2d0bc08e0393558a505a7949eeb", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.26 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5006 }
adaptation-49建造成功11234783150
查看数据
{ "label": "adaptation-49", "inputs": { "environment_seed": 12, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.3321687906112092 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "e4ac69d47cbe020b99a63996c2d154f16254095a539a9b3e62dfb8c67d621cf1", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "947051c616279aa63c7f55dfd7b4325e9b2dd26b018ed30709e9879e79cf7b66", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 137, "excavation": 0, "sitework_occupied_cells": 144, "replaced_cells": 141, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "1be5a9b8c5feaa4af98fb24ba60e9c025a55e2d0bc08e0393558a505a7949eeb", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.26 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.4779 }
adaptation-50建造成功21235078184
查看数据
{ "label": "adaptation-50", "inputs": { "environment_seed": 12, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.3321687906112092 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "e4ac69d47cbe020b99a63996c2d154f16254095a539a9b3e62dfb8c67d621cf1", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "5f4c95ea45bbbc57f3e3e6f3b7c6a4dfc91094dd3a3eaf100cbff0584cdb1bae", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 127, "excavation": 0, "sitework_occupied_cells": 134, "replaced_cells": 131, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "71ece5bfffae3449f4a5bf8070f22af12f848c50cc09a04c6aafd9eaed7ee5ad", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.96 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5222 }
adaptation-51建造成功31233786147
查看数据
{ "label": "adaptation-51", "inputs": { "environment_seed": 12, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.035, 4 ] }, { "op": "wave", "args": [ 0.4, 0.13, 0.11, 1.3321687906112092 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.035, 0, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "e4ac69d47cbe020b99a63996c2d154f16254095a539a9b3e62dfb8c67d621cf1", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "fdeee7f9a77f54736be05211082e98ef9ffd43981641d88084b2e9eb0839362a", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 68, "excavation": 0, "sitework_occupied_cells": 74, "replaced_cells": 71, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "c42b2e523f513d8eab2144419045d97dc9319033120906040c23c2d92a9cb5c0", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.16 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8849 }
adaptation-52建造成功01332236149
查看数据
{ "label": "adaptation-52", "inputs": { "environment_seed": 13, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 3.358718313814367 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "0d5e960996b34fcec7d4b138113eb0cb25b7d2096636fd96b2fb104c0007d1ea", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "fd6335a8ba618d42a7e0a0f93757deacc15fb79f98bf93e5cee74024a383cdff", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "de4c2a6c9d2752a79195e3ff5b4929bca547a3d6c8ed5cfcab3f7f594e5a45f8", "bearing_fill": 0 }, "blocks": 32236, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.274 }
adaptation-53建造成功11332125149
查看数据
{ "label": "adaptation-53", "inputs": { "environment_seed": 13, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 3.358718313814367 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "0d5e960996b34fcec7d4b138113eb0cb25b7d2096636fd96b2fb104c0007d1ea", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "9e45a663afc02f97bca7e8a3335246ae1c7c5ba0eccd384b9c00b97fe0077c22", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "de4c2a6c9d2752a79195e3ff5b4929bca547a3d6c8ed5cfcab3f7f594e5a45f8", "bearing_fill": 0 }, "blocks": 32125, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0396 }
adaptation-54建造成功21332420183
查看数据
{ "label": "adaptation-54", "inputs": { "environment_seed": 13, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 3.358718313814367 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "0d5e960996b34fcec7d4b138113eb0cb25b7d2096636fd96b2fb104c0007d1ea", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "4a8ca4f1d3087c97ce4c596c84951de0d69a65f0ac1725f4b3508ff8ecefb083", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "cca78d91e91dfd946f51e58967315f184d53ed2dd9fbddd7eb63cfff4b7c336d", "bearing_fill": 0 }, "blocks": 32420, "nodes": 183, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.1082 }
adaptation-55建造成功31331134147
查看数据
{ "label": "adaptation-55", "inputs": { "environment_seed": 13, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0.8, 0.13, 0.11, 3.358718313814367 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": null, "digest": "0d5e960996b34fcec7d4b138113eb0cb25b7d2096636fd96b2fb104c0007d1ea", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "97e831ea57d0f757da2682eb27ff1fcbbfdfc6e0e3554dc28c3d55fb823f70ff", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "cf7b488deddbabdfc1cd4a449f672c728a32364891b571911cac52cb174eceeb", "bearing_fill": 0 }, "blocks": 31134, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.2837 }
adaptation-56建造成功01434868145
查看数据
{ "label": "adaptation-56", "inputs": { "environment_seed": 14, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 2.046650951809069 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "77dcc3135313f9633c0dd1c3b6b441f52c7d81e45a15a202ef075e29b912b9a0", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "6df76fd879a6799c146a2deaf01d2e6f1cd25757d6e76c7b5768805044911759", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 139, "excavation": 0, "sitework_occupied_cells": 145, "replaced_cells": 142, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "887e7748b1f79ecd0ee98a12d67b60f3c63be34e06ad70ad7126016c2b2e6c40", "bearing_fill": 3 }, "blocks": 34868, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.29 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5232 }
adaptation-57建造成功11434783150
查看数据
{ "label": "adaptation-57", "inputs": { "environment_seed": 14, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 2.046650951809069 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "77dcc3135313f9633c0dd1c3b6b441f52c7d81e45a15a202ef075e29b912b9a0", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "e704a0c55e5b9a52835fd5292c13d162c8de7cc88ed67521879ea05fccb2d84b", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 139, "excavation": 0, "sitework_occupied_cells": 145, "replaced_cells": 142, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "887e7748b1f79ecd0ee98a12d67b60f3c63be34e06ad70ad7126016c2b2e6c40", "bearing_fill": 3 }, "blocks": 34783, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.29 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5237 }
adaptation-58建造成功21435078184
查看数据
{ "label": "adaptation-58", "inputs": { "environment_seed": 14, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 2.046650951809069 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "77dcc3135313f9633c0dd1c3b6b441f52c7d81e45a15a202ef075e29b912b9a0", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "6076e7b75d817593167c46c823a8ce0a4949a7028356ad3f5126d03e1303994e", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 196, "excavation": 0, "sitework_occupied_cells": 202, "replaced_cells": 199, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "5b4732dd893c1a7069699d43bcbf773e66ba8f678dd77c55b2ed6fea9eea064f", "bearing_fill": 3 }, "blocks": 35078, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.0 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.6966 }
adaptation-59建造成功31433786147
查看数据
{ "label": "adaptation-59", "inputs": { "environment_seed": 14, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.045, -0.035, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 2.046650951809069 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0.035, -0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 5, "digest": "77dcc3135313f9633c0dd1c3b6b441f52c7d81e45a15a202ef075e29b912b9a0", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "7ecb6dba1dd1754f4c1d77b56ca1bd940c7d083aff412d049217b5ec1143b47e", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 72, "excavation": 0, "sitework_occupied_cells": 78, "replaced_cells": 75, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "dbd2fd0f8c36451be5cc4fcead2b839e9ccd25530145bf2fee9e81dc0da9a5d8", "bearing_fill": 2 }, "blocks": 33786, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.28 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8457 }
adaptation-60建造成功01537979145
查看数据
{ "label": "adaptation-60", "inputs": { "environment_seed": 15, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 1.7100020316024998 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f82bc80879581470cbb4ce26879ddb7913e0620bab298172dc517745febeb208", "held_out_composition": true, "client": "hillside_home", "structure_seed": 0 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "7b502ff86ddd65eb20b515fa24ca3ca07fbd5cc1cdd2c39b9c030f9e0a444d66", "principal_signature": "8fb9f4fe6e454bbacb4b408db64c22ea6a7757178a887ac0f4ba5e2b82991279", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 24, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "3416afed47dd59632e7188dc3986c9ab1659730846781fe6c44c9b917de0bdfc" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4b31df3aedf0765c5d0aeb2fbaba44b0b64ae6ab0ca07849a5b23533c24ec3e8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 171, "excavation": 0, "sitework_occupied_cells": 180, "replaced_cells": 177, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "77ddf64f03612e253cc5de865007c416af79da3e9d2d923163c3e6a6783e75aa", "bearing_fill": 3 }, "blocks": 37979, "nodes": 145, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.34 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/core/adaptation-60.litematic", "audit": { "queries": 130, "inventories": 45, "nodes": 145, "digest": "7b502ff86ddd65eb20b515fa24ca3ca07fbd5cc1cdd2c39b9c030f9e0a444d66" }, "seconds": 3.8041 }
adaptation-61建造成功11537894150
查看数据
{ "label": "adaptation-61", "inputs": { "environment_seed": 15, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 1.7100020316024998 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f82bc80879581470cbb4ce26879ddb7913e0620bab298172dc517745febeb208", "held_out_composition": true, "client": "hillside_home", "structure_seed": 1 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8b6f6acbe6e787aab505b91c599629a8ddc5be1216310e68015b5e5eef9e0307", "principal_signature": "cb4d7a4627f4ef15813adbb53d4afa6174448280793ce9e4c411655acd230304", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 13 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "f780acc7fe2fb60feaa8f26bd4d63dd14bc2bb527214a80c18ae4dd7eda78437" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8f52a00c9a658266c8b26a50f1d72d28cb1556f09f71f3d7266bc28251192fea" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 171, "excavation": 0, "sitework_occupied_cells": 180, "replaced_cells": 177, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "77ddf64f03612e253cc5de865007c416af79da3e9d2d923163c3e6a6783e75aa", "bearing_fill": 3 }, "blocks": 37894, "nodes": 150, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.34 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.438 }
adaptation-62建造成功21538189184
查看数据
{ "label": "adaptation-62", "inputs": { "environment_seed": 15, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 1.7100020316024998 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f82bc80879581470cbb4ce26879ddb7913e0620bab298172dc517745febeb208", "held_out_composition": true, "client": "gabled_hall", "structure_seed": 2 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "cc31f8a0f1711da724fe189790c17e1f822f2e019f40533b3757645e74134405", "principal_signature": "71c8d2856751f2481fe665a97fdac5d1fed46d84a7d87aff2b5e42685e8aa2c6", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "cc72114e326b537b47b2975615348885453f2e41911747be521ccc6e98da48e2" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "4b752e31311a835a832de38e3857a24794bcad0a8dc8ac427033a06a5bf91f8f" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.bedroom", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 194, "excavation": 0, "sitework_occupied_cells": 203, "replaced_cells": 200, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "43c3a98967e60b496e922054cab08dcb03fd7e41aeb371700e3f3d0b205f128b", "bearing_fill": 3 }, "blocks": 38189, "nodes": 184, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 6.03 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.5165 }
adaptation-63建造成功31536897147
查看数据
{ "label": "adaptation-63", "inputs": { "environment_seed": 15, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.045, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.11, 1.7100020316024998 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.045, 4 ] }, { "op": "wave", "args": [ 0.6, 0.07, 0.19, 0 ] } ] }, { "op": "transform", "args": [ { "op": "radial", "args": [ 8, 9, 28, 0.7 ] }, 2, -1, 1.2 ] } ] }, 2, 7 ] }, "water": 6, "digest": "f82bc80879581470cbb4ce26879ddb7913e0620bab298172dc517745febeb208", "held_out_composition": true, "client": "high_house", "structure_seed": 3 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "c51285db40117963d09343d2673ac4fa90ea4c1810e2d1db404d89300a33e481", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 100, "excavation": 0, "sitework_occupied_cells": 109, "replaced_cells": 106, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "95edffec9060ec4257c02fe543b9403c74cc5407e9f79a69b92073cfea38130c", "bearing_fill": 2 }, "blocks": 36897, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.21 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.9124 }
stress-00建造成功0200036429147
查看数据
{ "label": "stress-00", "inputs": { "environment_seed": 2000, "structure_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.12, -0.15, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 5.127977154011788 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "9ad307ab5cf5fbf4db3cfc9fa45a5f50b483d215ad4a42f984ad1286e015fbad" }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "1e7170e9b1cf14092ef486829a87a8148d7344186cf8973f297d4944d2c906e9", "principal_signature": "f16c246d44d20cfa8bf089142abe4e041e14679920cf452967e09f6a21dc771d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "north" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 105, "excavation": 0, "sitework_occupied_cells": 114, "replaced_cells": 68, "new_sitework_cells": 46, "strategies": [ "piers" ], "signature": "0b02fdd059836fbd48e2ed843053aa1b3b77b7a87fdfe1f52142f05fba426334", "bearing_fill": 2 }, "blocks": 36429, "nodes": 147, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.5 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8606 }
stress-01建造成功1200140998199
查看数据
{ "label": "stress-01", "inputs": { "environment_seed": 2001, "structure_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.2, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 2.3640698433630662 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "a3567f8be4b9afbd21fb0c37b63993ef05d6c4cfa909193257f234bf348e913e" }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "829c1e12bebf82600af4d728cdea029bb3388ee846d6790e4a809d7b7ae89fab", "principal_signature": "970f31879eb26a26223e0c4f3f167c0b927b2086d7bd9d043b8ff0218ce3ffa5", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 29, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "14d6ff0b37f6e45a10ac4485b4fc85dba306fe38d1b93092e5d61eec78c8b2ee" ], [ "roof.profile", [ 11, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "05b229b99ddaf2ee979454422a781325920eaaaf5ebc5740a500b49f6cbf02bc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 6, 0 ], "room.workshop", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 143, "excavation": 0, "sitework_occupied_cells": 186, "replaced_cells": 71, "new_sitework_cells": 115, "strategies": [ "piers" ], "signature": "68ee46a2367b84bba9543fbdc23183c2de256820f703896798c04eb031dcc9ab", "bearing_fill": 2 }, "blocks": 40998, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.28 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.4934 }
stress-02拒绝建造:地面高差超限22002——
查看数据
{ "label": "stress-02", "inputs": { "environment_seed": 2002, "structure_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, -0.15, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.17, 4.736375910500318 ] } ] }, -2, 20 ] }, "water": null, "frozen_digest": "8a9a6b3dede9cffa0ce8cf580ecf4e17119eaf98871e1cd49cf89262677e75cc" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 11, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 11, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 11, permitted 5" } ], "seconds": 0.3797 }
stress-03拒绝建造:地面高差超限32003——
查看数据
{ "label": "stress-03", "inputs": { "environment_seed": 2003, "structure_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, 0.2, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.17, 5.447432368230461 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "29fc26399b0927a831fc9da20bdf5168727e93465df879236c18b41aace18793" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 10, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" } ], "seconds": 0.2581 }
stress-04建造成功4200436684146
查看数据
{ "label": "stress-04", "inputs": { "environment_seed": 2004, "structure_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.12, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.17, 4.272017841902214 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "e9a2a6807f75e575207c68a363c4c36cb967edc427fea7153f56de3e900ef743" }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "5fe1b40e84c0f4d522efd7837ea76fa185a8c4c44a78f71c59950937ee78ee76", "principal_signature": "0ecbac502e5c14df5f525bc7b969259b270209c6058778f3ea7a1b90c459b8d7", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 74, "excavation": 0, "sitework_occupied_cells": 89, "replaced_cells": 35, "new_sitework_cells": 54, "strategies": [ "piers" ], "signature": "6459ab7d5e112519fae87e4102ba3cc626009456023480cd5fe22a770405cdd6", "bearing_fill": 2 }, "blocks": 36684, "nodes": 146, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8874 }
stress-05拒绝建造:地面高差超限52005——
查看数据
{ "label": "stress-05", "inputs": { "environment_seed": 2005, "structure_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, 0, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 3.1088324431440615 ] } ] }, -2, 20 ] }, "water": 12, "frozen_digest": "8877ea50dbfa8c51420669384be8320703e1391d3222f8d3f60b65cf20480b81" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 12, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 12, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 12, permitted 5" } ], "seconds": 0.2706 }
stress-06拒绝建造:地面高差超限62006——
查看数据
{ "label": "stress-06", "inputs": { "environment_seed": 2006, "structure_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.12, -0.15, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 2.606113206720962 ] } ] }, -2, 20 ] }, "water": 12, "frozen_digest": "21d73695147e70be6f550b550ed894af73916c4cd2b57a79b9677ee358246a1e" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 10, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" } ], "seconds": 0.5493 }
stress-07拒绝建造:地面高差超限72007——
查看数据
{ "label": "stress-07", "inputs": { "environment_seed": 2007, "structure_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, 0.2, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 0.7106689799805972 ] } ] }, -2, 20 ] }, "water": 12, "frozen_digest": "28a4417c18feb041b11ede6c0d08925af7b866e4fd6d683da63cb4ed9ece8ef6" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 8, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" } ], "seconds": 0.2742 }
stress-08拒绝建造:地面高差超限02008——
查看数据
{ "label": "stress-08", "inputs": { "environment_seed": 2008, "structure_seed": 0, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.2, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 5.3468683245721005 ] } ] }, -2, 20 ] }, "water": 12, "frozen_digest": "e5d9b98db3b96f9ee8e74e7918e5007c11ea13f16cb47f39dd735c66081a6c26" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 10, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 10, permitted 5" } ], "seconds": 0.2885 }
stress-09拒绝建造:地面高差超限12009——
查看数据
{ "label": "stress-09", "inputs": { "environment_seed": 2009, "structure_seed": 1, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.28, -0.15, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 4.043361591583398 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "615d19fcdb8adbdf2b33dfcc2b75d9f094d33985b6c79502c17dd8832595845d" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 8, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" } ], "seconds": 0.3968 }
stress-10拒绝建造:地面高差超限22010——
查看数据
{ "label": "stress-10", "inputs": { "environment_seed": 2010, "structure_seed": 2, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, 0.2, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 1.458550053272991 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "865249ffe712abf4e3dda38e3a1b5dff57217b1532e111f2483de0b8e89136a2" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 19, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 19, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 19, permitted 5" } ], "seconds": 0.4026 }
stress-11拒绝建造:地面高差超限32011——
查看数据
{ "label": "stress-11", "inputs": { "environment_seed": 2011, "structure_seed": 3, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.45, -0.15, 4 ] }, { "op": "wave", "args": [ 5, 0.13, 0.17, 3.7543484663529205 ] } ] }, -2, 20 ] }, "water": null, "frozen_digest": "314661e574d4aebd3c0cc8423d70a545e6c5a8eb883ca4d1f7fd4b9eadd07761" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 12, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 12, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 12, permitted 5" } ], "seconds": 0.2553 }
stress-12建造成功4201236487146
查看数据
{ "label": "stress-12", "inputs": { "environment_seed": 2012, "structure_seed": 4, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.12, -0.15, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 2.959681125591585 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "fc37d1e7029d8b49c5f4de51b065bb697522eae61dcd79cdbd2f0cae05ff945f" }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "b159a9559b08f0eb4d868a43db2cde6e9a30b39b2acc8dcaf8c36ab47f671a53", "principal_signature": "0ecbac502e5c14df5f525bc7b969259b270209c6058778f3ea7a1b90c459b8d7", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 116, "excavation": 0, "sitework_occupied_cells": 137, "replaced_cells": 48, "new_sitework_cells": 89, "strategies": [ "piers" ], "signature": "a23b14e480bd5a0e078e6518644c3c5bdd288b1708bd40cc208e003b16dedb95", "bearing_fill": 2 }, "blocks": 36487, "nodes": 146, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.33 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8638 }
stress-13拒绝建造:地面高差超限52013——
查看数据
{ "label": "stress-13", "inputs": { "environment_seed": 2013, "structure_seed": 5, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.28, 0.2, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 4.2240852806150215 ] } ] }, -2, 20 ] }, "water": 5, "frozen_digest": "bc801b42ce458c6e30d68c3c3275f845970155af257a0788a9229b877741b552" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 6, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 6, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 6, permitted 5" } ], "seconds": 0.2547 }
stress-14建造成功6201435701167
查看数据
{ "label": "stress-14", "inputs": { "environment_seed": 2014, "structure_seed": 6, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.12, 0, 4 ] }, { "op": "wave", "args": [ 0, 0.13, 0.17, 3.926160249756597 ] } ] }, -2, 20 ] }, "water": null, "frozen_digest": "160a6c1d3cc88171e6eef7e0f8fe94fb63ee95550a3a2c46a24f3f5169d3baca" }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "e6b42106e64409b74113f8befb6ec174f09567924e3b5a26656bb1bc4ad80933", "principal_signature": "93221a536f1bdc7abc04de870c405e2cca657b925776177d81cbaa900eaca0d3", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 29, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "14d6ff0b37f6e45a10ac4485b4fc85dba306fe38d1b93092e5d61eec78c8b2ee" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 2, 1 ] }, "05b229b99ddaf2ee979454422a781325920eaaaf5ebc5740a500b49f6cbf02bc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 18, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 78, "excavation": 0, "sitework_occupied_cells": 99, "replaced_cells": 3, "new_sitework_cells": 96, "strategies": [ "piers" ], "signature": "2aa6e3c2f5272ca25ac3e72b1e8c4570869b4b5dec2774a7dc32e7a45cba1a27", "bearing_fill": 2 }, "blocks": 35701, "nodes": 167, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.05 ], [ 0, 1.29 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.7416 }
stress-15拒绝建造:地面高差超限72015——
查看数据
{ "label": "stress-15", "inputs": { "environment_seed": 2015, "structure_seed": 7, "expression": { "op": "clamp", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.28, 0, 4 ] }, { "op": "wave", "args": [ 2, 0.13, 0.17, 4.890932098229982 ] } ] }, -2, 20 ] }, "water": null, "frozen_digest": "8431cc1fbd03d1ac77af7e10981e3ff326545e7db7185f065c56843055ed1be1" }, "attempts": 2, "accepted_candidates": 0, "retries": 0, "status": "incompatible", "diagnostic": "site-relief: /building at None: All declared alternatives violate the same condition: site-relief: /building at (0, 0, 0): Measured 8, permitted 5", "candidates": [ { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" }, { "rule": "site-relief", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Measured 8, permitted 5" } ], "seconds": 0.2639 }
roof-home-0建造成功0010882230
查看数据
{ "label": "roof-home-0", "inputs": { "structure_seed": 0, "environment_seed": 0, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" } ] }, "bay": 11, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "4e3a55a32f6f5aabda43a10d0f6efd714b5979d6b30062b3a9eed12ac53edd16", "principal_signature": "6564ebf8498515fb728df3ad09e4940ffd07533eb441c0eb51b062430296748b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "e89b56485aa9562c46951c366df01cfe99e7e96b41faa0302937fb717a8e635c" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 79, "excavation": 0, "sitework_occupied_cells": 121, "replaced_cells": 33, "new_sitework_cells": 88, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "2ba88b335b1e691b10b8ffea4cbba94cc26975c7b0fc72fbf0b370c5a252fee3", "bearing_fill": 1 }, "blocks": 10882, "nodes": 230, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.74 ], [ 1, 0.98 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/roof-home-0.litematic", "audit": { "queries": 211, "inventories": 28, "nodes": 230, "digest": "4e3a55a32f6f5aabda43a10d0f6efd714b5979d6b30062b3a9eed12ac53edd16" }, "seconds": 2.6199, "interior": { "lofts": 1, "purposes": [ "library" ], "stations": 6, "hung_lights": 7, "collar_cells": 24, "guard_cells": 14, "optional_station_omissions": 0, "furniture_signature": "33649878c2bef49232e3cbcfd4ad1620ee49c4f97a85ac07810b02b94704a9a8" } }
roof-home-1建造成功119524186
查看数据
{ "label": "roof-home-1", "inputs": { "structure_seed": 1, "environment_seed": 1, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" } ] }, "bay": 9, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "e0522743a8fbe1542a4d0632260c8819a4d3d3a276fce7320f08139630db5dbe", "principal_signature": "d45fafc5d50c1539c63bc69419821160a3d30716480e4f99efe11d4592cd8007", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 18, "entrance_x": 4, "columns": [ 0, 8, 17 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 14, "cap_overhang": 0 } ], [ "roof.dormer", [ 6, 8, 8 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 9, "rise": [ 1, 1, 2 ] }, "36c1f96a0fb4bb9d9dfa90fab6f63a1ebc0120825490a47d5a817e93a09aa6e2" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "a1d245413a3b1c1d35d6d64ac9ed2f0069f56da8dee0fa6361cace24a159af43" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 1, "excavation": 0, "sitework_occupied_cells": 34, "replaced_cells": 33, "new_sitework_cells": 1, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "6574a1fc6be32bfc69553811a15922caaf2ab473d0485ce6c004fd9beac44122", "bearing_fill": 0 }, "blocks": 9524, "nodes": 186, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.0801, "interior": { "lofts": 1, "purposes": [ "library" ], "stations": 4, "hung_lights": 3, "collar_cells": 11, "guard_cells": 11, "optional_station_omissions": 0, "furniture_signature": "a1a05495b32e072628f663c62b2578d3c94501e0e09d67ecd5fa2a637b38cd63" } }
roof-home-2建造成功2219093346
查看数据
{ "label": "roof-home-2", "inputs": { "structure_seed": 2, "environment_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "48ed9edc7c8e0436a8d414910dda00581f70fe7f71941e9a05c29334a5fe85fe", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 117, "excavation": 0, "sitework_occupied_cells": 156, "replaced_cells": 30, "new_sitework_cells": 126, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "4151f0590d7f0b86f8dded94dec42088673143e162522f155a6916191abad0aa", "bearing_fill": 2 }, "blocks": 19093, "nodes": 346, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.29 ], [ 0, 1.61 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/roof-home-2.litematic", "audit": { "queries": 316, "inventories": 31, "nodes": 346, "digest": "48ed9edc7c8e0436a8d414910dda00581f70fe7f71941e9a05c29334a5fe85fe" }, "seconds": 5.2667, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
roof-home-3建造成功3310330219
查看数据
{ "label": "roof-home-3", "inputs": { "structure_seed": 3, "environment_seed": 3, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 9, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 8, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "37a2dcaed53dc0cd9b892870f9c6f09af0b848ddf51b90acdbd10b4c7a9b3172", "principal_signature": "aa4c129fc81b91f84e0780879eebca8a8abf4c8ac653bde20dbdefb3d22de979", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 18, "entrance_x": 4, "columns": [ 0, 8, 17 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 21, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "0e45272d512ead81a7ca77adbd1e9b1781247379ff6b5bd9e6623f66e8d8902f" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "f815fb619499912e9a8f4d1fb7a6993c801100d67f5714a4b6fb9ce7305d0770" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.library", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 52, "excavation": 0, "sitework_occupied_cells": 94, "replaced_cells": 30, "new_sitework_cells": 64, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "bcf08a3a14d27a58c8f8f92931ea92addb8fb33e55b53ac63f884bc79e24291f", "bearing_fill": 2 }, "blocks": 10330, "nodes": 219, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.58 ], [ 0, 0.72 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.136, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 4, "hung_lights": 4, "collar_cells": 11, "guard_cells": 18, "optional_station_omissions": 0, "furniture_signature": "25c4f43059b022480df89a09d92823e7dce9be6d88fccdb43730a494086f6e7b" } }
roof-home-4建造成功4411548249
查看数据
{ "label": "roof-home-4", "inputs": { "structure_seed": 4, "environment_seed": 4, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 8, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "88d506a48ec9a8e6a00cdc7afc20d6d460f6be9e7feeb42da066df96f9501ac5", "principal_signature": "309e2b601ca40192ea5ed8e21603ebbb0d0fb2637204edfd74066f0d1f989610", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 4, 0, 11 ], { "height": 23, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "71be82ebea1fb69ec60c556b6826b1884e36c9668a9930aafd085a2483af95ed" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "d886ebfa390499df3a051f7590104623840a6ae9ba57b092c16e9d4f0922ea78" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 31, "excavation": 0, "sitework_occupied_cells": 65, "replaced_cells": 33, "new_sitework_cells": 32, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "50f5616b85e3af8acb25eb915aedaa32232c8d0da9c32e35429fa3151d626caf", "bearing_fill": 0 }, "blocks": 11548, "nodes": 249, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.41 ], [ 1, 0.77 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/roof-home-4.litematic", "audit": { "queries": 222, "inventories": 24, "nodes": 249, "digest": "88d506a48ec9a8e6a00cdc7afc20d6d460f6be9e7feeb42da066df96f9501ac5" }, "seconds": 2.4107, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 6, "hung_lights": 5, "collar_cells": 16, "guard_cells": 20, "optional_station_omissions": 0, "furniture_signature": "e428fbc4eebefe94de67da571f7acf5f822abaa687a9bfbf8bc46d42d2ce6ab9" } }
roof-home-5建造成功5519180361
查看数据
{ "label": "roof-home-5", "inputs": { "structure_seed": 5, "environment_seed": 5, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 8, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "50ec5cbf0c2216aa3d83931101cad1b49222e2805b3ec301c6d3b4fdcf99b598", "principal_signature": "6a4ee1e09c9dd5e70f15f85834d6b9d2a8d18dbd804dea89d711beac56fde320", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 14 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 22 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 18 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "4a24bb85ed5bf5b7e4df696317e5dcc69edb43f282d6581f4d091ee5d74c2c27" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "90af704a9e2e5f11d27c7415239ff7885d33b604e5f963f871820aabc99c9a97" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.library", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 108, "excavation": 0, "sitework_occupied_cells": 144, "replaced_cells": 30, "new_sitework_cells": 114, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "f30abed4de479a66d5f06c5ad113468c9d790629a9995baab5790815f28ab82d", "bearing_fill": 0 }, "blocks": 19180, "nodes": 361, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.0 ], [ 0, 1.26 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 3.0298, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 12, "hung_lights": 13, "collar_cells": 58, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7a1ace2ff907744b3a057c4771ee03eedd4470ebcd5f9065e1cc3ffbddbd5444" } }
roof-home-6建造成功6615732314
查看数据
{ "label": "roof-home-6", "inputs": { "structure_seed": 6, "environment_seed": 6, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 8, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "05af3b7a13c3df67315443fb78dff8dd6bdab24236b3cad9156aa7e9b8f054a8", "principal_signature": "ec0dd44dca298d8d3d88fa097c472a7e1a28e270c27aec17b41919754857fa8e", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 21, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "0dfc3106094ec8d461ea41254c23a7395b2f36e637efd274e63445a5beb3d54e" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "dcff50aff67f2cd35389d92dd2351af580456b85f44794d251366669b10b5339" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "bababbf1ce522065f7a5179560438de468c2194e77c7619b2c0c0c52e35259a0" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 33, "replaced_cells": 33, "new_sitework_cells": 0, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "578cb630c81d72e727de29614b448ec62d8f0c6b2387dc7ba93fe39392c5d5e6", "bearing_fill": 0 }, "blocks": 15732, "nodes": 314, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 12, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.3002, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 8, "collar_cells": 29, "guard_cells": 24, "optional_station_omissions": 0, "furniture_signature": "d1d4abf2a07bdfb730aef3d58bafcf0b49251c1f249c51c5004f595d655e8a80" } }
roof-home-7建造成功7715018289
查看数据
{ "label": "roof-home-7", "inputs": { "structure_seed": 7, "environment_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8d8f9cbb71dbc4c286ab70195807c6922e3f77788352b1147acacb56e9b980f9", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 15, "excavation": 0, "sitework_occupied_cells": 48, "replaced_cells": 33, "new_sitework_cells": 15, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "bcb313f0f2d4d1c48c4f4e33c48c68e16099e7d41074c85ec09903e0c18c40f4", "bearing_fill": 0 }, "blocks": 15018, "nodes": 289, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.27 ], [ 1, 0.65 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/roof-home-7.litematic", "audit": { "queries": 259, "inventories": 37, "nodes": 289, "digest": "8d8f9cbb71dbc4c286ab70195807c6922e3f77788352b1147acacb56e9b980f9" }, "seconds": 3.1255, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 26, "optional_station_omissions": 0, "furniture_signature": "0b0b3715bf0604e6fb8f7dfa3e8c1aed48618e4fc34a7c305d46b7e8bf7601df" } }
pair-0-2建造成功2510046737187
查看数据
{ "label": "pair-0-2", "inputs": { "environment_seed": 5100, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.1149140955172765 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f078b420800a86cbb65bf2adaef9a4ee4b7c1c5d173d085b2445dbc95d19531f", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "c63c30661ed5a9d77d8c5d68442cd83a5a6c68eeddec0cf61adac6fed96b749b", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "ee78d9544ff20cd3548bb02db2324d61446f3fc69ddf6ddc480fcbeabb391ed0", "bearing_fill": 0 }, "blocks": 46737, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/pair-0-2.litematic", "audit": { "queries": 168, "inventories": 31, "nodes": 187, "digest": "c63c30661ed5a9d77d8c5d68442cd83a5a6c68eeddec0cf61adac6fed96b749b" }, "seconds": 5.4556, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "d453a46581bf9ef6a27230b6f653ed11ddf4441aeea159bf97ae2c76ee39d092" } }
pair-0-7建造成功7510045082149
查看数据
{ "label": "pair-0-7", "inputs": { "environment_seed": 5100, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.1149140955172765 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f078b420800a86cbb65bf2adaef9a4ee4b7c1c5d173d085b2445dbc95d19531f", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "d39cc20bf75bb5aa2e1a456774c9ab975f33c7201c6209100dbdf78b1141f509", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "94365427bd1925e1f606bcdb97fbbe6ebb4a5f6122aa465f6790a9c7d6530fdb", "bearing_fill": 0 }, "blocks": 45082, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8532, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 26, "optional_station_omissions": 0, "furniture_signature": "0b0b3715bf0604e6fb8f7dfa3e8c1aed48618e4fc34a7c305d46b7e8bf7601df" } }
pair-1-2建造成功2510146432187
查看数据
{ "label": "pair-1-2", "inputs": { "environment_seed": 5101, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.711345471405261 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "6479c79fab2f2a18c60ab67a0ded5b2b62da51c5813c7c43c0808fdceff34478", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "a334ed57861b466c4cb93e83c683070213a795e6d5b28443f8d3b278de74a0fd", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 59, "excavation": 0, "sitework_occupied_cells": 65, "replaced_cells": 62, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "fc54c5b7798624fe1ef22fcd641d9358d1406a4d86b940d52a303c176e488d3d", "bearing_fill": 2 }, "blocks": 46432, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.89 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0543, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-1-7建造成功7510144770149
查看数据
{ "label": "pair-1-7", "inputs": { "environment_seed": 5101, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.711345471405261 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "6479c79fab2f2a18c60ab67a0ded5b2b62da51c5813c7c43c0808fdceff34478", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "aa4f86a71e53f21d687ccfb66fd79ad004cbf66d8a52cf67874e13dddcfec9c5", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 65, "excavation": 0, "sitework_occupied_cells": 71, "replaced_cells": 68, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "5071a2e7d42930d3bc4354cd8426c330e77902231d816eeceba606ef12ebb0f5", "bearing_fill": 3 }, "blocks": 44770, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.07 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3467, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
pair-2-2建造成功2510251031187
查看数据
{ "label": "pair-2-2", "inputs": { "environment_seed": 5102, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.2996337894235028 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "a42c8c00773d132fbc4f6f97a6f16242cab8d833c96cdbd85a65eb9ddfc24d63", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "1d8bf8e3bc0ad475a160ab485689495ed5a7ffc73b0d8892cd53f002918e3af8", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 153, "excavation": 0, "sitework_occupied_cells": 159, "replaced_cells": 156, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "742f4de41ca7c5df9b3255be9a116c0e1e00ae4f7ebc1745cec57c1f18f6bf72", "bearing_fill": 2 }, "blocks": 51031, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.71 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0538, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-2-7建造成功7510249369149
查看数据
{ "label": "pair-2-7", "inputs": { "environment_seed": 5102, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.2996337894235028 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "a42c8c00773d132fbc4f6f97a6f16242cab8d833c96cdbd85a65eb9ddfc24d63", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "440344aa96601cc8ca95872a1a8fd1ffe7f5a2017fbb3edeb85a63c7609c2c57", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 155, "excavation": 0, "sitework_occupied_cells": 161, "replaced_cells": 158, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "d3091f4b63873356ad22aebae11230f94cfde9bae5af74cb40716c12a405dea9", "bearing_fill": 3 }, "blocks": 49369, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.77 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.392, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
pair-3-2建造成功2510346432187
查看数据
{ "label": "pair-3-2", "inputs": { "environment_seed": 5103, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.5820797235383988 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "52de40a9f9688fe6d5336e33268503458d35cae9e83588245290bb7e51b31380", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "1286fdf0e23461041454614041abba2abc311947ed8f37ec68f27e730308847a", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 14, "excavation": 0, "sitework_occupied_cells": 20, "replaced_cells": 17, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "48a64f4e4fcc8a8eb7c3207a8108f6b59d75cdba82caee0c8312f115c5460b3c", "bearing_fill": 0 }, "blocks": 46432, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.54 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0507, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-3-7建造成功7510344770149
查看数据
{ "label": "pair-3-7", "inputs": { "environment_seed": 5103, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.5820797235383988 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "52de40a9f9688fe6d5336e33268503458d35cae9e83588245290bb7e51b31380", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "d125c15dde3095fef9b5c1bc7e9b0b2ba94d0255632db433b800b0d3af25a1f3", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 13, "excavation": 0, "sitework_occupied_cells": 19, "replaced_cells": 16, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "e52770d892127bcb856bd41f329a2451a06985b33d0a1d624e89d3695d9376d7", "bearing_fill": 0 }, "blocks": 44770, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.51 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/pair-3-7.litematic", "audit": { "queries": 134, "inventories": 37, "nodes": 149, "digest": "d125c15dde3095fef9b5c1bc7e9b0b2ba94d0255632db433b800b0d3af25a1f3" }, "seconds": 3.5875, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
pair-4-2建造成功2510451031187
查看数据
{ "label": "pair-4-2", "inputs": { "environment_seed": 5104, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 5.74665332849318 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "9bf089c4098431257ca338c7a798099adedebd7ff5aba115663e3679b960cc73", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "5b21dfbdeadf34829e5d77da46853b86b16b2f82b88c9a6f9c4a18f0da64f470", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 110, "excavation": 0, "sitework_occupied_cells": 119, "replaced_cells": 116, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "c448c75cc530c84c1e20f8dc6c370e1cf70f7edbf1a74d1cdaaded1e293af9b7", "bearing_fill": 2 }, "blocks": 51031, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.51 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0618, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-4-7建造成功7510449369149
查看数据
{ "label": "pair-4-7", "inputs": { "environment_seed": 5104, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 5.74665332849318 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "9bf089c4098431257ca338c7a798099adedebd7ff5aba115663e3679b960cc73", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "573d9182a9b4989455b4d3e4920953a2db6c20e2939697337783a297eb53dc79", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 103, "excavation": 0, "sitework_occupied_cells": 112, "replaced_cells": 109, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "387c096344017a08612ef8dc631f8a5628dd172de08acae39a13e07dffd4fe10", "bearing_fill": 3 }, "blocks": 49369, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.3 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3493, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
pair-5-2建造成功2510543617187
查看数据
{ "label": "pair-5-2", "inputs": { "environment_seed": 5105, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.1794406062920424 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "e2d600842cafe8efc4ae63ae1b4fabf92f61e2f80bfad89038ae9f4326c31ba9", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "36661c15437b83fc698dfaa953f2b275278bc4117350151ef5b4a32e371d580c", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 66, "excavation": 0, "sitework_occupied_cells": 78, "replaced_cells": 3, "new_sitework_cells": 75, "strategies": [ "stepped" ], "signature": "69b5eea91dcd68d7d8336480dedfa33a32f66421c345d4b8c1e8e0423520a770", "bearing_fill": 0 }, "blocks": 43617, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.84 ], [ 1, 0.95 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.9801, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "d453a46581bf9ef6a27230b6f653ed11ddf4441aeea159bf97ae2c76ee39d092" } }
pair-5-7建造成功7510541944149
查看数据
{ "label": "pair-5-7", "inputs": { "environment_seed": 5105, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.1794406062920424 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "e2d600842cafe8efc4ae63ae1b4fabf92f61e2f80bfad89038ae9f4326c31ba9", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "edcf8bb993a94cc09297a1a2f16c3b709622dd1203649e4a11009233eaa2a0f8", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 48, "excavation": 0, "sitework_occupied_cells": 60, "replaced_cells": 3, "new_sitework_cells": 57, "strategies": [ "stepped" ], "signature": "da4171b0363f0c355b91a423b3c54e5d9a36c775e9c0fa4cc56e9c6539e07dc8", "bearing_fill": 0 }, "blocks": 41944, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.66 ], [ 1, 0.96 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8424, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 26, "optional_station_omissions": 0, "furniture_signature": "0b0b3715bf0604e6fb8f7dfa3e8c1aed48618e4fc34a7c305d46b7e8bf7601df" } }
pair-6-2建造成功2510646432187
查看数据
{ "label": "pair-6-2", "inputs": { "environment_seed": 5106, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.5068836374330448 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f75208f81aff20beb34a406fc97e9a8a9902cb28804d8e529df273c09c9d2dbd", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "81d1d63ce1a470c2e58c3eee4765b226d0ef4f824ec51223c254fffd48fb8f12", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 44, "excavation": 0, "sitework_occupied_cells": 50, "replaced_cells": 47, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "e222bacb0415946f4cbc4b78e46b2b1853f34bfa1c4873cf74739bc34971ec54", "bearing_fill": 2 }, "blocks": 46432, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.44 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0608, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-6-7建造成功7510644770149
查看数据
{ "label": "pair-6-7", "inputs": { "environment_seed": 5106, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.5068836374330448 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f75208f81aff20beb34a406fc97e9a8a9902cb28804d8e529df273c09c9d2dbd", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "bc236fc5550a2c474200cbfba5cfce3637e97d9c491052272a4248e6ab8c4ddf", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 48, "excavation": 0, "sitework_occupied_cells": 54, "replaced_cells": 51, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "8568657beedbe69bad48a9fc8a3a9bee4f22fbe14d011759a8a3183f3f3e50a2", "bearing_fill": 3 }, "blocks": 44770, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.56 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3952, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
pair-7-2建造成功2510751131187
查看数据
{ "label": "pair-7-2", "inputs": { "environment_seed": 5107, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.7380169651488773 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "09a62a558dc4bdf737fb16f532e399782f4c0254cc70f18456d3daca6483c709", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "library" } ] }, "bay": 13, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "c447bb5cd36d9486c5b9ba45fc322cabe2d8cb3534c947dd841e8c2437fdd0dc", "principal_signature": "e10f8016b816d76c642ecbba68f3de96a81f002f8b0cd072a0e0706ab79b3791", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 26, "entrance_x": 6, "columns": [ 0, 8, 17, 25 ] } ], [ "masonry.chimney", [ 18, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "a50872ebd7fc3105fff8ce647a126bdce6e04e657f68e99b6be4a1fdbe58d516" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "f1fcf49a767b279c02c96c206e2d6928e186bef97b74c2786a193e7fe00bf487" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 0, 6, 0 ], "room.library", [], true, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.kitchen", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 13 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "6ed9ba1fa820f1d0c789bdd31f07a2ee286fd2cfdfbebf17b1da050c2387895f" ] ] ], "contact": { "fill": 95, "excavation": 0, "sitework_occupied_cells": 101, "replaced_cells": 98, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "44ca4d6f61decf41bb9d30131bb4fa2883ae94013f753311dcf30851762c1f50", "bearing_fill": 2 }, "blocks": 51131, "nodes": 187, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.97 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "left", 15, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/pair-7-2.litematic", "audit": { "queries": 170, "inventories": 31, "nodes": 187, "digest": "c447bb5cd36d9486c5b9ba45fc322cabe2d8cb3534c947dd841e8c2437fdd0dc" }, "seconds": 4.7529, "interior": { "lofts": 2, "purposes": [ "bedroom", "bedroom" ], "stations": 12, "hung_lights": 13, "collar_cells": 56, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "a445a97a729b03b04e423b8cbe129f15fc0f5efd1acb127d838d177d84563621" } }
pair-7-7建造成功7510749469149
查看数据
{ "label": "pair-7-7", "inputs": { "environment_seed": 5107, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.7380169651488773 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "09a62a558dc4bdf737fb16f532e399782f4c0254cc70f18456d3daca6483c709", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 1, "level": 0, "purpose": "library" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 11, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 4, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 2 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8423f69dd23f499fae35e4739aea105559033b1611b8db648a8ce11e77dc53b3", "principal_signature": "a4602442d2759d484d279bd31f9b3676e2fb9b7acfd5961a69bdf88718c87c2b", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 22, "entrance_x": 5, "columns": [ 0, 10, 21 ] } ], [ "masonry.chimney", [ 15, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 11, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "c6a481f0c6fe601e2669c74d76b679d5e0c1aabfd1680a2a07d74accbd747268" ], [ "roof.profile", [ 11, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "ae25d4ca0def87e88df8452ad144a00b2107755df6df11850a7455251a3afcbb" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.kitchen", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.library", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 11 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 94, "excavation": 0, "sitework_occupied_cells": 100, "replaced_cells": 97, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "3885c70473c6b58cfa1a79f102b5027639e4acf97c3c51225b05762d777868d6", "bearing_fill": 3 }, "blocks": 49469, "nodes": 149, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.94 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.3427, "interior": { "lofts": 2, "purposes": [ "library", "library" ], "stations": 9, "hung_lights": 7, "collar_cells": 28, "guard_cells": 25, "optional_station_omissions": 0, "furniture_signature": "7d8839a22b133356cbfd370466bcfb5e1478b3571c9421658db82a2ea1a2b503" } }
held-out-0建造成功0510047000233
查看数据
{ "label": "held-out-0", "inputs": { "environment_seed": 5100, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.1149140955172765 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f078b420800a86cbb65bf2adaef9a4ee4b7c1c5d173d085b2445dbc95d19531f", "structure_seed": 0, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 11, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 7, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "a4e39fa28dd85dc51d64e94f710494066111c00867ef5641adf757303fe8e5d7", "principal_signature": "e1ac09724599b47eb5f37722cbceda3fd2156107d8b2af2affbb77c6f1346eec", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 33, "entrance_x": 5, "columns": [ 0, 11, 21, 32 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 28, 14, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "b62d8e8b73590a3f0bc19e614936c46fe93119b06618899b7909d17bd57da105" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c23108e7d8c8fab9290b7956fe84197e765636e99425d7a86a9d9c8cc5ee6c60" ], [ "roof.profile", [ 22, 13, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "07086ae80e71229461491cb8741040d422f181438eee9feb49a63a034a11d6c6" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 12, 0 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 22, 6, 0 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ] ] ], "contact": { "fill": 18, "excavation": 0, "sitework_occupied_cells": 24, "replaced_cells": 21, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "efa1047cda4a2121d76ea90788606a8d02b3a6456b5beb40fc6df92f7d8e7145", "bearing_fill": 3 }, "blocks": 47000, "nodes": 233, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.66 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/held-out-0.litematic", "audit": { "queries": 211, "inventories": 69, "nodes": 233, "digest": "a4e39fa28dd85dc51d64e94f710494066111c00867ef5641adf757303fe8e5d7" }, "seconds": 4.6084, "interior": { "lofts": 3, "purposes": [ "library", "library", "library" ], "stations": 12, "hung_lights": 10, "collar_cells": 31, "guard_cells": 36, "optional_station_omissions": 0, "furniture_signature": "4e22f425977b4d4d455b2b4ff2ad33296612a7791b2240398e8573ad1eaeb4c9" } }
held-out-1建造成功1510146599229
查看数据
{ "label": "held-out-1", "inputs": { "environment_seed": 5101, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.711345471405261 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "6479c79fab2f2a18c60ab67a0ded5b2b62da51c5813c7c43c0808fdceff34478", "structure_seed": 1, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 7, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "46acc3950fab11b408354295572404f2f1c9ba951d744127d9a2574e16af8431", "principal_signature": "5c7c662a46418dd21b2b1e913d01140774d00c961072219f923e2fec82b388cc", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 33, "entrance_x": 5, "columns": [ 0, 11, 21, 32 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 20 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 16 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 11, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c24e86f35df4e54c53425ba15a7b0a906403244e59de1f02b8e85275a25f400f" ], [ "roof.profile", [ 11, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "0dfc3106094ec8d461ea41254c23a7395b2f36e637efd274e63445a5beb3d54e" ], [ "roof.profile", [ 22, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f4adbb7bc52ddf6444a267731d16ecface1d73753b37e290208683eaeea158a9" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "bababbf1ce522065f7a5179560438de468c2194e77c7619b2c0c0c52e35259a0" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 6, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 64, "excavation": 0, "sitework_occupied_cells": 70, "replaced_cells": 67, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "c012842df872969d49784deef3c0492f23b32b3a7ab10c49d2c302702da2c8da", "bearing_fill": 3 }, "blocks": 46599, "nodes": 229, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.04 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ], [ "right", 11, "existing upper volume" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0775, "interior": { "lofts": 3, "purposes": [ "library", "library", "library" ], "stations": 12, "hung_lights": 13, "collar_cells": 30, "guard_cells": 35, "optional_station_omissions": 0, "furniture_signature": "14d342662aebcba6ebe631d23ba1516075fcc6ff785394338da92ffd1db83467" } }
held-out-2建造成功2510251110227
查看数据
{ "label": "held-out-2", "inputs": { "environment_seed": 5102, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.2996337894235028 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "a42c8c00773d132fbc4f6f97a6f16242cab8d833c96cdbd85a65eb9ddfc24d63", "structure_seed": 2, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 11, "porch": true, "roof_axis": "auto", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 7, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "storage", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "b7a7a1a12517375b584adde1366b80d35d6ddad855b66d6c7e29bc71933908b0", "principal_signature": "91e815321e0de83f8f10e04e3421710915262611e8423e8c15cc2468c25814c8", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 33, "entrance_x": 5, "columns": [ 0, 11, 21, 32 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 24, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 27, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 31, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "4ee22d6e4b98982772d815b60466e346d24b1cbba3351905c7b514206ff92149" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "11f95192cba869fbc558f7fbe04da374eada32483e1001944b2948b5a4614cc0" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "a4e883f1246db7c5a52778c1dfda65a848a962959e5c0d1d4bfaabd38e73c8e4" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.storage", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 0, 6, 11 ], "room.loft.storage", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.storage", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 163, "excavation": 0, "sitework_occupied_cells": 169, "replaced_cells": 166, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "026dba9eecb1518a1351c98794e3b8aa34e3f42936f0a55861ef0c45556db4b6", "bearing_fill": 3 }, "blocks": 51110, "nodes": 227, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.01 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.087, "interior": { "lofts": 3, "purposes": [ "storage", "storage", "storage" ], "stations": 12, "hung_lights": 11, "collar_cells": 26, "guard_cells": 39, "optional_station_omissions": 0, "furniture_signature": "a8028a06381c4d834d016640f507fe755d3ec5e90bef89abed595baf63fee4dd" } }
held-out-3建造成功3510345155200
查看数据
{ "label": "held-out-3", "inputs": { "environment_seed": 5103, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.5820797235383988 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "52de40a9f9688fe6d5336e33268503458d35cae9e83588245290bb7e51b31380", "structure_seed": 3, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 9, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 7, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "bedroom", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "5f39bd5d195492bc3a122844591c1cfe31d500dc463cae6af05f5de1ab7ee706", "principal_signature": "a8a37cdc594dcd0f4aa46955b4dbf3c292be484205dc7a4b17dd7f735e1e1cbb", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 27, "entrance_x": 4, "columns": [ 0, 9, 17, 26 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 14, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 8 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 24, 14, 8 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 8 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 9, "rise": [ 1, 1, 2 ] }, "d0fac873ee9e3e53da4ece2a7ef453c994b152f90badd9a9a3d70860def2c406" ], [ "roof.profile", [ 0, 7, 9 ], { "axis": "x", "span": 9, "rise": [ 1, 1, 2 ] }, "188401f5ff54ca7ecf2e2b17ac86babc4df56e66651292f748348adb7db8f2b1" ], [ "roof.profile", [ 18, 13, 0 ], { "axis": "x", "span": 9, "rise": [ 1, 1, 2 ] }, "ead63bfd163b1beaea8fd93840c3d28a1be684fd09af016be5fb298d772954fc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.kitchen", [ "north" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.bedroom", [ "landing" ], false, "a1d245413a3b1c1d35d6d64ac9ed2f0069f56da8dee0fa6361cace24a159af43" ], [ "room", [ 0, 6, 9 ], "room.loft.bedroom", [ "landing" ], false, "ef83d9a5eb4d203e9d3bbe4d7a7a9f5734310d36cbf2a96c15eabceb268edd7e" ], [ "room", [ 18, 0, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 18, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "ef83d9a5eb4d203e9d3bbe4d7a7a9f5734310d36cbf2a96c15eabceb268edd7e" ], [ "room", [ 18, 6, 0 ], "room.bedroom", [], true, "ef83d9a5eb4d203e9d3bbe4d7a7a9f5734310d36cbf2a96c15eabceb268edd7e" ], [ "room", [ 9, 0, 0 ], "room.library", [ "west", "east" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 15, "excavation": 0, "sitework_occupied_cells": 21, "replaced_cells": 18, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "c11bc2441b1dacd15fdab4817b7242cc5acbcb73401fcb2fb698d8233e204c68", "bearing_fill": 0 }, "blocks": 45155, "nodes": 200, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.57 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.4613, "interior": { "lofts": 3, "purposes": [ "bedroom", "bedroom", "bedroom" ], "stations": 8, "hung_lights": 7, "collar_cells": 18, "guard_cells": 28, "optional_station_omissions": 0, "furniture_signature": "8a4c2c002719b2fc9a92c4ab3bf549d52b8e56db93145f21856cf97f29fa21b2" } }
held-out-4建造成功4510451091231
查看数据
{ "label": "held-out-4", "inputs": { "environment_seed": 5104, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 5.74665332849318 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "9bf089c4098431257ca338c7a798099adedebd7ff5aba115663e3679b960cc73", "structure_seed": 4, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 11, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 12, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "021e3833bac73649cf86b09f8737d4a24ab8524a7c9bdff0793292ba5b873e4f", "principal_signature": "58ecd61843ffaf08ccd2ac960d69acba08d41fc6cc7cb6248143aea3dae666ed", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 33, "entrance_x": 5, "columns": [ 0, 11, 21, 32 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 18 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 14 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 11, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "854d29c80810c4d670740f64f4df5c9f6b0575e77aae9fd2f7a166f43b6ab2dd" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "d184fe76b5538e52c7be0965d2629d25e5797bfb7b470ca5195fd1b420451452" ], [ "roof.profile", [ 22, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "4ee22d6e4b98982772d815b60466e346d24b1cbba3351905c7b514206ff92149" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "bababbf1ce522065f7a5179560438de468c2194e77c7619b2c0c0c52e35259a0" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 12, 0 ], "room.loft.library", [ "landing" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 22, 6, 0 ], "room.bedroom", [], true, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 134, "excavation": 0, "sitework_occupied_cells": 143, "replaced_cells": 140, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "ac2a94553ddb4b3d412c6427ce1e680e315e6a56f51d947088ae9017251a3b4d", "bearing_fill": 3 }, "blocks": 51091, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 4.23 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.068, "interior": { "lofts": 3, "purposes": [ "library", "library", "library" ], "stations": 12, "hung_lights": 12, "collar_cells": 35, "guard_cells": 35, "optional_station_omissions": 0, "furniture_signature": "de52a9cbb5abe16625c477c91476851fcd5b27cef9616d62ff2301efe85bb952" } }
held-out-5建造成功5510545138243
查看数据
{ "label": "held-out-5", "inputs": { "environment_seed": 5105, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.1794406062920424 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "e2d600842cafe8efc4ae63ae1b4fabf92f61e2f80bfad89038ae9f4326c31ba9", "structure_seed": 5, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 13, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 12, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "1203bdc9df1f02d15212f9b4c479a21785979e62a64ca8500429ca02b929ea70", "principal_signature": "5412a11259ea092f9ac6db2be6de7dec3e9e5ad86ec93eea13e253914e531b4d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 39, "entrance_x": 6, "columns": [ 0, 10, 19, 28, 38 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 14, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 18, 8, 12 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 14, 12 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 12 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 25 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 13, "rise": [ 1, 1, 2 ] }, "b77c5e89a64a888faa955a760b104760e3f37873cde9913dbe8d51b2eed9c7b2" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "x", "span": 13, "rise": [ 1, 1, 2 ] }, "256996200607c0c5ff04846da05bd1a341e5f0e12b4c933df2b588fdeb236f7a" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "x", "span": 13, "rise": [ 1, 1, 2 ] }, "9f7f58413085c5e91dbcd906af3630de2bf3069e4ecd896c19d8ae4d415ae7b9" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "1f772d91fe5efb4a7e000b7e2ffc7f9ee53707dca111e1b07b68bfe6f063ff12" ], [ "room", [ 0, 6, 13 ], "room.loft.library", [ "landing" ], false, "4cf252ceed5970647499c71e034c2ab432792e463e3739c5ffda3cef6e4f8b74" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 12, 0 ], "room.loft.library", [ "landing" ], false, "4cf252ceed5970647499c71e034c2ab432792e463e3739c5ffda3cef6e4f8b74" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], true, "4cf252ceed5970647499c71e034c2ab432792e463e3739c5ffda3cef6e4f8b74" ] ] ], "contact": { "fill": 122, "excavation": 0, "sitework_occupied_cells": 134, "replaced_cells": 3, "new_sitework_cells": 131, "strategies": [ "stepped" ], "signature": "bc9b874bda0ddac4b6a98764f1adde451574aa1da415841598ef25119405b7d3", "bearing_fill": 0 }, "blocks": 45138, "nodes": 243, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 0.94 ], [ 0, 1.4 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 4.2641, "interior": { "lofts": 3, "purposes": [ "library", "library", "library" ], "stations": 16, "hung_lights": 18, "collar_cells": 66, "guard_cells": 42, "optional_station_omissions": 0, "furniture_signature": "dfd212695b687e659376cc639debed1c3ef9924e910d4b173cfec19a58961c18" } }
held-out-6建造成功6510645318202
查看数据
{ "label": "held-out-6", "inputs": { "environment_seed": 5106, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.5068836374330448 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "f75208f81aff20beb34a406fc97e9a8a9902cb28804d8e529df273c09c9d2dbd", "structure_seed": 6, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 9, "porch": true, "roof_axis": "z", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 2 ] }, "dormer_spacing": 7, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "storage", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "2a97b2d7e5e442e5690fe06638e652fe9058165abd18dc8b30e55af168f2f53b", "principal_signature": "7d317635f464098651d90177da6d190da0f8a780e61edde0edffbf521cf7cf73", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 27, "entrance_x": 4, "columns": [ 0, 9, 17, 26 ] } ], [ "masonry.chimney", [ 3, 0, 18 ], { "height": 15, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 18, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 8, 8, 9 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "125bd510ddbb06dc73ea564cf51577aa423c6acd5a963e5c30b09c5b977fc899" ], [ "roof.profile", [ 18, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "3656e62c9a151cedc5cb39ba55526143d5abdf84d48f72ba37045146b0195f8b" ], [ "roof.profile", [ 9, 7, 0 ], { "axis": "z", "span": 9, "rise": [ 1, 2 ] }, "5828ba6f6f90c65059d5416c3a40b2e0f69e9a50307737f18c5625d2e5179750" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 0, 9 ], "room.kitchen", [ "north" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 6, 0 ], "room.loft.storage", [ "landing" ], false, "6fe2adba33f4a74566c07d9920e6f191243b3cc2cf0b4b8f854dc078edb74625" ], [ "room", [ 18, 0, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 18, 12, 0 ], "room.loft.storage", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 18, 6, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.library", [ "west", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 6, 0 ], "room.loft.storage", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ] ] ], "contact": { "fill": 20, "excavation": 0, "sitework_occupied_cells": 26, "replaced_cells": 23, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "e6a2ef90da06f6490a1de5b5ba2f54422d3a9caec66f1d3f64e0c927801d2870", "bearing_fill": 1 }, "blocks": 45318, "nodes": 202, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.72 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.4417, "interior": { "lofts": 3, "purposes": [ "storage", "storage", "storage" ], "stations": 8, "hung_lights": 8, "collar_cells": 23, "guard_cells": 30, "optional_station_omissions": 0, "furniture_signature": "f851c94f0cbf11d31fdcb683a100a8b76ab41de46d459b303bee0d70c7c166dd" } }
held-out-7建造成功7510751134225
查看数据
{ "label": "held-out-7", "inputs": { "environment_seed": 5107, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, 0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 3.7380169651488773 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 5, "digest": "09a62a558dc4bdf737fb16f532e399782f4c0254cc70f18456d3daca6483c709", "structure_seed": 7, "design": { "$type": "Blueprint", "rooms": { "$tuple": [ { "$type": "RoomSpec", "x": 0, "z": 0, "level": 0, "purpose": "living" }, { "$type": "RoomSpec", "x": 1, "z": 0, "level": 0, "purpose": "library" }, { "$type": "RoomSpec", "x": 2, "z": 0, "level": 0, "purpose": "workshop" }, { "$type": "RoomSpec", "x": 0, "z": 1, "level": 0, "purpose": "kitchen" }, { "$type": "RoomSpec", "x": 0, "z": 0, "level": 1, "purpose": "bedroom" } ] }, "bay": 11, "porch": true, "roof_axis": "x", "roof_material": "deepslate_tile", "steep": true, "window_component": null, "light_component": null, "roof_design": { "$type": "RoofDesign", "rise": { "$tuple": [ 1, 1, 2 ] }, "dormer_spacing": 12, "dormer_sides": { "$tuple": [ "left", "right" ] }, "trim": "dark_oak" }, "porch_depth": 5, "balcony": false, "chimney": true, "facade_design": { "$type": "FacadeDesign", "height": 3, "sill": 1, "width": 2, "planters": true }, "rail_material": "dark_oak", "attic_purpose": "library", "porch_bays": 3 } }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "098d013ff3dbc468743ee31734f1e676f835b698869d04898685af2b4d8c46c2", "principal_signature": "392ba87055e3727093770ff05cc09c2251b626c9983594e7335b8fcd56894ee1", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 33, "entrance_x": 5, "columns": [ 0, 11, 21, 32 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 29, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 14, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "ed3e5c24517a17e34daa4951cbd6fde78904f60eb0c757e36672b37d19e6420c" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "76dd91872082d3298fd4b105e1ba78e2a93f95879745eff1a145601ee03ae57a" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "28b95c6896ca5b7fd61a342b5b8d866e369e50964b0a54d47cdff074fe3d074d" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 12, 0 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [], true, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "6c349085e925e5782445cbefcbd4ceffdb02cc9345a8bfa0f7ea8236aabde86f" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 104, "excavation": 0, "sitework_occupied_cells": 110, "replaced_cells": 107, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "be7c49fd5fe21d30261076f93d7c12802857998ea5fa8a6bbf43423ab1c36d19", "bearing_fill": 3 }, "blocks": 51134, "nodes": 225, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.24 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-2/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/new-compositions/held-out-7.litematic", "audit": { "queries": 203, "inventories": 65, "nodes": 225, "digest": "098d013ff3dbc468743ee31734f1e676f835b698869d04898685af2b4d8c46c2" }, "seconds": 4.6215, "interior": { "lofts": 3, "purposes": [ "library", "library", "library" ], "stations": 12, "hung_lights": 11, "collar_cells": 35, "guard_cells": 37, "optional_station_omissions": 0, "furniture_signature": "e1233f32f652a0b43369e39afb56576b51f1cd96284dd2b91e06c11ac71077b2" } }
court-0建造成功0410026213484
查看数据
{ "label": "court-0", "inputs": { "structure_seed": 0, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "6560a4b9d346516ffa3a6142c4872dfd97af2e1ae3b79459d2c7bf4286a48576", "principal_signature": "349f70dc96b5d11bcb0574148bc2a00d6f3f5951c11c069aca124ff6420651d0", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 24 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 20 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "9e0fbadaa825da6bd49f1860058d4ee2072b69221954bdca3c2fcf07f6f58532" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "68dbd3e8a1b5921b193db12a19f1067c7c99f982bd11ceb32104e9d52f6995ab" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "cf5a97413e2d22c31d3c6ecb3c483b97d0df4fc91cd611acb8975b09668a3442" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "fa6d3b312c2bad4b384c8bf71d324c87581769852a2d04780e510ff1c0c7d6fc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 158, "excavation": 0, "sitework_occupied_cells": 194, "replaced_cells": 30, "new_sitework_cells": 164, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "98da4571e1fc2464eb1c11be8301f666dcf3630c0c3305b019518adeebcccd24", "bearing_fill": 3 }, "blocks": 26213, "nodes": 484, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.76 ], [ 0, 1.98 ] ], "chosen": 1 } ], "optional_omissions": [], "artifact": "samples/building-space/final/garden-regression/court-0.litematic", "audit": { "queries": 452, "inventories": 77, "nodes": 484, "digest": "6560a4b9d346516ffa3a6142c4872dfd97af2e1ae3b79459d2c7bf4286a48576" }, "seconds": 5.6509, "details": { "stations": "0bc8be3eeb50ce841fa908bf68d68fe7839ab40d747a63486c9616969449e964", "facade_openings": "d4c82ff591a0c88b9629ad8c90740fa710e31cf810585451cbbef3b5c85d62a4", "station_count": 12, "window_count": 47, "window_boxes": 28 } }
court-1建造成功1410026796500
查看数据
{ "label": "court-1", "inputs": { "structure_seed": 1, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "9d0108eaf3bd91b4f4899688f18655f4d78580b4b241f7d45982dc2abbede38b", "principal_signature": "86a3e831520914dac013d96baac42c5169995e07483fc02b4d39f67b2fb74d59", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "ece9d410f10acb23958b8c67dca72a32b36c1f947b984761eeec33802654b525" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "bd9684f9c786190f4efc8b833b48d80b50826d3cfaeae3b5dd16634395ae28ce" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "d49534a1275c85be52320e5ffca54e2ba73ce438a76733a362277a17118f9c3a" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "cf5a97413e2d22c31d3c6ecb3c483b97d0df4fc91cd611acb8975b09668a3442" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "fa6d3b312c2bad4b384c8bf71d324c87581769852a2d04780e510ff1c0c7d6fc" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 158, "excavation": 0, "sitework_occupied_cells": 194, "replaced_cells": 30, "new_sitework_cells": 164, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "98da4571e1fc2464eb1c11be8301f666dcf3630c0c3305b019518adeebcccd24", "bearing_fill": 3 }, "blocks": 26796, "nodes": 500, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.76 ], [ 0, 1.98 ] ], "chosen": 1 } ], "optional_omissions": [], "seconds": 4.4389, "details": { "stations": "8a6ab5a03a11254aff9af317e2a7406b45c499d11601ca723bebcbacc6abec73", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
court-2建造成功2410021081408
查看数据
{ "label": "court-2", "inputs": { "structure_seed": 2, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "5f18178d04e4165f8bd5cc27960197279ad5059e2c9c745316c68b4ff4a8ad19", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 130, "excavation": 0, "sitework_occupied_cells": 166, "replaced_cells": 30, "new_sitework_cells": 136, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "7e864981ff2dd3b1ef1c295649a234f0d1513e02868d75127f432eb49588ecdb", "bearing_fill": 3 }, "blocks": 21081, "nodes": 408, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.48 ], [ 0, 1.74 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "artifact": "samples/building-space/final/garden-regression/court-2.litematic", "audit": { "queries": 377, "inventories": 66, "nodes": 408, "digest": "5f18178d04e4165f8bd5cc27960197279ad5059e2c9c745316c68b4ff4a8ad19" }, "seconds": 4.6423, "details": { "stations": "16785425ba8f8301abc9f1acb9e88aaaddfcf45a4ac6adef2e377d5d237a58b8", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
court-3建造成功3410021782457
查看数据
{ "label": "court-3", "inputs": { "structure_seed": 3, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "4bce19efe9ec6a431577a207921ff57ed645448d16996b794cfbd30dd63773b3", "principal_signature": "688fe7f93fdc73b9c82a9aa98648de5052727c4c006c3a33e4eda9aa68a8dc64", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 11, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 21, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "de7d264120d5b6d0a0ab30722d9331f55c74ff3c916d72aede52e773e2db4711" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "0357138907cf6c28e5690169bc5833d9202516d7e3335b43532573efc9f0e4a4" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "9db9e114b27109bd4fac816134dfa3de88927ee621c2a5a4f8936d8f6177d560" ], [ "roof.profile", [ 22, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "9a58cc022b1d53f7dbb961794d57172ff3108541b3cf7b0c82d2dd8cc6d07e2f" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "d8cbdd7f3ba160ae30c6c33c86ccfda503a93c2af004d69eb332d9e7e9f71010" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 6, 0 ], "room.bedroom", [], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ] ] ], "contact": { "fill": 130, "excavation": 0, "sitework_occupied_cells": 166, "replaced_cells": 30, "new_sitework_cells": 136, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "7e864981ff2dd3b1ef1c295649a234f0d1513e02868d75127f432eb49588ecdb", "bearing_fill": 3 }, "blocks": 21782, "nodes": 457, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.48 ], [ 0, 1.74 ] ], "chosen": 1 } ], "optional_omissions": [], "seconds": 3.4637, "details": { "stations": "ff08a415a324db40b078f927d514eaef060da539bccddf64c938abed7788ee2a", "facade_openings": "5cfaab216354afea192994134a2992005fbf820f0a70d14fec45a382d69408fb", "station_count": 14, "window_count": 51, "window_boxes": 26 } }
court-4建造成功4410032564587
查看数据
{ "label": "court-4", "inputs": { "structure_seed": 4, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8470a9bebe30f8f8b880cd4942713a775d80d15298ab1564ade44f7a4129b1cb", "principal_signature": "893c857e5470a6883e5d59bee4136a7fd781b2f64e5d3d822eaae09f5fc6fc88", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 31, 0, 39 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 28 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 37 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 24 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 33 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "8a09a1b47cbef6c29c6a8c3c7b1c1da523fee4b0f3636f58f23f5014ff23dee9" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "c5edc055a7577d689a44fd692ccbd84320059f277fdd34be88097cf530558a29" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north", "south" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 26 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 202, "excavation": 0, "sitework_occupied_cells": 238, "replaced_cells": 30, "new_sitework_cells": 208, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "734c9db84ed38a5507d88de742d111aea743428cf186f07213f1c67b02598f06", "bearing_fill": 1 }, "blocks": 32564, "nodes": 587, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.87 ], [ 0, 2.2 ] ], "chosen": 0 } ], "optional_omissions": [], "seconds": 5.2833, "details": { "stations": "71cfc978cf88ac30db13a6c69d0b36a6c3cc4d10cfc3edeacaf204c9be11bfa9", "facade_openings": "dfa0f779378036ac43b565a553e3aabbf93abaa767515dc60c520fe7c5075a79", "station_count": 16, "window_count": 59, "window_boxes": 34 } }
court-5建造成功5410032805584
查看数据
{ "label": "court-5", "inputs": { "structure_seed": 5, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "8fd0e94abae009a8d7561135f283535fc4ef1f7fedefaf44388d36b2a51b201d", "principal_signature": "d51eda62fc177a4b569a088be8719f64cbdf04089223de94e8fb678542b31f93", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 31, 0, 39 ], { "height": 18, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 28 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 37 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 24 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 33 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "ece9d410f10acb23958b8c67dca72a32b36c1f947b984761eeec33802654b525" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "072cce6798df18e301f84f7a1fc866ddcba2897180aa7c210a703d3d41709939" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "d49534a1275c85be52320e5ffca54e2ba73ce438a76733a362277a17118f9c3a" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "cf5a97413e2d22c31d3c6ecb3c483b97d0df4fc91cd611acb8975b09668a3442" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 2 ] }, "8ceb8c49931931ee9ef9e06e3d906d764293e6f24ddb382f06f25ba649fd2c9e" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north", "south" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 26 ], "room.library", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 202, "excavation": 0, "sitework_occupied_cells": 238, "replaced_cells": 30, "new_sitework_cells": 208, "strategies": [ "stepped", "stepped", "stepped", "stepped", "stepped" ], "signature": "734c9db84ed38a5507d88de742d111aea743428cf186f07213f1c67b02598f06", "bearing_fill": 1 }, "blocks": 32805, "nodes": 584, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.87 ], [ 0, 2.2 ] ], "chosen": 0 } ], "optional_omissions": [], "seconds": 4.9709, "details": { "stations": "50671a67d3b1803cbc8e7f120d42546dc2ab9eede1e3d6e9510dfec1bc28e648", "facade_openings": "dfa0f779378036ac43b565a553e3aabbf93abaa767515dc60c520fe7c5075a79", "station_count": 16, "window_count": 59, "window_boxes": 34 } }
court-6建造成功6410025327483
查看数据
{ "label": "court-6", "inputs": { "structure_seed": 6, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "cfc1f70ab84c23c948fc54389d9f2c40350f41571088b3aa6d0a4c0ff31962bb", "principal_signature": "6931283cff6c5216e81502dadf445357c14ba6ac7f6d2e84397fff9b7d57204c", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 26, 0, 33 ], { "height": 16, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 26 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 22 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "b5960813c15baacc09e1bc1e1298e2ce8f4f79aac67b6f9b068fcbfc0c97a00f" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "0d9934de806de6d6d1021c253f73884b02238d04fadf3e8669c7f0468534ae0f" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 1, 2 ] }, "595466ba1966d36b0db7ff6ca2e37478802430fdbbf27b2afeff741fbbb30b7a" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 1, 2 ] }, "3d4abd3a0f589e729bafb3c5ac7b88499b16c259d0b03227d476955694a32a78" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north", "south" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 22 ], "room.library", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 142, "excavation": 0, "sitework_occupied_cells": 178, "replaced_cells": 30, "new_sitework_cells": 148, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "84fd456b345606cabad862c724a9c2e4053a932bc6f0769550d31910392b680b", "bearing_fill": 1 }, "blocks": 25327, "nodes": 483, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.6 ], [ 0, 1.94 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "seconds": 3.4508, "details": { "stations": "9002d2cf5945b6f790ef0c9aaa9d0b580721e5a34ac9539ffabda82589208dd0", "facade_openings": "d4e84c6f7fa5732324242db12c6e6956afd82470c3484f07bd7598861f50d8ba", "station_count": 14, "window_count": 46, "window_boxes": 26 } }
court-7建造成功7410026590484
查看数据
{ "label": "court-7", "inputs": { "structure_seed": 7, "environment_seed": 4100, "garden": true }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ed4d15cc497226256cbcd11daa8dd7918a8d7e7a81cada9e4ec2bfd63b050763", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 158, "excavation": 0, "sitework_occupied_cells": 194, "replaced_cells": 30, "new_sitework_cells": 164, "strategies": [ "piers", "stepped", "stepped", "stepped", "stepped" ], "signature": "98da4571e1fc2464eb1c11be8301f666dcf3630c0c3305b019518adeebcccd24", "bearing_fill": 3 }, "blocks": 26590, "nodes": 484, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 1, 1.76 ], [ 0, 1.98 ] ], "chosen": 1 } ], "optional_omissions": [], "artifact": "samples/building-space/final/garden-regression/court-7.litematic", "audit": { "queries": 449, "inventories": 83, "nodes": 484, "digest": "ed4d15cc497226256cbcd11daa8dd7918a8d7e7a81cada9e4ec2bfd63b050763" }, "seconds": 6.0155, "details": { "stations": "2d185a0f0ccd9124f863de23c2599a41fb9e7dcdcb6fd5172a5dbd11e280624e", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-0-2建造成功2410043935231
查看数据
{ "label": "new-pair-0-2", "inputs": { "environment_seed": 4100, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.9376801597532656 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "a8c9e47c77a14eaa94764e1e104d6bf780e6135cd16dbf1a242602cc00f95e94", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "2fcbd6034f717848e9c6dcc4ab76612a6a6051293a2078ce5a7a040acf859cb0", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 76, "excavation": 0, "sitework_occupied_cells": 82, "replaced_cells": 3, "new_sitework_cells": 79, "strategies": [ "stepped" ], "signature": "0f423edcc8b81cd4e92f3ff705d398d247a16ebe17a6bf0675b5a53bf2f19667", "bearing_fill": 1 }, "blocks": 43935, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.88 ], [ 1, 1.18 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "artifact": "samples/building-space/final/garden-regression/new-pair-0-2.litematic", "audit": { "queries": 215, "inventories": 66, "nodes": 231, "digest": "2fcbd6034f717848e9c6dcc4ab76612a6a6051293a2078ce5a7a040acf859cb0" }, "seconds": 5.5438, "details": { "stations": "cf868a3f22c811cc98cbd36963c80fda618d70fe73571b25c71b609cd82efb88", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-0-7建造成功7410046146272
查看数据
{ "label": "new-pair-0-7", "inputs": { "environment_seed": 4100, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.9376801597532656 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "a8c9e47c77a14eaa94764e1e104d6bf780e6135cd16dbf1a242602cc00f95e94", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "361dfce19d9fb6ab4e092bd7f8fc9c843cbdb00af74417f6c93b8aa9fa2a7b33", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 127, "excavation": 0, "sitework_occupied_cells": 133, "replaced_cells": 3, "new_sitework_cells": 130, "strategies": [ "stepped" ], "signature": "9796e5b7166098e20609edfef2bbf2a44157030e212f649fba0aba9d75a4ad84", "bearing_fill": 1 }, "blocks": 46146, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 1.39 ], [ 1, 1.44 ] ], "chosen": 0 } ], "optional_omissions": [], "artifact": "samples/building-space/final/garden-regression/new-pair-0-7.litematic", "audit": { "queries": 252, "inventories": 83, "nodes": 272, "digest": "361dfce19d9fb6ab4e092bd7f8fc9c843cbdb00af74417f6c93b8aa9fa2a7b33" }, "seconds": 6.785, "details": { "stations": "8d685ea9888d15d1a68f7a096c2af8cfd3b966c43c599db9e7561c989a290cce", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-1-2建造成功2410147217231
查看数据
{ "label": "new-pair-1-2", "inputs": { "environment_seed": 4101, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.6091962898701053 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "8f82df698da53194e6d29699c8a29bec3b44f5e47cbca0f1df6458325a0668b2", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "40939ee4367b8ee5ed85730450e22e3403a06a5352e7ee20981fb79c017c265e", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 73, "excavation": 0, "sitework_occupied_cells": 79, "replaced_cells": 76, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "2b119f7acdc305f171f30421b9ff8882f5627572c13e57b8273b3bc25867beed", "bearing_fill": 3 }, "blocks": 47217, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 2.31 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "artifact": "samples/building-space/final/garden-regression/new-pair-1-2.litematic", "audit": { "queries": 215, "inventories": 66, "nodes": 231, "digest": "40939ee4367b8ee5ed85730450e22e3403a06a5352e7ee20981fb79c017c265e" }, "seconds": 4.8969, "details": { "stations": "16785425ba8f8301abc9f1acb9e88aaaddfcf45a4ac6adef2e377d5d237a58b8", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-1-7建造成功7410149377272
查看数据
{ "label": "new-pair-1-7", "inputs": { "environment_seed": 4101, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.6091962898701053 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "8f82df698da53194e6d29699c8a29bec3b44f5e47cbca0f1df6458325a0668b2", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "6b4a9729c575fd8065351b734ba80da585d2a7c163419e8b988771b0f3b3062d", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 100, "excavation": 0, "sitework_occupied_cells": 106, "replaced_cells": 103, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "910918d4fec0706daa067306e15b95ae3648602b9a5f1a6ae1ffccd5d6935cf8", "bearing_fill": 3 }, "blocks": 49377, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.12 ] ], "chosen": 1 } ], "optional_omissions": [], "artifact": "samples/building-space/final/garden-regression/new-pair-1-7.litematic", "audit": { "queries": 252, "inventories": 83, "nodes": 272, "digest": "6b4a9729c575fd8065351b734ba80da585d2a7c163419e8b988771b0f3b3062d" }, "seconds": 5.6344, "details": { "stations": "2d185a0f0ccd9124f863de23c2599a41fb9e7dcdcb6fd5172a5dbd11e280624e", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-2-2建造成功2410247217231
查看数据
{ "label": "new-pair-2-2", "inputs": { "environment_seed": 4102, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 5.333154877072996 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "17a14b8b8ee4263f9c770f7b0dbb6ecb483dea3c0f72530310f28689db99427f", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "a6acce2dcc8bf7c1cb4a71187ff5ef51a261d4972af87266fdd228340f5db25d", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 31, "excavation": 0, "sitework_occupied_cells": 37, "replaced_cells": 34, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "4b8e9fb76e5bbdc6c5e699333a1dc632e291dcd2ab93acca990b4da019037df7", "bearing_fill": 0 }, "blocks": 47217, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.05 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "seconds": 1.9581, "details": { "stations": "16785425ba8f8301abc9f1acb9e88aaaddfcf45a4ac6adef2e377d5d237a58b8", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-2-7建造成功7410249377272
查看数据
{ "label": "new-pair-2-7", "inputs": { "environment_seed": 4102, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 5.333154877072996 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "17a14b8b8ee4263f9c770f7b0dbb6ecb483dea3c0f72530310f28689db99427f", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "23b195f0727c8624268f58ce04be26b16b4f35449ca6a7bb213b36ad65b8531b", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 48, "excavation": 0, "sitework_occupied_cells": 54, "replaced_cells": 51, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "bdc923b5d979bd86ed3f7af7a273d914d4fd414e013d87dcc550f39c8af59d79", "bearing_fill": 0 }, "blocks": 49377, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.56 ] ], "chosen": 1 } ], "optional_omissions": [], "seconds": 2.8629, "details": { "stations": "2d185a0f0ccd9124f863de23c2599a41fb9e7dcdcb6fd5172a5dbd11e280624e", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-3-2建造成功2410345625231
查看数据
{ "label": "new-pair-3-2", "inputs": { "environment_seed": 4103, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.5111599696578073 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "8ac94e427f762dfd8328fba902c7e230565fc58407c48af9072dc64c3636dfed", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "10634d0e7274d68069176463e0c742e4bd111c4554641f168c9bc0c7c18af4d9", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 32, "excavation": 0, "sitework_occupied_cells": 38, "replaced_cells": 3, "new_sitework_cells": 35, "strategies": [ "stepped" ], "signature": "5c7e2f17f4f56f9c6e465fb096bc01d0443407cffeb8b1e4a24d1c9321aaaac2", "bearing_fill": 0 }, "blocks": 45625, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.44 ], [ 1, 0.78 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "seconds": 2.639, "details": { "stations": "cf868a3f22c811cc98cbd36963c80fda618d70fe73571b25c71b609cd82efb88", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-3-7建造成功7410347799272
查看数据
{ "label": "new-pair-3-7", "inputs": { "environment_seed": 4103, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.5111599696578073 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "8ac94e427f762dfd8328fba902c7e230565fc58407c48af9072dc64c3636dfed", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "4c737b2a0f6bdf816b34e56ad435706c1c61c8611b6550ba0ea87d05a44f2e27", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 46, "excavation": 0, "sitework_occupied_cells": 52, "replaced_cells": 3, "new_sitework_cells": 49, "strategies": [ "stepped" ], "signature": "89f84ae2325499b0a1b5f9afea768966d694f939b28cad1fb8b0f8e089e9d849", "bearing_fill": 0 }, "blocks": 47799, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.58 ], [ 1, 0.88 ] ], "chosen": 0 } ], "optional_omissions": [], "seconds": 3.692, "details": { "stations": "8d685ea9888d15d1a68f7a096c2af8cfd3b966c43c599db9e7561c989a290cce", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-4-2建造成功2410447518231
查看数据
{ "label": "new-pair-4-2", "inputs": { "environment_seed": 4104, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.1223935432842791 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "3396f0ea8e525372bb7569c27f0a869dadd2a85402d9b636f1db196662175966", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "e64bbbe7aa57eb224679423da2837c15debe5314a6d2052fefc2ac57008c0729", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 0, "excavation": 0, "sitework_occupied_cells": 6, "replaced_cells": 3, "new_sitework_cells": 3, "strategies": [ "stepped" ], "signature": "06ea11357cb8ebe51ce59a9fb3cc90529f7cb8ae0970b083ee967bea669e7676", "bearing_fill": 0 }, "blocks": 47518, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 0.12 ], [ 1, 0.52 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "seconds": 2.6395, "details": { "stations": "cf868a3f22c811cc98cbd36963c80fda618d70fe73571b25c71b609cd82efb88", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-4-7建造成功7410449678272
查看数据
{ "label": "new-pair-4-7", "inputs": { "environment_seed": 4104, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.025, -0.02, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 0.1223935432842791 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": 4, "digest": "3396f0ea8e525372bb7569c27f0a869dadd2a85402d9b636f1db196662175966", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8c0cf9c8866432f257ca080c3f8e5236c802fa243578b078f3100a28060911bf", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 14, "excavation": 0, "sitework_occupied_cells": 20, "replaced_cells": 17, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "fb80c881bde38fa55e8c0941c1b873d9fa5ee92d53cf95840f36884843dad39c", "bearing_fill": 3 }, "blocks": 49678, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 0.54 ] ], "chosen": 1 } ], "optional_omissions": [], "seconds": 2.7549, "details": { "stations": "2d185a0f0ccd9124f863de23c2599a41fb9e7dcdcb6fd5172a5dbd11e280624e", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
new-pair-5-2建造成功2410543568231
查看数据
{ "label": "new-pair-5-2", "inputs": { "environment_seed": 4105, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.299058974263774 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "2f0f2680707f39505d74387868c1eebfe74f7a1a2a18e147ba8a18c1b206c553", "structure_seed": 2, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "f02f0cc98f7bd28113d0b68fe4dfd4d4fb2f95485471ee19708aea99efc4c11e", "principal_signature": "c1f1277cbddc2fdf6c2490788b6039406f31efc8ba7e6ef50950e3842f1d05ee", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 10, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 17, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 22, 8, 17 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 32, 8, 13 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c1a11f0f69059d517411ef5e7e60a41e467ab257ac61a4baef00a61de4f2486e" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "f077435e219f2885917fcc7f32ff74239a4d66c67ab33ea3d3a2140859ebf277" ], [ "roof.profile", [ 11, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "65a63520d3754a281ba3f181431ede58eaaf05dd18704d58ec8d47b0a371d9e2" ], [ "roof.profile", [ 22, 7, 11 ], { "axis": "z", "span": 11, "rise": [ 1, 2 ] }, "c517627449fef556818812285f34a7a967540385454012fad9fecd7b6eeef1e5" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.kitchen", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "892ab014ba1ce15bdcf3aeee00aa4f2ef05178ab6ed1bcecc15a72734df2513d" ], [ "room", [ 11, 0, 0 ], "room.library", [ "west", "east" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 22, 0, 11 ], "room.storage", [ "north" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 98, "excavation": 0, "sitework_occupied_cells": 105, "replaced_cells": 2, "new_sitework_cells": 103, "strategies": [ "stepped" ], "signature": "447d5e288aac00c23c2aafed1a9632056a239663a32e58d16fd41872eff9d521", "bearing_fill": 0 }, "blocks": 43568, "nodes": 231, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 1.09 ], [ 1, 1.23 ] ], "chosen": 0 } ], "optional_omissions": [ { "component": "/building/roof-3/cover", "dormers": [ [ "right", 4, "existing upper volume" ] ] } ], "seconds": 2.7494, "details": { "stations": "cf868a3f22c811cc98cbd36963c80fda618d70fe73571b25c71b609cd82efb88", "facade_openings": "c1d4f5bdb65be2a10c45629adf7fc549459e2b123e6dc1002ee3c2bf7cda8506", "station_count": 12, "window_count": 40, "window_boxes": 22 } }
new-pair-5-7建造成功7410545757272
查看数据
{ "label": "new-pair-5-7", "inputs": { "environment_seed": 4105, "expression": { "op": "clamp", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.025, 0, 4 ] }, { "op": "wave", "args": [ 0.3, 0.13, 0.09, 1.299058974263774 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.02, 4 ] }, { "op": "radial", "args": [ 18, 18, 36, 0.5 ] } ] }, { "op": "radial", "args": [ 8, 10, 44, 0.6 ] } ] }, 2, 6 ] }, "water": null, "digest": "2f0f2680707f39505d74387868c1eebfe74f7a1a2a18e147ba8a18c1b206c553", "structure_seed": 7, "garden": false }, "attempts": 2, "accepted_candidates": 2, "retries": 0, "status": "validated", "digest": "ae0dda6c71432c40bfb6b172d3061a24be4e92a751f09fcdbbfa9fc4d581bad3", "principal_signature": "1a892d64672f51e6aa86c1f22ad2acc39d7735f84a0b5db04190132fa2c39cdf", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": true, "depth": 4, "width": 13, "entrance_x": 6, "columns": [ 0, 12 ] } ], [ "masonry.chimney", [ 5, 0, 26 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 0, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 12, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 25, 8, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 14, 6 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 26, 8, 19 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 14, 2 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 38, 8, 15 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "a082c43f217b782b78ef106b80833172af52e21207ef56a28138b46855e23adb" ], [ "roof.profile", [ 0, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "ac58a23bade7310373b47f1e8f6e751c218827d6cb8b28d46e27b3f84563379a" ], [ "roof.profile", [ 13, 7, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "da18108e2be2359ef7876d2a95146e6b1d56d27652f6b7568ca9851a08a6a7f4" ], [ "roof.profile", [ 26, 13, 0 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "11cf4fffcd367b7f838214e095c5b53a2c789bef9c72cb4ef18d8a0b240db875" ], [ "roof.profile", [ 26, 7, 13 ], { "axis": "z", "span": 13, "rise": [ 1, 1, 2 ] }, "99196cdad567087f649bc679b00253e86a6b19283e1079be2d3892e091e9d1a8" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "south", "east" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 0, 13 ], "room.kitchen", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 0, 6, 0 ], "room.bedroom", [ "north" ], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ], [ "room", [ 13, 0, 0 ], "room.library", [ "west", "east" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 0 ], "room.workshop", [ "south", "west" ], true, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 0, 13 ], "room.storage", [ "north" ], false, "7c20fb3ec0b0e97b6766d63bba6e816ae797e2daf8b22eb6bdab41cbda0319b1" ], [ "room", [ 26, 6, 0 ], "room.bedroom", [], false, "e6a1b2f4b7cc518b62b00c9003fe72b80b3ad927b612e3997ba5f526adb421eb" ] ] ], "contact": { "fill": 125, "excavation": 0, "sitework_occupied_cells": 133, "replaced_cells": 1, "new_sitework_cells": 132, "strategies": [ "stepped" ], "signature": "f631de76958ac2167b4090eed37db52b886e7acfb6527b4dcf5cd5aaff9874d7", "bearing_fill": 0 }, "blocks": 45757, "nodes": 272, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 2, "rejected": [], "scores": [ [ 0, 1.35 ], [ 1, 1.41 ] ], "chosen": 0 } ], "optional_omissions": [], "seconds": 4.1748, "details": { "stations": "8d685ea9888d15d1a68f7a096c2af8cfd3b966c43c599db9e7561c989a290cce", "facade_openings": "af8241cf8267fdc233a16060e3366755e0846e96a30db1c72f8537b456612927", "station_count": 14, "window_count": 51, "window_boxes": 30 } }
0-high_house-5建造成功5300034193175
查看数据
{ "label": "0-high_house-5", "inputs": { "environment_seed": 3000, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.9604651402756024 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "29bcb08f41366f7d80aaf01074172db2ee52a37799aa5e811bbbc041d7677451", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "8d62ed224a5f17059c012f2cd63d7192e52413c667f4b106db9ea075eeb0c0ff", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 50, "excavation": 0, "sitework_occupied_cells": 56, "replaced_cells": 53, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "3ad242d8fc64f9d1c01c3e58537b80508c02bef6a4461625bb85df49160b4170", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.62 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/prior-holdout/0-high_house-5.litematic", "audit": { "queries": 161, "inventories": 28, "nodes": 175, "digest": "8d62ed224a5f17059c012f2cd63d7192e52413c667f4b106db9ea075eeb0c0ff" }, "seconds": 2.9464 }
0-gabled_hall-7建造成功7300035578199
查看数据
{ "label": "0-gabled_hall-7", "inputs": { "environment_seed": 3000, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.9604651402756024 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "29bcb08f41366f7d80aaf01074172db2ee52a37799aa5e811bbbc041d7677451", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "aaadd7194c3a127764138337c35923f4ce2f320feac906af6234dbd945a369c5", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 128, "excavation": 0, "sitework_occupied_cells": 134, "replaced_cells": 131, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "57fd9eea3b5b9d306a265083e16e61b79a37b474ef943735407c5f5e08dc7c5a", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.96 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "artifact": "samples/building-space/final/prior-holdout/0-gabled_hall-7.litematic", "audit": { "queries": 183, "inventories": 61, "nodes": 199, "digest": "aaadd7194c3a127764138337c35923f4ce2f320feac906af6234dbd945a369c5" }, "seconds": 4.0295 }
1-high_house-5建造成功5300137304175
查看数据
{ "label": "1-high_house-5", "inputs": { "environment_seed": 3001, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.560197649098296 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 6, "digest": "3fd3038ceb1872c8e7716c435791b06e79085c1c4aed0b9542186adf165f4b1f", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "1dd3ed0537928f3be72ec7bccfb54894460c8e1f1d3b727a644e7e4b03aecf50", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 96, "excavation": 0, "sitework_occupied_cells": 105, "replaced_cells": 102, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "1490da7746ba07c9995e60f09372a1b8b622c639b117f632166185908a8fa981", "bearing_fill": 2 }, "blocks": 37304, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.09 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.8602 }
1-gabled_hall-7建造成功7300138689199
查看数据
{ "label": "1-gabled_hall-7", "inputs": { "environment_seed": 3001, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.560197649098296 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 6, "digest": "3fd3038ceb1872c8e7716c435791b06e79085c1c4aed0b9542186adf165f4b1f", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "27538715f7e28ce3a2de4f26c7c522d6787b19a50a99699d2bb29ac38602ed44", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 257, "excavation": 0, "sitework_occupied_cells": 266, "replaced_cells": 263, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "3813e9b636a13a3f2da2abd773ad47f9f3a68b073011755dbf91599013a66edc", "bearing_fill": 3 }, "blocks": 38689, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 7.92 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9885 }
2-high_house-5建造成功5300234364175
查看数据
{ "label": "2-high_house-5", "inputs": { "environment_seed": 3002, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.04, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.2115633617859816 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "33442db94e6d5b9d442150ef3f6b16e36070ec38d493053650d966eb240de1d0", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "6e6bad1079e22fc8260c8b49f8af518ccf15e77c5c13e5fd45b11cbf08679f1c", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 49, "excavation": 0, "sitework_occupied_cells": 55, "replaced_cells": 52, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "cf482cf1f74c6f70fa789f3a72d852d64ccfe6e503265084da3d625c9f94fa01", "bearing_fill": 2 }, "blocks": 34364, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.971 }
2-gabled_hall-7建造成功7300235749199
查看数据
{ "label": "2-gabled_hall-7", "inputs": { "environment_seed": 3002, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0.04, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.2115633617859816 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "33442db94e6d5b9d442150ef3f6b16e36070ec38d493053650d966eb240de1d0", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "0c91e862217bf15cca9932442f1fe1f83f684deedc1c9ea24ebf114475ddf4bd", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 101, "excavation": 0, "sitework_occupied_cells": 107, "replaced_cells": 104, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "1e4598ef6c6b33e9a6bac7a3fb0b9e5acbf02743150f73473289728965e5a922", "bearing_fill": 3 }, "blocks": 35749, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.15 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.0648 }
3-high_house-5建造成功5300334193175
查看数据
{ "label": "3-high_house-5", "inputs": { "environment_seed": 3003, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 2.008807956041616 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "a4f3dd3069448018ce63ab0b8a26423676f170b58b4cfe956dd9249416b3fb2e", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "e3c62d00f624ce666488694771bc75b6882c5787b8f704f92ff103d450fcfc78", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 49, "excavation": 0, "sitework_occupied_cells": 55, "replaced_cells": 52, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "cf482cf1f74c6f70fa789f3a72d852d64ccfe6e503265084da3d625c9f94fa01", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.9354 }
3-gabled_hall-7建造成功7300335578199
查看数据
{ "label": "3-gabled_hall-7", "inputs": { "environment_seed": 3003, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 2.008807956041616 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "a4f3dd3069448018ce63ab0b8a26423676f170b58b4cfe956dd9249416b3fb2e", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "e3628054fae674dc301386f659c69ff093970bcf2ed1f3c3139cd6dc42f96965", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 117, "excavation": 0, "sitework_occupied_cells": 126, "replaced_cells": 123, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "d047c98ac75832f2f22e1a9321846f4ca6315bcbca42d0edd97c7a718be69018", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.72 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9384 }
4-high_house-5建造成功5300434193175
查看数据
{ "label": "4-high_house-5", "inputs": { "environment_seed": 3004, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.568642839893792 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "a7007273bd822f246d872eb3545016d88225df2d3590c972f7c6e8335d7a8f64", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "f44679eb4210c54ab481e31218bb93ff93f8ae4f5a24764a5fe4f49f54d9a69d", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 53, "excavation": 0, "sitework_occupied_cells": 59, "replaced_cells": 56, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "273a9de1bed16fce2b72a6d27acc254655315360401dae5115b27e39c8fe1ad6", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.71 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.06 }
4-gabled_hall-7建造成功7300435578199
查看数据
{ "label": "4-gabled_hall-7", "inputs": { "environment_seed": 3004, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.568642839893792 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "a7007273bd822f246d872eb3545016d88225df2d3590c972f7c6e8335d7a8f64", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "75ba92008a70f4df5a5b8f9ecf62c3e733a4a0e866b94ba27b2c19803b52f557", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 178, "excavation": 0, "sitework_occupied_cells": 184, "replaced_cells": 181, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "d10e7e4935f1d3917e0aa0b917aad838a2a7a8b33e54155af32bc5e73c9b3fc1", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.46 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 2.2473 }
5-high_house-5建造成功5300534193175
查看数据
{ "label": "5-high_house-5", "inputs": { "environment_seed": 3005, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.214052939583466 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "f9063ca9ea89bddc647f483aca6259fbc63ffab882ff90572bf48a44d6d8107e", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "9d3cd569e5c9f7e2a283bc96dc41c268ba38d067d90adb523232a5c84bf8c7ea", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 53, "excavation": 0, "sitework_occupied_cells": 59, "replaced_cells": 56, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "273a9de1bed16fce2b72a6d27acc254655315360401dae5115b27e39c8fe1ad6", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.71 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.9079 }
5-gabled_hall-7建造成功7300535578199
查看数据
{ "label": "5-gabled_hall-7", "inputs": { "environment_seed": 3005, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 4.214052939583466 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "f9063ca9ea89bddc647f483aca6259fbc63ffab882ff90572bf48a44d6d8107e", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "710f71fe5af5462fad829eebaf5400b9df76b331778f1c407376b2143ed14508", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 176, "excavation": 0, "sitework_occupied_cells": 182, "replaced_cells": 179, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "c464711a3d6366c861ca0635c0506d2b38d2eccf850d5a1a650db977777eb2c6", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.4 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9836 }
6-high_house-5建造成功5300634193175
查看数据
{ "label": "6-high_house-5", "inputs": { "environment_seed": 3006, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 0.38624098499448767 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "5d26de5bff946ce2c1e069f22c997c123a26fbb40339bcb2a8b02a3d44dc9673", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "683b5247b9f14f84cba23d6282d0d770bf8be913233d9f598b7fba68a3b484e0", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 49, "excavation": 0, "sitework_occupied_cells": 55, "replaced_cells": 52, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "cf482cf1f74c6f70fa789f3a72d852d64ccfe6e503265084da3d625c9f94fa01", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 0.959 }
6-gabled_hall-7建造成功7300635578199
查看数据
{ "label": "6-gabled_hall-7", "inputs": { "environment_seed": 3006, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ 0, 0, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 0.38624098499448767 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "5d26de5bff946ce2c1e069f22c997c123a26fbb40339bcb2a8b02a3d44dc9673", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "a4775c8a2dd1d29c017aebffc4da48831c9c62946e23fe79c03839cd3368a74f", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 116, "excavation": 0, "sitework_occupied_cells": 122, "replaced_cells": 119, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "2c89062acf3e90088f4fd7e47b2e0fe05f6f023dee16b93e6ab0fb078784f5e5", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 3.6 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.9519 }
7-high_house-5建造成功5300734193175
查看数据
{ "label": "7-high_house-5", "inputs": { "environment_seed": 3007, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.076591304124151 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "eb2445f2e618f9e63ecfba38198ff96f1451730ec034add72bf4c2f0463ae97d", "client": "high_house", "structure_seed": 5 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "e6a1be85f524611796b048d882d37dec38c758b1edbb6cee1f3efe594b0b740c", "principal_signature": "e09e658540acdae8851bf75005b7186dd2cd7570261fd6edaf9a044acc7e25ce", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 4, "width": 9, "entrance_x": 4, "columns": [ 0, 8 ] } ], [ "masonry.chimney", [ 3, 0, 9 ], { "height": 28, "cap_overhang": 0 } ], [ "roof.dormer", [ 0, 20, 6 ], { "tops": [ 5, 5, 5 ] }, "8cba8fa3e9a72ff63b980d2ef663695210ef851504ea42903bf9b38c149a5c2b" ], [ "roof.profile", [ 0, 19, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "8a48e97f449953b3b064ae81bb517dd5983262d4d149b55f2ce845495101a9d3" ], [ "roof.profile", [ 9, 13, 0 ], { "axis": "z", "span": 9, "rise": [ 2, 1 ] }, "3d571d6e7cb3174a4bd63e6e596a9a19fff47a9a82afcea92f8fe7eda30261dd" ], [ "room", [ 0, 0, 0 ], "room.living", [ "north", "east" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 0, 12, 0 ], "room.bedroom", [], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 18, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 0, 6, 0 ], "room.library", [ "east" ], true, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 0, 0 ], "room.kitchen", [ "west" ], false, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ], [ "room", [ 9, 12, 0 ], "room.loft.bedroom", [ "landing" ], false, "f40b714da9dc38d2cc7b647ce7a15d6fbfeb627b6255edfdee0690662e7ba81f" ], [ "room", [ 9, 6, 0 ], "room.workshop", [ "west" ], true, "1a87adcdab17411140e351219c2dedb4072716c712d3e00e0ec33c116b7124e1" ] ] ], "contact": { "fill": 49, "excavation": 0, "sitework_occupied_cells": 55, "replaced_cells": 52, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "cf482cf1f74c6f70fa789f3a72d852d64ccfe6e503265084da3d625c9f94fa01", "bearing_fill": 2 }, "blocks": 34193, "nodes": 175, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 1.59 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-0/weather/cover", "dormers": [ [ "left", 4, "existing upper volume" ], [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.1401 }
7-gabled_hall-7建造成功7300735578199
查看数据
{ "label": "7-gabled_hall-7", "inputs": { "environment_seed": 3007, "expression": { "op": "clamp", "args": [ { "op": "transform", "args": [ { "op": "blend", "args": [ { "op": "add", "args": [ { "op": "gradient", "args": [ -0.04, -0.03, 4 ] }, { "op": "wave", "args": [ 0.35, 0.17, 0.05, 3.076591304124151 ] } ] }, { "op": "add", "args": [ { "op": "gradient", "args": [ -0.02, 0.03, 4 ] }, { "op": "radial", "args": [ 13, 10, 25, 0.7 ] } ] }, { "op": "radial", "args": [ 5, 8, 32, 0.8 ] } ] }, 2, -3, 1.1 ] }, 2, 7 ] }, "water": 5, "digest": "eb2445f2e618f9e63ecfba38198ff96f1451730ec034add72bf4c2f0463ae97d", "client": "gabled_hall", "structure_seed": 7 }, "attempts": 2, "accepted_candidates": 1, "retries": 0, "status": "validated", "digest": "c04962571193779209cc5aa6f2e35bfbc5fa6ede28efa0d38926aae49bfbf87f", "principal_signature": "47736f14bab06d2f7d0884270379994f15bfbe3e8dd84cf7a5a60270fa74462d", "architecture": [ [ [ "attachment.porch", [ 0, 0, 0 ], { "balcony": false, "depth": 5, "width": 11, "entrance_x": 5, "columns": [ 0, 10 ] } ], [ "masonry.chimney", [ 4, 0, 22 ], { "height": 17, "cap_overhang": 0 } ], [ "roof.dormer", [ 13, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 13, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 16, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 20, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 10 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 6, 8, 21 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 0 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.dormer", [ 9, 8, 11 ], { "tops": [ 4, 4, 4 ] }, "dd9c85cd0d20647f0444db8c76bad9c20e46e7a2f6ca3657bab7a188021b66fc" ], [ "roof.profile", [ 0, 7, 0 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "c87754d68988432fc1346a56a918deb89e9013ad7958b3a0bd48c49e91821574" ], [ "roof.profile", [ 0, 7, 11 ], { "axis": "x", "span": 11, "rise": [ 1, 2 ] }, "a076ddebb8d408e0635e5e9f67dc713b9b086735c27c1b6c07449973ba69eea4" ], [ "room", [ 0, 0, 0 ], "room.library", [ "north", "south", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 0, 11 ], "room.living", [ "north", "east" ], true, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 0, 6, 0 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 0, 6, 11 ], "room.loft.library", [ "landing" ], false, "205b0ba45988345f14a17f8b262f20d186eac1a0d3d333aacd9d18c99215579e" ], [ "room", [ 11, 0, 0 ], "room.workshop", [ "south", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ], [ "room", [ 11, 0, 11 ], "room.kitchen", [ "north", "west" ], false, "d32081fa33421a8ea84c9b64181c3f6dcc8e44fc78b805693ea2aa0d1d417854" ] ] ], "contact": { "fill": 169, "excavation": 0, "sitework_occupied_cells": 175, "replaced_cells": 172, "new_sitework_cells": 3, "strategies": [ "piers" ], "signature": "297a695a9e3681e75cfc990fac116273fb1fcaa2893f595683cbe9869b1aeaaf", "bearing_fill": 3 }, "blocks": 35578, "nodes": 199, "candidates": [ { "kind": "candidate-selection", "component": "/building", "attempts": 2, "accepted": 1, "rejected": [ { "rule": "contact-strategy", "component": "/building", "position": [ 0, 0, 0 ], "conditions": "Requested strategy incompatible with measured water/relief" } ], "scores": [ [ 1, 5.19 ] ], "chosen": 1 } ], "optional_omissions": [ { "component": "/building/roof-0/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] }, { "component": "/building/roof-1/weather/cover", "dormers": [ [ "right", 4, "protected circulation" ] ] } ], "seconds": 1.8923 }

08 · 网页有没有真的执行 Python

模型这轮没有在浏览器里重测。 它只验证了原生 Python 在禁用若干第三方导入后还能生成,这不足以证明 Pyodide 能运行。报告另外执行真实浏览器检查,并把结果与原实验容器里的同一套 Python 程序逐项核对。

本报告最终网页检查记录包含 34 次成功的浏览器生成,另有 1 次真实生成失败(不包括故意输入错误的界面测试)。完成 69 项界面与结果检查,页面脚本异常 0 个。34 组成功结果与原 Python 环境逐一核对;失败输入也在原环境复现。实际下载包另行读取并比较完整内容。跨环境一致性与界面检查:通过。这不代表每次生成都成功,下面保留了失败原因。

浏览器检查记录 · 原环境与下载包核对

发布后另在公网执行三次生成,检查原建筑重现、玻璃与阁楼家具归属、室内与阁楼/楼梯切面、旧大厅和下载,均通过。公网检查记录。

浏览器工作线程实际加载本轮未改动的库源码,在后台执行编辑框中的 Python;生成后保存并读回,再交给渲染器。这样鼠标拖动与页面操作不会被生成程序长时间卡住。我们检查了画廊对应编号、实际导出的建筑与部件记录、阁楼家具和玻璃归属、切面、结构参数、旧的多栋建筑例子及错误提示。测试记录里的次数是有限覆盖,不是对任意用户脚本的保证。

“换随机编号”保留现有代码;“换一种场景”载入报告公开的轮换程序,依次覆盖 18 个示例入口,各入口自己随机安排结构。它包含村落、多个建筑相连、桥廊、围墙,不会永远只造一栋房子。为便于复现,轮换检查固定了测试随机源,各入口使用一个确定的编号;这不是随机成功率估计。此次 18 个轮换入口中,17 个选定输入建成,村落入口的编号 314 失败;默认村落 0 和 1 另外验证成功。但 18 个入口仍不是整个库所有可能组合,使用者可以直接修改代码组合其他东西。

浏览器检查和原生对照会核对方块内容摘要、主结构摘要及一个真实方块归属查询;下载过的文件还重新读取并比较完整部件、关系、依赖、操作和替换记录。切开预览后再下载,仍应获得原来的完整建筑。

额外发现:村落 314 的路灯挡路

调用 settlement_scene(seed=314, count=None) 时,/village/connections/lamp-2 的石砖底座和栅栏分别占据 (-5, 5, 40)、(-5, 6, 40),与道路需要留空的通行空间冲突。报错归于道路组件,是因为道路声明了这里必须能走;实际占位者是路灯。

这属于 hearth/programs.py 中村落道路与路灯的组合缺陷。检查器发挥了作用,用户仍然没拿到建筑;不能把它包装成“生成成功”。第四轮与第五轮的原生结果相同,也不能归罪于 Pyodide。我们没有改库、换掉这个编号或把它计入成功率。默认编号 0 和编号 1 则单独验证,不能用两者的成功覆盖 314 的失败。

第四轮原生复现 · 第五轮原生复现 · 冲突方块与自动归属诊断 · 浏览器失败输入与完整错误。这些是报告另外增加的检查,不能与模型原来的 172 次混成同一个采样分布。

保存与底层关系的原实验检查

模型对 31 对选定文件进行了保存/读取检查:8,022 个部件记录、7,306 次非空部件格子查询、1,475 个带额外物品数据的方块。另对默认和编号 1 两份 CLI 产物检查了 1,711 个部件节点、1,631 次非空查询与 190 个带额外数据的方块。这些数字数的是记录和查询,不是成功建筑数量。

相同编号在不同 Python 哈希随机设置下重跑,默认场景的内容摘要相同。方块状态比较按方块名和属性含义进行;属性排列顺序变化不应误报“保存后变了”。保存与重放记录 · CLI 完整核对 · 真实玻璃归属。

统一验收结果秒
default通过16.744
seed-0-a通过16.391
seed-0-b通过16.529
seed-1通过9.055
tests通过241.271

09 · 做得怎么样,还缺什么

我的判断是:这一轮比单纯加花箱更接近“会组合功能空间的库”。 阁楼是屋顶、房间、楼梯、支撑、家具、灯和验证共同工作的结果;新高层程序不必知道具体方块位置,也不用手动补归属。这符合先打好可扩展架构、再从小到大组合的方向。

不过,它还不能让任意高层程序只靠粗略想法就得到合法漂亮的复杂建筑。当前可靠范围仍建立在一批明确约定上:房屋规划多使用 9/11/13 格房间、6 格层高、水平直角方向和有限屋顶形状。部件有公开宽深范围,也不等于范围内所有尺寸、坡度和环境组合都可行。

美观方面,从成品图能看到宽门廊、较轻的烟囱、能用的阁楼,但连续窗列与木梁带仍重复,屋脊变化有限,家具之间空地较多。园林缺少参考图中不规则台地、丰富植被与有层次的场地安排。没有外部评委或审美量表,不能凭自动验收给出“达到参考图”的结论。

此外,村落编号 314 暴露了道路与路灯冲突,说明旧建筑群组合仍有没被此前测试覆盖的缺陷。本轮单栋改进没有解决它。

地形方面仍主要是阶梯式地基与柱脚支撑,困难输入成功率没有提升。水边适配例子不自动完成通向岸边的路网。模拟方面,通行、支撑、封闭与照明只是方块离散近似,不是完整 Minecraft 游戏物理或建筑工程计算。

模型报告没有发现必须停工重设计的严重架构问题;本轮修复的是部件与建造顺序问题。这是本轮证据支持的判断,不是所有未来部件都能无障碍接入的证明。

10 · 模型结束前最后说了什么

以下是本次会话最后一条 final_answer 原文,来自保存的会话记录,并与任务完成事件中的最终文本核对一致。没有用报告作者的总结替换它。原文里的 /work/... 是实验容器路径,可用下方下载或报告证据链接查阅对应文件。

Implemented reusable furnished lofts, aligned stair access, wider supported verandas, smaller chimney caps, and improved gable glazing. Added public roof-floor and interior interfaces; the kernel remains unchanged. Verified: - **266 tests passed**, preserving all previous tests. - **156/156 supported inputs validated**; stress results remain **5/16**, with all failures retained. - **30 exterior/interior views inspected**. - Export/reload, provenance, inventories and deterministic replays passed. [Default settlement](/work/generator/workspace/output.litematic) · [Assessment](/work/generator/workspace/reports/building-space/ASSESSMENT.md) · [Rendered review](/work/generator/workspace/reports/building-space/VISUAL-REVIEW.md) No serious architectural flaw was found. Buildings still have more regular roofs, sparser interiors and simpler landscapes than the references. Browser execution was not rerun.

中文翻译(与原文分开)

已实现可复用的带家具阁楼、对齐的楼梯通道、更宽且有支撑的门廊、更小的烟囱顶盖,以及改进的屋顶三角墙玻璃窗。新增公开的屋顶楼板与内部空间接口;内核保持不变。

已验证:

默认村落 · 评估 · 渲染检查(对应原文的三个链接)。

没有发现严重的架构缺陷。与参考图相比,房屋的屋顶仍更规整、室内更稀疏、景观更简单。本轮没有重新运行浏览器测试。

最终消息原始文本 · 消息时间、来源文件摘要与核对记录。模型说“没重跑浏览器”是它交付时的事实;本报告后来独立补做的浏览器检查在上一节,二者不要混淆。

11 · 代码、提示词和复现证据

本轮使用同一保存会话、同一实验镜像和 proc 工具集,以 gpt-6-astra 的 max 推理设置继续。任务提示仅为下方一个词;最初的完整任务仍在会话里。

continue

第一轮原始任务 · 第三轮追加的单栋建筑要求 · 本轮新增消息 · 原始评估 · 原视觉评估。

本轮从开始到退出共 70.50 分钟,包括生成工作与最终 harness 收尾,不等于 Python 单次生成耗时。以下用量只统计本轮新增部分;缓存输入包含在输入总量内,推理输出包含在输出内,不要再次相加。

本轮新增用量数值
模型请求85
输入 Token(含缓存)13,224,212
其中缓存输入12,837,504
输出 Token(含推理)107,176
其中推理输出40,905
输入与输出合计13,331,388
命令记录119
命令非零退出码9

下载完整库、示例与测试源码 · 下载默认五栋村落与部件记录 · 库使用指南 · 架构说明 · 参考资料的原路径和摘要。

参考代码与图片只用于美观目标。网页运行的是第五轮归档库,报告自己的适配层只负责输入、导出、检查与显示;没有为了网页成功而修补原生成库。初次运行会下载 Pyodide 与依赖;以后复制下载包中的客户端代码时,仍需要同版库与保存依赖。

本轮 Python 文件目录(92 个文件,共 9109 行,可排序)
源码行数
generate.py21
hearth/space.py109
hearth/blocks.py83
hearth/randomness.py21
hearth/__init__.py8
hearth/persistence.py194
hearth/composition.py61
hearth/programs.py185
hearth/assessment.py163
hearth/lodges.py54
hearth/quality_assessment.py177
hearth/validators.py51
hearth/navigation.py44
hearth/kernel/contracts.py150
hearth/kernel/errors.py32
hearth/kernel/view.py166
hearth/kernel/validation.py220
hearth/kernel/scene.py542
hearth/kernel/__init__.py5
hearth/environment/fields.py79
hearth/environment/terrain.py42
hearth/environment/__init__.py3
hearth/components/primitives.py205
hearth/components/__init__.py10
hearth/components/interior.py233
hearth/components/roofs.py182
hearth/components/building.py260
hearth/components/constraints.py19
hearth/components/landscape.py259
hearth/components/roofcraft.py271
hearth/components/joinery.py39
hearth/components/furnishing.py131
hearth/components/masonry.py36
hearth/components/grounds.py108
hearth/components/lofts.py310
hearth/components/circulation.py37
hearth/components/facades.py45
hearth/components/domestic.py70
hearth/components/borders.py99
hearth/components/windowbox.py46
hearth/components/ceiling.py42
hearth/adapters/site.py137
hearth/adapters/__init__.py2
hearth/adapters/bearing.py29
hearth_extensions/interiors.py116
hearth_extensions/geometry.py133
hearth_extensions/interfaces.py38
hearth_extensions/__init__.py8
hearth_extensions/circulation.py227
hearth_extensions/boundaries.py125
hearth_extensions/sites.py38
hearth_extensions/halls.py211
hearth_extensions/graphs.py99
hearth_extensions/programs.py60
hearth_extensions/assessment.py208
extension_demo/__init__.py38
examples/courtyard.py25
examples/inspection.py28
examples/prototype.py33
examples/assess.py13
examples/gallery.py25
examples/building.py13
examples/extension.py27
examples/extension_audit.py94
examples/extension_generate.py23
examples/extension_views.py63
examples/extension_assess.py14
examples/extension_inspection.py34
examples/extension_replay.py49
examples/lodge.py16
examples/building_quality.py13
examples/building_views.py54
examples/lodge_inspection.py29
examples/building_holdout.py57
examples/roof_home.py27
examples/garden_house.py33
examples/building_detail.py94
examples/verify_replay.py35
examples/__init__.py1
examples/preview.py62
examples/building_space.py103
test/conftest.py13
test/test_kernel.py122
test/test_contracts_provenance.py279
test/test_geometry_environment.py243
test/test_extension_protocol.py93
test/test_extension_geometry.py128
test/test_extension_failures.py149
test/test_extension_interiors.py70
test/test_building_space.py310
test/test_building_detail.py221
test/test_building_quality.py235
逐文件查看全部 Python 源码
generate.py
# Generate, validate and export the default complete Hearth settlement. import argparse from pathlib import Path from hearth.programs import settlement_scene from hearth.persistence import export_scene, semantic_digest def main(): parser = argparse.ArgumentParser(description='Generate a contract-composed Minecraft Java 1.21.1 settlement.') parser.add_argument('--seed', type=int, default=0, help='Explicit integer seed, default 0') parser.add_argument('--output', type=Path, default=Path('output.litematic')) parser.add_argument('--count', type=int, choices=range(3, 7), help='Optional explicit building count, 3 through 6') args = parser.parse_args() scene = settlement_scene(args.seed, args.count) export_scene(scene, args.output) print(f'Validated {sum(n.type=="building.rooms" for n in scene.nodes.values())} buildings, {len(scene.blocks)} blocks, {len(scene.nodes)} components.') print(f'{args.output} | semantic SHA256 {semantic_digest(scene)}') if __name__ == '__main__': main()
hearth/space.py
# Integer geometry and explicit local-to-world transforms. from dataclasses import dataclass from itertools import product from typing import Iterable Pos = tuple[int, int, int] @dataclass(frozen=True) class Box: lo: Pos hi: Pos def __post_init__(self): object.__setattr__(self, 'lo', tuple(self.lo)) object.__setattr__(self, 'hi', tuple(self.hi)) if any(not isinstance(v, int) for v in (*self.lo, *self.hi)): raise TypeError('Box coordinates must be integers') if any(a > b for a, b in zip(self.lo, self.hi)): raise ValueError('Inverted box') def contains(self, p: Pos) -> bool: return all(a <= v <= b for a, v, b in zip(self.lo, p, self.hi)) def cells(self) -> Iterable[Pos]: return product(*(range(a, b + 1) for a, b in zip(self.lo, self.hi))) def corners(self): return product(*zip(self.lo, self.hi)) def intersection(self, other): low = tuple(max(a, b) for a, b in zip(self.lo, other.lo)) high = tuple(min(a, b) for a, b in zip(self.hi, other.hi)) return None if any(a > b for a, b in zip(low, high)) else Box(low, high) def expand(self, n: int): return Box(tuple(v - n for v in self.lo), tuple(v + n for v in self.hi)) @property def size(self): return tuple(b - a + 1 for a, b in zip(self.lo, self.hi)) @property def volume(self): x, y, z = self.size return x * y * z @classmethod def enclosing(cls, points): points = list(points) if not points: raise ValueError('No realized geometry') return cls(tuple(min(p[i] for p in points) for i in range(3)), tuple(max(p[i] for p in points) for i in range(3))) @dataclass(frozen=True) class Frame: origin: Pos = (0, 0, 0) turn: int = 0 def __post_init__(self): object.__setattr__(self, 'origin', tuple(self.origin)) if not isinstance(self.turn, int) or any(not isinstance(v, int) for v in self.origin): raise TypeError('Frames use integer coordinates and quarter turns') object.__setattr__(self, 'turn', self.turn % 4) def vector(self, p: Pos) -> Pos: x, y, z = p for _ in range(self.turn % 4): x, z = -z, x return x, y, z def point(self, p: Pos) -> Pos: return tuple(a + b for a, b in zip(self.origin, self.vector(p))) def inverse(self, p: Pos) -> Pos: return Frame(turn=-self.turn).vector(tuple(a - b for a, b in zip(p, self.origin))) def box(self, box: Box) -> Box: return Box.enclosing(self.point(p) for p in box.corners()) def compose(self, other): return Frame(self.point(other.origin), (self.turn + other.turn) % 4) def state(self, state: str) -> str: from .blocks import parse, state_of name, props = parse(state) dirs = ['north', 'east', 'south', 'west'] rotated = {} for key, value in props.items(): if key in dirs: key = dirs[(dirs.index(key) + self.turn) % 4] if key == 'facing' and value in dirs: value = dirs[(dirs.index(value) + self.turn) % 4] if key in ('shape', 'orientation') and any(v in dirs for v in value.split('_')): from .blocks import SCHEMA tokens = [dirs[(dirs.index(v) + self.turn) % 4] if v in dirs else v for v in value.split('_')] value = '_'.join(tokens) allowed = SCHEMA[name.removeprefix('minecraft:')][0][key] if value not in allowed: matches = [candidate for candidate in allowed if sorted(candidate.split('_')) == sorted(tokens)] if matches: value = sorted(matches)[0] if key == 'axis' and value in ('x', 'z') and self.turn % 2: value = 'z' if value == 'x' else 'x' if key == 'rotation': value = str((int(value) + 4 * self.turn) % 16) rotated[key] = value return state_of(name, **rotated)
hearth/blocks.py
# Canonical blockstates and a deliberately conservative physical model. import json import re from functools import lru_cache from pathlib import Path SCHEMA = json.loads((Path(__file__).parent / 'data' / 'blockstates-1.21.1.json').read_text()) AIR = 'minecraft:air' LIGHTS = {'lantern': 15, 'torch': 14, 'wall_torch': 14, 'glowstone': 15, 'sea_lantern': 15, 'shroomlight': 15, 'ochre_froglight': 15, 'pearlescent_froglight': 15, 'verdant_froglight': 15} SOFT = {'air', 'cave_air', 'water', 'short_grass', 'fern', 'dead_bush', 'dandelion', 'poppy', 'cornflower', 'allium', 'azure_bluet', 'oxeye_daisy', 'lily_of_the_valley', 'blue_orchid', 'torch', 'wall_torch', 'vine', 'snow', 'lily_pad', 'tall_grass', 'large_fern', 'sunflower', 'rose_bush', 'peony', 'lilac', 'wheat', 'carrots', 'potatoes'} @lru_cache(maxsize=4096) def parse(state: str): match = re.fullmatch(r'(minecraft:[a-z0-9_]+)(?:\[([^\]]+)\])?', state) if not match: raise ValueError(f'Invalid blockstate syntax: {state}') props = {} if match[2]: for part in match[2].split(','): key, value = part.split('=') if key in props: raise ValueError('Duplicate block property') props[key] = value return match[1], props def state_of(name: str, **properties) -> str: if not name.startswith('minecraft:'): name = 'minecraft:' + name return name + ('[' + ','.join(f'{k}={str(v).lower()}' for k, v in sorted(properties.items())) + ']' if properties else '') def canonical(state: str) -> str: name, props = parse(state) return state_of(name, **props) def blockstates_equivalent(left: str, right: str) -> bool: return parse(left) == parse(right) @lru_cache(maxsize=4096) def validate_state(state: str): name, props = parse(state) short = name.removeprefix('minecraft:') if short not in SCHEMA: raise ValueError(f'Unknown Java 1.21.1 block: {name}') domain = SCHEMA[short][0] for key, value in props.items(): if key not in domain or value not in domain[key]: raise ValueError(f'Invalid property {key}={value} for {name}') @lru_cache(maxsize=4096) def name_of(state: str) -> str: return parse(state)[0].removeprefix('minecraft:') def solid(state: str) -> bool: name = name_of(state) return name not in SOFT and not any(s in name for s in ('leaves', 'fence', 'pane', 'door', 'lantern', 'chain', 'flower_pot', 'potted_', 'carpet', 'bed', 'button')) def passable(state: str) -> bool: name = name_of(state) return name in SOFT - {'water'} or name.endswith('_door') or name.endswith('_carpet') def stairs(material='stone_brick', facing='north', half='bottom'): return state_of(material + '_stairs', facing=facing, half=half, shape='straight', waterlogged='false') def slab(material='stone_brick', half='bottom'): return state_of(material + '_slab', type=half, waterlogged='false') def log(material='spruce', axis='y'): return state_of(material + '_log', axis=axis) def leaves(material='spruce'): return state_of(material + '_leaves', distance='1', persistent='true', waterlogged='false')
hearth/randomness.py
# Stateless hierarchical scopes, with explicitly local random streams. import hashlib import json import random from dataclasses import dataclass @dataclass(frozen=True) class Scope: seed: int key: tuple[str, ...] = () def child(self, key: str, override: int | None = None): return Scope(self.seed, self.key + (key,)) if override is None else Scope(override, (key,)) def stream(self, purpose: str = 'plan') -> random.Random: payload = json.dumps([self.seed, self.key, purpose], separators=(',', ':')).encode() return random.Random(int.from_bytes(hashlib.sha256(payload).digest(), 'big')) def choose(self, values, purpose='plan'): return self.stream(purpose).choice(tuple(values))
hearth/__init__.py
# Hearth public library entry points. from .kernel import Binding, Child, ContractError, Limits, Scene from .space import Box, Frame __version__ = '1.5.0' # Register standard optional geometric validators outside the general kernel. from . import validators
hearth/persistence.py
# One-region Litematica transport paired with verified structural records. import hashlib import json import sys from dataclasses import fields, is_dataclass from pathlib import Path from . import __version__ from .blocks import canonical, AIR from .space import Box, Frame from .randomness import Scope from .kernel import contracts from .kernel.scene import Scene, Node, Cell, Limits from .kernel.errors import ContractError FORMAT_VERSION = 1 TYPES = {c.__name__: c for c in (Box, Frame, Scope, Node, Cell, Limits, contracts.Contract, contracts.Rule, contracts.Port, contracts.Grant, contracts.Binding, contracts.Capability, contracts.Domain)} def encode(value): if is_dataclass(value): return {'$type': type(value).__name__, **{f.name: encode(getattr(value, f.name)) for f in fields(value)}} if isinstance(value, tuple): return {'$tuple': [encode(v) for v in value]} if isinstance(value, set): return {'$set': [encode(v) for v in sorted(value)]} if isinstance(value, dict): return {k: encode(v) for k, v in value.items()} if isinstance(value, list): return [encode(v) for v in value] return value def decode(value): if isinstance(value, list): return [decode(v) for v in value] if isinstance(value, dict): if '$tuple' in value: return tuple(decode(v) for v in value['$tuple']) if '$set' in value: return set(decode(v) for v in value['$set']) if '$type' in value: return TYPES[value['$type']](**{k: decode(v) for k, v in value.items() if k != '$type'}) return {k: decode(v) for k, v in value.items()} return value def semantic_digest(scene): digest = hashlib.sha256() for p, c in sorted(scene.blocks.items()): digest.update(json.dumps([p, canonical(c.state), c.nbt], sort_keys=True, separators=(',', ':')).encode()) return digest.hexdigest() def companion_path(path: Path): return path.with_suffix(path.suffix + '.structure.json') def _mcio(): try: import mcio except ImportError: sys.path.insert(0, '/work/generator/MCIO') from mcio.sketch import LitematicCanvas from mcio.schematic import load_schematic from mcio.nbt import tag from mcio.nbt.nbt import File return LitematicCanvas, load_schematic, tag, File def _to_nbt(value, tag, key=''): if isinstance(value, dict): return tag.Compound({k: _to_nbt(v, tag, k) for k, v in value.items()}) if isinstance(value, list): if not value: return tag.List[tag.Compound]([]) items = [_to_nbt(v, tag) for v in value] return tag.List[type(items[0])](items) if isinstance(value, str): return tag.String(value) if isinstance(value, int): return tag.Byte(value) if key == 'Slot' else tag.Int(value) raise TypeError(type(value)) def _plain(value): if isinstance(value, dict): return {str(k): _plain(v) for k, v in value.items()} if isinstance(value, (list, tuple)): return [_plain(v) for v in value] if isinstance(value, str): return str(value) return int(value) def export_scene(scene, path: Path, verify=True): path = Path(path) scene.finalize() bounds = Box.enclosing(scene.blocks) if max(bounds.size) > scene.limits.dimension: raise ContractError('export-bounds', conditions=str(bounds)) if bounds.volume > scene.limits.export_volume: raise ContractError('export-volume', conditions=f'{bounds.volume} > {scene.limits.export_volume}') canvas_type, _, tag, nbtfile = _mcio() sx, sy, sz = bounds.size canvas = canvas_type((sy, sz, sx)) offset = bounds.lo block_entities = [] for p, cell in sorted(scene.blocks.items()): x, y, z = tuple(v - o for v, o in zip(p, offset)) canvas.block((y, z, x), cell.state) if cell.nbt is not None: block_entities.append(_to_nbt({**cell.nbt, 'x': x, 'y': y, 'z': z}, tag)) schematic = canvas.to_litematica(name='Hearth', author='Hearth procedural library', description='Contract-composed settlement; structural identity in companion JSON', minecraft_data_version=3955) nbt = schematic.write_to_nbt() nbt['Regions']['Hearth']['TileEntities'] = tag.List[tag.Compound](block_entities) nbt['Regions']['Hearth']['Entities'] = tag.List[tag.Compound]([]) path.parent.mkdir(parents=True, exist_ok=True) temporary = path.with_suffix(path.suffix + '.tmp') nbtfile(nbt).save(temporary) owners = sorted(scene.nodes) operations = sorted(scene.operations) owner_id, op_id = {v: i for i, v in enumerate(owners)}, {v: i for i, v in enumerate(operations)} data = {'format': 'hearth.structure', 'version': FORMAT_VERSION, 'implementation': __version__, 'minecraft_data_version': 3955, 'digest': semantic_digest(scene), 'offset': offset, 'size': bounds.size, 'seed': scene.seed, 'style': scene.style, 'preferences': {k: v.expression() for k, v in scene.preferences.items()}, 'domain': encode(scene.domain), 'limits': encode(scene.limits), 'scene_version': scene.version, 'nodes': encode(scene.nodes), 'relations': encode(scene.relations), 'dependencies': encode(scene.dependencies), 'operations': encode(scene.operations), 'erasures': [[list(p), owner] for p, owner in sorted(scene.erasures.items())], 'displaced': {k: [[list(p), encode(c)] for p, c in sorted(v.items())] for k, v in scene.displaced.items()}, 'events': encode(scene.events), 'port_uses': [[*k, v] for k, v in sorted(scene.port_uses.items())], 'owners': owners, 'operation_ids': operations, 'cells': [[*p, owner_id[c.owner], op_id[c.operation], list(c.shared)] for p, c in sorted(scene.blocks.items())]} target = companion_path(path) temporary_meta = target.with_suffix('.json.tmp') temporary_meta.write_text(json.dumps(data, sort_keys=True, separators=(',', ':'))) temporary.replace(path) temporary_meta.replace(target) if verify: restored = load_scene(path) if semantic_digest(restored) != semantic_digest(scene): raise ContractError('roundtrip', conditions='Semantic geometry differs') return path def load_scene(path: Path): path = Path(path) meta = companion_path(path) if not meta.exists(): raise ContractError('untrusted-structure', conditions='Missing companion; geometry cannot reconstruct semantic identity') data = json.loads(meta.read_text()) if data.get('format') != 'hearth.structure' or data.get('version') != FORMAT_VERSION: raise ContractError('untrusted-structure', conditions='Unknown companion format/version') _, load, _, nbtfile = _mcio() loaded = load(path) nbt = nbtfile.load_regardless_of_gzipped(filename=path) regions = nbt['Regions'] if len(regions) != 1 or int(nbt['MinecraftDataVersion']) != 3955: raise ContractError('transport', conditions='Require one Java 1.21.1 region') region = next(iter(regions.values())) if list(loaded.size_yzx) != [data['size'][1], data['size'][2], data['size'][0]]: raise ContractError('geometry-mismatch', conditions='Export dimensions changed') if region['Entities']: raise ContractError('geometry-mismatch', conditions='Unexpected entities') inventories = {} for entry in region['TileEntities']: item = _plain(entry) p = tuple(item.pop(k) + data['offset'][i] for i, k in enumerate(('x', 'y', 'z'))) inventories[p] = item from .environment.fields import from_expression scene = Scene(data['seed'], decode(data['limits']), decode(data['domain']), data.get('style'), {k: from_expression(v) for k, v in data.get('preferences', {}).items()}) scene.nodes = decode(data['nodes']) scene.relations = decode(data['relations']) for child, kind, parent in scene.relations: if kind in ('contained_by', 'attached_to'): scene.members.setdefault(parent, set()).add(child) scene.dependencies = decode(data['dependencies']) scene.operations = decode(data['operations']) scene.erasures = {tuple(p): owner for p, owner in data.get('erasures', [])} scene.events = decode(data['events']) scene.displaced = {k: {tuple(p): decode(c) for p, c in v} for k, v in data.get('displaced', {}).items()} scene.version = data['scene_version'] scene.port_uses = {(a, b): n for a, b, n in data['port_uses']} ownership = {tuple(row[:3]): row[3:] for row in data['cells']} scene.reverse = {k: set() for k in scene.nodes} ids = loaded.read_flat(0, loaded.volume).reshape(loaded.size_yzx) import numpy as np for y, z, x in np.argwhere(ids != 0): block = canonical(loaded.palette[int(ids[y, z, x])]) if block == AIR: continue p = tuple(int(v) + o for v, o in zip((x, y, z), data['offset'])) if p not in ownership: raise ContractError('geometry-mismatch', position=p, conditions='Unrecorded block') owner, op, shared = ownership[p] owner = data['owners'][owner] scene.blocks[p] = Cell(block, owner, data['operation_ids'][op], inventories.get(p), tuple(shared)) scene.reverse[owner].add(p) for participant in shared: scene.reverse_shared.setdefault(participant, set()).add(p) if set(ownership) != set(scene.blocks) or set(inventories) - set(scene.blocks) or semantic_digest(scene) != data['digest']: raise ContractError('geometry-mismatch', conditions='Schematic and structural companion are not a matching semantic pair') scene.finalize() return scene
hearth/composition.py
# High-level selection, arrangement, repetition, scattering and encapsulation. from dataclasses import dataclass from hearth.kernel import Capability, Contract, Plan, Child, ContractError, Rule from hearth.space import Box, Frame @dataclass(frozen=True) class Network: name: str envelope: Box recipe: object tags: tuple = ('composite',) rules: tuple[Rule, ...] = () def capability(self): return Capability(self.name, self.tags) def negotiate(self, ctx, parameters): return Contract(self.envelope, rules=self.rules) def realize(self, ctx, contract): return self.recipe(ctx) def encapsulate(name, envelope, recipe, tags=('composite',), rules=()): return Network(name, envelope, recipe, tags, rules) def attach(key, component, host, port, frame, verb='install', region=None): from hearth.kernel import Binding return Child(key, component, frame=frame, bindings=(Binding(host, port, verb, region),)) def arrange(components, origins, prefix='item'): components, origins = tuple(components), tuple(origins) if len(components) != len(origins): raise ValueError('One placement per component is required') return tuple(Child(f'{prefix}-{i}', c, frame=Frame(tuple(p))) for i, (c, p) in enumerate(zip(components, origins))) def repeat(component, origins, prefix='repeat'): return arrange([component for _ in origins], origins, prefix) def scatter(ctx, candidates, predicate, minimum, maximum, purpose='scatter'): candidates = sorted(set(candidates)) ctx.rng(purpose).shuffle(candidates) accepted = [] for p in candidates: if predicate(p, accepted): accepted.append(p) if len(accepted) >= maximum: break if len(accepted) < minimum: raise ContractError('scatter-minimum', ctx.path, conditions=f'Accepted {len(accepted)}, required {minimum}; finite candidate set exhausted') return tuple(accepted) def constrain(condition, rule, context, position=None, reason=''): if not condition: raise ContractError(rule, context.path, position, reason)
hearth/programs.py
# Lightweight high-level room-graph programs and settlement intent. from hearth import Scene, Box, Frame from hearth.randomness import Scope from hearth.kernel import Capability, Contract, Plan, Child, Binding, Rule, Port from hearth.environment import Terrain, gradient, wave, radial from hearth.components.building import Blueprint, Building, RoomSpec, adapted from hearth.components.landscape import PathNetwork, Landscape, LampPost, Terrace from hearth.components.primitives import Window from hearth.components.roofcraft import RoofDesign from hearth.components.facades import FacadeDesign from hearth.composition import encapsulate def dwelling(seed): rng = Scope(seed).child('dwelling').stream('layout') rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')] if rng.choice((True, False)): rooms.append(RoomSpec(0, 1, 0, 'kitchen')) if rng.choice((True, False)): rooms.append(RoomSpec(1, 0, 0, 'library')) return Blueprint(tuple(rooms), bay=rng.choice((9, 11)), porch=True, roof_axis='auto', steep=True) def atelier(seed): rng = Scope(seed).child('atelier').stream('layout') rooms = [RoomSpec(0, 0, 0, 'workshop'), RoomSpec(1, 0, 0, 'storage')] if rng.choice((True, False)): rooms.append(RoomSpec(1, 0, 1, 'bedroom')) if rng.choice((True, False)): rooms.append(RoomSpec(0, 1, 0, 'kitchen')) return Blueprint(tuple(rooms), bay=rng.choice((9, 11)), porch=rng.choice((True, False)), roof_axis='x', roof_material='brick', steep=rng.choice((True, False)), window_component=Window(shutters=False)) def commons(seed): rng = Scope(seed).child('commons').stream('layout') rooms = [RoomSpec(0, 0, 0, 'library'), RoomSpec(0, 1, 0, 'living'), RoomSpec(1, 1, 0, 'kitchen')] for level in range(1, rng.choice((2, 3))): rooms.append(RoomSpec(0, 1, level, 'bedroom' if level == 1 else 'library')) if rng.choice((True, False)): rooms.append(RoomSpec(1, 0, 0, 'storage')) return Blueprint(tuple(rooms), bay=rng.choice((9, 11)), porch=True, roof_axis='z') PROGRAMS = {'dwelling': dwelling, 'atelier': atelier, 'commons': commons} def building_scene(design, seed=0, field=None, water=None): design.validate() b = design.bay width = (max(r.x for r in design.rooms) + 1) * b depth = (max(r.z for r in design.rooms) + 1) * b domain = Box((-8, -4, -18), (width + 8, 64, depth + 8)) scene = Scene(seed, domain=domain) expression = field if field is not None else gradient(base=4) + wave(.8, .1, .11, Scope(seed).stream('environment').random() * 6) scene.place('land', Terrain(domain, expression, water)) # Encapsulation preserves the public building instance as the selected child. choice = adapted('building', design, '/land') scene.compose_choice(choice) return scene.finalize() class Settlement: def __init__(self, designs, domain, terrain): self.designs = tuple(designs) self.domain = domain self.terrain = terrain def capability(self): return Capability('settlement.village', ('settlement', 'composite'), offers=('public-access',), guarantees=('building entrances connected',)) def negotiate(self, ctx, parameters): gateway = (0, ctx.elevation(0, -12) + 1, -12) interface = Box((-1, gateway[1] - 1, -12), (1, gateway[1] + 1, -12)) port = Port('public', 'public-access', Frame(gateway), interface, 10000, delegate=('connections', 'public')) return Contract(self.domain, ports=(port,), decisions={'buildings': len(self.designs), 'arrangement': 'opposed street with staggered frontage', 'circulation': ctx.scope.choose(('spine', 'loop'), 'circulation'), 'gateway': gateway}) def realize(self, ctx, contract): p = Plan() for i, design in enumerate(self.designs): row = i // 2 left = i % 2 == 0 z = row * 38 + ctx.scope.child(f'plot-{i}').choose((-2, 0, 2), 'frontage') origin = (-16, 0, z - design.bay // 2) if left else (16, 0, z + design.bay // 2) p.children.append(adapted(f'plot-{i}', design, self.terrain, Frame(origin, 1 if left else 3))) p.children.append(Child('square', Terrace(), frame=Frame((5, 0, 10)), bindings=(Binding(self.terrain, 'construction', 'fill'),))) p.children.append(Child('connections', SettlementConnections(len(self.designs), self.domain, self.terrain, contract.decisions['circulation'], contract.decisions['gateway']))) p.children.append(Child('landscape', Landscape(self.domain, self.terrain, 8, 12, 0.045))) return p class SettlementConnections: def __init__(self, count, domain, terrain, mode='spine', gateway=None): self.count = count self.domain = domain self.terrain = terrain self.mode = mode self.gateway = gateway def capability(self): return Capability('settlement.connections', ('connection', 'composite')) def negotiate(self, ctx, parameters): parent = ctx.path.rsplit('/', 1)[0] targets = tuple(ctx.local(ctx.view.port(f'{parent}/plot-{i}', 'street').frame.origin) for i in range(self.count)) targets = targets + (ctx.local(ctx.view.port(parent + '/square', 'entrance').frame.origin), self.gateway) interface = Box((self.gateway[0] - 1, self.gateway[1] - 1, self.gateway[2]), (self.gateway[0] + 1, self.gateway[1] + 1, self.gateway[2])) port = Port('public', 'public-access', Frame(self.gateway), interface, 10000, delegate=('paths', 'public')) return Contract(self.domain, ports=(port,), rules=(Rule('route', targets, self.domain, phase='complete'),)) def realize(self, ctx, contract): parent = ctx.path.rsplit('/', 1)[0] points = [] links = [] bindings = [Binding(self.terrain, 'construction', 'surface')] for i in range(self.count): host = f'{parent}/plot-{i}' port = ctx.view.port(host, 'street') x, y, z = ctx.local(port.frame.origin) lane = (-3 if x < 0 else 3) if self.mode == 'loop' else 0 points.extend(((x, y, z), (lane, ctx.elevation(lane, z) + 1, z))) links.append((2 * i, 2 * i + 1)) bindings.append(Binding(host, 'street', 'surface')) if i and self.mode == 'spine': links.append((2 * i - 1, 2 * i + 1)) if self.mode == 'loop': low = min(q[2] for q in points) high = max(q[2] for q in points) base = len(points) for x, z in ((-3, low), (-3, high), (3, high), (3, low)): points.append((x, ctx.elevation(x, z) + 1, z)) links.extend((base + i, base + (i + 1) % 4) for i in range(4)) square = ctx.local(ctx.view.port(parent + '/square', 'entrance').frame.origin) lane = 3 if self.mode == 'loop' else 0 points.extend((square, (lane, ctx.elevation(lane, square[2]) + 1, square[2]))) links.append((len(points) - 2, len(points) - 1)) if self.mode == 'spine': links.append((1, len(points) - 1)) points.append(self.gateway) links.append((1, len(points) - 1)) bindings.append(Binding(parent + '/square', 'entrance', 'surface')) p = Plan(children=[Child('paths', PathNetwork(tuple(points), tuple(links), gateway=self.gateway), bindings=tuple(bindings))]) for i in range(self.count): p.relations.append((ctx.path + '/paths', 'connects', f'{parent}/plot-{i}')) for i, z in enumerate(sorted({q[-1] for q in points[:self.count * 2]})): x = 5 if i % 2 else -5 y = ctx.elevation(x, z + 4) + 1 p.children.append(Child(f'lamp-{i}', LampPost(), frame=Frame((x, y, z + 4)))) return p def settlement_scene(seed=0, count=None): scope = Scope(seed) rng = scope.stream('settlement-layout') if count is None: count = rng.choice((3, 4, 5)) if count < 1: raise ValueError('A settlement needs at least one building') designs = [] for i in range(count): local = scope.child(f'building-{i}').stream('room-graph') rooms = [RoomSpec(0, 0, 0, local.choice(('living', 'workshop', 'library')))] for x, z in local.sample(((1, 0), (0, 1)), local.choice((0, 1, 2))): rooms.append(RoomSpec(x, z, 0, local.choice(('storage', 'kitchen', 'living')))) if local.choice((True, True, False)): column = local.choice(rooms) for level in range(1, local.choice((2, 2, 3))): rooms.append(RoomSpec(column.x, column.z, level, 'bedroom' if level == 1 else 'library')) bay = local.choice((9, 11)) porch = local.choice((True, True, False)) axis = local.choice(('auto', 'x', 'z')) material = local.choice(('deepslate_tile', 'brick')) steep = local.choice((True, True, False)) features = scope.child(f'building-{i}').stream('architectural-features') roof = RoofDesign(features.choice(((1, 2), (2, 1), (1, 1, 2))), features.choice((8, 10))) if steep else None balcony = porch and any((r.x, r.z, r.level) == (0, 0, 1) for r in rooms) and features.choice((True, False)) designs.append(Blueprint(tuple(rooms), bay=bay, porch=porch, roof_axis=axis, roof_material=material, steep=steep, roof_design=roof, porch_depth=features.choice((3, 4)), balcony=balcony, chimney=features.choice((True, False)), facade_design=FacadeDesign(), rail_material='dark_oak', attic_purpose=scope.child(f'building-{i}').choose((None, 'bedroom'), 'roof-purpose') if roof else None)) rows = (count + 1) // 2 domain = Box((-49, -4, -23), (49, 64, (rows - 1) * 38 + 28)) field = gradient(.012, -.009, 4.8) + wave(.7, .075, .09, rng.random() * 6) + radial(-36, rows * 12, 26, 1.1) scene = Scene(seed, domain=domain) scene.place('land', Terrain(domain, field, edit_limit=20000)) scene.place('village', Settlement(designs, domain, '/land')) return scene.finalize()
hearth/assessment.py
# Reproducible corpus inputs, structural measurements and retained diagnostics. import hashlib import json import time from pathlib import Path from hearth.randomness import Scope from hearth.programs import PROGRAMS, building_scene, settlement_scene from hearth import Scene, Box from hearth.environment import Terrain from hearth.components.building import adapted from hearth.environment import gradient, wave, radial, constant from hearth.kernel import ContractError, SearchExhausted from hearth.persistence import semantic_digest, export_scene from hearth.blocks import name_of def adaptation_expression(environment_seed): rng = Scope(environment_seed).stream('frozen-environment') # Degenerate coefficients deliberately include exact flat ground. sx = rng.choice((-.045, 0, .045)) sz = rng.choice((-.035, 0, .035)) amplitude = rng.choice((0, .4, .8)) expression = gradient(sx, sz, 4) + wave(amplitude, .13, .11, rng.random() * 6) if environment_seed >= 8: mask = radial(8, 9, 28, .7).transformed(dx=2, dz=-1, scale=1.2) expression = expression.blend(gradient(-sz, sx, 4) + wave(.6, .07, .19), mask) else: expression = expression + radial(7, 8, 22, rng.choice((0, .4, .7))) expression = expression.clamp(2, 7) water = rng.choice((None, 5, 6)) return expression, water def freeze_environment(seed): expression, water = adaptation_expression(seed) scene = Scene(seed, domain=Box((-8, -4, -18), (34, 64, 34))) scene.place('land', Terrain(scene.domain, expression, water)) return scene.finalize() def adapt_frozen(environment, design, building_seed): scene = environment.fork(seed=building_seed) scene.compose_choice(adapted('building', design, '/land')) return scene.finalize() def principal_signature(scene): buildings = [] for path, node in sorted(scene.nodes.items()): if node.type != 'building.rooms': continue decision = node.contract.decisions # Realized node topology plus occupied envelope per room, normalized to building. rooms = [] roofs = [] for child, part in sorted(scene.nodes.items()): if not child.startswith(path + '/'): continue if part.type.startswith('room.'): origin = node.frame.inverse(part.frame.origin) occupied = scene.cells(child, True) relative = [part.frame.inverse(p) for p in occupied] bounds = [min(p[i] for p in relative) for i in range(3)] + [max(p[i] for p in relative) for i in range(3)] rooms.append([origin[0], origin[1] - decision['floor'], origin[2], part.type, part.contract.decisions['doors'], part.contract.decisions['stair_up'], bounds]) if part.type == 'roof.gable': roofs.append([part.contract.decisions['axis'], part.contract.decisions['span'], part.contract.decisions['steep'], len(scene.cells(child, True))]) buildings.append({'rooms': rooms, 'roofs': roofs, 'porch': decision['porch'], 'bay': decision['bay']}) layout = [] for node in scene.nodes.values(): if node.type == 'landscape.paths': pts = node.contract.decisions['waypoints'] layout.append({'points': [(p[0], p[-1]) for p in pts], 'links': node.contract.decisions['links']}) data = {'buildings': buildings, 'organization': layout} return hashlib.sha256(json.dumps(data, sort_keys=True, default=list).encode()).hexdigest(), data def contact_metrics(scene): foundations = [n for n in scene.nodes.values() if n.type == 'adapter.foundation'] data = [n.contract.decisions for n in foundations] edit_paths = {key for key, n in scene.nodes.items() if n.capability and set(n.capability.tags).intersection(('siteworks', 'path'))} occupied = sum(len(scene.cells(key)) for key in edit_paths) replacements = sum(len(scene.displaced.get(key, {})) for key in edit_paths) from hearth.blocks import solid, AIR excavated = sum(solid(old.state) and not solid(scene.blocks[p].state if p in scene.blocks else AIR) for key in edit_paths for p, old in scene.displaced.get(key, {}).items()) return {'fill': sum(d['fill'] for d in data), 'excavation': excavated, 'sitework_occupied_cells': occupied, 'replaced_cells': replacements, 'new_sitework_cells': occupied - replacements, 'strategies': [d['strategy'] for d in data], 'signature': hashlib.sha256(json.dumps(data, sort_keys=True).encode()).hexdigest()} def measured(label, recipe, inputs, output=None): start = time.perf_counter() result = {'label': label, 'inputs': inputs, 'attempts': 1, 'retries': 0} try: scene = recipe() scene.finalize() signature, structure = principal_signature(scene) choices = [e for e in scene.events if e['kind'] == 'candidate-selection'] if choices: result['attempts'] = sum(e['attempts'] for e in choices) result.update(status='validated', blocks=len(scene.blocks), components=len(scene.nodes), digest=semantic_digest(scene), principal_signature=signature, structure=structure, contact=contact_metrics(scene), accepted_candidates=sum(e['accepted'] for e in choices) if choices else 1, candidates=choices) # Hash independently frozen terrain before placement using persisted field input and current unchanged bed cells. if output: export_scene(scene, output) result['artifact'] = str(output) except SearchExhausted as exc: result.update(status='budget-exhausted', diagnostic=str(exc), accepted_candidates=0, attempts=getattr(exc, 'attempts', 1), candidates=getattr(exc, 'candidates', [])) except (ContractError, ValueError) as exc: result.update(status='incompatible' if isinstance(exc, ContractError) and exc.diagnostic.rule in ('site-relief', 'support-height', 'fill-volume', 'approach-detour') else 'defect', diagnostic=str(exc), accepted_candidates=0, attempts=getattr(exc, 'attempts', 1), candidates=getattr(exc, 'candidates', [])) result['seconds'] = round(time.perf_counter() - start, 4) return result def run_corpus(output: Path, seed=0, artifacts=False): output.mkdir(parents=True, exist_ok=True) rows = [] specs = [] environments = {} for env in range(16): expression, water = adaptation_expression(env + seed * 100) frozen = freeze_environment(env + seed * 100) environments[env + seed * 100] = frozen digest = semantic_digest(frozen) for build in range(4): specs.append({'environment_seed': env + seed * 100, 'building_seed': build, 'expression': expression.expression(), 'water': water, 'frozen_environment_digest': digest, 'environment_domain': [list(frozen.domain.lo), list(frozen.domain.hi)], 'held_out': env >= 8}) (output / 'adaptation-inputs.json').write_text(json.dumps(specs, indent=2)) for i, spec in enumerate(specs): expression, water = adaptation_expression(spec['environment_seed']) bs = spec['building_seed'] recipe = lambda e=environments[spec['environment_seed']], b=bs: adapt_frozen(e, PROGRAMS['dwelling'](b), b) artifact = Path('samples') / f'adaptation-{i:02d}.litematic' if artifacts and i in (0, 8, 35, 60) else None row = measured(f'adaptation-{i:02d}', recipe, spec, artifact) if semantic_digest(environments[spec['environment_seed']]) != spec['frozen_environment_digest']: raise AssertionError('Frozen environment mutated') rows.append(row) print(row['label'], row['status'], flush=True) for name, program in PROGRAMS.items(): for bs in range(8): artifact = Path('samples') / f'{name}-{bs}.litematic' if artifacts and bs in (0, 1, 6) else None row = measured(f'{name}-{bs}', lambda p=program, b=bs: building_scene(p(b), b), {'program': name, 'seed': bs}, artifact) rows.append(row) print(row['label'], row['status'], flush=True) for bs, count in [(s, None) for s in range(8)] + [(0, 3), (0, 6)]: label = f'settlement-{bs}-{count or "seeded"}' artifact = Path('samples') / (label + '.litematic') if artifacts and ((bs == 1 and count is None) or count in (3, 6)) else None row = measured(label, lambda b=bs, c=count: settlement_scene(b, c), {'program': 'settlement', 'seed': bs, 'count': count}, artifact) rows.append(row) print(label, row['status'], flush=True) for i in range(32): es = 1000 + seed * 100 + i rng = Scope(es).stream('stress') expression = (gradient(rng.choice((0, .12, .28, .45)), rng.choice((0, -.15, .2)), 4) + wave(rng.choice((0, 2, 5)), .13, .17, rng.random() * 6)).clamp(-2, 20) water = rng.choice((None, 5, 12)) bs = i % 8 row = measured(f'stress-{i:02d}', lambda e=expression, w=water, b=bs: building_scene(PROGRAMS['dwelling'](b), b, e, w), {'environment_seed': es, 'building_seed': bs, 'expression': expression.expression(), 'water': water}) rows.append(row) print(row['label'], row['status'], flush=True) (output / 'results.json').write_text(json.dumps(rows, indent=2)) summary = {} for name, subset in [('adaptation', rows[:64]), ('buildings', rows[64:88]), ('settlements', rows[88:98]), ('stress', rows[98:])]: good = [r for r in subset if r['status'] == 'validated'] summary[name] = {'inputs': len(subset), 'validated': len(good), 'incompatible': sum(r['status'] == 'incompatible' for r in subset), 'defects': sum(r['status'] == 'defect' for r in subset), 'budget_exhausted': sum(r['status'] == 'budget-exhausted' for r in subset), 'candidate_attempts': sum(r['attempts'] for r in subset), 'accepted_candidates': sum(r['accepted_candidates'] for r in subset), 'retries': sum(r['retries'] for r in subset), 'seconds': round(sum(r['seconds'] for r in subset), 3), 'observed_principal_signatures': len({r['principal_signature'] for r in good}), 'observed_contact_signatures': len({r['contact']['signature'] for r in good}), 'fill_range': [min((r['contact']['fill'] for r in good), default=0), max((r['contact']['fill'] for r in good), default=0)]} (output / 'summary.json').write_text(json.dumps(summary, indent=2)) manifest = [{'artifact': r['artifact'], 'inputs': r['inputs'], 'digest': r['digest'], 'status': r['status']} for r in rows if 'artifact' in r] (Path('samples') / 'replay-manifest.json').write_text(json.dumps(manifest, indent=2)) return summary
hearth/lodges.py
# Small architectural intent programs; all geometry remains in shared components. from hearth import Scene, Box from hearth.randomness import Scope from hearth.environment import Terrain, gradient, wave from hearth.components.building import Blueprint, RoomSpec, adapted from hearth.components.roofcraft import RoofDesign from hearth.components.facades import FacadeDesign from hearth.components.grounds import GardenCourt def hillside_home(seed): rng = Scope(seed).stream('home-layout') rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom'), RoomSpec(1, 0, 0, 'kitchen')] if rng.choice((True, False)): rooms += [RoomSpec(0, 1, 0, 'library')] return Blueprint(tuple(rooms), bay=rng.choice((11, 13)), roof_design=RoofDesign(rng.choice(((1, 2), (1, 1, 2)))), porch_depth=4, balcony=True, chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak', attic_purpose=Scope(seed).choose(('bedroom', 'library'), 'roof-purpose')) def gabled_hall(seed): rng = Scope(seed).stream('hall-layout') rooms = [RoomSpec(0, 0, 0, 'library'), RoomSpec(0, 1, 0, 'living'), RoomSpec(1, 1, 0, 'kitchen')] if rng.choice((True, False)): rooms += [RoomSpec(0, 1, 1, 'bedroom')] if rng.choice((True, False)): rooms += [RoomSpec(1, 0, 0, 'workshop')] return Blueprint(tuple(rooms), bay=rng.choice((9, 11)), roof_axis=rng.choice(('x', 'z')), roof_design=RoofDesign((1, 2), rng.choice((7, 10))), porch_depth=5, chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak', attic_purpose=Scope(seed).choose(('bedroom', 'library'), 'roof-purpose')) def high_house(seed): rng = Scope(seed).stream('vertical-layout') rooms = [RoomSpec(0, 0, level, purpose) for level, purpose in enumerate(('living', 'library', 'bedroom'))] rooms += [RoomSpec(1, 0, 0, 'kitchen')] if rng.choice((True, False)): rooms += [RoomSpec(1, 0, 1, 'workshop')] if rng.choice((True, False)): rooms += [RoomSpec(0, 1, 0, 'storage')] return Blueprint(tuple(rooms), bay=rng.choice((9, 11)), roof_design=RoofDesign((2, 1), 8), porch_depth=4, balcony=rng.choice((True, False)), chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak', attic_purpose=Scope(seed).choose(('bedroom', 'library'), 'roof-purpose')) def lodge_scene(design, seed=0, environment_seed=0, field=None, water=None, garden=True): """Freeze a general environment, then compose a building and its garden court.""" design.validate() w = (max(r.x for r in design.rooms) + 1) * design.bay d = (max(r.z for r in design.rooms) + 1) * design.bay domain = Box((-8, -3, -17), (w + 8, 72, d + 9)) rng = Scope(environment_seed).stream('environment') expression = field if field is not None else gradient(rng.choice((-.02, .02, .04)), .012, 2) + wave(.5, .12, .1, rng.random() * 6) scene = Scene(seed, domain=domain) scene.place('land', Terrain(domain, expression, water)) scene.finalize() scene.compose_choice(adapted('building', design, '/land')) if garden: scene.place('garden', GardenCourt('/building', '/land', domain)) return scene.finalize()
hearth/quality_assessment.py
# Finite individual-building assessment with independently frozen inputs and retained failures. from pathlib import Path import hashlib import json import time from hearth import Scene, Box, ContractError from hearth.kernel import SearchExhausted from hearth.randomness import Scope from hearth.environment import Terrain, gradient, wave from hearth.assessment import adaptation_expression, contact_metrics from hearth.components.building import adapted from hearth.lodges import hillside_home, gabled_hall, high_house, lodge_scene from hearth.persistence import export_scene, load_scene, semantic_digest, encode CLIENTS = {'home': hillside_home, 'hall': gabled_hall, 'high': high_house} DOMAIN = Box((-10, -4, -20), (40, 72, 40)) def fingerprint(value): return hashlib.sha256(json.dumps(value, sort_keys=True, default=list).encode()).hexdigest() def principal_signature(scene): """Measure current architecture independently of palette, contact and garden noise. Args: scene: A validated scene with automatic component records. Returns: A digest and its auditable normalized structural measurements. """ data = [] for path, node in sorted(scene.nodes.items()): if node.type != 'building.rooms': continue floor = node.contract.decisions['floor'] rows = [] for part in scene.nodes.values(): if not part.path.startswith(path + '/'): continue relative = node.frame.inverse(part.frame.origin) location = (relative[0], relative[1] - floor, relative[2]) if part.type.startswith('room.'): floor_cells = scene.cells(part.path + '/floor') if not floor_cells: # A mounted room can depend on another component's sealed floor. boundary = {p for rule in part.contract.rules if rule.kind == 'sealed' for p in rule.cells} floor_cells = {p for p in boundary if part.frame.inverse(p)[1] == 0 and scene.view.supports(p)} footprint = sorted((part.frame.inverse(p)[0], part.frame.inverse(p)[2]) for p in floor_cells) rows.append(('room', location, part.type, part.contract.decisions['doors'], part.contract.decisions['stair_up'], fingerprint(footprint))) elif part.type in ('roof.profile', 'roof.gable', 'roof.dormer'): structural_tags = {'roof', 'enclosure', 'wall', 'window', 'sealed-opening'} coordinates = sorted(part.frame.inverse(p) for p in scene.cells(part.path, descendants=True) if structural_tags.intersection(scene.nodes[scene.blocks[p].owner].capability.tags)) decisions = {k: v for k, v in part.contract.decisions.items() if k in ('axis', 'span', 'rise', 'steep', 'tops')} rows.append((part.type, location, decisions, fingerprint(coordinates))) elif part.type in ('attachment.porch', 'masonry.chimney'): keys = {'balcony', 'depth', 'width', 'entrance_x', 'columns', 'height', 'cap_overhang'} rows.append((part.type, location, {k: v for k, v in part.contract.decisions.items() if k in keys})) data.append(sorted(rows, key=lambda v: json.dumps(v, sort_keys=True))) return fingerprint(data), data def audit_pair(scene, path): """Verify complete structural records, actual cells, states, inventories and queries.""" restored = load_scene(path) for attr in ('nodes', 'relations', 'dependencies', 'operations', 'port_uses', 'displaced', 'reverse'): if encode(getattr(restored, attr)) != encode(getattr(scene, attr)): raise AssertionError('Roundtrip record mismatch: ' + attr) if semantic_digest(restored) != semantic_digest(scene): raise AssertionError('Geometry digest mismatch') queries = 0 for node in scene.nodes.values(): cells = scene.cells(node.path) if cells != restored.cells(node.path): raise AssertionError('Current-cell query mismatch') if cells: p = min(cells) if scene.inspect(p) != restored.inspect(p): raise AssertionError('Structural query mismatch') queries += 1 inventories = {p: c.nbt for p, c in scene.blocks.items() if c.nbt} if inventories != {p: c.nbt for p, c in restored.blocks.items() if c.nbt}: raise AssertionError('Inventory mismatch') return {'queries': queries, 'inventories': len(inventories), 'nodes': len(scene.nodes), 'digest': semantic_digest(restored)} def evaluate(label, inputs, recipe, artifact=None): start = time.perf_counter() row = {'label': label, 'inputs': inputs, 'attempts': 1, 'accepted_candidates': 0, 'retries': 0} try: scene = recipe() scene.finalize() events = [e for e in scene.events if e['kind'] == 'candidate-selection'] digest, architecture = principal_signature(scene) contact = contact_metrics(scene) contact['bearing_fill'] = sum(n.contract.decisions['fill'] for n in scene.nodes.values() if n.type == 'adapter.bearing-course') contact['fill'] += contact['bearing_fill'] row.update(status='validated', attempts=sum(e['attempts'] for e in events) or 1, accepted_candidates=sum(e['accepted'] for e in events) if events else 1, digest=semantic_digest(scene), principal_signature=digest, architecture=architecture, contact=contact, blocks=len(scene.blocks), nodes=len(scene.nodes), candidates=events, optional_omissions=[{'component': n.path, 'dormers': n.contract.decisions['omitted_optional_dormers']} for n in scene.nodes.values() if n.contract.decisions.get('omitted_optional_dormers')]) if artifact is not None: export_scene(scene, artifact) row.update(artifact=str(artifact), audit=audit_pair(scene, artifact)) except (ContractError, ValueError, AssertionError) as error: known = {'site-relief', 'support-height', 'fill-volume', 'contact-strategy', 'approach-detour', 'substrate-depth'} status = 'budget-exhausted' if isinstance(error, SearchExhausted) else 'incompatible' if isinstance(error, ContractError) and error.diagnostic.rule in known else 'defect' row.update(status=status, diagnostic=str(error), attempts=getattr(error, 'attempts', 1), candidates=getattr(error, 'candidates', [])) row['seconds'] = round(time.perf_counter() - start, 4) return row def summary(rows): valid = [r for r in rows if r['status'] == 'validated'] return {'inputs': len(rows), 'validated': len(valid), 'incompatible': sum(r['status'] == 'incompatible' for r in rows), 'defects': sum(r['status'] == 'defect' for r in rows), 'budget_exhausted': sum(r['status'] == 'budget-exhausted' for r in rows), 'candidate_attempts': sum(r['attempts'] for r in rows), 'accepted_candidates': sum(r['accepted_candidates'] for r in rows), 'seconds': round(sum(r['seconds'] for r in rows), 3), 'principal_signatures': len({r['principal_signature'] for r in valid}), 'contact_signatures': len({r['contact']['signature'] for r in valid}), 'fill_range': [min((r['contact']['fill'] for r in valid), default=0), max((r['contact']['fill'] for r in valid), default=0)]} def run(output, artifacts, seed=0): """Run the recorded finite recipe once per input without success-only resampling.""" output, artifacts = Path(output), Path(artifacts) output.mkdir(parents=True, exist_ok=True) artifacts.mkdir(parents=True, exist_ok=True) rows, frozen = [], {} specifications = [] for index in range(16): es = seed * 100 + index field, water = adaptation_expression(es) environment = Scene(es, domain=DOMAIN) environment.place('land', Terrain(DOMAIN, field, water)) environment.finalize() frozen[index] = environment specifications.append({'environment_seed': es, 'expression': field.expression(), 'water': water, 'digest': semantic_digest(environment), 'held_out_composition': index >= 8}) (output / 'frozen-inputs.json').write_text(json.dumps(specifications, indent=2)) def retain(row): rows.append(row) (output / 'results.json').write_text(json.dumps(rows, indent=2)) print(row['label'], row['status'], flush=True) for name, client in CLIENTS.items(): for bs in range(8): label = f'{name}-{bs}' artifact = artifacts / (label + '.litematic') if bs in (0, 1, 6) else None retain(evaluate(label, {'client': name, 'structure_seed': bs, 'environment_seed': bs + seed * 100}, lambda c=client, b=bs: lodge_scene(c(b), b, b + seed * 100), artifact)) structures = ((hillside_home, 0), (hillside_home, 1), (gabled_hall, 2), (high_house, 3)) for es, environment in frozen.items(): for index, (client, bs) in enumerate(structures): number = es * 4 + index label = f'adaptation-{number:02d}' inputs = {**specifications[es], 'client': client.__name__, 'structure_seed': bs} def place(e=environment, c=client, b=bs): scene = e.fork(seed=b) scene.compose_choice(adapted('building', c(b), '/land')) return scene.finalize() artifact = artifacts / (label + '.litematic') if number in (0, 8, 35, 60) else None retain(evaluate(label, inputs, place, artifact)) if semantic_digest(environment) != specifications[es]['digest']: raise AssertionError('Frozen environment changed') for index in range(16): es = 2000 + seed * 100 + index rng = Scope(es).stream('stress') field = (gradient(rng.choice((0, .12, .28, .45)), rng.choice((0, -.15, .2)), 4) + wave(rng.choice((0, 2, 5)), .13, .17, rng.random() * 6)).clamp(-2, 20) water = rng.choice((None, 5, 12)) environment = Scene(es, domain=DOMAIN) environment.place('land', Terrain(DOMAIN, field, water)) environment.finalize() bs = index % 8 def stress(e=environment, b=bs): s = e.fork(seed=b) s.compose_choice(adapted('building', high_house(b), '/land')) return s.finalize() retain(evaluate(f'stress-{index:02d}', {'environment_seed': es, 'structure_seed': bs, 'expression': field.expression(), 'water': water, 'frozen_digest': semantic_digest(environment)}, stress)) results = {'clients': summary(rows[:24]), 'adaptation': summary(rows[24:88]), 'stress': summary(rows[88:]), 'per_client': {name: summary([r for r in rows[:24] if r['inputs']['client'] == name]) for name in CLIENTS}} (output / 'summary.json').write_text(json.dumps(results, indent=2)) (artifacts / 'manifest.json').write_text(json.dumps([r for r in rows if 'artifact' in r], indent=2)) return results
hearth/validators.py
# Reusable geometric checks registered through the public validator extension point. from hearth.kernel.validation import validator, state, fail from hearth.blocks import solid, name_of from collections import deque @validator('vertical-cover') def vertical_cover(scene, node, rule): """Check actual weather cover along bounded world-vertical columns. Horizontal frame rotations preserve world Y. This is a voxel coverage check, not a fluid simulator or a structural-mechanics proof. """ for x, y, z in rule.cells: if not any(solid(state(scene, (x, yy, z))) or 'glass' in name_of(state(scene, (x, yy, z))) for yy in range(y, rule.box.hi[1] + 1)): yield fail('roof-cover', node, (x, y, z), 'Weather skin has an uncovered column') @validator('enclosed-volume') def enclosed_volume(scene, node, rule): """Flood actual air to detect exterior leaks, exempting explicit floor apertures. This is a six-neighbor voxel enclosure check, not fluid or collision simulation. Apertures are node-local cells on the bounded volume's floor boundary. """ allowed = {node.frame.point(tuple(q)) for q in rule.data.get('apertures', ())} if any(p[1] != rule.box.lo[1] or not rule.box.contains(p) for p in allowed): yield fail('enclosure-aperture', node, None, 'Apertures must be bounded floor cells') return def permeable(p): name = name_of(state(scene, p)) return not solid(state(scene, p)) and 'glass' not in name and not name.endswith('_door') reached = {q for q in rule.cells if permeable(q)} if not reached: yield fail('enclosure-seed', node, rule.cells[0] if rule.cells else None, 'The room needs an actual interior air cell') return queue = deque(sorted(reached)) while queue: p = queue.popleft() if p in allowed: continue if any(p[k] in (rule.box.lo[k], rule.box.hi[k]) for k in range(3)): yield fail('enclosure-leak', node, p, 'Actual interior air reaches the exterior boundary') return for dx, dy, dz in ((1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)): q = (p[0] + dx, p[1] + dy, p[2] + dz) if q not in reached and rule.box.contains(q) and permeable(q): reached.add(q) queue.append(q)
hearth/navigation.py
# Bounded level-floor route planning through the public read-only environment interface. from collections import deque from hearth.blocks import passable def floor_path(view, frame, start, end, area, blocked=()): """Find a level two-cell-high route without inferring unknown space as empty. Args: view: Public read-only environmental access. frame: Frame mapping all other arguments from local coordinates to world. start: Local standing position. end: Local standing position on the same floor. area: Inclusive local bound for standing positions. blocked: Prospective local occupied cells not yet submitted as effects. Returns: A deterministic local path, or an empty tuple when no path exists. """ if start[1] != end[1]: raise ValueError('floor_path requires equal standing heights') blocked = set(blocked) def usable(p): head = (p[0], p[1] + 1, p[2]) return (area.contains(p) and p not in blocked and head not in blocked and view.supports(frame.point((p[0], p[1] - 1, p[2]))) and passable(view.state(frame.point(p))) and passable(view.state(frame.point(head)))) if not usable(start) or not usable(end): return () parent, queue = {start: None}, deque((start,)) while queue: p = queue.popleft() if p == end: result = [] while p is not None: result.append(p) p = parent[p] return tuple(reversed(result)) for dx, dz in ((0, -1), (-1, 0), (1, 0), (0, 1)): q = (p[0] + dx, p[1], p[2] + dz) if q not in parent and usable(q): parent[q] = p queue.append(q) return ()
hearth/kernel/contracts.py
# Serializable contracts, binding requests and pure candidate plans. from dataclasses import dataclass, field from typing import Any, Protocol from hearth.space import Box, Frame, Pos @dataclass(frozen=True) class Domain: minimum: float | None = None maximum: float | None = None choices: tuple = () def accepts(self, value): return (not self.choices or value in self.choices) and (self.minimum is None or value >= self.minimum) and (self.maximum is None or value <= self.maximum) @dataclass(frozen=True) class Capability: name: str tags: tuple[str, ...] parameters: dict[str, Domain] = field(default_factory=dict) offers: tuple[str, ...] = () assumptions: tuple[str, ...] = () adaptations: tuple[str, ...] = () guarantees: tuple[str, ...] = () version: str = '1' inputs: dict = field(default_factory=dict) locked: tuple[str, ...] = () @dataclass(frozen=True) class Rule: kind: str cells: tuple[Pos, ...] = () box: Box | None = None data: dict = field(default_factory=dict) phase: str = 'invariant' def transformed(self, frame): return Rule(self.kind, tuple(frame.point(p) for p in self.cells), frame.box(self.box) if self.box else None, self.data, self.phase) @dataclass(frozen=True) class Grant: key: str box: Box verbs: tuple[str, ...] tags: tuple[str, ...] = () limit: int = 100000 whole: bool = False @dataclass(frozen=True) class Port: key: str kind: str frame: Frame region: Box capacity: int = 1 grant: str | None = None alignment: int = 1 facts: dict = field(default_factory=dict) delegate: tuple[str, str] | None = None @dataclass(frozen=True) class Contract: envelope: Box ports: tuple[Port, ...] = () grants: tuple[Grant, ...] = () rules: tuple[Rule, ...] = () decisions: dict = field(default_factory=dict) reads: tuple[Box, ...] = () atomic_object: bool = False def transformed(self, frame): return Contract(frame.box(self.envelope), tuple(Port(p.key, p.kind, frame.compose(p.frame), frame.box(p.region), p.capacity, p.grant, p.alignment, p.facts, p.delegate) for p in self.ports), tuple(Grant(g.key, frame.box(g.box), g.verbs, g.tags, g.limit, g.whole) for g in self.grants), tuple(r.transformed(frame) for r in self.rules), self.decisions, tuple(frame.box(b) for b in self.reads), self.atomic_object) @dataclass(frozen=True) class Binding: host: str port: str verb: str = 'install' region: Box | None = None @dataclass(frozen=True) class Write: point: Pos state: str operation: str = 'realize' preserve_owner: bool = False nbt: dict | None = None @dataclass(frozen=True) class Child: key: str component: Any params: dict = field(default_factory=dict) frame: Frame = Frame() bindings: tuple[Binding, ...] = () seed: int | None = None @dataclass(frozen=True) class Choice: key: str candidates: tuple[Child, ...] score: Any tolerance: float = 0.5 @dataclass class Plan: writes: list[Write] = field(default_factory=list) children: list[Child] = field(default_factory=list) relations: list[tuple[str, str, str]] = field(default_factory=list) def block(self, point, state, operation='realize', **kwargs): self.writes.append(Write(tuple(point), state, operation, **kwargs)) def fill(self, box, state, operation='fill'): self.writes.extend(Write(p, state, operation) for p in box.cells()) class Component(Protocol): def capability(self) -> Capability: ... def negotiate(self, context, parameters: dict) -> Contract: ... def realize(self, context, contract: Contract) -> Plan: ... class Registry: def __init__(self): self.entries = {} def register(self, component): self.entries[component.capability().name] = component return component def select(self, *tags): return tuple(self.entries[k] for k in sorted(self.entries) if set(tags) <= set(self.entries[k].capability().tags))
hearth/kernel/errors.py
# Structured, stable diagnostics for failed contracts and searches. from dataclasses import dataclass @dataclass(frozen=True) class Diagnostic: rule: str component: str position: tuple | None conditions: str def __str__(self): return f'{self.rule}: {self.component} at {self.position}: {self.conditions}' class ContractError(ValueError): def __init__(self, rule, component='/', position=None, conditions=''): self.diagnostic = Diagnostic(rule, component, position, conditions) super().__init__(str(self.diagnostic)) class ValidationError(ContractError): def __init__(self, diagnostics): self.diagnostics = diagnostics self.diagnostic = diagnostics[0] ValueError.__init__(self, '\n'.join(map(str, diagnostics[:12]))) class SearchExhausted(ContractError): pass
hearth/kernel/view.py
# Read-only, domain-aware environmental observations. from dataclasses import dataclass from types import MappingProxyType import copy from hearth.blocks import AIR, solid, name_of, passable from hearth.kernel.errors import ContractError from hearth.space import Box @dataclass(frozen=True) class Observation: version: int region: Box elevation: int water: int | None material: str slope: int support_depth: int class ReadTrace: """Coalesce actual environmental reads and interface dependencies for one candidate.""" def __init__(self): self.low = None self.high = None self.sources = {} def point(self, p): if self.low is None: self.low = list(p) self.high = list(p) else: for i in range(3): self.low[i] = min(self.low[i], p[i]) self.high[i] = max(self.high[i], p[i]) def region(self, box): self.point(box.lo) self.point(box.hi) @property def bounds(self): return None if self.low is None else Box(tuple(self.low), tuple(self.high)) class View: def __init__(self, scene, trace=None): self.__scene = scene self.__trace = trace @property def version(self): return self.__scene.version @property def domain(self): return self.__scene.domain @property def style(self): return MappingProxyType(self.__scene.style) def preference(self, name, point): if self.domain and not self.domain.contains(point): raise ContractError("unknown-space", position=point) field = self.__scene.preferences.get(name) return None if field is None else field(point[0], point[2]) def state(self, p): p = tuple(p) if self.__trace: self.__trace.point(p) if self.domain and not self.domain.contains(p): raise ContractError('unknown-space', position=p, conditions='Outside explicit environment domain') record = self.__scene.blocks.get(p) return record.state if record else AIR def owner(self, p): if self.__trace: self.__trace.point(p) record = self.__scene.blocks.get(tuple(p)) return record.owner if record else None def supports(self, p): return solid(self.state(p)) def clear(self, box): return all(passable(self.state(p)) for p in box.cells()) def elevation(self, x, z, maximum=None): if self.domain is None: raise ContractError('unknown-space', position=(x, 0, z), conditions='No environmental domain') for y in range(self.domain.hi[1] if maximum is None else min(maximum, self.domain.hi[1]), self.domain.lo[1] - 1, -1): if self.supports((x, y, z)): return y raise ContractError('missing-substrate', position=(x, self.domain.lo[1], z), conditions='No actual solid substrate') def water(self, x, z): if self.domain is None: raise ContractError('unknown-space', position=(x, 0, z)) for y in range(self.domain.hi[1], self.domain.lo[1] - 1, -1): if name_of(self.state((x, y, z))) == 'water': return y return None def sample(self, x, z): y = self.elevation(x, z) heights = [self.elevation(x + dx, z + dz) for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1)) if self.domain.contains((x + dx, y, z + dz))] depth = 0 for yy in range(y, self.domain.lo[1] - 1, -1): if not self.supports((x, yy, z)): break depth += 1 return Observation(self.version, Box((x, self.domain.lo[1], z), (x, self.domain.hi[1], z)), y, self.water(x, z), self.state((x, y, z)), max([abs(h - y) for h in heights] or [0]), depth) def port(self, host, key): node = self.__scene.nodes[host] for p in node.contract.ports: if p.key == key: if self.__trace: self.__trace.sources[host] = p.region return copy.deepcopy(p) raise ContractError('missing-port', host, conditions=key) def cost(self, path, tag=None): paths = [key for key, n in self.__scene.nodes.items() if (key == path or key.startswith(path + '/')) and (tag is None or (n.capability and tag in n.capability.tags))] occupied = sum(len(self.__scene.reverse.get(key, ())) for key in paths) replaced = sum(len(self.__scene.displaced.get(key, ())) for key in paths) return {'occupied': occupied, 'replaced': replaced, 'instances': len(paths)} def offers(self, host, kind=None): return tuple(copy.deepcopy(p) for p in self.__scene.nodes[host].contract.ports if kind is None or p.kind == kind) def capability(self, host): return copy.deepcopy(self.__scene.nodes[host].capability) def resolved_port(self, host, key): seen = set() while True: if (host, key) in seen: raise ContractError('port-cycle', host, conditions=key) seen.add((host, key)) port = self.port(host, key) if not port.delegate: return host, port child, key = port.delegate host = host + '/' + child def contract(self, path): if self.__trace: self.__trace.sources[path] = self.__scene.nodes[path].contract.envelope return copy.deepcopy(self.__scene.nodes[path].contract) def protected(self, box): if self.__trace: self.__trace.region(box) return any(r.kind in ('clear', 'protected') and any(box.contains(p) for p in r.cells) for n in self.__scene.nodes.values() for r in n.contract.rules) def obstacle_distance(self, p, radius=8): best = radius + 1 for q in Box(tuple(v - radius for v in p), tuple(v + radius for v in p)).cells(): if q in self.__scene.blocks and not passable(self.__scene.blocks[q].state): best = min(best, max(abs(a - b) for a, b in zip(p, q))) return best
hearth/kernel/validation.py
# Extensible actual-geometry validators and bounded player movement. from collections import deque from hearth.blocks import AIR, LIGHTS, name_of, parse, passable, solid, validate_state from hearth.kernel.errors import Diagnostic from hearth.space import Box VALIDATORS = {} def validator(name): def register(fn): VALIDATORS[name] = fn return fn return register def state(scene, p): record = scene.blocks.get(tuple(p)) return record.state if record else AIR def fail(kind, node, point, message): return Diagnostic(kind, node.path, point, message) @validator('protected') def protected(scene, node, rule): from hearth.blocks import blockstates_equivalent for p, expected in zip(rule.cells, rule.data['states']): if not blockstates_equivalent(state(scene, p), expected): yield fail('protected-region', node, p, 'Preserved geometry changed') @validator('support') def support(scene, node, rule): for p in rule.cells: if not solid(state(scene, p)): yield fail('support', node, p, 'Required actual load-bearing cell is missing') @validator('clear') def clear(scene, node, rule): for p in rule.cells: if not passable(state(scene, p)): yield fail('clearance', node, p, 'Protected player headroom is obstructed') @validator('sealed') def sealed(scene, node, rule): for p in rule.cells: if name_of(state(scene, p)) in ('air', 'water'): yield fail('enclosure', node, p, 'Enclosed boundary has a gap') @validator('expected') def expected(scene, node, rule): allowed = set(rule.data['names']) for p in rule.cells: if name_of(state(scene, p)) not in allowed: yield fail('expected-geometry', node, p, f'Expected one of {sorted(allowed)}') @validator('pool') def pool(scene, node, rule): for x, y, z in rule.cells: if name_of(state(scene, (x, y, z))) != 'water': yield fail('pool-water', node, (x, y, z), 'Pool water missing') for q in ((x, y - 1, z), (x - 1, y, z), (x + 1, y, z), (x, y, z - 1), (x, y, z + 1)): if not solid(state(scene, q)) and name_of(state(scene, q)) != 'water': yield fail('pool-containment', node, q, 'Basin leaks') def standable(scene, p): x, y, z = p return passable(state(scene, p)) and passable(state(scene, (x, y + 1, z))) and solid(state(scene, (x, y - 1, z))) def reachable(scene, start, box): if not standable(scene, start): return set() reached = {start} queue = deque([start]) while queue: x, y, z = queue.popleft() for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1)): for dy in (0, 1, -1): q = (x + dx, y + dy, z + dz) if q not in reached and box.contains(q) and standable(scene, q): # Ascending requires clearance above the lower step as well. high = (x, y + 2, z) if dy == 1 else (q[0], q[1] + 2, q[2]) if dy and not passable(state(scene, high)): continue reached.add(q) queue.append(q) return reached @validator('route') def route(scene, node, rule): if not rule.cells or rule.box is None: yield fail('route-contract', node, None, 'Route needs start, targets and bounded search region') return reached = reachable(scene, rule.cells[0], rule.box) for p in rule.cells: if p not in reached: yield fail('reachability', node, p, 'No walkable route with two blocks of headroom from entrance') @validator('light') def light(scene, node, rule): sources = [p for p in rule.box.cells() if name_of(state(scene, p)) in LIGHTS] if not sources: yield fail('lighting', node, rule.box.lo, 'Completed room has no actual light source') return # Propagate actual sources through transmissive cells, with one unit attenuation. levels = {p: LIGHTS[name_of(state(scene, p))] for p in sources} queue = deque(sources) domain = rule.box.expand(1) while queue: p = queue.popleft() level = levels[p] - 1 if level < rule.data.get('minimum', 1): continue for dx, dy, dz in ((1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)): q = (p[0] + dx, p[1] + dy, p[2] + dz) if not domain.contains(q) or levels.get(q, 0) >= level: continue material = state(scene, q) if passable(material) or 'glass' in name_of(material) or name_of(material) == 'chain': levels[q] = level queue.append(q) for p in rule.cells: if levels.get(p, 0) < rule.data.get('minimum', 1): yield fail('lighting', node, p, 'Actual source attenuation/occlusion leaves required location dark') @validator('furnishing') def furnishing(scene, node, rule): names = {name_of(state(scene, p)) for p in rule.box.cells()} for group in rule.data['groups']: if not names.intersection(group): yield fail('furnishing', node, rule.box.lo, f'Missing functional furnishing: {group}') def validate(scene, final=False, completed_scope=None): diagnostics = [] for p, record in scene.blocks.items(): try: validate_state(record.state) except ValueError as exc: diagnostics.append(Diagnostic('blockstate', record.owner, p, str(exc))) continue if p not in scene.reverse.get(record.owner, set()): diagnostics.append(Diagnostic('reverse-index', record.owner, p, 'Current cell absent from reverse index')) if record.owner not in scene.nodes: diagnostics.append(Diagnostic('ownership', record.owner, p, 'Owner missing')) if record.nbt is not None: if record.nbt.get('id') != 'minecraft:' + name_of(record.state): diagnostics.append(Diagnostic('block-entity', record.owner, p, 'Block entity type mismatches actual block')) slots = set() for item in record.nbt.get('Items', []): if not 0 <= item.get('Slot', -1) < 27 or item['Slot'] in slots or not 1 <= item.get('count', 0) <= 64 or not item.get('id', '').startswith('minecraft:'): diagnostics.append(Diagnostic('inventory', record.owner, p, 'Invalid or duplicate inventory slot/item count')) slots.add(item.get('Slot')) name, props = parse(record.state) if name.endswith('_door') and not name.endswith('_trapdoor'): dy = 1 if props.get('half') == 'lower' else -1 q = (p[0], p[1] + dy, p[2]) other, op = parse(state(scene, q)) if other != name or op.get('half') == props.get('half') or any(op.get(k) != props.get(k) for k in ('facing', 'hinge', 'open', 'powered')): diagnostics.append(Diagnostic('door-pair', record.owner, p, 'Door halves absent or inconsistent')) if name.endswith('_bed'): direction = {'north': (0, -1), 'south': (0, 1), 'east': (1, 0), 'west': (-1, 0)}[props['facing']] sign = 1 if props['part'] == 'foot' else -1 q = (p[0] + direction[0] * sign, p[1], p[2] + direction[1] * sign) other, op = parse(state(scene, q)) if name != other or op.get('part') == props['part'] or op.get('facing') != props['facing']: diagnostics.append(Diagnostic('bed-pair', record.owner, p, 'Bed halves inconsistent')) if name_of(record.state) in ('sunflower', 'rose_bush', 'peony', 'lilac', 'tall_grass', 'large_fern'): dy = 1 if props.get('half') == 'lower' else -1 q = (p[0], p[1] + dy, p[2]) other, op = parse(state(scene, q)) if other != name or op.get('half') == props.get('half'): diagnostics.append(Diagnostic('plant-pair', record.owner, p, 'Tall plant halves inconsistent')) for owner, points in scene.reverse.items(): for p in points: if p not in scene.blocks or scene.blocks[p].owner != owner: diagnostics.append(Diagnostic('reverse-index', owner, p, 'Obsolete current membership')) for node in scene.nodes.values(): for port in node.contract.ports: if port.delegate and (node.complete or final): try: _, actual = scene.view.resolved_port(node.path, port.key) if (port.frame, port.region, port.kind) != (actual.frame, actual.region, actual.kind): diagnostics.append(Diagnostic('forwarded-interface', node.path, port.frame.origin, 'Child interface changed without parent renegotiation')) except (KeyError, ValueError): diagnostics.append(Diagnostic('forwarded-interface', node.path, port.frame.origin, 'Delegated port missing')) for parent in (node.parent, node.primary): if parent is not None and parent not in scene.nodes: diagnostics.append(Diagnostic('structure-graph', node.path, None, 'Current structural parent missing: ' + parent)) if final and (not node.complete or node.stale): diagnostics.append(Diagnostic('unfinished', node.path, None, 'Scope unfinished or dependent inputs stale')) for rule in node.contract.rules: if rule.phase == 'complete' and not final: scope = node closed = True while scope: closed = closed and scope.complete scope = scene.nodes.get(scope.parent) if completed_scope and (node.path == completed_scope or node.path.startswith(completed_scope + '/')): closed = node.complete if not closed: continue if rule.kind not in VALIDATORS: diagnostics.append(Diagnostic('unknown-validator', node.path, None, rule.kind)) else: diagnostics.extend(VALIDATORS[rule.kind](scene, node, rule)) return diagnostics
hearth/kernel/scene.py
# Transaction kernel, automatic ownership and separate semantic/dependency graphs. import copy from dataclasses import dataclass, field, replace, is_dataclass, fields from hearth.blocks import AIR, canonical, validate_state from hearth.space import Box, Frame from hearth.randomness import Scope from .contracts import Binding, Capability, Child, Choice, Contract, Domain, Plan from .errors import ContractError, ValidationError, SearchExhausted from .view import View, ReadTrace from .validation import validate @dataclass(frozen=True) class Limits: dimension: int = 512 blocks: int = 1000000 depth: int = 40 search: int = 24 instances: int = 10000 export_volume: int = 16000000 @dataclass(frozen=True) class Cell: state: str owner: str operation: str nbt: dict | None = None shared: tuple[str, ...] = () @dataclass class Node: path: str type: str version: str parameters: dict frame: Frame scope: Scope contract: Contract parent: str | None primary: str | None = None complete: bool = True stale: bool = False bindings: tuple = () capability: Capability | None = None shared_bindings: tuple = () @dataclass(frozen=True) class Context: path: str frame: Frame scope: Scope view: View bindings: tuple[Binding, ...] limits: Limits def rng(self, purpose='plan'): return self.scope.stream(purpose) def world(self, p): return self.frame.point(p) def local(self, p): return self.frame.inverse(p) def elevation(self, x, z, maximum=None): world = self.world((x, 0, z)) cap = None if maximum is None else maximum + self.frame.origin[1] return self.view.elevation(world[0], world[2], maximum=cap) - self.frame.origin[1] def water(self, x, z): world = self.world((x, 0, z)) level = self.view.water(world[0], world[2]) return None if level is None else level - self.frame.origin[1] def state(self, point): return self.view.state(self.world(point)) class Scene: def __init__(self, seed=0, limits=None, domain=None, style=None, preferences=None): if not isinstance(seed, int): raise TypeError('Seed must be an integer') self.seed = seed self.style = dict(style or {"timber": "spruce", "infill": "minecraft:smooth_sandstone", "roof": "deepslate_tile"}) self.preferences = dict(preferences or {}) self.limits = limits or Limits() self.domain = domain self.blocks = {} self.nodes = {} self.reverse = {} self.reverse_shared = {} self.relations = set() self.members = {} self.dependencies = [] self.operations = {} self.displaced = {} self.erasures = {} self.port_uses = {} self.version = 0 self.completed = False self._recipes = {} self.events = [] @property def view(self): return View(self) def _fork(self): other = copy.copy(self) other.blocks = self.blocks.copy() other.nodes = {p: copy.copy(n) for p, n in self.nodes.items()} other.reverse = {k: set(v) for k, v in self.reverse.items()} other.reverse_shared = {k: set(v) for k, v in self.reverse_shared.items()} other.relations = set(self.relations) other.members = {k: set(v) for k, v in self.members.items()} other.dependencies = list(self.dependencies) other.operations = copy.deepcopy(self.operations) other.displaced = {k: dict(v) for k, v in self.displaced.items()} other.erasures = dict(self.erasures) other.port_uses = dict(self.port_uses) other._recipes = self._recipes.copy() other.events = list(self.events) return other def fork(self, seed=None): """Copy a frozen composition; an optional seed controls future placements only.""" result = self._fork() if seed is not None: if not isinstance(seed, int): raise TypeError('Seed must be an integer') result.seed = seed return result def _commit(self, candidate): candidate.version += 1 candidate.completed = False self.__dict__.update(candidate.__dict__) def place(self, key, component, params=None, frame=Frame(), bindings=(), seed=None, complete=True): if not isinstance(key, str) or not key or any(c in key for c in '/#'): raise ContractError('instance-key', conditions='Keys must be nonempty and exclude / and #') candidate = self._fork() path = '/' + key candidate._instantiate(path, component, params or {}, frame, tuple(bindings), None, Scope(self.seed).child(key, seed), complete) candidate._check(False) self._commit(candidate) return path def compose_choice(self, choice): trial = self._fork() trial._select_child('', choice, Frame(), Scope(self.seed)) trial._check(False) self._commit(trial) return '/' + choice.key def choose(self, key, candidates, score=lambda scene, path: 0): accepted, failed = [], [] for index, child in enumerate(candidates): if index >= self.limits.search: break trial = self._fork() try: path = trial.place(key, child.component, child.params, child.frame, child.bindings, child.seed) accepted.append((score(trial, path), index, trial, path)) except ContractError as exc: failed.append(str(exc)) if not accepted: raise SearchExhausted('search-budget', '/' + key, conditions=f'No validated candidate within budget {self.limits.search}; failures={failed}') accepted.sort(key=lambda item: (item[0], item[1])) best_score = accepted[0][0] best = [c for c in accepted if c[0] <= best_score + 0.1] chosen = Scope(self.seed).child(key).choose(best, 'alternatives') self._commit(chosen[2]) self.events.append({'kind': 'search', 'key': key, 'accepted': len(accepted), 'rejected': len(failed), 'failures': failed}) return chosen[3] def _instantiate(self, path, component, params, frame, bindings, parent, scope, complete=True): if path in self.nodes: raise ContractError('duplicate-instance', path) if len(self.nodes) >= self.limits.instances: raise ContractError('instance-budget', path) if len(path.split('/')) > self.limits.depth: raise ContractError('recursion-budget', path) cap = component.capability() for key, value in params.items(): if key not in cap.parameters or not cap.parameters[key].accepts(value): raise ContractError('parameter-domain', path, conditions=f'{key}={value!r}') for key, domain in cap.inputs.items(): if not isinstance(domain, Domain): continue value = frame if key.startswith('frame.') else component parts = key.split('.')[1:] if key.startswith('frame.') else key.split('.') for part in parts: if part.startswith('_') or not hasattr(value, part): raise ContractError('capability-input', path, conditions=key) value = getattr(value, part) if not domain.accepts(value): raise ContractError('input-domain', path, conditions=f'{key}={value!r}') trace = ReadTrace() ctx = Context(path, frame, scope, View(self, trace), bindings, self.limits) local = component.negotiate(ctx, dict(params)) contract = local.transformed(frame) if max(contract.envelope.size) > self.limits.dimension: raise ContractError('dimension-budget', path) if parent and not all(self.nodes[parent].contract.envelope.contains(p) for p in contract.envelope.corners()): raise ContractError('child-envelope', path, contract.envelope.lo, f'Exceeds accepted parent {parent}') self.nodes[path] = Node(path, cap.name, cap.version, {"construction": describe_inputs(component), "arguments": dict(params)}, frame, scope, contract, parent, complete=False, bindings=bindings, capability=cap) self.displaced[path] = {} self.reverse[path] = set() self._recipes[path] = (component, params, frame, bindings, parent, scope, complete) if parent: self.relations.add((path, 'contained_by', parent)) self.members.setdefault(parent, set()).add(path) grants = [] for binding in bindings: if binding.host not in self.nodes: raise ContractError('missing-host', path, conditions=binding.host) effective_host, port = self.view.resolved_port(binding.host, binding.port) host = self.nodes[effective_host] use_key = (binding.host, binding.port) if self.port_uses.get(use_key, 0) >= port.capacity: raise ContractError('port-capacity', path, port.frame.origin, binding.port) self.port_uses[use_key] = self.port_uses.get(use_key, 0) + 1 if binding.verb == 'install': if not port.region.contains(frame.origin): raise ContractError('port-alignment', path, frame.origin, 'Origin outside installation region') if port.frame.inverse(frame.origin)[0] % port.alignment or frame.turn % 4 != port.frame.turn % 4: raise ContractError('port-alignment', path, frame.origin, 'Outside facade bay grid') grant = next((g for g in host.contract.grants if g.key == port.grant), None) if grant and binding.verb != 'connect': if binding.verb not in grant.verbs or (grant.tags and not set(cap.tags).intersection(grant.tags)): raise ContractError('permission-kind', path, frame.origin, f'{cap.tags} cannot {binding.verb} {binding.host}') grants.append((Binding(effective_host, port.key, binding.verb, binding.region), grant)) elif binding.verb != 'connect': raise ContractError('no-write-grant', path) kind = 'attached_to' if binding.verb == 'install' else ('connected_to' if binding.verb == 'connect' else 'supported_by') self.relations.add((path, kind, binding.host)) if kind == 'attached_to': self.members.setdefault(binding.host, set()).add(path) if kind == 'attached_to' and self.nodes[path].primary is None: self.nodes[path].primary = binding.host self.dependencies.append({'consumer': path, 'source': binding.host, 'version': self.version, 'region': binding.region or port.region.intersection(contract.envelope.expand(1)) or contract.envelope, 'reason': binding.verb}) for region in contract.reads: self.dependencies.append({'consumer': path, 'source': 'environment', 'version': self.version, 'region': region, 'reason': 'spatial-query'}) plan = component.realize(ctx, local) if trace.bounds: self.dependencies.append({'consumer': path, 'source': 'environment', 'version': self.version, 'region': trace.bounds, 'reason': 'observed-spatial-input'}) for source, region in sorted(trace.sources.items()): if source != path: self.dependencies.append({'consumer': path, 'source': source, 'version': self.version, 'region': region, 'reason': 'observed-interface-input'}) if not isinstance(plan, Plan): raise TypeError('Components return Plan effect sets') existing_consumers = set(self.nodes) - {path} final_writes = {} for write in plan.writes: p = frame.point(write.point) final_writes[p] = write protected_rules = [(n.path, r.box) for n in self.nodes.values() for r in n.contract.rules if r.kind == "protected" and r.box] retired = set() counts = {} for p, write in final_writes.items(): if not contract.envelope.contains(p): raise ContractError('envelope', path, p, 'Realization exceeds negotiated bounds') for protector, region in protected_rules: if region.contains(p) and protector != path: raise ContractError('protected-region', path, p, 'Immutable region held by ' + protector) old = self.blocks.get(p) if old and old.shared and not write.preserve_owner: raise ContractError('shared-consumer', path, p, 'Shared support requires explicit consumer rebinding') if old and write.preserve_owner and old.state.split('[')[0] != write.state.split('[')[0]: raise ContractError('property-update', path, p, 'Property adjustment must retain block type') if old and old.owner != path: authorization = next(((b, g) for b, g in grants if b.host == old.owner and g.box.contains(p) and (b.region is None or b.region.contains(p))), None) if authorization is None: raise ContractError('write-authority', path, p, f'Owned by {old.owner}; no scoped grant') binding, grant = authorization count_key = (binding.host, grant.key) counts[count_key] = counts.get(count_key, 0) + 1 if counts[count_key] > grant.limit: raise ContractError('edit-limit', path, p, f'Limit {grant.limit}') if self.nodes[old.owner].contract.atomic_object and not write.preserve_owner: if not grant.whole or not self.reverse[old.owner].issubset(final_writes): raise ContractError('whole-object', path, p, f'Partial replacement of {old.owner}') retired.add(old.owner) if old and old.owner != path: self.displaced[path].setdefault(p, old) if old: self.reverse[old.owner].discard(p) try: world_state = frame.state(write.state) validate_state(world_state) except ValueError as exc: raise ContractError('blockstate', path, p, str(exc)) from exc opid = path + '#' + write.operation operation = self.operations.setdefault(opid, {'component': path, 'name': write.operation, 'writes': 0, 'replaced': set()}) operation['writes'] += 1 if old: operation['replaced'].add(old.owner) if world_state == AIR: self.blocks.pop(p, None) self.erasures[p] = path else: self.erasures.pop(p, None) owner = old.owner if old and write.preserve_owner else path self.blocks[p] = Cell(canonical(world_state), owner, opid, write.nbt, old.shared if old and write.preserve_owner else ()) self.reverse[owner].add(p) for dependency in self.dependencies: consumer = dependency["consumer"] if consumer in existing_consumers and consumer != parent and not path.startswith(consumer + "/") and any(dependency["region"].contains(p) for p in final_writes): # Binding consumers remain valid only if their actual invariants hold. self.events.append({"kind": "revalidated-input", "consumer": consumer, "cause": path, "version": self.version}) for old in retired: self._retire(old) for child in plan.children: if isinstance(child, Choice): self._select_child(path, child, frame, scope) continue if not child.key or any(c in child.key for c in '/#'): raise ContractError('instance-key', path, conditions=child.key) self._instantiate(path + '/' + child.key, child.component, child.params, frame.compose(child.frame), child.bindings, path, scope.child(child.key, child.seed)) for port in contract.ports: if port.delegate: target, actual = self.view.resolved_port(path, port.key) if actual.frame != port.frame or actual.region != port.region or actual.kind != port.kind: raise ContractError('forwarded-interface', path, port.frame.origin, 'Realized child changed the negotiated public interface') self.relations.add((path, 'exposes', target)) for source, kind, target in plan.relations: if source not in self.nodes or target not in self.nodes: raise ContractError("dangling-relation", path, conditions=f"{source} {kind} {target}") self.relations.add((source, kind, target)) self.nodes[path].complete = complete if len(self.blocks) > self.limits.blocks: raise ContractError('block-budget', path) def _select_child(self, parent, choice, frame, scope): accepted = [] rejected = [] path = parent + '/' + choice.key for i, option in enumerate(choice.candidates[:self.limits.search]): trial = self._fork() try: trial._instantiate(path, option.component, option.params, frame.compose(option.frame), option.bindings, parent or None, scope.child(choice.key, option.seed).child(f'alternative-{i}')) trial._check(False, completed_scope=path) accepted.append((choice.score(trial.view, path), i, trial)) except ContractError as exc: rejected.append(exc.diagnostic) if not accepted: rules = {d.rule for d in rejected} if len(rules) == 1 and len(choice.candidates) <= self.limits.search: error = ContractError(next(iter(rules)), path, conditions='All declared alternatives violate the same condition: ' + str(rejected[0])) else: error = SearchExhausted('search-budget', path, conditions=str(rejected)) error.attempts = len(rejected) error.candidates = [d.__dict__ for d in rejected] raise error accepted.sort(key=lambda item: (item[0], item[1])) feasible = [a for a in accepted if a[0] <= accepted[0][0] + choice.tolerance] chosen = scope.child(choice.key).choose(feasible, 'adaptation-selection') self.__dict__.update(chosen[2].__dict__) self.events.append({'kind': 'candidate-selection', 'component': path, 'attempts': len(accepted) + len(rejected), 'accepted': len(accepted), 'rejected': [d.__dict__ for d in rejected], 'scores': [(a[1], round(a[0], 4)) for a in accepted], 'chosen': chosen[1]}) def _retire(self, path): if self.reverse.get(path): raise ContractError('whole-object', path, conditions='Cannot retire occupied instance') node = self.nodes.get(path) if node: for binding in node.bindings: key = (binding.host, binding.port) self.port_uses[key] = max(0, self.port_uses.get(key, 0) - 1) if node: for shared_host, shared_port, point in node.shared_bindings: key = (shared_host, shared_port) self.port_uses[key] = max(0, self.port_uses.get(key, 0) - 1) self.members.pop(path, None) for children in self.members.values(): children.discard(path) self.nodes.pop(path, None) self.reverse.pop(path, None) self._recipes.pop(path, None) self.relations = {r for r in self.relations if r[0] != path and r[2] != path} self.dependencies = [d for d in self.dependencies if d['consumer'] != path and d['source'] != path] self.port_uses = {k: v for k, v in self.port_uses.items() if k[0] != path} def _check(self, final, completed_scope=None): errors = validate(self, final, completed_scope) if errors: raise ValidationError(errors) def finalize(self): self._check(True) self.completed = True return self def finish_scope(self, path): trial = self._fork() trial.nodes[path].complete = True trial._check(True) self._commit(trial) def descendants(self, path): result = set() pending = [path] while pending: current = pending.pop() if current in result: continue result.add(current) pending.extend(sorted(self.members.get(current, ()))) return frozenset(result) def cells(self, path, descendants=False, shared=False): paths = [path] if descendants: paths = list(self.descendants(path)) return frozenset(p for k in paths for p in (self.reverse.get(k, set()) | (self.reverse_shared.get(k, set()) if shared else set()))) def inspect(self, point): point = tuple(point) record = self.blocks.get(point) if not record: return {'position': point, 'state': AIR, 'instance': None, 'chain': [], 'related': [], 'operation': None} chain, seen = [], set() path = record.owner while path and path not in seen: seen.add(path) node = self.nodes[path] chain.append({'id': path, 'type': node.type}) path = node.primary or node.parent related = sorted(r for r in self.relations if r[0] in seen or r[2] in seen) return {'position': point, 'state': record.state, 'instance': record.owner, 'chain': chain, 'related': related, 'operation': self.operations.get(record.operation), 'shared': record.shared, 'nbt': record.nbt} def share(self, point, participant, host, port): trial = self._fork() p = tuple(point) record = trial.blocks[p] offered = trial.view.port(host, port) if record.owner != host or offered.kind != 'shared-support' or not offered.region.contains(p) or participant not in trial.nodes: raise ContractError('shared-authority', participant, p) if participant in record.shared: return use_key = (host, port) if trial.port_uses.get(use_key, 0) >= offered.capacity: raise ContractError('port-capacity', participant, p) trial.port_uses[use_key] = trial.port_uses.get(use_key, 0) + 1 trial.reverse_shared.setdefault(participant, set()).add(p) from .contracts import Rule node = trial.nodes[participant] node.shared_bindings = node.shared_bindings + ((host, port, p),) node.contract = replace(node.contract, rules=node.contract.rules + (Rule('support', (p,)),)) trial.blocks[p] = replace(record, shared=tuple(sorted(set(record.shared + (participant,))))) trial.relations.add((participant, 'shares_support', host)) trial._check(False) self._commit(trial) def remove(self, path): trial = self._fork() trial._remove_branch(path) trial._check(False) self._commit(trial) def _remove_branch(self, path): paths = {k for k in self.nodes if k == path or k.startswith(path + '/')} affected = set() for k in sorted(paths, reverse=True): current = set(self.reverse[k]) | set(self.displaced.get(k, {})) for p in current: record = self.blocks.get(p) if record is None and self.erasures.get(p) not in paths: continue if record is not None and record.owner not in paths and self.operations[record.operation]['component'] not in paths: continue affected.add(p) if record is not None: self.reverse[record.owner].discard(p) self.erasures.pop(p, None) previous = self.displaced.get(k, {}).get(p) if previous and previous.owner in self.nodes and previous.owner not in paths: self.blocks[p] = previous self.reverse[previous.owner].add(p) else: self.blocks.pop(p, None) self.displaced.pop(k, None) for d in self.dependencies: if d['consumer'] not in paths and (d['source'] in paths or any(d['region'].contains(p) for p in affected)): self.nodes[d['consumer']].stale = True for k in sorted(paths, reverse=True): self.reverse_shared.pop(k, None) self.reverse[k].clear() self._retire(k) self.relations = {r for r in self.relations if r[0] in self.nodes and r[2] in self.nodes} for p, record in list(self.blocks.items()): if set(record.shared).intersection(paths): self.blocks[p] = replace(record, shared=tuple(s for s in record.shared if s not in paths)) def regenerate(self, path, component=None, params=None, dependents=(), seed=None, replacements=None): trial = self._fork() targets = [path] + list(dependents) updates = dict(replacements or {}) if set(updates) - set(targets) or len(set(targets)) != len(targets): raise ContractError('replay-targets', path, conditions='Replacements must name distinct explicit replay targets') if component is not None: if path in updates: raise ContractError('replay-targets', path, conditions='Supply a root replacement only once') updates[path] = component recipes = {} for p in targets: if p in trial._recipes: recipes[p] = trial._recipes[p] elif p in updates: n = trial.nodes[p] recipes[p] = (updates[p], n.parameters.get('arguments', {}), n.frame, n.bindings, n.parent, n.scope, n.complete) else: raise ContractError('replay-implementation', p, conditions='Reloaded branch needs an explicitly supplied component implementation') for p in targets: trial._remove_branch(p) for p in targets: comp, oldparams, frame, bindings, parent, scope, complete = recipes[p] if p == path and seed is not None: scope = scope.child('override', seed) trial._instantiate(p, updates.get(p, comp), params if p == path and params is not None else oldparams, frame, bindings, parent, scope, complete) trial._check(True) self._commit(trial) self.events.append({'kind': 'regenerated', 'targets': targets}) def describe_inputs(value): """Record declared public inputs without concrete-component dispatch.""" if value is None or isinstance(value, (str, int, float, bool)): return value if isinstance(value, (list, tuple)): return [describe_inputs(v) for v in value] if isinstance(value, dict): return {str(k): describe_inputs(v) for k, v in value.items()} if is_dataclass(value): return {'type': type(value).__module__ + '.' + type(value).__qualname__, 'inputs': {f.name: describe_inputs(getattr(value, f.name)) for f in fields(value)}} if callable(value): return {'program': value.__module__ + '.' + value.__qualname__} return {'type': type(value).__module__ + '.' + type(value).__qualname__, 'inputs': {k: describe_inputs(v) for k, v in vars(value).items() if not k.startswith('_')}}
hearth/kernel/__init__.py
# Public composition kernel, independent of architectural implementations. from .contracts import Binding, Capability, Child, Choice, Component, Contract, Domain, Grant, Plan, Port, Registry, Rule, Write from .errors import ContractError, Diagnostic, SearchExhausted, ValidationError from .scene import Context, Limits, Scene from .validation import validate, validator
hearth/environment/fields.py
# Serializable scalar-field expressions; recognizable terrain emerges from parameters. from dataclasses import dataclass import math @dataclass(frozen=True) class Field: op: str args: tuple def __call__(self, x, z): a = self.args if self.op == 'constant': return a[0] if self.op == 'gradient': return a[0] * x + a[1] * z + a[2] if self.op == 'wave': return a[0] * math.sin(x * a[1] + a[3]) * math.cos(z * a[2] + a[3]) if self.op == 'radial': return a[3] * max(0, 1 - math.hypot(x - a[0], z - a[1]) / a[2]) if self.op == 'add': return a[0](x, z) + a[1](x, z) if self.op == 'multiply': return a[0](x, z) * a[1](x, z) if self.op == 'blend': mask = min(1, max(0, a[2](x, z))) return (1 - mask) * a[0](x, z) + mask * a[1](x, z) if self.op == 'transform': return a[0]((x - a[1]) / a[3], (z - a[2]) / a[3]) if self.op == 'clamp': return max(a[1], min(a[2], a[0](x, z))) raise ValueError(self.op) def __add__(self, other): return Field('add', (self, as_field(other))) def __mul__(self, other): return Field('multiply', (self, as_field(other))) def blend(self, other, mask): return Field('blend', (self, as_field(other), as_field(mask))) def transformed(self, dx=0, dz=0, scale=1): if scale <= 0: raise ValueError('Scale must be positive') return Field('transform', (self, dx, dz, scale)) def clamp(self, low, high): return Field('clamp', (self, low, high)) def expression(self): return {'op': self.op, 'args': [a.expression() if isinstance(a, Field) else a for a in self.args]} def as_field(value): return value if isinstance(value, Field) else constant(value) def constant(value=0): return Field('constant', (value,)) def gradient(x=0, z=0, base=0): return Field('gradient', (x, z, base)) def wave(amplitude=1, frequency_x=0.1, frequency_z=0.1, phase=0): return Field('wave', (amplitude, frequency_x, frequency_z, phase)) def radial(x, z, radius, amplitude): if radius <= 0: raise ValueError('Radius must be positive') return Field('radial', (x, z, radius, amplitude)) def from_expression(expression): """Restore only declared field operations, never execute a serialized program.""" return Field(expression['op'], tuple(from_expression(a) if isinstance(a, dict) and 'op' in a else a for a in expression['args']))
hearth/environment/terrain.py
# Frozen field sampling, strata and water under scoped edit interfaces. import math from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import state_of from hearth.kernel import Capability, Contract, Grant, Port, Plan, Rule from .fields import Field @dataclass(frozen=True) class Terrain: area: Box field: Field water_level: int | None = None edit_limit: int = 2500 def capability(self): return Capability('terrain.field', ('environment', 'ground'), offers=('construction', 'planting'), guarantees=('frozen field inputs', 'actual 3D substrate')) def negotiate(self, ctx, parameters): ports = tuple(Port(k, k, Frame(self.area.lo), self.area, capacity=100000, grant=k) for k in ('construction', 'planting')) grants = (Grant('construction', self.area, ('excavate', 'fill', 'surface'), ('siteworks', 'path', 'pool'), self.edit_limit), Grant('planting', self.area, ('plant',), ('plant',), 0)) return Contract(self.area, ports, grants, decisions={'expression': self.field.expression(), 'water': self.water_level, 'edit_limit': self.edit_limit}) def realize(self, ctx, contract): plan = Plan() x0, bottom, z0 = self.area.lo x1, top, z1 = self.area.hi for x in range(x0, x1 + 1): for z in range(z0, z1 + 1): height = math.floor(self.field(x, z)) if not bottom <= height < top: raise ValueError(f'Terrain field exceeds negotiated vertical domain at {(x,z)}') for y in range(bottom, height + 1): material = 'stone' if y < height - 2 else ('dirt' if y < height else 'grass_block') if self.water_level is not None and height < self.water_level: material = 'gravel' if y == height else material plan.block((x, y, z), state_of(material), 'strata') if self.water_level is not None: for y in range(height + 1, self.water_level + 1): plan.block((x, y, z), state_of('water', level='0'), 'water-volume') return plan
hearth/environment/__init__.py
# Public environment operations. from .fields import Field, constant, gradient, radial, wave from .terrain import Terrain
hearth/components/primitives.py
# Small architectural components with executable contracts. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import AIR, state_of, log, leaves, name_of from hearth.kernel import Capability, Contract, Domain, Grant, Port, Rule, Plan, Child, Binding, ContractError @dataclass(frozen=True) class Volume: box: Box material: str role: str = 'masonry' def capability(self): return Capability('volume.' + self.role, (self.role,)) def negotiate(self, ctx, parameters): return Contract(self.box) def realize(self, ctx, contract): plan = Plan() plan.fill(self.box, self.material) return plan @dataclass(frozen=True) class Grass: tall: bool = False def capability(self): return Capability('plant.grass', ('plant',), offers=('replacement',), assumptions=('substrate',)) def negotiate(self, ctx, parameters): box = Box((0, 0, 0), (0, int(self.tall), 0)) return Contract(box, (Port('replacement', 'planting', Frame(), box, grant='replace'),), (Grant('replace', box, ('plant',), ('tree',), 2, True),), (Rule('support', ((0, -1, 0),)),), atomic_object=True) def realize(self, ctx, contract): plan = Plan() if self.tall: for y, half in enumerate(('lower', 'upper')): plan.block((0, y, 0), state_of('tall_grass', half=half)) else: plan.block((0, 0, 0), state_of('short_grass')) return plan @dataclass(frozen=True) class Tree: height: int = 10 radius: int = 3 def capability(self): return Capability('plant.conifer', ('plant', 'tree'), {'height': Domain(5, 18), 'radius': Domain(1, 4)}, assumptions=('substrate',), adaptations=('prune canopy against obstacles within accepted radius',), version='2') def negotiate(self, ctx, parameters): h, r = parameters.get('height', self.height), parameters.get('radius', self.radius) if not 5 <= h <= 18 or not 1 <= r <= 4: raise ContractError('tree-domain', ctx.path) return Contract(Box((-r, 0, -r), (r, h, r)), rules=(Rule('support', ((0, -1, 0),)), Rule('expected', ((0, 0, 0),), data={'names': ['spruce_log']})), decisions={'height': h, 'radius': r}, reads=(Box((-r, -1, -r), (r, h, r)),)) def realize(self, ctx, contract): p = Plan() h = contract.decisions['height'] radius = contract.decisions['radius'] for y in range(h): p.block((0, y, 0), log()) from math import ceil # Each branch tier tapers over two layers, separated by exposed trunk. # Radius follows remaining crown height, preserving a pointed silhouette. layers = {h: 0, h - 1: 1} for base in range(3, h, 3): r = min(radius, ceil(radius * (h - base) / max(1, h - 3))) layers[base] = r if base + 1 < h: layers[base + 1] = max(0, r - 1) for y, r in sorted(layers.items()): for x in range(-r, r + 1): for z in range(-r, r + 1): if abs(x) + abs(z) > r or (x == 0 and z == 0 and y < h): continue q = ctx.world((x, y, z)) if ctx.view.domain and not ctx.view.domain.contains(q): continue if name_of(ctx.view.state(q)) == 'air': p.block((x, y, z), leaves()) return p @dataclass(frozen=True) class Wall: width: int = 9 height: int = 5 thickness: int = 1 infill: str | None = None timber: str = 'stripped_spruce' def capability(self): return Capability('wall.framed', ('wall', 'enclosure'), offers=('window', 'door'), assumptions=('floor below',), guarantees=('frame preserved', 'sealed infill'), inputs={'width': Domain(5, 64), 'height': Domain(4, 12), 'thickness': Domain(1, 3), 'frame.turn': Domain(choices=(0, 1, 2, 3))}, locked=('width', 'height', 'thickness', 'infill')) def negotiate(self, ctx, parameters): w, h, t = self.width, self.height, self.thickness if not 5 <= w <= 64 or not 4 <= h <= 12 or not 1 <= t <= 3: raise ContractError('wall-domain', ctx.path) box = Box((0, 0, 0), (w - 1, h - 1, t - 1)) install = Box((1, 0, 0), (w - 2, h - 2, t - 1)) ports = (Port('infill', 'wall-installation', Frame((1, 0, 0)), install, 20, 'install', 1, {'thickness': t, 'sill': 1, 'margin': 1}),) grants = (Grant('install', install, ('install',), ('window', 'door'), w * h * t),) boundary = tuple(box.cells()) frame = tuple((x, y, z) for x in (0, w - 1) for y in range(-1, h) for z in range(t)) return Contract(box, ports, grants, (Rule('support', frame), Rule('sealed', boundary, phase='complete')), decisions={'width': w, 'height': h, 'thickness': t}) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, self.infill or ctx.view.style['infill']) for x in (0, self.width - 1): p.fill(Box((x, 0, 0), (x, self.height - 1, self.thickness - 1)), log(self.timber)) p.fill(Box((0, self.height - 1, 0), (self.width - 1, self.height - 1, self.thickness - 1)), log(self.timber, 'x')) return p @dataclass(frozen=True) class Window: width: int = 2 height: int = 2 shutters: bool = True glass: str = 'minecraft:glass' planter: bool = False garden_depth: int = 1 def capability(self): return Capability('window.shuttered' if self.shutters else 'window.lattice', ('window', 'sealed-opening'), offers=('daylight', 'window-garden'), adaptations=('depth reveal',), guarantees=('sealed opening', 'frame margins'), version='2') def negotiate(self, ctx, parameters): if not ctx.bindings: raise ContractError('window-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if self.garden_depth not in (1, 2): raise ContractError('window-garden-depth', ctx.path) depth = port.facts['thickness'] box = Box((-1, -1, -self.garden_depth), (self.width, self.height - 1, depth - 1)) inner = Box((0, 0, 0), (self.width - 1, self.height - 1, depth - 1)) if not all(port.region.contains(ctx.world(q)) for q in inner.corners()): raise ContractError('window-margins', ctx.path, ctx.frame.origin, 'Opening crosses excluded framing') garden = Box((-1 if self.garden_depth == 2 else 0, -1, -self.garden_depth), (self.width if self.garden_depth == 2 else self.width - 1, 0, -1)) port = Port('garden', 'window-garden', Frame((0, -1, -1)), garden, 1, 'planting', facts={'width': self.width, 'depth': self.garden_depth}) grant = Grant('planting', garden, ('install',), ('planter',), (self.width + 2) * 4) return Contract(box, ports=(port,), grants=(grant,), rules=(Rule('sealed', tuple(inner.cells())),), decisions={'depth': depth, 'planter': self.planter}) def realize(self, ctx, contract): p = Plan() d = contract.decisions['depth'] for z in range(d): p.fill(Box((0, 0, z), (self.width - 1, self.height - 1, z)), self.glass, 'glazing') if self.shutters: from hearth.blocks import slab for x in (-1, self.width): for y in range(self.height): p.block((x, y, -1), state_of('spruce_trapdoor', facing='north', half='bottom', open='true', powered='false', waterlogged='false'), 'shutters') for x in range(self.width): p.block((x, -1, -1), slab('spruce', 'top'), 'sill') else: for x in range(self.width): p.block((x, self.height - 1, -1), state_of('spruce_trapdoor', facing='north', half='top', open='false', powered='false', waterlogged='false'), 'hood') if self.planter: from .windowbox import WindowBox p.children.append(Child('box', WindowBox(), frame=Frame((0, -1, -1)), bindings=(Binding(ctx.path, 'garden'),))) return p @dataclass(frozen=True) class Pool: width: int = 7 depth: int = 6 def capability(self): return Capability('water.basin', ('pool', 'siteworks'), adaptations=('bounded excavation',), guarantees=('contained water',)) def negotiate(self, ctx, parameters): box = Box((0, -2, 0), (self.width - 1, 0, self.depth - 1)) water = tuple(Box((1, -1, 1), (self.width - 2, 0, self.depth - 2)).cells()) return Contract(box, rules=(Rule('pool', water),), decisions={'excavation_limit': box.volume}) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, state_of('smooth_sandstone'), 'basin') p.fill(Box((1, -1, 1), (self.width - 2, 0, self.depth - 2)), state_of('water', level='0'), 'water') return p @dataclass(frozen=True) class Assembly: name: str envelope: Box children: tuple[Child, ...] rules: tuple[Rule, ...] = () ports: tuple[Port, ...] = () def capability(self): return Capability(self.name, ('composite',)) def negotiate(self, ctx, parameters): return Contract(self.envelope, ports=self.ports, rules=self.rules) def realize(self, ctx, contract): return Plan(children=list(self.children))
hearth/components/__init__.py
# Public architectural components and their explicit intent records. from .building import Blueprint, Building, RoomSpec, adapted from .interior import Room, Light, Furniture, Door, Stair from .primitives import Wall, Window, Tree, Grass, Pool, Assembly from .facades import FacadeDesign from .domestic import DomesticSuite from .windowbox import WindowBox from .borders import GardenPlant, BoundaryPlanting from .ceiling import CeilingTimbers from .lofts import InhabitedRoof, LoftInterior, RoofPlatform
hearth/components/interior.py
# Usable doors, lights and furnished rooms assembled as semantic children. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import state_of, stairs, slab, log from hearth.kernel import Capability, Contract, Domain, Grant, Port, Rule, Plan, Child, Binding, ContractError from .primitives import Volume, Wall, Window from .roofcraft import FlushWindow from .circulation import StairLayout @dataclass(frozen=True) class Door: material: str = 'spruce' def capability(self): return Capability('opening.door', ('door', 'access'), guarantees=('paired halves', 'support', 'operable exit')) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (0, 1, 0)), rules=(Rule('support', ((0, -1, 0),)),), atomic_object=True) def realize(self, ctx, contract): p = Plan() for y, half in enumerate(('lower', 'upper')): p.block((0, y, 0), state_of(self.material + '_door', facing='north', half=half, hinge='left', open='false', powered='false')) return p @dataclass(frozen=True) class Light: hanging: bool = True def capability(self): return Capability('light.lantern', ('light', 'room-light'), guarantees=('actual light source',)) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (0, 1, 0)), rules=(Rule('expected', ((0, 0, 0),), data={'names': ['lantern']}),)) def realize(self, ctx, contract): p = Plan() p.block((0, 0, 0), state_of('lantern', hanging=str(self.hanging).lower(), waterlogged='false')) if self.hanging: p.block((0, 1, 0), state_of('chain', axis='y', waterlogged='false')) return p @dataclass(frozen=True) class Furniture: purpose: str = 'living' width: int = 11 depth: int = 11 def capability(self): return Capability('furniture.' + self.purpose, ('furniture', self.purpose), guarantees=('usable function',)) def negotiate(self, ctx, parameters): if self.purpose not in ('living', 'bedroom', 'workshop', 'library', 'kitchen', 'storage'): raise ContractError('room-function', ctx.path, conditions=self.purpose) return Contract(Box((1, 0, 1), (self.width - 2, 2, self.depth - 2))) def realize(self, ctx, contract): p = Plan() w, d = self.width, self.depth inventory = {'id': 'minecraft:barrel', 'Items': [{'Slot': 0, 'id': 'minecraft:bread', 'count': 6}, {'Slot': 1, 'id': 'minecraft:torch', 'count': 12}]} p.block((1, 0, d - 2), state_of('barrel', facing='north', open='false'), 'supplies', nbt=inventory) if self.purpose == 'bedroom': for z, part in ((2, 'foot'), (3, 'head')): p.block((2, 0, z), state_of('red_bed', facing='south', part=part, occupied='false'), 'bed') p.block((2, 0, d - 3), state_of('bookshelf')) elif self.purpose == 'library': for x in (2, 3, w - 3): for y in range(2): p.block((x, y, d - 2), state_of('bookshelf')) p.block((2, 0, 2), state_of('lectern', facing='south', has_book='false', powered='false')) elif self.purpose == 'workshop': p.block((2, 0, 2), state_of('crafting_table')) p.block((3, 0, 2), state_of('smithing_table')) p.block((2, 0, d - 3), state_of('anvil', facing='north')) elif self.purpose == 'kitchen': p.block((2, 0, 2), state_of('smoker', facing='south', lit='false')) p.block((3, 0, 2), state_of('furnace', facing='south', lit='false')) p.block((2, 0, d - 3), state_of('crafting_table')) else: for z in (2, 3): p.block((2, 0, z), stairs('spruce', 'east'), 'bench') p.block((w - 3, 0, d - 1 - z), stairs('spruce', 'west'), 'bench') p.block((3, 0, 2), state_of('spruce_fence', north='false', south='false', east='false', west='false', waterlogged='false')) p.block((3, 1, 2), state_of('spruce_pressure_plate', powered='false'), 'table') # Rugs avoid the central circulation cross and door landings. for x in (3, 4): for z in (d - 4, d - 3): p.block((x, 0, z), state_of('red_carpet'), 'rug') return p @dataclass(frozen=True) class Stair: rise: int = 6 width: int = 2 def capability(self): return Capability('circulation.stair', ('stairs', 'vertical-access'), guarantees=('walkable flight', 'two-block headroom')) def negotiate(self, ctx, parameters): points = tuple((x, i + 1, i) for i in range(self.rise) for x in range(self.width)) clear = tuple((x, i + k, i) for i in range(self.rise) for x in range(self.width) for k in (1, 2, 3)) support = tuple((x, i, i) for i in range(self.rise) for x in range(self.width)) box = Box((0, 0, -1), (self.width - 1, self.rise + 2, self.rise)) return Contract(box, rules=(Rule('support', support), Rule('clear', clear), Rule('route', points, box, phase='complete'))) def realize(self, ctx, contract): p = Plan() for i in range(self.rise): for x in range(self.width): for y in range(max(0, i - 1), i): p.block((x, y, i), state_of('spruce_planks'), 'stringer') p.block((x, i, i), stairs('spruce', 'south'), 'tread') return p @dataclass(frozen=True) class Room: purpose: str width: int = 11 depth: int = 11 doors: tuple[str, ...] = ('north',) windows: tuple[str, ...] = ('north', 'east', 'south', 'west') upper_open: bool = False stair_up: bool = False stair_down: bool = False window_component: object = None light_component: object = None sheltered_sides: tuple[str, ...] = () flush_sides: tuple[str, ...] = () facade_exclusions: tuple[Box, ...] = () facade_design: object = None occluded_sides: tuple[str, ...] = () stair_axis: str = 'z' def capability(self): return Capability('room.' + self.purpose, ('room', 'habitable', 'composite'), offers=('access', 'ceiling-decoration', 'upper-floor-access'), guarantees=('lit', 'furnished', 'reachable', 'enclosed'), adaptations=('facade grid', 'substitutable windows and lights'), inputs={'stair_axis': Domain(choices=('x', 'z')), 'width': Domain(choices=(9, 11, 13)), 'depth': Domain(choices=(9, 11, 13)), 'purpose': Domain(choices=('living', 'bedroom', 'library', 'workshop', 'kitchen', 'storage'))}, locked=('purpose', 'width', 'depth', 'doors', 'stair_up', 'stair_down', 'stair_axis'), version='3') def negotiate(self, ctx, parameters): w, d = self.width, self.depth stair_layout = StairLayout(w, d, self.stair_axis) aperture_cells = set(stair_layout.slot.cells()) if w not in (9, 11, 13) or d not in (9, 11, 13): raise ContractError('room-domain', ctx.path) doors = {'north': (w // 2, 1, 0), 'south': (w // 2, 1, d - 1), 'west': (0, 1, d // 2), 'east': (w - 1, 1, d // 2)} points = [doors[k] for k in self.doors] + [(w // 2, 1, d // 2)] if not self.doors: points = [(w // 2, 1, d // 2)] interior = Box((1, 1, 1), (w - 2, 5, d - 2)) boundary = [] for x in range(w): for z in range(d): # Upper landing leaves only the required stair slot open. if not (self.stair_down and (x, 0, z) in aperture_cells): boundary.append((x, 0, z)) if not (self.stair_up and (x, 0, z) in aperture_cells): boundary.append((x, 6, z)) function = {'bedroom': [['red_bed'], ['barrel']], 'workshop': [['crafting_table'], ['smithing_table']], 'library': [['bookshelf'], ['lectern']], 'kitchen': [['smoker'], ['furnace']], 'living': [['spruce_stairs'], ['barrel']], 'storage': [['barrel']]} rules = (Rule('route', tuple(points), Box((0, 1, 0), (w - 1, 8, d - 1)), phase='complete'), Rule('light', tuple(points), Box((0, 1, 0), (w - 1, 5, d - 1)), {'minimum': 1}, 'complete'), Rule('furnishing', box=interior, data={'groups': function[self.purpose]}, phase='complete'), Rule('sealed', tuple(boundary), phase='complete')) ports = tuple(Port(side, 'access', Frame(p), Box(p, (p[0], p[1] + 1, p[2])), 10) for side, p in doors.items() if side in self.doors) ceiling = Box((0, 5, 0), (w - 1, 5, d - 1)) ports += (Port('ceiling', 'ceiling-decoration', Frame((0, 5, 0)), ceiling, 4, 'ceiling-mount', facts={'width': w, 'depth': d, 'projection': 1, 'replace_limit': 0}),) if self.stair_up: slot = stair_layout.slot aperture = Box((slot.lo[0], 6, slot.lo[2]), (slot.hi[0], 8, slot.hi[2])) ports += (Port('upper-floor', 'upper-floor-access', Frame((0, 6, 0)), aperture, 1, facts={'landing': stair_layout.landing, 'floor_plane': 0, 'headroom': 3, 'coordinate_space': 'port-local', 'axis': self.stair_axis}),) grants = (Grant('ceiling-mount', ceiling, ('install',), ('ceiling-trim',), 0),) projection = 2 if self.facade_design and self.facade_design.planters else 1 return Contract(Box((-projection, 0, -projection), (w - 1 + projection, 9, d - 1 + projection)), ports=ports, grants=grants, rules=rules, decisions={'purpose': self.purpose, 'doors': self.doors, 'windows': self.windows, 'stair_up': self.stair_up, 'stair_down': self.stair_down, 'stair_axis': self.stair_axis, 'flush_sides': self.flush_sides, 'sheltered_sides': self.sheltered_sides, 'facade_exclusions': [(b.lo, b.hi) for b in self.facade_exclusions], 'facade_projection': projection, 'omitted_optional_facades': {s: 'conservative lower roof envelope' for s in self.occluded_sides}}) def realize(self, ctx, contract): w, d = self.width, self.depth stair_layout = StairLayout(w, d, self.stair_axis) aperture_cells = set(stair_layout.slot.cells()) p = Plan() floor = Plan() for x in range(w): for z in range(d): if not (self.stair_down and (x, 0, z) in aperture_cells): floor.block((x, 0, z), state_of('dark_oak_planks' if x in (1, w - 2) or z in (1, d - 2) else 'spruce_planks')) p.children.append(Child('floor', Pattern('floor', Box((0, 0, 0), (w - 1, 0, d - 1)), tuple(floor.writes)))) if not self.upper_open: p.children.append(Child('ceiling', Volume(Box((0, 6, 0), (w - 1, 6, d - 1)), state_of('spruce_planks'), 'ceiling'))) walls = {'north': (Frame((0, 1, 0)), w), 'south': (Frame((w - 1, 1, d - 1), 2), w), 'east': (Frame((w - 1, 1, 1), 1), d - 2), 'west': (Frame((0, 1, d - 2), 3), d - 2)} for side, (frame, length) in walls.items(): wallpath = ctx.path + '/wall-' + side p.children.append(Child('wall-' + side, Wall(length, 5), frame=frame)) if side in self.doors: at = frame.compose(Frame((length // 2, 0, 0))) p.children.append(Child('door-' + side, Door(), frame=at, bindings=(Binding(wallpath, 'infill'),))) if side in self.windows: from .facades import FacadeDesign layout = self.facade_design or FacadeDesign(height=2, sill=2, planters=False) for i, opening in enumerate(layout.openings(length, frame, side in self.doors, self.facade_exclusions)): at = frame.compose(Frame(opening['at'])) flush = opening['flush'] or side in self.flush_sides window = self.window_component or (FlushWindow(opening['width'], opening['height']) if flush else Window(opening['width'], opening['height'], planter=layout.planters, garden_depth=2 if layout.planters else 1)) p.children.append(Child(f'window-{side}-{i}', window, frame=at, bindings=(Binding(wallpath, 'infill'),))) from .joinery import FacadeRelief for side, (frame, length) in walls.items(): if side in self.windows and side not in self.sheltered_sides and side not in self.flush_sides: from .facades import local_exclusions p.children.append(Child('joinery-' + side, FacadeRelief(length, access=side in self.doors, exclusions=local_exclusions(self.facade_exclusions, frame)), frame=frame, bindings=(Binding(ctx.path + '/wall-' + side, 'infill', 'connect'),))) from .furnishing import FurnishingLayout p.children.append(Child('furniture', FurnishingLayout(self.purpose, stair_layout.span, stair_layout.length, self.stair_up or self.stair_down), frame=stair_layout.frame.compose(Frame((0, 1, 0))))) for i, (x, z) in enumerate(((2, stair_layout.length - 3), (stair_layout.span - 3, 2))): if self.stair_up and i == 1: x = stair_layout.span // 2 p.children.append(Child(f'light-{i}', self.light_component or Light(), frame=stair_layout.frame.compose(Frame((x, 4, z))))) from .landscape import FacadeGarden p.children.append(Child('facade-garden', FacadeGarden(w, d, tuple(s for s in self.windows if s not in self.doors and s not in self.sheltered_sides and s not in self.flush_sides), self.facade_exclusions))) if self.stair_up: p.children.append(Child('stairs', Stair(), frame=stair_layout.flight)) return p @dataclass(frozen=True) class Pattern: role: str envelope: Box writes: tuple def capability(self): return Capability('surface.' + self.role, (self.role,)) def negotiate(self, ctx, parameters): return Contract(self.envelope) def realize(self, ctx, contract): return Plan(writes=list(self.writes))
hearth/components/roofs.py
# Pitched roof surfaces and open porch attachments with explicit overlap policy. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import state_of, stairs, slab, log, name_of from hearth.kernel import Capability, Contract, Grant, Port, Rule, Plan, Child, Domain from .interior import Light from .primitives import Window @dataclass(frozen=True) class Roof: width: int depth: int axis: str = 'z' material: str = 'deepslate_tile' steep: bool = True def capability(self): return Capability('roof.gable', ('roof', 'enclosure'), offers=('junction',), adaptations=('abut taller wall', 'merge shared eaves'), guarantees=('pitched weather skin',)) def negotiate(self, ctx, parameters): span = self.width if self.axis == 'z' else self.depth height = (span + 2) // 2 + 2 box = Box((-1, -1, -1), (self.width, height, self.depth)) return Contract(box, (Port('junction', 'roof-seam', Frame(), box, 100, 'junction'),), (Grant('junction', box, ('join',), ('roof',), box.volume),), decisions={'axis': self.axis, 'span': span, 'steep': self.steep, 'material': self.material}) def realize(self, ctx, contract): p = Plan() w, d = self.width, self.depth span = w if self.axis == 'z' else d length = d if self.axis == 'z' else w for cross in range(-1, span + 1): step = min(cross + 1, span - cross) y = step if self.steep else (step + 1) // 2 face = ('east' if cross < span / 2 else 'west') if self.axis == 'z' else ('south' if cross < span / 2 else 'north') for along in range(-1, length + 1): x, z = (cross, along) if self.axis == 'z' else (along, cross) q = ctx.world((x, y, z)) existing = name_of(ctx.view.state(q)) if existing != 'air': # Negotiated abutment is only to actual masonry/roof boundaries. continue trim = along in (-1, length) material = 'dark_oak' if trim else self.material p.block((x, y, z), stairs(material, face), 'roof-course') for end in (0, length - 1): frame = Frame((0, 0, end)) if self.axis == 'z' else Frame((end, 0, span - 1), 3) p.children.append(Child(f'gable-{end}', Gable(span, self.steep), frame=frame)) for cross in (-1, span): for along in range(length): x, z = (cross, along) if self.axis == 'z' else (along, cross) if name_of(ctx.view.state(ctx.world((x, -1, z)))) == 'air': p.block((x, -1, z), slab('spruce', 'top'), 'eave') mid = span // 2 peak = min(mid + 1, span - mid) if self.steep else (min(mid + 1, span - mid) + 1) // 2 for along in range(-1, length + 1): x, z = (mid, along) if self.axis == 'z' else (along, mid) if name_of(ctx.view.state(ctx.world((x, peak + 1, z)))) == 'air': p.block((x, peak + 1, z), slab('dark_oak'), 'ridge') for along in (-1, length): x, z = (mid, along) if self.axis == 'z' else (along, mid) if name_of(ctx.view.state(ctx.world((x, peak + 2, z)))) == 'air': p.block((x, peak + 2, z), state_of('dark_oak_fence', north='false', south='false', east='false', west='false', waterlogged='false'), 'finial') return p @dataclass(frozen=True) class Porch: width: int depth: int = 3 balcony: bool = False rail_material: str = 'spruce' entrance_x: int | None = None maximum_post_span: int = 12 def capability(self): return Capability('attachment.porch', ('attachment', 'access', 'composite'), inputs={'width': Domain(9, None), 'maximum_post_span': Domain(6, 12)}, offers=('access',), guarantees=('sheltered access', 'bounded beam spans', 'supported canopy', 'usable upper terrace when requested')) def negotiate(self, ctx, parameters): if not 3 <= self.depth <= 5 or self.rail_material not in ('spruce', 'dark_oak'): from hearth import ContractError raise ContractError('porch-depth', ctx.path) center = self.width // 2 if self.entrance_x is None else self.entrance_x if not 2 <= center <= self.width - 3: from hearth import ContractError raise ContractError('porch-entrance-margin', ctx.path) spans = (self.width - 2) // self.maximum_post_span + 1 columns = [0, self.width - 1] for i in range(1, spans): target = round((self.width - 1) * i / spans) candidates = [x for x in range(2, self.width - 2) if abs(x - center) > 1 and all(abs(x - old) >= 3 for old in columns)] if candidates: columns.append(min(candidates, key=lambda x: (abs(x - target), x))) columns.sort() if any(b - a > self.maximum_post_span for a, b in zip(columns, columns[1:])): from hearth import ContractError raise ContractError('porch-post-spacing', ctx.path) clear = tuple((x, y, z) for x in range(center - 1, center + 2) for y in (1, 2) for z in range(-self.depth, 0)) support = tuple((x, y, -self.depth) for x in columns for y in range(6)) + tuple((x, 5, 0) for x in (0, self.width - 1)) rules = [Rule('clear', clear), Rule('support', support), Rule('route', ((center, 1, -1), (center, 1, -self.depth)), Box((0, 0, -self.depth), (self.width - 1, 3, 0)), phase='complete')] if self.balcony: guards = tuple((x, 7, -self.depth) for x in range(self.width)) + tuple((x, 7, z) for x in (0, self.width - 1) for z in range(-self.depth + 1, 0)) rules += [Rule('expected', guards, data={'names': [self.rail_material + '_fence']}), Rule('support', tuple((x, 6, z) for x in range(self.width) for z in range(-self.depth, 0)))] rules += [Rule('clear', tuple((center, y, z) for y in (7, 8) for z in range(-self.depth + 1, 1))), Rule('route', ((center, 7, 0), (center, 7, -self.depth + 1)), Box((0, 6, -self.depth), (self.width - 1, 9, 0)), phase='complete')] seats = [(x, 1, z, facing) for x, facing in ((1, 'east'), (self.width - 2, 'west')) for z in (-2,) if self.depth >= 4 and name_of(ctx.state((x, 1, z))) == 'air'] access = (center, 1, -self.depth) return Contract(Box((0, 0, -self.depth), (self.width - 1, 9, -1)), ports=(Port('front', 'access', Frame(access), Box(access, (center, 2, -self.depth)), 4),), rules=tuple(rules), decisions={'balcony': self.balcony, 'depth': self.depth, 'width': self.width, 'entrance_x': center, 'columns': columns, 'maximum_post_span': self.maximum_post_span, 'seats': seats, 'omitted_optional_seats': (2 if self.depth >= 4 else 0) - len(seats)}) def realize(self, ctx, contract): p = Plan() w, d = self.width, self.depth columns = contract.decisions['columns'] center = contract.decisions['entrance_x'] p.fill(Box((0, 0, -d), (w - 1, 0, -1)), state_of('spruce_planks'), 'deck') for x in columns: for z in (-d,): p.block((x, 1, z), state_of('stone_bricks'), 'post-shoe') p.fill(Box((x, 2, z), (x, 5, z)), log(), 'post') for x in range(w): p.block((x, 5, -d), log('spruce', 'x'), 'front-beam') if self.balcony: for z in range(-d, 0): p.block((x, 6, z), state_of('spruce_planks'), 'balcony-deck') else: for z in range(-d, 0): y = 6 + (z + d) // 3 p.block((x, y, z), stairs('deepslate_tile', 'south'), 'canopy') for column in columns: for x, facing in ((column + 1, 'east'), (column - 1, 'west')): if 0 <= x < w: p.block((x, 4, -d), stairs('spruce', facing, half='top'), 'brace') rails = [] for x in range(w): if abs(x - center) > 1: rails.append((x, 1, -d)) for x in (0, w - 1): rails.extend((x, 1, z) for z in range(-d + 1, -1)) if self.balcony: rails.extend((x, 7, -d) for x in range(w)) rails.extend((x, 7, z) for x in (0, w - 1) for z in range(-d + 1, 0)) rail_points = set(rails) neighbors = {'north': (0, 0, -1), 'south': (0, 0, 1), 'east': (1, 0, 0), 'west': (-1, 0, 0)} for x, y, z in rails: if (x in columns and y == 1 and z == -d): continue connections = {side: str((x + dx, y + dy, z + dz) in rail_points).lower() for side, (dx, dy, dz) in neighbors.items()} p.block((x, y, z), state_of(self.rail_material + '_fence', waterlogged='false', **connections), 'balustrade') for x in (1, w - 2): p.children.append(Child('lantern-' + str(x), Light(), frame=Frame((x, 3, -d + 1)))) for x, y, z, facing in contract.decisions['seats']: p.block((x, y, z), stairs('spruce', facing), 'porch-seat') return p @dataclass(frozen=True) class Gable: span: int steep: bool = True def capability(self): return Capability('wall.gable', ('wall', 'enclosure'), offers=('window',), adaptations=('abut existing upper wall',)) def negotiate(self, ctx, parameters): height = (self.span + 1) // 2 region = Box((1, 0, 0), (self.span - 2, height - 2, 0)) box = Box((0, -1, -1), (self.span - 1, height - 1, 0)) return Contract(box, (Port('infill', 'wall-installation', Frame((1, 0, 0)), region, 4, 'install', facts={'thickness': 1}),), (Grant('install', region, ('install',), ('window',), 30),)) def realize(self, ctx, contract): p = Plan() for x in range(self.span): step = min(x + 1, self.span - x) y = step if self.steep else (step + 1) // 2 for yy in range(y): if name_of(ctx.view.state(ctx.world((x, yy, 0)))) == 'air': p.block((x, yy, 0), log('spruce') if x in (0, self.span // 2, self.span - 1) else state_of('smooth_sandstone'), 'gable-infill') available = {w.point for w in p.writes} at = (self.span // 2 - 1, 0, 0) if self.steep and all((at[0] + x, y, 0) in available for x in range(2) for y in (0, 1)) and all(name_of(ctx.view.state(ctx.world((at[0] + x, 1, -1)))) == 'air' for x in range(2)): from hearth.kernel import Binding p.children.append(Child('window', Window(2, 2, False), frame=Frame(at), bindings=(Binding(ctx.path, 'infill'),))) return p
hearth/components/building.py
# Room-graph building composition and shared facade/roof planning. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.kernel import Capability, Contract, Domain, Port, Plan, Child, Choice, Binding, Rule, ContractError from hearth.adapters.site import survey, Foundation, Approach, SiteLimits from .interior import Room from .roofs import Roof, Porch @dataclass(frozen=True) class RoomSpec: x: int z: int level: int purpose: str @dataclass(frozen=True) class Blueprint: rooms: tuple[RoomSpec, ...] bay: int = 11 porch: bool = True roof_axis: str = 'auto' roof_material: str = 'deepslate_tile' steep: bool = True window_component: object = None light_component: object = None roof_design: object = None porch_depth: int = 3 balcony: bool = False chimney: bool = False facade_design: object = None rail_material: str = 'spruce' attic_purpose: str | None = None porch_bays: int = 1 def normalized(self): return tuple(sorted(self.rooms, key=lambda r: (r.level, r.z, r.x, r.purpose))) @property def footprint(self): return tuple(sorted((r.x * self.bay + x, r.z * self.bay + z) for r in self.rooms if r.level == 0 for x in range(self.bay) for z in range(self.bay))) @property def chimney_anchor(self): back = max(r.z for r in self.rooms if r.level == 0) column = min(r.x for r in self.rooms if r.level == 0 and r.z == back) return (column * self.bay + self.bay // 2 - 1, (back + 1) * self.bay) @property def contact_footprint(self): cells = set(self.footprint) if self.porch: cells |= {(x, z) for x in range(self.bay * self.porch_bays) for z in range(-self.porch_depth, 0)} if self.chimney: cx, cz = self.chimney_anchor cells |= {(cx + x, cz + z) for x in range(3) for z in range(2)} return tuple(sorted(cells)) def validate(self): cells = {(r.x, r.z, r.level) for r in self.rooms} if len(cells) != len(self.rooms) or (0, 0, 0) not in cells or min(min(r.x, r.z, r.level) for r in self.rooms) < 0: raise ValueError('Unique nonnegative rooms and entrance room (0,0,0) required') if self.bay not in (9, 11, 13): raise ValueError('Supported room bays: 9, 11, 13') if not 3 <= self.porch_depth <= 5: raise ValueError('Porch depth must be 3..5') if self.porch_bays < 1 or not isinstance(self.porch_bays, int): raise ValueError('Porch bays must be a positive integer') if self.porch and any((x, 0, 0) not in cells for x in range(self.porch_bays)): raise ValueError('Porch bays require contiguous front rooms') if self.rail_material not in ('spruce', 'dark_oak'): raise ValueError('Rail material must be spruce or dark_oak') if self.attic_purpose not in (None, 'bedroom', 'library', 'storage'): raise ValueError('Attic purpose must be bedroom, library, storage or None') if self.attic_purpose is not None and self.roof_design is None: raise ValueError('Habitable attics require an explicit roof policy with roof-interior capability') if self.balcony and (not self.porch or (0, 0, 1) not in cells): raise ValueError('Balcony requires porch and front upper room') if self.balcony and any((x, 0, 1) not in cells for x in range(self.porch_bays)): raise ValueError('Balcony requires an upper room behind each porch bay') for x, z, level in cells: if level and (x, z, level - 1) not in cells: raise ValueError('Upper rooms require a supporting lower room') reached = {(0, 0, 0)} while True: more = {p for p in cells if any(sum(abs(a - b) for a, b in zip(p, q)) == 1 for q in reached)} if more <= reached: break reached |= more if reached != cells: raise ValueError('Room adjacency graph disconnected') def roof_runs(rooms, preferred_axis='auto'): """Partition exposed room tops into contiguous runs with explicit ridge axes.""" cells = {(r.x, r.z, r.level) for r in rooms} top = {q for q in cells if (q[0], q[1], q[2] + 1) not in cells} groups = [] while top: x, z, level = min(top, key=lambda v: (v[2], v[1], v[0])) axis = preferred_axis if axis == 'auto': axis = 'x' if (x + 1, z, level) in top else 'z' run = [(x, z, level)] while (run[-1][0] + (axis == 'x'), run[-1][1] + (axis == 'z'), level) in top: run.append((run[-1][0] + (axis == 'x'), run[-1][1] + (axis == 'z'), level)) top -= set(run) groups.append((x, z, level, axis, len(run))) return tuple(groups) @dataclass(frozen=True) class Building: design: Blueprint terrain: str site_limits: SiteLimits = SiteLimits() support_strategy: str | None = None def capability(self): return Capability('building.rooms', ('building', 'habitable', 'composite'), offers=('entrance', 'street', 'attachment', 'footprint-boundary'), assumptions=('known ground', 'bounded relief'), adaptations=('foundation', 'approach', 'roof junction'), guarantees=('locked room graph', 'internal reachability', 'furnishing', 'lighting'), inputs={'design.bay': Domain(choices=(9, 11, 13)), 'room_graph': 'connected integer grid with supported levels', 'relief_limit': self.site_limits.relief, 'support_height_limit': self.site_limits.support_height, 'frame.turn': Domain(choices=(0, 1, 2, 3))}, locked=('design.rooms', 'design.bay', 'design.roof_axis', 'design.porch', 'design.attic_purpose', 'design.porch_bays', 'frame.x', 'frame.z'), version='3') def negotiate(self, ctx, parameters): self.design.validate() b = self.design.bay rooms = self.design.normalized() measured = survey(ctx, self.design.contact_footprint, self.site_limits) if self.support_strategy is not None: if self.support_strategy not in measured['feasible_strategies']: raise ContractError('contact-strategy', ctx.path, ctx.frame.origin, 'Requested strategy incompatible with measured water/relief') measured['strategy'] = self.support_strategy floor = measured['floor'] height = max(r.level for r in rooms) * 6 width = (max(r.x for r in rooms) + 1) * b depth = (max(r.z for r in rooms) + 1) * b minimum = min(v[0] for v in measured['samples'].values()) front = self.site_limits.approach_length + (self.design.porch_depth if self.design.porch else 0) projection = 2 if self.design.facade_design and self.design.facade_design.planters else 1 box = Box((-projection, min(minimum - self.site_limits.bed_thickness + 1, 0), -front), (width - 1 + projection, floor + height + b + 16, depth + (3 if self.design.chimney else projection - 1))) points = tuple((r.x * b + b // 2, floor + r.level * 6 + 1, r.z * b + b // 2) for r in rooms) if self.design.attic_purpose is not None: points += tuple((x * b + b * (length if axis == 'x' else 1) // 2, floor + level * 6 + 7, z * b + b * (length if axis == 'z' else 1) // 2) for x, z, level, axis, length in roof_runs(rooms, self.design.roof_axis)) entrance = (b // 2, floor + 1, 0) route = Rule('route', (entrance,) + points, box, phase='complete') port = Port('entrance', 'access', Frame(entrance), Box(entrance, (entrance[0], entrance[1] + 1, entrance[2])), 10) decisions = {'floor': floor, 'relief': measured['relief'], 'wet': measured['wet'], 'foundation': measured['strategy'], 'rooms': [(r.x, r.z, r.level, r.purpose) for r in rooms], 'bay': b, 'roof_axis': self.design.roof_axis, 'porch': self.design.porch, 'roof_material': self.design.roof_material, 'steep': self.design.steep, 'balcony': self.design.balcony, 'porch_depth': self.design.porch_depth, 'chimney': self.design.chimney, 'attic_purpose': self.design.attic_purpose, 'porch_bays': self.design.porch_bays} approach = Approach(b // 2, floor, self.design.porch_depth if self.design.porch else 0, self.site_limits).negotiate(ctx, {}) access = approach.ports[0] route = Rule('route', (entrance,) + points + (access.frame.origin,), box, phase='complete') street = Port('street', access.kind, access.frame, access.region, access.capacity, facts={'external_connection_required': True}, delegate=('approach', 'street')) footprint = set(self.design.contact_footprint) edge = tuple((x, 0, z) for x, z in sorted(footprint) if any((x + dx, z + dz) not in footprint for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1)))) boundary = Port('garden-edge', 'footprint-boundary', Frame(), Box.enclosing(edge), 100, facts={'outline': edge, 'coordinate_space': 'port-local', 'planting_authority': 'requires terrain planting binding'}) return Contract(box, ports=(port, street, boundary), rules=(route,), decisions=decisions, reads=(Box((0, minimum, 0), (width - 1, floor, depth - 1)),)) def realize(self, ctx, contract): p = Plan() b = self.design.bay floor = contract.decisions['floor'] rooms = self.design.normalized() cells = {(r.x, r.z, r.level) for r in rooms} groups = roof_runs(rooms, self.design.roof_axis) roof_axes = {(x + i * (axis == 'x'), z + i * (axis == 'z'), level): axis for x, z, level, axis, length in groups for i in range(length)} peak = max(self.design.roof_design.heights(b)) if self.design.roof_design else ((b + 1) // 2 if self.design.steep else ((b + 1) // 2 + 1) // 2) p.children.append(Child('foundation', Foundation(self.design.contact_footprint, floor, contract.decisions['foundation'], self.site_limits), bindings=(Binding(self.terrain, 'construction', 'fill', ctx.frame.box(contract.envelope)),))) # A spanning tree of vertical access: one flight per upper horizontal component. stair_columns = set() attic_columns = {(x, z, level) for x, z, level, _, _ in groups} if self.design.attic_purpose else set() for level in sorted({r.level for r in rooms if r.level}): remaining = {(x, z) for x, z, l in cells if l == level} while remaining: seed = min(remaining) connected = {seed} while True: expanded = {v for v in remaining if any(abs(v[0] - q[0]) + abs(v[1] - q[1]) == 1 for q in connected)} if expanded <= connected: break connected |= expanded root = min(connected) stair_columns.add((root[0], root[1], level - 1)) remaining -= connected stair_columns |= attic_columns stair_axes = {(x, z): axis for x, z, _, axis, _ in groups} if self.design.attic_purpose else {} for r in rooms: adjacent = {'north': (r.x, r.z - 1, r.level), 'south': (r.x, r.z + 1, r.level), 'west': (r.x - 1, r.z, r.level), 'east': (r.x + 1, r.z, r.level)} doors = tuple(side for side, q in adjacent.items() if q in cells or (side == 'north' and (r.x, r.z, r.level) in ({(0, 0, 0), (0, 0, 1)} if self.design.balcony else {(0, 0, 0)}))) # A steep roof can reach more than one storey of its neighbor. Use # every lower roof's public height profile, not a level-1 shortcut. contacts = {side: [(lower, axis) for (rx, rz, lower), axis in roof_axes.items() if (rx, rz) == (x, z) and lower < r.level and lower * 6 + 7 + peak >= r.level * 6 + 1] for side, (x, z, _) in adjacent.items()} abutments = {side for side, roofs in contacts.items() if any(axis == ('z' if side in ('north', 'south') else 'x') for _, axis in roofs)} windows = tuple(side for side, q in adjacent.items() if q not in cells and side not in abutments) exclusions = () if self.design.chimney: cx, cz = self.design.chimney_anchor exclusions = (Box((cx - r.x * b, 0, cz - r.z * b - 1), (cx - r.x * b + 2, 9, cz - r.z * b + 1)),) key = f'room-{r.x}-{r.z}-{r.level}' flush = tuple(side for side, roofs in contacts.items() if roofs) if self.design.porch and r.x < self.design.porch_bays and (r.z, r.level) == (0, 1): flush = tuple(sorted(set(flush) | {'north'})) room = Room(r.purpose, b, b, doors=doors, windows=windows, upper_open=(r.x, r.z, r.level + 1) in cells or self.design.attic_purpose is not None and (r.x, r.z, r.level) in roof_axes, stair_up=(r.x, r.z, r.level) in stair_columns, stair_down=(r.x, r.z, r.level - 1) in stair_columns, window_component=self.design.window_component, light_component=self.design.light_component, sheltered_sides=('north',) if self.design.porch and r.x < self.design.porch_bays and r.z == 0 and r.level <= 1 else (), flush_sides=flush, facade_exclusions=exclusions, facade_design=self.design.facade_design, occluded_sides=tuple(sorted(abutments)), stair_axis=stair_axes.get((r.x, r.z), 'z')) p.children.append(Child(key, room, frame=Frame((r.x * b, floor + r.level * 6, r.z * b)))) from .ceiling import CeilingTimbers ceiling_children = [] for r in rooms: key = f'room-{r.x}-{r.z}-{r.level}' ceiling_children.append(Child('ceiling-' + key, CeilingTimbers(), frame=Frame((r.x * b, floor + r.level * 6 + 5, r.z * b)), bindings=(Binding(ctx.path + '/' + key, 'ceiling'),))) if not self.design.attic_purpose: p.children.extend(ceiling_children) if self.design.porch: p.children.append(Child('porch', Porch(b * self.design.porch_bays, self.design.porch_depth, self.design.balcony, self.design.rail_material, b // 2), frame=Frame((0, floor, 0)), bindings=(Binding(ctx.path + '/room-0-0-0', 'north', 'connect'),))) p.children.append(Child('approach', Approach(b // 2, floor, self.design.porch_depth if self.design.porch else 0, self.site_limits), bindings=(Binding(self.terrain, 'construction', 'surface', ctx.frame.box(contract.envelope)),))) if self.design.chimney: from .masonry import Chimney from hearth.adapters.bearing import BearingCourse cx, cz = self.design.chimney_anchor level = max(r.level for r in rooms if (r.x * b + b // 2 - 1, (r.z + 1) * b) == (cx, cz)) peak = max(self.design.roof_design.heights(b)) if self.design.roof_design else (b + 1) // 2 # The cap and flues finish three cells above the measured ridge. stack_height = level * 6 + 7 + peak + 1 p.children.append(Child('chimney-bearing', BearingCourse(3, 2), frame=Frame((cx, floor - 1, cz)), bindings=(Binding(self.terrain, 'construction', 'fill'),))) p.children.append(Child('chimney', Chimney(stack_height), frame=Frame((cx, floor, cz)))) # Roof and facade planners use the same public run partition. if self.design.attic_purpose: from .lofts import RoofPlatform for i, (x, z, l, axis, length) in enumerate(groups): w = b * (length if axis == 'x' else 1) d = b * (length if axis == 'z' else 1) p.children.append(Child(f'roof-floor-{i}', RoofPlatform(w, d, axis), frame=Frame((x * b, floor + l * 6 + 6, z * b)), bindings=(Binding(ctx.path + f'/room-{x}-{z}-{l}', 'upper-floor', 'connect'),))) roof_order = list(enumerate(groups)) if self.design.attic_purpose: # Establish the taller structural gables before lower ornamental ends. # The lower covering can then negotiate against their actual solids. roof_order.sort(key=lambda item: (-item[1][2], item[0])) for i, (x, z, l, axis, length) in roof_order: w = b * (length if axis == 'x' else 1) d = b * (length if axis == 'z' else 1) if self.design.attic_purpose: from .lofts import InhabitedRoof cover = InhabitedRoof(w, d, axis, self.design.roof_material, self.design.roof_design, self.design.attic_purpose) p.children.append(Child(f'roof-{i}', cover, frame=Frame((x * b, floor + l * 6 + 6, z * b)), bindings=(Binding(ctx.path + f'/roof-floor-{i}', 'seat', 'connect'),))) else: cover = self.design.roof_design.component(w, d, axis, self.design.roof_material) if self.design.roof_design else Roof(w, d, axis, self.design.roof_material, self.design.steep) p.children.append(Child(f'roof-{i}', cover, frame=Frame((x * b, floor + l * 6 + 7, z * b)))) if self.design.attic_purpose: p.children.extend(ceiling_children) return p def contact_quality(view, path): """Score actual candidate sitework plus exposed-support proportions.""" facts = view.contract(path).decisions cost = view.cost(path, 'siteworks') exposure = 0.4 if facts['foundation'] == 'piers' and not facts['wet'] and facts['relief'] < 2 else 0 return cost['occupied'] / 100 + cost['replaced'] / 50 + exposure def adapted(key, design, terrain, frame=Frame(), limits=SiteLimits()): """Compare complete bounded support alternatives with the principal design locked.""" candidates = tuple(Child(key, Building(design, terrain, limits, strategy), frame=frame) for strategy in ('stepped', 'piers')) return Choice(key, candidates, contact_quality)
hearth/components/constraints.py
# Reusable hard preservation and clearance components. from dataclasses import dataclass from hearth.kernel import Capability, Contract, Plan, Rule from hearth.space import Box @dataclass(frozen=True) class Preserve: region: Box def capability(self): return Capability('constraint.preserve', ('constraint', 'protected-region'), guarantees=('immutable existing region',)) def negotiate(self, ctx, parameters): cells = tuple(self.region.cells()) return Contract(self.region, rules=(Rule('protected', cells, self.region, {'states': [ctx.view.state(ctx.world(p)) for p in cells]}),)) def realize(self, ctx, contract): return Plan()
hearth/components/landscape.py
# Public paths, planted borders, lamps and constrained landscape compositions. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import state_of, stairs, slab, log, leaves, name_of from hearth.kernel import Capability, Contract, Port, Grant, Rule, Plan, Child, Binding, ContractError from hearth.composition import scatter from .primitives import Tree, Grass from .interior import Light @dataclass(frozen=True) class PathNetwork: waypoints: tuple[tuple[int, int], ...] links: tuple[tuple[int, int], ...] width: int = 3 gateway: tuple | None = None def capability(self): return Capability('landscape.paths', ('path', 'connection'), offers=('public-access',), adaptations=('terrain treads', 'bounded retaining edges'), guarantees=('connected public routes',)) def _points(self): points = set() for a, b in self.links: x, z = self.waypoints[a][0], self.waypoints[a][-1] xx, zz = self.waypoints[b][0], self.waypoints[b][-1] dx = 1 if xx >= x else -1 dz = 1 if zz >= z else -1 offsets = range(-(self.width // 2), self.width // 2 + 1) if x != xx: for px in range(x, xx + dx, dx): for offset in offsets: points.add((px, z + offset)) if z != zz: for pz in range(z, zz + dz, dz): for offset in offsets: points.add((xx + offset, pz)) if x == xx and z == zz: for ox in offsets: for oz in offsets: points.add((x + ox, z + oz)) return sorted(points) def negotiate(self, ctx, parameters): points = [] for x, z in self._points(): hint = min(self.waypoints, key=lambda q: abs(q[0] - x) + abs(q[-1] - z)) maximum = hint[1] + ctx.frame.origin[1] if len(hint) == 3 else None wx, _, wz = ctx.world((x, 0, z)) h = ctx.view.elevation(wx, wz, maximum=maximum) - ctx.frame.origin[1] points.append((x, h, z)) if not points: raise ContractError('empty-path', ctx.path) box = Box.enclosing(points).expand(2) targets = [] surface = {(x, z): y for x, y, z in points} for q in self.waypoints: x, z = q[0], q[-1] targets.append((x, surface[(x, z)] + 1, z)) clears = tuple((x, y + k, z) for x, y, z in points for k in (1, 2)) public = self.gateway or targets[0] interface = Box((public[0] - 1, public[1] - 1, public[2]), (public[0] + 1, public[1] + 1, public[2])) return Contract(box, ports=(Port('public', 'public-access', Frame(public), interface, 10000, 'join'),), grants=(Grant('join', interface, ('surface',), ('path',), 9),), rules=(Rule('support', tuple(points)), Rule('clear', clears), Rule('route', tuple(targets), box, phase='complete')), decisions={'surface': points, 'waypoints': self.waypoints, 'links': self.links}, reads=(box,)) def realize(self, ctx, contract): p = Plan() rng = ctx.rng('materials') heights = {(x, z): y for x, y, z in contract.decisions['surface']} for x, y, z in contract.decisions['surface']: uphill = [] for dx, dz, face in ((1, 0, 'east'), (-1, 0, 'west'), (0, 1, 'south'), (0, -1, 'north')): if heights.get((x + dx, z + dz), y) > y: uphill.append(face) material = stairs('stone_brick', uphill[0]) if uphill else state_of(rng.choice(('stone_bricks', 'stone_bricks', 'andesite', 'cobblestone', 'mossy_stone_bricks'))) p.block((x, y, z), material, 'paving') return p @dataclass(frozen=True) class Planter: width: int = 3 flowers: tuple[str, ...] = ('cornflower', 'azure_bluet', 'allium') def capability(self): return Capability('garden.planter', ('decoration', 'plant'), guarantees=('grounded bed',)) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (self.width - 1, 1, 1)), rules=(Rule('support', tuple((x, -1, z) for x in range(self.width) for z in range(2))),)) def realize(self, ctx, contract): p = Plan() rng = ctx.rng('flowers') for x in range(self.width): p.block((x, 0, 0), state_of('dirt'), 'soil') p.block((x, 1, 0), state_of(rng.choice(self.flowers)), 'flower') p.block((x, 0, 1), state_of('spruce_trapdoor', facing='south', half='bottom', open='true', powered='false', waterlogged='false'), 'edging') return p @dataclass(frozen=True) class LampPost: def capability(self): return Capability('landscape.lamppost', ('light', 'outdoor-light', 'composite')) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (1, 4, 0)), rules=(Rule('support', ((0, -1, 0),)),)) def realize(self, ctx, contract): p = Plan() p.block((0, 0, 0), state_of('stone_bricks')) for y in range(1, 4): p.block((0, y, 0), state_of('spruce_fence', north='false', south='false', east='false', west='false', waterlogged='false')) p.block((0, 4, 0), slab('spruce')) p.block((1, 4, 0), slab('spruce')) p.children.append(Child('lantern', Light(), frame=Frame((1, 2, 0)))) return p @dataclass(frozen=True) class Landscape: area: Box terrain: str tree_minimum: int = 6 tree_maximum: int = 14 density: float = 0.08 sample_step: int = 4 spacing: int = 10 heights: tuple[int, ...] = (9, 11, 13, 15) def capability(self): return Capability('landscape.scatter', ('landscape', 'composite'), adaptations=('clearance-aware scattering',), guarantees=('minimum tree count', 'preserved routes')) def negotiate(self, ctx, parameters): if not 1 <= self.sample_step <= 8 or self.spacing < 7 or not self.heights or any(h < 5 or h > 18 for h in self.heights): raise ContractError('landscape-domain', ctx.path) return Contract(self.area, decisions={'minimum_trees': self.tree_minimum, 'maximum_trees': self.tree_maximum, 'density': self.density}) def realize(self, ctx, contract): p = Plan() x0, _, z0 = self.area.lo x1, _, z1 = self.area.hi candidates = [(x, z) for x in range(x0 + 4, x1 - 3, self.sample_step) for z in range(z0 + 4, z1 - 3, self.sample_step)] def legal(q, accepted): x, z = q if any(abs(x - a) + abs(z - b) < self.spacing for a, b in accepted): return False h = ctx.elevation(x, z) if name_of(ctx.state((x, h, z))) != 'grass_block': return False box = Box((x - 3, h + 1, z - 3), (x + 3, h + max(self.heights) + 1, z + 3)) return all(ctx.view.domain.contains(ctx.world(c)) for c in box.corners()) and ctx.view.clear(ctx.frame.box(box)) and not ctx.view.protected(ctx.frame.box(Box((x - 3, h, z - 3), (x + 3, h + 2, z + 3)))) chosen = scatter(ctx, candidates, legal, self.tree_minimum, self.tree_maximum, 'trees') for i, (x, z) in enumerate(chosen): y = ctx.elevation(x, z) + 1 h = ctx.scope.child(f'tree-{i}').choose(self.heights, 'height') p.children.append(Child(f'tree-{i}', Tree(h), frame=Frame((x, y, z)), bindings=(Binding(self.terrain, 'planting', 'plant'),))) rng = ctx.rng('groundcover') for x in range(x0 + 1, x1): for z in range(z0 + 1, z1): if rng.random() > self.density or any(abs(x - a) <= 3 and abs(z - b) <= 3 for a, b in chosen): continue h = ctx.elevation(x, z) if name_of(ctx.state((x, h, z))) != 'grass_block': continue if name_of(ctx.state((x, h + 1, z))) != 'air': continue if ctx.view.protected(ctx.frame.box(Box((x, h + 1, z), (x, h + 2, z)))): continue p.children.append(Child(f'grass-{x}-{z}', Grass(), frame=Frame((x, h + 1, z)), bindings=(Binding(self.terrain, 'planting', 'plant'),))) return p @dataclass(frozen=True) class FacadeGarden: width: int depth: int sides: tuple[str, ...] exclusions: tuple[Box, ...] = () def capability(self): return Capability('facade.garden', ('decoration', 'plant'), adaptations=('avoid facade openings',), guarantees=('unobstructed doorways',)) def negotiate(self, ctx, parameters): return Contract(Box((-1, 0, -1), (self.width, 3, self.depth))) def realize(self, ctx, contract): p = Plan() w, d = self.width, self.depth frames = {'north': Frame((0, 0, -1)), 'south': Frame((w - 1, 0, d), 2), 'east': Frame((w, 0, 0), 1), 'west': Frame((-1, 0, d - 1), 3)} for side in self.sides: f = frames[side] length = w if side in ('north', 'south') else d for y in range(1, 4): q = f.point((1, y, 0)) if name_of(ctx.view.state(ctx.world(q))) == 'air' and not any(b.contains(q) for b in self.exclusions): p.block(q, leaves('oak'), 'climber') for x in (2, length - 3): q = f.point((x, 0, 0)) above = f.point((x, 1, 0)) if name_of(ctx.view.state(ctx.world(q))) == 'air' and name_of(ctx.view.state(ctx.world(above))) == 'air' and not any(b.contains(q) or b.contains(above) for b in self.exclusions): p.block(q, slab('spruce', 'top'), 'flower-shelf') p.block(above, state_of('potted_poppy' if x == 2 else 'potted_fern'), 'pot') return p @dataclass(frozen=True) class Well: def capability(self): return Capability('square.well', ('amenity', 'composite'), guarantees=('contained water', 'grounded cover')) def negotiate(self, ctx, parameters): basin = tuple((x, 1, z) for x in range(1, 3) for z in range(1, 3)) return Contract(Box((-1, 0, -1), (4, 6, 4)), rules=(Rule('support', tuple((x, -1, z) for x in range(4) for z in range(4))), Rule('pool', basin), Rule('support', tuple((x, y, z) for x, z in ((0, 0), (3, 3)) for y in range(2, 6))))) def realize(self, ctx, contract): p = Plan() p.fill(Box((0, 0, 0), (3, 1, 3)), state_of('stone_bricks'), 'basin') p.fill(Box((1, 1, 1), (2, 1, 2)), state_of('water', level='0'), 'water') for x, z in ((0, 0), (3, 3)): p.fill(Box((x, 2, z), (x, 5, z)), log(), 'post') for x in range(-1, 5): for z in range(-1, 5): p.block((x, 5 if x in (-1, 4) else 6, z), slab('dark_oak'), 'shelter') return p @dataclass(frozen=True) class Terrace: width: int = 10 depth: int = 10 def capability(self): return Capability('site.terrace', ('siteworks', 'composite'), adaptations=('small local fill', 'retaining border'), guarantees=('level civic amenity pad',)) def negotiate(self, ctx, parameters): heights = [ctx.view.elevation(ctx.world((x, 0, z))[0], ctx.world((x, 0, z))[2]) - ctx.frame.origin[1] for x in range(self.width) for z in range(self.depth)] top = max(heights) if top - min(heights) > 3: raise ContractError('terrace-relief', ctx.path, conditions='Small terrace limit is 3') region = Box((0, top, 0), (self.width - 1, top + 2, self.depth - 1)) return Contract(Box((0, min(heights), 0), (self.width - 1, top + 8, self.depth - 1)), ports=(Port('entrance', 'public-access', Frame((0, top + 1, self.depth // 2)), region, 10, 'paving'),), grants=(Grant('paving', region, ('surface',), ('path',), 32),), decisions={'height': top, 'fill': sum(top - h for h in heights), 'excavation': 0}) def realize(self, ctx, contract): p = Plan() top = contract.decisions['height'] for x in range(self.width): for z in range(self.depth): wx, _, wz = ctx.world((x, 0, z)) bed = ctx.view.elevation(wx, wz) - ctx.frame.origin[1] for y in range(bed, top + 1): material = 'cobblestone' if y < top else ('stone_bricks' if x in (0, self.width - 1) or z in (0, self.depth - 1) else 'andesite') p.block((x, y, z), state_of(material), 'terrace-paving') p.children.append(Child('well', Well(), frame=Frame((3, top + 1, 3)))) for i, x in enumerate((1, self.width - 2)): p.children.append(Child(f'planter-{i}', Planter(2), frame=Frame((x if i == 0 else x - 1, top + 1, 1)))) return p
hearth/components/roofcraft.py
# Profile-driven roof assemblies with scoped, replaceable dormer openings. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Port, Grant, Rule, Plan, Child, Binding from hearth.blocks import AIR, name_of, solid, state_of, stairs, slab, log from .primitives import Window @dataclass(frozen=True) class RoofDesign: """Specify rising courses, spacing of dormers, and coherent material roles.""" rise: tuple[int, ...] = (1, 2) dormer_spacing: int = 8 dormer_sides: tuple[str, ...] = ('left', 'right') trim: str = 'dark_oak' def heights(self, span): if not self.rise or any(v not in (1, 2) for v in self.rise): raise ValueError('Roof rise sequence must contain only 1 or 2') if self.dormer_spacing and not 7 <= self.dormer_spacing <= 16: raise ValueError('Dormer spacing is zero or 7..16') if len(set(self.dormer_sides)) != len(self.dormer_sides) or set(self.dormer_sides) - {'left', 'right'}: raise ValueError('Dormer sides must be distinct left/right') levels = [0] for i in range((span + 1) // 2): levels.append(levels[-1] + self.rise[i % len(self.rise)]) return tuple(levels[min(x + 1, span - x)] for x in range(-1, span + 1)) def component(self, width, depth, axis, material): return ProfileRoof(width, depth, axis, material, self) @dataclass(frozen=True) class ProfileRoof: width: int depth: int axis: str = 'z' material: str = 'deepslate_tile' design: RoofDesign = RoofDesign() def capability(self): return Capability('roof.profile', ('roof', 'enclosure', 'composite'), offers=('roof-interior',), inputs={'width': Domain(7, 64), 'depth': Domain(7, 128), 'axis': Domain(choices=('x', 'z'))}, guarantees=('continuous weather cover', 'sealed attached dormers'), version='2') def negotiate(self, ctx, parameters): span = self.width if self.axis == 'z' else self.depth levels = self.design.heights(span) bearings = tuple((x, -1, z) for x in (0, self.width - 1) for z in range(0, self.depth, 4)) + tuple((x, -1, z) for z in (0, self.depth - 1) for x in range(0, self.width, 4)) box = Box((-1, -1, -1), (self.width, max(levels) + 4, self.depth)) interior = Port('interior', 'roof-interior', Frame((0, -1, 0)), box, 1, 'interior-install', facts={'width': self.width, 'depth': self.depth, 'axis': self.axis, 'height': max(levels) + 5, 'coordinate_space': 'port-local', 'requires_floor_and_knee_walls': True, 'replace_limit': 0}) return Contract(box, ports=(interior,), grants=(Grant('interior-install', box, ('install',), ('roof-room',), 0),), rules=(Rule('support', bearings),), decisions={'axis': self.axis, 'span': span, 'rise': self.design.rise, 'dormer_spacing': self.design.dormer_spacing, 'dormer_sides': self.design.dormer_sides}) def realize(self, ctx, contract): span = self.width if self.axis == 'z' else self.depth length = self.depth if self.axis == 'z' else self.width frame = Frame() if self.axis == 'z' else Frame((0, 0, span - 1), 3) return Plan(children=[Child('cover', RoofCover(span, length, self.material, self.design), frame=frame)]) @dataclass(frozen=True) class RoofCover: span: int length: int material: str design: RoofDesign populate: bool = True def capability(self): return Capability('roof.weather-cover', ('roof', 'enclosure', 'composite'), offers=('roof-installation',), adaptations=('measured solid abutments', 'scoped dormer cuts'), guarantees=('actual projected weather skin', 'bounded opening authority')) def negotiate(self, ctx, parameters): levels = self.design.heights(self.span) peak = max(levels) box = Box((-1, -1, -1), (self.span, peak + 4, self.length)) mounts, rejected = [], [] if self.design.dormer_spacing: centers = range(4, self.length - 3, self.design.dormer_spacing) for side in self.design.dormer_sides: for center in centers: frame = Frame((self.span - 1, 1, center - 2), 1) if side == 'right' else Frame((0, 1, center + 2), 3) region = frame.box(Box((0, 0, 0), (4, peak + 2, 2))) # Avoid prospective dormer intersection with an existing upper room/wing. if ctx.view.protected(ctx.frame.box(region)): rejected.append((side, center, 'protected circulation')) elif all(name_of(ctx.state(q)) == 'air' for q in region.cells()): mounts.append((f'{side}-{center}', frame, region)) else: rejected.append((side, center, 'existing upper volume')) ports = tuple(Port(key, 'roof-installation', frame, region, 1, key, facts={'width': 5, 'depth': 3, 'rise': self.design.rise, 'peak': peak}) for key, frame, region in mounts) grants = tuple(Grant(key, region, ('install',), ('dormer',), region.volume) for key, frame, region in mounts) # Every intended roof column must retain actual solid cover after modifications. columns = tuple((x, levels[x + 1], z) for x in range(self.span) for z in range(self.length)) rule = Rule('vertical-cover', columns, box, phase='complete') return Contract(box, ports, grants, (rule,), decisions={'levels': levels, 'mounts': [(key, f.origin, f.turn) for key, f, _ in mounts], 'omitted_optional_dormers': rejected, 'peak': peak}) def realize(self, ctx, contract): p = Plan() levels = contract.decisions['levels'] span, length = self.span, self.length for x in range(-1, span + 1): y = levels[x + 1] previous = levels[max(0, x)] if x < span // 2 else levels[min(span + 1, x + 2)] for z in range(-1, length + 1): material = self.design.trim if z in (-1, length) else self.material facing = 'east' if x < span // 2 else 'west' # Two-rise courses have a full riser; stair treads alone leave a visible slit. for yy in range(previous + 1, y): if name_of(ctx.state((x, yy, z))) == 'air': p.block((x, yy, z), state_of(material + '_planks') if material in ('spruce', 'dark_oak') else state_of(material + 's'), 'riser') if name_of(ctx.state((x, y, z))) == 'air': p.block((x, y, z), stairs(material, facing), 'weather-course') elif x not in (-1, span) and z not in (-1, length) and not solid(ctx.state((x, y, z))): raise ContractError('roof-abutment', ctx.path, ctx.world((x, y, z)), 'Roof may abut actual solid boundaries only; found ' + ctx.state((x, y, z)) + ' owned by ' + str(ctx.view.owner(ctx.world((x, y, z))))) for x in (-1, span): for z in range(length): if name_of(ctx.state((x, -1, z))) == 'air': p.block((x, -1, z), slab('spruce', 'top'), 'eave-fascia') mid = span // 2 for z in range(-1, length + 1): if name_of(ctx.state((mid, max(levels) + 1, z))) == 'air': p.block((mid, max(levels) + 1, z), slab(self.design.trim), 'ridge-cap') for z in (-1, length): if name_of(ctx.state((mid, max(levels) + 2, z))) != 'air': continue p.block((mid, max(levels) + 2, z), state_of('dark_oak_fence', north='false', south='false', east='false', west='false', waterlogged='false'), 'ridge-finial') p.children.append(Child('gable-front', ProfileGable(span, levels))) p.children.append(Child('gable-rear', ProfileGable(span, levels), frame=Frame((span - 1, 0, length - 1), 2))) for key, origin, turn in contract.decisions['mounts'] if self.populate else (): p.children.append(Child('dormer-' + key, Dormer(self.material, self.design.trim), frame=Frame(tuple(origin), turn), bindings=(Binding(ctx.path, key),))) return p @dataclass(frozen=True) class ProfileGable: span: int levels: tuple[int, ...] def capability(self): return Capability('wall.profile-gable', ('wall', 'enclosure', 'composite'), offers=('wall-installation',), guarantees=('framed infill',)) def negotiate(self, ctx, parameters): mid = self.span // 2 height = min(self.levels[mid], self.levels[mid + 2]) region = Box((mid - 1, 0, 0), (mid + 1, height - 1, 0)) box = Box((0, -1, -1), (self.span - 1, max(self.levels), 0)) return Contract(box, (Port('infill', 'wall-installation', Frame((mid - 1, 0, 0)), region, 1, 'install', facts={'thickness': 1}),), (Grant('install', region, ('install',), ('window',), region.volume),)) def realize(self, ctx, contract): p = Plan() available = set() for x in range(self.span): for y in range(self.levels[x + 1]): if name_of(ctx.state((x, y, 0))) == 'air': material = log('spruce') if x in (0, self.span // 2, self.span - 1) or y == 0 else state_of('smooth_sandstone') p.block((x, y, 0), material, 'gable-frame') available.add((x, y, 0)) mid = self.span // 2 height = min(3, self.levels[mid] - 2) if height >= 2 and all((x, y, 0) in available for x in range(mid - 1, mid + 2) for y in range(1, height + 1)): # A canopy may occupy the sill projection while leaving the glazing bay free. # Use the ordinary flush implementation instead of blanking that whole bay. projecting = all(name_of(ctx.state((x, y, -1))) == 'air' for x in range(mid - 2, mid + 3) for y in range(height + 1)) clear_glazing = all(name_of(ctx.state((x, y, -1))) == 'air' for x in range(mid - 1, mid + 2) for y in range(1, height + 1)) if projecting or clear_glazing: window = Window(3, height) if projecting else FlushWindow(3, height) p.children.append(Child('window', window, frame=Frame((mid - 1, 1, 0)), bindings=(Binding(ctx.path, 'infill'),))) return p @dataclass(frozen=True) class Dormer: material: str = 'deepslate_tile' trim: str = 'dark_oak' def capability(self): return Capability('roof.dormer', ('dormer', 'roof', 'composite'), offers=('daylight',), assumptions=('compatible roof-installation region',), guarantees=('sealed cheeks and glazing', 'opening to attic')) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('dormer-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind != 'roof-installation' or port.frame != ctx.frame or port.facts.get('width') != 5 or port.facts.get('depth') != 3: raise ContractError('dormer-interface', ctx.path, ctx.frame.origin, 'Require aligned 5 by 3 roof mount') box = Box((0, 0, 0), (4, port.facts['peak'] + 2, 2)) if not all(port.region.contains(ctx.world(q)) for q in box.corners()): raise ContractError('dormer-envelope', ctx.path) # The back roof rises into the main roof; cap each column above its measured intersection. tops = [] for z in range(3): top = max([y for x in range(5) for y in range(box.hi[1] + 1) if solid(ctx.state((x, y, z)))] or [0]) tops.append(max(4, top + 1)) tops = [max(tops)] * 3 if max(tops) + 2 > box.hi[1]: raise ContractError('dormer-height', ctx.path, conditions='Insufficient height within the negotiated roof mount') boundary = tuple((x, tops[z] + min(x, 4 - x), z) for x in range(5) for z in range(3)) cheeks = tuple((x, y, z) for x in (0, 4) for z in range(3) for y in range(0, tops[z])) face = tuple((x, y, 0) for x in range(1, 4) for y in range(tops[0] + min(x, 4 - x))) return Contract(box, rules=(Rule('sealed', boundary + cheeks + face, phase='complete'),), decisions={'tops': tops}) def realize(self, ctx, contract): p = Plan() tops = contract.decisions['tops'] # Cut only the owned weather cover, leaving an open rear into the roof void. for x in range(1, 4): for z in range(1, 3): for y in range(tops[z]): if name_of(ctx.state((x, y, z))) != 'air': p.block((x, y, z), AIR, 'roof-opening') for x in (0, 4): for z in range(3): for y in range(tops[z]): p.block((x, y, z), log('spruce') if z == 0 else state_of('spruce_planks'), 'cheek') for x in range(5): for z in range(3): roof = tops[z] + min(x, 4 - x) for y in range(tops[z], roof): if z == 0 and 0 < x < 4: continue p.block((x, y, z), state_of('spruce_planks'), 'roof-riser') p.block((x, roof, z), stairs(self.trim if z == 0 else self.material, 'east' if x < 2 else 'west'), 'dormer-cap') for x in range(1, 4): for y in range(tops[0] + min(x, 4 - x)): if name_of(ctx.state((x, y, 0))) != 'air': p.block((x, y, 0), AIR, 'face-reveal') # A semantic wall owns its glass attachment. Its bottom beam preserves the roof joint. p.children.append(Child('face', DormerFace(tops[0]))) return p @dataclass(frozen=True) class DormerFace: height: int def capability(self): return Capability('wall.dormer-face', ('wall', 'enclosure', 'composite'), offers=('wall-installation',)) def negotiate(self, ctx, parameters): region = Box((1, 1, 0), (3, self.height - 1, 0)) return Contract(Box((1, 0, 0), (3, self.height + 1, 0)), ports=(Port('infill', 'wall-installation', Frame((1, 1, 0)), region, 1, 'install', facts={'thickness': 1}),), grants=(Grant('install', region, ('install',), ('window',), region.volume),)) def realize(self, ctx, contract): p = Plan() for x in range(1, 4): for y in range(self.height + min(x, 4 - x)): p.block((x, y, 0), log('spruce', 'x') if y in (0, self.height - 1) else state_of('smooth_sandstone'), 'frame') # Glazing has no exterior shutter projection outside the accepted roof mount. p.children.append(Child('window', FlushWindow(3, 2), frame=Frame((1, 1, 0)), bindings=(Binding(ctx.path, 'infill'),))) return p @dataclass(frozen=True) class FlushWindow: width: int = 3 height: int = 2 def capability(self): return Capability('window.flush', ('window', 'sealed-opening'), guarantees=('sealed glazing within host',)) def negotiate(self, ctx, parameters): if not ctx.bindings: raise ContractError('window-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) depth = port.facts['thickness'] box = Box((0, 0, 0), (self.width - 1, self.height - 1, depth - 1)) if not all(port.region.contains(ctx.world(q)) for q in box.corners()): raise ContractError('window-margins', ctx.path) return Contract(box, rules=(Rule('sealed', tuple(box.cells())),)) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, state_of('glass'), 'glazing') return p
hearth/components/joinery.py
# Depth and joinery fitted to public wall interfaces without replacing openings. from dataclasses import dataclass from hearth import Box, ContractError from hearth.kernel import Capability, Contract, Plan, Rule from hearth.blocks import name_of, log, stairs, slab @dataclass(frozen=True) class FacadeRelief: """Fit external beams and brackets around an already installed facade.""" width: int height: int = 5 access: bool = False exclusions: tuple[Box, ...] = () def capability(self): return Capability('facade.joinery', ('decoration', 'timber-frame'), assumptions=('wall-installation host',), adaptations=('preserve shutters and other occupied facade cells',), guarantees=('one-cell projection',)) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1 or ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port).kind != 'wall-installation': raise ContractError('joinery-host', ctx.path) points = {} for x in range(self.width): points[(x, self.height - 1, -1)] = log('spruce', 'x') if not (self.access and abs(x - self.width // 2) <= 1): points[(x, -1, -1)] = slab('dark_oak', 'top') for x in (0, self.width - 1): for y in range(self.height - 1): points[(x, y, -1)] = log('stripped_spruce') for x, direction in ((1, 'east'), (self.width - 2, 'west')): points[(x, self.height - 2, -1)] = stairs('spruce', direction, 'top') available = [(q, s) for q, s in sorted(points.items()) if name_of(ctx.state(q)) == 'air' and not any(b.contains(q) for b in self.exclusions)] return Contract(Box((0, -1, -1), (self.width - 1, self.height - 1, 0)), rules=(Rule('support', ((0, self.height - 1, 0), (self.width - 1, self.height - 1, 0))),), decisions={'members': available, 'preserved_occupied_cells': len(points) - len(available)}) def realize(self, ctx, contract): p = Plan() for q, block in contract.decisions['members']: p.block(q, block, 'joinery') return p
hearth/components/furnishing.py
# Functional furniture groups and circulation-aware furnishing of rectangular rooms. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Rule, Port, Plan, Child from hearth.blocks import state_of, stairs, slab GROUPS = {'living': [['spruce_stairs'], ['barrel']], 'bedroom': [['red_bed'], ['barrel']], 'library': [['bookshelf'], ['lectern']], 'kitchen': [['smoker'], ['furnace']], 'workshop': [['crafting_table'], ['smithing_table']], 'storage': [['barrel']]} def supplies(): return {'id': 'minecraft:barrel', 'Items': [{'Slot': 0, 'id': 'minecraft:bread', 'count': 6}, {'Slot': 1, 'id': 'minecraft:torch', 'count': 12}]} @dataclass(frozen=True) class FurnitureGroup: purpose: str @staticmethod def placement_geometry(): """Offer the occupied bound, required apron and approach in local coordinates.""" return Box((0, 0, 0), (1, 2, 1)), Box((0, 0, 2), (1, 1, 2)), (0, 0, 2) def capability(self): return Capability('furnishing.group.' + self.purpose, ('furniture', self.purpose), offers=('interaction',), inputs={'purpose': Domain(choices=tuple(GROUPS))}, guarantees=('complete functional group', 'supported', 'clear interaction space')) def negotiate(self, ctx, parameters): area, interaction, target = self.placement_geometry() return Contract(Box.enclosing((*area.corners(), *interaction.corners())), ports=(Port('use', 'interaction', Frame(target), interaction, 4),), rules=(Rule('support', tuple((x, -1, z) for x in range(2) for z in range(3))), Rule('clear', tuple(interaction.cells())), Rule('furnishing', box=area, data={'groups': GROUPS[self.purpose]}, phase='complete')), atomic_object=True) def realize(self, ctx, contract): p = Plan() barrel = state_of('barrel', facing='south', open='false') p.block((1, 0, 0), barrel, 'supplies', nbt=supplies()) if self.purpose == 'bedroom': for z, part in ((0, 'head'), (1, 'foot')): p.block((0, 0, z), state_of('red_bed', facing='north', part=part, occupied='false'), 'bed') p.block((1, 1, 0), state_of('potted_fern'), 'bedside') p.block((1, 0, 1), state_of('red_carpet'), 'bedside-rug') elif self.purpose == 'library': for y in range(3): p.block((0, y, 0), state_of('bookshelf'), 'bookcase') p.block((0, 0, 1), state_of('lectern', facing='south', has_book='false', powered='false'), 'lectern') p.block((1, 1, 0), state_of('bookshelf'), 'bookcase') p.block((1, 2, 0), slab('spruce'), 'shelf-cap') p.block((1, 0, 1), stairs('spruce', 'north'), 'reading-seat') elif self.purpose in ('kitchen', 'workshop'): a, b = ('smoker', 'furnace') if self.purpose == 'kitchen' else ('crafting_table', 'smithing_table') props = {'facing': 'south', 'lit': 'false'} if self.purpose == 'kitchen' else {} p.block((0, 0, 0), state_of(a, **props), 'workstation') p.block((0, 0, 1), state_of(b, **props), 'workstation') p.block((1, 0, 1), state_of('crafting_table') if self.purpose == 'kitchen' else state_of('anvil', facing='north'), 'counter') for x in range(2): p.block((x, 2, 0), slab('spruce', 'top'), 'shelf') elif self.purpose == 'living': p.block((0, 0, 0), stairs('spruce', 'south'), 'seat') p.block((1, 0, 1), stairs('spruce', 'west'), 'seat') p.block((0, 0, 1), state_of('spruce_fence', north='false', south='false', east='false', west='false', waterlogged='false'), 'table') p.block((0, 1, 1), state_of('spruce_pressure_plate', powered='false'), 'tabletop') p.block((1, 1, 0), state_of('potted_poppy'), 'flowers') else: for x, y, z in ((0, 0, 0), (0, 1, 0), (1, 1, 0), (0, 0, 1)): p.block((x, y, z), barrel, 'storage', nbt=supplies()) for x in range(2): p.block((x, 2, 0), slab('spruce'), 'shelf-cap') return p @dataclass(frozen=True) class FurnishingLayout: purpose: str width: int depth: int stair: bool = False def capability(self): return Capability('furniture.' + self.purpose, ('furniture', 'composite'), guarantees=('two or four accessible furniture groups', 'clear circulation cross'), inputs={'width': Domain(choices=(9, 11, 13)), 'depth': Domain(choices=(9, 11, 13))}) def negotiate(self, ctx, parameters): if self.purpose not in GROUPS: raise ContractError('room-function', ctx.path) w, d = self.width, self.depth frames = [Frame((1, 0, 1)), Frame((1, 0, d - 2), 3)] if not self.stair: frames += [Frame((w - 2, 0, 1), 1), Frame((w - 2, 0, d - 2), 2)] table_frames = [Frame((3, 0, 2)), Frame((3, 0, d - 5))] if w >= 11 and d >= 11 else [] # Tables occupy the wider western bays while preserving the central aisles. targets = ((w // 2, 0, d // 2), *(f.point((0, 0, 2)) for f in frames), *(f.point((0, 0, 2)) for f in table_frames)) cross = tuple((x, y, z) for x in range(1, w - 1) for z in range(1, d - 1) if (x == w // 2 or z == d // 2) and not (self.stair and x >= w - 4 and 2 <= z <= 7) for y in (0, 1)) box = Box((1, 0, 1), (w - 2, 3, d - 2)) suites = {'living': ('gathering', 'study'), 'bedroom': ('study', 'cabinet'), 'library': ('study', 'gathering'), 'kitchen': ('cooking', 'gathering'), 'workshop': ('craft', 'cabinet'), 'storage': ('cabinet', 'craft')} station_order = list(suites[self.purpose]) if ctx.rng('station-arrangement').choice((False, True)): station_order.reverse() return Contract(box, rules=(Rule('clear', cross), Rule('route', targets, box, phase='complete')), decisions={'frames': [(f.origin, f.turn) for f in frames], 'groups': len(frames), 'purpose': self.purpose, 'tables': [(f.origin, f.turn) for f in table_frames], 'stations': station_order if table_frames else []}) def realize(self, ctx, contract): p = Plan() functions = {'living': ('living', 'library', 'living', 'storage'), 'bedroom': ('bedroom', 'storage', 'bedroom', 'library'), 'kitchen': ('kitchen', 'storage', 'kitchen', 'living'), 'library': ('library', 'living', 'library', 'storage'), 'workshop': ('workshop', 'storage', 'workshop', 'library'), 'storage': ('storage',) * 4} for i, (origin, turn) in enumerate(contract.decisions['frames']): p.children.append(Child('group-' + str(i), FurnitureGroup(functions[self.purpose][i]), frame=Frame(tuple(origin), turn))) for i, (origin, turn) in enumerate(contract.decisions['tables']): from .domestic import DomesticSuite p.children.append(Child('station-' + str(i), DomesticSuite(contract.decisions['stations'][i], min(3, self.width // 2 - 3)), frame=Frame(tuple(origin), turn))) # One continuous runner occupies only the circulation cross, never the stair slot. for z in range(2, self.depth - 2): p.block((self.width // 2, 0, z), state_of('red_carpet'), 'runner') return p @dataclass(frozen=True) class TableSetting: width: int = 3 def capability(self): return Capability('furnishing.table-setting', ('furniture', 'seating'), inputs={'width': Domain(choices=(2, 3))}, offers=('interaction',), guarantees=('accessible seats and table',)) def negotiate(self, ctx, parameters): area = Box((0, 0, 0), (self.width - 1, 1, 2)) clear = tuple((x, y, 2) for x in range(self.width) for y in (0, 1)) return Contract(area, rules=(Rule('clear', clear), Rule('support', tuple((x, -1, z) for x in range(self.width) for z in range(3))), Rule('furnishing', box=area, data={'groups': [['spruce_stairs'], ['spruce_pressure_plate']]}, phase='complete')), ports=(Port('use', 'interaction', Frame((0, 0, 2)), Box((0, 0, 2), (self.width - 1, 1, 2)), 4),)) def realize(self, ctx, contract): p = Plan() table_x = 1 if self.width == 3 else 0 for z in range(2): p.block((table_x, 0, z), state_of('spruce_fence', north=str(z > 0).lower(), south=str(z == 0).lower(), east='false', west='false', waterlogged='false'), 'table') p.block((table_x, 1, z), state_of('spruce_pressure_plate', powered='false'), 'tabletop') for x in range(self.width): if x != table_x: p.block((x, 0, z), stairs('spruce', 'east' if x < table_x else 'west'), 'chair') return p
hearth/components/masonry.py
# Grounded masonry stacks composed with measured foundations and roof abutments. from dataclasses import dataclass from hearth import Box from hearth.kernel import Capability, Contract, Domain, Rule, Plan from hearth.blocks import state_of, slab @dataclass(frozen=True) class Chimney: height: int cap_overhang: int = 0 def capability(self): return Capability('masonry.chimney', ('chimney', 'support'), inputs={'height': Domain(10, 48), 'cap_overhang': Domain(choices=(0, 1))}, assumptions=('supported three by two base',), guarantees=('continuous masonry shaft', 'capped flue')) def negotiate(self, ctx, parameters): load = tuple((x, y, z) for x in (0, 2) for z in range(2) for y in range(-1, self.height)) e = self.cap_overhang cap = tuple((x, self.height, z) for x in range(-e, 3 + e) for z in range(-e, 2 + e)) flue = tuple((1, self.height + 1, z) for z in range(2)) return Contract(Box((-e, 0, -e), (2 + e, self.height + 2, 1 + e)), rules=(Rule('support', load), Rule('expected', cap, data={'names': ['stone_brick_slab']}), Rule('expected', flue, data={'names': ['cobblestone_wall']})), decisions={'height': self.height, 'cap_overhang': e, 'function': 'exterior flue; no simulated indoor heating'}) def realize(self, ctx, contract): p = Plan() rng = ctx.rng('masonry') for x in range(3): for z in range(2): for y in range(self.height): material = 'stone_bricks' if y in (0, 1, self.height - 3, self.height - 1) else rng.choice(('stone_bricks', 'stone_bricks', 'andesite', 'cobblestone')) p.block((x, y, z), state_of(material), 'shaft') for x in range(-self.cap_overhang, 3 + self.cap_overhang): for z in range(-self.cap_overhang, 2 + self.cap_overhang): p.block((x, self.height, z), slab('stone_brick', 'top'), 'cap') for z in range(2): p.block((1, self.height + 1, z), state_of('cobblestone_wall', north='low' if z else 'none', south='none' if z else 'low', east='none', west='none', up='true', waterlogged='false'), 'flue') return p
hearth/components/grounds.py
# Domestic garden courts using public access ports and bounded garden foundations. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Plan, Child, Binding from hearth.adapters.site import Foundation, SiteLimits from hearth.blocks import state_of, stairs from .landscape import PathNetwork, Planter, Landscape, LampPost @dataclass(frozen=True) class RaisedBed: terrain: str width: int = 3 def capability(self): return Capability('garden.raised-bed', ('garden', 'composite'), adaptations=('bounded stepped footing',)) def negotiate(self, ctx, parameters): heights = [ctx.elevation(x, z) for x in range(self.width + 2) for z in range(4)] if max(heights) - min(heights) > 2: raise ContractError('garden-relief', ctx.path) floor = max(heights) + 1 return Contract(Box((0, min(heights) - 1, 0), (self.width + 1, floor + 1, 3)), decisions={'floor': floor}) def realize(self, ctx, contract): floor = contract.decisions['floor'] return Plan(children=[Child('footing', Foundation.rectangular(self.width + 2, 4, floor, limits=SiteLimits(support_height=3, fill_volume=60)), bindings=(Binding(self.terrain, 'construction', 'fill'),)), Child('soil', GardenSoil(self.width, floor - 1), bindings=(Binding(self.terrain, 'construction', 'fill'),)), Child('bed', Planter(self.width), frame=Frame((1, floor, 1))), Child('edging', BedBorder(self.width + 2, 4), frame=Frame((0, floor, 0)))]) @dataclass(frozen=True) class GardenSoil: width: int top: int def capability(self): return Capability('garden.soil-lift', ('siteworks', 'support'), guarantees=('continuous substrate below planting bed', 'at most two cells of fill')) def negotiate(self, ctx, parameters): from hearth.kernel import Rule columns = [(x, ctx.elevation(x, z), z) for x in range(1, self.width + 1) for z in (1, 2)] if any(self.top - y > 2 or y > self.top for x, y, z in columns): raise ContractError('garden-soil-depth', ctx.path) support = tuple((x, self.top, z) for x, _, z in columns) return Contract(Box((1, min(y for _, y, _ in columns), 1), (self.width, self.top, 2)), rules=(Rule('support', support),), decisions={'columns': columns}) def realize(self, ctx, contract): p = Plan() for x, bottom, z in contract.decisions['columns']: for y in range(bottom + 1, self.top + 1): p.block((x, y, z), state_of('dirt'), 'soil-fill') return p @dataclass(frozen=True) class BedBorder: width: int depth: int def capability(self): return Capability('garden.stone-edging', ('garden', 'masonry'), guarantees=('supported planting boundary',)) def negotiate(self, ctx, parameters): from hearth.kernel import Rule edge = tuple((x, 0, z) for x in range(self.width) for z in range(self.depth) if x in (0, self.width - 1) or z in (0, self.depth - 1)) return Contract(Box((0, 0, 0), (self.width - 1, 0, self.depth - 1)), rules=(Rule('support', tuple((x, -1, z) for x, _, z in edge)),), decisions={'edge': edge}) def realize(self, ctx, contract): p = Plan() for x, y, z in contract.decisions['edge']: face = 'south' if z == 0 else 'north' if z == self.depth - 1 else 'east' if x == 0 else 'west' p.block((x, y, z), stairs('stone_brick', face), 'edging') return p @dataclass(frozen=True) class GardenCourt: building: str terrain: str area: Box beds: int = 4 trees: int = 3 def capability(self): return Capability('garden.domestic-court', ('garden', 'composite'), assumptions=('access street port',), guarantees=('clear path to public entrance', 'bounded garden beds', 'retained building circulation')) def negotiate(self, ctx, parameters): port = ctx.view.port(self.building, 'street') if port.kind != 'access': raise ContractError('garden-access', ctx.path) access = ctx.local(port.frame.origin) gateway = (access[0], ctx.elevation(access[0], self.area.lo[2] + 2) + 1, self.area.lo[2] + 2) return Contract(self.area, decisions={'access': access, 'gateway': gateway, 'beds': self.beds, 'trees': self.trees}) def realize(self, ctx, contract): access, gateway = contract.decisions['access'], contract.decisions['gateway'] p = Plan(children=[Child('walk', PathNetwork((access, gateway), ((0, 1),)), bindings=(Binding(self.terrain, 'construction', 'surface'), Binding(self.building, 'street', 'surface')))]) for i in range(self.beds): side = -1 if i % 2 == 0 else 1 x = access[0] + (side * 5) - (2 if side < 0 else 0) z = gateway[2] + 2 + (i // 2) * 4 p.children.append(Child(f'bed-{i}', RaisedBed(self.terrain), frame=Frame((x, 0, z)))) for i, x in enumerate((access[0] - 3, access[0] + 3)): y = ctx.elevation(x, gateway[2] + 1) + 1 p.children.append(Child(f'light-{i}', LampPost(), frame=Frame((x, y, gateway[2] + 1)))) p.children.append(Child('planting', Landscape(self.area, self.terrain, self.trees, self.trees + 1, .035, sample_step=2, heights=(9, 11, 13)))) from .borders import BoundaryPlanting p.children.append(Child('borders', BoundaryPlanting(self.building, self.terrain))) return p
hearth/components/lofts.py
# Habitable roof volumes assembled through public stair and roof interior contracts. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Rule, Port, Plan, Child, Binding from hearth.blocks import name_of, state_of, log from hearth.navigation import floor_path from .furnishing import FurnitureGroup, GROUPS from .roofcraft import RoofDesign LOFT_PURPOSES = ('bedroom', 'library', 'storage') @dataclass(frozen=True) class RoofCollars: """Span measured roof faces above player headroom with timber collar ties.""" width: int depth: int axis: str level: int = 4 spacing: int = 6 def capability(self): return Capability('timber.roof-collars', ('timber-frame', 'decoration'), inputs={'level': Domain(4, 8), 'spacing': Domain(5, 12)}, guarantees=('actual end bearings', 'preserved circulation')) def negotiate(self, ctx, parameters): span, length = (self.width, self.depth) if self.axis == 'z' else (self.depth, self.width) def point(cross, along): return (cross, self.level, along) if self.axis == 'z' else (along, self.level, cross) members, anchors, omitted = [], [], [] for along in range(3, length - 2, self.spacing): row = [point(cross, along) for cross in range(span)] solid = [i for i, q in enumerate(row) if ctx.view.supports(ctx.world(q))] if len(solid) < 2: omitted.append(along) continue a, b = min(solid), max(solid) points = row[a + 1:b] if not points or any(name_of(ctx.state(q)) != 'air' or ctx.view.protected(ctx.frame.box(Box(q, q))) for q in points): omitted.append(along) continue members.extend(points) anchors.extend((row[a], row[b])) return Contract(Box((0, self.level, 0), (self.width - 1, self.level, self.depth - 1)), rules=(Rule('support', tuple(anchors)), Rule('expected', tuple(members), data={'names': ['spruce_log']})), decisions={'members': members, 'omitted_optional_ties': omitted}) def realize(self, ctx, contract): p = Plan() for q in contract.decisions['members']: p.block(q, log('spruce', 'x' if self.axis == 'z' else 'z'), 'collar-tie') return p @dataclass(frozen=True) class ApertureGuard: width: int depth: int aperture: tuple def capability(self): return Capability('circulation.aperture-guard', ('railing',), guarantees=('supported guard beside stair opening', 'preserved landing and routes')) def negotiate(self, ctx, parameters): holes = set(tuple(q) for q in self.aperture) candidates = {(x + dx, 0, z + dz) for x, _, z in holes for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1))} - holes rails = [] for x, _, z in sorted(candidates): q = (x, 1, z) if 0 < x < self.width - 1 and 0 < z < self.depth - 1 and ctx.view.supports(ctx.world((x, 0, z))) and name_of(ctx.state(q)) == 'air' and not ctx.view.protected(ctx.frame.box(Box(q, (x, 2, z)))): rails.append(q) return Contract(Box((0, 1, 0), (self.width - 1, 1, self.depth - 1)), rules=(Rule('support', tuple((x, 0, z) for x, _, z in rails)), Rule('expected', tuple(rails), data={'names': ['dark_oak_fence']})), decisions={'rails': rails}) def realize(self, ctx, contract): p = Plan() rails = set(tuple(q) for q in contract.decisions['rails']) neighbors = {'north': (0, -1), 'south': (0, 1), 'east': (1, 0), 'west': (-1, 0)} for x, y, z in sorted(rails): links = {side: str((x + dx, y, z + dz) in rails or ctx.view.supports(ctx.world((x + dx, y, z + dz)))).lower() for side, (dx, dz) in neighbors.items()} p.block((x, y, z), state_of('dark_oak_fence', waterlogged='false', **links), 'guard') return p @dataclass(frozen=True) class LoftDeck: width: int depth: int aperture: tuple def capability(self): return Capability('surface.loft-deck', ('floor', 'support'), guarantees=('bounded stair aperture', 'perimeter bearing')) def negotiate(self, ctx, parameters): holes = set(self.aperture) floor = tuple((x, 0, z) for x in range(self.width) for z in range(self.depth) if (x, 0, z) not in holes) bearings = tuple((x, -1, z) for x in (0, self.width - 1) for z in (0, self.depth - 1)) return Contract(Box((0, 0, 0), (self.width - 1, 0, self.depth - 1)), rules=(Rule('support', bearings), Rule('sealed', floor)), decisions={'floor': floor, 'aperture': self.aperture}) def realize(self, ctx, contract): p = Plan() for x, y, z in contract.decisions['floor']: p.block((x, y, z), state_of('dark_oak_planks' if x in (1, self.width - 2) or z in (1, self.depth - 2) else 'spruce_planks'), 'deck') return p @dataclass(frozen=True) class KneeWalls: width: int depth: int axis: str def capability(self): return Capability('wall.roof-knees', ('wall', 'enclosure'), guarantees=('supported closed eaves',)) def negotiate(self, ctx, parameters): cells = tuple((x, 1, z) for x in range(self.width) for z in range(self.depth) if (self.axis == 'z' and x in (0, self.width - 1) and 0 < z < self.depth - 1) or (self.axis == 'x' and z in (0, self.depth - 1) and 0 < x < self.width - 1)) return Contract(Box((0, 1, 0), (self.width - 1, 1, self.depth - 1)), rules=(Rule('support', tuple((x, 0, z) for x, _, z in cells)), Rule('sealed', cells)), decisions={'members': cells}) def realize(self, ctx, contract): p = Plan() for q in contract.decisions['members']: p.block(q, log('spruce', self.axis), 'knee-beam') return p @dataclass(frozen=True) class LoftInterior: purpose: str aperture: tuple landing: tuple def capability(self): return Capability('room.loft.' + self.purpose, ('room', 'habitable', 'roof-room', 'composite'), inputs={'purpose': Domain(choices=LOFT_PURPOSES)}, offers=('access',), guarantees=('reachable furnished loft', 'actual lighting', 'closed weather envelope'), assumptions=('roof-interior mount with floor and bounded stair aperture',)) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('loft-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind != 'roof-interior' or port.frame != ctx.frame: raise ContractError('loft-interface', ctx.path, ctx.frame.origin) w, d, height = (port.facts[k] for k in ('width', 'depth', 'height')) box = Box((-1, 0, -1), (w, height, d)) if not all(port.region.contains(ctx.world(q)) for q in box.corners()): raise ContractError('loft-envelope', ctx.path) center = (w // 2, 1, d // 2) floor = Box((1, 1, 1), (w - 2, 1, d - 2)) main = floor_path(ctx.view, ctx.frame, self.landing, center, floor) if not main: raise ContractError('loft-landing', ctx.path, ctx.world(self.landing), 'No level route from the promised stair landing') clear = {p for x, y, z in main for p in ((x, y, z), (x, y + 1, z))} occupied, apron, target = FurnitureGroup.placement_geometry() candidates = [] for x in range(1, w - 1): for z in range(1, d - 1): for turn in range(4): frame = Frame((x, 1, z), turn) body, use = frame.box(occupied), frame.box(apron) if not all(floor.contains((q[0], 1, q[2])) for q in (*body.corners(), *use.corners())): continue if any(q in clear for q in body.cells()) or ctx.view.protected(ctx.frame.box(body)): continue if any(name_of(ctx.state(q)) != 'air' for q in (*body.cells(), *use.cells())): continue if not all(ctx.view.supports(ctx.world((q[0], 0, q[2]))) for q in (*body.cells(), *use.cells())): continue candidates.append((frame, body, use)) # Spread useful groups toward both ends, with stable seeded tie breaks. jitter = ctx.rng('furniture-layout') scored = [(min(f.origin[0], w - 1 - f.origin[0], f.origin[2], d - 1 - f.origin[2]), jitter.random(), f, body, use) for f, body, use in candidates] selected, blocked, reserved = [], set(), set() desired = max(2, min(8, (w * d) // 38)) for _, _, frame, body, use in sorted(scored, key=lambda r: (r[0], r[1])): cells = set(body.cells()) if cells & (clear | reserved | blocked) or set(use.cells()) & blocked: continue approach = frame.point(target) path = floor_path(ctx.view, ctx.frame, center, approach, floor, blocked | cells) if not path: continue selected.append((frame.origin, frame.turn, approach)) blocked |= cells reserved |= set(use.cells()) clear |= {p for x, y, z in path for p in ((x, y, z), (x, y + 1, z))} if len(selected) == desired: break if len(selected) < 2: raise ContractError('loft-furnishing-space', ctx.path, ctx.world(center), 'Need two accessible complete furniture groups') # Sources sit above the route, keeping its full two-cell headroom. light_sites = [] for x, _, z in sorted(clear): q = (x, 3, z) if q in light_sites or q in blocked or name_of(ctx.state(q)) != 'air' or ctx.view.protected(ctx.frame.box(Box(q, q))): continue if all(abs(x - a) + abs(z - c) >= 5 for a, _, c in light_sites): light_sites.append(q) if not light_sites: raise ContractError('loft-light-space', ctx.path, ctx.world(center)) targets = (self.landing, center, *(r[2] for r in selected)) floor_cells = tuple((x, 0, z) for x in range(w) for z in range(d) if (x, 0, z) not in self.aperture) rules = (Rule('sealed', floor_cells), Rule('clear', tuple(sorted(clear))), Rule('route', targets, box, phase='complete'), Rule('light', targets, box, {'minimum': 1}, 'complete'), Rule('furnishing', box=box, data={'groups': GROUPS[self.purpose]}, phase='complete'), Rule('enclosed-volume', (center,), box, {'apertures': self.aperture}, 'complete')) return Contract(box, ports=(Port('landing', 'access', Frame(self.landing), Box(self.landing, (self.landing[0], self.landing[1] + 1, self.landing[2])), 4),), rules=rules, decisions={'purpose': self.purpose, 'center': center, 'doors': ('landing',), 'stair_up': False, 'stair_down': True, 'furniture': selected, 'lights': light_sites, 'aperture': self.aperture, 'axis': port.facts['axis'], 'width': w, 'depth': d, 'omitted_optional_stations': desired - len(selected)}) def realize(self, ctx, contract): p = Plan() w, d = contract.decisions['width'], contract.decisions['depth'] p.children.append(Child('collars', RoofCollars(w, d, contract.decisions['axis']))) for i, (origin, turn, _) in enumerate(contract.decisions['furniture']): purpose = self.purpose if i % 2 == 0 else ('library' if self.purpose == 'bedroom' else 'storage') p.children.append(Child('station-' + str(i), FurnitureGroup(purpose), frame=Frame(tuple(origin), turn))) p.children.append(Child('guard', ApertureGuard(w, d, self.aperture))) for i, q in enumerate(contract.decisions['lights']): p.children.append(Child('light-' + str(i), LoftLight(), frame=Frame(tuple(q)))) return p @dataclass(frozen=True) class LoftLight: maximum_hanger: int = 16 def capability(self): return Capability('light.roof-hanger', ('light',), inputs={'maximum_hanger': Domain(1, 64)}, guarantees=('actual light hung from measured roof support',)) def negotiate(self, ctx, parameters): top = next((y for y in range(1, self.maximum_hanger + 2) if ctx.view.supports(ctx.world((0, y, 0)))), None) if top is None: raise ContractError('loft-light-support', ctx.path, ctx.frame.origin) if any(name_of(ctx.state((0, y, 0))) != 'air' for y in range(top)): raise ContractError('loft-light-clearance', ctx.path, ctx.frame.origin) return Contract(Box((0, 0, 0), (0, top - 1, 0)), rules=(Rule('support', ((0, top, 0),)), Rule('expected', ((0, 0, 0),), data={'names': ['lantern']}), Rule('expected', tuple((0, y, 0) for y in range(1, top)), data={'names': ['chain']})), decisions={'top': top}) def realize(self, ctx, contract): p = Plan() # The lantern is visibly hung, with a continuous chain to an actual roof cell. p.block((0, 0, 0), state_of('lantern', hanging='true', waterlogged='false'), 'lantern') for y in range(1, contract.decisions['top']): p.block((0, y, 0), state_of('chain', axis='y', waterlogged='false'), 'hanger') return p @dataclass(frozen=True) class RoofPlatform: """Prepare a bounded floor before neighboring weather skins are installed.""" width: int depth: int axis: str def capability(self): return Capability('support.roof-platform', ('floor', 'support', 'composite'), inputs={'width': Domain(9, 64), 'depth': Domain(9, 128), 'axis': Domain(choices=('x', 'z'))}, offers=('roof-seat',), assumptions=('aligned upper-floor-access',), guarantees=('bounded open stair aperture', 'closed supported loft floor')) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('roof-platform-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind != 'upper-floor-access' or port.frame != ctx.frame: raise ContractError('roof-platform-interface', ctx.path, ctx.frame.origin) region = Box.enclosing(ctx.local(q) for q in port.region.corners()) box = Box((0, 0, 0), (self.width - 1, 2, self.depth - 1)) if region.lo[1] != 0 or not all(box.contains(q) for q in region.corners()): raise ContractError('loft-stair-aperture', ctx.path) aperture = tuple((x, 0, z) for x in range(region.lo[0], region.hi[0] + 1) for z in range(region.lo[2], region.hi[2] + 1)) landing = ctx.local(port.frame.point(tuple(port.facts['landing']))) facts = {'width': self.width, 'depth': self.depth, 'axis': self.axis, 'aperture': aperture, 'landing': landing, 'source': ctx.bindings[0].host, 'coordinate_space': 'port-local'} return Contract(box, ports=(Port('seat', 'roof-seat', Frame(), box, 1, facts=facts),), decisions=facts) def realize(self, ctx, contract): return Plan(children=[Child('floor', LoftDeck(self.width, self.depth, contract.decisions['aperture'])), Child('knees', KneeWalls(self.width, self.depth, self.axis))]) @dataclass(frozen=True) class InhabitedRoof: width: int depth: int axis: str material: str design: object = RoofDesign() purpose: str = 'bedroom' def capability(self): return Capability('roof.inhabited', ('roof', 'habitable', 'composite'), inputs={'purpose': Domain(choices=LOFT_PURPOSES), 'width': Domain(9, 64), 'depth': Domain(9, 128), 'axis': Domain(choices=('x', 'z'))}, offers=('access',), assumptions=('aligned upper-floor-access or prepared roof-seat with clear stair aperture', 'roof policy with roof-interior offer'), guarantees=('furnished accessible roof room', 'locked purpose', 'closed weather boundary')) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('inhabited-roof-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind not in ('upper-floor-access', 'roof-seat') or port.frame != ctx.frame: raise ContractError('inhabited-roof-interface', ctx.path, ctx.frame.origin) span = self.width if self.axis == 'z' else self.depth peak = max(self.design.heights(span)) box = Box((-1, 0, -1), (self.width, peak + 5, self.depth)) region = Box.enclosing(ctx.local(q) for q in port.region.corners()) if region.lo[1] != 0 or not all(box.contains(q) for q in region.corners()): raise ContractError('loft-stair-aperture', ctx.path) aperture = tuple((x, 0, z) for x in range(region.lo[0], region.hi[0] + 1) for z in range(region.lo[2], region.hi[2] + 1)) if port.kind == 'upper-floor-access' else tuple(tuple(q) for q in port.facts['aperture']) if port.kind == 'roof-seat' and any(port.facts[key] != getattr(self, key) for key in ('width', 'depth', 'axis')): raise ContractError('roof-seat-dimensions', ctx.path) landing = ctx.local(port.frame.point(tuple(port.facts['landing']))) access = Port('landing', 'access', Frame(landing), Box(landing, (landing[0], landing[1] + 1, landing[2])), 4, delegate=('room', 'landing')) return Contract(box, ports=(access,), decisions={'purpose': self.purpose, 'aperture': aperture, 'landing': landing, 'axis': self.axis, 'prepared_floor': port.kind == 'roof-seat', 'source': port.facts.get('source', ctx.bindings[0].host)}) def realize(self, ctx, contract): roof = self.design.component(self.width, self.depth, self.axis, self.material) if 'roof-interior' not in roof.capability().offers: raise ContractError('roof-interior-offer', ctx.path, conditions='Requested habitable roof requires a public roof-interior offer') aperture, landing = contract.decisions['aperture'], contract.decisions['landing'] p = Plan() if not contract.decisions['prepared_floor']: p.children.extend([Child('floor', LoftDeck(self.width, self.depth, aperture)), Child('knees', KneeWalls(self.width, self.depth, self.axis))]) p.children.extend([Child('weather', roof, frame=Frame((0, 1, 0))), Child('room', LoftInterior(self.purpose, aperture, landing), bindings=(Binding(ctx.path + '/weather', 'interior'),))]) floor_host = ctx.bindings[0].host if contract.decisions['prepared_floor'] else ctx.path + '/floor' p.relations.extend(((ctx.path + '/room', 'supported_by', floor_host), (ctx.path + '/room', 'connected_to', contract.decisions['source']))) return p
hearth/components/circulation.py
# Shared stair orientation and aperture geometry for room and roof planners. from dataclasses import dataclass from hearth import Box, Frame @dataclass(frozen=True) class StairLayout: """Describe a six-rise flight and landing in the enclosing room's local frame.""" width: int depth: int axis: str = 'z' @property def frame(self): if self.axis not in ('x', 'z'): raise ValueError('Stair axis must be x or z') return Frame() if self.axis == 'z' else Frame((0, 0, self.depth - 1), 3) @property def span(self): return self.width if self.axis == 'z' else self.depth @property def length(self): return self.depth if self.axis == 'z' else self.width @property def flight(self): return self.frame.compose(Frame((self.span - 4, 1, 2))) @property def slot(self): return self.frame.box(Box((self.span - 4, 0, 2), (self.span - 3, 0, 7))) @property def landing(self): return self.frame.point((self.span - 5, 1, 7))
hearth/components/facades.py
# Shared facade planning against explicit local service and framing exclusions. from dataclasses import dataclass from hearth import Box, Frame @dataclass(frozen=True) class FacadeDesign: """Arrange aligned openings while preserving local reserved volumes. Exclusions use room coordinates. They reserve design space for later children; they never grant write permission. The enclosing composition still validates all actual writes and affected contracts transactionally. """ height: int = 3 sill: int = 1 width: int = 2 planters: bool = True def openings(self, length, frame=Frame(), access=False, exclusions=()): if self.height not in (2, 3) or self.width not in (1, 2) or self.sill < 1 or self.sill + self.height > 4: raise ValueError('Facade openings require width 1..2, height 2..3, sill >=1 and top <=3') door = Box((length // 2 - 1, 0, -1), (length // 2 + 1, 1, 0)) if access else None candidates = [] for x in range(1, length - self.width): inner = Box((x, self.sill, 0), (x + self.width - 1, self.sill + self.height - 1, 0)) exterior = Box((x - 1, self.sill - 1, -2 if self.planters else -1), (x + self.width, self.sill + self.height - 1, 0)) if any(frame.box(inner).intersection(b) for b in exclusions) or (door and inner.intersection(door)): continue flush = any(frame.box(exterior).intersection(b) for b in exclusions) or bool(door and exterior.intersection(door)) candidates.append({'at': (x, self.sill, 0), 'width': self.width, 'height': self.height, 'flush': flush}) desired = 2 if length >= 9 else 1 targets = (2 if length >= 11 else 1, length - self.width - (2 if length >= 11 else 1)) if desired == 2 else ((length - self.width) // 2,) chosen = [] for target in targets: feasible = [c for c in candidates if all(abs(c['at'][0] - q['at'][0]) >= self.width + 1 for q in chosen)] if not feasible: continue c = min(feasible, key=lambda q: (abs(q['at'][0] - target), q['flush'], q['at'][0])) chosen.append(c) return tuple(sorted(chosen, key=lambda q: q['at'][0])) def local_exclusions(exclusions, frame): """Convert enclosing design reservations into a child's local coordinates.""" return tuple(Box.enclosing(frame.inverse(p) for p in b.corners()) for b in exclusions)
hearth/components/domestic.py
# Purpose-specific interior stations with explicit, protected interaction aprons. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Port, Rule, Plan from hearth.blocks import state_of, slab, stairs from .furnishing import supplies @dataclass(frozen=True) class DomesticSuite: """A compact room station substitutable through its interaction interface.""" purpose: str width: int = 3 def capability(self): return Capability('furnishing.suite.' + self.purpose, ('furniture', 'station'), inputs={'width': Domain(choices=(2, 3)), 'purpose': Domain(choices=('gathering', 'study', 'cooking', 'craft', 'cabinet'))}, offers=('interaction',), guarantees=('supported station', 'two-block interaction apron', 'actual function')) def negotiate(self, ctx, parameters): if self.width not in (2, 3) or self.purpose not in ('gathering', 'study', 'cooking', 'craft', 'cabinet'): raise ContractError('domestic-suite-domain', ctx.path) apron = Box((0, 0, 2), (self.width - 1, 1, 2)) area = Box((0, 0, 0), (self.width - 1, 2, 2)) function = {'gathering': [['dark_oak_stairs'], ['birch_pressure_plate']], 'study': [['bookshelf'], ['lectern']], 'cooking': [['smoker'], ['water_cauldron']], 'craft': [['crafting_table'], ['anvil']], 'cabinet': [['barrel']]} return Contract(area, ports=(Port('use', 'interaction', Frame((0, 0, 2)), apron, 4),), rules=(Rule('support', tuple((x, -1, z) for x in range(self.width) for z in range(3))), Rule('clear', tuple(apron.cells())), Rule('furnishing', box=area, data={'groups': function[self.purpose]}, phase='complete')), decisions={'purpose': self.purpose, 'width': self.width}, atomic_object=True) def realize(self, ctx, contract): p, w = Plan(), self.width barrel = state_of('barrel', facing='south', open='false') if self.purpose == 'gathering': for x in range(w): p.block((x, 0, 0), stairs('dark_oak', 'north'), 'settee') if x != w // 2: p.block((x, 0, 1), state_of('yellow_carpet'), 'hearth-rug') p.block((w // 2, 0, 1), state_of('dark_oak_fence', north='false', south='false', east='false', west='false', waterlogged='false'), 'table-base') p.block((w // 2, 1, 1), state_of('birch_pressure_plate', powered='false'), 'tabletop') elif self.purpose == 'study': for x in range(w): p.block((x, 0, 0), state_of('bookshelf'), 'bookcase') if x in (0, w - 1): p.block((x, 1, 0), state_of('bookshelf'), 'bookcase') p.block((x, 2, 0), slab('dark_oak'), 'bookcase-cornice') p.block((0, 0, 1), state_of('lectern', facing='south', has_book='false', powered='false'), 'reading-desk') p.block((w - 1, 0, 1), stairs('dark_oak', 'north'), 'reading-seat') elif self.purpose == 'cooking': for x in range(w): material = state_of('smoker', facing='south', lit='false') if x == 0 else state_of('water_cauldron', level='3') if x == w - 1 else barrel p.block((x, 0, 0), material, 'cooking-counter', nbt=supplies() if x not in (0, w - 1) else None) p.block((x, 2, 0), slab('dark_oak', 'top'), 'pot-shelf') p.block((0, 1, 0), state_of('iron_trapdoor', facing='north', half='top', open='false', powered='false', waterlogged='false'), 'stove-hood') p.block((0, 0, 1), state_of('crafting_table'), 'preparation') p.block((w - 1, 0, 1), state_of('brown_carpet'), 'work-mat') elif self.purpose == 'craft': for x in range(w): p.block((x, 0, 0), state_of('crafting_table' if x == 0 else 'smithing_table'), 'workbench') p.block((x, 2, 0), slab('dark_oak', 'top'), 'tool-shelf') p.block((0, 0, 1), state_of('anvil', facing='north'), 'anvil') p.block((w - 1, 0, 1), barrel, 'supplies', nbt=supplies()) else: for x in range(w): for y in range(2): p.block((x, y, 0), barrel, 'cabinet', nbt=supplies()) p.block((x, 2, 0), slab('dark_oak'), 'cabinet-cornice') p.block((x, 0, 1), state_of('brown_carpet'), 'storage-runner') return p
hearth/components/borders.py
# Ground-supported planting from public boundary geometry and measured free space. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Rule, Port, Plan, Child, Binding from hearth.blocks import name_of, state_of @dataclass(frozen=True) class GardenPlant: species: str = 'fern' def capability(self): return Capability('plant.garden.' + self.species, ('plant', 'garden'), inputs={'species': Domain(choices=('fern', 'azalea', 'flowering_azalea', 'poppy', 'allium', 'rose_bush'))}, assumptions=('actual soil support',), guarantees=('whole plant', 'supported')) def negotiate(self, ctx, parameters): if self.species not in ('fern', 'azalea', 'flowering_azalea', 'poppy', 'allium', 'rose_bush'): raise ContractError('garden-plant-domain', ctx.path) if name_of(ctx.state((0, -1, 0))) not in ('grass_block', 'dirt', 'coarse_dirt', 'podzol', 'rooted_dirt', 'moss_block'): raise ContractError('planting-substrate', ctx.path, ctx.world((0, -1, 0))) height = 2 if self.species == 'rose_bush' else 1 return Contract(Box((0, 0, 0), (0, height - 1, 0)), rules=(Rule('support', ((0, -1, 0),)), Rule('expected', tuple((0, y, 0) for y in range(height)), data={'names': [self.species]})), atomic_object=True) def realize(self, ctx, contract): p = Plan() if self.species == 'rose_bush': for y, half in enumerate(('lower', 'upper')): p.block((0, y, 0), state_of(self.species, half=half), 'plant') else: p.block((0, 0, 0), state_of(self.species), 'plant') return p @dataclass(frozen=True) class BoundaryPlanting: """Plant a soft border near a discovered footprint; never excavate or fill.""" host: str terrain: str density: float = .55 minimum_distance: int = 2 maximum_distance: int = 4 def capability(self): return Capability('garden.boundary-border', ('garden', 'composite'), assumptions=('footprint-boundary interface',), adaptations=('actual soil and clearance', 'cluster density'), inputs={'density': Domain(0, 1), 'minimum_distance': Domain(1, 6), 'maximum_distance': Domain(1, 6)}, guarantees=('no terrain edits', 'retained paths and existing consumers')) def negotiate(self, ctx, parameters): if not 0 <= self.density <= 1 or not 1 <= self.minimum_distance <= self.maximum_distance <= 6: raise ContractError('border-domain', ctx.path) ports = ctx.view.offers(self.host, 'footprint-boundary') if not ports: raise ContractError('planting-boundary-interface', ctx.path, conditions='Host must expose a footprint-boundary port') port = ports[0] points = tuple(ctx.local(port.frame.point(tuple(q))) for q in port.facts['outline']) radius = self.maximum_distance box = Box.enclosing(points).expand(radius) # Surface observations determine height, not the boundary's nominal Y. candidates, rejected = [], {'unknown': 0, 'substrate': 0, 'occupied_or_protected': 0} edge = {(x, z) for x, _, z in points} for x in range(box.lo[0], box.hi[0] + 1): for z in range(box.lo[2], box.hi[2] + 1): distance = min(abs(x - a) + abs(z - b) for a, b in edge) if not self.minimum_distance <= distance <= radius: continue # A stable field creates patches instead of a uniform perimeter hedge. patch = ctx.scope.child(f'patch-{x // 3}-{z // 3}').stream('density').uniform(.2, 1) rng = ctx.scope.child(f'cell-{x}-{z}').stream('planting') if rng.random() > self.density * patch: continue wp = ctx.world((x, 0, z)) if ctx.view.domain and not (ctx.view.domain.lo[0] <= wp[0] <= ctx.view.domain.hi[0] and ctx.view.domain.lo[2] <= wp[2] <= ctx.view.domain.hi[2]): rejected['unknown'] += 1 continue y = ctx.elevation(x, z) + 1 if name_of(ctx.state((x, y - 1, z))) not in ('grass_block', 'podzol', 'dirt'): rejected['substrate'] += 1 continue area = Box((x, y, z), (x, y + 1, z)) if not all(ctx.view.domain.contains(ctx.world(q)) for q in area.corners()): rejected['unknown'] += 1 continue if any(name_of(ctx.state(q)) != 'air' for q in area.cells()) or ctx.view.protected(ctx.frame.box(area)): rejected['occupied_or_protected'] += 1 continue species = rng.choice(('fern', 'fern', 'azalea', 'flowering_azalea', 'poppy', 'allium', 'rose_bush')) candidates.append(((x, y, z), species)) bounds = Box.enclosing([*points, *(p for p, _ in candidates), *((p[0], p[1] + 1, p[2]) for p, _ in candidates)]) return Contract(bounds, decisions={'plants': candidates, 'rejected': rejected, 'optional_minimum': 0, 'outline': points}) def realize(self, ctx, contract): p = Plan() for q, species in contract.decisions['plants']: p.children.append(Child(f'plant-{q[0]}-{q[2]}', GardenPlant(species), frame=Frame(tuple(q)), bindings=(Binding(self.terrain, 'planting', 'plant'),))) p.relations.append((ctx.path, 'landscapes', self.host)) return p
hearth/components/windowbox.py
# Window-mounted planting with scoped sill replacement and actual masonry anchors. from dataclasses import dataclass from hearth import Box, ContractError from hearth.kernel import Capability, Contract, Plan, Rule from hearth.blocks import state_of @dataclass(frozen=True) class WindowBox: flowers: tuple[str, ...] = ('poppy', 'cornflower', 'oxeye_daisy') def capability(self): return Capability('garden.window-box', ('planter', 'plant', 'attachment'), assumptions=('window garden mounting interface',), guarantees=('soil supports flowers', 'wall anchors', 'within negotiated facade projection')) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('window-box-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind != 'window-garden' or port.frame != ctx.frame: raise ContractError('window-box-interface', ctx.path, ctx.frame.origin) if not self.flowers or any(f not in ('poppy', 'cornflower', 'oxeye_daisy', 'allium', 'azure_bluet') for f in self.flowers): raise ContractError('window-box-flower-domain', ctx.path) width = port.facts['width'] framed = port.facts.get('depth', 1) == 2 box = Box((-1 if framed else 0, 0, -1 if framed else 0), (width if framed else width - 1, 1, 0)) if not all(port.region.contains(ctx.world(p)) for p in box.corners()): raise ContractError('window-box-region', ctx.path) boards = tuple((x, 0, -1) for x in range(width)) + ((-1, 0, 0), (width, 0, 0)) if framed else () return Contract(box, rules=(Rule('support', tuple((x, 0, 1) for x in range(width)) + tuple((x, 0, 0) for x in range(width))), Rule('expected', tuple((x, 1, 0) for x in range(width)), data={'names': list(self.flowers)}), Rule('expected', boards, data={'names': ['spruce_trapdoor']})), decisions={'width': width, 'framed': framed}, atomic_object=True) def realize(self, ctx, contract): p = Plan() rng = ctx.rng('flowers') for x in range(contract.decisions['width']): p.block((x, 0, 0), state_of('rooted_dirt'), 'planting-soil') p.block((x, 1, 0), state_of(rng.choice(self.flowers)), 'flower') if contract.decisions['framed']: p.block((x, 0, -1), state_of('spruce_trapdoor', facing='north', half='bottom', open='true', powered='false', waterlogged='false'), 'front-board') if contract.decisions['framed']: for x, side in ((-1, 'west'), (contract.decisions['width'], 'east')): p.block((x, 0, 0), state_of('spruce_trapdoor', facing=side, half='bottom', open='true', powered='false', waterlogged='false'), 'end-board') return p
hearth/components/ceiling.py
# Shallow ceiling timbers fitted to public room interfaces and actual clearances. from dataclasses import dataclass from hearth import Box, ContractError from hearth.kernel import Capability, Contract, Rule, Plan from hearth.blocks import name_of, log @dataclass(frozen=True) class CeilingTimbers: def capability(self): return Capability('interior.ceiling-timbers', ('decoration', 'timber-frame', 'ceiling-trim'), assumptions=('ceiling-decoration interface with actual overhead support',), adaptations=('omit cells at stair voids, lights and protected headroom',), guarantees=('one-cell projection', 'retained headroom', 'overhead bearing')) def negotiate(self, ctx, parameters): if len(ctx.bindings) != 1: raise ContractError('ceiling-host', ctx.path) port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) if port.kind != 'ceiling-decoration' or port.frame != ctx.frame: raise ContractError('ceiling-interface', ctx.path, ctx.frame.origin) w, d = port.facts['width'], port.facts['depth'] points = {(x, 0, z): 'x' for z in (2, d - 3) for x in range(1, w - 1)} points.update({(w // 2, 0, z): 'z' for z in range(1, d - 1)}) members = [] for q, axis in sorted(points.items()): area = ctx.frame.box(Box(q, q)) above = (q[0], q[1] + 1, q[2]) if name_of(ctx.state(q)) == 'air' and ctx.view.supports(ctx.world(above)) and not ctx.view.protected(area): members.append((q, axis)) anchors = tuple((q[0], 1, q[2]) for q, _ in members) box = Box((1, 0, 1), (w - 2, 0, d - 2)) if not all(port.region.contains(ctx.world(q)) for q in box.corners()): raise ContractError('ceiling-region', ctx.path) return Contract(box, rules=(Rule('support', anchors), Rule('expected', tuple(q for q, _ in members), data={'names': ['stripped_dark_oak_log']})), decisions={'members': members, 'omitted_for_structure_or_clearance': len(points) - len(members)}) def realize(self, ctx, contract): p = Plan() for q, axis in contract.decisions['members']: p.block(q, log('stripped_dark_oak', axis), 'ceiling-member') return p
hearth/adapters/site.py
# Measured, bounded support and access strategies independent of terrain recipes. from dataclasses import dataclass from hearth.space import Box, Frame from hearth.blocks import state_of, log, stairs, name_of, solid from hearth.kernel import Capability, Contract, Port, Grant, Rule, Plan, ContractError @dataclass(frozen=True) class SiteLimits: relief: int = 5 support_height: int = 8 approach_length: int = 12 fill_volume: int = 1600 excavation_volume: int = 300 bed_thickness: int = 2 def survey(ctx, footprint, limits=SiteLimits()): samples = {} for x, z in sorted(footprint): wx, _, wz = ctx.world((x, 0, z)) obs = ctx.view.sample(wx, wz) if obs.support_depth < limits.bed_thickness: raise ContractError('substrate-depth', ctx.path, (wx, obs.elevation, wz), f'Require {limits.bed_thickness} contiguous solid bed cells, found {obs.support_depth}') samples[(x, z)] = (obs.elevation - ctx.frame.origin[1], None if obs.water is None else obs.water - ctx.frame.origin[1], obs.support_depth) heights = [v[0] for v in samples.values()] relief = max(heights) - min(heights) if relief > limits.relief: raise ContractError('site-relief', ctx.path, ctx.frame.origin, f'Measured {relief}, permitted {limits.relief}') surface = max(max(v[0], v[1] if v[1] is not None else v[0]) for v in samples.values()) floor = surface + 1 if floor - min(heights) > limits.support_height: raise ContractError('support-height', ctx.path, ctx.frame.origin, 'Bounded support depth exceeded') wet = any(v[1] is not None and v[1] >= v[0] for v in samples.values()) strategies = ['piers'] if wet or relief >= 3 else ['stepped', 'piers'] strategy = ctx.scope.choose(strategies, 'adaptation') return {'floor': floor, 'relief': relief, 'wet': wet, 'strategy': strategy, 'samples': samples, 'feasible_strategies': strategies} @dataclass(frozen=True) class Foundation: footprint: tuple[tuple[int, int], ...] floor: int strategy: str limits: SiteLimits = SiteLimits() @classmethod def rectangular(cls, width, depth, floor, strategy='stepped', limits=SiteLimits()): """Create a rectangular contact component without client voxel operations.""" if width < 1 or depth < 1: raise ValueError('Positive footprint dimensions required') return cls(tuple((x, z) for x in range(width) for z in range(depth)), floor, strategy, limits) def capability(self): return Capability('adapter.foundation', ('siteworks', 'support'), offers=('support',), assumptions=('actual bed within bounded depth',), adaptations=('stepped perimeter', 'piers to bed'), guarantees=('grounded support grid',)) def negotiate(self, ctx, parameters): positions = set(self.footprint) supports = [] columns = [] for x, z in sorted(positions): boundary = any((x + dx, z + dz) not in positions for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1))) grid = (x % 4 == 0 and z % 4 == 0) # Piers include perimeter every third cell and all corners. edge_pier = boundary and (x % 3 == 0 or z % 3 == 0 or sum((x + dx, z + dz) not in positions for dx, dz in ((1, 0), (-1, 0), (0, 1), (0, -1))) >= 2) if not (grid or (boundary if self.strategy == 'stepped' else edge_pier)): continue wx, _, wz = ctx.world((x, 0, z)) bed = ctx.view.elevation(wx, wz) - ctx.frame.origin[1] if self.floor - bed > self.limits.support_height: raise ContractError('support-height', ctx.path, ctx.world((x, bed, z))) supports.extend((x, bed - k, z) for k in range(self.limits.bed_thickness)) columns.append((x, bed, z, self.floor - 1)) count = sum(max(0, top - bed) for x, bed, z, top in columns) if count > self.limits.fill_volume: raise ContractError('fill-volume', ctx.path, conditions=f'{count} > {self.limits.fill_volume}') for x, bed, z, top in columns: supports.extend((x, y, z) for y in range(bed + 1, top + 1)) box = Box.enclosing([(x, bed - self.limits.bed_thickness + 1, z) for x, bed, z, top in columns] + [(x, self.floor - 1, z) for x, bed, z, top in columns]) return Contract(box, rules=(Rule('support', tuple(supports)),), decisions={'columns': columns, 'strategy': self.strategy, 'fill': count, 'excavation': 0}, reads=(box,)) def realize(self, ctx, contract): p = Plan() for x, bed, z, top in contract.decisions['columns']: for y in range(bed + 1, top + 1): material = log('spruce') if self.strategy == 'piers' and y > bed + 1 else state_of('stone_bricks') p.block((x, y, z), material, 'contact') return p @dataclass(frozen=True) class Approach: center: int floor: int porch: int = 0 limits: SiteLimits = SiteLimits() def capability(self): return Capability('adapter.approach', ('siteworks', 'access'), offers=('street', 'surface'), adaptations=('stairs', 'landing', 'bounded fill'), guarantees=('two-block headroom', 'entrance connection')) def negotiate(self, ctx, parameters): rows = [] for step in range(1, self.limits.approach_length + 1): z = -self.porch - step wx, _, wz = ctx.world((self.center, 0, z)) ground = max(max(ctx.view.elevation(ctx.world((x, 0, z))[0], ctx.world((x, 0, z))[2], maximum=self.floor + ctx.frame.origin[1] + 2), (ctx.view.water(ctx.world((x, 0, z))[0], ctx.world((x, 0, z))[2]) or -10000) + 1) - ctx.frame.origin[1] for x in range(self.center - 1, self.center + 2)) y = max(ground, self.floor - step + 1) rows.append((z, y)) if y == ground: break else: raise ContractError('approach-detour', ctx.path, ctx.frame.origin, 'Cannot meet terrain within length bound') cells = [] support = [] for z, y in rows: cells.extend((x, y + k, z) for x in range(self.center - 1, self.center + 2) for k in (1, 2)) support.extend((x, y, z) for x in range(self.center - 1, self.center + 2)) low = min(ctx.view.elevation(*((lambda p: (p[0], p[2]))(ctx.world((x, 0, z)))), maximum=self.floor + ctx.frame.origin[1] + 2) - ctx.frame.origin[1] for z, y in rows for x in range(self.center - 1, self.center + 2)) box = Box((self.center - 1, low, rows[-1][0]), (self.center + 1, max(y for z, y in rows) + 3, -self.porch - 1)) end = (self.center, rows[-1][1] + 1, rows[-1][0]) region = Box((self.center - 1, rows[-1][1], rows[-1][0]), (self.center + 1, max(self.floor, max(h for _, h in rows)) + 2, min(-self.porch - 1, rows[-1][0] + 1))) port = Port('street', 'access', Frame(end), region, 10, 'surface') grant = Grant('surface', region, ('surface',), ('path',), 18) route = tuple((self.center, y + 1, z) for z, y in rows) return Contract(box, (port,), (grant,), (Rule('clear', tuple(cells)), Rule('support', tuple(support)), Rule('route', route, box.expand(1), phase='complete')), decisions={'rows': rows, 'end': end}, reads=(box,)) def realize(self, ctx, contract): p = Plan() rows = contract.decisions['rows'] for index, (z, y) in enumerate(rows): for x in range(self.center - 1, self.center + 2): wx, _, wz = ctx.world((x, 0, z)) bed = ctx.view.elevation(wx, wz, maximum=self.floor + ctx.frame.origin[1] + 2) - ctx.frame.origin[1] for yy in range(bed + 1, y): p.block((x, yy, z), state_of('cobblestone'), 'step-footing') p.block((x, y, z), stairs('stone_brick', 'south') if index and rows[index - 1][1] > y else state_of('stone_bricks'), 'treads') return p
hearth/adapters/__init__.py
# Reusable environmental contact and circulation adapters. from .site import Foundation, Approach, SiteLimits, survey
hearth/adapters/bearing.py
# Small continuous bearing courses spanning explicitly measured support columns. from dataclasses import dataclass from hearth import Box, ContractError from hearth.kernel import Capability, Contract, Domain, Rule, Plan from hearth.blocks import state_of, solid @dataclass(frozen=True) class BearingCourse: width: int depth: int span: int = 2 def capability(self): return Capability('adapter.bearing-course', ('siteworks', 'support'), inputs={'width': Domain(1, 7), 'depth': Domain(1, 7), 'span': Domain(0, 3)}, assumptions=('actual support beneath a bounded plate',), guarantees=('continuous bearing surface', 'bounded taxicab span to actual supports')) def negotiate(self, ctx, parameters): cells = tuple((x, 0, z) for x in range(self.width) for z in range(self.depth)) anchors = tuple((x, -1, z) for x, _, z in cells if solid(ctx.state((x, -1, z)))) if not anchors or any(min(abs(x - a) + abs(z - b) for a, _, b in anchors) > self.span for x, _, z in cells): raise ContractError('bearing-span', ctx.path, ctx.frame.origin, f'Need support within {self.span} cells of every bearing cell') missing = tuple(p for p in cells if not solid(ctx.state(p))) return Contract(Box((0, -1, 0), (self.width - 1, 0, self.depth - 1)), rules=(Rule('support', cells + anchors),), decisions={'anchors': anchors, 'fill_cells': missing, 'fill': len(missing), 'span': self.span}) def realize(self, ctx, contract): p = Plan() for q in contract.decisions['fill_cells']: p.block(q, state_of('stone_bricks'), 'bearing-course') return p
hearth_extensions/interiors.py
# Functional furnishing stations arranged around protected circulation in polygon interiors. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Domain, Port, Rule, Plan, Child from hearth.blocks import state_of, stairs, passable from .geometry import Polygon, perimeter, bounds2 FUNCTION_GROUPS = {'library': [['bookshelf'], ['lectern']], 'workshop': [['crafting_table'], ['smithing_table']], 'kitchen': [['smoker'], ['furnace']], 'bedroom': [['red_bed']], 'living': [['spruce_stairs']], 'storage': [['barrel']]} @dataclass(frozen=True) class WorkBay: purpose: str def capability(self): return Capability('extension.work-bay', ('furniture', self.purpose), offers=('interaction',), inputs={'purpose': Domain(choices=tuple(FUNCTION_GROUPS))}, guarantees=('functionally furnished', 'supported', 'clear interaction space')) def negotiate(self, ctx, parameters): interaction = ((0, 0, 2), (1, 0, 2)) support = tuple((x, -1, z) for x in range(2) for z in range(3)) clear = tuple((x, y, 2) for x in range(2) for y in range(2)) area = Box((0, 0, 0), (1, 1, 1)) return Contract(Box((0, -1, 0), (1, 1, 2)), ports=(Port('use', 'interaction', Frame(interaction[0]), Box(interaction[0], (1, 1, 2)), 4),), rules=(Rule('support', support), Rule('clear', clear), Rule('furnishing', box=area, data={'groups': FUNCTION_GROUPS[self.purpose]}, phase='complete')), atomic_object=True) def realize(self, ctx, contract): plan = Plan() barrel = state_of('barrel', facing='south', open='false') inventory = {'id': 'minecraft:barrel', 'Items': [{'Slot': 0, 'id': 'minecraft:bread', 'count': 6}, {'Slot': 1, 'id': 'minecraft:torch', 'count': 12}]} plan.block((1, 0, 0), barrel, 'supplies', nbt=inventory) if self.purpose == 'library': for y in range(2): plan.block((0, y, 0), state_of('bookshelf'), 'shelving') plan.block((0, 0, 1), state_of('lectern', facing='south', has_book='false', powered='false'), 'reading') plan.block((1, 0, 1), stairs('spruce', 'north'), 'seat') elif self.purpose in ('workshop', 'kitchen'): a, b = ('crafting_table', 'smithing_table') if self.purpose == 'workshop' else ('smoker', 'furnace') properties = {'facing': 'south', 'lit': 'false'} if self.purpose == 'kitchen' else {} plan.block((0, 0, 0), state_of(a, **properties), 'workstation') plan.block((0, 0, 1), state_of(b, **properties), 'workstation') plan.block((1, 0, 1), stairs('spruce', 'north'), 'seat') elif self.purpose == 'bedroom': for z, part in ((0, 'head'), (1, 'foot')): plan.block((0, 0, z), state_of('red_bed', facing='north', part=part, occupied='false'), 'bed') plan.block((1, 0, 1), state_of('red_carpet'), 'bedside') elif self.purpose == 'living': plan.block((0, 0, 0), stairs('spruce', 'south'), 'seat') plan.block((1, 0, 1), stairs('spruce', 'north'), 'seat') plan.block((0, 0, 1), state_of('spruce_fence', north='false', south='false', east='false', west='false', waterlogged='false'), 'table') plan.block((0, 1, 1), state_of('spruce_pressure_plate', powered='false'), 'table') else: for x, y, z in ((0, 0, 0), (0, 1, 0), (0, 0, 1)): plan.block((x, y, z), barrel, 'storage', nbt=inventory) return plan @dataclass(frozen=True) class HallInterior: footprint: Polygon purpose: str minimum: int = 2 maximum: int = 8 area_per_bay: int = 42 def capability(self): return Capability('extension.hall-interior', ('interior', 'furniture', 'composite'), inputs={'purpose': Domain(choices=tuple(FUNCTION_GROUPS)), 'minimum': Domain(1, 8), 'maximum': Domain(1, 12), 'area_per_bay': Domain(16, 100)}, adaptations=('fit functional bays around a circulation cross',), guarantees=('accessible furnishing stations', 'protected three-cell central aisles')) def negotiate(self, ctx, parameters): footprint = set(self.footprint.cells()) inside = footprint - set(perimeter(footprint, diagonal=True)) width = max(x for x, z in footprint) + 1 depth = max(z for x, z in footprint) + 1 cx, cz = width // 2, depth // 2 if self.minimum > self.maximum: raise ContractError('interior-domain', ctx.path, conditions='Minimum exceeds maximum') aisle = {(x, z) for x, z in inside if abs(x - cx) <= 1 or abs(z - cz) <= 1} candidates = [] rng = ctx.rng('planning') for x, z in sorted(inside): for turn in range(4): frame = Frame((x, 0, z), turn) cells = {(frame.point((u, 0, v))[0], frame.point((u, 0, v))[2]) for u in range(2) for v in range(3)} body = {(frame.point((u, 0, v))[0], frame.point((u, 0, v))[2]) for u in range(2) for v in range(2)} if not cells <= inside or body & aisle: continue front = frame.point((0, 0, 2)) if (front[0] - x) * (cx - x) + (front[2] - z) * (cz - z) <= 0: continue if not all(passable(ctx.state((u, y, v))) for u, v in cells for y in range(2)): continue quadrant = (x < cx, z < cz) candidates.append((frame, cells, body, quadrant, rng.random())) wanted = min(self.maximum, max(self.minimum, len(inside) // self.area_per_bay)) selected = [] used = set() while candidates and len(selected) < wanted: def score(item): frame, cells, body, quadrant, tie = item x, _, z = frame.origin separation = min((abs(x - v[0].origin[0]) + abs(z - v[0].origin[2]) for v in selected), default=width + depth) balance = sum(v[3] == quadrant for v in selected) return (balance, -separation, min(x, z, width - 1 - x, depth - 1 - z), tie, frame.origin, frame.turn) choice = min(candidates, key=score) selected.append(choice) used |= choice[1] candidates = [v for v in candidates if not v[1] & used and all(abs(v[0].origin[0] - old[0].origin[0]) + abs(v[0].origin[2] - old[0].origin[2]) >= 4 for old in selected)] if len(selected) < self.minimum: raise ContractError('interior-capacity', ctx.path, conditions=f'{len(selected)} bays fit; {self.minimum} required') targets = ((cx, 0, cz), *(v[0].point((0, 0, 2)) for v in selected)) clear = tuple((x, y, z) for x, z in sorted(aisle) for y in (0, 1)) envelope = bounds2(footprint, -1, 2) return Contract(envelope, rules=(Rule('clear', clear), Rule('route', targets, envelope, phase='complete')), decisions={'frames': [(v[0].origin, v[0].turn) for v in selected], 'requested_bays': wanted, 'placed_bays': len(selected), 'minimum_bays': self.minimum, 'omitted_optional': wanted - len(selected), 'purpose': self.purpose}) def realize(self, ctx, contract): return Plan(children=[Child(f'bay-{i}', WorkBay(self.purpose), frame=Frame(tuple(origin), turn)) for i, (origin, turn) in enumerate(contract.decisions['frames'])])
hearth_extensions/geometry.py
# Portable design geometry and deterministic voxelization shared by extension components. from dataclasses import dataclass import math from hearth.space import Box CARDINAL = ((1, 0), (-1, 0), (0, 1), (0, -1)) def lattice(value): """Round consistently across native Python and browser Python.""" return math.floor(value + 0.5) @dataclass(frozen=True) class Polyline: points: tuple[tuple[float, float], ...] def __post_init__(self): object.__setattr__(self, 'points', tuple(tuple(p) for p in self.points)) if len(self.points) < 2 or any(len(p) != 2 or not all(math.isfinite(v) for v in p) for p in self.points): raise ValueError('A finite polyline needs at least two two-dimensional points') if any(a == b for a, b in zip(self.points, self.points[1:])): raise ValueError('Repeated consecutive control points') @classmethod def bezier(cls, controls, segments=32): if len(controls) != 4 or not 4 <= segments <= 256: raise ValueError('Cubic curves require four controls and 4..256 samples') points = [] for i in range(segments + 1): t = i / segments weights = ((1 - t)**3, 3 * t * (1 - t)**2, 3 * t * t * (1 - t), t**3) points.append(tuple(sum(w * p[k] for w, p in zip(weights, controls)) for k in (0, 1))) return cls(tuple(points)) @property def length(self): return sum(math.dist(a, b) for a, b in zip(self.points, self.points[1:])) def nearest(self, point): """Return distance, arc length, tangent and projection with stable tie breaks.""" best, walked = None, 0.0 for index, (a, b) in enumerate(zip(self.points, self.points[1:])): dx, dz = b[0] - a[0], b[1] - a[1] length = math.hypot(dx, dz) t = max(0, min(1, ((point[0] - a[0]) * dx + (point[1] - a[1]) * dz) / length**2)) q = (a[0] + t * dx, a[1] + t * dz) item = (math.dist(point, q), walked + t * length, index, (dx / length, dz / length), q) if best is None or item[:3] < best[:3]: best = item walked += length return best[0], best[1], best[3], best[4] def cells(self): """Rasterize a connected cardinal chain, retaining explicit diagonal turns.""" result = [] for a, b in zip(self.points, self.points[1:]): count = max(1, math.ceil(math.dist(a, b) * 4)) for i in range(count + 1): target = tuple(lattice(a[k] + (b[k] - a[k]) * i / count) for k in (0, 1)) if not result: result.append(target) while result[-1] != target: x, z = result[-1] tx, tz = target candidates = [] if x != tx: candidates.append((x + (1 if tx > x else -1), z)) if z != tz: candidates.append((x, z + (1 if tz > z else -1))) result.append(min(candidates, key=lambda p: (self.nearest(p)[0], p))) return tuple(result) def ribbon(self, radius, caps=False): xmin = math.floor(min(p[0] for p in self.points) - radius) xmax = math.ceil(max(p[0] for p in self.points) + radius) zmin = math.floor(min(p[1] for p in self.points) - radius) zmax = math.ceil(max(p[1] for p in self.points) + radius) a, b = self.points[0], self.points[-1] start = (self.points[1][0] - a[0], self.points[1][1] - a[1]) end = (b[0] - self.points[-2][0], b[1] - self.points[-2][1]) result = [] for x in range(xmin, xmax + 1): for z in range(zmin, zmax + 1): distance, station, _, _ = self.nearest((x, z)) if not caps and ((station <= 1e-9 and (x - a[0]) * start[0] + (z - a[1]) * start[1] < 0) or (station >= self.length - 1e-9 and (x - b[0]) * end[0] + (z - b[1]) * end[1] > 0)): continue if distance <= radius + 0.05: result.append((x, z)) return tuple(result) @dataclass(frozen=True) class Polygon: vertices: tuple[tuple[int, int], ...] def __post_init__(self): object.__setattr__(self, 'vertices', tuple(tuple(p) for p in self.vertices)) if len(self.vertices) < 3: raise ValueError('At least three polygon vertices required') @classmethod def chamfered(cls, width, depth, corner=0): if not 9 <= width <= 27 or not 9 <= depth <= 27 or not 0 <= corner <= min(width, depth) // 3: raise ValueError('Footprint domain: dimensions 9..27, corner 0..one third') x, z, c = width - 1, depth - 1, corner return cls(((0, 0), (x, 0), (x, z), (0, z)) if not c else ((c, 0), (x - c, 0), (x, c), (x, z - c), (x - c, z), (c, z), (0, z - c), (0, c))) def cells(self): result = [] for x in range(min(p[0] for p in self.vertices), max(p[0] for p in self.vertices) + 1): for z in range(min(p[1] for p in self.vertices), max(p[1] for p in self.vertices) + 1): inside = False edge = False for a, b in zip(self.vertices, self.vertices[1:] + self.vertices[:1]): cross = (x - a[0]) * (b[1] - a[1]) - (z - a[1]) * (b[0] - a[0]) if cross == 0 and min(a[0], b[0]) <= x <= max(a[0], b[0]) and min(a[1], b[1]) <= z <= max(a[1], b[1]): edge = True if (a[1] > z) != (b[1] > z) and x < (b[0] - a[0]) * (z - a[1]) / (b[1] - a[1]) + a[0]: inside = not inside if edge or inside: result.append((x, z)) return tuple(result) def perimeter(cells, diagonal=False): points = set(cells) steps = tuple((x, z) for x in (-1, 0, 1) for z in (-1, 0, 1) if x or z) if diagonal else CARDINAL return tuple(sorted(p for p in points if any((p[0] + dx, p[1] + dz) not in points for dx, dz in steps))) def bounds2(points, low, high): return Box((min(p[0] for p in points), low, min(p[1] for p in points)), (max(p[0] for p in points), high, max(p[1] for p in points)))
hearth_extensions/interfaces.py
# Public endpoint discovery and orientation checks shared by circulation components. from dataclasses import dataclass from hearth import Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Plan, Rule @dataclass(frozen=True) class Endpoint: host: str port: str def binding(self): return Binding(self.host, self.port, 'connect') def resolve(self, ctx): port = ctx.view.port(self.host, self.port) if port.kind not in ('access', 'public-access'): raise ContractError('endpoint-kind', ctx.path, port.frame.origin, 'Require an access or public-access port') at = ctx.local(port.frame.origin) turn = (port.frame.turn - ctx.frame.turn) % 4 outward = Frame(turn=turn).vector((0, 0, -1)) return port, at, (outward[0], outward[2]) @dataclass(frozen=True) class EndpointContact: endpoint: Endpoint def capability(self): return Capability('extension.endpoint-contact', ('connection',), guarantees=('unchanged supported endpoint',)) def negotiate(self, ctx, parameters): port, at, direction = self.endpoint.resolve(ctx) from hearth.space import Box return Contract(Box(at, at).expand(1), rules=(Rule('support', ((at[0], at[1] - 1, at[2]),)), Rule('clear', (at, (at[0], at[1] + 1, at[2]))))) def realize(self, ctx, contract): return Plan()
hearth_extensions/__init__.py
# Components developed against Hearth's public protocol in the second development phase. from .geometry import Polyline, Polygon from .interfaces import Endpoint, EndpointContact from .circulation import Link, connection from .boundaries import Boundary, BoundaryLantern, IlluminateBoundary from .sites import Platform from .halls import Pavilion, PolygonShell, HipRoof, Facade from .interiors import HallInterior, WorkBay
hearth_extensions/circulation.py
# Measured ribbon circulation, support grids and guard geometry through public contracts. from dataclasses import dataclass import math from hearth import Box, Frame, Binding, ContractError from hearth.blocks import state_of, stairs, slab, log, solid, passable, name_of from hearth.kernel import Capability, Domain, Contract, Port, Grant, Plan, Rule, Child, validator, Diagnostic from .geometry import Polyline, CARDINAL, bounds2, perimeter, lattice from .interfaces import Endpoint @validator('extension.guard') def guard_rule(scene, node, rule): for p in rule.cells: if name_of(scene.view.state(p)) not in ('spruce_fence', 'spruce_log', 'stone_brick_wall'): yield Diagnostic('bridge-guard', node.path, p, 'A required outer guard cell is absent') @validator('extension.span') def span_rule(scene, node, rule): supports = [node.frame.point(tuple(p)) for p in rule.data['anchors']] for p in rule.cells: if not supports or min(abs(p[0] - q[0]) + abs(p[2] - q[2]) for q in supports) > rule.data['maximum']: yield Diagnostic('unsupported-span', node.path, p, 'Deck exceeds declared supported horizontal span') @dataclass(frozen=True) class Surface: points: tuple role: str = 'deck' material: str = 'spruce_planks' def capability(self): tags = ('surface', self.role) + (('path', 'siteworks') if self.role in ('deck', 'platform') else ()) return Capability('extension.' + self.role, tags) def negotiate(self, ctx, parameters): box = Box.enclosing(self.points) return Contract(box, rules=(Rule('support', self.points),)) def realize(self, ctx, contract): p = Plan() heights = {(x, z): y for x, y, z in self.points} for x, y, z in self.points: uphill = next((face for dx, dz, face in ((1, 0, 'east'), (-1, 0, 'west'), (0, 1, 'south'), (0, -1, 'north')) if heights.get((x + dx, z + dz), y) == y + 1), None) p.block((x, y, z), stairs('spruce', uphill) if uphill else state_of(self.material), 'walk-surface') return p @dataclass(frozen=True) class Trestles: columns: tuple maximum: int = 8 def capability(self): return Capability('extension.trestles', ('siteworks', 'support'), adaptations=('posts to actual bed', 'stone shoes'), inputs={'maximum': Domain(2, 8)}) def negotiate(self, ctx, parameters): cells = tuple((x, y, z) for x, bed, z, top, wet in self.columns for y in range(bed - 1, top + 1)) if any(top - bed > self.maximum for x, bed, z, top, wet in self.columns): raise ContractError('connection-support-height', ctx.path, conditions=f'Post exceeds {self.maximum}') return Contract(Box.enclosing(cells), rules=(Rule('support', cells),), decisions={'columns': self.columns}) def realize(self, ctx, contract): p = Plan() for x, bed, z, top, wet in self.columns: for y in range(bed + 1, top + 1): p.block((x, y, z), state_of('stone_bricks') if y == bed + 1 or not wet else log(), 'pier') return p @dataclass(frozen=True) class Guards: points: tuple covered: bool = False roof: tuple = () def capability(self): return Capability('extension.guards', ('railing', 'roof' if self.covered else 'guard'), guarantees=('continuous outer guard',)) def negotiate(self, ctx, parameters): return Contract(Box.enclosing((*self.points, *self.roof)).expand(1), rules=(Rule('extension.guard', self.points),)) def realize(self, ctx, contract): p = Plan() occupied = {(x, z) for x, y, z in self.points} for i, (x, y, z) in enumerate(self.points): connections = {face: str((x + dx, z + dz) in occupied).lower() for dx, dz, face in ((1, 0, 'east'), (-1, 0, 'west'), (0, 1, 'south'), (0, -1, 'north'))} p.block((x, y, z), state_of('spruce_fence', waterlogged='false', **connections), 'guard') if self.covered: for yy in (y + 1, y + 2): p.block((x, yy, z), log() if i % 5 == 0 else state_of('spruce_fence', waterlogged='false', **connections), 'gallery-frame') for x, y, z in self.roof: p.block((x, y, z), slab('dark_oak', 'top'), 'gallery-canopy') return p @dataclass(frozen=True) class Link: start: Endpoint end: Endpoint terrain: str via: tuple = () curve: Polyline | None = None width: int = 3 rise: int = 0 covered: bool = False max_post: int = 8 max_span: int = 6 max_length: int = 120 fill_limit: int = 800 def capability(self): return Capability('extension.gallery' if self.covered else 'extension.bridge', ('connection', 'path', 'composite'), offers=('access',), adaptations=('bounded height profile', 'actual-bed trestles', 'supported deck reuse at endpoints'), guarantees=('both public endpoints reachable', 'two-cell headroom', 'outer guard'), inputs={'width': Domain(choices=(3, 5)), 'rise': Domain(0, 3), 'max_post': Domain(2, 8), 'max_span': Domain(3, 6)}, locked=('start', 'end', 'via', 'curve', 'width', 'covered')) def negotiate(self, ctx, parameters): pa, a, da = self.start.resolve(ctx) pb, b, db = self.end.resolve(ctx) required = {(self.start.host, self.start.port), (self.end.host, self.end.port)} if not required.issubset({(v.host, v.port) for v in ctx.bindings if v.verb == 'connect'}): raise ContractError('endpoint-binding', ctx.path, conditions='Both endpoints need explicit read-only connection bindings') points = ((a[0], a[2]), (a[0] + 3 * da[0], a[2] + 3 * da[1]), *self.via, (b[0] + 3 * db[0], b[2] + 3 * db[1]), (b[0], b[2])) curve = self.curve or Polyline(tuple(points)) if curve.points[0] != (a[0], a[2]) or curve.points[-1] != (b[0], b[2]): raise ContractError('endpoint-disconnected', ctx.path, ctx.world(a), 'Curve ends must match the negotiated public ports') for point, next_point, direction in ((curve.points[0], curve.points[1], da), (curve.points[-1], curve.points[-2], db)): delta = (next_point[0] - point[0], next_point[1] - point[1]) if delta[0] * direction[1] - delta[1] * direction[0] != 0 or delta[0] * direction[0] + delta[1] * direction[1] <= 0: raise ContractError('endpoint-frame', ctx.path, ctx.world((int(point[0]), a[1], int(point[1]))), 'First and last tangents must point out of the host') if curve.length > self.max_length or curve.length < 7: raise ContractError('connection-domain', ctx.path, conditions='Route length exceeds the negotiated preparation budget') center = curve.cells() if len(set(center)) != len(center): raise ContractError('connection-domain', ctx.path, conditions='Need a simple route of length 7..maximum') radius = self.width // 2 + 1 deck = curve.ribbon(radius + .2) station = {p: min(range(len(center)), key=lambda i: (math.dist(p, center[i]), i)) for p in deck} count = len(center) # Preserve the host's offered mouth width, then flare to the body width. mouth_widths = [] for port in (pa, pb): horizontal = [port.frame.inverse(q)[0] for q in port.region.corners()] mouth_widths.append(max(horizontal) - min(horizontal) + 1) if min(mouth_widths) < 3: raise ContractError('endpoint-width', ctx.path, ctx.world(a), 'Connection needs an offered mouth at least three cells wide') deck = tuple(p for p in deck if (station[p] >= 3 or abs(pa.frame.inverse(ctx.world((p[0], a[1], p[1])))[0]) <= mouth_widths[0] // 2) and (station[p] < count - 3 or abs(pb.frame.inverse(ctx.world((p[0], b[1], p[1])))[0]) <= mouth_widths[1] // 2)) heights = [lattice((a[1] - 1) * (1 - i / (count - 1)) + (b[1] - 1) * i / (count - 1) + self.rise * math.sin(math.pi * i / (count - 1))) for i in range(count)] beds = {} waters = {} endpoint_regions = (pa.region, pb.region) for x, z in deck: cap = max(a[1], b[1]) + self.rise + 2 bed = ctx.elevation(x, z, maximum=cap) water = ctx.water(x, z) beds[(x, z)] = bed waters[(x, z)] = water i = station[(x, z)] heights[i] = max(heights[i], bed, water + 1 if water is not None else bed) # Minimal upward propagation, preserving fixed endpoint elevations. for i in range(1, count): heights[i] = max(heights[i], heights[i - 1] - 1) for i in range(count - 2, -1, -1): heights[i] = max(heights[i], heights[i + 1] - 1) if heights[0] != a[1] - 1 or heights[-1] != b[1] - 1: raise ContractError('endpoint-grade', ctx.path, ctx.world(a), 'Measured ground/water cannot meet the locked endpoint heights') outer = set(perimeter(deck)) guards = [] clear = [] all_deck = [] writes = [] for x, z in deck: i = station[(x, z)] y = heights[i] q = ctx.world((x, y, z)) host_region = any(region.contains(q) for region in endpoint_regions) is_guard = (x, z) in outer and 2 < i < count - 3 and not host_region all_deck.append((x, y, z)) if is_guard: guards.append((x, y + 1, z)) else: clear.extend(((x, y + 1, z), (x, y + 2, z))) existing = ctx.view.state(q) if solid(existing) and host_region: continue writes.append((x, y, z)) anchors = [] for x, z in sorted(deck, key=lambda p: (station[p], p)): if any(abs(x - u) + abs(z - v) <= self.max_span for u, v in anchors): continue # Prefer the central route where possible, then cover wide diagonal corners. near = center[station[(x, z)]] anchor = near if near in beds else (x, z) if anchor in anchors: anchor = (x, z) anchors.append(anchor) columns = [] for x, z in anchors: top = heights[station[(x, z)]] - 1 bed = min(beds[(x, z)], top) while not ctx.view.supports(ctx.world((x, bed, z))): bed -= 1 if top - bed > self.max_post: raise ContractError('connection-support-height', ctx.path, ctx.world((x, top, z))) if not ctx.view.supports(ctx.world((x, bed - 1, z))): raise ContractError('connection-bed', ctx.path, ctx.world((x, bed - 1, z)), 'Need two actual supporting bed cells') columns.append((x, bed, z, top, waters[(x, z)] is not None)) fill = sum(max(0, top - bed) for x, bed, z, top, wet in columns) if fill > self.fill_limit: raise ContractError('connection-fill-limit', ctx.path, conditions=f'{fill}>{self.fill_limit}') roof = tuple((x, y + 5, z) for x, y, z in all_deck if self.covered and 3 < station[(x, z)] < count - 4) guard_points = tuple(guards) low = min(min(beds.values()) - 1, min(heights)) envelope = bounds2(deck, low, max(heights) + 7).expand(1) center_route = tuple((x, heights[i] + 1, z) for i, (x, z) in enumerate(center)) rules = (Rule('route', (a, *center_route, b), envelope, phase='complete'), Rule('support', tuple(all_deck)), Rule('clear', tuple(clear)), Rule('extension.span', tuple(all_deck), data={'anchors': [(x, 0, z) for x, z in anchors], 'maximum': self.max_span})) return Contract(envelope, ports=(Port('start', 'access', Frame(a), Box(a, a), 8), Port('end', 'access', Frame(b), Box(b, b), 8)), rules=rules, decisions={'curve': curve.points, 'center': center, 'profile': heights, 'deck': all_deck, 'writes': writes, 'guards': guard_points, 'columns': columns, 'roof': roof, 'fill': fill, 'width': self.width, 'covered': self.covered, 'rise': self.rise, 'endpoint_regions': [[r.lo, r.hi] for r in endpoint_regions]}, reads=(envelope,)) def realize(self, ctx, contract): d = contract.decisions terrain = (Binding(self.terrain, 'construction', 'fill', ctx.frame.box(contract.envelope)),) p = Plan(children=[Child('supports', Trestles(tuple(d['columns']), self.max_post), bindings=terrain), Child('deck', Surface(tuple(d['writes'])), bindings=terrain), Child('guards', Guards(tuple(d['guards']), self.covered, tuple(d['roof'])))]) p.relations.extend(((ctx.path, 'connects', self.start.host), (ctx.path, 'connects', self.end.host))) return p def connection(key, start, end, terrain, **parameters): """Create a fully bound link through public endpoint references.""" return Child(key, Link(start, end, terrain, **parameters), bindings=(start.binding(), end.binding()))
hearth_extensions/boundaries.py
# Curve-following masonry with sampled installation sockets and grounded adaptation. from dataclasses import dataclass from hearth import Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Domain, Port, Grant, Plan, Rule, Child from hearth.blocks import state_of, slab from .geometry import Polyline, bounds2 @dataclass(frozen=True) class Boundary: curve: Polyline height: int = 2 spacing: int = 7 max_step: int = 1 def capability(self): return Capability('extension.curved-boundary', ('boundary', 'siteworks', 'composite'), offers=('mount',), inputs={'height': Domain(1, 5), 'spacing': Domain(4, 12), 'max_step': Domain(0, 1)}, adaptations=('terrain-following base', 'stepped coping'), guarantees=('continuous cardinal contour', 'grounded boundary', 'mount sockets')) def negotiate(self, ctx, parameters): center = self.curve.cells() if len(center) > 220 or len(set(center)) != len(center): raise ContractError('boundary-domain', ctx.path, conditions='Simple open contour, at most 220 raster cells') levels = [ctx.elevation(x, z) for x, z in center] if any(abs(a - b) > self.max_step for a, b in zip(levels, levels[1:])): raise ContractError('boundary-grade', ctx.path, conditions='Adjacent wall foundations exceed step bound') ports = [] grants = [] for i in range(2, len(center) - 2, self.spacing): x, z = center[i] y = levels[i] + self.height + 2 x0, z0 = center[max(0, i - 1)] x1, z1 = center[min(len(center) - 1, i + 1)] turn = 0 if abs(x1 - x0) >= abs(z1 - z0) else 1 at = (x, y, z) key = f'mount-{i}' box = Box(at, at) ports.append(Port(key, 'mount', Frame(at, turn), box, 1, key, facts={'support': (x, y - 1, z), 'load': 'small-fixture'})) grants.append(Grant(key, box, ('install',), ('fixture',), 0)) supports = tuple((x, levels[i], z) for i, (x, z) in enumerate(center)) shell = tuple((x, y, z) for i, (x, z) in enumerate(center) for y in range(levels[i] + 1, levels[i] + self.height + 2)) box = Box.enclosing((*supports, *shell)).expand(2) return Contract(box, tuple(ports), tuple(grants), (Rule('support', supports), Rule('sealed', shell)), decisions={'center': center, 'levels': levels, 'height': self.height}, reads=(box,)) def realize(self, ctx, contract): p = Plan() d = contract.decisions rng = ctx.rng('masonry') for i, (x, z) in enumerate(d['center']): for y in range(d['levels'][i] + 1, d['levels'][i] + self.height + 1): p.block((x, y, z), state_of(rng.choice(('stone_bricks', 'stone_bricks', 'mossy_stone_bricks'))), 'contour-masonry') p.block((x, d['levels'][i] + self.height + 1, z), slab('stone_brick', 'top'), 'coping') return p @dataclass(frozen=True) class BoundaryLantern: def capability(self): return Capability('extension.boundary-lantern', ('fixture', 'light'), guarantees=('mounted actual light',)) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (0, 1, 0)), rules=(Rule('support', ((0, -1, 0),)), Rule('expected', ((0, 0, 0),), data={'names': ['lantern']})), atomic_object=True) def realize(self, ctx, contract): p = Plan() p.block((0, 0, 0), state_of('lantern', hanging='false', waterlogged='false'), 'lamp') return p @dataclass(frozen=True) class IlluminateBoundary: host: str every: int = 1 def capability(self): return Capability('extension.boundary-lighting', ('composite',)) def negotiate(self, ctx, parameters): ports = ctx.view.offers(self.host, 'mount')[::self.every] if not ports: raise ContractError('missing-mounts', ctx.path) return Contract(Box.enclosing(ctx.local(p.frame.origin) for p in ports).expand(1)) def realize(self, ctx, contract): p = Plan() for port in ctx.view.offers(self.host, 'mount')[::self.every]: frame = Frame(ctx.local(port.frame.origin), (port.frame.turn - ctx.frame.turn) % 4) p.children.append(Child(port.key, BoundaryLantern(), frame=frame, bindings=(Binding(self.host, port.key),))) return p @dataclass(frozen=True) class BoundaryChain: curve: Polyline height: int = 2 spacing: int = 7 chunk: int = 96 def capability(self): return Capability('extension.boundary-chain', ('boundary', 'composite'), offers=('mount',), inputs={'chunk': Domain(4, 220), 'height': Domain(1, 5), 'spacing': Domain(4, 12)}, guarantees=('continuous contour across component joins',)) def parts(self): cells = self.curve.cells() if len(set(cells)) != len(cells): raise ContractError('boundary-self-intersection', conditions='A simple open contour is required') count = max(1, (len(cells) + self.chunk - 1) // self.chunk) size = (len(cells) + count - 1) // count return tuple(Boundary(Polyline(cells[i:i + size]), self.height, self.spacing) for i in range(0, len(cells), size)) def negotiate(self, ctx, parameters): boxes = [] ports = [] last_height = None for i, part in enumerate(self.parts()): local = part.negotiate(ctx, {}) if last_height is not None and abs(local.decisions['levels'][0] - last_height) > part.max_step: raise ContractError('boundary-grade', ctx.path, conditions='Grade bound also applies at component joins') last_height = local.decisions['levels'][-1] boxes.append(local.envelope) for p in local.ports: ports.append(Port(f'segment-{i}-{p.key}', p.kind, p.frame, p.region, p.capacity, facts=p.facts, delegate=(f'segment-{i}', p.key))) return Contract(Box.enclosing(p for box in boxes for p in box.corners()), ports=tuple(ports), decisions={'segments': len(boxes), 'curve': self.curve.points}) def realize(self, ctx, contract): return Plan(children=[Child(f'segment-{i}', part) for i, part in enumerate(self.parts())])
hearth_extensions/sites.py
# Accessible platforms with measured supports and oriented edge ports. from dataclasses import dataclass from hearth import Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Plan, Child, Port, Rule, Domain from hearth.blocks import state_of from hearth.adapters.site import Foundation, SiteLimits, survey from .geometry import Polygon, bounds2 from .circulation import Surface DIRECTIONS = {'north': (0, -1, 0), 'east': (1, 0, 1), 'south': (0, 1, 2), 'west': (-1, 0, 3)} def edge_frames(width, depth, height): return {'north': Frame((width // 2, height, 0), 0), 'east': Frame((width - 1, height, depth // 2), 1), 'south': Frame((width // 2, height, depth - 1), 2), 'west': Frame((0, height, depth // 2), 3)} @dataclass(frozen=True) class Platform: terrain: str width: int = 9 depth: int = 9 freeboard: int = 1 def capability(self): return Capability('extension.platform', ('platform', 'composite', 'access'), offers=('access',), inputs={'width': Domain(5, 27), 'depth': Domain(5, 27), 'freeboard': Domain(1, 3)}) def negotiate(self, ctx, parameters): footprint = tuple((x, z) for x in range(self.width) for z in range(self.depth)) samples = survey(ctx, footprint) y = samples['floor'] + self.freeboard - 1 region = bounds2(footprint, min(v[0] for v in samples['samples'].values()) - 1, y + 3) ports = tuple(Port(k, 'access', f, f.box(Box((-2, -1, 0), (2, 1, 0))), 8) for k, f in edge_frames(self.width, self.depth, y + 1).items()) return Contract(region, ports=ports, decisions={'floor': y, 'footprint': footprint, 'strategy': samples['strategy']}, rules=(Rule('route', tuple(f.frame.origin for f in ports), region, phase='complete'),)) def realize(self, ctx, contract): d = contract.decisions p = Plan(children=[Child('foundation', Foundation(tuple(d['footprint']), d['floor'], d['strategy']), bindings=(Binding(self.terrain, 'construction', 'fill'),)), Child('deck', Surface(tuple((x, d['floor'], z) for x, z in d['footprint']), role='platform'))]) return p
hearth_extensions/halls.py
# Polygon halls, public facade installation and concentric hipped roof components. from dataclasses import dataclass from hearth import Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Port, Grant, Rule, Plan, Child, Domain, Context from hearth.blocks import state_of, log, slab, stairs from hearth.adapters.site import survey, Foundation, Approach, SiteLimits from hearth.components.interior import Door, Light from hearth.components.primitives import Window from .geometry import Polygon, CARDINAL, bounds2, perimeter from .sites import edge_frames from .circulation import Surface from .interiors import HallInterior, FUNCTION_GROUPS @dataclass(frozen=True) class PolygonShell: footprint: Polygon height: int = 5 entrances: tuple = ('north', 'south') def capability(self): return Capability('extension.polygon-shell', ('wall', 'enclosure'), offers=('wall-installation',), guarantees=('continuous enclosure', 'protected floor support'), inputs={'height': Domain(5, 7)}) def negotiate(self, ctx, parameters): footprint = self.footprint.cells() shell = perimeter(footprint, diagonal=True) xs = [x for x, z in footprint] zs = [z for x, z in footprint] width, depth = max(xs) + 1, max(zs) + 1 if min(xs) != 0 or min(zs) != 0: raise ContractError('polygon-origin', ctx.path, conditions='Normalize footprint minimum to (0,0)') frames = edge_frames(width, depth, 0) ports = [] grants = [] for side, f in frames.items(): for role, offset, size, base in [('entry', 0, 1, 0)] if side in self.entrances else []: at = f.compose(Frame((offset, base, 0))) region = at.box(Box((0, 0, 0), (size - 1, 2, 0))) if not all((p[0], p[2]) in shell for p in region.cells()): raise ContractError('polygon-entry', ctx.path, at.origin, 'Requested cardinal entry is not on the footprint boundary') key = 'entry-' + side ports.append(Port(key, 'wall-installation', at, region, 1, key, facts={'thickness': 1, 'role': role, 'side': side})) grants.append(Grant(key, region, ('install',), ('door',), 3)) for i, offset in enumerate((-4, 3)): at = f.compose(Frame((offset, 1, 0))) region = at.box(Box((0, 0, 0), (1, 1, 0))) if all((p[0], p[2]) in shell for p in region.cells()): key = f'window-{side}-{i}' ports.append(Port(key, 'wall-installation', at, region, 1, key, facts={'thickness': 1, 'role': 'window', 'side': side})) grants.append(Grant(key, region, ('install',), ('window',), 4)) blocks = tuple((x, y, z) for x, z in shell for y in range(self.height)) return Contract(bounds2(footprint, 0, self.height - 1), tuple(ports), tuple(grants), rules=(Rule('sealed', blocks), Rule('support', tuple((x, -1, z) for x, z in shell))), decisions={'shell': shell, 'height': self.height}) def realize(self, ctx, contract): p = Plan() vertices = set(self.footprint.vertices) for x, z in contract.decisions['shell']: for y in range(self.height): frame = (x, z) in vertices or y == self.height - 1 p.block((x, y, z), log() if frame else state_of('smooth_sandstone'), 'frame' if frame else 'infill') return p @dataclass(frozen=True) class Facade: host: str shutters: bool = True def capability(self): return Capability('extension.facade-installations', ('composite',)) def negotiate(self, ctx, parameters): box = ctx.view.contract(self.host).envelope return Contract(Box.enclosing(ctx.local(p) for p in box.corners()).expand(2)) def realize(self, ctx, contract): p = Plan() for port in ctx.view.offers(self.host, 'wall-installation'): component = Door() if port.facts['role'] == 'entry' else Window(shutters=self.shutters) frame = Frame(ctx.local(port.frame.origin), (port.frame.turn - ctx.frame.turn) % 4) p.children.append(Child(port.key, component, frame=frame, bindings=(Binding(self.host, port.key),))) return p @dataclass(frozen=True) class HipRoof: footprint: Polygon run: int = 2 lantern: bool = False material: str = 'deepslate_tile' def capability(self): return Capability('extension.hip-roof', ('roof', 'composite'), adaptations=('polygon inset courses',), inputs={'run': Domain(choices=(1, 2, 3))}, guarantees=('continuous concentric weather surface',)) def negotiate(self, ctx, parameters): points = set(self.footprint.cells()) points |= {(x + dx, z + dz) for x, z in tuple(points) for dx, dz in CARDINAL} remaining = set(points) depths = {} depth = 0 while remaining: ring = perimeter(remaining) for p in ring: depths[p] = depth remaining -= set(ring) depth += 1 courses = tuple((x, depths[(x, z)] // self.run, z) for x, z in sorted(points)) peak = max(y for x, y, z in courses) cx = (min(x for x, z in points) + max(x for x, z in points)) // 2 cz = (min(z for x, z in points) + max(z for x, z in points)) // 2 return Contract(bounds2(points, -1, peak + (15 if self.lantern else 7)), rules=(Rule('sealed', courses),), decisions={'courses': courses, 'peak': peak, 'center': (cx, cz), 'run': self.run, 'lantern': self.lantern}) def realize(self, ctx, contract): p = Plan() d = contract.decisions heights = {(x, z): y for x, y, z in d['courses']} for x, y, z in d['courses']: face = next((f for dx, dz, f in ((1, 0, 'east'), (-1, 0, 'west'), (0, 1, 'south'), (0, -1, 'north')) if heights.get((x + dx, z + dz), y) > y), None) material = 'dark_oak' if y == 0 else self.material p.block((x, y, z), stairs(material, face) if face else slab(material, 'top'), 'hip-course') if self.lantern: cx, cz = d['center'] p.children.append(Child('lantern', RoofLantern(), frame=Frame((cx - 2, d['peak'] + 1, cz - 2)))) return p @dataclass(frozen=True) class RoofLantern: def capability(self): return Capability('extension.roof-lantern', ('roof', 'daylight', 'composite')) def negotiate(self, ctx, parameters): return Contract(Box((-1, -3, -1), (5, 13, 5))) def realize(self, ctx, contract): p = Plan() for x in range(5): for z in range(5): bed = ctx.elevation(x, z, maximum=0) if bed < -4: raise ContractError('lantern-support', ctx.path, ctx.world((x, bed, z))) for y in range(bed + 1, 1): p.block((x, y, z), state_of('spruce_planks'), 'ring-beam') if x in (0, 4) or z in (0, 4): for y in (1, 2): p.block((x, y, z), log() if x in (0, 4) and z in (0, 4) else state_of('glass'), 'clerestory') p.children.append(Child('cap', HipRoof(Polygon(((0, 0), (4, 0), (4, 4), (0, 4))), run=2), frame=Frame((0, 3, 0)))) return p @dataclass(frozen=True) class Pavilion: footprint: Polygon terrain: str purpose: str = 'library' entrances: tuple = ('north', 'south') height: int = 5 roof_run: int = 2 lantern: bool = False limits: SiteLimits = SiteLimits() def capability(self): return Capability('extension.pavilion', ('building', 'habitable', 'composite'), offers=('access',), adaptations=('polygon support grid', 'independently measured approaches'), guarantees=('connected entrances', 'furnished lit enclosed hall'), inputs={'height': Domain(5, 7), 'purpose': Domain(choices=('living', 'library', 'workshop', 'kitchen', 'bedroom', 'storage'))}, locked=('footprint', 'purpose', 'entrances', 'height', 'roof_run', 'lantern')) def negotiate(self, ctx, parameters): points = self.footprint.cells() width = max(x for x, z in points) + 1 depth = max(z for x, z in points) + 1 if not 13 <= width <= 25 or not 13 <= depth <= 25 or not self.entrances: raise ContractError('hall-domain', ctx.path, conditions='Footprints 13..25, at least one declared entrance') measured = survey(ctx, points, self.limits) floor = measured['floor'] ports = [] approaches = [] frames = edge_frames(width, depth, 0) low = min(v[0] for v in measured['samples'].values()) - 1 roof = HipRoof(self.footprint, self.roof_run, self.lantern).negotiate(ctx, {}) boxes = [bounds2(points, low, floor + self.height + 3).expand(3), Frame((0, floor + self.height + 2, 0)).box(roof.envelope)] targets = [(width // 2, floor + 1, depth // 2)] for side in self.entrances: if side not in frames: raise ContractError('hall-entrance', ctx.path, conditions=side) f = frames[side] comp = Approach(0, floor, limits=self.limits) ac = comp.negotiate(Context(ctx.path, ctx.frame.compose(f), ctx.scope.child('approach-' + side), ctx.view, (), ctx.limits), {}) local = ac.transformed(f) port = local.ports[0] ports.append(Port(side, 'access', Frame(port.frame.origin, f.turn), port.region, 8, delegate=('approach-' + side, 'street'))) approaches.append((side, f, comp)) boxes.append(local.envelope) targets.extend(((f.origin[0], floor + 1, f.origin[2]), port.frame.origin)) envelope = Box.enclosing(p for box in boxes for p in box.corners()) interior = Box((1, floor + 1, 1), (width - 2, floor + self.height - 1, depth - 2)) return Contract(envelope, tuple(ports), rules=(Rule('route', tuple(targets), envelope, phase='complete'), Rule('light', tuple(targets[:1]), interior, {'minimum': 1}, 'complete'), Rule('furnishing', box=interior, data={'groups': FUNCTION_GROUPS[self.purpose]}, phase='complete')), decisions={'floor': floor, 'width': width, 'depth': depth, 'footprint': points, 'vertices': self.footprint.vertices, 'strategy': measured['strategy'], 'entrances': self.entrances, 'height': self.height, 'purpose': self.purpose, 'roof_run': self.roof_run, 'lantern': self.lantern}) def realize(self, ctx, contract): d = contract.decisions floor = d['floor'] w = d['width'] depth = d['depth'] p = Plan(children=[Child('foundation', Foundation(tuple(d['footprint']), floor, d['strategy'], self.limits), bindings=(Binding(self.terrain, 'construction', 'fill'),)), Child('floor', Surface(tuple((x, floor, z) for x, z in d['footprint']), role='hall-floor')), Child('ceiling', Surface(tuple((x, floor + self.height + 1, z) for x, z in d['footprint']), role='hall-ceiling')), Child('shell', PolygonShell(self.footprint, self.height, self.entrances), frame=Frame((0, floor + 1, 0))), Child('facade', Facade(ctx.path + '/shell'))]) for side in self.entrances: f = edge_frames(w, depth, 0)[side] p.children.append(Child('approach-' + side, Approach(0, floor, limits=self.limits), frame=f, bindings=(Binding(self.terrain, 'construction', 'surface'),))) p.children.append(Child('furnishings', HallInterior(self.footprint, self.purpose), frame=Frame((0, floor + 1, 0)))) for x in range(4, w - 3, 5): for z in range(4, depth - 3, 5): p.children.append(Child(f'light-{x}-{z}', Light(), frame=Frame((x, floor + self.height - 1, z)))) p.children.append(Child('roof', HipRoof(self.footprint, self.roof_run, self.lantern), frame=Frame((0, floor + self.height + 2, 0)))) return p
hearth_extensions/graphs.py
# Reusable campus graph composes arbitrary public building and circulation components. from dataclasses import dataclass from hearth import Box, Frame, ContractError from hearth.kernel import Capability, Contract, Port, Rule, Plan, Child, Context from .interfaces import Endpoint from .circulation import connection from .boundaries import BoundaryChain, IlluminateBoundary from hearth.components.landscape import Landscape @dataclass(frozen=True) class Vertex: key: str component: object frame: Frame @dataclass(frozen=True) class Edge: a: str a_port: str b: str b_port: str covered: bool = False via: tuple = () rise: int = 0 width: int = 3 @dataclass(frozen=True) class Campus: vertices: tuple[Vertex, ...] edges: tuple[Edge, ...] terrain: str envelope: Box boundary: object = None landscape: bool = True def capability(self): return Capability('extension.campus', ('settlement', 'composite'), offers=('public-access',), guarantees=('declared graph connected', 'usable realized building connections'), locked=('vertices', 'edges')) def negotiate(self, ctx, parameters): keys = {v.key for v in self.vertices} if len(keys) != len(self.vertices) or not keys: raise ContractError('graph-vertices', ctx.path) connected = {self.vertices[0].key} for edge in self.edges: if edge.a not in keys or edge.b not in keys or edge.a == edge.b: raise ContractError('graph-edge', ctx.path, conditions=str(edge)) while True: more = {v for e in self.edges if e.a in connected or e.b in connected for v in (e.a, e.b)} if more <= connected: break connected |= more if connected != keys: raise ContractError('graph-disconnected', ctx.path, conditions=str(sorted(keys - connected))) first = self.vertices[0] context = Context(ctx.path + '/' + first.key, ctx.frame.compose(first.frame), ctx.scope.child(first.key), ctx.view, (), ctx.limits) offered = first.component.negotiate(context, {}).transformed(first.frame).ports port = next((p for p in offered if p.kind in ('access', 'public-access')), None) if port is None: raise ContractError('graph-access', ctx.path, conditions='First vertex must expose usable access') gateway = Port('public', 'access', port.frame, port.region, port.capacity, delegate=(first.key, port.key)) return Contract(self.envelope, ports=(gateway,), decisions={'vertices': [v.key for v in self.vertices], 'edges': [(e.a, e.a_port, e.b, e.b_port, e.covered, e.width) for e in self.edges]}) def realize(self, ctx, contract): p = Plan(children=[Child(v.key, v.component, frame=v.frame) for v in self.vertices]) p.children.append(Child('circulation', Connections(ctx.path, self.edges, self.terrain, self.envelope))) if self.boundary is not None: p.children.extend((Child('boundary', BoundaryChain(self.boundary)), Child('boundary-lights', IlluminateBoundary(ctx.path + '/boundary', 2)))) if self.landscape: p.children.append(Child('landscape', Landscape(self.envelope, self.terrain, 8, 12, 0.025))) return p @dataclass(frozen=True) class Connections: parent: str edges: tuple[Edge, ...] terrain: str envelope: Box def capability(self): return Capability('extension.connection-graph', ('connection', 'composite')) def negotiate(self, ctx, parameters): targets = [] for edge in self.edges: for key, port in ((edge.a, edge.a_port), (edge.b, edge.b_port)): targets.append(ctx.local(ctx.view.port(self.parent + '/' + key, port).frame.origin)) return Contract(self.envelope, rules=(Rule('route', tuple(targets), self.envelope, phase='complete'),)) def realize(self, ctx, contract): p = Plan() for i, edge in enumerate(self.edges): a = Endpoint(self.parent + '/' + edge.a, edge.a_port) b = Endpoint(self.parent + '/' + edge.b, edge.b_port) p.children.append(connection(f'link-{i}', a, b, self.terrain, via=edge.via, covered=edge.covered, rise=edge.rise, width=edge.width)) return p
hearth_extensions/programs.py
# Lightweight graph clients using frozen generic fields and interchangeable public buildings. from hearth import Scene, Box, Frame from hearth.randomness import Scope from hearth.environment import Terrain, gradient, wave, radial from hearth.components.building import Blueprint, RoomSpec, Building from hearth.persistence import semantic_digest from .geometry import Polygon, Polyline from .halls import Pavilion from .graphs import Campus, Vertex, Edge DOMAIN = Box((-18, -4, -18), (95, 70, 95)) def frozen_site(environment_seed=0, domain=DOMAIN): rng = Scope(environment_seed).stream('environment') field = gradient(rng.choice((-.012, 0, .012)), rng.choice((-.009, .009)), 5) + wave(.5, .07, .09, rng.random() * 6) + radial(30, 31, 24, -3.8) scene = Scene(environment_seed, domain=domain) scene.place('land', Terrain(domain, field, water_level=3, edit_limit=2500)) return scene.finalize() def branching_campus(seed=0): rng = Scope(seed).stream('branching-graph') hub = Pavilion(Polygon.chamfered(17, 17, 4), '/land', 'library', ('north', 'east', 'south', 'west'), height=6, lantern=True) west = Pavilion(Polygon.chamfered(13, rng.choice((13, 17)), 2), '/land', 'workshop', ('north', 'south'), height=5) east = Pavilion(Polygon.chamfered(rng.choice((13, 17)), 13, 2), '/land', 'kitchen', ('west', 'south'), height=rng.choice((5, 6))) rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')] if rng.choice((False, True)): rooms.append(RoomSpec(0, 1, 0, 'storage')) lodge = Building(Blueprint(tuple(rooms), bay=9, porch=True), '/land') vertices = [Vertex('hall', hub, Frame((23, 0, 23))), Vertex('workshop', west, Frame((0, 0, 0))), Vertex('kitchen', east, Frame((51, 0, 0))), Vertex('lodge', lodge, Frame((48, 0, 51)))] edges = [Edge('hall', 'north', 'workshop', 'south', covered=True), Edge('hall', 'east', 'kitchen', 'west', rise=rng.choice((0, 1))), Edge('hall', 'south', 'lodge', 'street', covered=True)] if rng.choice((False, True)): vertices.append(Vertex('archive', Pavilion(Polygon.chamfered(13, 13, 2), '/land', 'library', ('east',)), Frame((0, 0, 51)))) edges.append(Edge('hall', 'west', 'archive', 'east', rise=1)) boundary = Polyline.bezier(((-12, 0), (-30, 120), (115, 120), (84, 0))) return Campus(tuple(vertices), tuple(edges), '/land', DOMAIN, boundary) def perimeter_cluster(seed=0): rng = Scope(seed).stream('perimeter-graph') widths = (rng.choice((17, 21, 25)), rng.choice((13, 17)), rng.choice((13, 17))) market = Pavilion(Polygon.chamfered(widths[0], 13, 2), '/land', 'workshop', ('north', 'east', 'south'), height=5, roof_run=3) reading = Pavilion(Polygon.chamfered(widths[1], 17, 3), '/land', 'library', ('north', 'south'), height=6, lantern=rng.choice((True, False))) dining = Pavilion(Polygon.chamfered(widths[2], 13, 2), '/land', 'living', ('east', 'west'), height=5) vertices = (Vertex('market', market, Frame((0, 0, 0))), Vertex('reading', reading, Frame((50, 0, 10))), Vertex('dining', dining, Frame((20, 0, 57)))) edges = (Edge('market', 'east', 'reading', 'north', via=((40, -5),), covered=False, rise=1), Edge('reading', 'south', 'dining', 'east', covered=True), Edge('dining', 'west', 'market', 'south', via=((9, 42),), rise=rng.choice((0, 1)))) boundary = Polyline.bezier(((-12, 0), (-30, 120), (115, 120), (84, 0))) return Campus(vertices, edges, '/land', DOMAIN, boundary) def extension_scene(program=branching_campus, seed=0, environment_seed=0): environment = frozen_site(environment_seed) original = semantic_digest(environment) scene = environment.fork(seed=seed) scene.place('campus', program(seed)) scene.finalize() if semantic_digest(environment) != original: raise AssertionError('Frozen input mutated') return scene
hearth_extensions/assessment.py
# Frozen extension inputs, actual principal/contact signatures and retained outcomes. import hashlib import json import time from pathlib import Path from dataclasses import replace from collections import Counter from hearth import Scene, Box, Frame, Binding from hearth.kernel import ContractError, SearchExhausted, validate from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.persistence import semantic_digest, export_scene from hearth.blocks import solid from .geometry import Polyline, Polygon from .sites import Platform from .interfaces import Endpoint from .circulation import Link from .boundaries import BoundaryChain, IlluminateBoundary from .halls import Pavilion from .programs import frozen_site, branching_campus, perimeter_cluster PROBE_DOMAIN = Box((-8, -4, -8), (45, 52, 45)) def probe_expression(environment_seed): rng = Scope(environment_seed).stream('probe-field') return (gradient(rng.choice((-.025, 0, .035)), rng.choice((0, .015)), 2) + wave(rng.choice((0, .35, .7)), .11, .09, rng.random() * 6) + radial(16, 18, 14, -rng.choice((0, 1, 2)))).clamp(-1, 5), rng.choice((None, 3)) def freeze_probe(environment_seed): field, water = probe_expression(environment_seed) s = Scene(environment_seed, domain=PROBE_DOMAIN) s.place('land', Terrain(s.domain, field, water)) return s.finalize() def connector_scene(environment, structure_seed): s = environment.fork(seed=structure_seed) rng = Scope(structure_seed).stream('connection-intent') s.place('a', Platform('/land')) s.place('b', Platform('/land'), frame=Frame((18, 0, 27))) a, b = Endpoint('/a', 'south'), Endpoint('/b', 'north') link = Link(a, b, '/land', via=((rng.choice((9, 12, 15)), rng.choice((16, 18, 20))),), width=rng.choice((3, 5)), rise=rng.choice((0, 1, 2)), covered=rng.choice((True, False))) s.place('link', link, bindings=(a.binding(), b.binding())) return s.finalize() def boundary_scene(environment, structure_seed): rng = Scope(structure_seed).stream('boundary-intent') controls = ((0, 0), (8, rng.choice((0, 10, 23))), (28, rng.choice((0, 5, 18))), (37, 18)) curve = Polyline(((0, 0), (37, 18))) if structure_seed == 0 else Polyline.bezier(controls) s = environment.fork(seed=structure_seed) s.place('boundary', BoundaryChain(curve, height=rng.choice((1, 2, 3)), spacing=rng.choice((4, 7, 10)))) s.place('lights', IlluminateBoundary('/boundary')) return s.finalize() def hall_scene(seed, environment_seed=None): rng = Scope(seed).stream('hall-intent') domain = Box((-12, -4, -12), (42, 65, 42)) es = seed if environment_seed is None else environment_seed field = gradient(.012, -.008, 4) + wave(.5, .1, .12, Scope(es).stream('hall-field').random() * 6) env = Scene(es, domain=domain) env.place('land', Terrain(domain, field)) env.finalize() s = env.fork(seed=seed) shape = Polygon.chamfered(rng.choice((13, 17, 21, 25)), rng.choice((13, 17, 21)), rng.choice((0, 2, 4))) s.place('hall', Pavilion(shape, '/land', rng.choice(('library', 'workshop', 'living')), ('north', 'south', 'east') if rng.choice((True, False)) else ('north', 'west'), height=rng.choice((5, 6, 7)), roof_run=rng.choice((2, 3)), lantern=rng.choice((True, False)))) return s.finalize() def signatures(scene): """Measure current semantic geometry, omitting cosmetic material and contact height.""" halls = [] links = [] boundaries = [] organization = [] for path, node in sorted(scene.nodes.items()): d = node.contract.decisions if node.type == 'extension.pavilion': footprint = sorted((node.frame.inverse(p)[0], node.frame.inverse(p)[2]) for p in scene.cells(path + '/floor')) halls.append({'footprint': footprint, 'height': d['height'], 'function': d['purpose'], 'entrances': d['entrances'], 'roof_run': d['roof_run'], 'lantern': d['lantern']}) if node.type in ('extension.bridge', 'extension.gallery'): pts = [node.frame.inverse(p) for p in scene.cells(path + '/deck')] x0, z0 = d['center'][0] links.append({'body': sorted((p[0] - x0, p[2] - z0) for p in pts), 'width': d['width'], 'covered': d['covered'], 'rise': d['rise']}) if node.type == 'extension.boundary-chain': pts = [node.frame.inverse(p) for p in scene.cells(path, True) if 'boundary-lantern' not in scene.nodes[scene.inspect(p)['instance']].type] x0 = min(p[0] for p in pts) z0 = min(p[2] for p in pts) columns = {} for x, y, z in pts: columns.setdefault((x, z), []).append(y) boundaries.append({'plan': sorted(set((p[0] - x0, p[2] - z0) for p in pts)), 'section_heights': sorted({max(ys) - min(ys) + 1 for ys in columns.values()})}) if node.type == 'extension.campus': vertex_keys = d['vertices'] vertices = [] for key in vertex_keys: v = scene.nodes[path + '/' + key] at = node.frame.inverse(v.frame.origin) vertices.append((at[0], at[2], v.capability.tags)) topology = sorted((vertex_keys.index(a), pa, vertex_keys.index(b), pb, covered, width) for a, pa, b, pb, covered, width in d['edges']) organization.append({'positions': vertices, 'topology': topology}) from hearth.assessment import principal_signature legacy = principal_signature(scene)[1]['buildings'] principal = {'halls': halls, 'links': links, 'boundaries': boundaries, 'organization': organization, 'legacy': legacy} contact = [] fill = 0 replaced = 0 excavated = 0 edit_occupied = 0 for path, node in sorted(scene.nodes.items()): if node.type in ('extension.trestles', 'adapter.foundation', 'adapter.approach'): contact.append((node.type, node.contract.decisions)) fill += len(scene.cells(path)) if node.type == 'extension.curved-boundary': contact.append((node.type, [node.frame.inverse(p) for r in node.contract.rules if r.kind == 'support' for p in r.cells])) if node.capability and set(node.capability.tags).intersection(('siteworks', 'path')): edit_occupied += len(scene.cells(path)) replaced += len(scene.displaced.get(path, {})) excavated += sum(solid(old.state) and (p not in scene.blocks or not solid(scene.blocks[p].state)) for p, old in scene.displaced.get(path, {}).items()) digest = lambda x: hashlib.sha256(json.dumps(x, sort_keys=True, default=list).encode()).hexdigest() interiors = [n for n in scene.nodes.values() if n.type == 'extension.hall-interior'] return {'principal_signature': digest(principal), 'structure': principal, 'contact_signature': digest(contact), 'contact_cells': fill, 'contact_replacements': replaced, 'sitework_occupied_cells': edit_occupied, 'excavated_solid_cells': excavated, 'furnishing_bays': sum(n.contract.decisions['placed_bays'] for n in interiors), 'omitted_optional_furnishing_bays': sum(n.contract.decisions['omitted_optional'] for n in interiors)} def measured(label, recipe, inputs, artifact=None): start = time.perf_counter() row = {'label': label, 'inputs': inputs, 'candidate_attempts': 1, 'accepted_candidates': 0, 'retries': 0} try: scene = recipe() scene.finalize() row.update(status='validated', accepted_candidates=1, blocks=len(scene.blocks), instances=len(scene.nodes), digest=semantic_digest(scene), **signatures(scene)) if artifact: export_scene(scene, artifact) row['artifact'] = str(artifact) except ContractError as exc: limits = ('site-relief', 'support-height', 'connection-support-height', 'connection-fill-limit', 'boundary-grade', 'endpoint-grade', 'approach-detour', 'connection-domain') row.update(status='budget-exhausted' if isinstance(exc, SearchExhausted) else ('incompatible' if exc.diagnostic.rule in limits else 'defect'), diagnostic=exc.diagnostic.__dict__, all_diagnostics=[d.__dict__ for d in getattr(exc, 'diagnostics', [exc.diagnostic])]) except Exception as exc: row.update(status='defect', diagnostic={'exception': type(exc).__name__, 'message': str(exc)}) row['seconds'] = round(time.perf_counter() - start, 4) return row def run(output, root_seed=0, artifacts=False, sample_output=Path('samples/extensions')): output = Path(output) output.mkdir(parents=True, exist_ok=True) rows = [] frozen = {} inputs = [] for es in range(root_seed * 100, root_seed * 100 + 8): frozen[es] = freeze_probe(es) field, water = probe_expression(es) inputs.append({'environment_seed': es, 'expression': field.expression(), 'water': water, 'digest': semantic_digest(frozen[es])}) (output / 'frozen-inputs.json').write_text(json.dumps(inputs, indent=2)) def record(label, fn, parameters, keep=False): path = Path(sample_output) / (label + '.litematic') if keep and artifacts else None row = measured(label, fn, parameters, path) rows.append(row) print(label, row['status'], flush=True) for i, es in enumerate(frozen): for bs in range(6): record(f'connector-{i}-{bs}', lambda e=frozen[es], b=bs: connector_scene(e, b), {'environment': inputs[i], 'structure_seed': bs}, (i, bs) in ((0, 0), (1, 2), (4, 3), (7, 5))) assert semantic_digest(frozen[es]) == inputs[i]['digest'] for es in range(4): # Independent dry substrates use the same field expression with water omitted. field, _ = probe_expression(es + root_seed * 100) env = Scene(es + root_seed * 100, domain=PROBE_DOMAIN) env.place('land', Terrain(env.domain, field)) env.finalize() for bs in range(4): record(f'boundary-{es}-{bs}', lambda e=env, b=bs: boundary_scene(e, b), {'environment_seed': es + root_seed * 100, 'expression': field.expression(), 'structure_seed': bs}, (es, bs) in ((0, 1), (3, 3))) for seed in range(12): record(f'hall-{seed}', lambda b=seed: hall_scene(b, root_seed * 100 + b), {'structure_seed': seed, 'environment_seed': root_seed * 100 + seed}, seed in (0, 4, 7)) for name, program in (('campus', branching_campus), ('perimeter', perimeter_cluster)): for seed in range(6): environment = frozen_site(root_seed * 100 + seed) identity = semantic_digest(environment) def recipe(e=environment, b=seed, p=program): s = e.fork(seed=b) s.place('campus', p(b)) return s.finalize() record(f'{name}-{seed}', recipe, {'program': name, 'structure_seed': seed, 'environment_seed': root_seed * 100 + seed, 'frozen_digest': identity}, seed in (0, 3)) assert semantic_digest(environment) == identity for i in range(24): es = 2000 + root_seed * 100 + i rng = Scope(es).stream('stress') field = (gradient(rng.choice((0, .12, .28)), rng.choice((0, -.12, .15)), 2) + wave(rng.choice((0, 2, 4)), .13, .1, rng.random() * 6)).clamp(-2, 18) water = rng.choice((None, 3, 9, 12)) env = Scene(es, domain=PROBE_DOMAIN) env.place('land', Terrain(env.domain, field, water)) env.finalize() record(f'stress-{i:02}', lambda e=env, b=i % 6: connector_scene(e, b), {'environment_seed': es, 'structure_seed': i % 6, 'expression': field.expression(), 'water': water}) (output / 'results.json').write_text(json.dumps(rows, indent=2)) summary = {} for name in ('connector', 'boundary', 'hall', 'campus', 'perimeter', 'stress'): part = [r for r in rows if r['label'].startswith(name + '-')] good = [r for r in part if r['status'] == 'validated'] summary[name] = {'inputs': len(part), 'outcomes': dict(Counter(r['status'] for r in part)), 'candidate_attempts': sum(r['candidate_attempts'] for r in part), 'accepted_candidates': sum(r['accepted_candidates'] for r in part), 'retries': sum(r['retries'] for r in part), 'principal_signatures': len({r['principal_signature'] for r in good}), 'contact_signatures': len({r['contact_signature'] for r in good}), 'contact_cells_range': [min((r['contact_cells'] for r in good), default=0), max((r['contact_cells'] for r in good), default=0)], 'contact_replacement_range': [min((r['contact_replacements'] for r in good), default=0), max((r['contact_replacements'] for r in good), default=0)], 'seconds': round(sum(r['seconds'] for r in part), 3)} (output / 'summary.json').write_text(json.dumps(summary, indent=2)) if artifacts: (Path(sample_output) / 'replay-manifest.json').write_text(json.dumps([{k: r[k] for k in ('label', 'inputs', 'artifact', 'digest', 'status')} for r in rows if 'artifact' in r], indent=2)) return summary
extension_demo/__init__.py
# Independent component package; imports only Hearth's public protocols and components. from dataclasses import dataclass from hearth.kernel import Capability, Contract, Plan, Child, Rule, Port from hearth.space import Box, Frame from hearth.blocks import state_of, slab from hearth.components.interior import Room @dataclass(frozen=True) class Pendant: def capability(self): return Capability('extension.pendant', ('light', 'room-light'), guarantees=('actual light source',)) def negotiate(self, context, parameters): return Contract(Box((0, 0, 0), (0, 1, 0)), rules=(Rule('expected', ((0, 0, 0),), data={'names': ['ochre_froglight']}),)) def realize(self, context, contract): plan = Plan() plan.block((0, 0, 0), state_of('ochre_froglight', axis='y')) plan.block((0, 1, 0), slab('dark_oak')) return plan @dataclass(frozen=True) class ReadingSuite: width: int = 11 def capability(self): return Capability('extension.reading-suite', ('room', 'habitable', 'composite'), offers=('access',), guarantees=('lit', 'furnished', 'enclosed', 'reachable')) def negotiate(self, context, parameters): entry = (self.width // 2, 1, 0) port = Port('north', 'access', Frame(entry), Box(entry, (entry[0], 2, 0)), 10, delegate=('reading-room', 'north')) return Contract(Box((-1, 0, -1), (self.width, 9, self.width)), ports=(port,)) def realize(self, context, contract): return Plan(children=[Child('reading-room', Room('library', self.width, self.width, light_component=Pendant()))])
examples/courtyard.py
# New composition written after the core abstractions; no library changes needed. import argparse from pathlib import Path from hearth.components.building import Blueprint, RoomSpec from hearth.programs import building_scene from hearth.randomness import Scope from hearth.persistence import export_scene def build(seed): rng = Scope(seed).stream('courtyard') ring = ((0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (1, 2), (0, 2), (0, 1)) functions = ('living', 'library', 'workshop', 'storage', 'kitchen', 'bedroom', 'bedroom', 'storage') rooms = [RoomSpec(x, z, 0, purpose) for (x, z), purpose in zip(ring, functions)] for x, z in rng.sample(((0, 0), (2, 0), (0, 2), (2, 2)), rng.choice((1, 2))): rooms.append(RoomSpec(x, z, 1, 'bedroom')) return building_scene(Blueprint(tuple(rooms), bay=9, porch=True, roof_axis='auto'), seed) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('samples/courtyard.litematic')) a = p.parse_args() export_scene(build(a.seed), a.output)
examples/inspection.py
# Generate a real glass query, highlight membership, export and repeat after reload. import argparse import json from pathlib import Path from hearth.programs import dwelling, building_scene from hearth.persistence import export_scene, load_scene from hearth.blocks import name_of def demonstrate(seed, output): scene = building_scene(dwelling(seed), seed) point = next(p for p, c in sorted(scene.blocks.items()) if name_of(c.state) == 'glass' and 'room-' in c.owner) query = scene.inspect(point) print(json.dumps(query, default=lambda v: sorted(v), indent=2)) print('Exact current component cells:', sorted(scene.cells(query['instance']))) export_scene(scene, output) restored = load_scene(output) assert restored.inspect(point) == query print('Reloaded query identical; world coordinate:', point) return query if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('samples/inspection.litematic')) a = p.parse_args() demonstrate(a.seed, a.output)
examples/prototype.py
# Run the small terrain, planting and attached-window composition before full buildings. import argparse from pathlib import Path from hearth import Scene, Box, Frame, Binding from hearth.environment import Terrain, gradient, wave from hearth.components.primitives import Wall, Window, Grass, Tree from hearth.adapters.site import Foundation from hearth.composition import encapsulate from hearth.kernel import Plan, Child from hearth.persistence import export_scene def build(seed=0): scene = Scene(seed, domain=Box((-8, -3, -8), (20, 24, 20))) scene.place('land', Terrain(scene.domain, gradient(base=2) + wave(0.6, 0.2, 0.2))) def facade(ctx): return Plan(children=[Child('wall', Wall(thickness=2)), Child('window', Window(), frame=Frame((3, 1, 0)), bindings=(Binding(ctx.path + '/wall', 'infill'),))]) scene.place('footing', Foundation.rectangular(9, 2, 4), bindings=(Binding('/land', 'construction', 'fill'),)) scene.place('facade', encapsulate('facade', Box((-1, 0, -2), (10, 6, 3)), facade), frame=Frame((0, 4, 0))) y = scene.view.elevation(13, 9) + 1 scene.place('grass', Grass(True), frame=Frame((13, y, 9)), bindings=(Binding('/land', 'planting', 'plant'),)) scene.place('tree', Tree(), frame=Frame((13, y, 9)), bindings=(Binding('/land', 'planting', 'plant'), Binding('/grass', 'replacement', 'plant'))) return scene.finalize() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('samples/prototype.litematic')) args = parser.parse_args() export_scene(build(args.seed), args.output)
examples/assess.py
# Explicit finite batch output, never an unnoticed unit-test side effect. import argparse import json from pathlib import Path from hearth.assessment import run_corpus if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('reports/corpus')) p.add_argument('--artifacts', action='store_true') a = p.parse_args() print(json.dumps(run_corpus(a.output, a.seed, a.artifacts), indent=2))
examples/gallery.py
# A later client composes a public gallery with connected reading and work rooms. import argparse from pathlib import Path from hearth.components.building import Blueprint, RoomSpec from hearth.programs import building_scene from hearth.randomness import Scope from hearth.persistence import export_scene from extension_demo import Pendant def build(seed): rng = Scope(seed).stream('gallery-layout') length = rng.choice((2, 3)) rooms = [RoomSpec(0, z, 0, 'library' if z % 2 else 'living') for z in range(length)] rooms.append(RoomSpec(1, length - 1, 0, 'workshop')) rooms.append(RoomSpec(0, length - 1, 1, 'bedroom')) return building_scene(Blueprint(tuple(rooms), bay=9, roof_axis='z', light_component=Pendant()), seed) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('samples/gallery.litematic')) a = p.parse_args() export_scene(build(a.seed), a.output)
examples/building.py
# Run any of the three short room-composition programs with an explicit seed. import argparse from pathlib import Path from hearth.programs import PROGRAMS, building_scene from hearth.persistence import export_scene if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('program', choices=PROGRAMS) p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('samples/building.litematic')) a = p.parse_args() export_scene(building_scene(PROGRAMS[a.program](a.seed), a.seed), a.output)
examples/extension.py
# Substitute independent lighting and encapsulate an independently packaged room. import argparse from pathlib import Path from hearth import Scene, Box, Frame from hearth.kernel import Registry from hearth.components.interior import Light from hearth.components.building import Blueprint, RoomSpec from hearth.programs import building_scene from hearth.persistence import export_scene from extension_demo import Pendant, ReadingSuite def build(seed): registry = Registry() registry.register(Light()) registry.register(Pendant()) lights = registry.select('room-light') design = Blueprint((RoomSpec(0, 0, 0, 'library'), RoomSpec(0, 0, 1, 'bedroom')), light_component=lights[seed % len(lights)]) return building_scene(design, seed) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('samples/extension.litematic')) a = p.parse_args() export_scene(build(a.seed), a.output)
examples/extension_audit.py
# Replay the frozen extension manifest and compare complete structural records and actual NBT. import argparse import json from pathlib import Path import subprocess import sys import tempfile from hearth import Scene from hearth.environment import Terrain from hearth.environment.fields import from_expression from hearth.persistence import load_scene, semantic_digest, encode from hearth_extensions.assessment import PROBE_DOMAIN, freeze_probe, connector_scene, boundary_scene, hall_scene from hearth_extensions.programs import extension_scene, branching_campus, perimeter_cluster def replay(row): """Reconstruct one explicit assessment recipe from its recorded inputs. Args: row (dict): A selected row in the extension replay manifest. Returns: Scene: A validated, freshly generated scene without filesystem output. """ inputs = row['inputs'] seed = inputs['structure_seed'] group = row['label'].split('-')[0] if group == 'connector': environment = freeze_probe(inputs['environment']['environment_seed']) if semantic_digest(environment) != inputs['environment']['digest']: raise AssertionError('Frozen terrain changed') return connector_scene(environment, seed) if group == 'boundary': environment = Scene(inputs['environment_seed'], domain=PROBE_DOMAIN) environment.place('land', Terrain(PROBE_DOMAIN, from_expression(inputs['expression']))) environment.finalize() return boundary_scene(environment, seed) if group == 'hall': return hall_scene(seed, inputs['environment_seed']) programs = {'campus': branching_campus, 'perimeter': perimeter_cluster} return extension_scene(programs[inputs['program']], seed, inputs['environment_seed']) def audit(seed: int, manifest: Path, output: Path, cli: bool = False): """Check replay identity, structural graphs, queries, inventories and optional original CLI. Args: seed (int): Root assessment seed, used to verify the selected manifest. manifest (Path): Explicit batch artifact manifest. output (Path): Audit report destination. cli (bool): Also exercise the unchanged no-argument and seed-1 CLI in a temporary directory. Returns: dict: Completed audit with every selected input and result. """ entries = json.loads(manifest.read_text()) if entries[0]['inputs']['environment']['environment_seed'] != seed * 100: raise ValueError('Root seed does not match the selected assessment manifest') rows = [] for row in entries: native = replay(row) restored = load_scene(Path(row['artifact'])) assert semantic_digest(native) == row['digest'] == semantic_digest(restored), row['label'] for field in ('nodes', 'relations', 'dependencies', 'operations', 'port_uses', 'displaced'): assert encode(getattr(native, field)) == encode(getattr(restored, field)), (row['label'], field) assert native.reverse == restored.reverse, row['label'] assert {p: c.nbt for p, c in native.blocks.items()} == {p: c.nbt for p, c in restored.blocks.items()} points = [min(native.cells(n)) for n in sorted(native.nodes) if native.cells(n)] for point in points: assert native.inspect(point) == restored.inspect(point), (row['label'], point) rows.append({'label': row['label'], 'digest': row['digest'], 'nodes': len(native.nodes), 'blocks': len(native.blocks), 'component_queries': len(points), 'inventories': sum(c.nbt is not None for c in native.blocks.values()), 'verified': True}) cli_rows = [] if cli: root = Path(__file__).resolve().parents[1] with tempfile.TemporaryDirectory(dir=root / 'test', prefix='tmp-extension-cli-') as directory: temporary = Path(directory) for name, arguments, filename in (('default', [], 'output.litematic'), ('seed-1', ['--seed', '1', '--output', str(temporary / 'explicit path with spaces.litematic')], 'explicit path with spaces.litematic')): subprocess.run([sys.executable, str(root / 'generate.py'), *arguments], cwd=temporary, check=True) scene = load_scene(temporary / filename) cli_rows.append({'command': name, 'seed': scene.seed, 'blocks': len(scene.blocks), 'nodes': len(scene.nodes), 'digest': semantic_digest(scene), 'verified': True}) result = {'root_seed': seed, 'manifest': str(manifest), 'verified': True, 'artifacts': rows, 'original_cli': cli_rows} output.parent.mkdir(parents=True, exist_ok=True) output.write_text(json.dumps(result, indent=2)) return result if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--manifest', type=Path, default=Path('samples/extensions/replay-manifest.json')) parser.add_argument('--output', type=Path, default=Path('reports/extension-corpus/artifact-audit.json')) parser.add_argument('--cli', action='store_true') args = parser.parse_args() audit(args.seed, args.manifest, args.output, args.cli)
examples/extension_generate.py
# Explicit client selection for new graph compositions, preserving the original default CLI. import argparse from pathlib import Path from hearth.persistence import export_scene, semantic_digest from hearth_extensions.programs import extension_scene, branching_campus, perimeter_cluster PROGRAMS = {'campus': branching_campus, 'perimeter': perimeter_cluster} def main(): parser = argparse.ArgumentParser() parser.add_argument('program', choices=PROGRAMS) parser.add_argument('--seed', type=int, default=0) parser.add_argument('--environment-seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('samples/extensions/composition.litematic')) args = parser.parse_args() scene = extension_scene(PROGRAMS[args.program], args.seed, args.environment_seed) export_scene(scene, args.output) print(args.output, semantic_digest(scene), len(scene.blocks), 'blocks', len(scene.nodes), 'instances') if __name__ == '__main__': main()
examples/extension_views.py
# Render extension artifact pairs and explicitly labeled geometry-only inspection sections. import argparse import json from pathlib import Path import subprocess import sys import hearth_extensions from hearth.persistence import load_scene, companion_path from examples.preview import render, CUTAWAY def views(seed, source, output, size=1100, sections=False, focus=None): scene = load_scene(source) if scene.seed != seed: raise ValueError('Explicit seed must match artifact') output.mkdir(parents=True, exist_ok=True) records = [] offset = list(json.loads(companion_path(source).read_text())['offset']) render_source = source if focus: box = scene.view.contract(focus).envelope for index, axis in enumerate('xyz'): for keep_above, limit in ((False, box.hi[index]), (True, box.lo[index] - 1)): target = output / f'focus-{axis}-{int(keep_above)}.litematic' command = [sys.executable, str(CUTAWAY), '--input', str(render_source), '--output', str(target), '--axis', axis, '--max', str(limit - offset[index]), '--name', 'focus-preview'] if keep_above: command.append('--keep-above') subprocess.run(command, check=True) if keep_above: offset[index] = limit + 1 render_source = target for label, azimuth, elevation in (('front', 215, 36), ('rear', 35, 32), ('side', 120, 27)): target = output / (label + '.png') render(render_source, target, azimuth, elevation, size, 3.6) records.append({'source': str(source), 'seed': seed, 'label': label, 'azimuth': azimuth, 'elevation': elevation, 'image': str(target), 'focus': focus, 'geometry_preview_only': focus is not None}) if sections: halls = [n for n in scene.nodes.values() if n.type == 'extension.pavilion'] links = [n for n in scene.nodes.values() if n.type in ('extension.bridge', 'extension.gallery')] height = max(n.frame.origin[1] + n.contract.decisions['floor'] + 3 for n in halls) if halls else max(p[1] for n in links for p in scene.cells(n.path + '/deck')) + 1 cuts = [('floor-cut', 'y', height, 215, 65)] if links: points = scene.cells(links[0].path + '/deck') cuts.append(('connection-section', 'x', (min(p[0] for p in points) + max(p[0] for p in points)) // 2, 110, 20)) for label, axis, world, azimuth, elevation in cuts: target = output / (label + '.litematic') limit = world - offset['xyz'.index(axis)] subprocess.run([sys.executable, str(CUTAWAY), '--input', str(render_source), '--output', str(target), '--axis', axis, '--max', str(limit), '--name', label], check=True) image = output / (label + '.png') render(target, image, azimuth, elevation, size, 3.6) records.append({'source': str(source), 'seed': seed, 'label': label, 'axis': axis, 'world_cut': world, 'export_local_cut': limit, 'geometry_preview_only': True, 'image': str(image), 'focus': focus}) (output / 'views.json').write_text(json.dumps(records, indent=2)) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--input', type=Path, required=True) p.add_argument('--output', type=Path, required=True) p.add_argument('--size', type=int, default=1100) p.add_argument('--sections', action='store_true') p.add_argument('--focus', help='Optional public component path for a geometry-only detail crop') a = p.parse_args() views(a.seed, a.input, a.output, a.size, a.sections, a.focus)
examples/extension_assess.py
# Rerun the retained extension sampling policy without altering first-phase evidence. import argparse import json from pathlib import Path from hearth_extensions.assessment import run if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('reports/extension-corpus/final')) p.add_argument('--artifacts', action='store_true') p.add_argument('--samples', type=Path, default=Path('samples/extensions')) a = p.parse_args() print(json.dumps(run(a.output, a.seed, a.artifacts, a.samples), indent=2))
examples/extension_inspection.py
# Inspect real extension structures and verify the same public queries after reload. import argparse import json from pathlib import Path import hearth_extensions from hearth.persistence import load_scene, export_scene def inspect(source, seed, output): scene = load_scene(source) if scene.seed != seed: raise ValueError('Explicit seed must match input artifact') queries = [] for tag in ('deck', 'window', 'fixture'): candidate = next((n for n in scene.nodes.values() if n.capability and tag in n.capability.tags and scene.cells(n.path)), None) if candidate is None: continue point = min(scene.cells(candidate.path)) queries.append({'tag': tag, 'query': scene.inspect(point), 'exact_cell_count': len(scene.cells(candidate.path)), 'descendant_cell_count': len(scene.cells(candidate.path, True))}) export_scene(scene, output) restored = load_scene(output) for entry in queries: assert restored.inspect(entry['query']['position']) == entry['query'] assert len(restored.cells(entry['query']['instance'])) == entry['exact_cell_count'] print(json.dumps({'source': str(source), 'seed': seed, 'verified_after_reload': True, 'queries': queries}, default=lambda v: sorted(v), indent=2)) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--input', type=Path, required=True) p.add_argument('--output', type=Path, default=Path('samples/extensions/inspection.litematic')) a = p.parse_args() inspect(a.input, a.seed, a.output)
examples/extension_replay.py
# Cross-process extension replay with full semantic graph and query comparisons. import argparse import json import os from pathlib import Path import subprocess import sys import tempfile CHILD = ''' import sys,json,hashlib from pathlib import Path from hearth_extensions.programs import extension_scene,perimeter_cluster from hearth_extensions.assessment import signatures from hearth.persistence import export_scene,load_scene,semantic_digest,encode scene=extension_scene(perimeter_cluster,int(sys.argv[1]),int(sys.argv[2])) p=next(p for p,c in sorted(scene.blocks.items()) if c.state=='minecraft:glass' and 'facade' in c.owner) query=scene.inspect(p) nodes=json.dumps(encode(scene.nodes),sort_keys=True,separators=(',',':')) output=Path(sys.argv[3]);export_scene(scene,output) restored=load_scene(output) assert restored.inspect(p)==query assert encode(restored.nodes)==encode(scene.nodes) print(json.dumps({'digest':semantic_digest(scene),'principal':signatures(scene)['principal_signature'],'nodes_digest':hashlib.sha256(nodes.encode()).hexdigest(),'nodes':len(scene.nodes),'glass_query':query},default=lambda v:sorted(v),sort_keys=True)) ''' def replay(seed, environment_seed, output): root = Path(__file__).resolve().parents[1] rows = [] with tempfile.TemporaryDirectory(dir=root / 'test', prefix='tmp-extension-replay-') as temporary: for hash_seed in ('5', '918273'): artifact = Path(temporary) / f'seed {seed} hash {hash_seed}.litematic' result = subprocess.run([sys.executable, '-c', CHILD, str(seed), str(environment_seed), str(artifact)], cwd=root, env=dict(os.environ, PYTHONHASHSEED=hash_seed), capture_output=True, text=True, check=True) rows.append({'PYTHONHASHSEED': hash_seed, 'result': json.loads(result.stdout)}) if rows[0]['result'] != rows[1]['result']: raise AssertionError('Extension replay mismatch') output.parent.mkdir(parents=True, exist_ok=True) output.write_text(json.dumps({'verified': True, 'seed': seed, 'environment_seed': environment_seed, 'runs': rows}, indent=2)) print('Verified extension content, nodes, signatures, glass query and paired reload across two Python hash seeds.') if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=3) p.add_argument('--environment-seed', type=int, default=7) p.add_argument('--output', type=Path, default=Path('reports/extension-corpus/replay.json')) a = p.parse_args() replay(a.seed, a.environment_seed, a.output)
examples/lodge.py
# Generate an individual building composition and composed garden with explicit seeds. import argparse from pathlib import Path from hearth.lodges import hillside_home, gabled_hall, high_house, lodge_scene from hearth.persistence import export_scene PROGRAMS = {'home': hillside_home, 'hall': gabled_hall, 'high': high_house} if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('program', choices=PROGRAMS) parser.add_argument('--seed', type=int, default=0) parser.add_argument('--environment-seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('samples/building-quality/lodge.litematic')) args = parser.parse_args() export_scene(lodge_scene(PROGRAMS[args.program](args.seed), args.seed, args.environment_seed), args.output)
examples/building_quality.py
# Rerun the recorded individual-building corpus, keeping every result and paired artifact. import argparse import json from pathlib import Path from hearth.quality_assessment import run if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('reports/building-quality/final')) parser.add_argument('--artifacts', type=Path, default=Path('samples/building-quality/final')) args = parser.parse_args() print(json.dumps(run(args.output, args.artifacts, args.seed), indent=2))
examples/building_views.py
# Three exterior angles and circulation/interior slices for a verified individual-building pair. import argparse import json import subprocess import sys from pathlib import Path from hearth.persistence import load_scene, companion_path from examples.preview import render, CUTAWAY def preview(source, output, seed, size=1200): scene = load_scene(source) if scene.seed != seed: raise ValueError('Explicit seed does not match artifact') output.mkdir(parents=True, exist_ok=True) records = [] for label, azimuth, elevation in (('front', 215, 28), ('rear', 35, 28), ('side', 120, 26)): target = output / (label + '.png') render(source, target, azimuth, elevation, size, 3.4) records.append({'label': label, 'image': str(target), 'azimuth': azimuth, 'elevation': elevation, 'complete': True}) building = next(n for n in scene.nodes.values() if n.type == 'building.rooms') floor = building.frame.origin[1] + building.contract.decisions['floor'] offset = json.loads(companion_path(source).read_text())['offset'] cuts = [('interior', 'y', floor + 2 - offset[1], 215, 66)] stairs = [n for n in scene.nodes.values() if n.type == 'circulation.stair'] lofts = [n for n in scene.nodes.values() if 'roof-room' in n.capability.tags] if lofts: loft = max(lofts, key=lambda n: (n.frame.origin[1], n.path)) cuts.append(('loft', 'y', loft.frame.origin[1] + 2 - offset[1], 215, 70)) stairs.sort(key=lambda n: (-n.frame.origin[1], n.path)) if stairs: cells = scene.cells(stairs[0].path) axis = min((0, 2), key=lambda k: max(p[k] for p in cells) - min(p[k] for p in cells)) cut = max(p[axis] for p in cells) + 1 - offset[axis] cuts.append(('circulation', 'xz'[axis // 2], cut, 110 if axis == 0 else 20, 26)) for label, axis, limit, azimuth, elevation in cuts: cut = output / (label + '.litematic') subprocess.run([sys.executable, str(CUTAWAY), '--input', str(source), '--output', str(cut), '--axis', axis, '--max', str(limit), '--name', label], check=True) target = output / (label + '.png') render(cut, target, azimuth, elevation, size, 3.2) records.append({'label': label, 'image': str(target), 'axis': axis, 'limit_export_local': limit, 'azimuth': azimuth, 'elevation': elevation, 'geometry_only_cutaway': True}) manifest = {'source': str(source), 'seed': seed, 'views': records} (output / 'views.json').write_text(json.dumps(manifest, indent=2)) return manifest if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--input', type=Path, required=True) parser.add_argument('--output', type=Path, required=True) parser.add_argument('--size', type=int, default=1200) args = parser.parse_args() preview(args.input, args.output, args.seed, args.size)
examples/lodge_inspection.py
# Query real glass ownership and related structures before and after paired persistence. import argparse import json from pathlib import Path from hearth.lodges import hillside_home, lodge_scene from hearth.persistence import export_scene, load_scene, semantic_digest from hearth.blocks import name_of def inspect(seed, environment_seed, output): scene = lodge_scene(hillside_home(seed), seed, environment_seed) windows = [n for n in scene.nodes.values() if 'sealed-opening' in scene.view.capability(n.path).tags] coordinates = sorted(p for node in windows for p in scene.cells(node.path) if name_of(scene.blocks[p].state) == 'glass') point = next(p for p in coordinates if any('roof' in scene.view.capability(n['id']).tags for n in scene.inspect(p)['chain'])) query = scene.inspect(point) cells = scene.cells(query['instance']) export_scene(scene, output) restored = load_scene(output) assert restored.inspect(point) == query and restored.cells(query['instance']) == cells return {'seed': seed, 'environment_seed': environment_seed, 'world_coordinate': point, 'query': query, 'exact_current_cells': sorted(cells), 'reloaded_query_matches': True, 'digest': semantic_digest(restored)} if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--environment-seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('samples/building-quality/inspection.litematic')) args = parser.parse_args() print(json.dumps(inspect(args.seed, args.environment_seed, args.output), default=lambda value: sorted(value), indent=2))
examples/building_holdout.py
# New post-fix operation compositions, predeclared separately from the regression corpus. import argparse import json from pathlib import Path from hearth import Scene from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.components.building import adapted from hearth.lodges import high_house, gabled_hall from hearth.quality_assessment import DOMAIN, evaluate, summary from hearth.persistence import semantic_digest def run(seed, output, artifacts): output.mkdir(parents=True, exist_ok=True) artifacts.mkdir(parents=True, exist_ok=True) environments, inputs, rows = [], [], [] for index in range(8): es = 3000 + seed * 100 + index rng = Scope(es).stream('new-expression') field = (gradient(rng.choice((-.04, 0, .04)), rng.choice((-.03, 0, .03)), 4) + wave(.35, .17, .05, rng.random() * 6)) field = field.blend(gradient(-.02, .03, 4) + radial(13, 10, 25, .7), radial(5, 8, 32, .8)).transformed(dx=2, dz=-3, scale=1.1).clamp(2, 7) water = rng.choice((None, 5, 6)) env = Scene(es, domain=DOMAIN) env.place('land', Terrain(DOMAIN, field, water)) env.finalize() environments.append(env) inputs.append({'environment_seed': es, 'expression': field.expression(), 'water': water, 'digest': semantic_digest(env)}) (output / 'frozen-inputs.json').write_text(json.dumps(inputs, indent=2)) for index, env in enumerate(environments): for client, bs in ((high_house, 5), (gabled_hall, 7)): def recipe(e=env, c=client, b=bs): s = e.fork(seed=b) s.compose_choice(adapted('building', c(b), '/land')) return s.finalize() label = f'{index}-{client.__name__}-{bs}' artifact = artifacts / (label + '.litematic') if index == 0 else None rows.append(evaluate(label, {**inputs[index], 'client': client.__name__, 'structure_seed': bs}, recipe, artifact)) if semantic_digest(env) != inputs[index]['digest']: raise AssertionError('Frozen input mutated') (output / 'results.json').write_text(json.dumps(rows, indent=2)) print(label, rows[-1]['status'], flush=True) report = summary(rows) (output / 'summary.json').write_text(json.dumps(report, indent=2)) (artifacts / 'manifest.json').write_text(json.dumps([r for r in rows if 'artifact' in r], indent=2)) return report if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('reports/building-quality/holdout')) parser.add_argument('--artifacts', type=Path, default=Path('samples/building-quality/holdout')) args = parser.parse_args() print(json.dumps(run(args.seed, args.output, args.artifacts), indent=2))
examples/roof_home.py
# A lightweight composition with inhabited roofs and a shared front veranda. import argparse from pathlib import Path from hearth.randomness import Scope from hearth.components import Blueprint, RoomSpec, FacadeDesign from hearth.components.roofcraft import RoofDesign from hearth.lodges import lodge_scene from hearth.persistence import export_scene def roof_home(seed): rng = Scope(seed).stream('roof-home-layout') rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(1, 0, 0, 'kitchen')] if rng.choice((False, True)): rooms.append(RoomSpec(1, 1, 0, rng.choice(('library', 'workshop')))) if rng.choice((False, True)): rooms.append(RoomSpec(0, 0, 1, 'library')) return Blueprint(tuple(rooms), bay=rng.choice((9, 11, 13)), roof_axis=rng.choice(('auto', 'z', 'x')), roof_design=RoofDesign(rng.choice(((1, 2), (1, 1, 2))), rng.choice((8, 11))), attic_purpose=rng.choice(('bedroom', 'library')), porch_bays=2, porch_depth=4, chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak') if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--environment-seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('roof-home.litematic')) args = parser.parse_args() export_scene(lodge_scene(roof_home(args.seed), args.seed, args.environment_seed), args.output)
examples/garden_house.py
# A new lightweight room-graph composition: inhabited wings around an open garden. import argparse from pathlib import Path from hearth.randomness import Scope from hearth.components import Blueprint, RoomSpec, FacadeDesign from hearth.components.roofcraft import RoofDesign from hearth.lodges import lodge_scene from hearth.persistence import export_scene def garden_house(seed): rng = Scope(seed).stream('garden-house-plan') rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(1, 0, 0, 'library'), RoomSpec(2, 0, 0, 'workshop'), RoomSpec(0, 1, 0, 'kitchen'), RoomSpec(2, 1, 0, 'storage')] for x in rng.sample((0, 2), rng.choice((1, 2))): rooms.append(RoomSpec(x, 0, 1, 'bedroom')) if rng.choice((False, True)): rooms.append(RoomSpec(2, 2, 0, 'library')) balcony = any((r.x, r.z, r.level) == (0, 0, 1) for r in rooms) return Blueprint(tuple(rooms), bay=rng.choice((11, 13)), roof_axis=rng.choice(('auto', 'z')), roof_design=RoofDesign(rng.choice(((1, 2), (1, 1, 2))), 9), porch_depth=4, balcony=balcony, chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak') if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--environment-seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('garden-house.litematic')) args = parser.parse_args() export_scene(lodge_scene(garden_house(args.seed), args.seed, args.environment_seed), args.output)
examples/building_detail.py
# Retained assessment of the new garden-house client and independently frozen environments. import argparse import json from pathlib import Path from hearth import Scene, Box from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.components import adapted from hearth.lodges import lodge_scene from hearth.persistence import semantic_digest from hearth.quality_assessment import evaluate, summary, fingerprint from examples.garden_house import garden_house def detail_signature(scene): """Measure functional stations and actual facade openings separately from massing.""" stations, openings = [], [] building = scene.nodes['/building'] floor = building.contract.decisions['floor'] for n in scene.nodes.values(): if n.type.startswith('furnishing.suite.') or n.type.startswith('window.'): local = building.frame.inverse(n.frame.origin) place = (local[0], local[1] - floor, local[2]) shape = sorted(n.frame.inverse(p) for p in scene.cells(n.path)) record = (n.type, place, shape) (stations if n.type.startswith('furnishing.suite.') else openings).append(record) return {'stations': fingerprint(sorted(stations)), 'facade_openings': fingerprint(sorted(openings)), 'station_count': len(stations), 'window_count': len(openings), 'window_boxes': sum(n.type == 'garden.window-box' for n in scene.nodes.values())} def run(seed, output, artifacts): output.mkdir(parents=True, exist_ok=True) artifacts.mkdir(parents=True, exist_ok=True) domain = Box((-10, -4, -20), (52, 72, 52)) environments, inputs, rows, details = [], [], [], {} # Freeze all six environments before any of their structure seeds are used. for index in range(6): es = 4100 + seed * 100 + index rng = Scope(es).stream('detail-environment') field = (gradient(rng.choice((-.025, 0, .025)), rng.choice((-.02, 0, .02)), 4) + wave(.3, .13, .09, rng.random() * 6)).blend( gradient(-.02, .02, 4) + radial(18, 18, 36, .5), radial(8, 10, 44, .6)).clamp(2, 6) water = rng.choice((None, 4, 5)) scene = Scene(es, domain=domain) scene.place('land', Terrain(domain, field, water)) scene.finalize() environments.append(scene) inputs.append({'environment_seed': es, 'expression': field.expression(), 'water': water, 'digest': semantic_digest(scene)}) (output / 'frozen-inputs.json').write_text(json.dumps(inputs, indent=2)) def retain(label, specification, recipe, artifact=None): def measured(): scene = recipe() details[label] = detail_signature(scene) return scene row = evaluate(label, specification, measured, artifact) if label in details: row['details'] = details[label] rows.append(row) (output / 'results.json').write_text(json.dumps(rows, indent=2)) print(label, row['status'], flush=True) for bs in range(8): label = f'court-{bs}' artifact = artifacts / (label + '.litematic') if bs in (0, 2, 7) else None retain(label, {'structure_seed': bs, 'environment_seed': 4100 + seed * 100, 'garden': True}, lambda b=bs: lodge_scene(garden_house(b), b, 4100 + seed * 100), artifact) for index, environment in enumerate(environments): for bs in (2, 7): def place(e=environment, b=bs): scene = e.fork(seed=b) scene.compose_choice(adapted('building', garden_house(b), '/land')) return scene.finalize() label = f'new-pair-{index}-{bs}' artifact = artifacts / (label + '.litematic') if index in (0, 1) else None retain(label, {**inputs[index], 'structure_seed': bs, 'garden': False}, place, artifact) if semantic_digest(environment) != inputs[index]['digest']: raise AssertionError('Frozen environmental input changed') result = {'client': summary(rows[:8]), 'independent_pairs': summary(rows[8:]), 'interior_signatures': len({d['stations'] for d in details.values()}), 'opening_signatures': len({d['facade_openings'] for d in details.values()})} (output / 'summary.json').write_text(json.dumps(result, indent=2)) (artifacts / 'manifest.json').write_text(json.dumps([r for r in rows if 'artifact' in r], indent=2)) return result if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('reports/building-detail/new-composition')) parser.add_argument('--artifacts', type=Path, default=Path('samples/building-detail/new-composition')) args = parser.parse_args() print(json.dumps(run(args.seed, args.output, args.artifacts), indent=2))
examples/verify_replay.py
# Explicit cross-process hash-seed replay and paired metadata verification. import argparse import json import os from pathlib import Path import subprocess import sys import tempfile from hearth.persistence import load_scene, semantic_digest from hearth.space import Box def verify(seed, output): root = Path(__file__).resolve().parents[1] rows = [] with tempfile.TemporaryDirectory(dir=root / 'test', prefix='tmp-replay-') as temporary: for hash_seed in ('3', '8675309'): path = Path(temporary) / f'seed {seed} hash {hash_seed}.litematic' env = dict(os.environ, PYTHONHASHSEED=hash_seed) subprocess.run([sys.executable, str(root / 'generate.py'), '--seed', str(seed), '--output', str(path)], check=True, cwd=root, env=env) scene = load_scene(path) rows.append({'seed': seed, 'PYTHONHASHSEED': hash_seed, 'digest': semantic_digest(scene), 'bounds': [Box.enclosing(scene.blocks).lo, Box.enclosing(scene.blocks).hi], 'blocks': len(scene.blocks), 'buildings': sum(n.type == 'building.rooms' for n in scene.nodes.values())}) if rows[0]['digest'] != rows[1]['digest'] or rows[0]['bounds'] != rows[1]['bounds']: raise AssertionError('Cross-process replay mismatch') output.parent.mkdir(parents=True, exist_ok=True) output.write_text(json.dumps({'verified': True, 'runs': rows}, indent=2)) return rows if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--output', type=Path, default=Path('reports/replay.json')) a = p.parse_args() verify(a.seed, a.output)
examples/__init__.py
# Runnable public-API examples and explicit assessment tools.
examples/preview.py
# Render labeled exterior views and geometry-only slices with the optional proc tools. import argparse import json from pathlib import Path import subprocess import sys from hearth.persistence import export_scene, load_scene, companion_path from hearth.programs import settlement_scene RENDER = Path('/opt/tools/render_schematic.mjs') CUTAWAY = Path('/opt/tools/cutaway.py') VITE = Path('/work/generator/MCRender/node_modules/.bin/vite-node') def render(source, target, azimuth, elevation, size, radius): subprocess.run(['xvfb-run', '-a', str(VITE), '--script', str(RENDER), '--', '--input', str(source), '--output', str(target), '--size', str(size), '--azimuth', str(azimuth), '--elevation', str(elevation), '--radius', str(radius), '--fov', '30', '--ambient', '0.8'], check=True) def preview(seed, source, output, size=1200, cutaways=False): output.mkdir(parents=True, exist_ok=True) if source is None: source = output / 'source.litematic' export_scene(settlement_scene(seed), source) scene = load_scene(source) if scene.seed != seed: raise ValueError(f'--seed {seed} does not match the input artifact seed {scene.seed}') views = [('front', 210, 28, 3.5), ('rear', 30, 26, 3.5)] records = [] for label, azimuth, elevation, radius in views: target = output / (label + '.png') render(source, target, azimuth, elevation, size, radius) records.append({'source': str(source), 'seed': seed, 'label': label, 'image': str(target), 'azimuth': azimuth, 'elevation': elevation}) if cutaways: building = next(n for n in scene.nodes.values() if n.type == 'building.rooms') floor = building.contract.decisions['floor'] + building.frame.origin[1] offset = json.loads(companion_path(source).read_text())['offset'] cuts = [('floor-cut', 'y', floor + 4 - offset[1], 210, 64)] stair = next((n for n in scene.nodes.values() if n.type == 'circulation.stair'), None) if stair is not None: occupied = scene.cells(stair.path) # Cut beside the actual flight, including flights in a remote wing. axis = min((0, 2), key=lambda i: max(p[i] for p in occupied) - min(p[i] for p in occupied)) limit = max(p[axis] for p in occupied) + 1 - offset[axis] cuts.append(('stair-cut', 'xz'[axis // 2], limit, 110 if axis == 0 else 20, 26)) for label, axis, limit, azimuth, elevation in cuts: cut = output / (label + '.litematic') subprocess.run([sys.executable, str(CUTAWAY), '--input', str(source), '--output', str(cut), '--axis', axis, '--max', str(limit), '--name', label], check=True) target = output / (label + '.png') render(cut, target, azimuth, elevation, size, 3.2) records.append({'source': str(source), 'seed': seed, 'label': label, 'axis': axis, 'export_local_cut': limit, 'image': str(target), 'geometry_preview_only': True}) (output / 'views.json').write_text(json.dumps(records, indent=2)) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('--seed', type=int, default=0) p.add_argument('--input', type=Path) p.add_argument('--output', type=Path, default=Path('previews/default')) p.add_argument('--size', type=int, default=1200) p.add_argument('--cutaways', action='store_true') a = p.parse_args() preview(a.seed, a.input, a.output, a.size, a.cutaways)
examples/building_space.py
# Retained roof-room and veranda assessment with independent frozen environments. import argparse import json from pathlib import Path from hearth import Scene, Box from hearth.environment import Terrain, gradient, wave, radial from hearth.randomness import Scope from hearth.components import Blueprint, RoomSpec, FacadeDesign, adapted from hearth.components.roofcraft import RoofDesign from hearth.lodges import lodge_scene from hearth.persistence import semantic_digest, encode from hearth.quality_assessment import evaluate, summary, fingerprint from examples.roof_home import roof_home def held_out_design(seed): """Compose a three-bay front and a rear wing using the same public intent API.""" rng = Scope(seed).stream('held-out-room-graph') rooms = [RoomSpec(0, 0, 0, 'living'), RoomSpec(1, 0, 0, 'library'), RoomSpec(2, 0, 0, 'workshop'), RoomSpec(0, 1, 0, 'kitchen')] rooms.append(RoomSpec(rng.choice((0, 1, 2)), 0, 1, 'bedroom')) return Blueprint(tuple(rooms), bay=rng.choice((9, 11, 13)), roof_axis=rng.choice(('x', 'z', 'auto')), roof_design=RoofDesign(rng.choice(((1, 2), (1, 1, 2))), rng.choice((7, 12))), attic_purpose=rng.choice(('bedroom', 'library', 'storage')), porch_bays=3, porch_depth=5, chimney=True, facade_design=FacadeDesign(), rail_material='dark_oak') def interior_measurements(scene): """Retain actual functional measurements independently of principal shape.""" rooms = [n for n in scene.nodes.values() if n.type.startswith('room.loft.')] return {'lofts': len(rooms), 'purposes': [n.contract.decisions['purpose'] for n in rooms], 'stations': sum(len(n.contract.decisions['furniture']) for n in rooms), 'hung_lights': sum(n.type == 'light.roof-hanger' for n in scene.nodes.values()), 'collar_cells': sum(len(scene.cells(n.path)) for n in scene.nodes.values() if n.type == 'timber.roof-collars'), 'guard_cells': sum(len(scene.cells(n.path)) for n in scene.nodes.values() if n.type == 'circulation.aperture-guard'), 'optional_station_omissions': sum(n.contract.decisions['omitted_optional_stations'] for n in rooms), 'furniture_signature': fingerprint([(n.type, sorted(n.frame.inverse(p) for p in scene.cells(n.path))) for n in scene.nodes.values() if n.type.startswith('furnishing.')])} def run(seed, output, artifacts): output.mkdir(parents=True, exist_ok=True) artifacts.mkdir(parents=True, exist_ok=True) domain = Box((-10, -4, -20), (52, 72, 52)) environments, inputs, rows = [], [], [] for index in range(8): es = 5100 + seed * 100 + index rng = Scope(es).stream('roof-space-environment') field = (gradient(rng.choice((-.025, 0, .025)), rng.choice((-.02, 0, .02)), 4) + wave(.3, .13, .09, rng.random() * 6)).blend(gradient(-.02, .02, 4) + radial(18, 18, 36, .5), radial(8, 10, 44, .6)).clamp(2, 6) water = rng.choice((None, 4, 5)) environment = Scene(es, domain=domain) environment.place('land', Terrain(domain, field, water)) environment.finalize() environments.append(environment) inputs.append({'environment_seed': es, 'expression': field.expression(), 'water': water, 'digest': semantic_digest(environment)}) (output / 'frozen-inputs.json').write_text(json.dumps(inputs, indent=2)) def retain(label, inputs, recipe, artifact=None): measurements = {} def measured(): scene = recipe() measurements.update(interior_measurements(scene)) return scene row = evaluate(label, inputs, measured, artifact) row['interior'] = measurements rows.append(row) (output / 'results.json').write_text(json.dumps(rows, indent=2)) print(label, row['status'], flush=True) for bs in range(8): artifact = artifacts / f'roof-home-{bs}.litematic' if bs in (0, 2, 4, 7) else None retain(f'roof-home-{bs}', {'structure_seed': bs, 'environment_seed': seed * 100 + bs, 'design': encode(roof_home(bs))}, lambda b=bs: lodge_scene(roof_home(b), b, seed * 100 + b), artifact) for index, environment in enumerate(environments): for bs in (2, 7): def place(e=environment, b=bs): scene = e.fork(seed=b) scene.compose_choice(adapted('building', roof_home(b), '/land')) return scene.finalize() label = f'pair-{index}-{bs}' artifact = artifacts / (label + '.litematic') if (index, bs) in ((0, 2), (3, 7), (7, 2)) else None retain(label, {**inputs[index], 'structure_seed': bs, 'design': encode(roof_home(bs))}, place, artifact) if semantic_digest(environment) != inputs[index]['digest']: raise AssertionError('Frozen environment changed') for index, environment in enumerate(environments): bs = seed * 100 + index design = held_out_design(bs) def place(e=environment, b=bs, d=design): scene = e.fork(seed=b) scene.compose_choice(adapted('building', d, '/land')) return scene.finalize() label = f'held-out-{index}' artifact = artifacts / (label + '.litematic') if index in (0, 7) else None retain(label, {**inputs[index], 'structure_seed': bs, 'design': encode(design)}, place, artifact) if semantic_digest(environment) != inputs[index]['digest']: raise AssertionError('Frozen environment changed') report = {'client': summary(rows[:8]), 'independent_pairs': summary(rows[8:24]), 'held_out': summary(rows[24:])} (output / 'summary.json').write_text(json.dumps(report, indent=2)) (artifacts / 'manifest.json').write_text(json.dumps([r for r in rows if 'artifact' in r], indent=2)) return report if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--seed', type=int, default=0) parser.add_argument('--output', type=Path, default=Path('reports/building-space/new-compositions')) parser.add_argument('--artifacts', type=Path, default=Path('samples/building-space/new-compositions')) args = parser.parse_args() print(json.dumps(run(args.seed, args.output, args.artifacts), indent=2))
test/conftest.py
# Tests keep transient artifacts under test/ and remove them after each test. import sys import tempfile from pathlib import Path import pytest sys.path.insert(0, str(Path(__file__).parents[1])) @pytest.fixture def work(): with tempfile.TemporaryDirectory(dir=Path(__file__).parent, prefix='tmp-') as name: yield Path(name)
test/test_kernel.py
# Foundation tests run before extending architectural content. from dataclasses import dataclass import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Plan, Child, Rule from hearth.components.primitives import Assembly, Volume, Wall, Window, Grass, Tree, Pool from hearth.environment import Terrain, constant from hearth.blocks import state_of, blockstates_equivalent from hearth.persistence import export_scene, load_scene, semantic_digest def land(): s = Scene(12, domain=Box((-10, -3, -10), (20, 25, 20))) s.place('terrain', Terrain(s.domain, constant(0))) return s def test_composite_attachment_automatic_chain(): s = Scene(4) children = (Child('base', Volume(Box((0, 0, 0), (8, 0, 0)), state_of('stone'))), Child('wall', Wall(), frame=Frame((0, 1, 0))), Child('window', Window(), frame=Frame((2, 2, 0)), bindings=(Binding('/house/wall', 'infill'),))) s.place('house', Assembly('house', Box((-1, 0, -2), (10, 8, 3)), children)) q = s.inspect((2, 2, 0)) assert [n['type'] for n in q['chain']] == ['window.shuttered', 'wall.framed', 'house'] assert len(s.cells('/house/window')) == 10 assert s.cells('/house/window') <= s.cells('/house', True) def test_substitution_same_parent(): def parent(window): return Assembly('room', Box((-1, -1, -2), (10, 8, 3)), (Child('base', Volume(Box((0, -1, 0), (8, -1, 0)), state_of('stone'))), Child('wall', Wall()), Child('window', window, frame=Frame((2, 1, 0)), bindings=(Binding('/room/wall', 'infill'),)))) a, b = Scene(), Scene() a.place('room', parent(Window())) b.place('room', parent(Window(shutters=False))) assert semantic_digest(a) != semantic_digest(b) assert a.nodes['/room/window'].contract.envelope == b.nodes['/room/window'].contract.envelope def test_tree_grass_and_pool_preserve_support(): s = land() s.place('grass', Grass(), frame=Frame((0, 1, 0)), bindings=(Binding('/terrain', 'planting', 'plant'),)) s.place('tree', Tree(), frame=Frame((0, 1, 0)), bindings=(Binding('/terrain', 'planting', 'plant'), Binding('/grass', 'replacement', 'plant'))) assert '/grass' not in s.nodes assert s.inspect((0, 1, 0))['instance'] == '/tree' before = semantic_digest(s) nodes = set(s.nodes) ops = set(s.operations) with pytest.raises(ContractError): s.place('pool', Pool(), frame=Frame((-2, 0, -2)), bindings=(Binding('/terrain', 'construction', 'excavate'),)) assert semantic_digest(s) == before and set(s.nodes) == nodes and set(s.operations) == ops with pytest.raises(ContractError): s.place('grass2', Grass(), frame=Frame((0, 1, 0))) s.place('pool-ok', Pool(), frame=Frame((6, 0, 6)), bindings=(Binding('/terrain', 'construction', 'excavate'),)) s.finalize() def test_tall_grass_whole_object_and_no_tree_excavation(): s = land() s.place('grass', Grass(True), frame=Frame((0, 1, 0))) with pytest.raises(ContractError): s.place('ordinary-tree', Tree(), frame=Frame((0, 0, 0)), bindings=(Binding('/terrain', 'construction', 'excavate'),)) s.place('tree', Tree(), frame=Frame((0, 1, 0)), bindings=(Binding('/grass', 'replacement', 'plant'),)) assert '/grass' not in s.nodes def test_transforms_and_persistence(work): frame = Frame((14, 3, -7), 1) s = Scene(-42) s.place('beam', Volume(Box((0, 0, 0), (2, 0, 0)), state_of('oak_log', axis='x')), frame=frame) assert s.inspect((14, 3, -5))['state'] == state_of('oak_log', axis='z') path = work / 'space name.litematic' export_scene(s, path) restored = load_scene(path) assert restored.inspect((14, 3, -5)) == s.inspect((14, 3, -5)) assert blockstates_equivalent('minecraft:oak_stairs[facing=north,half=bottom]', 'minecraft:oak_stairs[half=bottom,facing=north]') assert not blockstates_equivalent('minecraft:oak_log', 'minecraft:oak_log[axis=y]') import json meta = path.with_suffix('.litematic.structure.json') data = json.loads(meta.read_text()) data['digest'] = 'bad' meta.write_text(json.dumps(data)) with pytest.raises(ContractError, match='geometry-mismatch'): load_scene(path) def test_clearance_rollback_and_bounds(): s = Scene() s.place('stairs', Assembly('circulation', Box((0, 0, 0), (3, 5, 3)), (), (Rule('clear', ((1, 2, 1), (1, 3, 1))),))) with pytest.raises(ContractError, match='clearance'): s.place('decoration', Volume(Box((1, 3, 1), (1, 3, 1)), state_of('stone'))) assert set(s.nodes) == {'/stairs'} and not s.blocks @dataclass class Escaper: def capability(self): return Capability('bad', ()) def negotiate(self, c, p): return Contract(Box((0, 0, 0), (0, 0, 0))) def realize(self, c, b): p = Plan() p.block((1, 0, 0), state_of('stone')) return p with pytest.raises(ContractError, match='envelope'): s.place('bad', Escaper()) def test_seed_stability_and_regeneration(): from hearth.randomness import Scope a = Scope(123).child('house') before = a.stream('layout').getrandbits(64) Scope(123).child('failed').stream().random() assert before == a.stream('layout').getrandbits(64) s = Scene() s.place('beam', Volume(Box((0, 0, 0), (2, 0, 0)), state_of('stone'))) s.regenerate('/beam', Volume(Box((0, 0, 0), (1, 0, 0)), state_of('oak_planks'))) assert s.inspect((2, 0, 0))['instance'] is None assert len(s.cells('/beam')) == 2
test/test_contracts_provenance.py
# Mutation, sharing, phases, rotations, extension and synchronized provenance tests. from dataclasses import dataclass, replace import json import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Grant, Port, Rule, Plan, Child, Limits, SearchExhausted from hearth.blocks import state_of from hearth.components.primitives import Volume, Assembly, Window, Wall, Grass, Tree, Pool from hearth.kernel.scene import Cell from hearth.persistence import export_scene, load_scene, semantic_digest from hearth.randomness import Scope from hearth.composition import encapsulate, repeat, arrange, scatter from extension_demo import Pendant, ReadingSuite @dataclass(frozen=True) class Editable: def capability(self): return Capability('editable', ('support',)) def negotiate(self, c, p): b = Box((0, 0, 0), (0, 0, 0)) return Contract(b, (Port('edit', 'adjust', Frame(), b, 10, 'edit'), Port('shared', 'shared-support', Frame(), b, 4)), (Grant('edit', b, ('adjust', 'excavate'), ('editor',), 1),)) def realize(self, c, b): p = Plan() p.block((0, 0, 0), state_of('oak_log', axis='y')) return p @dataclass(frozen=True) class Editor: material: str preserve: bool = True def capability(self): return Capability('editor', ('editor',)) def negotiate(self, c, p): return Contract(Box((0, 0, 0), (0, 0, 0))) def realize(self, c, b): p = Plan() p.block((0, 0, 0), self.material, preserve_owner=self.preserve) return p def test_adjustment_membership_history_deletion_and_reload(work): s = Scene() s.place('owner', Editable()) s.place('adjust', Editor(state_of('oak_log', axis='x')), bindings=(Binding('/owner', 'edit', 'adjust'),)) q = s.inspect((0, 0, 0)) assert q['instance'] == '/owner' and q['operation']['component'] == '/adjust' assert s.cells('/adjust') == frozenset() export_scene(s, work / 'adjust.litematic') r = load_scene(work / 'adjust.litematic') assert r.inspect((0, 0, 0)) == q s.remove('/adjust') assert s.inspect((0, 0, 0))['state'] == state_of('oak_log', axis='y') s.place('erase', Editor(state_of('air'), False), bindings=(Binding('/owner', 'edit', 'excavate'),)) assert s.inspect((0, 0, 0))['instance'] is None and not s.cells('/owner') s.remove('/erase') assert s.cells('/owner') == {(0, 0, 0)} def test_identical_blocks_do_not_grant_sharing_and_explicit_shared_support(): s = Scene() s.place('support', Editable()) s.place('bridge', Assembly('bridge', Box((0, 0, 0), (2, 2, 2)), ())) with pytest.raises(ContractError, match='write-authority'): s.place('intruder', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('oak_log', axis='y'))) s.share((0, 0, 0), '/bridge', '/support', 'shared') assert s.cells('/bridge', shared=True) == {(0, 0, 0)} assert ('/bridge', 'shares_support', '/support') in s.inspect((0, 0, 0))['related'] with pytest.raises(ContractError, match='support'): s.remove('/support') s.remove('/bridge') assert not s.inspect((0, 0, 0))['shared'] def test_partial_tall_plant_replacement_atomicity(): from hearth.environment import Terrain, constant s = Scene(domain=Box((-2, -2, -2), (4, 15, 4))) s.place('terrain', Terrain(s.domain, constant(0))) s.place('grass', Grass(True), frame=Frame((0, 1, 0))) @dataclass class Pruner: def capability(self): return Capability('pruner', ('tree',)) def negotiate(self, c, p): return Contract(Box((0, 0, 0), (0, 0, 0))) def realize(self, c, b): p = Plan() p.block((0, 0, 0), state_of('oak_log', axis='y')) return p snapshot = (semantic_digest(s), set(s.nodes), set(s.relations), dict(s.port_uses), list(s.dependencies)) with pytest.raises(ContractError, match='whole-object'): s.place('prune', Pruner(), frame=Frame((0, 1, 0)), bindings=(Binding('/grass', 'replacement', 'plant'),)) assert snapshot == (semantic_digest(s), set(s.nodes), set(s.relations), dict(s.port_uses), list(s.dependencies)) @pytest.mark.parametrize('turn', range(4)) def test_rotated_attachment_ports_claims_membership(turn, work): frame = Frame((-13, 5, 17), turn) def compose(c): return Plan(children=[Child('base', Volume(Box((0, -1, 0), (8, -1, 2)), state_of('stone'))), Child('wall', Wall(thickness=3)), Child('a', Window(), frame=Frame((2, 1, 0)), bindings=(Binding(c.path + '/wall', 'infill'),)), Child('b', Window(shutters=False), frame=Frame((6, 1, 0)), bindings=(Binding(c.path + '/wall', 'infill'),))]) s = Scene(31) s.place('house', encapsulate('house', Box((-1, -1, -2), (10, 8, 4)), compose), frame=frame) a, b = frame.point((2, 1, 0)), frame.point((6, 1, 0)) assert s.inspect(a)['instance'] != s.inspect(b)['instance'] assert [n['type'] for n in s.inspect(a)['chain']] == ['window.shuttered', 'wall.framed', 'house'] assert s.nodes['/house/wall'].contract.ports[0].frame.turn == turn assert all(s.nodes['/house/a'].contract.envelope.contains(p) for p in s.cells('/house/a')) export_scene(s, work / 'rotated.litematic') assert load_scene(work / 'rotated.litematic').inspect(a) == s.inspect(a) def test_completion_obligation_and_late_decoration(): s = Scene() b = Box((0, 0, 0), (3, 4, 3)) s.place('unfinished', Assembly('room', b, (), (Rule('light', ((1, 1, 1),), b, phase='complete'),)), complete=False) with pytest.raises(ContractError): s.finalize() s.place('lamp', Pendant(), frame=Frame((1, 2, 1))) s.finish_scope('/unfinished') s.finalize() with pytest.raises(ContractError, match='lighting'): s.remove('/lamp') def test_extension_low_level_composite_and_nested_protocol(): s = Scene(4) room = ReadingSuite() wrapper = encapsulate('independent-suite', Box((-2, 0, -2), (14, 11, 14)), lambda c: Plan(children=[Child('suite', room)])) s.place('hall', wrapper) s.finalize() assert any(n.type == 'extension.pendant' for n in s.nodes.values()) assert any(n.type == 'extension.reading-suite' for n in s.nodes.values()) def test_independent_order_and_failed_alternative_streams(): @dataclass class Seeded: def capability(self): return Capability('seeded', ()) def negotiate(self, c, p): return Contract(Box((0, 0, 0), (2, 0, 0))) def realize(self, c, b): p = Plan() p.block((c.rng('geometry').randrange(3), 0, 0), state_of('stone')) return p a, b = Scene(81), Scene(81) for scene, order in ((a, ('one', 'two')), (b, ('two', 'one'))): for key in order: scene.place(key, Seeded(), frame=Frame((10 if key == 'two' else 0, 0, 0))) assert semantic_digest(a) == semantic_digest(b) before = a.cells('/one') with pytest.raises(SearchExhausted): a.choose('failed', [Child('x', Volume(Box((0, 0, 0), (2, 0, 0)), state_of('dirt')))]) a.place('planter', Seeded(), frame=Frame((20, 0, 0))) assert a.cells('/one') == before c = Scene(81) c.place('one', Seeded(), seed=123) assert c.nodes['/one'].scope.seed == 123 def test_regeneration_restores_displaced_terrain_and_no_stale_cells(): from hearth.environment import Terrain, constant s = Scene(domain=Box((-2, -3, -2), (12, 20, 12))) s.place('land', Terrain(s.domain, constant(0))) before = semantic_digest(s) s.place('pool', Pool(), frame=Frame((1, 0, 1)), bindings=(Binding('/land', 'construction', 'excavate'),)) s.remove('/pool') assert semantic_digest(s) == before assert not any('/pool' in (a, c) for a, b, c in s.relations) def test_edit_limits_unknown_space_and_budget(): from hearth.environment import Terrain, constant s = Scene(domain=Box((-3, -3, -3), (12, 20, 12))) s.place('land', Terrain(s.domain, constant(0), edit_limit=1)) with pytest.raises(ContractError, match='edit-limit'): s.place('pool', Pool(), bindings=(Binding('/land', 'construction', 'excavate'),)) with pytest.raises(ContractError, match='unknown-space'): s.view.state((100, 1, 1)) s = Scene(limits=Limits(blocks=1)) with pytest.raises(ContractError, match='block-budget'): s.place('large', Volume(Box((0, 0, 0), (3, 0, 0)), state_of('stone'))) assert not s.nodes and not s.blocks def test_attachment_membership_across_encapsulation_boundaries(): s = Scene() s.place('house', Assembly('house', Box((-2, -1, -2), (12, 8, 5)), (Child('base', Volume(Box((0, -1, 0), (8, -1, 0)), state_of('stone'))), Child('wall', Wall())))) s.place('facade-window', Window(), frame=Frame((3, 1, 0)), bindings=(Binding('/house/wall', 'infill'),)) assert s.cells('/facade-window') <= s.cells('/house/wall', descendants=True) assert s.cells('/facade-window') <= s.cells('/house', descendants=True) assert s.inspect((3, 1, 0))['chain'][-1]['id'] == '/house' with pytest.raises(ContractError): s.remove('/house') s.regenerate('/house', dependents=('/facade-window',)) assert s.inspect((3, 1, 0))['instance'] == '/facade-window' def test_public_readonly_contracts_and_protected_preference(): from hearth.components.constraints import Preserve from hearth.environment import Terrain, constant s = Scene(domain=Box((-3, -3, -3), (12, 20, 12)), preferences={'planting': constant(100)}) s.place('land', Terrain(s.domain, constant(0))) s.place('reserve', Preserve(Box((1, -2, 1), (3, 1, 3)))) assert s.view.preference('planting', (2, 0, 2)) == 100 with pytest.raises(ContractError, match='protected-region'): s.place('pool', Pool(), bindings=(Binding('/land', 'construction', 'excavate'),)) original = s.nodes['/land'].contract.decisions['water'] public = s.view.contract('/land') public.decisions['water'] = 99 assert s.nodes['/land'].contract.decisions['water'] == original def test_explicit_candidate_budget_exhaustion(): from hearth.kernel import Choice s = Scene(limits=Limits(search=1)) s.place('occupied', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))) choice = Choice('choice', (Child('bad', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('dirt'))), Child('valid', Volume(Box((3, 0, 0), (3, 0, 0)), state_of('stone')))), lambda view, path: 0) with pytest.raises(SearchExhausted, match='search-budget'): s.compose_choice(choice) assert '/choice' not in s.nodes s.limits = replace(s.limits, search=2) s.compose_choice(choice) assert s.cells('/choice') == {(3, 0, 0)} def test_validator_extension_and_negotiated_domain(): from hearth.kernel import validator, Diagnostic @validator('test.actual-stone') def actual_stone(scene, node, rule): for p in rule.cells: if scene.inspect(p)['state'] != 'minecraft:stone': yield Diagnostic('test.actual-stone', node.path, p, 'Need actual stone') s = Scene() s.place('rule', Assembly('rule', Box((0, 0, 0), (0, 0, 0)), (Child('stone', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))),), (Rule('test.actual-stone', ((0, 0, 0),)),))) with pytest.raises(ContractError, match='test.actual-stone'): s.remove('/rule/stone') with pytest.raises(ContractError, match='input-domain'): s.place('bad-wall', Wall(width=100)) def test_forwarded_interfaces_discharge_after_scope_construction(): from hearth.kernel import Choice later = Assembly('later', Box((0, 0, 0), (0, 0, 0)), (Child('solid', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))),), ports=(Port('access', 'access', Frame(), Box((0, 0, 0), (0, 0, 0))),)) choice = Choice('first', (Child('one', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))), Child('two', Volume(Box((1, 0, 0), (1, 0, 0)), state_of('stone')))), lambda v, p: 0) wrapper = Assembly('wrapper', Box((0, 0, 0), (3, 1, 1)), (choice, Child('later', later, frame=Frame((3, 0, 0)))), ports=(Port('access', 'access', Frame((3, 0, 0)), Box((3, 0, 0), (3, 0, 0)), delegate=('later', 'access')),)) s = Scene() s.place('root', wrapper) s.finalize() assert s.view.port('/root', 'access').frame.origin == (3, 0, 0) def test_dense_export_budget_is_explicit(work): s = Scene(limits=Limits(export_volume=10)) s.place('line', Volume(Box((0, 0, 0), (10, 0, 0)), state_of('stone'))) with pytest.raises(ContractError, match='export-volume'): export_scene(s, work / 'too large.litematic') assert not (work / 'too large.litematic').exists()
test/test_geometry_environment.py
# Actual-geometry damage tests, independent environment sampling and regeneration. from dataclasses import replace, dataclass from pathlib import Path import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import validate, Capability, Contract, Plan, Port, Grant, Child, Rule from hearth.kernel.scene import Cell from hearth.blocks import state_of, name_of, blockstates_equivalent, validate_state from hearth.environment import Terrain, constant, gradient, wave, radial from hearth.components.building import Building, Blueprint, RoomSpec from hearth.components.primitives import Pool, Volume from hearth.programs import PROGRAMS, building_scene, settlement_scene from hearth.assessment import adaptation_expression, principal_signature from hearth.persistence import export_scene, load_scene, semantic_digest, companion_path, _mcio def damage(scene, p, material=None): scene = scene._fork() old = scene.blocks.get(p) if old: scene.reverse[old.owner].discard(p) scene.blocks.pop(p) if material: owner = old.owner if old else next(n.path for n in scene.nodes.values() if n.type.startswith('room.')) operation = old.operation if old else next(iter(scene.operations)) scene.blocks[p] = Cell(material, owner, operation) scene.reverse[owner].add(p) return scene @pytest.fixture def house(): return building_scene(Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom'))), 7, gradient(.04, 0, 4), 6) def test_removed_support_blocked_stair_exit_and_paired_door(house): foundation = next(n for n in house.nodes.values() if n.type == 'adapter.foundation') p = foundation.contract.rules[0].cells[0] assert 'support' in {d.rule for d in validate(damage(house, p), True)} stair = next(n for n in house.nodes.values() if n.type == 'circulation.stair') p = next(r for r in stair.contract.rules if r.kind == 'clear').cells[4] assert 'clearance' in {d.rule for d in validate(damage(house, p, state_of('stone')), True)} door = next(p for p, c in house.blocks.items() if 'spruce_door' in c.state and 'half=lower' in c.state) issues = validate(damage(house, door, state_of('stone')), True) assert {'door-pair', 'reachability'} <= {d.rule for d in issues} assert all(d.component.startswith('/') and d.conditions for d in issues) def test_lights_furniture_seal_and_inventory_are_actual(house): room = '/building/room-0-0-0' s = house for p in house.cells(room, True): if name_of(house.blocks[p].state) == 'lantern': s = damage(s, p) assert 'lighting' in {d.rule for d in validate(s, True)} glass = next(p for p in house.cells(room, True) if name_of(house.blocks[p].state) == 'glass') assert 'enclosure' in {d.rule for d in validate(damage(house, glass), True)} bed = next(p for p, c in house.blocks.items() if name_of(c.state) == 'red_bed') assert 'bed-pair' in {d.rule for d in validate(damage(house, bed), True)} barrel = next(p for p, c in house.blocks.items() if c.nbt) s = house._fork() nbt = dict(s.blocks[barrel].nbt) nbt['Items'] = [{'Slot': 0, 'id': 'minecraft:bread', 'count': 100}] s.blocks[barrel] = replace(s.blocks[barrel], nbt=nbt) assert 'inventory' in {d.rule for d in validate(s, True)} def test_pool_boundary_damage_and_unsupported_substrate(): s = Scene(domain=Box((-3, -3, -3), (14, 20, 14))) s.place('land', Terrain(s.domain, constant(0))) s.place('pool', Pool(), bindings=(Binding('/land', 'construction', 'excavate'),)) assert 'pool-containment' in {d.rule for d in validate(damage(s, (0, 0, 2)), True)} def test_nbt_roundtrip_and_real_schematic_mismatch(house, work): path = work / 'inventory and spaces.litematic' export_scene(house, path) restored = load_scene(path) assert semantic_digest(restored) == semantic_digest(house) assert {p: c.nbt for p, c in restored.blocks.items() if c.nbt} == {p: c.nbt for p, c in house.blocks.items() if c.nbt} _, _, tag, nbtfile = _mcio() nbt = nbtfile.load_regardless_of_gzipped(filename=path) region = next(iter(nbt['Regions'].values())) region['TileEntities'][0]['Items'][0]['count'] = tag.Int(7) nbtfile(nbt).save(path) with pytest.raises(ContractError, match='geometry-mismatch'): load_scene(path) companion_path(path).unlink() with pytest.raises(ContractError, match='untrusted-structure'): load_scene(path) @pytest.mark.parametrize('environment_seed', range(16)) @pytest.mark.parametrize('building_seed', range(4)) def test_64_frozen_independent_pairings(environment_seed, building_seed): field, water = adaptation_expression(environment_seed) domain = Box((-8, -4, -18), (34, 64, 34)) s = Scene(building_seed, domain=domain) s.place('ground', Terrain(domain, field, water)) before = {p: c.state for p, c in s.blocks.items()} # An existing protected environmental observation outside all building edits. protected = (32, s.view.elevation(32, 32), 32) from hearth.components.primitives import Assembly s.place('preserved', Assembly('protected-soil', Box(protected, protected), (), (Rule('expected', (protected,), data={'names': [name_of(s.blocks[protected].state)]}),))) design = PROGRAMS['dwelling'](building_seed) s.place('house', Building(design, '/ground')) s.finalize() assert s.nodes['/house'].contract.decisions['rooms'] == [(r.x, r.z, r.level, r.purpose) for r in design.normalized()] allowed = set() for path, old in s.displaced.items(): if path.startswith('/house/'): allowed.update(old) assert all(s.nodes[path].contract.envelope.contains(p) for p in old) assert all(p in allowed or (p in s.blocks and s.blocks[p].state == material) for p, material in before.items()) assert s.blocks[protected].state == before[protected] assert s.nodes['/house/approach'].contract.decisions['rows'] assert all(s.view.supports(p) for p in s.nodes['/house/foundation'].contract.rules[0].cells) def test_environment_implementation_substitution_and_public_forwarding(): @dataclass(frozen=True) class IndependentField: def __call__(self, x, z): return 4 + 0.01 * x - 0.01 * z def expression(self): return {'polynomial': [4, .01, -.01]} @dataclass(frozen=True) class WrappedEnvironment: domain: Box def capability(self): return Capability('extension.environment', ('environment', 'composite')) def negotiate(self, c, p): ports = tuple(Port(key, key, Frame(self.domain.lo), self.domain, 100000, delegate=('strata', key)) for key in ('construction', 'planting')) return Contract(self.domain, ports=ports) def realize(self, c, b): return Plan(children=[Child('strata', Terrain(self.domain, IndependentField()))]) domain = Box((-8, -4, -18), (30, 50, 30)) s = Scene(2, domain=domain) s.place('world', WrappedEnvironment(domain)) s.place('house', Building(Blueprint((RoomSpec(0, 0, 0, 'living'),)), '/world')) s.finalize() assert s.view.port('/house', 'street').delegate == ('approach', 'street') assert any(d['source'] == '/world' for d in s.dependencies) def test_environment_dependency_regeneration_is_explicit_and_atomic(): domain = Box((-8, -4, -18), (28, 55, 28)) s = Scene(3, domain=domain) s.place('land', Terrain(domain, constant(3))) design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom'))) s.place('house', Building(design, '/land')) before = semantic_digest(s) with pytest.raises(ContractError): s.regenerate('/land', Terrain(domain, constant(4))) assert semantic_digest(s) == before old_floor = s.nodes['/house'].contract.decisions['floor'] s.regenerate('/land', Terrain(domain, constant(4)), dependents=('/house',)) assert s.nodes['/house'].contract.decisions['floor'] == old_floor + 1 assert not any(n.stale for n in s.nodes.values()) assert all(p in s.blocks for cells in s.reverse.values() for p in cells) @pytest.mark.parametrize('program', tuple(PROGRAMS)) @pytest.mark.parametrize('seed', range(8)) def test_three_composition_programs(program, seed): s = building_scene(PROGRAMS[program](seed), seed) assert s.completed and any(n.type.startswith('room.') for n in s.nodes.values()) @pytest.mark.parametrize('seed,count', [(i, None) for i in range(8)] + [(0, 3), (0, 6)]) def test_settlement_corpus_and_boundaries(seed, count): s = settlement_scene(seed, count) assert s.completed buildings = [n for n in s.nodes.values() if n.type == 'building.rooms'] assert len(buildings) == count if count else 3 <= len(buildings) <= 6 route = next(n for n in s.nodes.values() if n.type == 'settlement.connections') assert len(route.contract.rules[0].cells) == len(buildings) + 2 def test_blockstate_explicit_semantics_and_rotation(): assert blockstates_equivalent('minecraft:oak_log[axis=x]', 'minecraft:oak_log[axis=x]') assert not blockstates_equivalent('minecraft:oak_log', 'minecraft:oak_log[axis=y]') assert not blockstates_equivalent('minecraft:oak_log[axis=x]', 'minecraft:oak_log[axis=z]') assert not blockstates_equivalent('minecraft:oak_log[axis=x]', 'minecraft:spruce_log[axis=x]') with pytest.raises(ValueError): validate_state('minecraft:stone[facing=north]') for turn in range(4): validate_state(Frame(turn=turn).state('minecraft:rail[shape=north_east,waterlogged=false]')) def test_complete_settlement_transforms_and_public_gateway(): from hearth.programs import Settlement, dwelling, atelier local = Box((-49, -4, -23), (49, 64, 66)) frame = Frame((150, 2, 80), 1) s = Scene(0, domain=frame.box(local)) s.place('land', Terrain(s.domain, constant(4))) s.place('district', Settlement((dwelling(1), atelier(1), dwelling(4)), local, '/land'), frame=frame) s.finalize() ports = s.view.offers('/district', 'public-access') assert len(ports) == 1 and ports[0].frame.turn == 1 assert ports[0].frame.origin == frame.point((0, 3, -12)) assert s.view.capability('/district/plot-0').inputs['design.bay'].accepts(9) assert any(d['reason'] == 'observed-spatial-input' for d in s.dependencies) def test_actual_subsurface_support_not_just_height(): domain = Box((-8, -4, -18), (28, 55, 28)) s = Scene(0, domain=domain) s.place('ground', Terrain(domain, constant(4))) s.place('local-cavity', Volume(Box((2, 3, 2), (2, 3, 2)), state_of('air'), 'siteworks'), bindings=(Binding('/ground', 'construction', 'excavate'),)) assert s.view.elevation(2, 2) == 4 and s.view.sample(2, 2).support_depth == 1 before = semantic_digest(s) with pytest.raises(ContractError, match='substrate-depth'): s.place('house', Building(Blueprint((RoomSpec(0, 0, 0, 'living'),)), '/ground')) assert semantic_digest(s) == before def test_path_endpoint_respects_host_authority(): from hearth.components.landscape import PathNetwork from hearth.components.primitives import Assembly domain = Box((-4, -3, -4), (12, 20, 12)) s = Scene(0, domain=domain) s.place('ground', Terrain(domain, constant(0))) # An unrelated solid host behind the offered endpoint must survive path widening. s.place('behind', Volume(Box((-1, 1, -1), (-1, 1, 1)), state_of('stone'))) s.place('route', PathNetwork(((0, 1, 0), (8, 1, 0)), ((0, 1),)), bindings=(Binding('/ground', 'construction', 'surface'),)) assert s.cells('/behind') == {(-1, 1, -1), (-1, 1, 0), (-1, 1, 1)} s.finalize() def test_upper_room_bay_boundary_with_vertical_circulation(): design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')), bay=13) s = building_scene(design, 5, gradient(base=4), 6) assert s.completed and s.nodes['/building'].contract.decisions['bay'] == 13 assert s.nodes['/building/room-0-0-0/stairs'].contract.rules
test/test_extension_protocol.py
# A read-only endpoint consumer must not need the host's mutation authority. import pytest from hearth import Scene, Box from hearth.kernel import Capability, Contract, Port, Grant, Plan from hearth.space import Frame from hearth.blocks import state_of from hearth_extensions import Endpoint, EndpointContact class Landing: def capability(self): return Capability('test.landing', ('landing',)) def negotiate(self, ctx, parameters): return Contract(Box((-1, 0, -1), (1, 0, 1)), ports=(Port('access', 'access', Frame((0, 1, 0)), Box((-1, 0, -1), (1, 2, 1)), 4, 'resurface'),), grants=(Grant('resurface', Box((-1, 0, -1), (1, 0, 1)), ('surface',), ('path',), 9),)) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, state_of('stone_bricks')) return p def test_read_only_connection_to_mutable_port(): s = Scene() s.place('landing', Landing()) endpoint = Endpoint('/landing', 'access') before = dict(s.blocks) s.place('consumer', EndpointContact(endpoint), bindings=(endpoint.binding(),)) assert s.blocks == before assert ('/consumer', 'connected_to', '/landing') in s.relations s.finalize() def test_connection_does_not_acquire_write_authority(): from hearth.kernel import ContractError class Bad(EndpointContact): def realize(self, ctx, contract): p = Plan() p.block((0, 0, 0), state_of('gold_block')) return p s = Scene() s.place('landing', Landing()) endpoint = Endpoint('/landing', 'access') before = dict(s.blocks) with pytest.raises(ContractError, match='write-authority'): s.place('bad', Bad(endpoint), bindings=(endpoint.binding(),)) assert s.blocks == before and '/bad' not in s.nodes def test_atomic_multi_branch_replay_accepts_explicit_replacements(): from hearth.components.primitives import Volume s = Scene() s.place('a', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))) s.place('b', Volume(Box((3, 0, 0), (3, 0, 0)), state_of('stone'))) s.regenerate('/a', dependents=('/b',), replacements={'/b': Volume(Box((3, 0, 0), (4, 0, 0)), state_of('oak_planks'))}) assert len(s.cells('/b')) == 2 assert s.inspect((0, 0, 0))['state'] == state_of('stone') def test_multi_branch_replay_rejects_undeclared_target_and_rolls_back(): from hearth.components.primitives import Volume from hearth.kernel import ContractError from hearth.persistence import semantic_digest s = Scene() s.place('a', Volume(Box((0, 0, 0), (0, 0, 0)), state_of('stone'))) before = semantic_digest(s) with pytest.raises(ContractError, match='replay-targets'): s.regenerate('/a', replacements={'/unknown': Landing()}) assert semantic_digest(s) == before and set(s.nodes) == {'/a'} def test_importable_generation_has_no_new_native_dependency(): import subprocess, sys from pathlib import Path code = ''' import sys,importlib.abc class NoNative(importlib.abc.MetaPathFinder): def find_spec(self, fullname, path=None, target=None): if fullname.split('.')[0] in ('numpy','mcio','scipy','shapely','ctypes'): raise RuntimeError('Unexpected native/transport dependency: '+fullname) sys.meta_path.insert(0,NoNative()) from hearth_extensions.assessment import hall_scene from hearth.persistence import semantic_digest scene=hall_scene(4,1) print(semantic_digest(scene)) ''' result = subprocess.run([sys.executable, '-c', code], cwd=Path(__file__).parents[1], capture_output=True, text=True) assert result.returncode == 0, result.stderr assert len(result.stdout.strip()) == 64
test/test_extension_geometry.py
# Extension-only probes for non-cardinal circulation and curve interfaces. from dataclasses import replace import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import validate, Child, Plan from hearth.components.primitives import Volume from hearth.environment import Terrain, gradient, wave from hearth.blocks import state_of from hearth.persistence import export_scene, load_scene, semantic_digest from hearth_extensions import Polyline, Endpoint, Link, Boundary, IlluminateBoundary, Platform def bridge_scene(seed=0, water=3, frame=Frame()): domain = Box((-8, -4, -8), (45, 42, 45)) s = Scene(seed, domain=frame.box(domain)) s.place('land', Terrain(domain, gradient(.02, .01, 1) + wave(.2, .1, .15, seed), water), frame=frame) s.place('a', Platform('/land'), frame=frame) s.place('b', Platform('/land'), frame=frame.compose(Frame((18, 0, 27)))) a, b = Endpoint('/a', 'south'), Endpoint('/b', 'north') s.place('link', Link(a, b, '/land', rise=1), frame=frame, bindings=(a.binding(), b.binding())) return s.finalize() def test_diagonal_bridge_actual_route_support_railings_and_reload(work): s = bridge_scene() assert any(n.type == 'extension.trestles' for n in s.nodes.values()) assert len(set(x for x, z in s.nodes['/link'].contract.decisions['center'])) > 5 assert not validate(s, True) p = next(iter(s.cells('/link/deck'))) q = s.inspect(p) assert any('connect' in str(r) for r in s.inspect(p)['related']) or ('/link', 'connects', '/a') in s.relations export_scene(s, work / 'diagonal bridge.litematic') t = load_scene(work / 'diagonal bridge.litematic') assert t.inspect(p) == q and semantic_digest(t) == semantic_digest(s) def test_curve_boundary_interfaces_and_external_attachment(): s = Scene(3, domain=Box((-5, -4, -5), (45, 35, 35))) s.place('land', Terrain(s.domain, gradient(.015, .01, 3))) curve = Polyline.bezier(((0, 0), (7, 25), (28, -3), (37, 20))) s.place('boundary', Boundary(curve)) s.place('lamps', IlluminateBoundary('/boundary')) s.finalize() ports = s.view.offers('/boundary', 'mount') assert len(ports) > 3 p = ports[0].frame.origin q = s.inspect(p) assert q['chain'][1]['id'] == '/boundary' assert p in s.cells('/boundary', descendants=True) @pytest.mark.parametrize('width,depth,corner,lantern', [(13, 17, 0, False), (17, 21, 3, True), (25, 13, 4, False)]) def test_polygon_hall_multiple_usable_ports(width, depth, corner, lantern, work): from hearth_extensions import Pavilion, Polygon s = Scene(2, domain=Box((-15, -4, -15), (42, 60, 42))) s.place('land', Terrain(s.domain, gradient(.025, -.018, 4))) s.place('hall', Pavilion(Polygon.chamfered(width, depth, corner), '/land', entrances=('north', 'east', 'south', 'west'), lantern=lantern)) s.finalize() assert len(s.view.offers('/hall', 'access')) == 4 glass = next(p for p, c in s.blocks.items() if c.state == 'minecraft:glass' and '/facade/' in c.owner) assert [n['type'] for n in s.inspect(glass)['chain']][:3] == ['window.shuttered', 'extension.polygon-shell', 'extension.pavilion'] export_scene(s, work / 'hall.litematic') assert load_scene(work / 'hall.litematic').inspect(glass) == s.inspect(glass) @pytest.mark.parametrize('turn', [0, 1, 2, 3]) def test_extension_transforms_geometry_interfaces_claims_and_queries(turn, work): from hearth.blocks import blockstates_equivalent frame = Frame((7, 3, -5), turn) base = bridge_scene() moved = bridge_scene(frame=frame) assert len(base.blocks) == len(moved.blocks) for point, cell in base.blocks.items(): q = frame.point(point) assert blockstates_equivalent(frame.state(cell.state), moved.inspect(q)['state']) assert moved.inspect(q)['instance'] == cell.owner assert moved.view.port('/a', 'south').frame == frame.compose(base.view.port('/a', 'south').frame) assert moved.nodes['/link'].contract.rules[0].cells == tuple(frame.point(p) for p in base.nodes['/link'].contract.rules[0].cells) export_scene(moved, work / 'rotated bridge.litematic') restored = load_scene(work / 'rotated bridge.litematic') q = next(iter(moved.cells('/link/deck'))) assert restored.inspect(q) == moved.inspect(q) def test_untried_kinked_ribbon_and_asymmetric_polygon(): from hearth_extensions import Polygon, Pavilion # Endpoints share Z; a global endpoint clipping plane would sever this route. curve = Polyline(((4, 8), (4, 12), (13, 16), (22, 12), (22, 8))) s = Scene(19, domain=Box((-8, -4, -8), (50, 60, 50))) s.place('land', Terrain(s.domain, gradient(base=2), water_level=3)) s.place('a', Platform('/land')) s.place('b', Platform('/land'), frame=Frame((18, 0, 0))) a, b = Endpoint('/a', 'south'), Endpoint('/b', 'south') s.place('link', Link(a, b, '/land', curve=curve, covered=True), bindings=(a.binding(), b.binding())) s.finalize() # A six-sided asymmetric footprint absent from the shipped clients. polygon = Polygon(((2, 0), (18, 0), (22, 4), (22, 16), (0, 16), (0, 3))) other = Scene(19, domain=Box((-10, -4, -10), (40, 60, 40))) other.place('land', Terrain(other.domain, gradient(.01, .02, 3))) other.place('hall', Pavilion(polygon, '/land', entrances=('north', 'south'), height=7, roof_run=3)) other.finalize() def test_graph_parent_substitutes_public_access_components(): from hearth_extensions.graphs import Campus, Vertex, Edge from hearth_extensions import Pavilion, Polygon domain = Box((-12, -4, -12), (55, 65, 60)) variants = [] for component in (Platform('/land', 13, 13), Pavilion(Polygon.chamfered(13, 13, 2), '/land', entrances=('north', 'south'))): s = Scene(6, domain=domain) s.place('land', Terrain(domain, gradient(base=3), water_level=3)) campus = Campus((Vertex('a', component, Frame()), Vertex('b', Platform('/land'), Frame((25, 0, 29)))), (Edge('a', 'south', 'b', 'north'),), '/land', domain, landscape=False) s.place('group', campus) s.finalize() assert len(s.view.offers('/group', 'access')) == 1 assert ('/group/circulation/link-0', 'connects', '/group/a') in s.relations variants.append(semantic_digest(s)) assert variants[0] != variants[1] @pytest.mark.parametrize('environment_seed,structure_seed', [(0, 0), (1, 5), (2, 3), (3, 2), (4, 1), (5, 4), (6, 0), (7, 5)]) def test_independent_extension_environment_structure_pairs(environment_seed, structure_seed): from hearth_extensions.assessment import freeze_probe, connector_scene frozen = freeze_probe(environment_seed) digest = semantic_digest(frozen) scene = connector_scene(frozen, structure_seed) assert semantic_digest(frozen) == digest assert not validate(scene, True)
test/test_extension_failures.py
# Deliberate input and geometry damage for extension contracts and atomicity. from dataclasses import replace import copy import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import validate, Child, Plan, Choice, Limits from hearth.blocks import state_of from hearth.components.primitives import Volume from hearth.environment import Terrain, gradient, wave from hearth.persistence import semantic_digest, export_scene, load_scene, encode from hearth_extensions import Polyline, Endpoint, Link, Boundary, IlluminateBoundary, Platform from hearth_extensions.boundaries import BoundaryChain from hearth_extensions.circulation import Trestles from test_extension_geometry import bridge_scene def snapshot(s): return (semantic_digest(s), copy.deepcopy(encode(s.nodes)), copy.deepcopy(encode(s.relations)), copy.deepcopy(encode(s.dependencies)), copy.deepcopy(encode(s.operations)), copy.deepcopy(s.reverse), copy.deepcopy(s.port_uses), copy.deepcopy(s.events)) def damage(s, p): record = s.blocks.pop(p) s.reverse[record.owner].remove(p) @pytest.mark.parametrize('kind', ['support', 'guard', 'endpoint', 'headroom']) def test_broken_bridge_geometry_is_diagnosed(kind): s = bridge_scene() if kind == 'support': p = s.nodes['/link/supports'].contract.rules[0].cells[0] damage(s, p) expected = 'support' elif kind == 'guard': p = next(iter(s.cells('/link/guards'))) damage(s, p) expected = 'bridge-guard' elif kind == 'endpoint': a = s.view.port('/a', 'south').frame.origin p = (a[0], a[1] - 1, a[2]) damage(s, p) expected = 'reachability' else: p = next(r for r in s.nodes['/link'].contract.rules if r.kind == 'clear').cells[len(s.nodes['/link'].contract.decisions['deck']) // 2] before = snapshot(s) with pytest.raises(ContractError, match='clearance'): s.place('blocked', Volume(Box(p, p), state_of('stone'))) assert snapshot(s) == before return errors = validate(s, True) assert any(d.rule == expected and d.position is not None for d in errors) @pytest.mark.parametrize('fault', ['endpoint', 'frame', 'kind']) def test_invalid_connections_rollback_every_index(fault): s = bridge_scene() s.remove('/link') a, b = Endpoint('/a', 'south'), Endpoint('/b', 'north') pa = s.view.port('/a', 'south').frame.origin pb = s.view.port('/b', 'north').frame.origin curve = Polyline(((pa[0], pa[2]), (pa[0] + 3, pa[2]), (pb[0], pb[2]))) expected = 'endpoint-frame' if fault == 'endpoint': curve = Polyline(((pa[0] + 1, pa[2]), (pb[0], pb[2]))) expected = 'endpoint-disconnected' if fault == 'kind': a = Endpoint('/land', 'construction') expected = 'endpoint-kind' before = snapshot(s) with pytest.raises(ContractError, match=expected): s.place('bad', Link(a, b, '/land', curve=curve), bindings=(a.binding(), b.binding())) assert snapshot(s) == before def test_connection_permission_overflow_is_atomic(): s = Scene(0, domain=Box((-3, -4, -3), (12, 20, 12))) s.place('land', Terrain(s.domain, gradient(base=0), water_level=5, edit_limit=1)) before = snapshot(s) columns = ((2, 0, 2, 4, True), (3, 0, 2, 4, True)) with pytest.raises(ContractError, match='edit-limit'): s.place('piers', Trestles(columns), bindings=(Binding('/land', 'construction', 'fill'),)) assert snapshot(s) == before def test_connection_remove_and_regenerate_restore_water_and_membership(): s = bridge_scene() s.remove('/link') before = snapshot(s) a, b = Endpoint('/a', 'south'), Endpoint('/b', 'north') comp = Link(a, b, '/land', rise=1) s.place('link', comp, bindings=(a.binding(), b.binding())) old = s.cells('/link', True) s.regenerate('/a', dependents=('/b', '/link'), replacements={'/link': replace(comp, covered=True, rise=0)}) new = s.cells('/link', True) assert old != new assert all(s.inspect(p)['instance'] in s.nodes for p in new) assert all(not s.inspect(p)['instance'] or not s.inspect(p)['instance'].startswith('/link') for p in old - new) s.remove('/link') assert semantic_digest(s) == before[0] assert not any('/link' in a or '/link' in c for a, b, c in s.relations) assert not any(k.startswith('/link') for k in s.nodes) def test_boundary_missing_coping_support_and_whole_removal(work): s = Scene(0, domain=Box((-5, -4, -5), (45, 24, 25))) s.place('land', Terrain(s.domain, gradient(base=3))) curve = Polyline.bezier(((0, 0), (9, 20), (26, 0), (37, 17))) s.place('boundary', BoundaryChain(curve)) s.place('lamps', IlluminateBoundary('/boundary')) before = snapshot(s) with pytest.raises(ContractError): s.remove('/boundary') assert snapshot(s) == before changed = Polyline.bezier(((0, 1), (9, 19), (26, 1), (37, 18))) s.regenerate('/boundary', BoundaryChain(changed), dependents=('/lamps',)) s.finalize() p = s.view.offers('/boundary', 'mount')[0].frame.origin assert p in s.cells('/boundary', True) export_scene(s, work / 'curve.litematic') t = load_scene(work / 'curve.litematic') assert t.inspect(p) == s.inspect(p) base = (p[0], p[1] - 1, p[2]) damage(t, base) assert any(d.rule in ('support', 'enclosure') and d.position == base for d in validate(t, True)) def test_curve_boundary_rejects_incompatible_installation_frame(): from hearth_extensions import BoundaryLantern s = Scene(0, domain=Box((-3, -4, -3), (25, 25, 25))) s.place('land', Terrain(s.domain, gradient(base=3))) s.place('wall', Boundary(Polyline(((0, 0), (20, 8))))) port = s.view.offers('/wall', 'mount')[0] before = snapshot(s) with pytest.raises(ContractError, match='port-alignment'): s.place('bad-lamp', BoundaryLantern(), frame=Frame(port.frame.origin, port.frame.turn + 1), bindings=(Binding('/wall', port.key),)) assert snapshot(s) == before def test_failed_choice_does_not_perturb_sibling_randomness(): s = bridge_scene() s.remove('/link') a, b = Endpoint('/a', 'south'), Endpoint('/b', 'north') before = snapshot(s) bad = Link(a, b, '/land', fill_limit=0) with pytest.raises(ContractError): s.compose_choice(Choice('link', (Child('attempt', bad, bindings=(a.binding(), b.binding())),), lambda v, p: 0)) assert snapshot(s) == before good = Link(a, b, '/land', rise=1) s.place('link', good, bindings=(a.binding(), b.binding())) assert semantic_digest(s) == semantic_digest(bridge_scene())
test/test_extension_interiors.py
# Functional bays must preserve their own access, room circulation, support and inventories. import pytest from hearth import Scene, Box, ContractError from hearth.environment import Terrain, gradient from hearth.kernel import validate from hearth.blocks import state_of, name_of from hearth.components.primitives import Volume from hearth.persistence import export_scene, load_scene, semantic_digest, encode from hearth_extensions import Pavilion, Polygon from hearth_extensions.interiors import FUNCTION_GROUPS from test_extension_failures import damage, snapshot def furnished_scene(purpose='library', width=13): scene = Scene(23, domain=Box((-12, -4, -12), (40, 60, 40))) scene.place('land', Terrain(scene.domain, gradient(base=3))) scene.place('hall', Pavilion(Polygon.chamfered(width, 17, 4), '/land', purpose, ('north', 'south', 'east', 'west'))) return scene.finalize() @pytest.mark.parametrize('purpose', tuple(FUNCTION_GROUPS)) def test_functional_bays_are_reachable_and_preserve_inventory(purpose, work): scene = furnished_scene(purpose) bays = [n for n in scene.nodes.values() if n.type == 'extension.work-bay'] assert len(bays) >= 2 assert not validate(scene, True) for bay in bays: port = scene.view.port(bay.path, 'use') assert scene.view.clear(port.region) assert any(scene.blocks[p].nbt for p in scene.cells(bay.path)) path = work / (purpose + '.litematic') export_scene(scene, path) restored = load_scene(path) assert encode(restored.nodes) == encode(scene.nodes) assert semantic_digest(restored) == semantic_digest(scene) def test_larger_hall_allocates_more_bays_and_protects_central_aisle(): small = furnished_scene(width=13) large = furnished_scene(width=25) small_decisions = small.nodes['/hall/furnishings'].contract.decisions large_decisions = large.nodes['/hall/furnishings'].contract.decisions assert large_decisions['placed_bays'] > small_decisions['placed_bays'] assert large_decisions['omitted_optional'] == 0 point = large.nodes['/hall/furnishings'].contract.rules[0].cells[20] before = snapshot(large) with pytest.raises(ContractError, match='clearance'): large.place('crate', Volume(Box(point, point), state_of('stone'))) assert snapshot(large) == before def test_damaged_station_furnishing_and_support_are_detected(): scene = furnished_scene('library') bay = next(n for n in scene.nodes.values() if n.type == 'extension.work-bay') lectern = next(p for p in scene.cells(bay.path) if name_of(scene.blocks[p].state) == 'lectern') damage(scene, lectern) assert any(d.rule == 'furnishing' and d.component == bay.path for d in validate(scene, True)) bed = bay.contract.rules[0].cells[0] damage(scene, bed) assert any(d.rule == 'support' and d.position == bed for d in validate(scene, True)) def test_interaction_clearance_remains_protected_after_completion(): scene = furnished_scene('bedroom') bay = next(n for n in scene.nodes.values() if n.type == 'extension.work-bay') at = scene.view.port(bay.path, 'use').frame.origin before = snapshot(scene) with pytest.raises(ContractError, match='clearance'): scene.place('block-user', Volume(Box(at, at), state_of('stone'))) assert snapshot(scene) == before
test/test_building_space.py
# Public habitable roof-space interfaces and actual circulation/enclosure validation. import pytest from hearth import Scene, Box, Frame from hearth.environment import Terrain, constant from hearth.components.interior import Room from hearth.components.roofcraft import ProfileRoof from hearth.components import Blueprint, RoomSpec from hearth.components.roofcraft import RoofDesign from hearth.lodges import lodge_scene from hearth.kernel import validate @pytest.mark.parametrize('bay', (9, 11, 13)) @pytest.mark.parametrize('axis', ('x', 'z')) def test_habitable_roof_keeps_stair_access_and_actual_room_guarantees(bay, axis): design = Blueprint((RoomSpec(0, 0, 0, 'living'),), bay=bay, roof_axis=axis, roof_design=RoofDesign((1, 2)), attic_purpose='bedroom') scene = lodge_scene(design, 4, garden=False) assert not validate(scene, True) room = scene.nodes['/building/roof-0/room'] assert room.type == 'room.loft.bedroom' assert len(room.contract.decisions['furniture']) >= 2 assert room.contract.decisions['lights'] assert any(r.kind == 'enclosed-volume' for r in room.contract.rules) def test_public_roof_and_upper_floor_interfaces(): scene = Scene(51, domain=Box((-4, -2, -4), (18, 35, 18))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('room', Room('living', stair_up=True, upper_open=True), frame=Frame((0, 1, 0)), complete=False) access = scene.view.offers('/room', 'upper-floor-access') assert access, 'An enclosing composition must discover the actual stair aperture' roof = ProfileRoof(11, 11) assert 'roof-interior' in roof.capability().offers from dataclasses import dataclass, replace from hearth import Binding, ContractError from hearth.kernel import Capability, Contract, Plan from hearth.blocks import name_of, state_of, parse from hearth.components import Building from hearth.components.lofts import InhabitedRoof, RoofPlatform, LoftLight from hearth.components.primitives import Volume from hearth.persistence import export_scene, load_scene, encode, semantic_digest from hearth.quality_assessment import audit_pair, principal_signature from test.test_building_quality import damaged, snapshot from examples.roof_home import roof_home def loft_scene(turn=0, purpose='bedroom'): frame = Frame((24, 0, -16), turn) domain = frame.box(Box((-8, -3, -18), (36, 55, 30))) scene = Scene(84, domain=domain) scene.place('land', Terrain(domain, constant(2))) design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(1, 0, 0, 'kitchen')), bay=11, roof_axis='x', roof_design=RoofDesign((1, 2)), attic_purpose=purpose, porch_bays=2, porch_depth=4) scene.place('house', Building(design, '/land'), frame=frame) return scene.finalize(), design @pytest.mark.parametrize('turn', range(4)) def test_loft_transform_provenance_and_complete_pair(turn, work): scene, design = loft_scene(turn) loft = next(n for n in scene.nodes.values() if n.type == 'room.loft.bedroom') station = next(n for n in scene.nodes.values() if n.path.startswith(loft.path) and n.type == 'furnishing.group.bedroom') point = next(p for p in scene.cells(station.path) if name_of(scene.view.state(p)) == 'red_bed') chain = scene.inspect(point)['chain'] assert [n['type'] for n in chain][:3] == ['furnishing.group.bedroom', 'room.loft.bedroom', 'roof.profile'] assert chain[-1]['id'] == '/house' assert any(a == loft.path and kind == 'supported_by' for a, kind, b in scene.inspect(point)['related']) assert any(a == loft.path and kind == 'connected_to' for a, kind, b in scene.relations) roof = next(n for n in scene.nodes.values() if n.type == 'roof.profile') offer = scene.view.offers(roof.path, 'roof-interior')[0] assert offer.frame == loft.frame lantern = next(n for n in scene.nodes.values() if n.type == 'light.roof-hanger') top = lantern.contract.decisions['top'] assert scene.view.supports(lantern.frame.point((0, top, 0))) assert all(name_of(scene.view.state(lantern.frame.point((0, y, 0)))) == 'chain' for y in range(1, top)) stair = scene.nodes['/house/room-0-0-0/stairs'] tread = stair.frame.point((0, 0, 0)) facing = parse(scene.view.state(tread))[1]['facing'] assert facing == ('south', 'west', 'north', 'east')[stair.frame.turn % 4] path = work / 'usable roof.litematic' export_scene(scene, path) audit = audit_pair(scene, path) assert audit['nodes'] == len(scene.nodes) and audit['inventories'] > 0 restored = load_scene(path) assert restored.inspect(point) == scene.inspect(point) assert restored.cells(loft.path, True) == scene.cells(loft.path, True) assert not validate(restored, True) @pytest.mark.parametrize('seed', range(8)) def test_new_lightweight_roof_program_includes_required_lofts(seed): scene = lodge_scene(roof_home(seed), seed, seed, garden=False) lofts = [n for n in scene.nodes.values() if n.type.startswith('room.loft.')] covers = [n for n in scene.nodes.values() if n.type == 'roof.inhabited'] assert lofts and len(lofts) == len(covers) assert all(n.contract.decisions['purpose'] == roof_home(seed).attic_purpose for n in lofts) assert not validate(scene, True) @pytest.mark.parametrize('damage,expected', [('wall', 'enclosure-leak'), ('support', 'support'), ('tread', 'support'), ('bed', 'bed-pair'), ('collar', 'expected-geometry'), ('guard', 'expected-geometry')]) def test_actual_loft_damage_detected(damage, expected): scene, _ = loft_scene() if damage == 'wall': part = scene.nodes['/house/roof-floor-0/knees'] q = part.frame.point((5, 1, 0)) # Remove the complete two-cell eave wall thickness, not only its inner beam. scene = damaged(scene, part.frame.point((5, 1, -1))) elif damage == 'support': part = scene.nodes['/house/roof-floor-0/floor'] q = next(r.cells[0] for r in part.contract.rules if r.kind == 'support') elif damage == 'tread': part = scene.nodes['/house/room-0-0-0/stairs'] q = next(p for p in scene.cells(part.path) if name_of(scene.view.state(p)) == 'spruce_stairs') elif damage == 'bed': q = next(p for p in scene.cells('/house/roof-0/room', True) if name_of(scene.view.state(p)) == 'red_bed') else: kind = 'timber.roof-collars' if damage == 'collar' else 'circulation.aperture-guard' part = next(n for n in scene.nodes.values() if n.type == kind) assert scene.cells(part.path) q = min(scene.cells(part.path)) diagnostics = validate(damaged(scene, q), True) assert expected in {d.rule for d in diagnostics} assert all(d.component and d.position is not None for d in diagnostics if d.rule == expected) def test_loft_light_sources_function_and_nbt_checked_from_blocks(): scene, _ = loft_scene() loft = scene.nodes['/house/roof-0/room'] unlit = scene for n in scene.nodes.values(): if n.type == 'light.roof-hanger': unlit = damaged(unlit, n.frame.origin) assert any(d.rule == 'lighting' and d.component == loft.path for d in validate(unlit, True)) unfurnished = scene for p in scene.cells(loft.path, True): if name_of(scene.view.state(p)) == 'red_bed': unfurnished = damaged(unfurnished, p) assert any(d.rule == 'furnishing' and d.component == loft.path for d in validate(unfurnished, True)) # Deliberately corrupt NBT in a fork, without weakening the public write path. corrupt = scene.fork() from copy import deepcopy q = next(p for p in scene.cells(loft.path, True) if scene.blocks[p].nbt) data = deepcopy(scene.blocks[q].nbt) data['Items'][0]['count'] = 80 corrupt.blocks[q] = replace(corrupt.blocks[q], nbt=data) assert any(d.rule == 'inventory' and d.position == q for d in validate(corrupt, True)) def test_stair_and_room_routes_reject_late_decoration_atomically(): scene, _ = loft_scene() stair = scene.nodes['/house/room-0-0-0/stairs'] point = next(p for r in stair.contract.rules if r.kind == 'clear' for p in r.cells if name_of(scene.view.state(p)) == 'air') before = snapshot(scene) with pytest.raises(ContractError, match='clearance'): scene.place('late-decoration', Volume(Box(point, point), state_of('stone'))) assert snapshot(scene) == before loft = scene.nodes['/house/roof-0/room'] landing = scene.view.port(loft.path, 'landing').frame.origin with pytest.raises(ContractError, match='clearance'): scene.place('blocked-landing', Volume(Box(landing, landing), state_of('stone'))) assert snapshot(scene) == before @dataclass(frozen=True) class RoofIntrusion: """A deliberately invalid consumer that attempts an unauthorized roof edit.""" def capability(self): return Capability('test.roof-intrusion', ('roof-room',)) def negotiate(self, ctx, parameters): port = ctx.view.port(ctx.bindings[0].host, ctx.bindings[0].port) return Contract(Box.enclosing(ctx.local(q) for q in port.region.corners())) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, state_of('stone'), 'illegal-interior') return p def test_roof_interior_has_no_replacement_authority_and_bad_frames_roll_back(): scene = Scene(13, domain=Box((-5, -3, -5), (20, 40, 20))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('room', Room('living', upper_open=False), frame=Frame((0, 1, 0))) scene.place('roof', ProfileRoof(11, 11), frame=Frame((0, 8, 0))) offer = scene.view.offers('/roof', 'roof-interior')[0] before = snapshot(scene) with pytest.raises(ContractError, match='write-authority|permission-volume|clearance'): scene.place('intrusion', RoofIntrusion(), frame=offer.frame, bindings=(Binding('/roof', offer.key),)) assert snapshot(scene) == before with pytest.raises(ContractError, match='inhabited-roof-interface'): scene.place('wrong-port', InhabitedRoof(11, 11, 'z', 'deepslate_tile'), frame=Frame((0, 7, 0), 1), bindings=(Binding('/roof', offer.key, 'connect'),)) assert snapshot(scene) == before def test_branch_regeneration_retires_lofts_and_restores_consistent_indexes(work): scene, design = loft_scene() old_nodes = {p for p in scene.nodes if '/roof-' in p} old_cells = scene.cells('/house/roof-0/room', True) replacement = Building(replace(design, attic_purpose=None), '/land') scene.regenerate('/house', replacement) assert old_cells and not scene.cells('/house/roof-0/room', True) assert not any(n.type.startswith('room.loft.') for n in scene.nodes.values()) retired = old_nodes - set(scene.nodes) assert retired and not any(c.owner in retired for c in scene.blocks.values()) assert not any(a in retired or b in retired for a, kind, b in scene.relations) assert not validate(scene, True) scene.regenerate('/house', Building(design, '/land')) fresh, _ = loft_scene() assert semantic_digest(scene) == semantic_digest(fresh) assert encode(scene.nodes) == encode(fresh.nodes) export_scene(scene, work / 'regenerated.litematic') audit_pair(scene, work / 'regenerated.litematic') @pytest.mark.parametrize('bays', (2, 3)) def test_veranda_has_intermediate_bearings_and_actual_entrance(bays): design = Blueprint(tuple(RoomSpec(x, 0, 0, 'living') for x in range(bays)), bay=11, porch_bays=bays, porch_depth=5) scene = lodge_scene(design, 20, garden=False) porch = scene.nodes['/building/porch'] columns = porch.contract.decisions['columns'] assert len(columns) >= 3 and max(b - a for a, b in zip(columns, columns[1:])) <= 12 assert scene.view.port(porch.path, 'front').frame.origin[0] == 5 q = porch.frame.point((columns[1], 2, -5)) assert 'support' in {d.rule for d in validate(damaged(scene, q), True)} before = snapshot(scene) with pytest.raises(ValueError, match='contiguous front rooms'): scene.regenerate('/building', Building(replace(design, porch_bays=bays + 1), '/land')) assert snapshot(scene) == before def test_habitable_roof_domains_are_explicit(): with pytest.raises(ValueError, match='explicit roof policy'): Blueprint((RoomSpec(0, 0, 0, 'living'),), attic_purpose='bedroom').validate() with pytest.raises(ValueError, match='Attic purpose'): Blueprint((RoomSpec(0, 0, 0, 'living'),), attic_purpose='greenhouse').validate() scene = Scene(1, domain=Box((-2, -1, -2), (5, 20, 5))) scene.place('land', Terrain(scene.domain, constant(0))) before = snapshot(scene) with pytest.raises(ContractError, match='loft-light-support'): scene.place('unsupported-lantern', LoftLight(maximum_hanger=4), frame=Frame((1, 2, 1))) assert snapshot(scene) == before def test_direct_recursive_inhabited_roof_and_policy_substitution(): @dataclass(frozen=True) class TallerRoofPolicy: def heights(self, span): return RoofDesign((2,)).heights(span) def component(self, width, depth, axis, material): return ProfileRoof(width, depth, axis, material, RoofDesign((2,))) scene = Scene(33, domain=Box((-5, -3, -6), (18, 50, 18))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('room', Room('living', stair_up=True, upper_open=True), frame=Frame((0, 1, 0)), complete=False) port = scene.view.offers('/room', 'upper-floor-access')[0] before = snapshot(scene) with pytest.raises(ContractError, match='inhabited-roof-interface'): scene.place('roof', InhabitedRoof(11, 11, 'z', 'deepslate_tile'), frame=Frame(port.frame.origin, 1), bindings=(Binding('/room', port.key, 'connect'),)) assert snapshot(scene) == before scene.place('roof', InhabitedRoof(11, 11, 'z', 'deepslate_tile'), frame=port.frame, bindings=(Binding('/room', port.key, 'connect'),)) scene.finish_scope('/room') scene.finalize() first_height = max(p[1] for p in scene.cells('/roof', True)) first_landing = scene.view.port('/roof', 'landing') scene.regenerate('/roof', InhabitedRoof(11, 11, 'z', 'deepslate_tile', TallerRoofPolicy())) assert max(p[1] for p in scene.cells('/roof', True)) > first_height assert scene.view.port('/roof', 'landing').frame == first_landing.frame assert not validate(scene, True) def test_roof_aperture_metadata_cannot_hide_an_exterior_leak(): scene, _ = loft_scene() node = scene.nodes['/house/roof-0/room'] # Corrupt companion-style contract data in a fork; the validator checks the bound. broken = scene.fork() rules = tuple(replace(r, data={'apertures': ((-1, 3, -1),)}) if r.kind == 'enclosed-volume' else r for r in node.contract.rules) broken.nodes[node.path] = replace(node, contract=replace(node.contract, rules=rules)) assert any(d.rule == 'enclosure-aperture' and d.component == node.path for d in validate(broken, True)) def test_sibling_roof_randomness_and_palette_free_principal_signature(): from hearth.components import BoundaryPlanting scene = lodge_scene(roof_home(2), 2, garden=False) other = scene.fork() other.place('border', BoundaryPlanting('/building', '/land', density=.2)) other.finalize() assert principal_signature(other) == principal_signature(scene) assert {p: c for p, c in other.blocks.items() if c.owner.startswith('/building')} == {p: c for p, c in scene.blocks.items() if c.owner.startswith('/building')} recolored = scene.fork() # Only color changes in a cloned actual scene; membership, geometry and role stay fixed. for p in scene.cells('/building', True): if name_of(scene.view.state(p)) == 'smooth_sandstone': recolored.blocks[p] = replace(scene.blocks[p], state=state_of('calcite')) assert principal_signature(recolored) == principal_signature(scene) def test_canopy_contact_uses_flush_gable_glazing_instead_of_blank_infill(): design = Blueprint((RoomSpec(0, 0, 0, 'living'),), bay=13, porch_depth=4, roof_axis='z', roof_design=RoofDesign((1, 1, 2)), attic_purpose='bedroom') scene = lodge_scene(design, 22, garden=False) window = scene.nodes['/building/roof-0/weather/cover/gable-front/window'] assert window.type == 'window.flush' glass = scene.cells(window.path) assert len(glass) == 9 and all(name_of(scene.view.state(p)) == 'glass' for p in glass) assert scene.inspect(min(glass))['chain'][1]['type'] == 'wall.profile-gable' assert not validate(scene, True)
test/test_building_detail.py
# Domestic components, facade exclusions and planted boundaries through public contracts. from dataclasses import dataclass, replace import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Plan, validate from hearth.environment import Terrain, constant, gradient, wave from hearth.components import Wall, Window, WindowBox, DomesticSuite, GardenPlant, BoundaryPlanting, Blueprint, RoomSpec, Building, FacadeDesign from hearth.components.primitives import Volume from hearth.lodges import lodge_scene, hillside_home from hearth.blocks import name_of, state_of, parse from hearth.persistence import export_scene, load_scene, encode from test.test_building_quality import snapshot, damaged @pytest.mark.parametrize('bay', (9, 11, 13)) def test_service_exclusion_retains_rear_daylight_and_locked_rooms(bay): design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')), bay=bay, chimney=True, balcony=True, facade_design=FacadeDesign(), rail_material='dark_oak') scene = lodge_scene(design, 71, garden=False) for level in (0, 1): room = f'/building/room-0-0-{level}' windows = [n for n in scene.nodes.values() if n.path.startswith(room + '/window-south') and n.type.startswith('window.')] assert len(windows) == 2 glass = {p for n in windows for p in scene.cells(n.path) if name_of(scene.view.state(p)) == 'glass'} assert len(glass) == 12 stack = scene.cells('/building/chimney') assert not glass.intersection(stack) assert scene.nodes['/building'].contract.decisions['rooms'] == [(r.x, r.z, r.level, r.purpose) for r in design.normalized()] assert not validate(scene, True) @pytest.mark.parametrize('turn', range(4)) def test_external_window_box_attachment_roundtrip_and_regeneration(turn, work): frame = Frame((15, 0, -12), turn) scene = Scene(52, domain=frame.box(Box((-4, -2, -5), (16, 20, 8)))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('wall', Wall(11), frame=frame.compose(Frame((0, 1, 0)))) scene.place('window', Window(2, 3), frame=frame.compose(Frame((2, 2, 0))), bindings=(Binding('/wall', 'infill'),)) mount = scene.view.offers('/window', 'window-garden')[0] scene.place('flowers', WindowBox(), frame=mount.frame, bindings=(Binding('/window', mount.key),)) scene.finalize() point = next(p for p in scene.cells('/flowers') if name_of(scene.view.state(p)) == 'rooted_dirt') assert [n['id'] for n in scene.inspect(point)['chain']][:3] == ['/flowers', '/window', '/wall'] assert scene.inspect(point)['instance'] == '/flowers' assert scene.cells('/flowers').isdisjoint(scene.cells('/window')) path = work / 'window garden.litematic' export_scene(scene, path) restored = load_scene(path) assert restored.inspect(point) == scene.inspect(point) assert encode(restored.nodes) == encode(scene.nodes) original = scene.cells('/flowers') scene.remove('/flowers') assert '/flowers' not in scene.nodes and '/flowers' not in scene.reverse assert all(scene.inspect(q).get('instance') != '/flowers' for q in original) scene.place('flowers', WindowBox(('allium',)), frame=mount.frame, bindings=(Binding('/window', mount.key),)) assert scene.cells('/flowers') == original assert not validate(scene.finalize(), True) def test_window_box_missing_anchor_bad_frame_and_overflow_are_rejected(): scene = Scene(2, domain=Box((-4, -2, -5), (15, 20, 8))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('wall', Wall(11), frame=Frame((0, 1, 0))) scene.place('window', Window(2, 3), frame=Frame((2, 2, 0)), bindings=(Binding('/wall', 'infill'),)) port = scene.view.port('/window', 'garden') before = snapshot(scene) with pytest.raises(ContractError, match='window-box-interface'): scene.place('misaligned', WindowBox(), frame=Frame(port.frame.origin, 1), bindings=(Binding('/window', 'garden'),)) assert snapshot(scene) == before @dataclass(frozen=True) class Overflow: def capability(self): return Capability('test.planter-overflow', ('planter',)) def negotiate(self, ctx, parameters): return Contract(Box((0, 0, 0), (2, 1, 1))) def realize(self, ctx, contract): p = Plan() p.fill(contract.envelope, state_of('dirt')) return p with pytest.raises(ContractError, match='write-authority|permission'): scene.place('overflow', Overflow(), frame=port.frame, bindings=(Binding('/window', 'garden'),)) assert snapshot(scene) == before scene.place('flowers', WindowBox(), frame=port.frame, bindings=(Binding('/window', 'garden'),)) scene.finalize() soil = next(p for p in scene.cells('/flowers') if name_of(scene.view.state(p)) == 'rooted_dirt') assert any(d.rule == 'support' and d.component == '/flowers' for d in validate(damaged(scene, soil), True)) @pytest.mark.parametrize('purpose', ('gathering', 'study', 'cooking', 'craft', 'cabinet')) @pytest.mark.parametrize('width', (2, 3)) def test_domestic_station_function_apron_support_and_nbt(purpose, width, work): scene = Scene(6, domain=Box((-2, -2, -2), (8, 12, 8))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('station', DomesticSuite(purpose, width), frame=Frame((1, 1, 1))) scene.finalize() port = scene.view.offers('/station', 'interaction')[0] before = snapshot(scene) with pytest.raises(ContractError, match='clearance'): scene.place('obstruction', Volume(port.region, state_of('stone'))) assert snapshot(scene) == before support = (1, 0, 1) assert 'support' in {d.rule for d in validate(damaged(scene, support), True)} required = next(r for r in scene.nodes['/station'].contract.rules if r.kind == 'furnishing').data['groups'][0] broken = scene for p in scene.cells('/station'): if name_of(scene.view.state(p)) in required: broken = damaged(broken, p) assert 'furnishing' in {d.rule for d in validate(broken, True)} path = work / 'station.litematic' export_scene(scene, path) restored = load_scene(path) assert {p: c.nbt for p, c in restored.blocks.items() if c.nbt} == {p: c.nbt for p, c in scene.blocks.items() if c.nbt} def test_whole_tall_garden_plant_and_missing_substrate(): scene = Scene(5, domain=Box((-2, -2, -2), (8, 12, 8))) scene.place('land', Terrain(scene.domain, constant(0))) scene.place('rose', GardenPlant('rose_bush'), frame=Frame((2, 1, 2)), bindings=(Binding('/land', 'planting', 'plant'),)) scene.finalize() assert len(scene.cells('/rose')) == 2 assert 'plant-pair' in {d.rule for d in validate(damaged(scene, (2, 2, 2)), True)} assert 'support' in {d.rule for d in validate(damaged(scene, (2, 0, 2)), True)} before = snapshot(scene) with pytest.raises(ContractError): scene.place('unsupported', GardenPlant(), frame=Frame((4, 3, 4)), bindings=(Binding('/land', 'planting', 'plant'),)) assert snapshot(scene) == before def test_border_uses_public_transformed_boundary_and_preserves_scene(): design = replace(hillside_home(0), bay=11) scene = lodge_scene(design, 19, field=gradient(.06, -.02, 2) + wave(.35, .2, .1, 1), garden=False) before = dict(scene.blocks) scene.place('border', BoundaryPlanting('/building', '/land', density=1)) scene.finalize() assert scene.cells('/border', True) assert all(scene.blocks[p] == cell for p, cell in before.items()) assert scene.view.offers('/building', 'footprint-boundary') assert ('/border', 'landscapes', '/building') in scene.relations assert all(name_of(scene.view.state((p[0], p[1] - 1, p[2]))) != 'water' for n in scene.nodes.values() if n.type.startswith('plant.garden') for p in (n.frame.origin,)) def test_contrasting_balcony_guards_are_actual_and_damage_checked(): scene = lodge_scene(hillside_home(0), 0, garden=False) guards = [r for r in scene.nodes['/building/porch'].contract.rules if r.kind == 'expected'][0] assert len(guards.cells) > 10 assert all(name_of(scene.view.state(p)) == 'dark_oak_fence' for p in guards.cells) assert 'expected-geometry' in {d.rule for d in validate(damaged(scene, guards.cells[0]), True)} @pytest.mark.parametrize('turn', range(4)) def test_ceiling_members_preserve_actual_stair_headroom_and_rotate(turn): from hearth.components import CeilingTimbers frame = Frame((20, 0, -15), turn) domain = frame.box(Box((-8, -3, -18), (35, 64, 35))) scene = Scene(13, domain=domain) scene.place('land', Terrain(domain, constant(2))) design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')), chimney=True, facade_design=FacadeDesign()) scene.place('house', Building(design, '/land'), frame=frame) scene.finalize() beams = [n for n in scene.nodes.values() if n.type == 'interior.ceiling-timbers'] assert len(beams) == 2 and all(scene.cells(n.path) for n in beams) stairs = scene.nodes['/house/room-0-0-0/stairs'] clear = {p for r in stairs.contract.rules if r.kind == 'clear' for p in r.cells} assert not clear.intersection(set().union(*(scene.cells(n.path) for n in beams))) point = min(scene.cells(beams[0].path)) assert [n['id'] for n in scene.inspect(point)['chain']][1] == '/house/room-0-0-0' assert 'expected-geometry' in {d.rule for d in validate(damaged(scene, point), True)} anchor = next(r.cells[0] for r in beams[0].contract.rules if r.kind == 'support') assert 'support' in {d.rule for d in validate(damaged(scene, anchor), True)} before = snapshot(scene) mount = scene.view.port('/house/room-0-0-0', 'ceiling') with pytest.raises(ContractError, match='ceiling-interface'): scene.place('bad-mount', CeilingTimbers(), frame=Frame(mount.frame.origin, (turn + 1) % 4), bindings=(Binding('/house/room-0-0-0', 'ceiling', 'connect'),)) assert snapshot(scene) == before def test_optional_planting_does_not_change_unrelated_building_branch(): a = lodge_scene(hillside_home(0), 8, garden=False) b = a.fork() # The border has no ground-edit authority. GardenCourt as a whole intentionally # replaces the building's street endpoint when it joins its path to the approach. b.place('border', BoundaryPlanting('/building', '/land')) b.finalize() cells = a.cells('/building', True) assert cells == b.cells('/building', True) keys = ('state', 'instance', 'chain', 'operation', 'nbt', 'shared') assert {p: {k: a.inspect(p)[k] for k in keys} for p in cells} == {p: {k: b.inspect(p)[k] for k in keys} for p in cells} # A new typed "landscapes" association is expected; principal structure is stable. assert encode({k: n for k, n in a.nodes.items() if k.startswith('/building')}) == encode({k: n for k, n in b.nodes.items() if k.startswith('/building')}) def test_boundary_and_facade_degenerate_domains_are_explicit(): with pytest.raises(ValueError, match='Facade'): FacadeDesign(height=3, sill=2).openings(11) assert not FacadeDesign().openings(11, exclusions=(Box((0, 0, -1), (10, 4, 0)),)) scene = lodge_scene(hillside_home(0), 12, garden=False) old = dict(scene.blocks) scene.place('empty-border', BoundaryPlanting('/building', '/land', density=0)) assert scene.blocks == old and not scene.cells('/empty-border', True) before = snapshot(scene) with pytest.raises(ContractError, match='input-domain'): scene.place('invalid-density', BoundaryPlanting('/building', '/land', density=1.1)) assert snapshot(scene) == before @pytest.mark.parametrize('width,height,sill', ((1, 2, 1), (1, 3, 1), (2, 2, 2))) def test_public_facade_dimensions_and_framed_boxes(width, height, sill): design = Blueprint((RoomSpec(0, 0, 0, 'library'),), bay=13, porch=False, facade_design=FacadeDesign(height=height, sill=sill, width=width)) scene = lodge_scene(design, 31, garden=False) boxes = [n for n in scene.nodes.values() if n.type == 'garden.window-box'] assert boxes and all(n.contract.decisions['framed'] for n in boxes) assert scene.nodes['/building/room-0-0-0'].contract.decisions['facade_projection'] == 2 front = next(p for p in scene.cells(boxes[0].path) if name_of(scene.view.state(p)) == 'spruce_trapdoor') assert 'expected-geometry' in {d.rule for d in validate(damaged(scene, front), True)} for n in scene.nodes.values(): if n.type == 'window.shuttered': assert sum(name_of(scene.view.state(p)) == 'glass' for p in scene.cells(n.path)) == width * height
test/test_building_quality.py
# Building-craft contracts, actual damage, transforms, rollback and structural reload evidence. from dataclasses import dataclass, replace import copy import json import pytest from hearth import Scene, Box, Frame, Binding, ContractError from hearth.kernel import Capability, Contract, Plan, validate from hearth.kernel.scene import Cell from hearth.environment import Terrain, constant from hearth.components.building import Building, Blueprint, RoomSpec from hearth.components.roofcraft import RoofDesign, Dormer, ProfileRoof from hearth.components.primitives import Volume from hearth.lodges import hillside_home, gabled_hall, high_house, lodge_scene from hearth.persistence import export_scene, load_scene, semantic_digest, encode from hearth.quality_assessment import principal_signature from hearth.blocks import state_of, name_of, parse def make_house(bay=11, rise=(1, 2), turn=0, porch_depth=4): frame = Frame((30, 0, -20), turn) domain = frame.box(Box((-8, -4, -18), (30, 64, 28))) s = Scene(17, domain=domain) s.place('land', Terrain(domain, constant(3))) design = Blueprint((RoomSpec(0, 0, 0, 'living'), RoomSpec(0, 0, 1, 'bedroom')), bay=bay, balcony=True, porch_depth=porch_depth, roof_design=RoofDesign(rise), chimney=True) s.place('house', Building(design, '/land'), frame=frame) return s.finalize(), design def damaged(scene, p, material=None): candidate = scene.fork() old = candidate.blocks.get(p) if old: candidate.reverse[old.owner].remove(p) del candidate.blocks[p] if material: candidate.blocks[p] = Cell(material, old.owner, old.operation, old.nbt) candidate.reverse[old.owner].add(p) return candidate def snapshot(scene): return semantic_digest(scene), copy.deepcopy(encode(scene.nodes)), copy.deepcopy(encode(scene.dependencies)), copy.deepcopy(encode(scene.relations)), copy.deepcopy(scene.reverse), copy.deepcopy(scene.port_uses), copy.deepcopy(encode(scene.operations)) @pytest.mark.parametrize('bay,rise,depth', [(9, (1,), 3), (11, (1, 2), 4), (13, (2,), 5)]) def test_profile_porch_and_bay_boundaries(bay, rise, depth): s, design = make_house(bay, rise, porch_depth=depth) assert not validate(s, True) assert s.view.contract('/house').decisions['rooms'] == [(r.x, r.z, r.level, r.purpose) for r in design.normalized()] assert any(n.type == 'roof.dormer' for n in s.nodes.values()) assert s.view.contract('/house/porch').decisions['balcony'] assert s.cells('/house/porch') @pytest.mark.parametrize('turn', range(4)) def test_rotated_dormer_ownership_and_complete_pair(turn, work): s, _ = make_house(turn=turn) for point in s.cells('/house/porch'): if name_of(s.blocks[point].state) != 'spruce_fence': continue _, properties = parse(s.blocks[point].state) for side, delta in {'north': (0, 0, -1), 'south': (0, 0, 1), 'east': (1, 0, 0), 'west': (-1, 0, 0)}.items(): neighbor = tuple(point[i] + delta[i] for i in range(3)) if properties[side] == 'true': assert s.view.state(neighbor) != 'minecraft:air' if name_of(s.view.state(neighbor)) == 'spruce_fence': assert properties[side] == 'true' windows = [n for n in s.nodes.values() if n.type == 'window.flush' and '/dormer-' in n.path] assert len(windows) >= 2 a, b = [min(s.cells(n.path)) for n in windows[:2]] assert s.inspect(a)['state'] == s.inspect(b)['state'] assert s.inspect(a)['instance'] != s.inspect(b)['instance'] query = s.inspect(a) assert [n['type'] for n in query['chain']][:4] == ['window.flush', 'wall.dormer-face', 'roof.dormer', 'roof.weather-cover'] assert query['chain'][-1]['id'] == '/house' assert any(kind == 'attached_to' for _, kind, _ in query['related']) path = work / 'crafted roof and balcony.litematic' export_scene(s, path) restored = load_scene(path) assert restored.inspect(a) == query assert encode(restored.nodes) == encode(s.nodes) assert restored.cells('/house', True) == s.cells('/house', True) assert {p: c.nbt for p, c in restored.blocks.items() if c.nbt} == {p: c.nbt for p, c in s.blocks.items() if c.nbt} def test_actual_roof_glass_guard_support_and_lighting_damage(): s, _ = make_house() roof = next(n for n in s.nodes.values() if n.type == 'roof.weather-cover') # A plain interior course outside the dormers, above every other solid cell. p = roof.frame.point((5, roof.contract.decisions['levels'][6], 1)) # The ridge above this column is also removed: no projected cap may remain. t = s for y in range(p[1], roof.contract.envelope.hi[1] + 1): t = damaged(t, (p[0], y, p[2])) assert 'roof-cover' in {d.rule for d in validate(t, True)} glass = next(min(s.cells(n.path)) for n in s.nodes.values() if n.type == 'window.flush') assert 'enclosure' in {d.rule for d in validate(damaged(s, glass), True)} porch = s.nodes['/house/porch'] railing = next(r.cells[0] for r in porch.contract.rules if r.kind == 'expected') assert 'expected-geometry' in {d.rule for d in validate(damaged(s, railing), True)} chimney = s.nodes['/house/chimney'] p = chimney.frame.point((0, 2, 0)) assert 'support' in {d.rule for d in validate(damaged(s, p), True)} room = '/house/room-0-0-0' t = s for p in s.cells(room, True): if name_of(s.blocks[p].state) == 'lantern': t = damaged(t, p) assert 'lighting' in {d.rule for d in validate(t, True)} def test_balcony_door_and_furniture_access_remain_usable(): s, _ = make_house() door = '/house/room-0-0-1/door-north' p = min(s.cells(door)) broken = damaged(s, p, state_of('stone')) assert {'door-pair', 'reachability'} <= {d.rule for d in validate(broken, True)} node = next(n for n in s.nodes.values() if n.type.startswith('furnishing.group.')) port = s.view.port(node.path, 'use') with pytest.raises(ContractError, match='clearance|reachability'): s.place('blocked-use', Volume(port.region, state_of('stone'))) assert '/blocked-use' not in s.nodes def test_misaligned_dormer_and_permission_overflow_rollback(): from hearth.components.roofcraft import RoofCover s = Scene(3, domain=Box((-3, -3, -3), (16, 30, 16))) s.place('land', Terrain(s.domain, constant(3))) s.place('cover', RoofCover(11, 11, 'deepslate_tile', RoofDesign(), populate=False), frame=Frame((0, 4, 0))) roof = s.nodes['/cover'] port = s.view.offers('/cover', 'roof-installation')[0] before = snapshot(s) with pytest.raises(ContractError, match='dormer-interface'): s.place('bad-frame', Dormer(), frame=Frame(port.frame.origin, (port.frame.turn + 1) % 4), bindings=(Binding(roof.path, port.key),)) assert snapshot(s) == before @dataclass class Spill: def capability(self): return Capability('probe.spill', ('dormer',)) def negotiate(self, c, params): return Contract(Box.enclosing(port.frame.inverse(q) for q in roof.contract.envelope.corners())) def realize(self, c, contract): plan = Plan() plan.block(port.frame.inverse(roof.frame.point((5, roof.contract.decisions['levels'][6], 1))), state_of('air')) return plan with pytest.raises(ContractError, match='write-authority'): s.place('overflow', Spill(), frame=port.frame, bindings=(Binding(roof.path, port.key),)) assert snapshot(s) == before # A separate facade program can discover a mount and install without private geometry. s.place('external-dormer', Dormer(), frame=port.frame, bindings=(Binding('/cover', port.key),)) s.finalize() window = '/external-dormer/face/window' point = min(s.cells(window)) chain = [n['id'] for n in s.inspect(point)['chain']] assert chain == [window, '/external-dormer/face', '/external-dormer', '/cover'] assert s.cells(window) <= s.cells('/cover', descendants=True) def test_regeneration_removes_old_dormer_cells_and_structure(): s, design = make_house() old = {p for p in s.nodes if '/dormer-' in p} assert old replacement = replace(design, roof_design=RoofDesign((1, 2), 0)) s.regenerate('/house', Building(replacement, '/land')) s.finalize() assert not old.intersection(s.nodes) assert all(c.owner not in old for c in s.blocks.values()) assert all(not {a, c}.intersection(old) for a, _, c in s.relations) assert all(p in s.blocks and s.blocks[p].owner == owner for owner, cells in s.reverse.items() for p in cells) def test_roof_policy_substitution_without_parent_change(): s, design = make_house() from hearth.components.roofs import Roof @dataclass(frozen=True) class IndependentPolicy: def heights(self, span): return (0, (span + 1) // 2) def component(self, width, depth, axis, material): return Roof(width, depth, axis, material) s.regenerate('/house', Building(replace(design, roof_design=IndependentPolicy()), '/land')) s.finalize() assert any(n.type == 'roof.gable' for n in s.nodes.values()) assert not any(n.type == 'roof.profile' for n in s.nodes.values()) assert s.nodes['/house'].contract.decisions['rooms'] == [(r.x, r.z, r.level, r.purpose) for r in design.normalized()] @pytest.mark.parametrize('client', (hillside_home, gabled_hall, high_house)) @pytest.mark.parametrize('seed', (0, 6)) def test_complete_new_compositions(client, seed): s = lodge_scene(client(seed), seed, seed) assert s.completed and not validate(s, True) assert len([n for n in s.nodes.values() if n.type == 'roof.dormer']) >= 1 assert len([n for n in s.nodes.values() if n.type == 'plant.conifer']) >= 3 def test_deterministic_architecture_and_unrelated_branch(): a, _ = make_house() b, _ = make_house() assert semantic_digest(a) == semantic_digest(b) signature = principal_signature(a) # A read-only addition outside the building changes neither blocks nor architectural decisions. a.place('marker', Volume(Box((50, 20, 4), (50, 20, 4)), state_of('stone'))) assert principal_signature(a) == signature assert a.cells('/house', True) == b.cells('/house', True) def test_heavy_shaft_on_piers_has_continuous_bounded_bearing(): from hearth.assessment import adaptation_expression field, water = adaptation_expression(0) s = lodge_scene(hillside_home(0), 0, 0, field, water, garden=False) course = s.nodes['/building/chimney-bearing'] assert course.contract.decisions['fill'] > 0 assert course.contract.decisions['span'] == 2 assert all(s.view.supports(p) for p in course.contract.rules[0].cells) p = course.contract.rules[0].cells[-1] assert 'support' in {d.rule for d in validate(damaged(s, p), True)} def test_bearing_rejects_missing_support_and_rolls_back(): from hearth.adapters.bearing import BearingCourse s = Scene() before = snapshot(s) with pytest.raises(ContractError, match='bearing-span'): s.place('floating', BearingCourse(3, 2)) assert snapshot(s) == before