@ifc-lite/parser 6.4.0 → 7.0.0
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/README.md +21 -0
- package/dist/cost-category-buckets.d.ts +5 -0
- package/dist/cost-category-buckets.d.ts.map +1 -0
- package/dist/cost-category-buckets.js +37 -0
- package/dist/cost-category-buckets.js.map +1 -0
- package/dist/cost-compatibility-tree.d.ts +4 -0
- package/dist/cost-compatibility-tree.d.ts.map +1 -0
- package/dist/cost-compatibility-tree.js +46 -0
- package/dist/cost-compatibility-tree.js.map +1 -0
- package/dist/cost-evaluation-arithmetic.d.ts +16 -0
- package/dist/cost-evaluation-arithmetic.d.ts.map +1 -0
- package/dist/cost-evaluation-arithmetic.js +181 -0
- package/dist/cost-evaluation-arithmetic.js.map +1 -0
- package/dist/cost-evaluation-context.d.ts +20 -0
- package/dist/cost-evaluation-context.d.ts.map +1 -0
- package/dist/cost-evaluation-context.js +54 -0
- package/dist/cost-evaluation-context.js.map +1 -0
- package/dist/cost-evaluation-result.d.ts +5 -0
- package/dist/cost-evaluation-result.d.ts.map +1 -0
- package/dist/cost-evaluation-result.js +20 -0
- package/dist/cost-evaluation-result.js.map +1 -0
- package/dist/cost-evaluator.d.ts +6 -0
- package/dist/cost-evaluator.d.ts.map +1 -0
- package/dist/cost-evaluator.js +396 -0
- package/dist/cost-evaluator.js.map +1 -0
- package/dist/cost-extractor.d.ts +3 -8
- package/dist/cost-extractor.d.ts.map +1 -1
- package/dist/cost-extractor.js +330 -335
- package/dist/cost-extractor.js.map +1 -1
- package/dist/cost-quantities.d.ts +5 -0
- package/dist/cost-quantities.d.ts.map +1 -0
- package/dist/cost-quantities.js +116 -0
- package/dist/cost-quantities.js.map +1 -0
- package/dist/cost-quantity-evaluator.d.ts +23 -0
- package/dist/cost-quantity-evaluator.d.ts.map +1 -0
- package/dist/cost-quantity-evaluator.js +153 -0
- package/dist/cost-quantity-evaluator.js.map +1 -0
- package/dist/cost-reader.d.ts +26 -0
- package/dist/cost-reader.d.ts.map +1 -0
- package/dist/cost-reader.js +117 -0
- package/dist/cost-reader.js.map +1 -0
- package/dist/cost-relationships.d.ts +7 -0
- package/dist/cost-relationships.d.ts.map +1 -0
- package/dist/cost-relationships.js +237 -0
- package/dist/cost-relationships.js.map +1 -0
- package/dist/cost-step-lexemes.d.ts +16 -0
- package/dist/cost-step-lexemes.d.ts.map +1 -0
- package/dist/cost-step-lexemes.js +131 -0
- package/dist/cost-step-lexemes.js.map +1 -0
- package/dist/cost-types.d.ts +210 -76
- package/dist/cost-types.d.ts.map +1 -1
- package/dist/cost-units.d.ts +38 -0
- package/dist/cost-units.d.ts.map +1 -0
- package/dist/cost-units.js +348 -0
- package/dist/cost-units.js.map +1 -0
- package/dist/cost-value-evaluation-session.d.ts +19 -0
- package/dist/cost-value-evaluation-session.d.ts.map +1 -0
- package/dist/cost-value-evaluation-session.js +25 -0
- package/dist/cost-value-evaluation-session.js.map +1 -0
- package/dist/cost.d.ts +4 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +6 -0
- package/dist/cost.js.map +1 -0
- package/dist/entity-extractor.d.ts.map +1 -1
- package/dist/entity-extractor.js +5 -2
- package/dist/entity-extractor.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/relationship-schema-slots.d.ts.map +1 -1
- package/dist/relationship-schema-slots.js +36 -1
- package/dist/relationship-schema-slots.js.map +1 -1
- package/dist/schedule-calendar-types.d.ts +89 -0
- package/dist/schedule-calendar-types.d.ts.map +1 -0
- package/dist/schedule-calendar-types.js +175 -0
- package/dist/schedule-calendar-types.js.map +1 -0
- package/dist/schedule-control-extractor.d.ts +41 -0
- package/dist/schedule-control-extractor.d.ts.map +1 -0
- package/dist/schedule-control-extractor.js +91 -0
- package/dist/schedule-control-extractor.js.map +1 -0
- package/dist/schedule-extractor.d.ts +1 -0
- package/dist/schedule-extractor.d.ts.map +1 -1
- package/dist/schedule-extractor.js +51 -61
- package/dist/schedule-extractor.js.map +1 -1
- package/dist/schedule-serializer-calendar-builders.d.ts +50 -0
- package/dist/schedule-serializer-calendar-builders.d.ts.map +1 -0
- package/dist/schedule-serializer-calendar-builders.js +126 -0
- package/dist/schedule-serializer-calendar-builders.js.map +1 -0
- package/dist/schedule-serializer.d.ts +21 -3
- package/dist/schedule-serializer.d.ts.map +1 -1
- package/dist/schedule-serializer.js +56 -0
- package/dist/schedule-serializer.js.map +1 -1
- package/dist/schedule-types.d.ts +24 -0
- package/dist/schedule-types.d.ts.map +1 -1
- package/dist/schedule-types.js.map +1 -1
- package/dist/step-entity-parameters.d.ts +9 -0
- package/dist/step-entity-parameters.d.ts.map +1 -0
- package/dist/step-entity-parameters.js +30 -0
- package/dist/step-entity-parameters.js.map +1 -0
- package/package.json +4 -3
- package/dist/cost-schedule-2x3.d.ts +0 -31
- package/dist/cost-schedule-2x3.d.ts.map +0 -1
- package/dist/cost-schedule-2x3.js +0 -75
- package/dist/cost-schedule-2x3.js.map +0 -1
package/README.md
CHANGED
|
@@ -107,6 +107,27 @@ if (georef?.hasGeoreference) {
|
|
|
107
107
|
}
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
+
## Read cost data
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import { evaluateCostItem, extractCostOnDemand } from '@ifc-lite/parser';
|
|
114
|
+
|
|
115
|
+
const cost = extractCostOnDemand(store);
|
|
116
|
+
const result = evaluateCostItem(cost, cost.CostItems[0].expressId);
|
|
117
|
+
console.log(result.Amount, result.Currency, result.Diagnostics);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The read model preserves ordered `CostValues`, direct `CostQuantities`, shared
|
|
121
|
+
references, and the original `IfcRelNests`/assignment relationship endpoints.
|
|
122
|
+
Rates use only `IfcCostItem.CostQuantities`; product Qto values are never used as
|
|
123
|
+
an implicit fallback. Direct quantities make the item's values unit costs even
|
|
124
|
+
when `UnitBasis` is absent. IFC4 and IFC4X3 support exact-decimal arithmetic,
|
|
125
|
+
currencies, compatible `UnitBasis` conversion, and named or `*` nested-category
|
|
126
|
+
totals. Invalid quantities or incompatible dimensions produce diagnostics and
|
|
127
|
+
withhold the total instead of returning a partial result. IFC2X3 cost metadata and legacy
|
|
128
|
+
relationships remain inspectable, with an explicit partial-read diagnostic;
|
|
129
|
+
IFC2X3 evaluation is intentionally unsupported.
|
|
130
|
+
|
|
110
131
|
## Performance
|
|
111
132
|
|
|
112
133
|
| Model size | Parse time |
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { combineCosts, type EvaluatedCost } from './cost-evaluation-arithmetic.js';
|
|
2
|
+
import { type ValueEvaluationSession } from './cost-value-evaluation-session.js';
|
|
3
|
+
export declare function appendCategoryValues(target: Map<string, EvaluatedCost[]>, category: string, values: readonly EvaluatedCost[], session: ValueEvaluationSession, onExhausted: () => void): boolean;
|
|
4
|
+
export declare function combineCategoryValues(category: string, totals: ReadonlyMap<string, readonly EvaluatedCost[]> | undefined, valueId: number, session: ValueEvaluationSession, onExhausted: () => void, onDiagnostic: Parameters<typeof combineCosts>[3]): EvaluatedCost;
|
|
5
|
+
//# sourceMappingURL=cost-category-buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-category-buckets.d.ts","sourceRoot":"","sources":["../src/cost-category-buckets.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EACuB,KAAK,sBAAsB,EACxD,MAAM,oCAAoC,CAAC;AAE5C,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,EACxF,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,IAAI,GACvD,OAAO,CAYT;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EACpG,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,IAAI,EACxD,YAAY,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,GAC/C,aAAa,CAaf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { combineCosts } from './cost-evaluation-arithmetic.js';
|
|
5
|
+
import { consumeValueEvaluationWork, } from './cost-value-evaluation-session.js';
|
|
6
|
+
export function appendCategoryValues(target, category, values, session, onExhausted) {
|
|
7
|
+
const bucket = target.get(category) ?? [];
|
|
8
|
+
if (!target.has(category))
|
|
9
|
+
target.set(category, bucket);
|
|
10
|
+
for (const value of values) {
|
|
11
|
+
const wasExhausted = session.exhausted;
|
|
12
|
+
if (!consumeValueEvaluationWork(session)) {
|
|
13
|
+
if (!wasExhausted)
|
|
14
|
+
onExhausted();
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
bucket.push(value);
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
export function combineCategoryValues(category, totals, valueId, session, onExhausted, onDiagnostic) {
|
|
22
|
+
const cached = session.categoryMemo.get(category);
|
|
23
|
+
if (cached)
|
|
24
|
+
return cached;
|
|
25
|
+
const categorized = totals?.get(category) ?? [];
|
|
26
|
+
const uncategorized = category === '*' ? [] : totals?.get('') ?? [];
|
|
27
|
+
const wasExhausted = session.exhausted;
|
|
28
|
+
if (!consumeValueEvaluationWork(session, categorized.length + uncategorized.length)) {
|
|
29
|
+
if (!wasExhausted)
|
|
30
|
+
onExhausted();
|
|
31
|
+
return { invalid: true };
|
|
32
|
+
}
|
|
33
|
+
const evaluated = combineCosts('ADD', [...categorized, ...uncategorized], valueId, onDiagnostic);
|
|
34
|
+
session.categoryMemo.set(category, evaluated);
|
|
35
|
+
return evaluated;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cost-category-buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-category-buckets.js","sourceRoot":"","sources":["../src/cost-category-buckets.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAC;AACnF,OAAO,EACL,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAClC,MAAoC,EAAE,QAAgB,EAAE,MAAgC,EACxF,OAA+B,EAAE,WAAuB;IAExD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY;gBAAE,WAAW,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAAE,MAAiE,EAAE,OAAe,EACpG,OAA+B,EAAE,WAAuB,EACxD,YAAgD;IAEhD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,WAAW,GAAG,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IACvC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,IAAI,CAAC,YAAY;YAAE,WAAW,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACjG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CostDiagnostic, CostValueInfo } from './cost-types.js';
|
|
2
|
+
/** Build bounded legacy nested value views while canonical Components stay intact. */
|
|
3
|
+
export declare function compatibilityTreeBuilder(values: Map<number | undefined, CostValueInfo>, diagnostics: CostDiagnostic[]): (root: number) => CostValueInfo[] | undefined;
|
|
4
|
+
//# sourceMappingURL=cost-compatibility-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-compatibility-tree.d.ts","sourceRoot":"","sources":["../src/cost-compatibility-tree.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrE,sFAAsF;AACtF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAC9C,WAAW,EAAE,cAAc,EAAE,GAC5B,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,EAAE,GAAG,SAAS,CAmC/C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
const COMPONENT_BUDGET = 100_000;
|
|
5
|
+
/** Build bounded legacy nested value views while canonical Components stay intact. */
|
|
6
|
+
export function compatibilityTreeBuilder(values, diagnostics) {
|
|
7
|
+
let remaining = COMPONENT_BUDGET;
|
|
8
|
+
let budgetReported = false;
|
|
9
|
+
const reportBudget = (expressId) => {
|
|
10
|
+
if (budgetReported)
|
|
11
|
+
return;
|
|
12
|
+
budgetReported = true;
|
|
13
|
+
diagnostics.push({
|
|
14
|
+
Code: 'INVALID_LIST',
|
|
15
|
+
Message: `Compatibility IfcAppliedValue trees exceed the shared ${COMPONENT_BUDGET}-component budget`,
|
|
16
|
+
Severity: 'warning', expressId,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const build = (root, depth = 0, visiting = new Set()) => {
|
|
20
|
+
if (depth > 20 || visiting.has(root))
|
|
21
|
+
return undefined;
|
|
22
|
+
const source = values.get(root);
|
|
23
|
+
if (!source)
|
|
24
|
+
return undefined;
|
|
25
|
+
visiting.add(root);
|
|
26
|
+
const components = [];
|
|
27
|
+
for (const id of source.Components ?? []) {
|
|
28
|
+
if (remaining <= 0) {
|
|
29
|
+
reportBudget(root);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
remaining--;
|
|
33
|
+
const child = values.get(id);
|
|
34
|
+
if (!child || visiting.has(id))
|
|
35
|
+
continue;
|
|
36
|
+
const { components: omitted, ...copy } = child;
|
|
37
|
+
void omitted;
|
|
38
|
+
const nested = build(id, depth + 1, visiting);
|
|
39
|
+
components.push({ ...copy, ...(nested?.length ? { components: nested } : {}) });
|
|
40
|
+
}
|
|
41
|
+
visiting.delete(root);
|
|
42
|
+
return components.length ? components : undefined;
|
|
43
|
+
};
|
|
44
|
+
return build;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=cost-compatibility-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-compatibility-tree.js","sourceRoot":"","sources":["../src/cost-compatibility-tree.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAI/D,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CACtC,MAA8C,EAC9C,WAA6B;IAE7B,IAAI,SAAS,GAAG,gBAAgB,CAAC;IACjC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAQ,EAAE;QAC/C,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,yDAAyD,gBAAgB,mBAAmB;YACrG,QAAQ,EAAE,SAAS,EAAE,SAAS;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,IAAI,GAAG,EAAU,EAA+B,EAAE;QACnG,IAAI,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACzC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,SAAS,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YACzC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;YAC/C,KAAK,OAAO,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Decimal } from 'decimal.js';
|
|
2
|
+
import type { CostDiagnostic, CostQuantityDimension } from './cost-types.js';
|
|
3
|
+
export interface EvaluatedCost {
|
|
4
|
+
amount?: Decimal;
|
|
5
|
+
currency?: string;
|
|
6
|
+
dimension?: CostQuantityDimension | 'ratio';
|
|
7
|
+
rateDimension?: CostQuantityDimension;
|
|
8
|
+
quantityApplied?: Decimal;
|
|
9
|
+
/** Distinguishes currency-less monetary values from dimensionless ratios. */
|
|
10
|
+
monetary?: boolean;
|
|
11
|
+
invalid?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type CostDiagnosticSink = (Code: CostDiagnostic['Code'], Message: string, expressId: number, Severity?: CostDiagnostic['Severity']) => void;
|
|
14
|
+
export type ImplicitRateNormalizer = (operand: EvaluatedCost, dimension: CostQuantityDimension) => EvaluatedCost;
|
|
15
|
+
export declare function combineCosts(operator: string, operands: EvaluatedCost[], valueId: number, report: CostDiagnosticSink, normalizeImplicitRate?: ImplicitRateNormalizer): EvaluatedCost;
|
|
16
|
+
//# sourceMappingURL=cost-evaluation-arithmetic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-arithmetic.d.ts","sourceRoot":"","sources":["../src/cost-evaluation-arithmetic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC5C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAChE,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,KAClC,IAAI,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,qBAAqB,KACrD,aAAa,CAAC;AAyFnB,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EACxF,qBAAqB,CAAC,EAAE,sBAAsB,GAC7C,aAAa,CA0Ff"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
function sameIdentity(left, right) {
|
|
5
|
+
return left.currency === right.currency && left.dimension === right.dimension &&
|
|
6
|
+
left.rateDimension === right.rateDimension;
|
|
7
|
+
}
|
|
8
|
+
function finite(result, valueId, report) {
|
|
9
|
+
if (result.amount?.isFinite())
|
|
10
|
+
return result;
|
|
11
|
+
report('INVALID_NUMBER', `IfcCostValue #${valueId} produced a non-finite decimal`, valueId);
|
|
12
|
+
return { invalid: true };
|
|
13
|
+
}
|
|
14
|
+
function combinedRateDimension(operands, valueId, report) {
|
|
15
|
+
const dimensions = new Set(operands.map(entry => entry.rateDimension).filter(entry => entry !== undefined));
|
|
16
|
+
if (dimensions.size <= 1)
|
|
17
|
+
return dimensions.values().next().value;
|
|
18
|
+
report('INCOMPATIBLE_UNIT', 'Cannot combine cost rates with different quantity dimensions', valueId);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function multiplicationDimensions(operands, valueId, report) {
|
|
22
|
+
let moneyExponent = 0;
|
|
23
|
+
const dimensions = new Map();
|
|
24
|
+
operands.forEach((operand) => {
|
|
25
|
+
const sign = 1;
|
|
26
|
+
if (operand.monetary || operand.currency !== undefined)
|
|
27
|
+
moneyExponent += sign;
|
|
28
|
+
else if (operand.dimension !== undefined && operand.dimension !== 'ratio') {
|
|
29
|
+
dimensions.set(operand.dimension, (dimensions.get(operand.dimension) ?? 0) + sign);
|
|
30
|
+
}
|
|
31
|
+
if (operand.rateDimension !== undefined) {
|
|
32
|
+
dimensions.set(operand.rateDimension, (dimensions.get(operand.rateDimension) ?? 0) - sign);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
const nonzero = [...dimensions].filter(([, exponent]) => exponent !== 0);
|
|
36
|
+
const scalar = moneyExponent === 0 && nonzero.length === 0;
|
|
37
|
+
const quantity = moneyExponent === 0 && nonzero.length === 1 && nonzero[0][1] === 1;
|
|
38
|
+
const money = moneyExponent === 1 && nonzero.length === 0;
|
|
39
|
+
const rate = moneyExponent === 1 && nonzero.length === 1 && nonzero[0][1] === -1;
|
|
40
|
+
if (scalar)
|
|
41
|
+
return { dimension: 'ratio', monetary: false };
|
|
42
|
+
if (quantity)
|
|
43
|
+
return { dimension: nonzero[0][0], monetary: false };
|
|
44
|
+
if (money)
|
|
45
|
+
return {
|
|
46
|
+
currency: operands.find(entry => entry.monetary || entry.currency !== undefined)?.currency,
|
|
47
|
+
monetary: true,
|
|
48
|
+
};
|
|
49
|
+
if (rate)
|
|
50
|
+
return {
|
|
51
|
+
currency: operands.find(entry => entry.monetary || entry.currency !== undefined)?.currency,
|
|
52
|
+
rateDimension: nonzero[0][0], monetary: true,
|
|
53
|
+
};
|
|
54
|
+
report('INCOMPATIBLE_UNIT', 'Multiplication produces an unsupported compound dimension', valueId);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
function divisionDimensions(operands, valueId, report) {
|
|
58
|
+
const currencies = new Set(operands.map(operand => operand.currency).filter((entry) => entry !== undefined));
|
|
59
|
+
if (currencies.size > 1) {
|
|
60
|
+
report('MIXED_CURRENCY', 'Division cannot combine different currencies', valueId);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const signed = operands.map((operand, index) => ({ operand, sign: index === 0 ? 1 : -1 }));
|
|
64
|
+
let moneyExponent = 0;
|
|
65
|
+
const dimensions = new Map();
|
|
66
|
+
for (const { operand, sign } of signed) {
|
|
67
|
+
if (operand.monetary || operand.currency !== undefined)
|
|
68
|
+
moneyExponent += sign;
|
|
69
|
+
else if (operand.dimension !== undefined && operand.dimension !== 'ratio') {
|
|
70
|
+
dimensions.set(operand.dimension, (dimensions.get(operand.dimension) ?? 0) + sign);
|
|
71
|
+
}
|
|
72
|
+
if (operand.rateDimension !== undefined) {
|
|
73
|
+
dimensions.set(operand.rateDimension, (dimensions.get(operand.rateDimension) ?? 0) - sign);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const nonzero = [...dimensions].filter(([, exponent]) => exponent !== 0);
|
|
77
|
+
if (moneyExponent === 0 && nonzero.length === 0)
|
|
78
|
+
return { dimension: 'ratio', monetary: false };
|
|
79
|
+
if (moneyExponent === 0 && nonzero.length === 1 && nonzero[0][1] === 1) {
|
|
80
|
+
return { dimension: nonzero[0][0], monetary: false };
|
|
81
|
+
}
|
|
82
|
+
if (moneyExponent === 1 && nonzero.length === 0)
|
|
83
|
+
return { currency: operands[0].currency, monetary: true };
|
|
84
|
+
if (moneyExponent === 1 && nonzero.length === 1 && nonzero[0][1] === -1) {
|
|
85
|
+
return { currency: operands[0].currency, rateDimension: nonzero[0][0], monetary: true };
|
|
86
|
+
}
|
|
87
|
+
report('INCOMPATIBLE_UNIT', 'Division produces an unsupported inverse or compound dimension', valueId);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
export function combineCosts(operator, operands, valueId, report, normalizeImplicitRate) {
|
|
91
|
+
if (operands.length === 0) {
|
|
92
|
+
report('MISSING_VALUE', `IfcCostValue #${valueId} has no arithmetic operands`, valueId);
|
|
93
|
+
return { invalid: true };
|
|
94
|
+
}
|
|
95
|
+
if (operands.some(entry => entry.invalid || entry.amount === undefined)) {
|
|
96
|
+
report('MISSING_VALUE', `IfcCostValue #${valueId} depends on an invalid arithmetic operand`, valueId);
|
|
97
|
+
return { invalid: true };
|
|
98
|
+
}
|
|
99
|
+
const amounts = operands.map(entry => entry.amount);
|
|
100
|
+
if (operator === 'ADD' || operator === 'SUBTRACT') {
|
|
101
|
+
const explicitRateDimensions = new Set(operands.map(entry => entry.rateDimension).filter(entry => entry !== undefined));
|
|
102
|
+
if (explicitRateDimensions.size === 1 && normalizeImplicitRate) {
|
|
103
|
+
const dimension = explicitRateDimensions.values().next().value;
|
|
104
|
+
operands = operands.map(entry => entry.rateDimension === undefined && entry.currency !== undefined
|
|
105
|
+
? normalizeImplicitRate(entry, dimension)
|
|
106
|
+
: entry);
|
|
107
|
+
if (operands.some(entry => entry.invalid || entry.amount === undefined))
|
|
108
|
+
return { invalid: true };
|
|
109
|
+
}
|
|
110
|
+
if (operands.slice(1).some(entry => !sameIdentity(operands[0], entry))) {
|
|
111
|
+
const currencies = new Set(operands.map(entry => entry.currency).filter(Boolean));
|
|
112
|
+
report(currencies.size > 1 ? 'MIXED_CURRENCY' : 'INCOMPATIBLE_UNIT', `Cannot ${operator.toLowerCase()} values with different units`, valueId);
|
|
113
|
+
return { invalid: true };
|
|
114
|
+
}
|
|
115
|
+
const rateDimension = combinedRateDimension(operands, valueId, report);
|
|
116
|
+
if (rateDimension === false)
|
|
117
|
+
return { invalid: true };
|
|
118
|
+
const normalizedAmounts = operands.map(entry => entry.amount);
|
|
119
|
+
let amount = normalizedAmounts[0];
|
|
120
|
+
for (const next of normalizedAmounts.slice(1)) {
|
|
121
|
+
const combined = operator === 'ADD' ? amount.plus(next) : amount.minus(next);
|
|
122
|
+
const exactlyZero = operator === 'ADD' ? amount.eq(next.negated()) : amount.eq(next);
|
|
123
|
+
if (combined.isZero() && !exactlyZero) {
|
|
124
|
+
report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during ${operator.toLowerCase()}`, valueId);
|
|
125
|
+
return { invalid: true };
|
|
126
|
+
}
|
|
127
|
+
amount = combined;
|
|
128
|
+
}
|
|
129
|
+
return finite({
|
|
130
|
+
amount, currency: operands[0].currency, dimension: operands[0].dimension,
|
|
131
|
+
rateDimension, monetary: operands[0].monetary,
|
|
132
|
+
quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
|
|
133
|
+
}, valueId, report);
|
|
134
|
+
}
|
|
135
|
+
if (operator === 'MULTIPLY') {
|
|
136
|
+
const identity = multiplicationDimensions(operands, valueId, report);
|
|
137
|
+
if (!identity) {
|
|
138
|
+
return { invalid: true };
|
|
139
|
+
}
|
|
140
|
+
let amount = amounts[0];
|
|
141
|
+
for (const next of amounts.slice(1)) {
|
|
142
|
+
const multiplied = amount.mul(next);
|
|
143
|
+
if (multiplied.isZero() && !amount.isZero() && !next.isZero()) {
|
|
144
|
+
report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during multiplication`, valueId);
|
|
145
|
+
return { invalid: true };
|
|
146
|
+
}
|
|
147
|
+
amount = multiplied;
|
|
148
|
+
}
|
|
149
|
+
return finite({
|
|
150
|
+
amount, ...identity,
|
|
151
|
+
quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
|
|
152
|
+
}, valueId, report);
|
|
153
|
+
}
|
|
154
|
+
if (operator === 'DIVIDE') {
|
|
155
|
+
for (const divisor of amounts.slice(1)) {
|
|
156
|
+
if (divisor.isZero()) {
|
|
157
|
+
report('DIVISION_BY_ZERO', `IfcCostValue #${valueId} divides by zero`, valueId);
|
|
158
|
+
return { invalid: true };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const dimensions = divisionDimensions(operands, valueId, report);
|
|
162
|
+
if (dimensions === false)
|
|
163
|
+
return { invalid: true };
|
|
164
|
+
let amount = amounts[0];
|
|
165
|
+
for (const next of amounts.slice(1)) {
|
|
166
|
+
const divided = amount.div(next);
|
|
167
|
+
if (divided.isZero() && !amount.isZero()) {
|
|
168
|
+
report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during division`, valueId);
|
|
169
|
+
return { invalid: true };
|
|
170
|
+
}
|
|
171
|
+
amount = divided;
|
|
172
|
+
}
|
|
173
|
+
return finite({
|
|
174
|
+
amount, ...dimensions,
|
|
175
|
+
quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
|
|
176
|
+
}, valueId, report);
|
|
177
|
+
}
|
|
178
|
+
report('UNSUPPORTED_APPLIED_VALUE', `Arithmetic operator ${operator || '(missing)'} is not supported`, valueId);
|
|
179
|
+
return { invalid: true };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=cost-evaluation-arithmetic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-arithmetic.js","sourceRoot":"","sources":["../src/cost-evaluation-arithmetic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Decimal } from 'decimal.js';
|
|
2
|
+
import { type QuantityEvaluationCache } from './cost-quantity-evaluator.js';
|
|
3
|
+
import type { CostDiagnostic, CostEvaluationOptions, CostGraphExtraction, CostMeasureWithUnitInfo, CostQuantityDimension, CostQuantityInfo, CostUnitInfo, CostValueInfo } from './cost-types.js';
|
|
4
|
+
export interface CostEvaluationContext {
|
|
5
|
+
DecimalValue: Decimal.Constructor;
|
|
6
|
+
extraction: CostGraphExtraction;
|
|
7
|
+
values: Map<number, CostValueInfo>;
|
|
8
|
+
quantities: Map<number, CostQuantityInfo>;
|
|
9
|
+
units: Map<number, CostUnitInfo>;
|
|
10
|
+
measures: Map<number, CostMeasureWithUnitInfo>;
|
|
11
|
+
mixedProjectCurrency: boolean;
|
|
12
|
+
quantityCache: QuantityEvaluationCache;
|
|
13
|
+
diagnostics: CostDiagnostic[];
|
|
14
|
+
invalidOptions: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function diagnostic(context: CostEvaluationContext, Code: CostDiagnostic['Code'], Message: string, expressId: number, Severity?: CostDiagnostic['Severity']): void;
|
|
17
|
+
export declare function decimal(value: string, expressId: number, context: CostEvaluationContext): Decimal | undefined;
|
|
18
|
+
export declare function projectUnit(dimension: CostQuantityDimension, context: CostEvaluationContext): CostUnitInfo | undefined;
|
|
19
|
+
export declare function createContext(extraction: CostGraphExtraction, options?: CostEvaluationOptions): CostEvaluationContext;
|
|
20
|
+
//# sourceMappingURL=cost-evaluation-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-context.d.ts","sourceRoot":"","sources":["../src/cost-evaluation-context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAErG,OAAO,KAAK,EACV,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,uBAAuB,EACnF,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EACrE,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC;IAClC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,uBAAuB,CAAC;IACvC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EACtG,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAc,CAAC,UAAU,CAAW,GAAG,IAAI,CAEzE;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAC/D,OAAO,GAAG,SAAS,CAUrB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,GAC/D,YAAY,GAAG,SAAS,CAG1B;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAC/D,qBAAqB,CAwBvB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { Decimal } from 'decimal.js';
|
|
5
|
+
import { quantityEvaluationCache } from './cost-quantity-evaluator.js';
|
|
6
|
+
import { isZeroCostNumericLexeme } from './cost-step-lexemes.js';
|
|
7
|
+
export function diagnostic(context, Code, Message, expressId, Severity = 'error') {
|
|
8
|
+
context.diagnostics.push({ Code, Message, Severity, expressId });
|
|
9
|
+
}
|
|
10
|
+
export function decimal(value, expressId, context) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = new context.DecimalValue(value);
|
|
13
|
+
if (parsed.isFinite() && !(parsed.isZero() && !isZeroCostNumericLexeme(value)))
|
|
14
|
+
return parsed;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
diagnostic(context, 'INVALID_NUMBER', `#${expressId} contains an invalid decimal: ${String(error)}`, expressId);
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
diagnostic(context, 'INVALID_NUMBER', `#${expressId} contains a non-finite or underflowed decimal`, expressId);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
export function projectUnit(dimension, context) {
|
|
24
|
+
const id = context.extraction.ProjectUnits[dimension];
|
|
25
|
+
return id === undefined ? undefined : context.units.get(id);
|
|
26
|
+
}
|
|
27
|
+
export function createContext(extraction, options) {
|
|
28
|
+
const maximumPrecision = 10_000;
|
|
29
|
+
const requestedPrecision = options?.Precision;
|
|
30
|
+
const invalidOptions = requestedPrecision !== undefined &&
|
|
31
|
+
(!Number.isInteger(requestedPrecision) || requestedPrecision < 1 || requestedPrecision > maximumPrecision);
|
|
32
|
+
const diagnostics = invalidOptions ? [{
|
|
33
|
+
Code: 'INVALID_NUMBER',
|
|
34
|
+
Message: `Cost evaluation Precision must be an integer from 1 through ${maximumPrecision}; received ${String(requestedPrecision)}`,
|
|
35
|
+
Severity: 'error',
|
|
36
|
+
}] : [];
|
|
37
|
+
const DecimalValue = Decimal.clone({
|
|
38
|
+
precision: invalidOptions ? 34 : requestedPrecision ?? 34,
|
|
39
|
+
rounding: Decimal.ROUND_HALF_EVEN, maxE: 6144, minE: -6144,
|
|
40
|
+
});
|
|
41
|
+
const values = new Map();
|
|
42
|
+
for (const value of extraction.CostValues)
|
|
43
|
+
if (value.expressId !== undefined)
|
|
44
|
+
values.set(value.expressId, value);
|
|
45
|
+
return {
|
|
46
|
+
DecimalValue, extraction, values,
|
|
47
|
+
quantities: new Map(extraction.CostQuantities.map(value => [value.expressId, value])),
|
|
48
|
+
units: new Map(extraction.Units.map(value => [value.expressId, value])),
|
|
49
|
+
measures: new Map(extraction.MeasuresWithUnit.map(value => [value.expressId, value])),
|
|
50
|
+
mixedProjectCurrency: extraction.Diagnostics.some(entry => entry.Code === 'MIXED_CURRENCY'),
|
|
51
|
+
quantityCache: quantityEvaluationCache(), diagnostics, invalidOptions,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=cost-evaluation-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-context.js","sourceRoot":"","sources":["../src/cost-evaluation-context.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAgC,MAAM,8BAA8B,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAmBjE,MAAM,UAAU,UAAU,CAAC,OAA8B,EAAE,IAA4B,EAAE,OAAe,EACtG,SAAiB,EAAE,WAAuC,OAAO;IACjE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,KAAa,EAAE,SAAiB,EAAE,OAA8B;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,SAAS,iCAAiC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAChH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,SAAS,+CAA+C,EAAE,SAAS,CAAC,CAAC;IAC/G,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,SAAgC,EAAE,OAA8B;IAEhE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAA+B,EAAE,OAA+B;IAEhE,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,MAAM,kBAAkB,GAAG,OAAO,EAAE,SAAS,CAAC;IAC9C,MAAM,cAAc,GAAG,kBAAkB,KAAK,SAAS;QACrD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,GAAG,CAAC,IAAI,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;IAC7G,MAAM,WAAW,GAAqB,cAAc,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,+DAA+D,gBAAgB,cAAc,MAAM,CAAC,kBAAkB,CAAC,EAAE;YAClI,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACR,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE;QACzD,QAAQ,EAAE,OAAO,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI;KAC3D,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,UAAU;QAAE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjH,OAAO;QACL,YAAY,EAAE,UAAU,EAAE,MAAM;QAChC,UAAU,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACvE,QAAQ,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,oBAAoB,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC;QAC3F,aAAa,EAAE,uBAAuB,EAAE,EAAE,WAAW,EAAE,cAAc;KACtE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EvaluatedCost } from './cost-evaluation-arithmetic.js';
|
|
2
|
+
import type { CostDiagnostic, CostEvaluationResult, CostGraphExtraction } from './cost-types.js';
|
|
3
|
+
export declare function unsupportedCostEvaluation(extraction: CostGraphExtraction, expressId: number): CostEvaluationResult | undefined;
|
|
4
|
+
export declare function costEvaluationResult(expressId: number, value: EvaluatedCost, diagnostics: CostDiagnostic[]): CostEvaluationResult;
|
|
5
|
+
//# sourceMappingURL=cost-evaluation-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-result.d.ts","sourceRoot":"","sources":["../src/cost-evaluation-result.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,GACjD,oBAAoB,GAAG,SAAS,CAOlC;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,GACrE,oBAAoB,CAMtB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export function unsupportedCostEvaluation(extraction, expressId) {
|
|
5
|
+
if (extraction.SchemaVersion !== 'IFC2X3' && extraction.SchemaVersion !== 'IFC5')
|
|
6
|
+
return undefined;
|
|
7
|
+
return { expressId, Diagnostics: [{
|
|
8
|
+
Code: extraction.SchemaVersion === 'IFC2X3' ? 'IFC2X3_PARTIAL_READ' : 'UNSUPPORTED_SCHEMA',
|
|
9
|
+
Message: `${extraction.SchemaVersion} cost values are preserved for inspection but not evaluated`,
|
|
10
|
+
Severity: 'warning', expressId,
|
|
11
|
+
}] };
|
|
12
|
+
}
|
|
13
|
+
export function costEvaluationResult(expressId, value, diagnostics) {
|
|
14
|
+
return {
|
|
15
|
+
expressId, Amount: value.invalid ? undefined : value.amount?.toString(), Currency: value.currency,
|
|
16
|
+
Dimension: value.rateDimension ?? value.dimension, QuantityApplied: value.quantityApplied?.toString(),
|
|
17
|
+
Diagnostics: diagnostics,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cost-evaluation-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluation-result.js","sourceRoot":"","sources":["../src/cost-evaluation-result.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAK/D,MAAM,UAAU,yBAAyB,CACvC,UAA+B,EAAE,SAAiB;IAElD,IAAI,UAAU,CAAC,aAAa,KAAK,QAAQ,IAAI,UAAU,CAAC,aAAa,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACnG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;gBAChC,IAAI,EAAE,UAAU,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB;gBAC1F,OAAO,EAAE,GAAG,UAAU,CAAC,aAAa,6DAA6D;gBACjG,QAAQ,EAAE,SAAS,EAAE,SAAS;aAC/B,CAAC,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EAAE,KAAoB,EAAE,WAA6B;IAEtE,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACjG,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE;QACrG,WAAW,EAAE,WAAW;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CostEvaluationOptions, CostEvaluationResult, CostGraphExtraction } from './cost-types.js';
|
|
2
|
+
/** Evaluate one IFC4/IFC4X3 applied-value expression using decimal arithmetic. */
|
|
3
|
+
export declare function evaluateCostValue(extraction: CostGraphExtraction, expressId: number, options?: CostEvaluationOptions): CostEvaluationResult;
|
|
4
|
+
/** Evaluate a cost item, including IFC category-based totals of nested cost items. */
|
|
5
|
+
export declare function evaluateCostItem(extraction: CostGraphExtraction, expressId: number, options?: CostEvaluationOptions): CostEvaluationResult;
|
|
6
|
+
//# sourceMappingURL=cost-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-evaluator.d.ts","sourceRoot":"","sources":["../src/cost-evaluator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EACtC,MAAM,iBAAiB,CAAC;AAuOhE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EAClF,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAMvD;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EACjF,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAqIvD"}
|