@hatiolab/figure-model 0.1.33 → 0.1.35

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.
Files changed (41) hide show
  1. package/dist/index.d.ts +6 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/v3-asset-types.d.ts +26 -0
  6. package/dist/v3-asset-types.d.ts.map +1 -1
  7. package/dist/v3-asset.d.ts.map +1 -1
  8. package/dist/v3-asset.js +7 -2
  9. package/dist/v3-asset.js.map +1 -1
  10. package/dist/v3-capabilities.js +1 -0
  11. package/dist/v3-capabilities.js.map +1 -1
  12. package/dist/v3-driver.d.ts +16 -0
  13. package/dist/v3-driver.d.ts.map +1 -0
  14. package/dist/v3-driver.js +145 -0
  15. package/dist/v3-driver.js.map +1 -0
  16. package/dist/v3-from-v2.d.ts +109 -9
  17. package/dist/v3-from-v2.d.ts.map +1 -1
  18. package/dist/v3-from-v2.js +912 -119
  19. package/dist/v3-from-v2.js.map +1 -1
  20. package/dist/v3-gate.d.ts +56 -4
  21. package/dist/v3-gate.d.ts.map +1 -1
  22. package/dist/v3-gate.js +178 -21
  23. package/dist/v3-gate.js.map +1 -1
  24. package/dist/v3-graph-types.d.ts +6 -1
  25. package/dist/v3-graph-types.d.ts.map +1 -1
  26. package/dist/v3-graph.d.ts +17 -1
  27. package/dist/v3-graph.d.ts.map +1 -1
  28. package/dist/v3-graph.js +144 -20
  29. package/dist/v3-graph.js.map +1 -1
  30. package/dist/v3-kernel-version.d.ts +8 -0
  31. package/dist/v3-kernel-version.d.ts.map +1 -0
  32. package/dist/v3-kernel-version.js +11 -0
  33. package/dist/v3-kernel-version.js.map +1 -0
  34. package/dist/v3-mesh-compare.d.ts +27 -0
  35. package/dist/v3-mesh-compare.d.ts.map +1 -0
  36. package/dist/v3-mesh-compare.js +198 -0
  37. package/dist/v3-mesh-compare.js.map +1 -0
  38. package/docs/v3-motion-contract.md +178 -0
  39. package/docs/v3-operator-contracts.md +4 -0
  40. package/docs/v3-shape-dimension-contract.md +146 -0
  41. package/package.json +2 -1
package/dist/v3-gate.js CHANGED
@@ -21,8 +21,9 @@
21
21
  import { compileV3Asset } from "./v3-asset.js";
22
22
  import { compileV3Graph } from "./v3-graph.js";
23
23
  import { AXES, SKIN } from "./types.js";
24
+ import { transformPoints, v3ShapePoints } from "./v3-mesh-compare.js";
24
25
  /** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
25
- export function v3WorldBoxesOf(geometry, writers) {
26
+ export function v3WorldBoxesOf(geometry, writers, options = {}) {
26
27
  const out = [];
27
28
  for (const g of geometry) {
28
29
  if (!('pose' in g))
@@ -33,15 +34,23 @@ export function v3WorldBoxesOf(geometry, writers) {
33
34
  ? [d.radius * 2, d.length, d.radius * 2]
34
35
  : g.shape.provider === 'sphere'
35
36
  ? [d.radiusX * 2, d.radiusY * 2, d.radiusZ * 2]
36
- : [d.width, d.height, d.depth];
37
+ : g.shape.provider === 'frustum'
38
+ ? [Math.max(d.radiusTop, d.radiusBottom) * 2, d.height, Math.max(d.radiusTop, d.radiusBottom) * 2]
39
+ : g.shape.provider === 'ellipticCylinder'
40
+ ? [d.radiusX * 2, d.length, d.radiusZ * 2]
41
+ : [d.width, d.height, d.depth];
37
42
  const r = g.pose.r;
38
43
  const extent = AXES.map((_, a) => local.reduce((s, v, i) => s + Math.abs(r[a][i]) * v, 0));
39
- out.push({
44
+ const box = {
40
45
  part,
41
46
  centre: { x: g.pose.t[0], y: g.pose.t[1], z: g.pose.t[2] },
42
47
  extent: { x: extent[0], y: extent[1], z: extent[2] },
48
+ dims: local,
43
49
  rotation: r
44
- });
50
+ };
51
+ if (options.points)
52
+ box.points = transformPoints(v3ShapePoints(g.shape, g.segments), r, g.pose.t);
53
+ out.push(box);
45
54
  }
46
55
  return out;
47
56
  }
@@ -54,30 +63,179 @@ export function v3WritersOf(asset) {
54
63
  return writers;
55
64
  }
56
65
  /**
57
- * Inspect an asset against its declared occupancy at its stored design inputs and state defaults.
58
- * `stateOverrides` follows `compileV3Asset(...).evaluate` and lets a caller inspect another pose.
66
+ * Why the extremes of every state-dependent coordinate lie at the corners of the state box, or why that cannot be
67
+ * shown. The basis: a value that is multilinear in the state inputs (each input to degree one) or a monotone
68
+ * function of such values takes its extremes at the corners. That holds through `add`, through `mul` and `geomean`
69
+ * when the two arguments depend on disjoint state inputs (x·x does not qualify), through `div` by a state-free
70
+ * denominator, and through translations in `rigid`. It does not hold through `sin`, `axis-turn`, a
71
+ * state-dependent rotation angle in `rigid`, a state-dependent denominator, or a product of two values that share
72
+ * an input. Returns the reasons it fails, empty when it holds.
59
73
  */
