@openmle/omle.js 0.1.0-rc4

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 (71) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +172 -0
  3. package/dist/engine/clustering.d.ts +8 -0
  4. package/dist/engine/clustering.d.ts.map +1 -0
  5. package/dist/engine/clustering.js +161 -0
  6. package/dist/engine/clustering.js.map +1 -0
  7. package/dist/engine/executor.d.ts +57 -0
  8. package/dist/engine/executor.d.ts.map +1 -0
  9. package/dist/engine/executor.js +1160 -0
  10. package/dist/engine/executor.js.map +1 -0
  11. package/dist/engine/explain.d.ts +68 -0
  12. package/dist/engine/explain.d.ts.map +1 -0
  13. package/dist/engine/explain.js +401 -0
  14. package/dist/engine/explain.js.map +1 -0
  15. package/dist/engine/linear.d.ts +5 -0
  16. package/dist/engine/linear.d.ts.map +1 -0
  17. package/dist/engine/linear.js +37 -0
  18. package/dist/engine/linear.js.map +1 -0
  19. package/dist/engine/naive_bayes.d.ts +5 -0
  20. package/dist/engine/naive_bayes.d.ts.map +1 -0
  21. package/dist/engine/naive_bayes.js +102 -0
  22. package/dist/engine/naive_bayes.js.map +1 -0
  23. package/dist/engine/nn.d.ts +5 -0
  24. package/dist/engine/nn.d.ts.map +1 -0
  25. package/dist/engine/nn.js +34 -0
  26. package/dist/engine/nn.js.map +1 -0
  27. package/dist/engine/ops.d.ts +14 -0
  28. package/dist/engine/ops.d.ts.map +1 -0
  29. package/dist/engine/ops.js +244 -0
  30. package/dist/engine/ops.js.map +1 -0
  31. package/dist/engine/predicates.d.ts +5 -0
  32. package/dist/engine/predicates.d.ts.map +1 -0
  33. package/dist/engine/predicates.js +105 -0
  34. package/dist/engine/predicates.js.map +1 -0
  35. package/dist/engine/preprocess.d.ts +31 -0
  36. package/dist/engine/preprocess.d.ts.map +1 -0
  37. package/dist/engine/preprocess.js +1112 -0
  38. package/dist/engine/preprocess.js.map +1 -0
  39. package/dist/engine/svm.d.ts +5 -0
  40. package/dist/engine/svm.d.ts.map +1 -0
  41. package/dist/engine/svm.js +241 -0
  42. package/dist/engine/svm.js.map +1 -0
  43. package/dist/engine/tree.d.ts +6 -0
  44. package/dist/engine/tree.d.ts.map +1 -0
  45. package/dist/engine/tree.js +274 -0
  46. package/dist/engine/tree.js.map +1 -0
  47. package/dist/engine/validate_inputs.d.ts +22 -0
  48. package/dist/engine/validate_inputs.d.ts.map +1 -0
  49. package/dist/engine/validate_inputs.js +225 -0
  50. package/dist/engine/validate_inputs.js.map +1 -0
  51. package/dist/index.d.ts +12 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +16 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/io.d.ts +9 -0
  56. package/dist/io.d.ts.map +1 -0
  57. package/dist/io.js +93 -0
  58. package/dist/io.js.map +1 -0
  59. package/dist/ir.d.ts +489 -0
  60. package/dist/ir.d.ts.map +1 -0
  61. package/dist/ir.js +41 -0
  62. package/dist/ir.js.map +1 -0
  63. package/dist/resolve.d.ts +20 -0
  64. package/dist/resolve.d.ts.map +1 -0
  65. package/dist/resolve.js +138 -0
  66. package/dist/resolve.js.map +1 -0
  67. package/dist/validate.d.ts +15 -0
  68. package/dist/validate.d.ts.map +1 -0
  69. package/dist/validate.js +332 -0
  70. package/dist/validate.js.map +1 -0
  71. package/package.json +51 -0
