@seanhogg/builderforce-memory-engine 2026.9.34 → 2026.10.2
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/dist/evermind/delta_wire.d.ts +26 -2
- package/dist/evermind/delta_wire.d.ts.map +1 -1
- package/dist/evermind/delta_wire.js +46 -4
- package/dist/evermind/delta_wire.js.map +1 -1
- package/dist/evermind/index.d.ts +5 -5
- package/dist/evermind/index.d.ts.map +1 -1
- package/dist/evermind/index.js +2 -2
- package/dist/evermind/index.js.map +1 -1
- package/dist/evermind/merge.d.ts +28 -0
- package/dist/evermind/merge.d.ts.map +1 -1
- package/dist/evermind/merge.js +33 -0
- package/dist/evermind/merge.js.map +1 -1
- package/dist/evermind/ml_head.d.ts +28 -0
- package/dist/evermind/ml_head.d.ts.map +1 -0
- package/dist/evermind/ml_head.js +47 -0
- package/dist/evermind/ml_head.js.map +1 -0
- package/dist/evermind/package.d.ts +9 -0
- package/dist/evermind/package.d.ts.map +1 -1
- package/dist/evermind/package.js +20 -0
- package/dist/evermind/package.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/limbic/index.d.ts +3 -0
- package/dist/limbic/index.d.ts.map +1 -1
- package/dist/limbic/index.js +3 -0
- package/dist/limbic/index.js.map +1 -1
- package/dist/limbic/limbic_model.d.ts.map +1 -1
- package/dist/limbic/limbic_model.js +1 -3
- package/dist/limbic/limbic_model.js.map +1 -1
- package/dist/limbic/limbic_task.d.ts +22 -0
- package/dist/limbic/limbic_task.d.ts.map +1 -0
- package/dist/limbic/limbic_task.js +45 -0
- package/dist/limbic/limbic_task.js.map +1 -0
- package/dist/limbic/limbic_trainer.d.ts +17 -30
- package/dist/limbic/limbic_trainer.d.ts.map +1 -1
- package/dist/limbic/limbic_trainer.js +38 -144
- package/dist/limbic/limbic_trainer.js.map +1 -1
- package/dist/ml/classical/anomaly_composite.d.ts +32 -0
- package/dist/ml/classical/anomaly_composite.d.ts.map +1 -0
- package/dist/ml/classical/anomaly_composite.js +29 -0
- package/dist/ml/classical/anomaly_composite.js.map +1 -0
- package/dist/ml/classical/ewma.d.ts +37 -0
- package/dist/ml/classical/ewma.d.ts.map +1 -0
- package/dist/ml/classical/ewma.js +48 -0
- package/dist/ml/classical/ewma.js.map +1 -0
- package/dist/ml/classical/gbm.d.ts +42 -0
- package/dist/ml/classical/gbm.d.ts.map +1 -0
- package/dist/ml/classical/gbm.js +117 -0
- package/dist/ml/classical/gbm.js.map +1 -0
- package/dist/ml/classical/index.d.ts +52 -0
- package/dist/ml/classical/index.d.ts.map +1 -0
- package/dist/ml/classical/index.js +49 -0
- package/dist/ml/classical/index.js.map +1 -0
- package/dist/ml/classical/isolation_forest.d.ts +37 -0
- package/dist/ml/classical/isolation_forest.d.ts.map +1 -0
- package/dist/ml/classical/isolation_forest.js +72 -0
- package/dist/ml/classical/isolation_forest.js.map +1 -0
- package/dist/ml/classical/kmeans.d.ts +31 -0
- package/dist/ml/classical/kmeans.d.ts.map +1 -0
- package/dist/ml/classical/kmeans.js +112 -0
- package/dist/ml/classical/kmeans.js.map +1 -0
- package/dist/ml/classical/knn.d.ts +51 -0
- package/dist/ml/classical/knn.d.ts.map +1 -0
- package/dist/ml/classical/knn.js +69 -0
- package/dist/ml/classical/knn.js.map +1 -0
- package/dist/ml/classical/linear.d.ts +29 -0
- package/dist/ml/classical/linear.d.ts.map +1 -0
- package/dist/ml/classical/linear.js +114 -0
- package/dist/ml/classical/linear.js.map +1 -0
- package/dist/ml/classical/logistic.d.ts +31 -0
- package/dist/ml/classical/logistic.d.ts.map +1 -0
- package/dist/ml/classical/logistic.js +111 -0
- package/dist/ml/classical/logistic.js.map +1 -0
- package/dist/ml/classical/math.d.ts +26 -0
- package/dist/ml/classical/math.d.ts.map +1 -0
- package/dist/ml/classical/math.js +90 -0
- package/dist/ml/classical/math.js.map +1 -0
- package/dist/ml/classical/naive_bayes.d.ts +28 -0
- package/dist/ml/classical/naive_bayes.d.ts.map +1 -0
- package/dist/ml/classical/naive_bayes.js +72 -0
- package/dist/ml/classical/naive_bayes.js.map +1 -0
- package/dist/ml/classical/robust_z.d.ts +38 -0
- package/dist/ml/classical/robust_z.d.ts.map +1 -0
- package/dist/ml/classical/robust_z.js +47 -0
- package/dist/ml/classical/robust_z.js.map +1 -0
- package/dist/ml/dense_head.d.ts +33 -0
- package/dist/ml/dense_head.d.ts.map +1 -0
- package/dist/ml/dense_head.js +140 -0
- package/dist/ml/dense_head.js.map +1 -0
- package/dist/ml/eval_loss.d.ts +15 -0
- package/dist/ml/eval_loss.d.ts.map +1 -0
- package/dist/ml/eval_loss.js +20 -0
- package/dist/ml/eval_loss.js.map +1 -0
- package/dist/ml/features.d.ts +25 -0
- package/dist/ml/features.d.ts.map +1 -0
- package/dist/ml/features.js +46 -0
- package/dist/ml/features.js.map +1 -0
- package/dist/ml/federate.d.ts +56 -0
- package/dist/ml/federate.d.ts.map +1 -0
- package/dist/ml/federate.js +99 -0
- package/dist/ml/federate.js.map +1 -0
- package/dist/ml/head_trainer.d.ts +78 -0
- package/dist/ml/head_trainer.d.ts.map +1 -0
- package/dist/ml/head_trainer.js +182 -0
- package/dist/ml/head_trainer.js.map +1 -0
- package/dist/ml/index.d.ts +23 -0
- package/dist/ml/index.d.ts.map +1 -0
- package/dist/ml/index.js +11 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ml/registry.d.ts +20 -0
- package/dist/ml/registry.d.ts.map +1 -0
- package/dist/ml/registry.js +43 -0
- package/dist/ml/registry.js.map +1 -0
- package/dist/ml/run.d.ts +103 -0
- package/dist/ml/run.d.ts.map +1 -0
- package/dist/ml/run.js +169 -0
- package/dist/ml/run.js.map +1 -0
- package/dist/ml/tasks/experience.d.ts +127 -0
- package/dist/ml/tasks/experience.d.ts.map +1 -0
- package/dist/ml/tasks/experience.js +213 -0
- package/dist/ml/tasks/experience.js.map +1 -0
- package/dist/ml/tasks/index.d.ts +10 -0
- package/dist/ml/tasks/index.d.ts.map +1 -0
- package/dist/ml/tasks/index.js +28 -0
- package/dist/ml/tasks/index.js.map +1 -0
- package/dist/ml/tasks/local_success.d.ts +55 -0
- package/dist/ml/tasks/local_success.d.ts.map +1 -0
- package/dist/ml/tasks/local_success.js +77 -0
- package/dist/ml/tasks/local_success.js.map +1 -0
- package/dist/ml/tasks/run_anomaly.d.ts +52 -0
- package/dist/ml/tasks/run_anomaly.d.ts.map +1 -0
- package/dist/ml/tasks/run_anomaly.js +50 -0
- package/dist/ml/tasks/run_anomaly.js.map +1 -0
- package/dist/ml/train.d.ts +59 -0
- package/dist/ml/train.d.ts.map +1 -0
- package/dist/ml/train.js +84 -0
- package/dist/ml/train.js.map +1 -0
- package/dist/ml/types.d.ts +115 -0
- package/dist/ml/types.d.ts.map +1 -0
- package/dist/ml/types.js +24 -0
- package/dist/ml/types.js.map +1 -0
- package/dist/moe/moe_model.d.ts.map +1 -1
- package/dist/moe/moe_model.js +1 -16
- package/dist/moe/moe_model.js.map +1 -1
- package/dist/training/cpu_ops.d.ts +2 -0
- package/dist/training/cpu_ops.d.ts.map +1 -1
- package/dist/training/cpu_ops.js +16 -0
- package/dist/training/cpu_ops.js.map +1 -1
- package/package.json +1 -1
- package/src/evermind/delta_wire.ts +63 -4
- package/src/evermind/index.ts +7 -3
- package/src/evermind/merge.ts +59 -0
- package/src/evermind/ml_head.ts +63 -0
- package/src/evermind/package.ts +24 -0
- package/src/index.ts +17 -1
- package/src/limbic/index.ts +5 -0
- package/src/limbic/limbic_model.ts +1 -4
- package/src/limbic/limbic_task.ts +62 -0
- package/src/limbic/limbic_trainer.ts +41 -208
- package/src/ml/classical/anomaly_composite.ts +46 -0
- package/src/ml/classical/ewma.ts +74 -0
- package/src/ml/classical/gbm.ts +144 -0
- package/src/ml/classical/index.ts +82 -0
- package/src/ml/classical/isolation_forest.ts +88 -0
- package/src/ml/classical/kmeans.ts +120 -0
- package/src/ml/classical/knn.ts +102 -0
- package/src/ml/classical/linear.ts +119 -0
- package/src/ml/classical/logistic.ts +125 -0
- package/src/ml/classical/math.ts +93 -0
- package/src/ml/classical/naive_bayes.ts +84 -0
- package/src/ml/classical/robust_z.ts +74 -0
- package/src/ml/dense_head.ts +157 -0
- package/src/ml/eval_loss.ts +27 -0
- package/src/ml/features.ts +61 -0
- package/src/ml/federate.ts +130 -0
- package/src/ml/head_trainer.ts +247 -0
- package/src/ml/index.ts +57 -0
- package/src/ml/registry.ts +44 -0
- package/src/ml/run.ts +222 -0
- package/src/ml/tasks/experience.ts +293 -0
- package/src/ml/tasks/index.ts +30 -0
- package/src/ml/tasks/local_success.ts +118 -0
- package/src/ml/tasks/run_anomaly.ts +84 -0
- package/src/ml/train.ts +120 -0
- package/src/ml/types.ts +135 -0
- package/src/moe/moe_model.ts +1 -13
- package/src/training/cpu_ops.ts +14 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/math.ts — the small vector helpers every classical algorithm shares.
|
|
3
|
+
* Pure, allocation-light, deterministic.
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRng } from "../../utils/rng.js";
|
|
6
|
+
/** The engine's ONE sigmoid / softmax (`training/cpu_ops.ts`). */
|
|
7
|
+
export { sigmoid, softmax } from "../../training/cpu_ops.js";
|
|
8
|
+
export function dot(a, b) {
|
|
9
|
+
const n = Math.min(a.length, b.length);
|
|
10
|
+
let s = 0;
|
|
11
|
+
for (let i = 0; i < n; i++)
|
|
12
|
+
s += a[i] * b[i];
|
|
13
|
+
return s;
|
|
14
|
+
}
|
|
15
|
+
export function norm(a) {
|
|
16
|
+
return Math.sqrt(dot(a, a));
|
|
17
|
+
}
|
|
18
|
+
/** Cosine similarity in [-1, 1]; 0 when either vector is zero. */
|
|
19
|
+
export function cosine(a, b) {
|
|
20
|
+
const na = norm(a);
|
|
21
|
+
const nb = norm(b);
|
|
22
|
+
return na > 0 && nb > 0 ? dot(a, b) / (na * nb) : 0;
|
|
23
|
+
}
|
|
24
|
+
export function squaredDistance(a, b) {
|
|
25
|
+
const n = Math.min(a.length, b.length);
|
|
26
|
+
let s = 0;
|
|
27
|
+
for (let i = 0; i < n; i++) {
|
|
28
|
+
const d = a[i] - b[i];
|
|
29
|
+
s += d * d;
|
|
30
|
+
}
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
/** Median of a numeric list (copy-sorted). NaN for an empty list. */
|
|
34
|
+
export function median(values) {
|
|
35
|
+
if (values.length === 0)
|
|
36
|
+
return Number.NaN;
|
|
37
|
+
const s = [...values].sort((a, b) => a - b);
|
|
38
|
+
const m = s.length >> 1;
|
|
39
|
+
return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
|
|
40
|
+
}
|
|
41
|
+
/** Index of the largest value (first on ties). */
|
|
42
|
+
export function argmax(values) {
|
|
43
|
+
let best = 0;
|
|
44
|
+
for (let i = 1; i < values.length; i++)
|
|
45
|
+
if (values[i] > values[best])
|
|
46
|
+
best = i;
|
|
47
|
+
return best;
|
|
48
|
+
}
|
|
49
|
+
/** Number of distinct classes implied by integer labels 0..k-1. */
|
|
50
|
+
export function classCount(labels) {
|
|
51
|
+
let k = 0;
|
|
52
|
+
for (const y of labels) {
|
|
53
|
+
if (!Number.isInteger(y) || y < 0)
|
|
54
|
+
throw new Error(`class label must be a non-negative integer, got ${y}`);
|
|
55
|
+
k = Math.max(k, y + 1);
|
|
56
|
+
}
|
|
57
|
+
return Math.max(k, 2);
|
|
58
|
+
}
|
|
59
|
+
/** Feature dimension of a non-empty sample matrix; throws on ragged rows. */
|
|
60
|
+
export function featureDim(X) {
|
|
61
|
+
if (X.length === 0)
|
|
62
|
+
throw new Error("no samples");
|
|
63
|
+
const d = X[0].length;
|
|
64
|
+
for (const x of X)
|
|
65
|
+
if (x.length !== d)
|
|
66
|
+
throw new Error(`ragged features: expected ${d}, got ${x.length}`);
|
|
67
|
+
return d;
|
|
68
|
+
}
|
|
69
|
+
/** Confidence of a probability vector: its top probability. */
|
|
70
|
+
export function topProbability(p) {
|
|
71
|
+
return p.length ? Math.max(...p) : 0;
|
|
72
|
+
}
|
|
73
|
+
/** A deterministic [0,1) source for algorithms that sample — the engine's ONE seeded RNG. */
|
|
74
|
+
export function seededUniform(seed) {
|
|
75
|
+
const rng = new SeededRng(seed);
|
|
76
|
+
return () => rng.next();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Average path length of an unsuccessful BST search over n points — the
|
|
80
|
+
* isolation-forest normaliser c(n).
|
|
81
|
+
*/
|
|
82
|
+
export function averagePathLength(n) {
|
|
83
|
+
if (n <= 1)
|
|
84
|
+
return 0;
|
|
85
|
+
if (n === 2)
|
|
86
|
+
return 1;
|
|
87
|
+
const harmonic = Math.log(n - 1) + 0.5772156649;
|
|
88
|
+
return 2 * harmonic - (2 * (n - 1)) / n;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/ml/classical/math.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/naive_bayes.ts — Gaussian naive Bayes.
|
|
3
|
+
*
|
|
4
|
+
* Per class: a weighted prior, and an independent Gaussian per feature. Variance
|
|
5
|
+
* is smoothed by a fraction of the largest feature variance (as scikit-learn's
|
|
6
|
+
* `var_smoothing`), so a constant feature never divides by zero.
|
|
7
|
+
*
|
|
8
|
+
* A class with no training weight has prior −∞ and probability exactly 0: its
|
|
9
|
+
* Gaussian is a placeholder (mean 0, variance ≈ the smoothing floor), which would
|
|
10
|
+
* otherwise out-score every real class on an input near zero.
|
|
11
|
+
*/
|
|
12
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
13
|
+
export interface NaiveBayesOptions {
|
|
14
|
+
classes?: number;
|
|
15
|
+
/** Fraction of the largest feature variance added to every variance. Default 1e-9. */
|
|
16
|
+
varSmoothing?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class NaiveBayesModel implements MlPredictor {
|
|
19
|
+
readonly logPrior: Float64Array;
|
|
20
|
+
readonly mean: Float64Array[];
|
|
21
|
+
readonly variance: Float64Array[];
|
|
22
|
+
constructor(logPrior: Float64Array, mean: Float64Array[], variance: Float64Array[]);
|
|
23
|
+
/** Per-class joint log-likelihood log P(c) + Σ log N(x_i | μ, σ²); −∞ for an unseen class. */
|
|
24
|
+
jointLogLikelihood(x: ArrayLike<number>): number[];
|
|
25
|
+
predict(x: Float32Array): MlPrediction;
|
|
26
|
+
}
|
|
27
|
+
export declare function fitNaiveBayes(samples: readonly MlSample[], opts?: NaiveBayesOptions): NaiveBayesModel;
|
|
28
|
+
//# sourceMappingURL=naive_bayes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/naive_bayes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAgB,YAAW,WAAW;IAE/C,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE;IAC7B,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE;gBAFxB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,YAAY,EAAE,EACpB,QAAQ,EAAE,YAAY,EAAE;IAGnC,8FAA8F;IAC9F,kBAAkB,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAalD,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;CAIvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,iBAAsB,GAAG,eAAe,CAoCzG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { classCount, featureDim, softmax, topProbability } from "./math.js";
|
|
2
|
+
export class NaiveBayesModel {
|
|
3
|
+
logPrior;
|
|
4
|
+
mean;
|
|
5
|
+
variance;
|
|
6
|
+
constructor(logPrior, mean, variance) {
|
|
7
|
+
this.logPrior = logPrior;
|
|
8
|
+
this.mean = mean;
|
|
9
|
+
this.variance = variance;
|
|
10
|
+
}
|
|
11
|
+
/** Per-class joint log-likelihood log P(c) + Σ log N(x_i | μ, σ²); −∞ for an unseen class. */
|
|
12
|
+
jointLogLikelihood(x) {
|
|
13
|
+
return this.mean.map((mu, c) => {
|
|
14
|
+
const v = this.variance[c];
|
|
15
|
+
let ll = this.logPrior[c];
|
|
16
|
+
if (ll === -Infinity)
|
|
17
|
+
return ll;
|
|
18
|
+
for (let i = 0; i < mu.length; i++) {
|
|
19
|
+
const d = (x[i] ?? 0) - mu[i];
|
|
20
|
+
ll += -0.5 * Math.log(2 * Math.PI * v[i]) - (d * d) / (2 * v[i]);
|
|
21
|
+
}
|
|
22
|
+
return ll;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
predict(x) {
|
|
26
|
+
const scores = Array.from(softmax(this.jointLogLikelihood(x)));
|
|
27
|
+
return { scores, confidence: topProbability(scores) };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function fitNaiveBayes(samples, opts = {}) {
|
|
31
|
+
const d = featureDim(samples.map((s) => s.x));
|
|
32
|
+
const k = opts.classes ?? classCount(samples.map((s) => s.y));
|
|
33
|
+
const wSum = new Float64Array(k);
|
|
34
|
+
const mean = Array.from({ length: k }, () => new Float64Array(d));
|
|
35
|
+
const variance = Array.from({ length: k }, () => new Float64Array(d));
|
|
36
|
+
for (const s of samples) {
|
|
37
|
+
const w = s.weight ?? 1;
|
|
38
|
+
wSum[s.y] = wSum[s.y] + w;
|
|
39
|
+
for (let i = 0; i < d; i++)
|
|
40
|
+
mean[s.y][i] = mean[s.y][i] + w * s.x[i];
|
|
41
|
+
}
|
|
42
|
+
for (let c = 0; c < k; c++)
|
|
43
|
+
if (wSum[c] > 0)
|
|
44
|
+
for (let i = 0; i < d; i++)
|
|
45
|
+
mean[c][i] = mean[c][i] / wSum[c];
|
|
46
|
+
for (const s of samples) {
|
|
47
|
+
const w = s.weight ?? 1;
|
|
48
|
+
for (let i = 0; i < d; i++) {
|
|
49
|
+
const diff = s.x[i] - mean[s.y][i];
|
|
50
|
+
variance[s.y][i] = variance[s.y][i] + w * diff * diff;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let maxVar = 0;
|
|
54
|
+
for (let c = 0; c < k; c++) {
|
|
55
|
+
for (let i = 0; i < d; i++) {
|
|
56
|
+
variance[c][i] = wSum[c] > 0 ? variance[c][i] / wSum[c] : 0;
|
|
57
|
+
maxVar = Math.max(maxVar, variance[c][i]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const eps = (opts.varSmoothing ?? 1e-9) * Math.max(maxVar, 1e-12) + 1e-12;
|
|
61
|
+
for (let c = 0; c < k; c++)
|
|
62
|
+
for (let i = 0; i < d; i++)
|
|
63
|
+
variance[c][i] = variance[c][i] + eps;
|
|
64
|
+
const total = wSum.reduce((a, b) => a + b, 0);
|
|
65
|
+
if (!(total > 0))
|
|
66
|
+
throw new Error("fitNaiveBayes: the samples carry no weight");
|
|
67
|
+
// An unseen class is masked out (−∞, so softmax gives it exactly 0). At least one
|
|
68
|
+
// class has weight, so softmax always has a finite maximum.
|
|
69
|
+
const logPrior = Float64Array.from(wSum, (w) => (w > 0 ? Math.log(w / total) : -Infinity));
|
|
70
|
+
return new NaiveBayesModel(logPrior, mean, variance);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=naive_bayes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naive_bayes.js","sourceRoot":"","sources":["../../../src/ml/classical/naive_bayes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/classical/robust_z.ts — robust (median/MAD) z-scores for anomaly detection.
|
|
3
|
+
*
|
|
4
|
+
* Per feature: z = |x − median| / (1.4826 · MAD). Median and MAD are not dragged
|
|
5
|
+
* by the very outliers being looked for, unlike mean and standard deviation. When
|
|
6
|
+
* MAD is 0 (more than half the history identical) the mean absolute deviation
|
|
7
|
+
* stands in, then two floors: a fraction of |median| (relative) and `minScale`
|
|
8
|
+
* (absolute, in the feature's own units). Without the absolute one a history that
|
|
9
|
+
* is all zeros — no tool failures, ever — gets a scale of ~1e-9, and the first
|
|
10
|
+
* small non-zero value scores astronomically.
|
|
11
|
+
*
|
|
12
|
+
* Prediction: `scores[0] = max_i z_i / threshold` — ≥ 1 is anomalous.
|
|
13
|
+
*/
|
|
14
|
+
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
15
|
+
export interface RobustZOptions {
|
|
16
|
+
/** z at which a feature counts as anomalous. Default 3.5 (Iglewicz & Hoaglin). */
|
|
17
|
+
threshold?: number;
|
|
18
|
+
/** Smallest scale per feature, as a fraction of |median| (plus 1e-9). Default 0.01. */
|
|
19
|
+
minScaleFraction?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Smallest scale per feature in absolute feature units. Default 0 — the algorithm
|
|
22
|
+
* cannot know the units; a task on a fixed scale sets it (`run.anomaly` does).
|
|
23
|
+
*/
|
|
24
|
+
minScale?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class RobustZModel implements MlPredictor {
|
|
27
|
+
readonly center: Float64Array;
|
|
28
|
+
readonly scale: Float64Array;
|
|
29
|
+
readonly threshold: number;
|
|
30
|
+
constructor(center: Float64Array, scale: Float64Array, threshold: number);
|
|
31
|
+
/** Per-feature robust z-scores (absolute). */
|
|
32
|
+
zScores(x: ArrayLike<number>): number[];
|
|
33
|
+
predict(x: Float32Array): MlPrediction;
|
|
34
|
+
}
|
|
35
|
+
/** Confidence of an anomaly score normalised so 1 is the threshold: distance from it, capped. */
|
|
36
|
+
export declare function anomalyConfidence(score: number): number;
|
|
37
|
+
export declare function fitRobustZ(samples: readonly MlSample[], opts?: RobustZOptions): RobustZModel;
|
|
38
|
+
//# sourceMappingURL=robust_z.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robust_z.d.ts","sourceRoot":"","sources":["../../../src/ml/classical/robust_z.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvE,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAa,YAAW,WAAW;IAE5C,QAAQ,CAAC,MAAM,EAAE,YAAY;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAFjB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM;IAG5B,8CAA8C;IAC9C,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAIvC,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;CAIvC;AAED,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,cAAmB,GAAG,YAAY,CAiBhG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { featureDim, median } from "./math.js";
|
|
2
|
+
/** MAD → standard deviation for normally-distributed data. */
|
|
3
|
+
const MAD_TO_SD = 1.4826;
|
|
4
|
+
/** Mean absolute deviation → standard deviation for normally-distributed data. */
|
|
5
|
+
const MEANAD_TO_SD = 1.2533;
|
|
6
|
+
export class RobustZModel {
|
|
7
|
+
center;
|
|
8
|
+
scale;
|
|
9
|
+
threshold;
|
|
10
|
+
constructor(center, scale, threshold) {
|
|
11
|
+
this.center = center;
|
|
12
|
+
this.scale = scale;
|
|
13
|
+
this.threshold = threshold;
|
|
14
|
+
}
|
|
15
|
+
/** Per-feature robust z-scores (absolute). */
|
|
16
|
+
zScores(x) {
|
|
17
|
+
return Array.from(this.center, (c, i) => Math.abs((x[i] ?? 0) - c) / this.scale[i]);
|
|
18
|
+
}
|
|
19
|
+
predict(x) {
|
|
20
|
+
const score = Math.max(0, ...this.zScores(x)) / this.threshold;
|
|
21
|
+
return { scores: [score], confidence: anomalyConfidence(score) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Confidence of an anomaly score normalised so 1 is the threshold: distance from it, capped. */
|
|
25
|
+
export function anomalyConfidence(score) {
|
|
26
|
+
return Math.max(0, Math.min(1, Math.abs(score - 1)));
|
|
27
|
+
}
|
|
28
|
+
export function fitRobustZ(samples, opts = {}) {
|
|
29
|
+
const X = samples.map((s) => s.x);
|
|
30
|
+
const d = featureDim(X);
|
|
31
|
+
const minFrac = opts.minScaleFraction ?? 0.01;
|
|
32
|
+
const minAbs = opts.minScale ?? 0;
|
|
33
|
+
const center = new Float64Array(d);
|
|
34
|
+
const scale = new Float64Array(d);
|
|
35
|
+
for (let i = 0; i < d; i++) {
|
|
36
|
+
const col = X.map((x) => x[i]);
|
|
37
|
+
const med = median(col);
|
|
38
|
+
const dev = col.map((v) => Math.abs(v - med));
|
|
39
|
+
let s = MAD_TO_SD * median(dev);
|
|
40
|
+
if (!(s > 0))
|
|
41
|
+
s = MEANAD_TO_SD * (dev.reduce((a, b) => a + b, 0) / dev.length);
|
|
42
|
+
center[i] = med;
|
|
43
|
+
scale[i] = Math.max(s, minFrac * Math.abs(med) + 1e-9, minAbs);
|
|
44
|
+
}
|
|
45
|
+
return new RobustZModel(center, scale, opts.threshold ?? 3.5);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=robust_z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robust_z.js","sourceRoot":"","sources":["../../../src/ml/classical/robust_z.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type HeadParam, type TrainableHead } from "./head_trainer.js";
|
|
2
|
+
import type { MlPrediction, MlPredictor, MlSample } from "./types.js";
|
|
3
|
+
export interface DenseHeadConfig {
|
|
4
|
+
inputDim: number;
|
|
5
|
+
/** Hidden width; 0 = a linear head. */
|
|
6
|
+
hiddenDim: number;
|
|
7
|
+
/** Classes (softmax) or 1 (mse regression). */
|
|
8
|
+
outputDim: number;
|
|
9
|
+
/** `softmax` = classification over `outputDim` classes; `mse` = scalar regression. */
|
|
10
|
+
objective: "softmax" | "mse";
|
|
11
|
+
seed?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class DenseHead implements TrainableHead<MlSample>, MlPredictor {
|
|
14
|
+
readonly config: Required<DenseHeadConfig>;
|
|
15
|
+
private readonly _params;
|
|
16
|
+
private readonly _grads;
|
|
17
|
+
constructor(config: DenseHeadConfig);
|
|
18
|
+
private _p;
|
|
19
|
+
private _g;
|
|
20
|
+
parameters(): HeadParam[];
|
|
21
|
+
gradients(): HeadParam[];
|
|
22
|
+
zeroGrad(): void;
|
|
23
|
+
/** Hidden activation (or the input itself for a linear head) and the output logits/value. */
|
|
24
|
+
private _forward;
|
|
25
|
+
/** Loss and dLoss/dz of one sample (unweighted). */
|
|
26
|
+
private _lossGrad;
|
|
27
|
+
loss(s: MlSample): number;
|
|
28
|
+
accumulate(s: MlSample): number;
|
|
29
|
+
predict(x: Float32Array): MlPrediction;
|
|
30
|
+
exportParams(): Float32Array;
|
|
31
|
+
importParams(params: ArrayLike<number>): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=dense_head.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dense_head.d.ts","sourceRoot":"","sources":["../../src/ml/dense_head.ts"],"names":[],"mappings":"AAUA,OAAO,EAA+B,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAU,YAAW,aAAa,CAAC,QAAQ,CAAC,EAAE,WAAW;IACpE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,eAAe;IAsBnC,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,EAAE;IAIV,UAAU,IAAI,SAAS,EAAE;IAIzB,SAAS,IAAI,SAAS,EAAE;IAIxB,QAAQ,IAAI,IAAI;IAIhB,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IA0BhB,oDAAoD;IACpD,OAAO,CAAC,SAAS;IAUjB,IAAI,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM;IAIzB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM;IA6B/B,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;IAOtC,YAAY,IAAI,YAAY;IAI5B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;CAG9C"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/dense_head.ts — the catalog's trainable head: linear, or one tanh hidden layer,
|
|
3
|
+
* over a feature vector (usually an experience embedding).
|
|
4
|
+
*
|
|
5
|
+
* It is a {@link TrainableHead} (so the ONE {@link HeadTrainer} fits it, on the
|
|
6
|
+
* GPU when there is one) and an {@link MlPredictor} (so the runner answers with
|
|
7
|
+
* it). Its parameters flatten to one vector — the unit that federates.
|
|
8
|
+
*/
|
|
9
|
+
import { gaussianArray, SeededRng } from "../utils/rng.js";
|
|
10
|
+
import { softmax } from "../training/cpu_ops.js";
|
|
11
|
+
import { assignParams, flattenParams } from "./head_trainer.js";
|
|
12
|
+
export class DenseHead {
|
|
13
|
+
config;
|
|
14
|
+
_params;
|
|
15
|
+
_grads;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = { seed: 0x4e4d, ...config };
|
|
18
|
+
const { inputDim, hiddenDim, outputDim, objective } = this.config;
|
|
19
|
+
if (objective === "mse" && outputDim !== 1)
|
|
20
|
+
throw new Error("DenseHead: mse objective needs outputDim 1");
|
|
21
|
+
if (objective === "softmax" && outputDim < 2)
|
|
22
|
+
throw new Error("DenseHead: softmax objective needs outputDim ≥ 2");
|
|
23
|
+
const rng = new SeededRng(this.config.seed);
|
|
24
|
+
const next = () => rng.next();
|
|
25
|
+
const inner = hiddenDim > 0 ? hiddenDim : inputDim;
|
|
26
|
+
const shapes = [
|
|
27
|
+
...(hiddenDim > 0
|
|
28
|
+
? [
|
|
29
|
+
["w1", hiddenDim * inputDim, 1 / Math.sqrt(inputDim)],
|
|
30
|
+
["b1", hiddenDim, 0],
|
|
31
|
+
]
|
|
32
|
+
: []),
|
|
33
|
+
["w2", outputDim * inner, 1 / Math.sqrt(inner)],
|
|
34
|
+
["b2", outputDim, 0],
|
|
35
|
+
];
|
|
36
|
+
this._params = shapes.map(([name, n, std]) => ({ name, numel: n, data: std > 0 ? gaussianArray(n, std, next) : new Float32Array(n) }));
|
|
37
|
+
this._grads = shapes.map(([name, n]) => ({ name, numel: n, data: new Float32Array(n) }));
|
|
38
|
+
}
|
|
39
|
+
_p(name) {
|
|
40
|
+
return this._params.find((p) => p.name === name).data;
|
|
41
|
+
}
|
|
42
|
+
_g(name) {
|
|
43
|
+
return this._grads.find((p) => p.name === name).data;
|
|
44
|
+
}
|
|
45
|
+
parameters() {
|
|
46
|
+
return this._params;
|
|
47
|
+
}
|
|
48
|
+
gradients() {
|
|
49
|
+
return this._grads;
|
|
50
|
+
}
|
|
51
|
+
zeroGrad() {
|
|
52
|
+
for (const g of this._grads)
|
|
53
|
+
g.data.fill(0);
|
|
54
|
+
}
|
|
55
|
+
/** Hidden activation (or the input itself for a linear head) and the output logits/value. */
|
|
56
|
+
_forward(x) {
|
|
57
|
+
const { inputDim, hiddenDim, outputDim } = this.config;
|
|
58
|
+
let h;
|
|
59
|
+
if (hiddenDim > 0) {
|
|
60
|
+
const w1 = this._p("w1");
|
|
61
|
+
const b1 = this._p("b1");
|
|
62
|
+
h = new Float32Array(hiddenDim);
|
|
63
|
+
for (let j = 0; j < hiddenDim; j++) {
|
|
64
|
+
let s = b1[j];
|
|
65
|
+
for (let i = 0; i < inputDim; i++)
|
|
66
|
+
s += w1[j * inputDim + i] * (x[i] ?? 0);
|
|
67
|
+
h[j] = Math.tanh(s);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
h = Float32Array.from({ length: inputDim }, (_, i) => x[i] ?? 0);
|
|
72
|
+
}
|
|
73
|
+
const w2 = this._p("w2");
|
|
74
|
+
const b2 = this._p("b2");
|
|
75
|
+
const z = new Float32Array(outputDim);
|
|
76
|
+
for (let k = 0; k < outputDim; k++) {
|
|
77
|
+
let s = b2[k];
|
|
78
|
+
for (let j = 0; j < h.length; j++)
|
|
79
|
+
s += w2[k * h.length + j] * h[j];
|
|
80
|
+
z[k] = s;
|
|
81
|
+
}
|
|
82
|
+
return { h, z };
|
|
83
|
+
}
|
|
84
|
+
/** Loss and dLoss/dz of one sample (unweighted). */
|
|
85
|
+
_lossGrad(z, y) {
|
|
86
|
+
if (this.config.objective === "mse") {
|
|
87
|
+
const d = z[0] - y;
|
|
88
|
+
return { loss: 0.5 * d * d, dz: Float32Array.of(d) };
|
|
89
|
+
}
|
|
90
|
+
const p = softmax(z);
|
|
91
|
+
const dz = Float32Array.from(p, (v, k) => v - (k === y ? 1 : 0));
|
|
92
|
+
return { loss: -Math.log(Math.max(p[y] ?? 0, 1e-12)), dz };
|
|
93
|
+
}
|
|
94
|
+
loss(s) {
|
|
95
|
+
return (s.weight ?? 1) * this._lossGrad(this._forward(s.x).z, s.y).loss;
|
|
96
|
+
}
|
|
97
|
+
accumulate(s) {
|
|
98
|
+
const w = s.weight ?? 1;
|
|
99
|
+
const { inputDim, hiddenDim, outputDim } = this.config;
|
|
100
|
+
const { h, z } = this._forward(s.x);
|
|
101
|
+
const { loss, dz } = this._lossGrad(z, s.y);
|
|
102
|
+
const w2 = this._p("w2");
|
|
103
|
+
const gW2 = this._g("w2");
|
|
104
|
+
const gB2 = this._g("b2");
|
|
105
|
+
const dh = new Float32Array(h.length);
|
|
106
|
+
for (let k = 0; k < outputDim; k++) {
|
|
107
|
+
const g = w * dz[k];
|
|
108
|
+
gB2[k] = gB2[k] + g;
|
|
109
|
+
for (let j = 0; j < h.length; j++) {
|
|
110
|
+
gW2[k * h.length + j] = gW2[k * h.length + j] + g * h[j];
|
|
111
|
+
dh[j] = dh[j] + g * w2[k * h.length + j];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (hiddenDim > 0) {
|
|
115
|
+
const gW1 = this._g("w1");
|
|
116
|
+
const gB1 = this._g("b1");
|
|
117
|
+
for (let j = 0; j < hiddenDim; j++) {
|
|
118
|
+
const dpre = dh[j] * (1 - h[j] * h[j]);
|
|
119
|
+
gB1[j] = gB1[j] + dpre;
|
|
120
|
+
for (let i = 0; i < inputDim; i++)
|
|
121
|
+
gW1[j * inputDim + i] = gW1[j * inputDim + i] + dpre * (s.x[i] ?? 0);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return w * loss;
|
|
125
|
+
}
|
|
126
|
+
predict(x) {
|
|
127
|
+
const { z } = this._forward(x);
|
|
128
|
+
if (this.config.objective === "mse")
|
|
129
|
+
return { scores: [z[0]], confidence: 1 };
|
|
130
|
+
const scores = Array.from(softmax(z));
|
|
131
|
+
return { scores, confidence: Math.max(...scores) };
|
|
132
|
+
}
|
|
133
|
+
exportParams() {
|
|
134
|
+
return flattenParams(this._params);
|
|
135
|
+
}
|
|
136
|
+
importParams(params) {
|
|
137
|
+
assignParams(this._params, params);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=dense_head.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dense_head.js","sourceRoot":"","sources":["../../src/ml/dense_head.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/eval_loss.ts — the ONE held-out loss for catalog models.
|
|
3
|
+
*
|
|
4
|
+
* What the trainer reports as `holdoutLoss`, what a federated merge is gated on, and
|
|
5
|
+
* what `LogisticModel.loss` returns. A leaf (types only), so a classical algorithm can
|
|
6
|
+
* use it without importing the trainer that imports the algorithms.
|
|
7
|
+
*/
|
|
8
|
+
import type { MlPredictor, MlSample, MlTaskKind } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Mean loss of `predictor` on `samples` for a task of `kind` — classify: weighted
|
|
11
|
+
* cross-entropy of the true class; regress: weighted ½·squared error. Null for
|
|
12
|
+
* kinds without a supervised loss, or an empty (or zero-weight) set.
|
|
13
|
+
*/
|
|
14
|
+
export declare function mlEvalLoss(kind: MlTaskKind, predictor: MlPredictor, samples: readonly MlSample[]): number | null;
|
|
15
|
+
//# sourceMappingURL=eval_loss.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval_loss.d.ts","sourceRoot":"","sources":["../../src/ml/eval_loss.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,CAYhH"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mean loss of `predictor` on `samples` for a task of `kind` — classify: weighted
|
|
3
|
+
* cross-entropy of the true class; regress: weighted ½·squared error. Null for
|
|
4
|
+
* kinds without a supervised loss, or an empty (or zero-weight) set.
|
|
5
|
+
*/
|
|
6
|
+
export function mlEvalLoss(kind, predictor, samples) {
|
|
7
|
+
if (samples.length === 0 || (kind !== "classify" && kind !== "regress"))
|
|
8
|
+
return null;
|
|
9
|
+
let sum = 0;
|
|
10
|
+
let wSum = 0;
|
|
11
|
+
for (const s of samples) {
|
|
12
|
+
const w = s.weight ?? 1;
|
|
13
|
+
const p = predictor.predict(s.x);
|
|
14
|
+
const loss = kind === "classify" ? -Math.log(Math.max(p.scores[s.y] ?? 0, 1e-12)) : 0.5 * (p.scores[0] - s.y) ** 2;
|
|
15
|
+
sum += w * loss;
|
|
16
|
+
wSum += w;
|
|
17
|
+
}
|
|
18
|
+
return wSum > 0 ? sum / wSum : null;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=eval_loss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval_loss.js","sourceRoot":"","sources":["../../src/ml/eval_loss.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,SAAsB,EAAE,OAA4B;IAC/F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpH,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAChB,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/features.ts — how an input becomes a feature vector.
|
|
3
|
+
*
|
|
4
|
+
* Text goes through the existing CPU embedder seam ({@link TextEmbedder}, which
|
|
5
|
+
* `EvermindTextEmbedder` implements: the person's own Evermind turns text into
|
|
6
|
+
* an L2-normalised vector with no GPU and no network). Numeric fields are
|
|
7
|
+
* appended as the task supplies them — on a FIXED scale (see {@link logScale}),
|
|
8
|
+
* never one fitted to local data, so a federated weight means the same thing on
|
|
9
|
+
* every machine.
|
|
10
|
+
*/
|
|
11
|
+
import type { TextEmbedder } from "../lm/text_embedder.js";
|
|
12
|
+
import type { FeatureSpec } from "./types.js";
|
|
13
|
+
export type { TextEmbedder } from "../lm/text_embedder.js";
|
|
14
|
+
/** Feature vector of one input: `[embed(text) …, numeric …]`. */
|
|
15
|
+
export declare function extractFeatures<I>(spec: FeatureSpec<I>, input: I, embedder?: TextEmbedder): Promise<Float32Array>;
|
|
16
|
+
/** Feature vectors of many inputs, in order. */
|
|
17
|
+
export declare function extractFeatureMatrix<I>(spec: FeatureSpec<I>, inputs: readonly I[], embedder?: TextEmbedder): Promise<Float32Array[]>;
|
|
18
|
+
/**
|
|
19
|
+
* A count or size on a fixed log scale: log1p(max(v, 0)) / log1p(ref). `ref` is
|
|
20
|
+
* the value that maps to 1 (e.g. 100k tokens), so the scale is the same everywhere.
|
|
21
|
+
*/
|
|
22
|
+
export declare function logScale(v: number, ref: number): number;
|
|
23
|
+
/** A ratio clamped to [0, max] — fill fractions, success rates. */
|
|
24
|
+
export declare function clampRatio(numerator: number, denominator: number, max?: number): number;
|
|
25
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/ml/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,iEAAiE;AACjE,wBAAsB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAmBvH;AAED,gDAAgD;AAChD,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAIzB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,MAAM,CAGlF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Feature vector of one input: `[embed(text) …, numeric …]`. */
|
|
2
|
+
export async function extractFeatures(spec, input, embedder) {
|
|
3
|
+
const parts = [];
|
|
4
|
+
if (spec.text) {
|
|
5
|
+
if (!embedder)
|
|
6
|
+
throw new Error("extractFeatures: this task embeds text but no embedder was supplied");
|
|
7
|
+
parts.push(await embedder.embed(spec.text(input)));
|
|
8
|
+
}
|
|
9
|
+
if (spec.numeric) {
|
|
10
|
+
const nums = spec.numeric(input);
|
|
11
|
+
for (const v of nums)
|
|
12
|
+
if (!Number.isFinite(v))
|
|
13
|
+
throw new Error(`extractFeatures: non-finite numeric feature ${v}`);
|
|
14
|
+
parts.push(nums);
|
|
15
|
+
}
|
|
16
|
+
if (parts.length === 0)
|
|
17
|
+
throw new Error("extractFeatures: the feature spec has neither text nor numeric fields");
|
|
18
|
+
const out = new Float32Array(parts.reduce((n, p) => n + p.length, 0));
|
|
19
|
+
let o = 0;
|
|
20
|
+
for (const p of parts) {
|
|
21
|
+
out.set(p, o);
|
|
22
|
+
o += p.length;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** Feature vectors of many inputs, in order. */
|
|
27
|
+
export async function extractFeatureMatrix(spec, inputs, embedder) {
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const i of inputs)
|
|
30
|
+
out.push(await extractFeatures(spec, i, embedder));
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A count or size on a fixed log scale: log1p(max(v, 0)) / log1p(ref). `ref` is
|
|
35
|
+
* the value that maps to 1 (e.g. 100k tokens), so the scale is the same everywhere.
|
|
36
|
+
*/
|
|
37
|
+
export function logScale(v, ref) {
|
|
38
|
+
return Math.log1p(Math.max(0, v)) / Math.log1p(Math.max(ref, 1));
|
|
39
|
+
}
|
|
40
|
+
/** A ratio clamped to [0, max] — fill fractions, success rates. */
|
|
41
|
+
export function clampRatio(numerator, denominator, max = 4) {
|
|
42
|
+
if (!(denominator > 0))
|
|
43
|
+
return 0;
|
|
44
|
+
return Math.max(0, Math.min(max, numerator / denominator));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ml/features.ts"],"names":[],"mappings":"AAeA,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,IAAoB,EAAE,KAAQ,EAAE,QAAuB;IAC9F,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACtG,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,EAAE,CAAC,CAAC;QACnH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACjH,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACd,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAoB,EACpB,MAAoB,EACpB,QAAuB;IAEvB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,GAAW;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,WAAmB,EAAE,GAAG,GAAG,CAAC;IACxE,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|