margin-ts 0.7.0 → 0.7.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/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # margin
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/margin-ts.svg)](https://www.npmjs.com/package/margin-ts)
4
+ [![npm downloads](https://img.shields.io/npm/dm/margin-ts.svg)](https://www.npmjs.com/package/margin-ts)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
6
+
3
7
  **Typed health classification for systems that measure things.**
4
8
 
5
9
  TypeScript port of the [Python margin library](https://github.com/sethc5/margin). Zero dependencies.
@@ -1 +1 @@
1
- {"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,oBAAY,YAAY;IACtB,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKzD,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,qBAAqB,GAAG,IAAI,CA+C9B"}
1
+ {"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,oBAAY,YAAY;IACtB,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKzD,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,qBAAqB,GAAG,IAAI,CAmD9B"}
package/dist/anomaly.js CHANGED
@@ -53,9 +53,10 @@ function classifyAnomaly(value, reference, options = {}) {
53
53
  const refMin = Math.min(...reference);
54
54
  const refMax = Math.max(...reference);
55
55
  const n = reference.length;
56
- // Z-score
56
+ // Z-score — tolerance guards against floating-point noise from constant
57
+ // reference windows (e.g. sum([0.1]*20)/20 yields std ≈ 1.4e-17, not 0.0).
57
58
  let z;
58
- if (refStd > 0) {
59
+ if (refStd > 1e-12) {
59
60
  z = (value - refMean) / refStd;
60
61
  }
61
62
  else {
@@ -63,7 +64,10 @@ function classifyAnomaly(value, reference, options = {}) {
63
64
  }
64
65
  // Novelty check
65
66
  const refRange = refMax - refMin;
66
- const margin = refRange > 0 ? Math.max(refRange * novelMargin, refStd) : refStd * 2;
67
+ const effectiveStd = refStd > 1e-12 ? refStd : 0;
68
+ const margin = refRange > 1e-12
69
+ ? Math.max(refRange * novelMargin, effectiveStd)
70
+ : effectiveStd * 2;
67
71
  const isNovel = value < refMin - margin || value > refMax + margin;
68
72
  // Classification
69
73
  let state;
@@ -1 +1 @@
1
- {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "margin-ts",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Typed health classification for systems that measure things. Zero dependencies.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,14 @@
18
18
  "license": "MIT",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "https://github.com/sethc5/margin-ts"
21
+ "url": "git+https://github.com/sethc5/margin-ts.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/sethc5/margin-ts/issues"
25
+ },
26
+ "homepage": "https://github.com/sethc5/margin-ts#readme",
27
+ "engines": {
28
+ "node": ">=18"
22
29
  },
23
30
  "files": ["dist", "src"],
24
31
  "devDependencies": {
package/src/anomaly.ts CHANGED
@@ -76,9 +76,10 @@ export function classifyAnomaly(
76
76
  const refMax = Math.max(...reference);
77
77
  const n = reference.length;
78
78
 
79
- // Z-score
79
+ // Z-score — tolerance guards against floating-point noise from constant
80
+ // reference windows (e.g. sum([0.1]*20)/20 yields std ≈ 1.4e-17, not 0.0).
80
81
  let z: number;
81
- if (refStd > 0) {
82
+ if (refStd > 1e-12) {
82
83
  z = (value - refMean) / refStd;
83
84
  } else {
84
85
  z = value === refMean ? 0 : (value > refMean ? Infinity : -Infinity);
@@ -86,7 +87,10 @@ export function classifyAnomaly(
86
87
 
87
88
  // Novelty check
88
89
  const refRange = refMax - refMin;
89
- const margin = refRange > 0 ? Math.max(refRange * novelMargin, refStd) : refStd * 2;
90
+ const effectiveStd = refStd > 1e-12 ? refStd : 0;
91
+ const margin = refRange > 1e-12
92
+ ? Math.max(refRange * novelMargin, effectiveStd)
93
+ : effectiveStd * 2;
90
94
  const isNovel = value < refMin - margin || value > refMax + margin;
91
95
 
92
96
  // Classification