nirs4all-ui 0.1.16 → 0.2.0

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 (138) hide show
  1. package/README.md +20 -0
  2. package/assets/dropzone.css +21 -0
  3. package/assets/pipeline-presets.css +38 -0
  4. package/assets/qualification.css +142 -0
  5. package/dist/components/DatasetDropzone.d.ts +44 -0
  6. package/dist/components/DatasetDropzone.d.ts.map +1 -0
  7. package/dist/components/DatasetDropzone.js +84 -0
  8. package/dist/components/DatasetDropzone.js.map +1 -0
  9. package/dist/components/PipelinePresetCard.d.ts +16 -0
  10. package/dist/components/PipelinePresetCard.d.ts.map +1 -0
  11. package/dist/components/PipelinePresetCard.js +21 -0
  12. package/dist/components/PipelinePresetCard.js.map +1 -0
  13. package/dist/components/index.d.ts +2 -0
  14. package/dist/components/index.d.ts.map +1 -1
  15. package/dist/components/index.js +2 -0
  16. package/dist/components/index.js.map +1 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/pipelines/canonicalPipelinePreview.d.ts +21 -0
  22. package/dist/pipelines/canonicalPipelinePreview.d.ts.map +1 -0
  23. package/dist/pipelines/canonicalPipelinePreview.js +384 -0
  24. package/dist/pipelines/canonicalPipelinePreview.js.map +1 -0
  25. package/dist/pipelines/index.d.ts +5 -0
  26. package/dist/pipelines/index.d.ts.map +1 -0
  27. package/dist/pipelines/index.js +5 -0
  28. package/dist/pipelines/index.js.map +1 -0
  29. package/dist/pipelines/pipelineStats.d.ts +27 -0
  30. package/dist/pipelines/pipelineStats.d.ts.map +1 -0
  31. package/dist/pipelines/pipelineStats.js +128 -0
  32. package/dist/pipelines/pipelineStats.js.map +1 -0
  33. package/dist/pipelines/presets.d.ts +50 -0
  34. package/dist/pipelines/presets.d.ts.map +1 -0
  35. package/dist/pipelines/presets.js +92 -0
  36. package/dist/pipelines/presets.js.map +1 -0
  37. package/dist/pipelines/studio-presets.json +3996 -0
  38. package/dist/pipelines/studioPresets.d.ts +21 -0
  39. package/dist/pipelines/studioPresets.d.ts.map +1 -0
  40. package/dist/pipelines/studioPresets.js +12 -0
  41. package/dist/pipelines/studioPresets.js.map +1 -0
  42. package/dist/qualification/AvailabilitySummary.d.ts +3 -1
  43. package/dist/qualification/AvailabilitySummary.d.ts.map +1 -1
  44. package/dist/qualification/AvailabilitySummary.js +2 -2
  45. package/dist/qualification/AvailabilitySummary.js.map +1 -1
  46. package/dist/qualification/CapabilityGrid.d.ts +10 -0
  47. package/dist/qualification/CapabilityGrid.d.ts.map +1 -0
  48. package/dist/qualification/CapabilityGrid.js +16 -0
  49. package/dist/qualification/CapabilityGrid.js.map +1 -0
  50. package/dist/qualification/CheckList.d.ts +19 -0
  51. package/dist/qualification/CheckList.d.ts.map +1 -0
  52. package/dist/qualification/CheckList.js +14 -0
  53. package/dist/qualification/CheckList.js.map +1 -0
  54. package/dist/qualification/ComparisonMatrix.d.ts +37 -0
  55. package/dist/qualification/ComparisonMatrix.d.ts.map +1 -0
  56. package/dist/qualification/ComparisonMatrix.js +30 -0
  57. package/dist/qualification/ComparisonMatrix.js.map +1 -0
  58. package/dist/qualification/EigenvalueScree.d.ts +17 -0
  59. package/dist/qualification/EigenvalueScree.d.ts.map +1 -0
  60. package/dist/qualification/EigenvalueScree.js +39 -0
  61. package/dist/qualification/EigenvalueScree.js.map +1 -0
  62. package/dist/qualification/EvidenceTable.d.ts +3 -1
  63. package/dist/qualification/EvidenceTable.d.ts.map +1 -1
  64. package/dist/qualification/EvidenceTable.js +14 -6
  65. package/dist/qualification/EvidenceTable.js.map +1 -1
  66. package/dist/qualification/FindingList.d.ts +3 -1
  67. package/dist/qualification/FindingList.d.ts.map +1 -1
  68. package/dist/qualification/FindingList.js +5 -3
  69. package/dist/qualification/FindingList.js.map +1 -1
  70. package/dist/qualification/HypothesisTestTable.d.ts +48 -0
  71. package/dist/qualification/HypothesisTestTable.d.ts.map +1 -0
  72. package/dist/qualification/HypothesisTestTable.js +26 -0
  73. package/dist/qualification/HypothesisTestTable.js.map +1 -0
  74. package/dist/qualification/MeasureBars.d.ts +45 -0
  75. package/dist/qualification/MeasureBars.d.ts.map +1 -0
  76. package/dist/qualification/MeasureBars.js +52 -0
  77. package/dist/qualification/MeasureBars.js.map +1 -0
  78. package/dist/qualification/PopulationFlow.d.ts +42 -0
  79. package/dist/qualification/PopulationFlow.d.ts.map +1 -0
  80. package/dist/qualification/PopulationFlow.js +123 -0
  81. package/dist/qualification/PopulationFlow.js.map +1 -0
  82. package/dist/qualification/RepeatabilityProfile.d.ts +19 -0
  83. package/dist/qualification/RepeatabilityProfile.d.ts.map +1 -0
  84. package/dist/qualification/RepeatabilityProfile.js +119 -0
  85. package/dist/qualification/RepeatabilityProfile.js.map +1 -0
  86. package/dist/qualification/ReplicateHistogram.d.ts +23 -0
  87. package/dist/qualification/ReplicateHistogram.d.ts.map +1 -0
  88. package/dist/qualification/ReplicateHistogram.js +41 -0
  89. package/dist/qualification/ReplicateHistogram.js.map +1 -0
  90. package/dist/qualification/ScoreMap.d.ts +38 -0
  91. package/dist/qualification/ScoreMap.d.ts.map +1 -0
  92. package/dist/qualification/ScoreMap.js +77 -0
  93. package/dist/qualification/ScoreMap.js.map +1 -0
  94. package/dist/qualification/SpectraExplorer.d.ts +31 -0
  95. package/dist/qualification/SpectraExplorer.d.ts.map +1 -0
  96. package/dist/qualification/SpectraExplorer.js +111 -0
  97. package/dist/qualification/SpectraExplorer.js.map +1 -0
  98. package/dist/qualification/StatTile.d.ts +16 -0
  99. package/dist/qualification/StatTile.d.ts.map +1 -0
  100. package/dist/qualification/StatTile.js +10 -0
  101. package/dist/qualification/StatTile.js.map +1 -0
  102. package/dist/qualification/TargetDistribution.d.ts +35 -0
  103. package/dist/qualification/TargetDistribution.d.ts.map +1 -0
  104. package/dist/qualification/TargetDistribution.js +87 -0
  105. package/dist/qualification/TargetDistribution.js.map +1 -0
  106. package/dist/qualification/_chart.d.ts +19 -0
  107. package/dist/qualification/_chart.d.ts.map +1 -0
  108. package/dist/qualification/_chart.js +30 -0
  109. package/dist/qualification/_chart.js.map +1 -0
  110. package/dist/qualification/engineNumber.d.ts +26 -0
  111. package/dist/qualification/engineNumber.d.ts.map +1 -0
  112. package/dist/qualification/engineNumber.js +88 -0
  113. package/dist/qualification/engineNumber.js.map +1 -0
  114. package/dist/qualification/extract.d.ts +107 -0
  115. package/dist/qualification/extract.d.ts.map +1 -0
  116. package/dist/qualification/extract.js +139 -0
  117. package/dist/qualification/extract.js.map +1 -0
  118. package/dist/qualification/extractBlocks.d.ts +441 -0
  119. package/dist/qualification/extractBlocks.d.ts.map +1 -0
  120. package/dist/qualification/extractBlocks.js +576 -0
  121. package/dist/qualification/extractBlocks.js.map +1 -0
  122. package/dist/qualification/index.d.ts +16 -0
  123. package/dist/qualification/index.d.ts.map +1 -1
  124. package/dist/qualification/index.js +16 -0
  125. package/dist/qualification/index.js.map +1 -1
  126. package/dist/qualification/locale.d.ts +317 -1
  127. package/dist/qualification/locale.d.ts.map +1 -1
  128. package/dist/qualification/locale.js +369 -0
  129. package/dist/qualification/locale.js.map +1 -1
  130. package/dist/qualification/report.d.ts +13 -1
  131. package/dist/qualification/report.d.ts.map +1 -1
  132. package/dist/qualification/report.js +94 -3
  133. package/dist/qualification/report.js.map +1 -1
  134. package/dist/styles/index.d.ts +7 -1
  135. package/dist/styles/index.d.ts.map +1 -1
  136. package/dist/styles/index.js +5 -0
  137. package/dist/styles/index.js.map +1 -1
  138. package/package.json +7 -2
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Compact display of an engine number: 4 significant digits, exponent only outside [1e-4, 1e5). */
3
+ export function fmt(value) {
4
+ if (value === null || value === undefined || !Number.isFinite(value))
5
+ return '—';
6
+ if (value === 0)
7
+ return '0';
8
+ const abs = Math.abs(value);
9
+ if (abs >= 1e5 || abs < 1e-4)
10
+ return value.toExponential(2);
11
+ return String(Number(value.toPrecision(4)));
12
+ }
13
+ export function pct(fraction) {
14
+ if (!Number.isFinite(fraction))
15
+ return '—';
16
+ const p = fraction * 100;
17
+ return `${p >= 10 || p === 0 ? p.toFixed(0) : p >= 1 ? p.toFixed(1) : p.toPrecision(2)} %`;
18
+ }
19
+ /** HTML tooltip anchored at a point of the SVG viewBox (percent placement, flips near edges). */
20
+ export function ChartTooltip({ x, y, width, height, children }) {
21
+ const left = (x / width) * 100;
22
+ const top = (y / height) * 100;
23
+ const tx = left > 70 ? '-100%' : left < 30 ? '0%' : '-50%';
24
+ const ty = top < 30 ? '12px' : 'calc(-100% - 12px)';
25
+ return (_jsx("div", { className: "n4q-tip", role: "presentation", style: { left: `${left}%`, top: `${top}%`, transform: `translate(${tx}, ${ty})` }, children: children }));
26
+ }
27
+ export function TipRow({ color, label, value, line = false }) {
28
+ return (_jsxs("div", { className: "n4q-tip-row", children: [color ? _jsx("span", { className: line ? 'n4q-key-line' : 'n4q-key-dot', style: { background: color }, "aria-hidden": "true" }) : null, _jsx("strong", { children: value }), _jsx("span", { children: label })] }));
29
+ }
30
+ //# sourceMappingURL=_chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_chart.js","sourceRoot":"","sources":["../../src/qualification/_chart.tsx"],"names":[],"mappings":";AAGA,oGAAoG;AACpG,MAAM,UAAU,GAAG,CAAC,KAAgC;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACjF,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,QAAgB;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC;IACzB,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAgF;IAC1I,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACpD,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,YAC3H,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,EAAoE;IAC5H,OAAO,CACL,eAAK,SAAS,EAAC,aAAa,aACzB,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAc,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3H,2BAAS,KAAK,GAAU,EACxB,yBAAO,KAAK,GAAQ,IAChB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Locale } from '../lab/locale.js';
2
+ export declare const SCALED_REPRESENTATION = "significand_times_2_pow_exponent";
3
+ export type EngineNumber = {
4
+ kind: 'double';
5
+ value: number;
6
+ } | {
7
+ kind: 'scaled';
8
+ significand: number;
9
+ exponent: number;
10
+ };
11
+ /** Reads a plain finite number or a scaled `significand × 2^exponent` object; anything else is null. */
12
+ export declare function parseEngineNumber(value: unknown): EngineNumber | null;
13
+ /** True when the value is a scaled engine number (whatever its exponent). */
14
+ export declare function isScaledEngineNumber(value: unknown): boolean;
15
+ /** Double value when representable, else null (never ±Infinity, never NaN). */
16
+ export declare function engineNumberToDouble(n: EngineNumber | null): number | null;
17
+ /** Exact text of a scaled number, e.g. `−0,75 × 2¹¹⁰⁰`. */
18
+ export declare function formatEngineNumberExact(n: EngineNumber, locale?: Locale): string;
19
+ /**
20
+ * Display text: ordinary doubles with `digits` significant digits (exponent form outside
21
+ * [1e-4, 1e6)) and values beyond the double range as `m × 10^k` rounded from their exact
22
+ * decimal expansion (the exact `significand × 2^exponent` form is `formatEngineNumberExact`).
23
+ * Never NaN or Infinity.
24
+ */
25
+ export declare function formatEngineNumber(value: unknown, locale?: Locale, digits?: number): string | null;
26
+ //# sourceMappingURL=engineNumber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineNumber.d.ts","sourceRoot":"","sources":["../../src/qualification/engineNumber.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,qBAAqB,qCAAqC,CAAC;AAExE,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAI9D,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAMrE;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAO1E;AAUD,2DAA2D;AAC3D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAItF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAE,MAAa,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,IAAI,CAgBnG"}
@@ -0,0 +1,88 @@
1
+ export const SCALED_REPRESENTATION = 'significand_times_2_pow_exponent';
2
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
3
+ /** Reads a plain finite number or a scaled `significand × 2^exponent` object; anything else is null. */
4
+ export function parseEngineNumber(value) {
5
+ if (typeof value === 'number')
6
+ return Number.isFinite(value) ? { kind: 'double', value } : null;
7
+ if (!isRecord(value) || value.representation !== SCALED_REPRESENTATION)
8
+ return null;
9
+ const { significand, exponent } = value;
10
+ if (typeof significand !== 'number' || !Number.isFinite(significand) || typeof exponent !== 'number' || !Number.isInteger(exponent))
11
+ return null;
12
+ return exponent === 0 ? { kind: 'double', value: significand } : { kind: 'scaled', significand, exponent };
13
+ }
14
+ /** True when the value is a scaled engine number (whatever its exponent). */
15
+ export function isScaledEngineNumber(value) {
16
+ return isRecord(value) && value.representation === SCALED_REPRESENTATION;
17
+ }
18
+ /** Double value when representable, else null (never ±Infinity, never NaN). */
19
+ export function engineNumberToDouble(n) {
20
+ if (!n)
21
+ return null;
22
+ if (n.kind === 'double')
23
+ return n.value;
24
+ // Two steps so an exponent near the limits does not overflow before the significand scales it.
25
+ const half = Math.trunc(n.exponent / 2);
26
+ const v = n.significand * 2 ** half * 2 ** (n.exponent - half);
27
+ return Number.isFinite(v) && (v !== 0 || n.significand === 0) ? v : null;
28
+ }
29
+ const SUPERSCRIPT = { '-': '⁻', '0': '⁰', '1': '¹', '2': '²', '3': '³', '4': '⁴', '5': '⁵', '6': '⁶', '7': '⁷', '8': '⁸', '9': '⁹' };
30
+ const sup = (k) => String(k).split('').map((c) => SUPERSCRIPT[c] ?? c).join('');
31
+ const MINUS = '−';
32
+ function decimal(m, digits, locale) {
33
+ return Number(m.toPrecision(digits)).toLocaleString(locale, { maximumSignificantDigits: digits });
34
+ }
35
+ /** Exact text of a scaled number, e.g. `−0,75 × 2¹¹⁰⁰`. */
36
+ export function formatEngineNumberExact(n, locale = 'fr') {
37
+ if (n.kind === 'double')
38
+ return n.value.toLocaleString(locale, { maximumSignificantDigits: 17 });
39
+ const sign = n.significand < 0 ? MINUS : '';
40
+ return `${sign}${Math.abs(n.significand).toLocaleString(locale, { maximumSignificantDigits: 17 })} × 2${sup(n.exponent)}`;
41
+ }
42
+ /**
43
+ * Display text: ordinary doubles with `digits` significant digits (exponent form outside
44
+ * [1e-4, 1e6)) and values beyond the double range as `m × 10^k` rounded from their exact
45
+ * decimal expansion (the exact `significand × 2^exponent` form is `formatEngineNumberExact`).
46
+ * Never NaN or Infinity.
47
+ */
48
+ export function formatEngineNumber(value, locale = 'fr', digits = 4) {
49
+ const n = parseEngineNumber(value);
50
+ if (!n)
51
+ return null;
52
+ const v = engineNumberToDouble(n);
53
+ if (v !== null) {
54
+ if (v === 0)
55
+ return '0';
56
+ const abs = Math.abs(v);
57
+ if (abs >= 1e-4 && abs < 1e6)
58
+ return decimal(v, digits, locale).replace('-', MINUS);
59
+ const k = Math.floor(Math.log10(abs));
60
+ const m = v / 10 ** k;
61
+ return `${decimal(m, digits, locale).replace('-', MINUS)} × 10${sup(k)}`;
62
+ }
63
+ // Out of the double range: |s| < 1 so s·2^53 is an exact integer and the decimal
64
+ // expansion of s·2^e = (s·2^53)·2^(e−53) is exact with BigInt (never s * 2**e, which overflows).
65
+ if (n.kind !== 'scaled' || n.significand === 0)
66
+ return '0';
67
+ return scientificFromDigits(exactDigits(n), n.significand < 0, digits, locale);
68
+ }
69
+ /** Decimal digits of |significand × 2^exponent| for exponent ≥ 53 (exact). */
70
+ function exactDigits(n) {
71
+ const scaled = BigInt(Math.abs(n.significand) * 2 ** 53);
72
+ return (n.exponent >= 53 ? scaled * 2n ** BigInt(n.exponent - 53) : scaled >> BigInt(53 - n.exponent)).toString();
73
+ }
74
+ /** `m × 10^k` from an exact digit string, rounded half up to `digits` significant digits. */
75
+ function scientificFromDigits(d, negative, digits, locale) {
76
+ let k = d.length - 1;
77
+ let head = d.slice(0, digits).padEnd(digits, '0');
78
+ if ((d[digits] ?? '0') >= '5') {
79
+ head = (BigInt(head) + 1n).toString();
80
+ if (head.length > digits) {
81
+ head = head.slice(0, digits);
82
+ k += 1;
83
+ }
84
+ }
85
+ const m = Number(`${head[0]}.${head.slice(1)}`);
86
+ return `${negative ? MINUS : ''}${m.toLocaleString(locale, { maximumSignificantDigits: digits })} × 10${sup(k)}`;
87
+ }
88
+ //# sourceMappingURL=engineNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineNumber.js","sourceRoot":"","sources":["../../src/qualification/engineNumber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { QualificationMetricView, QualificationReportView } from './types.js';
2
+ /** First computed metric matching id (and source/target when given). */
3
+ export declare function findComputed(view: QualificationReportView, id: string, where?: {
4
+ sourceId?: string | null;
5
+ targetId?: string | null;
6
+ }): QualificationMetricView | null;
7
+ /** Numeric engine value of a computed metric, or null. */
8
+ export declare function computedNumber(view: QualificationReportView, id: string, where?: {
9
+ sourceId?: string | null;
10
+ targetId?: string | null;
11
+ }): number | null;
12
+ /** Distinct source / target ids that appear in metrics, in report order. */
13
+ export declare function reportSourceIds(view: QualificationReportView): string[];
14
+ export declare function reportTargetIds(view: QualificationReportView): string[];
15
+ export interface SamplePopulations {
16
+ developmentReal: number | null;
17
+ retainedTest: number | null;
18
+ augmentedExcluded: number | null;
19
+ }
20
+ export declare function extractSamplePopulations(view: QualificationReportView): SamplePopulations;
21
+ /** Observation accounting of one source, from integrity + structure denominators. */
22
+ export interface ObservationFlow {
23
+ sourceId: string;
24
+ sourceObservations: number;
25
+ developmentObservations: number;
26
+ excludedAmbiguousRepeat: number;
27
+ excludedIncomplete: number;
28
+ excludedMulticontext: number;
29
+ /** aggregated structure units (null when the structure eligibility metric is absent) */
30
+ structureUnits: number | null;
31
+ }
32
+ export declare function extractObservationFlow(view: QualificationReportView, sourceId: string): ObservationFlow | null;
33
+ export interface IntegritySummary {
34
+ missingCells: number | null;
35
+ totalCells: number | null;
36
+ axisOrder: string | null;
37
+ physicalDuplicatePairs: number | null;
38
+ partitionDuplicatePairs: number | null;
39
+ }
40
+ export declare function extractIntegrity(view: QualificationReportView, sourceId: string): IntegritySummary;
41
+ /** One repeatability context (repeat type × instrument × campaign) with its paired ICC. */
42
+ export interface RepeatabilityContext {
43
+ id: string;
44
+ repeatType: string | null;
45
+ instrument: string | null;
46
+ campaign: string | null;
47
+ unit: string | null;
48
+ pooledSd: (number | null)[];
49
+ icc: (number | null)[] | null;
50
+ /** engine band status: 0 computed, 1 insufficient, 2 unbalanced, 3 zero total variance */
51
+ bandStatus: number[];
52
+ observations: number | null;
53
+ physicalGroups: number | null;
54
+ /** engine interval bands of the SD / ICC (see `withRepeatabilityUncertainty`) */
55
+ sdInterval?: {
56
+ lower: readonly (number | null)[];
57
+ upper: readonly (number | null)[];
58
+ } | null;
59
+ iccInterval?: {
60
+ lower: readonly (number | null)[];
61
+ upper: readonly (number | null)[];
62
+ } | null;
63
+ /** which ICC the `icc` series is: balanced ICC(1,1) (default) or REML ICC(1) */
64
+ iccKind?: 'icc_1_1' | 'icc_1_reml';
65
+ }
66
+ /** Computed repeatability contexts of a source; each ICC metric is emitted right after its SD metric. */
67
+ export declare function extractRepeatability(view: QualificationReportView, sourceId: string): RepeatabilityContext[];
68
+ export interface PcaStructure {
69
+ sourceId: string;
70
+ viewId: string;
71
+ sampleIds: string[];
72
+ aggregationKeys: string[];
73
+ scores: number[][];
74
+ eigenvalues: number[] | null;
75
+ /** trace of the full centered covariance (sum of all eigenvalues), when reported */
76
+ totalVariance: number | null;
77
+ retainedFraction: number | null;
78
+ effectiveDimension: number | null;
79
+ }
80
+ export declare function extractPca(view: QualificationReportView, sourceId: string): PcaStructure | null;
81
+ /** Engine (Methods) summary of a continuous target. */
82
+ export interface ContinuousSummary {
83
+ count: number;
84
+ min: number;
85
+ q25: number;
86
+ median: number;
87
+ q75: number;
88
+ max: number;
89
+ mean: number;
90
+ sampleSd: number | null;
91
+ }
92
+ export interface TargetOverview {
93
+ targetId: string;
94
+ unit: string | null;
95
+ eligible: number | null;
96
+ denominators: Readonly<Record<string, number>>;
97
+ summary: ContinuousSummary | null;
98
+ classCounts: Record<string, number> | null;
99
+ /** local X→Y contrast per source, when computed */
100
+ localContrast: {
101
+ sourceId: string | null;
102
+ value: number;
103
+ k: number | null;
104
+ }[];
105
+ }
106
+ export declare function extractTarget(view: QualificationReportView, targetId: string): TargetOverview;
107
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/qualification/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ const isNumber = (v) => typeof v === 'number' && Number.isFinite(v);
2
+ const isNullableNumberArray = (v) => Array.isArray(v) && v.every((x) => x === null || isNumber(x));
3
+ const isNumberArray = (v) => Array.isArray(v) && v.every(isNumber);
4
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
5
+ /** First computed metric matching id (and source/target when given). */
6
+ export function findComputed(view, id, where = {}) {
7
+ return view.metrics.find((m) => m.id === id
8
+ && m.status === 'computed'
9
+ && (where.sourceId === undefined || m.sourceId === where.sourceId)
10
+ && (where.targetId === undefined || m.targetId === where.targetId)) ?? null;
11
+ }
12
+ /** Numeric engine value of a computed metric, or null. */
13
+ export function computedNumber(view, id, where = {}) {
14
+ const value = findComputed(view, id, where)?.value;
15
+ return isNumber(value) ? value : null;
16
+ }
17
+ /** Distinct source / target ids that appear in metrics, in report order. */
18
+ export function reportSourceIds(view) {
19
+ return [...new Set(view.metrics.flatMap((m) => (m.sourceId === null ? [] : [m.sourceId])))];
20
+ }
21
+ export function reportTargetIds(view) {
22
+ return [...new Set(view.metrics.flatMap((m) => (m.targetId === null ? [] : [m.targetId])))];
23
+ }
24
+ export function extractSamplePopulations(view) {
25
+ return {
26
+ developmentReal: computedNumber(view, 'population.development_real_samples'),
27
+ retainedTest: computedNumber(view, 'population.retained_test_samples'),
28
+ augmentedExcluded: computedNumber(view, 'population.augmented_samples_excluded'),
29
+ };
30
+ }
31
+ export function extractObservationFlow(view, sourceId) {
32
+ const dev = findComputed(view, 'integrity.development_observations', { sourceId });
33
+ const total = dev?.denominators.n_observations_source;
34
+ if (!dev || !isNumber(dev.value) || !isNumber(total))
35
+ return null;
36
+ const eligible = findComputed(view, 'structure.eligible_samples', { sourceId });
37
+ const d = eligible?.denominators ?? {};
38
+ return {
39
+ sourceId,
40
+ sourceObservations: total,
41
+ developmentObservations: dev.value,
42
+ excludedAmbiguousRepeat: d.n_excluded_ambiguous_repeat_observations ?? 0,
43
+ excludedIncomplete: d.n_excluded_incomplete_observations ?? 0,
44
+ excludedMulticontext: d.n_excluded_multicontext_observations ?? 0,
45
+ structureUnits: eligible && isNumber(eligible.value) ? eligible.value : null,
46
+ };
47
+ }
48
+ export function extractIntegrity(view, sourceId) {
49
+ const missing = findComputed(view, 'integrity.missing_cells', { sourceId });
50
+ const axis = findComputed(view, 'integrity.axis_order', { sourceId })?.value;
51
+ return {
52
+ missingCells: missing && isNumber(missing.value) ? missing.value : null,
53
+ totalCells: missing?.denominators.n_cells ?? null,
54
+ axisOrder: typeof axis === 'string' ? axis : null,
55
+ physicalDuplicatePairs: computedNumber(view, 'integrity.cross_physical_exact_duplicate_pairs', { sourceId }),
56
+ partitionDuplicatePairs: computedNumber(view, 'integrity.cross_partition_exact_duplicate_pairs', { sourceId }),
57
+ };
58
+ }
59
+ const BAND_STATUS_KEY = 'band_status_0_icc_1_insufficient_2_unbalanced_3_zero_total';
60
+ const str = (v) => (typeof v === 'string' ? v : null);
61
+ /** Computed repeatability contexts of a source; each ICC metric is emitted right after its SD metric. */
62
+ export function extractRepeatability(view, sourceId) {
63
+ const out = [];
64
+ const metrics = view.metrics;
65
+ metrics.forEach((m, i) => {
66
+ if (m.id !== 'measurement.repeatability_sd' || m.sourceId !== sourceId || m.status !== 'computed' || !isNullableNumberArray(m.value))
67
+ return;
68
+ const next = metrics[i + 1];
69
+ const icc = next && next.id === 'measurement.icc_1_1' && next.sourceId === sourceId && next.status === 'computed' && isNullableNumberArray(next.value) ? next.value : null;
70
+ const p = m.parameters;
71
+ const status = p[BAND_STATUS_KEY];
72
+ const parts = [str(p.repeat_type), str(p.instrument), str(p.campaign)].filter((x) => x !== null);
73
+ out.push({
74
+ id: parts.join(' · ') || `${sourceId}#${out.length + 1}`,
75
+ repeatType: str(p.repeat_type),
76
+ instrument: str(p.instrument),
77
+ campaign: str(p.campaign),
78
+ unit: m.unit,
79
+ pooledSd: m.value,
80
+ icc,
81
+ bandStatus: isNumberArray(status) ? status : m.value.map((v) => (v === null ? 1 : 0)),
82
+ observations: m.denominators.n_observations ?? null,
83
+ physicalGroups: m.denominators.n_physical_groups ?? null,
84
+ });
85
+ });
86
+ return out;
87
+ }
88
+ export function extractPca(view, sourceId) {
89
+ const scores = findComputed(view, 'structure.pca_scores', { sourceId });
90
+ const v = scores?.value;
91
+ if (!scores || !isRecord(v) || !Array.isArray(v.sample_ids) || !Array.isArray(v.scores))
92
+ return null;
93
+ const rows = v.scores.filter(isNumberArray);
94
+ if (rows.length !== v.sample_ids.length)
95
+ return null;
96
+ const eig = findComputed(view, 'structure.pca_eigenvalues', { sourceId })?.value;
97
+ const moments = findComputed(view, 'structure.full_variance_moments', { sourceId })?.value;
98
+ return {
99
+ sourceId,
100
+ viewId: scores.viewId,
101
+ sampleIds: v.sample_ids.map(String),
102
+ aggregationKeys: Array.isArray(v.aggregation_keys) ? v.aggregation_keys.map(String) : [],
103
+ scores: rows,
104
+ eigenvalues: isNumberArray(eig) ? eig : null,
105
+ totalVariance: isRecord(moments) && isNumber(moments.sum_eigenvalues) ? moments.sum_eigenvalues : null,
106
+ retainedFraction: computedNumber(view, 'structure.explained_variance_retained', { sourceId }),
107
+ effectiveDimension: computedNumber(view, 'structure.effective_dimension', { sourceId }),
108
+ };
109
+ }
110
+ export function extractTarget(view, targetId) {
111
+ const eligible = findComputed(view, 'target.exact_eligible_samples', { targetId });
112
+ const dist = findComputed(view, 'target.continuous_distribution', { targetId });
113
+ const classes = findComputed(view, 'target.class_counts', { targetId })?.value;
114
+ const s = dist?.value;
115
+ const summary = isRecord(s) && ['count', 'min', 'q25', 'median', 'q75', 'max', 'mean'].every((k) => isNumber(s[k]))
116
+ ? {
117
+ count: s.count,
118
+ min: s.min,
119
+ q25: s.q25,
120
+ median: s.median,
121
+ q75: s.q75,
122
+ max: s.max,
123
+ mean: s.mean,
124
+ sampleSd: isNumber(s.sample_sd) ? s.sample_sd : null,
125
+ }
126
+ : null;
127
+ return {
128
+ targetId,
129
+ unit: dist?.unit ?? null,
130
+ eligible: eligible && isNumber(eligible.value) ? eligible.value : null,
131
+ denominators: eligible?.denominators ?? {},
132
+ summary,
133
+ classCounts: isRecord(classes) && Object.values(classes).every(isNumber) ? classes : null,
134
+ localContrast: view.metrics
135
+ .filter((m) => m.id === 'local.global_contrast' && m.targetId === targetId && m.status === 'computed' && isNumber(m.value))
136
+ .map((m) => ({ sourceId: m.sourceId, value: m.value, k: isNumber(m.parameters.k) ? m.parameters.k : null })),
137
+ };
138
+ }
139
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/qualification/extract.ts"],"names":[],"mappings":"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"}