Coverage¶
How much of a real IFC model goifc tessellates, and how loose
its bounds are against IfcOpenShell. Measured against the public
corpus only (parity.Public).
Generated by make parity-report — do not edit by hand.
The OBB rate is the number with real signal: it is the share of
elements that produced geometry but fell back to a bounding box
instead of a tessellated shape. The looseness columns compare
goifc's world AABB to IfcOpenShell's world AABB — not to the true
solid, which the oracle does not store. Those two boxes are
near-identical for any element both engines tessellate. For one
that fell back to goifc's own OBB path, the box is built from the
IfcCartesianPoint coordinates reachable from the element's
representation, so it coincides with the true solid's world AABB
only where those points reach the solid's extremes. Where they do
not — a revolved or otherwise curved sweep has extremes that no
point in the file names — the fallback box can come out either
looser than the true solid (a pitched roof's OBB can hold twice
its volume) or, the failure that actually hurts a consumer,
tighter than it. Gate 1 is precisely what catches the tighter
case — and an under-reporting bound wherever else one arises.
All 2 of the shortfalls recorded below are Gate 1 firing on a
different cause, not on a fallback box: those elements
tessellate through the extrusion path, and
parity/knownviolations.go attributes their shortfall to how
goifc bounds a stepped solid along that path.
(IfcOpenShell has no OBB fallback of its own — its oracle boxes
come from an exact-solid tessellation.) So a ratio of 1.00 here is
nearly blind to fallback quality by construction — read it as
"box vs. box", not as "goifc matches IfcOpenShell".
Ratios are printed to four decimal places so "exactly 1" and
"very close to 1" are distinguishable.
Collapsed is elements excluded from the ratio columns because
goifc's own box has zero volume — flat, inverted, or empty. Their
ratio would be exactly 0, a well-formed number for the worst
possible outcome, which would drag p50 and p90 toward 1.0 and read
as an improvement. Gate 1 fails on them; this column is here so
the page cannot quietly disagree with the gate.
| Model | Elements | Extrude | Brep | OBB | Empty | OBB rate | Collapsed | AABB ratio p50 | p90 | max |
|---|---|---|---|---|---|---|---|---|---|---|
ifcopenhouse |
40 | 34 | 0 | 0 | 6 | 0.0% | 0 | 1.0000 | 1.0000 | 1.0000 |
duplex_a |
218 | 146 | 0 | 69 | 3 | 32.1% | 0 | 1.0000 | 1.0000 | 1.1156 |
fzk_haus |
85 | 16 | 64 | 2 | 3 | 2.4% | 0 | 1.0000 | 1.0000 | 1.0334 |
What falls back, and how often¶
Representation-item types that have no tessellation path at all. Closing the top of this list buys the most accuracy.
Counts are OCCURRENCES, not distinct entities: an IfcMappedItem
is resolved to the items it maps, and each resolution is counted
again — once per element that reaches it. A family placed many
times via one IfcRepresentationMap costs accuracy every time it
is placed, so it must rank every time, not once. This means a
type's count can legitimately exceed the number of entities of
that type in the file. Keys are the upper-case STEP keyword as parsed
(IFCFACEBASEDSURFACEMODEL, not IfcFaceBasedSurfaceModel);
nothing here changes that casing.
Occurrences here and the OBB column above are different quantities, and neither converts into the other. This table counts representation ITEMS, once per element that reaches one; the OBB column counts ELEMENTS. Two different units: where a model's two figures land close together that is coincidence, not agreement. Do not subtract them.
This list is also not exhaustive of what falls back. It names
only types that tessellateItemDepth has no case for at all,
looking through the two wrappers that would otherwise hide one —
an IfcMappedItem is resolved to the items it maps, and a boolean
to its operands. An element becomes a box just as readily when a
dispatched path IS attempted and declines partway: an extrusion
whose profile cannot be built, a brep whose shell cannot be
closed. None of that class appears here. Nor do presentation entities
(IfcStyledItem and the like), which this diagnostic excludes as
appearance rather than shape so a colour assignment cannot outrank
a missing solid — they still reach the same fallback, so if one
ever does yield a box this list will not name it either. So a
type's absence from this table is not evidence that it never
falls back, and the counts below are a lower bound on the causes.
In this corpus, every model that has a fallback element also reports at least one unhandled item type below.
| Item type | Occurrences |
|---|---|
IFCFACEBASEDSURFACEMODEL |
65 |
IFCPOLYGONALBOUNDEDHALFSPACE |
11 |
Known Gate 1 violations¶
Gate 1 asserts that goifc's AABB contains IfcOpenShell's oracle box
for every element the oracle and goifc's scene both know. A bound
that under-reports is always a bug, never a legitimate fallback —
an OBB fallback box is allowed to be larger than the solid it
stands for, never smaller.
The violations below are real, currently open goifc geometry gaps,
tracked in parity/knownviolations.go's knownViolations allowlist
so CI stays green on this known state while still failing on any
new or worsened violation.
Across the public corpus the gate compares 331 elements, of which 329 are contained.
Against ifcopenhouse, the gate compares 34 elements, and all 34 are contained.
Against duplex_a, the gate compares 215 elements. 213 are contained; 2 are
not:
| GlobalID | Axis | Shortfall | What it is |
|---|---|---|---|
1oKjKg9PD3fP1iIwXLh3lK |
min-y | 0.009927508 m | IfcStairFlight, Revit instance 151086 of "Stair:Residential - 200mm Max Riser 250mm Tread" (16 risers / 15 treads) |
3KMJUyUe9DfQ2FOCd5ZoiN |
max-y | 0.009927222 m | IfcStairFlight, Revit instance 198878 of "Stair:Residential - 200mm Max Riser 250mm Tread" (16 risers / 15 treads) |
Against fzk_haus, the gate compares 82 elements, and all 82 are contained.