60
- export function inspectV3Asset(asset, stateOverrides = {}) {
74
+ export function cornerExtremalBasis(asset, dependence) {
75
+ const reasons = [];
76
+ const dep = (ref) => dependence[ref] ?? [];
77
+ const shares = (a, b) => dep(a).some(x => dep(b).includes(x));
78
+ for (const n of asset.document.model.nodes) {
79
+ const stateful = n.args.filter(a => dep(a).length);
80
+ if (!stateful.length)
81
+ continue;
82
+ switch (n.op) {
83
+ case 'add@1':
84
+ case 'compose@1':
85
+ case 'attach@1':
86
+ case 'place@1':
87
+ case 'member@1':
88
+ case 'feature@1':
89
+ case 'assembly@1':
90
+ case 'repeat@1':
91
+ case 'select-item@1':
92
+ case 'map-point@1':
93
+ case 'point@1':
94
+ break;
95
+ case 'mul@1':
96
+ case 'geomean@1':
97
+ for (let i = 0; i < n.args.length; i++)
98
+ for (let j = i + 1; j < n.args.length; j++)
99
+ if (shares(n.args[i], n.args[j]))
100
+ reasons.push(`${n.id}: ${n.op} of two values that both depend on ${dep(n.args[i]).filter(x => dep(n.args[j]).includes(x)).join(', ')}`);
101
+ break;
102
+ case 'div@1':
103
+ if (dep(n.args[1]).length)
104
+ reasons.push(`${n.id}: division by a value that depends on ${dep(n.args[1]).join(', ')}`);
105
+ break;
106
+ case 'rigid@1':
107
+ for (const a of n.args.slice(3))
108
+ if (dep(a).length)
109
+ reasons.push(`${n.id}: a rotation angle depends on ${dep(a).join(', ')}`);
110
+ break;
111
+ case 'axis-slide@1':
112
+ if (n.args.slice(0, 3).some(a => dep(a).length))
113
+ reasons.push(`${n.id}: the slide axis depends on state`);
114
+ break;
115
+ default:
116
+ // sin, axis-turn, layout operators, distance, providers with a state-dependent argument are not corner-extremal
117
+ // by this basis; providers are shapes whose extents are the arguments themselves, which is fine only when the
118
+ // arguments are (handled by their own nodes), so treat shape providers as pass-through.
119
+ if (n.op.endsWith('-shape@1') || n.op.endsWith('-shape@2') || n.op === 'rounded-box@1' || n.op === 'rounded-box@2' || n.op === 'hollow-box@1' || n.op === 'hollow-box@2' || n.op === 'portal-profile@1')
120
+ break;
121
+ reasons.push(`${n.id}: ${n.op} with a state-dependent argument (${[...new Set(stateful.flatMap(dep))].join(', ')})`);
122
+ }
123
+ }
124
+ return reasons;
125
+ }
126
+ /** The state inputs of an asset with their declared bounds. */
127
+ function stateInputs(asset) {
128
+ return asset.document.model.inputs.filter(i => i.role === 'state').map(i => ({ id: i.id, min: i.min, max: i.max }));
129
+ }
130
+ /**
131
+ * Inspect an asset against its declared occupancy. Without `at`, the whole valid state range is covered: every
132
+ * state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
133
+ * evaluated state is a violation. The occupancy is never widened to make one go away.
134
+ */
135
+ export function inspectV3Asset(asset, options = {}) {
136
+ // Backwards compatible: a plain record is `at`.
137
+ const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || Object.keys(options).length === 0 ? options : { at: options };
61
138
  const compiled = compileV3Asset(asset);
62
- const evaluated = compiled.evaluate(stateOverrides);
139
+ const graph = compileV3Graph(asset.document.model);
140
+ const inputs = stateInputs(asset);
63
141
  const violations = [];
142
+ const seen = new Set();
143
+ const push = (v) => {
144
+ const key = JSON.stringify([v.code, v.part, v.axis]);
145
+ if (seen.has(key)) {
146
+ // Keep the worst distance for a part and axis across the states evaluated.
147
+ const prior = violations.find(x => x.code === v.code && x.part === v.part && x.axis === v.axis);
148
+ if ((v.mm ?? 0) > (prior.mm ?? 0))
149
+ Object.assign(prior, v);
150
+ return;
151
+ }
152
+ seen.add(key);
153
+ violations.push(v);
154
+ };
64
155
  if (!asset.occupancy) {
65
156
  violations.push({ code: 'OCCUPANCY_UNDECLARED', detail: 'the asset does not declare the volume it occupies or the face it stands on' });
66
- return { violations };
157
+ return { coverage: { method: 'defaults', inputs, states: 0, detail: 'nothing to inspect against' }, violations };
67
158
  }
68
- // The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
69
- const values = compileV3Graph(asset.document.model).evaluate({
70
- ...asset.designInputs,
71
- ...asset.stateDefaults,
72
- ...stateOverrides
73
- }).values;
159
+ // Which states to evaluate.
160
+ let states;
161
+ let coverage;
162
+ if (opts.at) {
163
+ states = [opts.at];
164
+ coverage = { method: 'defaults', inputs, states: 1, detail: 'one state, as asked' };
165
+ }
166
+ else if (!inputs.length) {
167
+ states = [{}];
168
+ coverage = { method: 'proven', inputs, states: 1, detail: 'no state input; the rest pose is the only pose' };
169
+ }
170
+ else {
171
+ const unprovable = cornerExtremalBasis(asset, graph.dependence);
172
+ const maxCorners = opts.maxCornerInputs ?? 10;
173
+ const allCorners = inputs.length <= maxCorners;
174
+ const corners = [];
175
+ if (allCorners) {
176
+ for (let mask = 0; mask < 1 << inputs.length; mask++)
177
+ corners.push(Object.fromEntries(inputs.map((i, k) => [i.id, mask & (1 << k) ? i.max : i.min])));
178
+ }
179
+ else {
180
+ // Too many inputs to enumerate: the all-min and all-max corners and every single flip from each. Not all corners.
181
+ const lows = Object.fromEntries(inputs.map(i => [i.id, i.min]));
182
+ const highs = Object.fromEntries(inputs.map(i => [i.id, i.max]));
183
+ corners.push(lows, highs);
184
+ for (const i of inputs)
185
+ corners.push({ ...lows, [i.id]: i.max }, { ...highs, [i.id]: i.min });
186
+ unprovable.push(`${inputs.length} state inputs exceed the corner cap of ${maxCorners}; only ${corners.length} of ${2 ** inputs.length} corners were evaluated`);
187
+ }
188
+ if (!unprovable.length) {
189
+ states = corners;
190
+ coverage = {
191
+ method: 'proven',
192
+ inputs,
193
+ states: corners.length,
194
+ detail: `every state-dependent value reaches the geometry through corner-extremal operations (multilinear in the state inputs, or monotone functions of such values), so the extremes are at the ${corners.length} corners of the state box; all ${corners.length} evaluated`
195
+ };
196
+ }
197
+ else {
198
+ const steps = opts.sweepSteps ?? 9;
199
+ const sweeps = [];
200
+ for (const i of inputs)
201
+ for (let k = 0; k < steps; k++) {
202
+ const v = i.min + ((i.max - i.min) * k) / (steps - 1);
203
+ sweeps.push({ [i.id]: v });
204
+ }
205
+ states = [...corners, ...sweeps];
206
+ coverage = {
207
+ method: 'sampled',
208
+ inputs,
209
+ states: states.length,
210
+ sweepSteps: steps,
211
+ unprovable,
212
+ detail: `not proven (${unprovable.join('; ')}). Checked at ${states.length} states: ${corners.length} corners and each input in ${steps} steps with the others at their defaults. A violation may lie between these states; this is not a bound over the range`
213
+ };
214
+ }
215
+ }
216
+ for (const state of states) {
217
+ const evaluated = compiled.evaluate(state);
218
+ inspectOne(asset, graph, evaluated.geometry, state, push);
219
+ }
220
+ const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults }).values;
74
221
  const extent = {
75
222
  x: values[asset.occupancy.extent.x],
76
223
  y: values[asset.occupancy.extent.y],
77
224
  z: values[asset.occupancy.extent.z]
78
225
  };
