@bldrs-ai/conway 1.569.1545 → 1.570.1544
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiled/examples/browser-bundled.cjs +1 -1
- package/compiled/examples/cli-bundled.cjs +12 -129
- package/compiled/examples/cli-step-bundled.cjs +1 -1
- package/compiled/examples/validator-bundled.cjs +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +0 -53
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +11 -102
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts +3 -97
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_geometry_extraction.js +11 -171
- package/compiled/src/version/version.js +1 -1
- package/compiled/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/compiled/src/compat/web-ifc/geometry_progress_accounting.test.d.ts +0 -2
- package/compiled/src/compat/web-ifc/geometry_progress_accounting.test.d.ts.map +0 -1
- package/compiled/src/compat/web-ifc/geometry_progress_accounting.test.js +0 -503
|
@@ -30,7 +30,7 @@ var import_node_process = require("node:process");
|
|
|
30
30
|
var readline = __toESM(require("node:readline"), 1);
|
|
31
31
|
|
|
32
32
|
// compiled/src/version/version.js
|
|
33
|
-
var versionString = "Conway v1.
|
|
33
|
+
var versionString = "Conway v1.570.1544";
|
|
34
34
|
|
|
35
35
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
36
36
|
var wasmType = "";
|
|
@@ -14965,7 +14965,7 @@ ${t5.join("\n")}` : "";
|
|
|
14965
14965
|
var import_process = require("process");
|
|
14966
14966
|
|
|
14967
14967
|
// compiled/src/version/version.js
|
|
14968
|
-
var versionString = "Conway v1.
|
|
14968
|
+
var versionString = "Conway v1.570.1544";
|
|
14969
14969
|
|
|
14970
14970
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
14971
14971
|
function pThreadsAllowed() {
|
|
@@ -93622,50 +93622,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93622
93622
|
this.aggregateTargetLocalIDs_ = targets;
|
|
93623
93623
|
return targets;
|
|
93624
93624
|
}
|
|
93625
|
-
/**
|
|
93626
|
-
* The per-relationship product counts the PAGED walk collected, handed
|
|
93627
|
-
* over and dropped in one call.
|
|
93628
|
-
*
|
|
93629
|
-
* Counts are how many products the aggregates pass will extract for a
|
|
93630
|
-
* relationship — the size of the unit of work
|
|
93631
|
-
* {@link extractRelAggregateGeometryIncremental} steps through — which the
|
|
93632
|
-
* demand pump needs to report progress in products rather than in
|
|
93633
|
-
* relationships (conway#565: SKYLARK250 puts ~1,960 products under one
|
|
93634
|
-
* relationship, so a relationship-counted bar sat at 1/2 for the whole
|
|
93635
|
-
* load).
|
|
93636
|
-
*
|
|
93637
|
-
* **Collected only on the windowed walk, and only because that is the one
|
|
93638
|
-
* place it is free.** {@link ensureAggregateTargetLocalIDs} already pages
|
|
93639
|
-
* and scans every `IfcRelAggregates` record, so the count is the number it
|
|
93640
|
-
* was discarding. A resident model has no such moment worth capturing —
|
|
93641
|
-
* it can read the same records at adopt time for nothing — so the sync
|
|
93642
|
-
* walk collects nothing at all and the whole-model extraction, which
|
|
93643
|
-
* shares that walk, retains nothing.
|
|
93644
|
-
*
|
|
93645
|
-
* **Handed over rather than cached** (conway#569 review). The prefix the
|
|
93646
|
-
* pump builds from these is itself the durable structure; keeping a second
|
|
93647
|
-
* copy for the model's life is retention with no reader. Measured on an
|
|
93648
|
-
* adverse model — 50,000 relationships over 100,000 products, the shape
|
|
93649
|
-
* where relationship count approaches product count — the map holds
|
|
93650
|
-
* 1.75 MB at 36.7 bytes per relationship. Not fatal beside the 16.4 MB
|
|
93651
|
-
* the target Set from the same walk retains, but it is avoidable, and
|
|
93652
|
-
* `setGeometryShard` refuses to run once a worklist exists so the prefix
|
|
93653
|
-
* is built exactly once and there is nothing to hand it to twice.
|
|
93654
|
-
*
|
|
93655
|
-
* **The same number the resident pump derives for itself**, from the same
|
|
93656
|
-
* call: {@link aggregateRelatedProductCount}. Approximate in one
|
|
93657
|
-
* direction only — a `RelatedObjects` list that needs the generated
|
|
93658
|
-
* getter counts 0 — and the pump's own drain condition, not this number,
|
|
93659
|
-
* decides when the pass is finished.
|
|
93660
|
-
*
|
|
93661
|
-
* @return {Map<number, number> | undefined} Counts keyed by relationship
|
|
93662
|
-
* localID, or undefined where no paged walk ran. The caller owns it.
|
|
93663
|
-
*/
|
|
93664
|
-
takeAggregateRelatedProductCounts() {
|
|
93665
|
-
const counts = this.pagedAggregateProductCounts_;
|
|
93666
|
-
this.pagedAggregateProductCounts_ = void 0;
|
|
93667
|
-
return counts;
|
|
93668
|
-
}
|
|
93669
93625
|
/**
|
|
93670
93626
|
* Windowed twin of {@link aggregateTargetLocalIDs}: page each
|
|
93671
93627
|
* relationship record before scanning it, so the set is COMPLETE rather
|
|
@@ -93702,7 +93658,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93702
93658
|
return this.aggregateTargetLocalIDs_;
|
|
93703
93659
|
}
|
|
93704
93660
|
const targets = /* @__PURE__ */ new Set();
|
|
93705
|
-
const counts = /* @__PURE__ */ new Map();
|
|
93706
93661
|
const wave = Math.max(1, Math.floor(waveSize));
|
|
93707
93662
|
let pending = [];
|
|
93708
93663
|
const drain = async () => {
|
|
@@ -93715,7 +93670,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93715
93670
|
await Promise.all([...pinned].map((localID) => this.model.ensureResidentByLocalID(localID)));
|
|
93716
93671
|
for (const relAggregate of pending) {
|
|
93717
93672
|
this.addAggregateTargets_(relAggregate, targets, true);
|
|
93718
|
-
counts.set(relAggregate.localID, this.aggregateRelatedProductCount(relAggregate));
|
|
93719
93673
|
}
|
|
93720
93674
|
} finally {
|
|
93721
93675
|
this.model.releaseSourceViews(pinned);
|
|
@@ -93733,7 +93687,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93733
93687
|
await drain();
|
|
93734
93688
|
}
|
|
93735
93689
|
this.aggregateTargetLocalIDs_ = targets;
|
|
93736
|
-
this.pagedAggregateProductCounts_ = counts;
|
|
93737
93690
|
this.aggregateTargetsPaged_ = true;
|
|
93738
93691
|
return targets;
|
|
93739
93692
|
}
|
|
@@ -93776,13 +93729,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93776
93729
|
* past that point would defer products the pass will never reach, i.e.
|
|
93777
93730
|
* extract them in neither pass.
|
|
93778
93731
|
*
|
|
93779
|
-
* Deliberately NOT the place the progress denominator is counted, even
|
|
93780
|
-
* though the entries pass through here for free and, since conway#568,
|
|
93781
|
-
* through the same classification: `targets` is a Set over the WHOLE
|
|
93782
|
-
* model, so a product reached through two relationships collapses into
|
|
93783
|
-
* one entry here while costing the pass a step in each. See
|
|
93784
|
-
* {@link aggregateRelatedProductCount}.
|
|
93785
|
-
*
|
|
93786
93732
|
* @param relAggregate The relationship to scan.
|
|
93787
93733
|
* @param targets Accumulator.
|
|
93788
93734
|
* @param strictResidency When set, a non-resident read propagates instead
|
|
@@ -94271,53 +94217,6 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94271
94217
|
}
|
|
94272
94218
|
return productLocalIDs;
|
|
94273
94219
|
}
|
|
94274
|
-
/**
|
|
94275
|
-
* How many products the aggregates pass will actually extract from one
|
|
94276
|
-
* relationship — the size of the unit of work
|
|
94277
|
-
* {@link extractRelAggregateGeometryIncremental} steps through, and the
|
|
94278
|
-
* per-relationship term of the demand pumps' progress denominator
|
|
94279
|
-
* (conway#565).
|
|
94280
|
-
*
|
|
94281
|
-
* **Derived through the pass's own path** —
|
|
94282
|
-
* {@link relatedAggregateProductLocalIDs} and so
|
|
94283
|
-
* {@link relatedProductByExpressID_} — rather than counted off the
|
|
94284
|
-
* target scan, which has the same entries in hand for free.
|
|
94285
|
-
*
|
|
94286
|
-
* The boundary is why. An entry the classification throws on — a
|
|
94287
|
-
* reference that resolves to nothing, or to something that is not an
|
|
94288
|
-
* `IfcObjectDefinition` — ENDS the relationship: the pass's permissive
|
|
94289
|
-
* catch abandons every product after it. A count that skipped the bad
|
|
94290
|
-
* entry and kept going put work in the denominator that would never run,
|
|
94291
|
-
* and the bar then jumped the whole abandoned tail when the relationship
|
|
94292
|
-
* terminated (conway#569 review). On SKYLARK's shape — one relationship
|
|
94293
|
-
* over ~1,960 products — that jump is the entire bar.
|
|
94294
|
-
* {@link relatedAggregateProductLocalIDs} stops where the pass stops;
|
|
94295
|
-
* {@link addAggregateTargets_}, whose Set collapses a product shared by
|
|
94296
|
-
* two relationships, could not carry the number anyway.
|
|
94297
|
-
*
|
|
94298
|
-
* It is still only a PREDICTION of where the pass stops — see the
|
|
94299
|
-
* `TODO(conway#574)` in `IfcApiProxyIfc.demandProgress_`.
|
|
94300
|
-
*
|
|
94301
|
-
* Costs no source bytes beyond the relationship's own record:
|
|
94302
|
-
* `getTypedElementByExpressID` builds its descriptor from the columns
|
|
94303
|
-
* (conway#566 swept exactly this call over SKYLARK250's 7,818,778
|
|
94304
|
-
* records behind an exhausted window — 0 throws, 0 store bytes). That is
|
|
94305
|
-
* what lets the paged walk call it inside a wave, where only the
|
|
94306
|
-
* relationship record is resident, as well as the resident pump calling
|
|
94307
|
-
* it at worklist-adopt time.
|
|
94308
|
-
*
|
|
94309
|
-
* **0 for a `RelatedObjects` list only the generated getter can
|
|
94310
|
-
* resolve** — an inline entity, `$` or junk. Counting those exactly means
|
|
94311
|
-
* materialising the array both callers exist to avoid, and an under-count
|
|
94312
|
-
* only pauses the bar short of full: `remaining` is derived from the
|
|
94313
|
-
* cursors, never from this.
|
|
94314
|
-
*
|
|
94315
|
-
* @param relAggregate The relationship to cost.
|
|
94316
|
-
* @return {number} Related products the aggregates pass will extract.
|
|
94317
|
-
*/
|
|
94318
|
-
aggregateRelatedProductCount(relAggregate) {
|
|
94319
|
-
return this.relatedAggregateProductLocalIDs(relAggregate)?.length ?? 0;
|
|
94320
|
-
}
|
|
94321
94220
|
/**
|
|
94322
94221
|
* Page the closures of a contiguous run of
|
|
94323
94222
|
* {@link relatedAggregateProductLocalIDs} entries.
|
|
@@ -94367,15 +94266,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94367
94266
|
hop.push(localID);
|
|
94368
94267
|
await this.model.ensureResidentByLocalID(localID);
|
|
94369
94268
|
}
|
|
94370
|
-
|
|
94371
|
-
try {
|
|
94372
|
-
related = relAggregate.RelatedObjects;
|
|
94373
|
-
} catch (error) {
|
|
94374
|
-
if (error instanceof StepBufferNotResidentError) {
|
|
94375
|
-
throw error;
|
|
94376
|
-
}
|
|
94377
|
-
return;
|
|
94378
|
-
}
|
|
94269
|
+
const related = relAggregate.RelatedObjects;
|
|
94379
94270
|
if (related !== null && related !== void 0) {
|
|
94380
94271
|
for (const product of related) {
|
|
94381
94272
|
await this.ensureResidentForProductExtract(product.localID, pinned, leafSpans);
|
|
@@ -94447,29 +94338,21 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94447
94338
|
* @param relAggregate The relationship to read.
|
|
94448
94339
|
* @return {number[] | undefined} The related objects' express IDs in
|
|
94449
94340
|
* record order, or undefined when the list holds an entry that is not a
|
|
94450
|
-
* `#N` reference — an inline entity, `$`,
|
|
94451
|
-
*
|
|
94452
|
-
*
|
|
94453
|
-
* failure propagates instead: see the catch.
|
|
94341
|
+
* `#N` reference — an inline entity, `$`, or junk. Only the generated
|
|
94342
|
+
* getter can resolve (or reject) those, so the caller falls back to it
|
|
94343
|
+
* rather than guessing.
|
|
94454
94344
|
*/
|
|
94455
94345
|
relatedObjectExpressIDs_(relAggregate) {
|
|
94456
94346
|
const expressIDs = [];
|
|
94457
94347
|
let allReferences = true;
|
|
94458
|
-
|
|
94459
|
-
|
|
94460
|
-
|
|
94461
|
-
|
|
94462
|
-
return false;
|
|
94463
|
-
}
|
|
94464
|
-
expressIDs.push(expressID);
|
|
94465
|
-
return true;
|
|
94466
|
-
});
|
|
94467
|
-
} catch (error) {
|
|
94468
|
-
if (error instanceof StepBufferNotResidentError) {
|
|
94469
|
-
throw error;
|
|
94348
|
+
relAggregate.forEachReferenceInField(REL_AGGREGATES_RELATED_OFFSET, REL_AGGREGATES_RELATED_BASE, REL_AGGREGATES_RELATED_DEPTH, (expressID) => {
|
|
94349
|
+
if (expressID === void 0) {
|
|
94350
|
+
allReferences = false;
|
|
94351
|
+
return false;
|
|
94470
94352
|
}
|
|
94471
|
-
|
|
94472
|
-
|
|
94353
|
+
expressIDs.push(expressID);
|
|
94354
|
+
return true;
|
|
94355
|
+
});
|
|
94473
94356
|
return allReferences ? expressIDs : void 0;
|
|
94474
94357
|
}
|
|
94475
94358
|
/**
|
|
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
|
|
|
15943
15943
|
};
|
|
15944
15944
|
|
|
15945
15945
|
// compiled/src/version/version.js
|
|
15946
|
-
var versionString = "Conway v1.
|
|
15946
|
+
var versionString = "Conway v1.570.1544";
|
|
15947
15947
|
|
|
15948
15948
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
15949
15949
|
function pThreadsAllowed() {
|
|
@@ -944,7 +944,7 @@ var EntityTypesIfcCount = 909;
|
|
|
944
944
|
var entity_types_ifc_gen_default = EntityTypesIfc;
|
|
945
945
|
|
|
946
946
|
// compiled/src/version/version.js
|
|
947
|
-
var versionString = "Conway v1.
|
|
947
|
+
var versionString = "Conway v1.570.1544";
|
|
948
948
|
|
|
949
949
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
950
950
|
var wasmType = "";
|
|
@@ -128,24 +128,6 @@ export declare class IfcApiProxyIfc implements IfcApiModelPassthrough {
|
|
|
128
128
|
private demandAggregates_?;
|
|
129
129
|
/** Cursor into demandAggregates_ — items before it are extracted. */
|
|
130
130
|
private demandAggregatesCursor_;
|
|
131
|
-
/**
|
|
132
|
-
* Running total of stepper steps the aggregates pass will cost, indexed
|
|
133
|
-
* like demandAggregates_: entry i is the steps for relationships
|
|
134
|
-
* `[0, i)`, so the array is one longer than the worklist and its last
|
|
135
|
-
* entry is the pass's whole cost.
|
|
136
|
-
*
|
|
137
|
-
* **The unit is one pump budget unit, not one product** (conway#565).
|
|
138
|
-
* A relationship costs `products + 1`: the stepper yields once per
|
|
139
|
-
* related product it extracts, and the final `next()` that returns
|
|
140
|
-
* `done` also spends a unit of the pump's budget. Counting products
|
|
141
|
-
* alone would leave `extracted` and `remaining` disagreeing by one per
|
|
142
|
-
* relationship at every boundary, which is the wrinkle #565 flagged to
|
|
143
|
-
* decide rather than trip over. In this unit they are commensurate:
|
|
144
|
-
* `remaining` falls by exactly what `extracted` reports.
|
|
145
|
-
*
|
|
146
|
-
* Undefined until a worklist is adopted.
|
|
147
|
-
*/
|
|
148
|
-
private demandAggregateStepPrefix_?;
|
|
149
131
|
/**
|
|
150
132
|
* The relationship at demandAggregatesCursor_, part-way through its
|
|
151
133
|
* related products. A batch budget subdivides ONE relationship rather
|
|
@@ -811,41 +793,6 @@ export declare class IfcApiProxyIfc implements IfcApiModelPassthrough {
|
|
|
811
793
|
* a previous walk would otherwise hold both.
|
|
812
794
|
*/
|
|
813
795
|
private releaseDemandAggregate_;
|
|
814
|
-
/**
|
|
815
|
-
* Cost every relationship in the adopted worklist, in pump budget units,
|
|
816
|
-
* as the running prefix demandAggregateStepPrefix_ describes.
|
|
817
|
-
*
|
|
818
|
-
* Called from both worklist installers rather than lazily in the pump:
|
|
819
|
-
* the windowed half of the counts comes from the aggregate-target walk,
|
|
820
|
-
* which has already run by the time a worklist exists (the async
|
|
821
|
-
* installer awaits its paged twin first), so there is no point later at
|
|
822
|
-
* which this gets cheaper.
|
|
823
|
-
*/
|
|
824
|
-
private adoptAggregateStepPrefix_;
|
|
825
|
-
/**
|
|
826
|
-
* The geometry phase's denominator and what is left of it, both in pump
|
|
827
|
-
* budget units — products for the per-product pass, stepper steps for the
|
|
828
|
-
* aggregates pass.
|
|
829
|
-
*
|
|
830
|
-
* Shared by the two pumps so the synchronous embedder and the async pump
|
|
831
|
-
* Share drives report the same numbers. conway#565 is what happens when
|
|
832
|
-
* they do not have one definition: `aggregates.length` counted a
|
|
833
|
-
* relationship as one unit however many products it carried, so
|
|
834
|
-
* SKYLARK250 — 0 per-product entries and 2 relationships, one holding
|
|
835
|
-
* ~1,960 products — reported `1/2` for 186 consecutive events across a
|
|
836
|
-
* minute and a half of extraction.
|
|
837
|
-
*
|
|
838
|
-
* **`remaining` is derived from the cursors, never from the estimate.**
|
|
839
|
-
* Callers pump until it reads 0, so the drain test has to be exact even
|
|
840
|
-
* where the counts are approximate (see
|
|
841
|
-
* {@link IfcGeometryExtraction.aggregateRelatedProductCount}). It reads 0
|
|
842
|
-
* exactly when the pass is drained, and is floored at 1 while any work is
|
|
843
|
-
* outstanding — an under-counted relationship makes the bar pause just
|
|
844
|
-
* short of full, not finish early.
|
|
845
|
-
*
|
|
846
|
-
* @return {object} `totalWork` for the phase and `remaining` of it.
|
|
847
|
-
*/
|
|
848
|
-
private demandProgress_;
|
|
849
796
|
private pumpGeometryBatch_;
|
|
850
797
|
/**
|
|
851
798
|
* Walk the scene and emit every not-yet-captured placed instance as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc_api_proxy_ifc.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_proxy_ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAQ/C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,YAAY,MAAM,0BAA0B,CAAA;AACnD,OAAO,EACL,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,MAAM,EACP,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,qBAAqB,EAA8B,MAAM,iCAAiC,CAAA;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAqBrD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAE3D,OAAO,EAAyB,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AA2DhG;;;;;GAKG;AACH,UAAU,iBAAiB;IACzB,UAAU,EAAE,cAAc,CAAA;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;uEACmE;IACnE,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAA;IACpC;;qEAEiE;IACjE,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,EAAE,eAAe,CAAA;IACtB,cAAc,EAAE,qBAAqB,CAAA;IACrC,gBAAgB,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B;AA6CD,qBAAa,cAAe,YAAW,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ifc_api_proxy_ifc.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_proxy_ifc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1508,10 +1508,11 @@ export class IfcApiProxyIfc {
|
|
|
1508
1508
|
}
|
|
1509
1509
|
const products = this.demandProducts_ ?? [];
|
|
1510
1510
|
const aggregates = this.demandAggregates_ ?? [];
|
|
1511
|
+
const totalWork = products.length + aggregates.length;
|
|
1511
1512
|
const budget = Math.max(batchSize, 1);
|
|
1512
1513
|
let extracted = 0;
|
|
1513
1514
|
if (this.progressTracker_ !== void 0 && !this.geometryPhaseStarted_) {
|
|
1514
|
-
this.progressTracker_.beginPhase("geometry", "products",
|
|
1515
|
+
this.progressTracker_.beginPhase("geometry", "products", totalWork);
|
|
1515
1516
|
this.geometryPhaseStarted_ = true;
|
|
1516
1517
|
}
|
|
1517
1518
|
const productEnd = Math.min(this.demandCursor_ + budget, products.length);
|
|
@@ -1618,7 +1619,8 @@ export class IfcApiProxyIfc {
|
|
|
1618
1619
|
// this batch is about to deliver and re-extract them immediately. A
|
|
1619
1620
|
// no-op unless a budget is configured.
|
|
1620
1621
|
this.model[0].geometryResidency.evictToBudget();
|
|
1621
|
-
const
|
|
1622
|
+
const remaining = (products.length - this.demandCursor_) +
|
|
1623
|
+
(aggregates.length - this.demandAggregatesCursor_);
|
|
1622
1624
|
const windowMb = this.model[0].residentSourceBytes / BYTES_PER_MIB;
|
|
1623
1625
|
if (this.progressTracker_ !== void 0) {
|
|
1624
1626
|
const completed = totalWork - remaining;
|
|
@@ -1765,7 +1767,6 @@ export class IfcApiProxyIfc {
|
|
|
1765
1767
|
this.demandAggregates_ = aggregates;
|
|
1766
1768
|
this.demandCursor_ = 0;
|
|
1767
1769
|
this.demandAggregatesCursor_ = 0;
|
|
1768
|
-
this.adoptAggregateStepPrefix_();
|
|
1769
1770
|
}
|
|
1770
1771
|
/**
|
|
1771
1772
|
* Install the worklists narrowed to this instance's shard.
|
|
@@ -1817,7 +1818,6 @@ export class IfcApiProxyIfc {
|
|
|
1817
1818
|
this.releaseDemandAggregate_();
|
|
1818
1819
|
this.demandCursor_ = 0;
|
|
1819
1820
|
this.demandAggregatesCursor_ = 0;
|
|
1820
|
-
this.adoptAggregateStepPrefix_();
|
|
1821
1821
|
}
|
|
1822
1822
|
/**
|
|
1823
1823
|
* Hand this model the recentre frame to apply, instead of letting it
|
|
@@ -2132,97 +2132,12 @@ export class IfcApiProxyIfc {
|
|
|
2132
2132
|
this.demandAggregatePager_?.release();
|
|
2133
2133
|
this.demandAggregatePager_ = void 0;
|
|
2134
2134
|
}
|
|
2135
|
-
/**
|
|
2136
|
-
* Cost every relationship in the adopted worklist, in pump budget units,
|
|
2137
|
-
* as the running prefix demandAggregateStepPrefix_ describes.
|
|
2138
|
-
*
|
|
2139
|
-
* Called from both worklist installers rather than lazily in the pump:
|
|
2140
|
-
* the windowed half of the counts comes from the aggregate-target walk,
|
|
2141
|
-
* which has already run by the time a worklist exists (the async
|
|
2142
|
-
* installer awaits its paged twin first), so there is no point later at
|
|
2143
|
-
* which this gets cheaper.
|
|
2144
|
-
*/
|
|
2145
|
-
adoptAggregateStepPrefix_() {
|
|
2146
|
-
const aggregates = this.demandAggregates_ ?? [];
|
|
2147
|
-
const prefix = new Array(aggregates.length + 1);
|
|
2148
|
-
// Taken, not read: the extraction hands the map over and drops its own
|
|
2149
|
-
// reference, so nothing outlives this loop but the prefix — which is
|
|
2150
|
-
// the structure the pump actually needs (conway#569 review). Undefined
|
|
2151
|
-
// on a resident source, which never ran the paged walk.
|
|
2152
|
-
const paged = this.conwayGeometry_.takeAggregateRelatedProductCounts();
|
|
2153
|
-
let running = 0;
|
|
2154
|
-
prefix[0] = 0;
|
|
2155
|
-
for (let where = 0; where < aggregates.length; ++where) {
|
|
2156
|
-
const relAggregate = aggregates[where];
|
|
2157
|
-
// One definition of the count, whichever source it comes from: the
|
|
2158
|
-
// windowed walk fills `paged` by calling aggregateRelatedProductCount
|
|
2159
|
-
// while the record is resident, and a resident model calls it right
|
|
2160
|
-
// here for nothing — no paging, no wave. The map is a cache of that
|
|
2161
|
-
// call, not a second way of computing it (conway#569 review), which
|
|
2162
|
-
// is what keeps a windowed load and a resident load of the same model
|
|
2163
|
-
// reporting the same denominator.
|
|
2164
|
-
const related = paged?.get(relAggregate.localID) ??
|
|
2165
|
-
this.conwayGeometry_.aggregateRelatedProductCount(relAggregate);
|
|
2166
|
-
// +1 for the terminating next(): see demandAggregateStepPrefix_.
|
|
2167
|
-
running += related + 1;
|
|
2168
|
-
prefix[where + 1] = running;
|
|
2169
|
-
}
|
|
2170
|
-
this.demandAggregateStepPrefix_ = prefix;
|
|
2171
|
-
}
|
|
2172
|
-
/**
|
|
2173
|
-
* The geometry phase's denominator and what is left of it, both in pump
|
|
2174
|
-
* budget units — products for the per-product pass, stepper steps for the
|
|
2175
|
-
* aggregates pass.
|
|
2176
|
-
*
|
|
2177
|
-
* Shared by the two pumps so the synchronous embedder and the async pump
|
|
2178
|
-
* Share drives report the same numbers. conway#565 is what happens when
|
|
2179
|
-
* they do not have one definition: `aggregates.length` counted a
|
|
2180
|
-
* relationship as one unit however many products it carried, so
|
|
2181
|
-
* SKYLARK250 — 0 per-product entries and 2 relationships, one holding
|
|
2182
|
-
* ~1,960 products — reported `1/2` for 186 consecutive events across a
|
|
2183
|
-
* minute and a half of extraction.
|
|
2184
|
-
*
|
|
2185
|
-
* **`remaining` is derived from the cursors, never from the estimate.**
|
|
2186
|
-
* Callers pump until it reads 0, so the drain test has to be exact even
|
|
2187
|
-
* where the counts are approximate (see
|
|
2188
|
-
* {@link IfcGeometryExtraction.aggregateRelatedProductCount}). It reads 0
|
|
2189
|
-
* exactly when the pass is drained, and is floored at 1 while any work is
|
|
2190
|
-
* outstanding — an under-counted relationship makes the bar pause just
|
|
2191
|
-
* short of full, not finish early.
|
|
2192
|
-
*
|
|
2193
|
-
* @return {object} `totalWork` for the phase and `remaining` of it.
|
|
2194
|
-
*/
|
|
2195
|
-
demandProgress_() {
|
|
2196
|
-
const products = this.demandProducts_ ?? [];
|
|
2197
|
-
const aggregates = this.demandAggregates_ ?? [];
|
|
2198
|
-
// TODO(conway#574): the prefix is a PREDICTION, and the pass has more
|
|
2199
|
-
// early-abandon points than it enumerates — a product whose extraction
|
|
2200
|
-
// throws abandons the relationship too, and the unrun tail drops in one
|
|
2201
|
-
// step when the cursor advances. The fix is to adjust the prefix from
|
|
2202
|
-
// the stepper's actual termination rather than to add a reason at a
|
|
2203
|
-
// time; three review rounds found three boundaries.
|
|
2204
|
-
const prefix = this.demandAggregateStepPrefix_ ?? [0];
|
|
2205
|
-
const aggregateSteps = prefix[prefix.length - 1];
|
|
2206
|
-
const totalWork = products.length + aggregateSteps;
|
|
2207
|
-
const drained = this.demandAggregateStepper_ === void 0 &&
|
|
2208
|
-
this.demandAggregatesCursor_ >= aggregates.length;
|
|
2209
|
-
let aggregateRemaining = 0;
|
|
2210
|
-
if (!drained) {
|
|
2211
|
-
const cursor = Math.min(this.demandAggregatesCursor_, aggregates.length);
|
|
2212
|
-
const inFlight = Math.min(this.demandAggregateSteps_, (prefix[cursor + 1] ?? prefix[cursor]) - prefix[cursor]);
|
|
2213
|
-
aggregateRemaining =
|
|
2214
|
-
Math.max(1, aggregateSteps - (prefix[cursor] + inFlight));
|
|
2215
|
-
}
|
|
2216
|
-
return {
|
|
2217
|
-
totalWork,
|
|
2218
|
-
remaining: (products.length - this.demandCursor_) + aggregateRemaining,
|
|
2219
|
-
};
|
|
2220
|
-
}
|
|
2221
2135
|
pumpGeometryBatch_(batchSize, meshCallback) {
|
|
2222
2136
|
const products = this.demandProducts_ ?? [];
|
|
2223
2137
|
const aggregates = this.demandAggregates_ ?? [];
|
|
2138
|
+
const totalWork = products.length + aggregates.length;
|
|
2224
2139
|
if (this.progressTracker_ !== void 0 && !this.geometryPhaseStarted_) {
|
|
2225
|
-
this.progressTracker_.beginPhase("geometry", "products",
|
|
2140
|
+
this.progressTracker_.beginPhase("geometry", "products", totalWork);
|
|
2226
2141
|
this.geometryPhaseStarted_ = true;
|
|
2227
2142
|
}
|
|
2228
2143
|
const budget = Math.max(batchSize, 1);
|
|
@@ -2250,7 +2165,6 @@ export class IfcApiProxyIfc {
|
|
|
2250
2165
|
if (this.demandAggregateStepper_ === void 0) {
|
|
2251
2166
|
this.demandAggregateStepper_ =
|
|
2252
2167
|
this.conwayGeometry_.extractRelAggregateGeometryIncremental(aggregates[this.demandAggregatesCursor_]);
|
|
2253
|
-
this.demandAggregateSteps_ = 0;
|
|
2254
2168
|
}
|
|
2255
2169
|
let done;
|
|
2256
2170
|
try {
|
|
@@ -2261,19 +2175,12 @@ export class IfcApiProxyIfc {
|
|
|
2261
2175
|
// way out of the stepper by exception. Drop the half-consumed
|
|
2262
2176
|
// stepper but leave the cursor, so a retry re-runs the
|
|
2263
2177
|
// relationship from the top exactly as it did when this was one
|
|
2264
|
-
// unyielding call
|
|
2178
|
+
// unyielding call.
|
|
2265
2179
|
this.demandAggregateStepper_ = void 0;
|
|
2266
|
-
this.demandAggregateSteps_ = 0;
|
|
2267
2180
|
throw error;
|
|
2268
2181
|
}
|
|
2269
|
-
// Counted on this pump too, not just the async twin: it is what
|
|
2270
|
-
// demandProgress_ reads to place the bar inside the relationship in
|
|
2271
|
-
// flight, and a synchronous embedder reporting the old numbers is
|
|
2272
|
-
// half of conway#565 left in place.
|
|
2273
|
-
++this.demandAggregateSteps_;
|
|
2274
2182
|
if (done) {
|
|
2275
2183
|
this.demandAggregateStepper_ = void 0;
|
|
2276
|
-
this.demandAggregateSteps_ = 0;
|
|
2277
2184
|
++this.demandAggregatesCursor_;
|
|
2278
2185
|
}
|
|
2279
2186
|
++extracted;
|
|
@@ -2301,13 +2208,15 @@ export class IfcApiProxyIfc {
|
|
|
2301
2208
|
// embedder and the test suite drive, and a budget honoured on only
|
|
2302
2209
|
// one of them is a budget that silently does not apply.
|
|
2303
2210
|
this.model[0].geometryResidency.evictToBudget();
|
|
2304
|
-
const
|
|
2211
|
+
const remaining = (products.length - this.demandCursor_) +
|
|
2212
|
+
(aggregates.length - this.demandAggregatesCursor_);
|
|
2305
2213
|
if (this.progressTracker_ !== void 0) {
|
|
2214
|
+
const completed = totalWork - remaining;
|
|
2306
2215
|
if (remaining === 0) {
|
|
2307
2216
|
this.progressTracker_.endPhase(totalWork);
|
|
2308
2217
|
}
|
|
2309
2218
|
else {
|
|
2310
|
-
this.progressTracker_.update(
|
|
2219
|
+
this.progressTracker_.update(completed);
|
|
2311
2220
|
}
|
|
2312
2221
|
}
|
|
2313
2222
|
return {
|
|
@@ -1106,7 +1106,6 @@ export declare class IfcGeometryExtraction {
|
|
|
1106
1106
|
private static readonly AGGREGATE_TARGET_WAVE_SIZE_;
|
|
1107
1107
|
private static readonly AGGREGATE_PREFETCH_WAVE_SIZE_;
|
|
1108
1108
|
private aggregateTargetLocalIDs_?;
|
|
1109
|
-
private pagedAggregateProductCounts_?;
|
|
1110
1109
|
private aggregateTargetsPaged_;
|
|
1111
1110
|
/**
|
|
1112
1111
|
* Local IDs of every IfcProduct that is a RelatedObject of any
|
|
@@ -1129,46 +1128,6 @@ export declare class IfcGeometryExtraction {
|
|
|
1129
1128
|
* pass; empty for models without IfcRelAggregates.
|
|
1130
1129
|
*/
|
|
1131
1130
|
aggregateTargetLocalIDs(): Set<number>;
|
|
1132
|
-
/**
|
|
1133
|
-
* The per-relationship product counts the PAGED walk collected, handed
|
|
1134
|
-
* over and dropped in one call.
|
|
1135
|
-
*
|
|
1136
|
-
* Counts are how many products the aggregates pass will extract for a
|
|
1137
|
-
* relationship — the size of the unit of work
|
|
1138
|
-
* {@link extractRelAggregateGeometryIncremental} steps through — which the
|
|
1139
|
-
* demand pump needs to report progress in products rather than in
|
|
1140
|
-
* relationships (conway#565: SKYLARK250 puts ~1,960 products under one
|
|
1141
|
-
* relationship, so a relationship-counted bar sat at 1/2 for the whole
|
|
1142
|
-
* load).
|
|
1143
|
-
*
|
|
1144
|
-
* **Collected only on the windowed walk, and only because that is the one
|
|
1145
|
-
* place it is free.** {@link ensureAggregateTargetLocalIDs} already pages
|
|
1146
|
-
* and scans every `IfcRelAggregates` record, so the count is the number it
|
|
1147
|
-
* was discarding. A resident model has no such moment worth capturing —
|
|
1148
|
-
* it can read the same records at adopt time for nothing — so the sync
|
|
1149
|
-
* walk collects nothing at all and the whole-model extraction, which
|
|
1150
|
-
* shares that walk, retains nothing.
|
|
1151
|
-
*
|
|
1152
|
-
* **Handed over rather than cached** (conway#569 review). The prefix the
|
|
1153
|
-
* pump builds from these is itself the durable structure; keeping a second
|
|
1154
|
-
* copy for the model's life is retention with no reader. Measured on an
|
|
1155
|
-
* adverse model — 50,000 relationships over 100,000 products, the shape
|
|
1156
|
-
* where relationship count approaches product count — the map holds
|
|
1157
|
-
* 1.75 MB at 36.7 bytes per relationship. Not fatal beside the 16.4 MB
|
|
1158
|
-
* the target Set from the same walk retains, but it is avoidable, and
|
|
1159
|
-
* `setGeometryShard` refuses to run once a worklist exists so the prefix
|
|
1160
|
-
* is built exactly once and there is nothing to hand it to twice.
|
|
1161
|
-
*
|
|
1162
|
-
* **The same number the resident pump derives for itself**, from the same
|
|
1163
|
-
* call: {@link aggregateRelatedProductCount}. Approximate in one
|
|
1164
|
-
* direction only — a `RelatedObjects` list that needs the generated
|
|
1165
|
-
* getter counts 0 — and the pump's own drain condition, not this number,
|
|
1166
|
-
* decides when the pass is finished.
|
|
1167
|
-
*
|
|
1168
|
-
* @return {Map<number, number> | undefined} Counts keyed by relationship
|
|
1169
|
-
* localID, or undefined where no paged walk ran. The caller owns it.
|
|
1170
|
-
*/
|
|
1171
|
-
takeAggregateRelatedProductCounts(): Map<number, number> | undefined;
|
|
1172
1131
|
/**
|
|
1173
1132
|
* Windowed twin of {@link aggregateTargetLocalIDs}: page each
|
|
1174
1133
|
* relationship record before scanning it, so the set is COMPLETE rather
|
|
@@ -1237,13 +1196,6 @@ export declare class IfcGeometryExtraction {
|
|
|
1237
1196
|
* past that point would defer products the pass will never reach, i.e.
|
|
1238
1197
|
* extract them in neither pass.
|
|
1239
1198
|
*
|
|
1240
|
-
* Deliberately NOT the place the progress denominator is counted, even
|
|
1241
|
-
* though the entries pass through here for free and, since conway#568,
|
|
1242
|
-
* through the same classification: `targets` is a Set over the WHOLE
|
|
1243
|
-
* model, so a product reached through two relationships collapses into
|
|
1244
|
-
* one entry here while costing the pass a step in each. See
|
|
1245
|
-
* {@link aggregateRelatedProductCount}.
|
|
1246
|
-
*
|
|
1247
1199
|
* @param relAggregate The relationship to scan.
|
|
1248
1200
|
* @param targets Accumulator.
|
|
1249
1201
|
* @param strictResidency When set, a non-resident read propagates instead
|
|
@@ -1482,51 +1434,6 @@ export declare class IfcGeometryExtraction {
|
|
|
1482
1434
|
* resolve (see {@link relatedObjectExpressIDs_}).
|
|
1483
1435
|
*/
|
|
1484
1436
|
relatedAggregateProductLocalIDs(relAggregate: IfcRelAggregates): number[] | undefined;
|
|
1485
|
-
/**
|
|
1486
|
-
* How many products the aggregates pass will actually extract from one
|
|
1487
|
-
* relationship — the size of the unit of work
|
|
1488
|
-
* {@link extractRelAggregateGeometryIncremental} steps through, and the
|
|
1489
|
-
* per-relationship term of the demand pumps' progress denominator
|
|
1490
|
-
* (conway#565).
|
|
1491
|
-
*
|
|
1492
|
-
* **Derived through the pass's own path** —
|
|
1493
|
-
* {@link relatedAggregateProductLocalIDs} and so
|
|
1494
|
-
* {@link relatedProductByExpressID_} — rather than counted off the
|
|
1495
|
-
* target scan, which has the same entries in hand for free.
|
|
1496
|
-
*
|
|
1497
|
-
* The boundary is why. An entry the classification throws on — a
|
|
1498
|
-
* reference that resolves to nothing, or to something that is not an
|
|
1499
|
-
* `IfcObjectDefinition` — ENDS the relationship: the pass's permissive
|
|
1500
|
-
* catch abandons every product after it. A count that skipped the bad
|
|
1501
|
-
* entry and kept going put work in the denominator that would never run,
|
|
1502
|
-
* and the bar then jumped the whole abandoned tail when the relationship
|
|
1503
|
-
* terminated (conway#569 review). On SKYLARK's shape — one relationship
|
|
1504
|
-
* over ~1,960 products — that jump is the entire bar.
|
|
1505
|
-
* {@link relatedAggregateProductLocalIDs} stops where the pass stops;
|
|
1506
|
-
* {@link addAggregateTargets_}, whose Set collapses a product shared by
|
|
1507
|
-
* two relationships, could not carry the number anyway.
|
|
1508
|
-
*
|
|
1509
|
-
* It is still only a PREDICTION of where the pass stops — see the
|
|
1510
|
-
* `TODO(conway#574)` in `IfcApiProxyIfc.demandProgress_`.
|
|
1511
|
-
*
|
|
1512
|
-
* Costs no source bytes beyond the relationship's own record:
|
|
1513
|
-
* `getTypedElementByExpressID` builds its descriptor from the columns
|
|
1514
|
-
* (conway#566 swept exactly this call over SKYLARK250's 7,818,778
|
|
1515
|
-
* records behind an exhausted window — 0 throws, 0 store bytes). That is
|
|
1516
|
-
* what lets the paged walk call it inside a wave, where only the
|
|
1517
|
-
* relationship record is resident, as well as the resident pump calling
|
|
1518
|
-
* it at worklist-adopt time.
|
|
1519
|
-
*
|
|
1520
|
-
* **0 for a `RelatedObjects` list only the generated getter can
|
|
1521
|
-
* resolve** — an inline entity, `$` or junk. Counting those exactly means
|
|
1522
|
-
* materialising the array both callers exist to avoid, and an under-count
|
|
1523
|
-
* only pauses the bar short of full: `remaining` is derived from the
|
|
1524
|
-
* cursors, never from this.
|
|
1525
|
-
*
|
|
1526
|
-
* @param relAggregate The relationship to cost.
|
|
1527
|
-
* @return {number} Related products the aggregates pass will extract.
|
|
1528
|
-
*/
|
|
1529
|
-
aggregateRelatedProductCount(relAggregate: IfcRelAggregates): number;
|
|
1530
1437
|
/**
|
|
1531
1438
|
* Page the closures of a contiguous run of
|
|
1532
1439
|
* {@link relatedAggregateProductLocalIDs} entries.
|
|
@@ -1618,10 +1525,9 @@ export declare class IfcGeometryExtraction {
|
|
|
1618
1525
|
* @param relAggregate The relationship to read.
|
|
1619
1526
|
* @return {number[] | undefined} The related objects' express IDs in
|
|
1620
1527
|
* record order, or undefined when the list holds an entry that is not a
|
|
1621
|
-
* `#N` reference — an inline entity, `$`,
|
|
1622
|
-
*
|
|
1623
|
-
*
|
|
1624
|
-
* failure propagates instead: see the catch.
|
|
1528
|
+
* `#N` reference — an inline entity, `$`, or junk. Only the generated
|
|
1529
|
+
* getter can resolve (or reject) those, so the caller falls back to it
|
|
1530
|
+
* rather than guessing.
|
|
1625
1531
|
*/
|
|
1626
1532
|
private relatedObjectExpressIDs_;
|
|
1627
1533
|
/**
|