@@ -0,0 +1,274 @@
1
+ // Decision tree and tree ensemble execution for the reference engine.
2
+ import { scalarToNumber } from '../ir.js';
3
+ import { applyPostTransform, tensorToData } from './ops.js';
4
+ import { resolveTensorValue } from '../resolve.js';
5
+ import { evalPredicate } from './predicates.js';
6
+ // ── Tree execution ────────────────────────────────────────────────────────────
7
+ export function executeTree(tree, flatInputs, // shape [N * numSlots]
8
+ numSlots, N, resolved) {
9
+ const tensorIndex = resolved?.tensorIndex ?? new Map();
10
+ const leafVecSize = tree.leaf_width ?? 0;
11
+ const outputWidth = leafVecSize > 1 ? leafVecSize : 1;
12
+ const out = new Float64Array(N * outputWidth);
13
+ // Pre-extract tensor data arrays
14
+ const splitThresholdTensor = resolveTensorValue(tree.split_threshold, tensorIndex);
15
+ const splitThresholds = splitThresholdTensor ? tensorToData(splitThresholdTensor).data : null;
16
+ // Detect if the split thresholds were originally stored as float32 (e.g. XGBoost models).
17
+ // In that case, feature values must be cast to float32 before comparison to match native behaviour.
18
+ const threshIsFloat32 = splitThresholdTensor != null &&
19
+ !splitThresholdTensor.float64_data?.length &&
20
+ !splitThresholdTensor.raw_data &&
21
+ (splitThresholdTensor.float32_data?.length ?? 0) > 0;
22
+ const leafValueTensor = resolveTensorValue(tree.leaf_value, tensorIndex);
23
+ const leafValues = leafValueTensor ? tensorToData(leafValueTensor).data : null;
24
+ const leafVectorTensor = resolveTensorValue(tree.leaf_vector, tensorIndex);
25
+ const leafVector = leafVectorTensor ? tensorToData(leafVectorTensor).data : null;
26
+ // Build complex predicate index for O(1) lookup
27
+ const complexMap = new Map();
28
+ for (const cp of tree.complex_predicates ?? []) {
29
+ complexMap.set(cp.node_index, cp.predicate);
30
+ }
31
+ for (let row = 0; row < N; row++) {
32
+ const rowOffset = row * numSlots;
33
+ const _resolver = (_, __) => undefined; // unused for compact splits
34
+ let nodeIdx = 0;
35
+ let _loopGuard = 0;
36
+ while (true) {
37
+ if (++_loopGuard > 100_000)
38
+ throw new Error(`Tree traversal loop at node ${nodeIdx} row ${row}`);
39
+ const kind = tree.node_kind?.[nodeIdx] ?? 'LEAF';
40
+ if (kind === 'LEAF') {
41
+ if (outputWidth > 1) {
42
+ const vecIdx = (tree.leaf_vector_index?.[nodeIdx] ?? 0);
43
+ for (let k = 0; k < outputWidth; k++) {
44
+ out[row * outputWidth + k] = leafVector?.[vecIdx + k] ?? 0;
45
+ }
46
+ }
47
+ else {
48
+ out[row] = leafValues?.[nodeIdx] ?? 0;
49
+ }
50
+ break;
51
+ }
52
+ // BRANCH: evaluate split
53
+ const childOffset = tree.children_offset?.[nodeIdx] ?? 0;
54
+ const complexPred = complexMap.get(nodeIdx);
55
+ if (complexPred) {
56
+ // Full predicate fallback — build resolver from flat slot space
57
+ const slotResolver = (name, _r) => {
58
+ const slotIdx = parseInt(name);
59
+ if (!isNaN(slotIdx))
60
+ return flatInputs[rowOffset + slotIdx];
61
+ return undefined;
62
+ };
63
+ const result = evalPredicate(complexPred, slotResolver, row);
64
+ const goLeft = result !== false;
65
+ nodeIdx = tree.children_index?.[childOffset + (goLeft ? 0 : 1)] ?? 0;
66
+ continue;
67
+ }
68
+ const featureIdx = tree.split_feature?.[nodeIdx] ?? 0;
69
+ const featureValRaw = flatInputs[rowOffset + featureIdx];
70
+ const isMissing = isNaN(featureValRaw);
71
+ if (isMissing) {
72
+ nodeIdx = tree.default_child?.[nodeIdx] ?? 0;
73
+ continue;
74
+ }
75
+ // When thresholds are float32 (e.g. XGBoost), cast feature value to float32
76
+ // so that boundary comparisons match the native engine's behaviour.
77
+ const featureVal = threshIsFloat32 ? Math.fround(featureValRaw) : featureValRaw;
78
+ const op = tree.split_op?.[nodeIdx] ?? 'SPLIT_OP_UNSPECIFIED';
79
+ const threshold = splitThresholds?.[nodeIdx] ?? 0;
80
+ const goLeft = evalSplitOp(op, featureVal, threshold, nodeIdx, tree);
81
+ nodeIdx = tree.children_index?.[childOffset + (goLeft ? 0 : 1)] ?? 0;
82
+ }
83
+ }
84
+ return out;
85
+ }
86
+ function evalSplitOp(op, val, threshold, nodeIdx, tree) {
87
+ switch (op) {
88
+ case 'LESS_THAN': return val < threshold;
89
+ case 'LESS_OR_EQUAL': return val <= threshold;
90
+ case 'GREATER_THAN': return val > threshold;
91
+ case 'GREATER_OR_EQUAL': return val >= threshold;
92
+ case 'EQUAL': return val === threshold;
93
+ case 'NOT_EQUAL': return val !== threshold;
94
+ case 'IS_MISSING': return isNaN(val);
95
+ case 'IN_SET': {
96
+ const offset = tree.category_set_offset?.[nodeIdx] ?? 0;
97
+ const count = tree.category_set_count?.[nodeIdx] ?? 0;
98
+ for (let j = offset; j < offset + count; j++) {
99
+ if (tree.category_set?.[j] === val)
100
+ return true;
101
+ }
102
+ return false;
103
+ }
104
+ case 'NOT_IN_SET': {
105
+ const offset = tree.category_set_offset?.[nodeIdx] ?? 0;
106
+ const count = tree.category_set_count?.[nodeIdx] ?? 0;
107
+ for (let j = offset; j < offset + count; j++) {
108
+ if (tree.category_set?.[j] === val)
109
+ return false;
110
+ }
111
+ return true;
112
+ }
113
+ default: return true;
114
+ }
115
+ }
116
+ // ── TreeEnsemble execution ────────────────────────────────────────────────────
117
+ export function executeTreeEnsemble(ensemble, flatInputs, numSlots, N, resolved) {
118
+ const trees = ensemble.trees ?? [];
119
+ if (trees.length === 0)
120
+ return new Float64Array(N);
121
+ // Determine per-tree output width from first tree
122
+ const firstTree = trees[0];
123
+ const leafVecSize = firstTree.leaf_width ?? 0;
124
+ const perTreeWidth = leafVecSize > 1 ? leafVecSize : 1;
125
+ const treeOutputs = trees.map(t => executeTree(t, flatInputs, numSlots, N, resolved));
126
+ const weightsTensor = resolveTensorValue(ensemble.tree_weights, resolved.tensorIndex);
127
+ const weightsData = weightsTensor ? tensorToData(weightsTensor).data : null;
128
+ const aggregation = ensemble.aggregation ?? 'SUM';
129
+ const baseScore = ensemble.base_score != null ? scalarToNumber(ensemble.base_score) : null;
130
+ const treeGroup = ensemble.tree_group;
131
+ // Determine output width after aggregation
132
+ const _numClasses = perTreeWidth > 1 ? perTreeWidth : 1;
133
+ let outWidth;
134
+ if (treeGroup && treeGroup.length === trees.length) {
135
+ // multiclass with class-grouped trees
136
+ outWidth = Math.max(...treeGroup) + 1;
137
+ }
138
+ else {
139
+ outWidth = perTreeWidth;
140
+ }
141
+ const rawScores = new Float64Array(N * outWidth);
142
+ if (baseScore !== null && baseScore !== undefined) {
143
+ rawScores.fill(baseScore);
144
+ }
145
+ switch (aggregation) {
146
+ case 'SUM':
147
+ case 'WEIGHTED_SUM': {
148
+ for (let t = 0; t < trees.length; t++) {
149
+ const w = weightsData?.[t] ?? 1;
150
+ const treeOut = treeOutputs[t];
151
+ if (treeGroup) {
152
+ const classIdx = treeGroup[t];
153
+ for (let row = 0; row < N; row++) {
154
+ rawScores[row * outWidth + classIdx] += w * treeOut[row];
155
+ }
156
+ }
157
+ else if (perTreeWidth > 1) {
158
+ for (let row = 0; row < N; row++) {
159
+ for (let k = 0; k < perTreeWidth; k++) {
160
+ rawScores[row * outWidth + k] += w * treeOut[row * perTreeWidth + k];
161
+ }
162
+ }
163
+ }
164
+ else {
165
+ for (let row = 0; row < N; row++) {
166
+ rawScores[row] += w * treeOut[row];
167
+ }
168
+ }
169
+ }
170
+ break;
171
+ }
172
+ case 'AVERAGE':
173
+ case 'WEIGHTED_AVERAGE': {
174
+ let totalWeight = 0;
175
+ for (let t = 0; t < trees.length; t++) {
176
+ const w = weightsData?.[t] ?? 1;
177
+ totalWeight += w;
178
+ const treeOut = treeOutputs[t];
179
+ for (let row = 0; row < N; row++) {
180
+ if (perTreeWidth > 1) {
181
+ for (let k = 0; k < perTreeWidth; k++) {
182
+ rawScores[row * outWidth + k] += w * treeOut[row * perTreeWidth + k];
183
+ }
184
+ }
185
+ else {
186
+ rawScores[row] += w * treeOut[row];
187
+ }
188
+ }
189
+ }
190
+ if (totalWeight > 0) {
191
+ for (let i = 0; i < rawScores.length; i++)
192
+ rawScores[i] /= totalWeight;
193
+ }
194
+ break;
195
+ }
196
+ case 'SOFT_VOTE': {
197
+ // Average per-class tree outputs. With treeGroup, each tree contributes to one class.
198
+ const classCounts = new Float64Array(outWidth);
199
+ for (let t = 0; t < trees.length; t++) {
200
+ const w = weightsData?.[t] ?? 1;
201
+ const treeOut = treeOutputs[t];
202
+ if (treeGroup) {
203
+ const classIdx = treeGroup[t];
204
+ classCounts[classIdx] += w;
205
+ for (let row = 0; row < N; row++) {
206
+ rawScores[row * outWidth + classIdx] += w * treeOut[row];
207
+ }
208
+ }
209
+ else {
210
+ for (let row = 0; row < N; row++) {
211
+ for (let k = 0; k < outWidth; k++) {
212
+ rawScores[row * outWidth + k] += w * (treeOut[row * outWidth + k] ?? treeOut[row]);
213
+ }
214
+ }
215
+ classCounts[0] += w;
216
+ }
217
+ }
218
+ for (let k = 0; k < outWidth; k++) {
219
+ if (classCounts[k] > 0) {
220
+ for (let row = 0; row < N; row++)
221
+ rawScores[row * outWidth + k] /= classCounts[k];
222
+ }
223
+ }
224
+ break;
225
+ }
226
+ case 'MAJORITY_VOTE': {
227
+ const votes = new Array(N).fill(0).map(() => new Map());
228
+ for (let t = 0; t < trees.length; t++) {
229
+ const treeOut = treeOutputs[t];
230
+ for (let row = 0; row < N; row++) {
231
+ const label = Math.round(treeOut[row]);
232
+ votes[row].set(label, (votes[row].get(label) ?? 0) + 1);
233
+ }
234
+ }
235
+ for (let row = 0; row < N; row++) {
236
+ let bestLabel = 0, bestCount = 0;
237
+ for (const [label, count] of votes[row]) {
238
+ if (count > bestCount) {
239
+ bestCount = count;
240
+ bestLabel = label;
241
+ }
242
+ }
243
+ rawScores[row] = bestLabel;
244
+ }
245
+ break;
246
+ }
247
+ case 'MIN': {
248
+ rawScores.fill(Infinity);
249
+ for (const treeOut of treeOutputs) {
250
+ for (let i = 0; i < rawScores.length; i++) {
251
+ rawScores[i] = Math.min(rawScores[i], treeOut[i]);
252
+ }
253
+ }
254
+ break;
255
+ }
256
+ case 'MAX': {
257
+ rawScores.fill(-Infinity);
258
+ for (const treeOut of treeOutputs) {
259
+ for (let i = 0; i < rawScores.length; i++) {
260
+ rawScores[i] = Math.max(rawScores[i], treeOut[i]);
261
+ }
262
+ }
263
+ break;
264
+ }
265
+ default:
266
+ // SUM fallback
267
+ for (const treeOut of treeOutputs) {
268
+ for (let i = 0; i < rawScores.length; i++)
269
+ rawScores[i] += treeOut[i];
270
+ }
271
+ }
272
+ return applyPostTransform(rawScores, ensemble.post_transform, outWidth);
273
+ }
274
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/engine/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { OMLEModel } from '../ir.js';
2
+ export interface InputIssue {
3
+ kind: 'missing' | 'wrong_type' | 'wrong_shape';
4
+ name: string;
5
+ expected?: string;
6
+ got?: string;
7
+ message: string;
8
+ }
9
+ export interface InputValidationResult {
10
+ valid: boolean;
11
+ issues: InputIssue[];
12
+ }
13
+ /**
14
+ * Validates that `inputs` satisfies the model's declared input contract.
15
+ *
16
+ * Checks (in order, per input):
17
+ * 1. Presence — every name in model.inputs (or model_schema.features as fallback) must be present.
18
+ * 2. dtype compatibility — the JS type of the value must be compatible with the declared dtype.
19
+ * 3. Shape — rank must match; fixed dimensions (> 0) must match exactly; ≤ 0 is treated as dynamic.
20
+ */
21
+ export declare function validateInputs(model: OMLEModel, inputs: Record<string, unknown>): InputValidationResult;
22
+ //# sourceMappingURL=validate_inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_inputs.d.ts","sourceRoot":"","sources":["../../src/engine/validate_inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,UAAU,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,qBAAqB,CAqCvB"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Validates that `inputs` satisfies the model's declared input contract.
3
+ *
4
+ * Checks (in order, per input):
5
+ * 1. Presence — every name in model.inputs (or model_schema.features as fallback) must be present.
6
+ * 2. dtype compatibility — the JS type of the value must be compatible with the declared dtype.
7
+ * 3. Shape — rank must match; fixed dimensions (> 0) must match exactly; ≤ 0 is treated as dynamic.
8
+ */
9
+ export function validateInputs(model, inputs) {
10
+ const issues = [];
11
+ const specs = buildInputSpecs(model);
12
+ if (specs.length === 0) {
13
+ return { valid: true, issues: [] };
14
+ }
15
+ for (const spec of specs) {
16
+ const provided = Object.prototype.hasOwnProperty.call(inputs, spec.name)
17
+ ? inputs[spec.name]
18
+ : undefined;
19
+ if (provided === undefined || provided === null) {
20
+ issues.push({
21
+ kind: 'missing',
22
+ name: spec.name,
23
+ expected: spec.typeHint,
24
+ message: spec.typeHint
25
+ ? `Missing input "${spec.name}" (expected ${spec.typeHint})`
26
+ : `Missing input "${spec.name}"`,
27
+ });
28
+ continue;
29
+ }
30
+ if (spec.dtype) {
31
+ const issue = checkDtype(spec.name, provided, spec.dtype);
32
+ if (issue) {
33
+ issues.push(issue);
34
+ continue;
35
+ }
36
+ }
37
+ if (spec.shape) {
38
+ const issue = checkShape(spec.name, provided, spec.shape, spec.typeHint);
39
+ if (issue)
40
+ issues.push(issue);
41
+ }
42
+ }
43
+ return { valid: issues.length === 0, issues };
44
+ }
45
+ function buildInputSpecs(model) {
46
+ if (model.inputs && model.inputs.length > 0) {
47
+ return model.inputs.map(specFromInputSpec);
48
+ }
49
+ const features = model.model_schema?.features ?? [];
50
+ const named = features.filter((f) => typeof f.name === 'string' && f.name.length > 0);
51
+ return named.map(specFromFeature);
52
+ }
53
+ function specFromInputSpec(inp) {
54
+ return { name: inp.name, dtype: inp.type?.dtype, shape: normShape(inp.type), typeHint: typeHint(inp.type) };
55
+ }
56
+ function specFromFeature(feat) {
57
+ return { name: feat.name, dtype: feat.type?.dtype, shape: normShape(feat.type), typeHint: typeHint(feat.type) };
58
+ }
59
+ // ── Shape normalization ──────────────────────────────────���────────────────────
60
+ // JSON may encode int64 shape dims as strings (e.g. "-1"), coerce them to numbers.
61
+ function normShape(t) {
62
+ if (!t?.shape || t.shape.length === 0)
63
+ return undefined;
64
+ return t.shape.map(d => Number(d));
65
+ }
66
+ function typeHint(t) {
67
+ if (!t)
68
+ return undefined;
69
+ const shape = t.shape && t.shape.length > 0
70
+ ? `[${t.shape.map(d => (Number(d) <= 0 ? 'N' : Number(d))).join('×')}]`
71
+ : undefined;
72
+ if (t.dtype && shape)
73
+ return `${t.dtype}${shape}`;
74
+ if (t.dtype)
75
+ return t.dtype;
76
+ return shape;
77
+ }
78
+ // ── Shape inference ───────────────────────────────────────────────────────────
79
+ function inferShape(v) {
80
+ if (typeof v === 'number' || typeof v === 'boolean' || typeof v === 'string')
81
+ return [];
82
+ if (v instanceof Float32Array || v instanceof Float64Array ||
83
+ v instanceof Int8Array || v instanceof Int16Array ||
84
+ v instanceof Int32Array || v instanceof Uint8Array ||
85
+ v instanceof Uint16Array || v instanceof Uint32Array) {
86
+ return [v.length];
87
+ }
88
+ if (Array.isArray(v)) {
89
+ if (v.length === 0)
90
+ return [0];
91
+ const inner = v[0];
92
+ if (Array.isArray(inner))
93
+ return [v.length, inner.length];
94
+ return [v.length];
95
+ }
96
+ if (typeof v === 'object' && v !== null) {
97
+ const obj = v;
98
+ if (Array.isArray(obj['shape']))
99
+ return obj['shape'].map(Number);
100
+ }
101
+ return null;
102
+ }
103
+ // ── Shape check ──────────────────────────────────────────────────────��────────
104
+ function checkShape(name, value, expectedShape, typeHint) {
105
+ const actualShape = inferShape(value);
106
+ if (actualShape === null)
107
+ return null;
108
+ // A scalar (actualShape=[]) is compatible with any 1-D expected shape where
109
+ // every fixed dim is 1 or dynamic — e.g. expected [-1] or [1].
110
+ if (actualShape.length === 0) {
111
+ const ok = expectedShape.every(d => Number(d) <= 0 || Number(d) === 1);
112
+ if (ok)
113
+ return null;
114
+ }
115
+ // When the expected shape's first dim is dynamic (-1/0), a scalar or 1-D
116
+ // array can represent a single-row batch — allow rank-1 vs rank-2 mismatch
117
+ // only when the batch dim is dynamic and remaining dims match.
118
+ const expected = expectedShape.map(Number);
119
+ const isDynamicBatch = expected[0] <= 0;
120
+ if (actualShape.length !== expected.length) {
121
+ // Tolerate: actual=[k] vs expected=[-1, k] (single-row batch as flat array)
122
+ if (isDynamicBatch && actualShape.length === expected.length - 1) {
123
+ const inner = expected.slice(1);
124
+ const mismatch = inner.findIndex((d, i) => d > 0 && d !== actualShape[i]);
125
+ if (mismatch === -1)
126
+ return null;
127
+ }
128
+ const expStr = shapeStr(expected);
129
+ const gotStr = shapeStr(actualShape);
130
+ return {
131
+ kind: 'wrong_shape',
132
+ name,
133
+ expected: typeHint ?? expStr,
134
+ got: gotStr,
135
+ message: `Input "${name}": rank mismatch — expected ${expStr}, got ${gotStr}`,
136
+ };
137
+ }
138
+ // Same rank — check each fixed dimension.
139
+ for (let i = 0; i < expected.length; i++) {
140
+ const expDim = expected[i];
141
+ const actDim = actualShape[i];
142
+ if (expDim > 0 && actDim !== expDim) {
143
+ const expStr = shapeStr(expected);
144
+ const gotStr = shapeStr(actualShape);
145
+ return {
146
+ kind: 'wrong_shape',
147
+ name,
148
+ expected: typeHint ?? expStr,
149
+ got: gotStr,
150
+ message: `Input "${name}": shape mismatch at dim ${i} — expected ${expStr}, got ${gotStr}`,
151
+ };
152
+ }
153
+ }
154
+ return null;
155
+ }
156
+ function shapeStr(shape) {
157
+ if (shape.length === 0)
158
+ return 'scalar';
159
+ return `[${shape.map(d => (d <= 0 ? 'N' : d)).join('×')}]`;
160
+ }
161
+ // ── Dtype check ───────────────────────────────────────────────────────────────
162
+ const NUMERIC_DTYPES = new Set([
163
+ 'BOOL',
164
+ 'INT8', 'INT16', 'INT32', 'INT64',
165
+ 'UINT8', 'UINT16', 'UINT32', 'UINT64',
166
+ 'FLOAT16', 'FLOAT32', 'FLOAT64',
167
+ 'DATE', 'TIME', 'TIMESTAMP',
168
+ ]);
169
+ function checkDtype(name, value, dtype) {
170
+ const expectsString = dtype === 'STRING' || dtype === 'BYTES';
171
+ const expectsNumeric = NUMERIC_DTYPES.has(dtype);
172
+ const jsType = inferJsType(value);
173
+ if (expectsString && jsType !== 'string' && jsType !== 'string[]' && jsType !== 'TensorData') {
174
+ return {
175
+ kind: 'wrong_type',
176
+ name,
177
+ expected: dtype,
178
+ got: jsType,
179
+ message: `Input "${name}": expected string value for dtype ${dtype}, got ${jsType}`,
180
+ };
181
+ }
182
+ if (expectsNumeric && jsType === 'string') {
183
+ return {
184
+ kind: 'wrong_type',
185
+ name,
186
+ expected: dtype,
187
+ got: jsType,
188
+ message: `Input "${name}": expected numeric value for dtype ${dtype}, got string`,
189
+ };
190
+ }
191
+ return null;
192
+ }
193
+ function inferJsType(v) {
194
+ if (typeof v === 'string')
195
+ return 'string';
196
+ if (typeof v === 'boolean')
197
+ return 'boolean';
198
+ if (typeof v === 'number')
199
+ return 'numeric';
200
+ if (v instanceof Float32Array || v instanceof Float64Array ||
201
+ v instanceof Int32Array || v instanceof Int8Array ||
202
+ v instanceof Uint8Array || v instanceof Uint16Array ||
203
+ v instanceof Uint32Array || v instanceof BigInt64Array)
204
+ return 'numeric';
205
+ if (Array.isArray(v)) {
206
+ if (v.length === 0)
207
+ return 'array';
208
+ return inferJsType(v[0]) + '[]';
209
+ }
210
+ if (typeof v === 'object' && v !== null) {
211
+ const obj = v;
212
+ if ('dtype' in obj && 'data' in obj)
213
+ return 'TensorData';
214
+ // IR dense tensor format: {string_data, float64_data, ...}
215
+ if ('string_data' in obj)
216
+ return 'string[]';
217
+ if ('float64_data' in obj || 'float32_data' in obj ||
218
+ 'int32_data' in obj || 'int64_data' in obj ||
219
+ 'bool_data' in obj || 'raw_data' in obj)
220
+ return 'numeric[]';
221
+ return 'object';
222
+ }
223
+ return typeof v;
224
+ }
225
+ //# sourceMappingURL=validate_inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_inputs.js","sourceRoot":"","sources":["../../src/engine/validate_inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export * from './ir.js';
2
+ export * from './io.js';
3
+ export * from './resolve.js';
4
+ export * from './validate.js';
5
+ export { Engine } from './engine/executor.js';
6
+ export { validateInputs } from './engine/validate_inputs.js';
7
+ export type { InputIssue, InputValidationResult } from './engine/validate_inputs.js';
8
+ export type { InferenceInput, InferenceOutput, SerializedTensor, StepSnapshot, SteppedResult, VerifyResult, CaseVerifyResult, OutputVerifyResult } from './engine/executor.js';
9
+ export type { ModelExplain, TreeEnsembleExplain, TreeExplainItem, TreePathStep, LinearExplain, LinearContribution, NaiveBayesExplain, NaiveBayesFeatureContrib, ClusteringExplain, CentroidDistance, } from './engine/explain.js';
10
+ export type { TensorData } from './engine/ops.js';
11
+ export { tensorToData, applyPostTransform } from './engine/ops.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACrF,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/K,YAAY,EACV,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAChE,aAAa,EAAE,kBAAkB,EACjC,iBAAiB,EAAE,wBAAwB,EAC3C,iBAAiB,EAAE,gBAAgB,GACpC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ // omle.js — Public API
2
+ //
3
+ // Usage:
4
+ // import { fromJSON, validate, Engine } from '@openmle/omle.js';
5
+ // const model = fromJSON(jsonString);
6
+ // const result = validate(model);
7
+ // const engine = new Engine(model);
8
+ // const outputs = engine.run({ X: { dtype: 'FLOAT64', shape: [1, 4], data: new Float64Array([...]) } });
9
+ export * from './ir.js';
10
+ export * from './io.js';
11
+ export * from './resolve.js';
12
+ export * from './validate.js';
13
+ export { Engine } from './engine/executor.js';
14
+ export { validateInputs } from './engine/validate_inputs.js';
15
+ export { tensorToData, applyPostTransform } from './engine/ops.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,EAAE;AACF,SAAS;AACT,mEAAmE;AACnE,wCAAwC;AACxC,oCAAoC;AACpC,sCAAsC;AACtC,2GAA2G;AAE3G,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAU7D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { OMLEModel } from './ir.js';
2
+ export declare function fromJSON(json: string | object): OMLEModel;
3
+ export declare function toJSON(model: OMLEModel, pretty?: boolean): string;
4
+ export declare function loadFile(path: string): Promise<OMLEModel>;
5
+ export declare function loadBlob(blob: {
6
+ text(): Promise<string>;
7
+ }): Promise<OMLEModel>;
8
+ export declare function saveFile(model: OMLEModel, path: string, pretty?: boolean): Promise<void>;
9
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAwBD,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,UAAQ,GAAG,MAAM,CAE/D;AAUD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAS/D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IAAE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAEpF;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3F"}