79
- const placement = asset.occupancy.placement;
80
- const boxes = v3WorldBoxesOf(evaluated.geometry, v3WritersOf(asset));
226
+ return { extent, placement: asset.occupancy.placement, coverage, violations };
227
+ }
228
+ function inspectOne(asset, graph, geometry, state, push) {
229
+ const occupancy = asset.occupancy;
230
+ // The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
231
+ const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...state }).values;
232
+ const extent = {
233
+ x: values[occupancy.extent.x],
234
+ y: values[occupancy.extent.y],
235
+ z: values[occupancy.extent.z]
236
+ };
237
+ const placement = occupancy.placement;
238
+ const boxes = v3WorldBoxesOf(geometry, v3WritersOf(asset));
81
239
  const round = (v) => Math.round(v * 1e4) / 1e4;
82
240
  // The declared box: X and Z centred, Y from the floor (ADR-0065).
83
241
  const low = { x: -extent.x / 2, y: 0, z: -extent.z / 2 };
@@ -90,7 +248,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
90
248
  const over = Math.max(box.centre[axis] + reach - high[axis], low[axis] - (box.centre[axis] - reach));
91
249
  if (over > SKIN) {
92
250
  const mm = round(over);
93
- violations.push({
251
+ push({
94
252
  code: 'PART_OUTSIDE_OCCUPANCY',
95
253
  part: box.part,
96
254
  axis,
@@ -107,7 +265,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
107
265
  if (lowest && placement === 'floor') {
108
266
  const gap = lowest.centre.y - lowest.extent.y / 2 - low.y;
109
267
  if (gap > SKIN)
110
- violations.push({
268
+ push({
111
269
  code: 'PARTS_OFF_PLACEMENT_FACE',
112
270
  part: lowest.part,
113
271
  axis: 'y',
@@ -118,7 +276,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
118
276
  if (highest && placement === 'ceiling') {
119
277
  const gap = high.y - (highest.centre.y + highest.extent.y / 2);
120
278
  if (gap > SKIN)
121
- violations.push({
279
+ push({
122
280
  code: 'PARTS_OFF_PLACEMENT_FACE',
123
281
  part: highest.part,
124
282
  axis: 'y',
@@ -126,6 +284,5 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
126
284
  detail: `the highest part '${highest.part}' hangs ${round(gap)} mm below the ceiling the figure is declared to hang from`
127
285
  });
128
286
  }
129
- return { extent, placement, violations };
130
287
  }
131
288
  //# sourceMappingURL=v3-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3-gate.js","sourceRoot":"","sources":["../src/v3-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v3-gate.js","sourceRoot":"","sources":["../src/v3-gate.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@ export interface V3Pose {
45
45
  t: number[];
46
46
  }
47
47
  export interface V3Shape {
48
- provider: 'box' | 'cylinder' | 'roundedBox' | 'portal' | 'sphere' | 'polygon' | 'hollowBox';
48
+ provider: 'box' | 'cylinder' | 'roundedBox' | 'portal' | 'sphere' | 'polygon' | 'hollowBox' | 'frustum' | 'ellipticCylinder' | 'roundedBoxXZ' | 'hollowBoxXZ';
49
49
  dimensions: Record<string, number>;
50
50
  profile?: Array<{
51
51
  id: string;
@@ -85,6 +85,11 @@ export interface V3GraphEvaluation {
85
85
  }
86
86
  export interface V3CompiledGraph {
87
87
  outputTypes: Record<string, V3ValueType>;
88
+ /**
89
+ * Which state inputs each value can change with (shape-dimension contract §2). A value absent here depends on
90
+ * design inputs and constants only. Part of the type, kept beside unit and frame rather than inside them.
91
+ */
92
+ dependence: Record<string, string[]>;
88
93
  order: string[];
89
94
  evaluate(input: Record<string, number>): V3GraphEvaluation;
90
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v3-graph-types.d.ts","sourceRoot":"","sources":["../src/v3-graph-types.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAC5F,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AACnD,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ;IAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC3E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAC1B;AACD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AACD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AACD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,aAAa,GAAG,cAAc,CAAA;IACvC,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AACD,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;IACb,CAAC,EAAE,MAAM,EAAE,CAAA;CACZ;AACD,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,KAAK,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;IAC3F,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtD;AACD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AACD,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AACD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,OAAO,GAAG,YAAY,CAAA;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,CAAC,EAAE,GAAG,CAAA;CACX;AACD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAC5D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,EAAE,GACR,MAAM,GACN,OAAO,GACP,aAAa,GACb;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,KAAK,CAAC,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GACnD;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAA;AACjC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACtC,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AACD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACxC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAA;CAC3D"}
1
+ {"version":3,"file":"v3-graph-types.d.ts","sourceRoot":"","sources":["../src/v3-graph-types.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,29 @@
1
1
  import { V3ContractError as ContractError } from './v3-contract.ts';
2
2
  import type { V3CompiledGraph } from './v3-graph-types.ts';
3
+ /**
4
+ * What an operator does with an argument that depends on a state input (shape-dimension contract §2).
5
+ * follows the output depends on state too; shapes, poses and arithmetic
6
+ * refuses a state-dependent argument is a compile error; layout counts and pitches (structure and cost)
7
+ * An operator without a policy fails to compile the moment such an argument reaches it (STATE_POLICY). There is
8
+ * no list of banned operators to keep in sync: the policy is on the operator itself.
9
+ */
10
+ export type V3StatePolicy = 'follows' | 'refuses';
3
11
  export { ContractError };
12
+ /** Every operator's state policy, by name, for the guard test and for readers of the contract. */
13
+ export declare const V3_OPERATOR_STATE_POLICY: Readonly<Record<string, V3StatePolicy>>;
4
14
  /** Every operator the kernel knows, by name. `v3-graph.test.ts` holds the list still. */
5
15
  export declare const V3_OPERATORS: readonly string[];
6
16
  /**
7
- * The operators whose output is not affine in the design inputs. `geomean@1` is the only one
17
+ * The operators whose output is not affine in the **design** inputs. `geomean@1` is the only one
8
18
  * (ADR-0087 decision 2 addendum). Adding a second means another ADR conversation, and the test that
9
19
  * pins this list goes red until it has happened.
10
20
  */
11
21
  export declare const V3_NON_AFFINE_OPERATORS: readonly string[];
22
+ /**
23
+ * The operators whose output is not affine in a **state** input: a rotation matrix is sin/cos in the joint
24
+ * angle (motion contract, "two corrections"). Rigid in space, so placement stays rigid; the 8-size check is a
25
+ * rest-pose regression check and says nothing about motion.
26
+ */
27
+ export declare const V3_STATE_NON_AFFINE_OPERATORS: readonly string[];
12
28
  export declare function compileV3Graph(source: unknown): V3CompiledGraph;
13
29
  //# sourceMappingURL=v3-graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3-graph.d.ts","sourceRoot":"","sources":["../src/v3-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,qBAAqB,CAAA;AAWhF,OAAO,EAAE,aAAa,EAAE,CAAA;AAqkBxB,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAoC,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAiC,CAAA;AAgBtF,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAE/D"}
1
+ {"version":3,"file":"v3-graph.d.ts","sourceRoot":"","sources":["../src/v3-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,qBAAqB,CAAA;AAIhF;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AASjD,OAAO,EAAE,aAAa,EAAE,CAAA;AAkrBxB,kGAAkG;AAClG,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5E,CAAA;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAoC,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAiC,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAAmC,CAAA;AAgB9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAE/D"}
package/dist/v3-graph.js CHANGED
@@ -385,6 +385,48 @@ Object.assign(ops, {
385
385
  ];
386
386
  }
387
387
  },
388
+ // Motion (docs/v3-motion-contract.md). The axis is a unit vector in the `to` frame; right-handed rotation.
389
+ // axis-turn@1 is rigid in space but sin/cos in q: not affine in a state input.
390
+ 'axis-turn@1': {
391
+ ports: ['pose'],
392
+ params: ['from', 'to'],
393
+ types(t, p, n) {
394
+ requireTypes(t, [ratio, ratio, ratio, angle], p);
395
+ return [transformType(n.params.from, n.params.to)];
396
+ },
397
+ run: ([ax0, ay0, az0, q], p) => {
398
+ // A unit axis, written with six decimals by authors and converters: 1e-6 of slack, then normalised exactly.
399
+ const n = Math.hypot(ax0, ay0, az0);
400
+ if (Math.abs(n - 1) > 1e-6)
401
+ fail('AXIS', p, 'unit axis required');
402
+ const ax = ax0 / n, ay = ay0 / n, az = az0 / n;
403
+ const c = Math.cos(q), s = Math.sin(q), k = 1 - c;
404
+ return [
405
+ {
406
+ r: [
407
+ [c + ax * ax * k, ax * ay * k - az * s, ax * az * k + ay * s],
408
+ [ay * ax * k + az * s, c + ay * ay * k, ay * az * k - ax * s],
409
+ [az * ax * k - ay * s, az * ay * k + ax * s, c + az * az * k]
410
+ ],
411
+ t: [0, 0, 0]
412
+ }
413
+ ];
414
+ }
415
+ },
416
+ 'axis-slide@1': {
417
+ ports: ['pose'],
418
+ params: ['from', 'to'],
419
+ types(t, p, n) {
420
+ requireTypes(t, [ratio, ratio, ratio, length], p);
421
+ return [transformType(n.params.from, n.params.to)];
422
+ },
423
+ run: ([ax, ay, az, q], p) => {
424
+ const n = Math.hypot(ax, ay, az);
425
+ if (Math.abs(n - 1) > 1e-6)
426
+ fail('AXIS', p, 'unit axis required');
427
+ return [{ r: identity(), t: [(ax / n) * q, (ay / n) * q, (az / n) * q] }];
428
+ }
429
+ },
388
430
  'compose@1': {
389
431
  ports: ['pose'],
390
432
  types(t, p) {
@@ -473,6 +515,64 @@ Object.assign(ops, {
473
515
  return [{ provider: 'sphere', dimensions: { radiusX, radiusY, radiusZ } }];
474
516
  }
475
517
  },
518
+ // A cylinder whose two ends have different radii (ADR-0087 decision 2 ruling 1). Equal radii make a cylinder,
519
+ // a zero radius a cone. The axis is local Y; `radiusTop` is at +Y as three's CylinderGeometry orders them.
520
+ 'frustum-shape@1': {
521
+ ports: ['shape'],
522
+ params: ['frame'],
523
+ types(t, p, n) {
524
+ requireTypes(t, [length, length, length], p);
525
+ return [{ kind: 'shape', provider: 'frustum', frame: n.params.frame }];
526
+ },
527
+ run: ([radiusTop, radiusBottom, height], p) => {
528
+ if (!(height > 0 && radiusTop >= 0 && radiusBottom >= 0 && radiusTop + radiusBottom > 0))
529
+ fail('GEOMETRY_DOMAIN', p, 'positive height and non-negative radii, not both zero, required');
530
+ return [{ provider: 'frustum', dimensions: { radiusTop, radiusBottom, height } }];
531
+ }
532
+ },
533
+ // Shape-dimension contract §1 (2026-09-22): every round thing has per-axis dimensions. The @1 forms stay valid and
534
+ // mean the equal case; @2 writes both axes. A renderer draws the ellipse or elliptic corner it is given.
535
+ 'cylinder-shape@2': {
536
+ ports: ['shape'],
537
+ params: ['frame'],
538
+ types(t, p, n) {
539
+ requireTypes(t, [length, length, length], p);
540
+ return [{ kind: 'shape', provider: 'ellipticCylinder', frame: n.params.frame }];
541
+ },
542
+ run: ([radiusX, radiusZ, length], p) => {
543
+ if (!(radiusX > 0 && radiusZ > 0 && length > 0))
544
+ fail('GEOMETRY_DOMAIN', p, 'positive radii and length required');
545
+ return [{ provider: 'ellipticCylinder', dimensions: { radiusX, radiusZ, length } }];
546
+ }
547
+ },
548
+ 'rounded-box@2': {
549
+ ports: ['shape'],
550
+ params: ['frame'],
551
+ types(t, p, n) {
552
+ requireTypes(t, Array(5).fill(length), p);
553
+ return [{ kind: 'shape', provider: 'roundedBoxXZ', frame: n.params.frame }];
554
+ },
555
+ run: ([width, height, depth, roundX, roundZ], p) => {
556
+ if (!(width > 0 && height > 0 && depth > 0 && roundX >= 0 && roundZ >= 0 && roundX <= width / 2 && roundZ <= depth / 2))
557
+ fail('GEOMETRY_DOMAIN', p, 'positive dimensions and corner semi-axes within half the section required');
558
+ return [{ provider: 'roundedBoxXZ', dimensions: { width, height, depth, roundX, roundZ } }];
559
+ }
560
+ },
561
+ 'hollow-box@2': {
562
+ ports: ['shape'],
563
+ params: ['frame'],
564
+ types(t, p, n) {
565
+ requireTypes(t, Array(8).fill(length), p);
566
+ return [{ kind: 'shape', provider: 'hollowBoxXZ', frame: n.params.frame }];
567
+ },
568
+ run: ([width, height, depth, roundX, roundZ, wallX, wallZ, floor], p) => {
569
+ if (!(width > 0 && height > 0 && depth > 0 && roundX >= 0 && roundZ >= 0 && roundX <= width / 2 && roundZ <= depth / 2))
570
+ fail('GEOMETRY_DOMAIN', p, 'positive dimensions and corner semi-axes within half the section required');
571
+ if (!(wallX > 0 && wallZ > 0 && wallX < width / 2 && wallZ < depth / 2 && floor >= 0 && floor < height))
572
+ fail('GEOMETRY_DOMAIN', p, 'walls thinner than half the section and a floor thinner than the height required');
573
+ return [{ provider: 'hollowBoxXZ', dimensions: { width, height, depth, roundX, roundZ, wallX, wallZ, floor } }];
574
+ }
575
+ },
476
576
  // A closed section in the local X–Z plane (profile x → X, profile y → Z, as V2 draws it), pushed along Y.
477
577
  'polygon-shape@1': {
478
578
  ports: ['shape'],
@@ -519,11 +619,13 @@ Object.assign(ops, {
519
619
  fail('TYPE', p, 'shape required');
520
620
  const names = t[0].provider === 'portal'
521
621
  ? ['top', 'bottomLeft', 'bottomRight', 'openingTop', 'frontTop']
522
- : ['box', 'roundedBox', 'sphere', 'hollowBox'].includes(t[0].provider)
622
+ : ['box', 'roundedBox', 'roundedBoxXZ', 'sphere', 'hollowBox', 'hollowBoxXZ'].includes(t[0].provider)
523
623
  ? ['left', 'right', 'bottom', 'top', 'back', 'front']
524
624
  : t[0].provider === 'polygon'
525
625
  ? ['bottom', 'top']
526
- : ['start', 'end', 'radialBottom'];
626
+ : t[0].provider === 'frustum' || t[0].provider === 'ellipticCylinder'
627
+ ? ['start', 'end']
628
+ : ['start', 'end', 'radialBottom'];
527
629
  if (!names.includes(n.params.name))
528
630
  fail('UNKNOWN_FEATURE', p, n.params.name);
529
631
  // Provider-aligned feature axes, not outward-normal mating axes.
@@ -549,16 +651,18 @@ Object.assign(ops, {
549
651
  }
550
652
  : s.provider === 'polygon'
551
653
  ? { bottom: [0, -d.height / 2, 0], top: [0, d.height / 2, 0] }
552
- : ['box', 'roundedBox', 'hollowBox'].includes(s.provider)
553
- ? {
554
- left: [-d.width / 2, 0, 0],
555
- right: [d.width / 2, 0, 0],
556
- bottom: [0, -d.height / 2, 0],
557
- top: [0, d.height / 2, 0],
558
- back: [0, 0, -d.depth / 2],
559
- front: [0, 0, d.depth / 2]
560
- }
561
- : { start: [0, -d.length / 2, 0], end: [0, d.length / 2, 0], radialBottom: [0, 0, -d.radius] };
654
+ : s.provider === 'frustum' || s.provider === 'ellipticCylinder'
655
+ ? { start: [0, -(d.height ?? d.length) / 2, 0], end: [0, (d.height ?? d.length) / 2, 0] }
656
+ : ['box', 'roundedBox', 'roundedBoxXZ', 'hollowBox', 'hollowBoxXZ'].includes(s.provider)
657
+ ? {
658
+ left: [-d.width / 2, 0, 0],
659
+ right: [d.width / 2, 0, 0],
660
+ bottom: [0, -d.height / 2, 0],
661
+ top: [0, d.height / 2, 0],
662
+ back: [0, 0, -d.depth / 2],
663
+ front: [0, 0, d.depth / 2]
664
+ }
665
+ : { start: [0, -d.length / 2, 0], end: [0, d.length / 2, 0], radialBottom: [0, 0, -d.radius] };
562
666
  return [{ r: identity(), t: points[n.params.name] }];
563
667
  }
564
668
  },
@@ -575,14 +679,26 @@ Object.assign(ops, {
575
679
  });
576
680
  // Template members are values, not separately rendered placements.
577
681
  ops['member@1'] = { ...ops['place@1'], geometry: undefined };
682
+ // Shape-dimension contract §2: every operator declares what it does with a state-dependent argument. Layout
683
+ // counts and pitches are structure and cost, design-only; everything else may follow state.
684
+ for (const [name, op] of Object.entries(ops))
685
+ op.state = name === 'fit-pitch@1' || name === 'fixed-count@1' ? 'refuses' : 'follows';
686
+ /** Every operator's state policy, by name, for the guard test and for readers of the contract. */
687
+ export const V3_OPERATOR_STATE_POLICY = Object.freeze(Object.fromEntries(Object.entries(ops).map(([k, op]) => [k, op.state])));
578
688
  /** Every operator the kernel knows, by name. `v3-graph.test.ts` holds the list still. */
579
689
  export const V3_OPERATORS = Object.freeze(Object.keys(ops));
580
690
  /**
581
- * The operators whose output is not affine in the design inputs. `geomean@1` is the only one
691
+ * The operators whose output is not affine in the **design** inputs. `geomean@1` is the only one
582
692
  * (ADR-0087 decision 2 addendum). Adding a second means another ADR conversation, and the test that
583
693
  * pins this list goes red until it has happened.
584
694
  */
585
695
  export const V3_NON_AFFINE_OPERATORS = Object.freeze(['geomean@1']);
696
+ /**
697
+ * The operators whose output is not affine in a **state** input: a rotation matrix is sin/cos in the joint
698
+ * angle (motion contract, "two corrections"). Rigid in space, so placement stays rigid; the 8-size check is a
699
+ * rest-pose regression check and says nothing about motion.
700
+ */
701
+ export const V3_STATE_NON_AFFINE_OPERATORS = Object.freeze(['axis-turn@1']);
586
702
  function checkedValue(value, type, path) {
587
703
  if (Array.isArray(type))
588
704
  return num(value, path);
@@ -613,7 +729,7 @@ function compileInternal(source) {
613
729
  if (!Array.isArray(source[k]))
614
730
  fail('SCHEMA', k, 'array required');
615
731
  // Snapshot protects a compiled plan from later authoring mutations.
616
- const m = structuredClone(source), writers = new Map(), types = new Map(), stateful = new Set(), nodes = new Map(), order = [], active = [];
732
+ const m = structuredClone(source), writers = new Map(), types = new Map(), dependence = new Map(), nodes = new Map(), order = [], active = [];
617
733
  const assign = (name, owner) => {
618
734
  id(name, owner);
619
735
  if (writers.has(name))
@@ -627,7 +743,7 @@ function compileInternal(source) {
627
743
  if (p.role && !['design', 'state'].includes(p.role))
628
744
  fail('SCHEMA', p.id, 'unknown input role');
629
745
  if (p.role === 'state')
630
- stateful.add(p.id);
746
+ dependence.set(p.id, new Set([p.id]));
631
747
  if (num(p.min, p.id) > num(p.max, p.id))
632
748
  fail('RANGE', p.id, 'min > max');
633
749
  if (p.unit === 'count') {
@@ -676,12 +792,19 @@ function compileInternal(source) {
676
792
  return types.get(ref);
677
793
  });
678
794
  const resultTypes = op.types(inputTypes, n.id, n);
679
- const dependsOnState = n.args.some(ref => stateful.has(ref));
680
- if (dependsOnState && ['fit-pitch@1', 'fixed-count@1'].includes(n.op))
681
- fail('TOPOLOGY_STATE', n.id, 'layout must depend on design inputs only');
795
+ const depends = new Set();
796
+ for (const ref of n.args)
797
+ for (const s of dependence.get(ref) ?? [])
798
+ depends.add(s);
799
+ if (depends.size) {
800
+ if (op.state === undefined)
801
+ fail('STATE_POLICY', n.id, `${n.op} declares no policy for a state-dependent argument (${[...depends].join(', ')})`);
802
+ if (op.state === 'refuses')
803
+ fail('TOPOLOGY_STATE', n.id, `${n.op} must depend on design inputs only; it depends on ${[...depends].join(', ')}`);
804
+ }
682
805
  op.ports.forEach((p, i) => types.set(n.outputs[p], resultTypes[i]));
683
- if (dependsOnState)
684
- Object.values(n.outputs).forEach(ref => stateful.add(ref));
806
+ if (depends.size)
807
+ Object.values(n.outputs).forEach(ref => dependence.set(ref, new Set(depends)));
685
808
  active.pop();
686
809
  visited.add(name);
687
810
  order.push(n);
@@ -690,6 +813,7 @@ function compileInternal(source) {
690
813
  visit(name);
691
814
  return {
692
815
  outputTypes: Object.fromEntries([...types].map(([k, v]) => [k, structuredClone(v)])),
816
+ dependence: Object.fromEntries([...dependence].map(([k, v]) => [k, [...v].sort()])),
693
817
  order: order.map(n => n.id),
694
818
  evaluate(input) {
695
819
  fields(input, m.inputs.map(p => p.id), [], 'input values');