@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.
- package/LICENSE +201 -0
- package/README.md +172 -0
- package/dist/engine/clustering.d.ts +8 -0
- package/dist/engine/clustering.d.ts.map +1 -0
- package/dist/engine/clustering.js +161 -0
- package/dist/engine/clustering.js.map +1 -0
- package/dist/engine/executor.d.ts +57 -0
- package/dist/engine/executor.d.ts.map +1 -0
- package/dist/engine/executor.js +1160 -0
- package/dist/engine/executor.js.map +1 -0
- package/dist/engine/explain.d.ts +68 -0
- package/dist/engine/explain.d.ts.map +1 -0
- package/dist/engine/explain.js +401 -0
- package/dist/engine/explain.js.map +1 -0
- package/dist/engine/linear.d.ts +5 -0
- package/dist/engine/linear.d.ts.map +1 -0
- package/dist/engine/linear.js +37 -0
- package/dist/engine/linear.js.map +1 -0
- package/dist/engine/naive_bayes.d.ts +5 -0
- package/dist/engine/naive_bayes.d.ts.map +1 -0
- package/dist/engine/naive_bayes.js +102 -0
- package/dist/engine/naive_bayes.js.map +1 -0
- package/dist/engine/nn.d.ts +5 -0
- package/dist/engine/nn.d.ts.map +1 -0
- package/dist/engine/nn.js +34 -0
- package/dist/engine/nn.js.map +1 -0
- package/dist/engine/ops.d.ts +14 -0
- package/dist/engine/ops.d.ts.map +1 -0
- package/dist/engine/ops.js +244 -0
- package/dist/engine/ops.js.map +1 -0
- package/dist/engine/predicates.d.ts +5 -0
- package/dist/engine/predicates.d.ts.map +1 -0
- package/dist/engine/predicates.js +105 -0
- package/dist/engine/predicates.js.map +1 -0
- package/dist/engine/preprocess.d.ts +31 -0
- package/dist/engine/preprocess.d.ts.map +1 -0
- package/dist/engine/preprocess.js +1112 -0
- package/dist/engine/preprocess.js.map +1 -0
- package/dist/engine/svm.d.ts +5 -0
- package/dist/engine/svm.d.ts.map +1 -0
- package/dist/engine/svm.js +241 -0
- package/dist/engine/svm.js.map +1 -0
- package/dist/engine/tree.d.ts +6 -0
- package/dist/engine/tree.d.ts.map +1 -0
- package/dist/engine/tree.js +274 -0
- package/dist/engine/tree.js.map +1 -0
- package/dist/engine/validate_inputs.d.ts +22 -0
- package/dist/engine/validate_inputs.d.ts.map +1 -0
- package/dist/engine/validate_inputs.js +225 -0
- package/dist/engine/validate_inputs.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/io.d.ts +9 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +93 -0
- package/dist/io.js.map +1 -0
- package/dist/ir.d.ts +489 -0
- package/dist/ir.d.ts.map +1 -0
- package/dist/ir.js +41 -0
- package/dist/ir.js.map +1 -0
- package/dist/resolve.d.ts +20 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +138 -0
- package/dist/resolve.js.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +332 -0
- package/dist/validate.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/engine/linear.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,YAAY,EAAG,iBAAiB;AAC5C,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,aAAa,GACtB,YAAY,CAgCd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Linear model execution for the reference engine.
|
|
2
|
+
import { applyPostTransform, matmulBias, tensorToData } from './ops.js';
|
|
3
|
+
import { resolveTensorValue } from '../resolve.js';
|
|
4
|
+
// Linear: score = X @ coeff^T + intercept, then post_transform
|
|
5
|
+
export function executeLinear(linear, flatInputs, // [N * numSlots]
|
|
6
|
+
numSlots, N, resolved) {
|
|
7
|
+
const { tensorIndex } = resolved;
|
|
8
|
+
const coeffTensor = resolveTensorValue(linear.coefficients, tensorIndex);
|
|
9
|
+
if (!coeffTensor)
|
|
10
|
+
throw new Error('Linear: coefficients tensor is missing');
|
|
11
|
+
const coeffData = tensorToData(coeffTensor);
|
|
12
|
+
const coeffArr = coeffData.data;
|
|
13
|
+
const coeffShape = coeffTensor.type?.shape ?? [];
|
|
14
|
+
// Determine output width
|
|
15
|
+
let outWidth;
|
|
16
|
+
let weights;
|
|
17
|
+
if (coeffShape.length === 2) {
|
|
18
|
+
// [outWidth, numSlots] — multiclass or multi-output
|
|
19
|
+
outWidth = coeffShape[0];
|
|
20
|
+
weights = coeffArr;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// [numSlots] — single output
|
|
24
|
+
outWidth = 1;
|
|
25
|
+
weights = coeffArr;
|
|
26
|
+
}
|
|
27
|
+
// Build bias
|
|
28
|
+
let bias = null;
|
|
29
|
+
if (linear.intercept) {
|
|
30
|
+
const interceptTensor = resolveTensorValue(linear.intercept, tensorIndex);
|
|
31
|
+
if (interceptTensor)
|
|
32
|
+
bias = tensorToData(interceptTensor).data;
|
|
33
|
+
}
|
|
34
|
+
const scores = matmulBias(flatInputs, N, numSlots, weights, outWidth, bias);
|
|
35
|
+
return applyPostTransform(scores, linear.post_transform, outWidth);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/engine/linear.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAGnD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,UAAwB,EAAG,iBAAiB;AAC5C,QAAgB,EAChB,CAAS,EACT,QAAuB;IAEvB,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEjC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACzE,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAoB,CAAC;IAChD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IAEjD,yBAAyB;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,OAAqB,CAAC;IAE1B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,oDAAoD;QACpD,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,QAAQ,GAAG,CAAC,CAAC;QACb,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;IAED,aAAa;IACb,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1E,IAAI,eAAe;YAAE,IAAI,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC,IAAoB,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5E,OAAO,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NaiveBayes } from '../ir.js';
|
|
2
|
+
import type { ResolvedModel } from '../resolve.js';
|
|
3
|
+
export declare function executeNaiveBayes(nb: NaiveBayes, flatInputs: Float64Array, // [N * numFeatures]
|
|
4
|
+
numFeatures: number, N: number, resolved: ResolvedModel): Float64Array;
|
|
5
|
+
//# sourceMappingURL=naive_bayes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.d.ts","sourceRoot":"","sources":["../../src/engine/naive_bayes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,YAAY,EAAG,oBAAoB;AAC/C,WAAW,EAAE,MAAM,EACnB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,aAAa,GACtB,YAAY,CA+Fd"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Naive Bayes 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
|
+
export function executeNaiveBayes(nb, flatInputs, // [N * numFeatures]
|
|
6
|
+
numFeatures, N, resolved) {
|
|
7
|
+
const { tensorIndex } = resolved;
|
|
8
|
+
const priorsTensor = resolveTensorValue(nb.class_log_priors, tensorIndex);
|
|
9
|
+
if (!priorsTensor)
|
|
10
|
+
throw new Error('NaiveBayes: class_log_priors tensor is missing');
|
|
11
|
+
const priorsData = tensorToData(priorsTensor);
|
|
12
|
+
const logPriors = priorsData.data;
|
|
13
|
+
const numClasses = logPriors.length;
|
|
14
|
+
const logPosteriors = new Float64Array(N * numClasses);
|
|
15
|
+
if (nb.gaussian) {
|
|
16
|
+
const meansTensor = resolveTensorValue(nb.gaussian.means, tensorIndex);
|
|
17
|
+
const varsTensor = resolveTensorValue(nb.gaussian.variances, tensorIndex);
|
|
18
|
+
if (!meansTensor)
|
|
19
|
+
throw new Error('GaussianNaiveBayes: means tensor is missing');
|
|
20
|
+
if (!varsTensor)
|
|
21
|
+
throw new Error('GaussianNaiveBayes: variances tensor is missing');
|
|
22
|
+
const means = tensorToData(meansTensor).data;
|
|
23
|
+
const vars = tensorToData(varsTensor).data;
|
|
24
|
+
const eps = nb.gaussian.variance_epsilon != null ? scalarToNumber(nb.gaussian.variance_epsilon) : 0;
|
|
25
|
+
for (let row = 0; row < N; row++) {
|
|
26
|
+
for (let c = 0; c < numClasses; c++) {
|
|
27
|
+
let logProb = logPriors[c];
|
|
28
|
+
for (let f = 0; f < numFeatures; f++) {
|
|
29
|
+
const x = flatInputs[row * numFeatures + f];
|
|
30
|
+
const mu = means[c * numFeatures + f];
|
|
31
|
+
const v = vars[c * numFeatures + f] + eps;
|
|
32
|
+
logProb -= 0.5 * (Math.log(2 * Math.PI * v) + ((x - mu) ** 2) / v);
|
|
33
|
+
}
|
|
34
|
+
logPosteriors[row * numClasses + c] = logProb;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (nb.multinomial) {
|
|
39
|
+
const flpTensor = resolveTensorValue(nb.multinomial.feature_log_prob, tensorIndex);
|
|
40
|
+
if (!flpTensor)
|
|
41
|
+
throw new Error('MultinomialNaiveBayes: feature_log_prob tensor is missing');
|
|
42
|
+
const flp = tensorToData(flpTensor).data;
|
|
43
|
+
for (let row = 0; row < N; row++) {
|
|
44
|
+
for (let c = 0; c < numClasses; c++) {
|
|
45
|
+
let logProb = logPriors[c];
|
|
46
|
+
for (let f = 0; f < numFeatures; f++) {
|
|
47
|
+
logProb += flatInputs[row * numFeatures + f] * flp[c * numFeatures + f];
|
|
48
|
+
}
|
|
49
|
+
logPosteriors[row * numClasses + c] = logProb;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (nb.bernoulli) {
|
|
54
|
+
const flpTensor = resolveTensorValue(nb.bernoulli.feature_log_prob, tensorIndex);
|
|
55
|
+
if (!flpTensor)
|
|
56
|
+
throw new Error('BernoulliNaiveBayes: feature_log_prob tensor is missing');
|
|
57
|
+
const flp = tensorToData(flpTensor).data;
|
|
58
|
+
const binarizeThreshold = nb.bernoulli.binarize_threshold != null ? scalarToNumber(nb.bernoulli.binarize_threshold) : null;
|
|
59
|
+
// Precompute log(1 - exp(feature_log_prob))
|
|
60
|
+
const logNegProb = new Float64Array(flp.length);
|
|
61
|
+
for (let i = 0; i < flp.length; i++) {
|
|
62
|
+
logNegProb[i] = Math.log(1 - Math.exp(flp[i]) + 1e-10);
|
|
63
|
+
}
|
|
64
|
+
for (let row = 0; row < N; row++) {
|
|
65
|
+
for (let c = 0; c < numClasses; c++) {
|
|
66
|
+
let logProb = logPriors[c];
|
|
67
|
+
for (let f = 0; f < numFeatures; f++) {
|
|
68
|
+
const rawVal = flatInputs[row * numFeatures + f];
|
|
69
|
+
const xi = binarizeThreshold !== null ? (rawVal > binarizeThreshold ? 1 : 0) : rawVal;
|
|
70
|
+
logProb += xi * flp[c * numFeatures + f] + (1 - xi) * logNegProb[c * numFeatures + f];
|
|
71
|
+
}
|
|
72
|
+
logPosteriors[row * numClasses + c] = logProb;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (nb.categorical) {
|
|
77
|
+
const clpTensor = resolveTensorValue(nb.categorical.category_log_prob, tensorIndex);
|
|
78
|
+
if (!clpTensor)
|
|
79
|
+
throw new Error('CategoricalNaiveBayes: category_log_prob tensor is missing');
|
|
80
|
+
const clp = tensorToData(clpTensor).data;
|
|
81
|
+
const catOffset = nb.categorical.category_offset ?? [];
|
|
82
|
+
const catCount = nb.categorical.category_count ?? [];
|
|
83
|
+
const rowSize = catOffset.length > 0
|
|
84
|
+
? (catOffset[catOffset.length - 1] + (catCount[catCount.length - 1] ?? 0))
|
|
85
|
+
: numFeatures;
|
|
86
|
+
for (let row = 0; row < N; row++) {
|
|
87
|
+
for (let c = 0; c < numClasses; c++) {
|
|
88
|
+
let logProb = logPriors[c];
|
|
89
|
+
for (let f = 0; f < numFeatures; f++) {
|
|
90
|
+
const catIdx = Math.round(flatInputs[row * numFeatures + f]);
|
|
91
|
+
const offset = catOffset[f] ?? f;
|
|
92
|
+
const count = catCount[f] ?? 1;
|
|
93
|
+
const safeIdx = Math.max(0, Math.min(catIdx, count - 1));
|
|
94
|
+
logProb += clp[c * rowSize + offset + safeIdx];
|
|
95
|
+
}
|
|
96
|
+
logPosteriors[row * numClasses + c] = logProb;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return applyPostTransform(logPosteriors, 'SOFTMAX', numClasses);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=naive_bayes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.js","sourceRoot":"","sources":["../../src/engine/naive_bayes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NeuralNetwork } from '../ir.js';
|
|
2
|
+
import type { ResolvedModel } from '../resolve.js';
|
|
3
|
+
export declare function executeNeuralNetwork(nn: NeuralNetwork, flatInputs: Float64Array, // [N * inputWidth]
|
|
4
|
+
inputWidth: number, N: number, resolved: ResolvedModel): Float64Array;
|
|
5
|
+
//# sourceMappingURL=nn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nn.d.ts","sourceRoot":"","sources":["../../src/engine/nn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,YAAY,EAAG,mBAAmB;AAC9C,UAAU,EAAE,MAAM,EAClB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,aAAa,GACtB,YAAY,CA8Bd"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Neural network (MLP) execution for the reference engine.
|
|
2
|
+
import { applyActivation, matmulBias, tensorToData } from './ops.js';
|
|
3
|
+
import { resolveTensorValue } from '../resolve.js';
|
|
4
|
+
// Evaluates a classical feed-forward MLP: y = activation(W @ x + b) per layer.
|
|
5
|
+
export function executeNeuralNetwork(nn, flatInputs, // [N * inputWidth]
|
|
6
|
+
inputWidth, N, resolved) {
|
|
7
|
+
const { tensorIndex } = resolved;
|
|
8
|
+
const layers = nn.layers ?? [];
|
|
9
|
+
if (layers.length === 0)
|
|
10
|
+
return flatInputs;
|
|
11
|
+
let current = flatInputs;
|
|
12
|
+
let currentWidth = inputWidth;
|
|
13
|
+
for (const layer of layers) {
|
|
14
|
+
const wTensor = resolveTensorValue(layer.weights, tensorIndex);
|
|
15
|
+
if (!wTensor)
|
|
16
|
+
throw new Error(`DenseLayer "${layer.name ?? '?'}": weights tensor is missing`);
|
|
17
|
+
const wData = tensorToData(wTensor);
|
|
18
|
+
const weights = wData.data;
|
|
19
|
+
const wShape = wTensor.type?.shape ?? [];
|
|
20
|
+
const outWidth = wShape[0] ?? 1;
|
|
21
|
+
const inWidth = wShape[1] ?? currentWidth;
|
|
22
|
+
let bias = null;
|
|
23
|
+
if (layer.bias) {
|
|
24
|
+
const biasTensor = resolveTensorValue(layer.bias, tensorIndex);
|
|
25
|
+
if (biasTensor)
|
|
26
|
+
bias = tensorToData(biasTensor).data;
|
|
27
|
+
}
|
|
28
|
+
const preActivation = matmulBias(current, N, inWidth, weights, outWidth, bias);
|
|
29
|
+
current = applyActivation(preActivation, layer.activation, outWidth);
|
|
30
|
+
currentWidth = outWidth;
|
|
31
|
+
}
|
|
32
|
+
return current;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=nn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nn.js","sourceRoot":"","sources":["../../src/engine/nn.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAG3D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB,CAClC,EAAiB,EACjB,UAAwB,EAAG,mBAAmB;AAC9C,UAAkB,EAClB,CAAS,EACT,QAAuB;IAEvB,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC;IAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAE3C,IAAI,OAAO,GAAG,UAAU,CAAC;IACzB,IAAI,YAAY,GAAG,UAAU,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,GAAG,8BAA8B,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAoB,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;QAE1C,IAAI,IAAI,GAAwB,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/D,IAAI,UAAU;gBAAE,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,IAAoB,CAAC;QACvE,CAAC;QAED,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/E,OAAO,GAAG,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrE,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Tensor, DataType, PostTransform } from '../ir.js';
|
|
2
|
+
export type NumericArray = Float64Array | Float32Array | Int32Array;
|
|
3
|
+
export interface TensorData {
|
|
4
|
+
dtype: DataType;
|
|
5
|
+
shape: number[];
|
|
6
|
+
data: Float64Array | string[] | boolean[];
|
|
7
|
+
}
|
|
8
|
+
export declare function tensorRows(td: TensorData): number;
|
|
9
|
+
export declare function tensorCols(td: TensorData): number;
|
|
10
|
+
export declare function tensorToData(tensor: Tensor | number[]): TensorData;
|
|
11
|
+
export declare function applyPostTransform(scores: Float64Array, transform: PostTransform | undefined, outputSize: number): Float64Array;
|
|
12
|
+
export declare function applyActivation(x: Float64Array, activation: string, outputSize: number): Float64Array;
|
|
13
|
+
export declare function matmulBias(input: Float64Array, N: number, inD: number, weights: Float64Array, outD: number, bias: Float64Array | null): Float64Array;
|
|
14
|
+
//# sourceMappingURL=ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/engine/ops.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIhE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;CAC3C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAEjD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAGjD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CA+BlE;AAyDD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,GACjB,YAAY,CAqFd;AAED,wBAAgB,eAAe,CAC7B,CAAC,EAAE,YAAY,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,YAAY,CAuBd;AAID,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAC3C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EACnC,IAAI,EAAE,YAAY,GAAG,IAAI,GACxB,YAAY,CAYd"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// Core tensor operations and post-transforms used by the reference engine.
|
|
2
|
+
export function tensorRows(td) {
|
|
3
|
+
return td.shape[0] ?? 0;
|
|
4
|
+
}
|
|
5
|
+
export function tensorCols(td) {
|
|
6
|
+
if (td.shape.length < 2)
|
|
7
|
+
return 1;
|
|
8
|
+
return td.shape.slice(1).reduce((a, b) => a * b, 1);
|
|
9
|
+
}
|
|
10
|
+
// ── Tensor → TensorData conversion ───────────────────────────────────────────
|
|
11
|
+
export function tensorToData(tensor) {
|
|
12
|
+
// Some JSON serializations emit plain arrays instead of Tensor objects (e.g. split_threshold, leaf_value).
|
|
13
|
+
if (Array.isArray(tensor)) {
|
|
14
|
+
return { dtype: 'FLOAT64', shape: [tensor.length], data: new Float64Array(tensor) };
|
|
15
|
+
}
|
|
16
|
+
const dtype = tensor.type?.dtype ?? 'FLOAT64';
|
|
17
|
+
const shape = tensor.type?.shape ?? [];
|
|
18
|
+
if (dtype === 'STRING') {
|
|
19
|
+
const data = tensor.string_data ?? [];
|
|
20
|
+
return { dtype, shape, data };
|
|
21
|
+
}
|
|
22
|
+
if (dtype === 'BOOL') {
|
|
23
|
+
const data = tensor.bool_data ?? [];
|
|
24
|
+
return { dtype, shape, data };
|
|
25
|
+
}
|
|
26
|
+
if (tensor.raw_data) {
|
|
27
|
+
return { dtype, shape, data: decodeRawData(tensor.raw_data, dtype, shape) };
|
|
28
|
+
}
|
|
29
|
+
let nums;
|
|
30
|
+
if (tensor.float32_data)
|
|
31
|
+
nums = tensor.float32_data;
|
|
32
|
+
else if (tensor.float64_data)
|
|
33
|
+
nums = tensor.float64_data;
|
|
34
|
+
else if (tensor.int32_data)
|
|
35
|
+
nums = tensor.int32_data;
|
|
36
|
+
else if (tensor.int64_data)
|
|
37
|
+
nums = tensor.int64_data;
|
|
38
|
+
else
|
|
39
|
+
nums = [];
|
|
40
|
+
return { dtype, shape, data: new Float64Array(nums) };
|
|
41
|
+
}
|
|
42
|
+
function decodeRawData(b64, dtype, shape) {
|
|
43
|
+
const bytes = base64ToBytes(b64);
|
|
44
|
+
const n = shape.reduce((a, b) => a * b, 1);
|
|
45
|
+
const out = new Float64Array(n);
|
|
46
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
47
|
+
switch (dtype) {
|
|
48
|
+
case 'FLOAT32':
|
|
49
|
+
for (let i = 0; i < n; i++)
|
|
50
|
+
out[i] = view.getFloat32(i * 4, true);
|
|
51
|
+
break;
|
|
52
|
+
case 'FLOAT64':
|
|
53
|
+
for (let i = 0; i < n; i++)
|
|
54
|
+
out[i] = view.getFloat64(i * 8, true);
|
|
55
|
+
break;
|
|
56
|
+
case 'INT32':
|
|
57
|
+
for (let i = 0; i < n; i++)
|
|
58
|
+
out[i] = view.getInt32(i * 4, true);
|
|
59
|
+
break;
|
|
60
|
+
case 'INT64':
|
|
61
|
+
for (let i = 0; i < n; i++)
|
|
62
|
+
out[i] = Number(view.getBigInt64(i * 8, true));
|
|
63
|
+
break;
|
|
64
|
+
case 'INT8':
|
|
65
|
+
for (let i = 0; i < n; i++)
|
|
66
|
+
out[i] = view.getInt8(i);
|
|
67
|
+
break;
|
|
68
|
+
case 'UINT8':
|
|
69
|
+
for (let i = 0; i < n; i++)
|
|
70
|
+
out[i] = view.getUint8(i);
|
|
71
|
+
break;
|
|
72
|
+
case 'INT16':
|
|
73
|
+
for (let i = 0; i < n; i++)
|
|
74
|
+
out[i] = view.getInt16(i * 2, true);
|
|
75
|
+
break;
|
|
76
|
+
case 'UINT16':
|
|
77
|
+
for (let i = 0; i < n; i++)
|
|
78
|
+
out[i] = view.getUint16(i * 2, true);
|
|
79
|
+
break;
|
|
80
|
+
case 'UINT32':
|
|
81
|
+
for (let i = 0; i < n; i++)
|
|
82
|
+
out[i] = view.getUint32(i * 4, true);
|
|
83
|
+
break;
|
|
84
|
+
default:
|
|
85
|
+
// Unsupported dtype for raw binary decode — return zeros
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
function base64ToBytes(b64) {
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
const g = globalThis;
|
|
93
|
+
if (typeof g['Buffer'] !== 'undefined') {
|
|
94
|
+
return new Uint8Array(g['Buffer'].from(b64, 'base64'));
|
|
95
|
+
}
|
|
96
|
+
const bin = g['atob'](b64);
|
|
97
|
+
const bytes = new Uint8Array(bin.length);
|
|
98
|
+
for (let i = 0; i < bin.length; i++)
|
|
99
|
+
bytes[i] = bin.charCodeAt(i);
|
|
100
|
+
return bytes;
|
|
101
|
+
}
|
|
102
|
+
// ── Post-transforms ───────────────────────────────────────────────────────────
|
|
103
|
+
export function applyPostTransform(scores, transform, outputSize) {
|
|
104
|
+
switch (transform) {
|
|
105
|
+
case undefined:
|
|
106
|
+
case 'POST_TRANSFORM_UNSPECIFIED':
|
|
107
|
+
case 'IDENTITY':
|
|
108
|
+
return scores;
|
|
109
|
+
case 'SIGMOID': {
|
|
110
|
+
const out = new Float64Array(scores.length);
|
|
111
|
+
for (let i = 0; i < scores.length; i++)
|
|
112
|
+
out[i] = 1 / (1 + Math.exp(-scores[i]));
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
case 'SIGMOID_BINARY': {
|
|
116
|
+
// Sigmoid then expand to 2-column [1-p, p] per row
|
|
117
|
+
const N = scores.length / outputSize;
|
|
118
|
+
const out = new Float64Array(N * 2);
|
|
119
|
+
for (let row = 0; row < N; row++) {
|
|
120
|
+
const p = 1 / (1 + Math.exp(-scores[row * outputSize]));
|
|
121
|
+
out[row * 2] = 1 - p;
|
|
122
|
+
out[row * 2 + 1] = p;
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
case 'SOFTMAX': {
|
|
127
|
+
const out = new Float64Array(scores.length);
|
|
128
|
+
const N = scores.length / outputSize;
|
|
129
|
+
for (let row = 0; row < N; row++) {
|
|
130
|
+
const offset = row * outputSize;
|
|
131
|
+
let maxVal = -Infinity;
|
|
132
|
+
for (let k = 0; k < outputSize; k++)
|
|
133
|
+
maxVal = Math.max(maxVal, scores[offset + k]);
|
|
134
|
+
let sum = 0;
|
|
135
|
+
for (let k = 0; k < outputSize; k++) {
|
|
136
|
+
out[offset + k] = Math.exp(scores[offset + k] - maxVal);
|
|
137
|
+
sum += out[offset + k];
|
|
138
|
+
}
|
|
139
|
+
for (let k = 0; k < outputSize; k++)
|
|
140
|
+
out[offset + k] /= sum;
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
case 'EXP': {
|
|
145
|
+
const out = new Float64Array(scores.length);
|
|
146
|
+
for (let i = 0; i < scores.length; i++)
|
|
147
|
+
out[i] = Math.exp(scores[i]);
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
case 'LOGIT': {
|
|
151
|
+
const out = new Float64Array(scores.length);
|
|
152
|
+
for (let i = 0; i < scores.length; i++) {
|
|
153
|
+
const p = scores[i];
|
|
154
|
+
out[i] = Math.log(p / (1 - p));
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
case 'PROBIT': {
|
|
159
|
+
// Rational approximation for inverse normal CDF
|
|
160
|
+
const out = new Float64Array(scores.length);
|
|
161
|
+
for (let i = 0; i < scores.length; i++)
|
|
162
|
+
out[i] = probitApprox(scores[i]);
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
case 'CLOGLOG': {
|
|
166
|
+
const out = new Float64Array(scores.length);
|
|
167
|
+
for (let i = 0; i < scores.length; i++)
|
|
168
|
+
out[i] = 1 - Math.exp(-Math.exp(scores[i]));
|
|
169
|
+
return out;
|
|
170
|
+
}
|
|
171
|
+
case 'LOGLOG': {
|
|
172
|
+
const out = new Float64Array(scores.length);
|
|
173
|
+
for (let i = 0; i < scores.length; i++)
|
|
174
|
+
out[i] = Math.exp(-Math.exp(-scores[i]));
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
case 'CAUCHIT': {
|
|
178
|
+
const out = new Float64Array(scores.length);
|
|
179
|
+
for (let i = 0; i < scores.length; i++)
|
|
180
|
+
out[i] = 0.5 + (1 / Math.PI) * Math.atan(scores[i]);
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
default:
|
|
184
|
+
return scores;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export function applyActivation(x, activation, outputSize) {
|
|
188
|
+
switch (activation) {
|
|
189
|
+
case 'IDENTITY': return x;
|
|
190
|
+
case 'LOGISTIC': {
|
|
191
|
+
const out = new Float64Array(x.length);
|
|
192
|
+
for (let i = 0; i < x.length; i++)
|
|
193
|
+
out[i] = 1 / (1 + Math.exp(-x[i]));
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
case 'TANH': {
|
|
197
|
+
const out = new Float64Array(x.length);
|
|
198
|
+
for (let i = 0; i < x.length; i++)
|
|
199
|
+
out[i] = Math.tanh(x[i]);
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
case 'RELU': {
|
|
203
|
+
const out = new Float64Array(x.length);
|
|
204
|
+
for (let i = 0; i < x.length; i++)
|
|
205
|
+
out[i] = Math.max(0, x[i]);
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
case 'SOFTMAX':
|
|
209
|
+
return applyPostTransform(x, 'SOFTMAX', outputSize);
|
|
210
|
+
default:
|
|
211
|
+
return x;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ── Matrix multiply: out[N, outD] = in[N, inD] @ W[outD, inD]^T + b[outD] ───
|
|
215
|
+
export function matmulBias(input, N, inD, weights, outD, bias) {
|
|
216
|
+
const out = new Float64Array(N * outD);
|
|
217
|
+
for (let row = 0; row < N; row++) {
|
|
218
|
+
for (let j = 0; j < outD; j++) {
|
|
219
|
+
let acc = bias ? bias[j] : 0;
|
|
220
|
+
for (let k = 0; k < inD; k++) {
|
|
221
|
+
acc += input[row * inD + k] * weights[j * inD + k];
|
|
222
|
+
}
|
|
223
|
+
out[row * outD + j] = acc;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return out;
|
|
227
|
+
}
|
|
228
|
+
// ── Probit approximation ──────────────────────────────────────────────────────
|
|
229
|
+
function probitApprox(p) {
|
|
230
|
+
if (p <= 0)
|
|
231
|
+
return -Infinity;
|
|
232
|
+
if (p >= 1)
|
|
233
|
+
return Infinity;
|
|
234
|
+
// Beasley-Springer-Moro algorithm approximation
|
|
235
|
+
const a = [2.515517, 0.802853, 0.010328];
|
|
236
|
+
const b = [1.432788, 0.189269, 0.001308];
|
|
237
|
+
const sign = p < 0.5 ? -1 : 1;
|
|
238
|
+
const q = Math.min(p, 1 - p);
|
|
239
|
+
const t = Math.sqrt(-2 * Math.log(q));
|
|
240
|
+
const num = a[0] + a[1] * t + a[2] * t * t;
|
|
241
|
+
const den = 1 + b[0] * t + b[1] * t * t + b[2] * t * t * t;
|
|
242
|
+
return sign * (t - num / den);
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/engine/ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Predicate, Scalar } from '../ir.js';
|
|
2
|
+
export type ColumnResolver = (name: string, row: number) => number | string | boolean | undefined;
|
|
3
|
+
export declare function evalPredicate(pred: Predicate, resolver: ColumnResolver, row: number): boolean | null;
|
|
4
|
+
export declare function scalarEquals(a: Scalar, b: Scalar): boolean;
|
|
5
|
+
//# sourceMappingURL=predicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/engine/predicates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EAA0D,MAAM,EAC1E,MAAM,UAAU,CAAC;AAKlB,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAIlG,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,GAAG,IAAI,CAOhB;AAoGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Predicate evaluation for the reference engine.
|
|
2
|
+
// Predicates are evaluated per-row over named column values.
|
|
3
|
+
import { scalarValue } from '../ir.js';
|
|
4
|
+
// ── Entry point ───────────────────────────────────────────────────────────────
|
|
5
|
+
export function evalPredicate(pred, resolver, row) {
|
|
6
|
+
if (pred.true_predicate !== undefined)
|
|
7
|
+
return true;
|
|
8
|
+
if (pred.false_predicate !== undefined)
|
|
9
|
+
return false;
|
|
10
|
+
if (pred.simple)
|
|
11
|
+
return evalSimple(pred.simple, resolver, row);
|
|
12
|
+
if (pred.simple_set)
|
|
13
|
+
return evalSimpleSet(pred.simple_set, resolver, row);
|
|
14
|
+
if (pred.compound)
|
|
15
|
+
return evalCompound(pred.compound, resolver, row);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
// ── Simple predicate ──────────────────────────────────────────────────────────
|
|
19
|
+
function evalSimple(pred, resolver, row) {
|
|
20
|
+
const val = resolver(pred.column.value, row);
|
|
21
|
+
const isMissing = val === undefined || val === null || (typeof val === 'number' && isNaN(val));
|
|
22
|
+
switch (pred.op) {
|
|
23
|
+
case 'IS_MISSING': return isMissing;
|
|
24
|
+
case 'IS_NOT_MISSING': return !isMissing;
|
|
25
|
+
default: break;
|
|
26
|
+
}
|
|
27
|
+
if (isMissing)
|
|
28
|
+
return null;
|
|
29
|
+
const cmp = pred.value ? scalarValue(pred.value) : undefined;
|
|
30
|
+
switch (pred.op) {
|
|
31
|
+
case 'LESS_THAN': return val < cmp;
|
|
32
|
+
case 'LESS_OR_EQUAL': return val <= cmp;
|
|
33
|
+
case 'GREATER_THAN': return val > cmp;
|
|
34
|
+
case 'GREATER_OR_EQUAL': return val >= cmp;
|
|
35
|
+
case 'EQUAL': return val === cmp;
|
|
36
|
+
case 'NOT_EQUAL': return val !== cmp;
|
|
37
|
+
default: return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ── Set predicate ─────────────────────────────────────────────────────────────
|
|
41
|
+
function evalSimpleSet(pred, resolver, row) {
|
|
42
|
+
const val = resolver(pred.column.value, row);
|
|
43
|
+
if (val === undefined || val === null)
|
|
44
|
+
return null;
|
|
45
|
+
const setVals = new Set((pred.values ?? []).map(s => scalarValue(s)));
|
|
46
|
+
switch (pred.op) {
|
|
47
|
+
case 'IN': return setVals.has(val);
|
|
48
|
+
case 'NOT_IN': return !setVals.has(val);
|
|
49
|
+
default: return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ── Compound predicate ────────────────────────────────────────────────────────
|
|
53
|
+
function evalCompound(pred, resolver, row) {
|
|
54
|
+
const children = pred.predicates ?? [];
|
|
55
|
+
switch (pred.op) {
|
|
56
|
+
case 'AND': {
|
|
57
|
+
let result = true;
|
|
58
|
+
for (const c of children) {
|
|
59
|
+
const r = evalPredicate(c, resolver, row);
|
|
60
|
+
if (r === false)
|
|
61
|
+
return false;
|
|
62
|
+
if (r === null)
|
|
63
|
+
result = null;
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
case 'OR': {
|
|
68
|
+
let result = false;
|
|
69
|
+
for (const c of children) {
|
|
70
|
+
const r = evalPredicate(c, resolver, row);
|
|
71
|
+
if (r === true)
|
|
72
|
+
return true;
|
|
73
|
+
if (r === null)
|
|
74
|
+
result = null;
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
case 'XOR': {
|
|
79
|
+
let trueCount = 0;
|
|
80
|
+
for (const c of children) {
|
|
81
|
+
const r = evalPredicate(c, resolver, row);
|
|
82
|
+
if (r === null)
|
|
83
|
+
return null;
|
|
84
|
+
if (r)
|
|
85
|
+
trueCount++;
|
|
86
|
+
}
|
|
87
|
+
return trueCount % 2 === 1;
|
|
88
|
+
}
|
|
89
|
+
case 'SURROGATE': {
|
|
90
|
+
for (const c of children) {
|
|
91
|
+
const r = evalPredicate(c, resolver, row);
|
|
92
|
+
if (r !== null)
|
|
93
|
+
return r;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
default:
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ── Scalar comparison helpers ─────────────────────────────────────────────────
|
|
102
|
+
export function scalarEquals(a, b) {
|
|
103
|
+
return scalarValue(a) === scalarValue(b);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/engine/predicates.ts"],"names":[],"mappings":"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"}
|