BIM-Edit/BIM-Edit-Tasks
BIM-Edit Tasks 324 natural-language building model editing tasks over IFC (Industry Foundation Classes) models. Each task pairs an input IFC file with a ground-truth IFC file and a natural-language instruction describing the edit that turns one into the other. The benchmark measures whether an agent can translate a spoken-language design instruction into a correct geometric and semantic change to a building model. Composition The 324 tasks are fully balanced… See the full description on the dataset page: https://huggingface.co/datasets/BIM-Edit/BIM-Edit-Tasks.
BIM-Edit Tasks
324 natural-language building model editing tasks over IFC (Industry Foundation Classes) models. Each task pairs an input IFC file with a ground-truth IFC file and a natural-language instruction describing the edit that turns one into the other. The benchmark measures whether an agent can translate a spoken-language design instruction into a correct geometric and semantic change to a building model.
Composition
The 324 tasks are fully balanced across three axes.
Element types covered:
The tasks draw on 88 distinct input models and 98 distinct ground-truth models.
Categories
- direct: the instruction states the edit explicitly, including coordinates, dimensions and the identifiers of the elements to connect to. No inference about the surrounding model is needed beyond locating the named entities.
- spatial: the target is described relative to other geometry ("0.9m away in -y direction from the stairway"). The agent must first locate the reference element and then derive the placement.
- topological: the instruction is phrased in terms of relationships (containment, bounding, connectivity, openings) rather than coordinates.
Scenes
- realistic (
data/realistic): models derived from real building projects, with the geometric irregularity, redundant entities and inconsistent property sets that come with them. - artificial (
data/artificial): synthetic models built to isolate a single edit, with clean and predictable structure.
Fields
Each line of tasks.jsonl is one task object.
target
entity_type is the IFC class of the element being edited and is used to filter candidate matches during scoring. guids lists the GlobalIds of the affected elements in the ground-truth model. It is populated for all 108 update and all 108 delete tasks and is empty for the 108 create tasks, where the created element does not exist in the input model and is instead recovered from the delta between input_ifc and ground_truth_ifc.
anchored vs no_anchor
216 tasks are anchored: the prompt refers to at least one existing element that fixes the edit in place. 108 are no_anchor, giving absolute coordinates instead. This tag separates tasks that test model comprehension from those that test instruction following alone.
task_id format
<ELEMENT>-<OPERATION>-<CATEGORY>-<SCENE>-<INDEX>, for example WAL-CRE-DIR-R-001.
Example
{
"task_id": "WAL-CRE-DIR-R-001",
"operation": "create",
"category": "direct",
"input_ifc": "data/realistic/0e29802b440f-input-create_wall.ifc",
"ground_truth_ifc": "data/realistic/0e29802b440f.ifc",
"prompt": "Create a wall with a length of 2.62m from (x1,y1,z1) = (7.180, 14.140, 3.000) to (x2,y2,z2) = (9.800, 14.140, 3.000) with a thickness of 0.240m in -y direction and a height of 3m. Make sure that the wall is added to the building storey with id 1jPCssxb5C1RSM_YHIx$zl, connected to walls 30a7nM35T5pgZzaItbPb1u and 153QDldl9AdhGy6O1dePed, and bounds the spaces 19QUlaWcT26g1KZHffEeW9 and 19QUlaWcT26g1KZHffEeWz.",
"target": {"entity_type": "IfcWall", "guids": []},
"evaluation": {},
"tags": ["create", "IfcWall", "scene:R", "direct", "no_anchor"]
}Loading
from datasets import load_dataset
ds = load_dataset("BIM-Edit/BIM-Edit-Tasks", split="train")
print(len(ds)) # 324
print(ds[0]["prompt"])
walls = ds.filter(lambda r: r["target"]["entity_type"] == "IfcWall")
topological = ds.filter(lambda r: r["category"] == "topological")Or read it directly, since it is a single JSONL file:
import json
with open("tasks.jsonl", encoding="utf-8") as f:
tasks = [json.loads(line) for line in f]