nirs4all-ui 0.1.11 → 0.1.13
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 +39 -1
- package/assets/brands/README.md +28 -8
- package/assets/brands/dag-ml/favicon.ico +0 -0
- package/assets/brands/dag-ml/horizontal-dark.svg +5 -0
- package/assets/brands/dag-ml/horizontal.png +0 -0
- package/assets/brands/dag-ml/horizontal.svg +5 -0
- package/assets/brands/dag-ml/icon-180.png +0 -0
- package/assets/brands/dag-ml/icon-256.png +0 -0
- package/assets/brands/dag-ml/icon-32.png +0 -0
- package/assets/brands/dag-ml/icon-512.png +0 -0
- package/assets/brands/dag-ml/icon.svg +3 -0
- package/assets/brands/dag-ml/og.png +0 -0
- package/assets/brands/dag-ml/stacked-dark.svg +5 -0
- package/assets/brands/dag-ml/stacked.png +0 -0
- package/assets/brands/dag-ml/stacked.svg +5 -0
- package/assets/brands/dag-ml-data/favicon.ico +0 -0
- package/assets/brands/dag-ml-data/horizontal-dark.svg +6 -0
- package/assets/brands/dag-ml-data/horizontal.png +0 -0
- package/assets/brands/dag-ml-data/horizontal.svg +6 -0
- package/assets/brands/dag-ml-data/icon-180.png +0 -0
- package/assets/brands/dag-ml-data/icon-256.png +0 -0
- package/assets/brands/dag-ml-data/icon-32.png +0 -0
- package/assets/brands/dag-ml-data/icon-512.png +0 -0
- package/assets/brands/dag-ml-data/icon.svg +3 -0
- package/assets/brands/dag-ml-data/og.png +0 -0
- package/assets/brands/dag-ml-data/stacked-dark.svg +6 -0
- package/assets/brands/dag-ml-data/stacked.png +0 -0
- package/assets/brands/dag-ml-data/stacked.svg +6 -0
- package/assets/brands/nirs4all/favicon.ico +0 -0
- package/assets/brands/nirs4all/horizontal-dark.svg +36 -0
- package/assets/brands/nirs4all/horizontal.png +0 -0
- package/assets/brands/nirs4all/horizontal.svg +35 -11
- package/assets/brands/nirs4all/icon-180.png +0 -0
- package/assets/brands/nirs4all/icon-256.png +0 -0
- package/assets/brands/nirs4all/icon-32.png +0 -0
- package/assets/brands/nirs4all/icon-512.png +0 -0
- package/assets/brands/nirs4all/icon.svg +32 -7
- package/assets/brands/nirs4all/og.png +0 -0
- package/assets/brands/nirs4all/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all/stacked.png +0 -0
- package/assets/brands/nirs4all/stacked.svg +35 -11
- package/assets/brands/nirs4all-benchmarks/favicon.ico +0 -0
- package/assets/brands/nirs4all-benchmarks/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-benchmarks/horizontal.png +0 -0
- package/assets/brands/nirs4all-benchmarks/horizontal.svg +37 -0
- package/assets/brands/nirs4all-benchmarks/icon-180.png +0 -0
- package/assets/brands/nirs4all-benchmarks/icon-256.png +0 -0
- package/assets/brands/nirs4all-benchmarks/icon-32.png +0 -0
- package/assets/brands/nirs4all-benchmarks/icon-512.png +0 -0
- package/assets/brands/nirs4all-benchmarks/icon.svg +33 -0
- package/assets/brands/nirs4all-benchmarks/og.png +0 -0
- package/assets/brands/nirs4all-benchmarks/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-benchmarks/stacked.png +0 -0
- package/assets/brands/nirs4all-benchmarks/stacked.svg +36 -0
- package/assets/brands/nirs4all-cluster/favicon.ico +0 -0
- package/assets/brands/nirs4all-cluster/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-cluster/horizontal.png +0 -0
- package/assets/brands/nirs4all-cluster/horizontal.svg +37 -0
- package/assets/brands/nirs4all-cluster/icon-180.png +0 -0
- package/assets/brands/nirs4all-cluster/icon-256.png +0 -0
- package/assets/brands/nirs4all-cluster/icon-32.png +0 -0
- package/assets/brands/nirs4all-cluster/icon-512.png +0 -0
- package/assets/brands/nirs4all-cluster/icon.svg +33 -0
- package/assets/brands/nirs4all-cluster/og.png +0 -0
- package/assets/brands/nirs4all-cluster/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-cluster/stacked.png +0 -0
- package/assets/brands/nirs4all-cluster/stacked.svg +36 -0
- package/assets/brands/nirs4all-core/favicon.ico +0 -0
- package/assets/brands/nirs4all-core/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-core/horizontal.png +0 -0
- package/assets/brands/nirs4all-core/horizontal.svg +36 -11
- package/assets/brands/nirs4all-core/icon-180.png +0 -0
- package/assets/brands/nirs4all-core/icon-256.png +0 -0
- package/assets/brands/nirs4all-core/icon-32.png +0 -0
- package/assets/brands/nirs4all-core/icon-512.png +0 -0
- package/assets/brands/nirs4all-core/icon.svg +32 -7
- package/assets/brands/nirs4all-core/og.png +0 -0
- package/assets/brands/nirs4all-core/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-core/stacked.png +0 -0
- package/assets/brands/nirs4all-core/stacked.svg +35 -11
- package/assets/brands/nirs4all-datasets/favicon.ico +0 -0
- package/assets/brands/nirs4all-datasets/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-datasets/horizontal.png +0 -0
- package/assets/brands/nirs4all-datasets/horizontal.svg +37 -0
- package/assets/brands/nirs4all-datasets/icon-180.png +0 -0
- package/assets/brands/nirs4all-datasets/icon-256.png +0 -0
- package/assets/brands/nirs4all-datasets/icon-32.png +0 -0
- package/assets/brands/nirs4all-datasets/icon-512.png +0 -0
- package/assets/brands/nirs4all-datasets/icon.svg +33 -0
- package/assets/brands/nirs4all-datasets/og.png +0 -0
- package/assets/brands/nirs4all-datasets/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-datasets/stacked.png +0 -0
- package/assets/brands/nirs4all-datasets/stacked.svg +36 -0
- package/assets/brands/nirs4all-device/favicon.ico +0 -0
- package/assets/brands/nirs4all-device/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-device/horizontal.png +0 -0
- package/assets/brands/nirs4all-device/horizontal.svg +37 -0
- package/assets/brands/nirs4all-device/icon-180.png +0 -0
- package/assets/brands/nirs4all-device/icon-256.png +0 -0
- package/assets/brands/nirs4all-device/icon-32.png +0 -0
- package/assets/brands/nirs4all-device/icon-512.png +0 -0
- package/assets/brands/nirs4all-device/icon.svg +33 -0
- package/assets/brands/nirs4all-device/og.png +0 -0
- package/assets/brands/nirs4all-device/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-device/stacked.png +0 -0
- package/assets/brands/nirs4all-device/stacked.svg +36 -0
- package/assets/brands/nirs4all-formats/favicon.ico +0 -0
- package/assets/brands/nirs4all-formats/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-formats/horizontal.png +0 -0
- package/assets/brands/nirs4all-formats/horizontal.svg +37 -0
- package/assets/brands/nirs4all-formats/icon-180.png +0 -0
- package/assets/brands/nirs4all-formats/icon-256.png +0 -0
- package/assets/brands/nirs4all-formats/icon-32.png +0 -0
- package/assets/brands/nirs4all-formats/icon-512.png +0 -0
- package/assets/brands/nirs4all-formats/icon.svg +33 -0
- package/assets/brands/nirs4all-formats/og.png +0 -0
- package/assets/brands/nirs4all-formats/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-formats/stacked.png +0 -0
- package/assets/brands/nirs4all-formats/stacked.svg +36 -0
- package/assets/brands/nirs4all-io/favicon.ico +0 -0
- package/assets/brands/nirs4all-io/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-io/horizontal.png +0 -0
- package/assets/brands/nirs4all-io/horizontal.svg +37 -0
- package/assets/brands/nirs4all-io/icon-180.png +0 -0
- package/assets/brands/nirs4all-io/icon-256.png +0 -0
- package/assets/brands/nirs4all-io/icon-32.png +0 -0
- package/assets/brands/nirs4all-io/icon-512.png +0 -0
- package/assets/brands/nirs4all-io/icon.svg +33 -0
- package/assets/brands/nirs4all-io/og.png +0 -0
- package/assets/brands/nirs4all-io/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-io/stacked.png +0 -0
- package/assets/brands/nirs4all-io/stacked.svg +36 -0
- package/assets/brands/nirs4all-methods/favicon.ico +0 -0
- package/assets/brands/nirs4all-methods/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-methods/horizontal.png +0 -0
- package/assets/brands/nirs4all-methods/horizontal.svg +37 -0
- package/assets/brands/nirs4all-methods/icon-180.png +0 -0
- package/assets/brands/nirs4all-methods/icon-256.png +0 -0
- package/assets/brands/nirs4all-methods/icon-32.png +0 -0
- package/assets/brands/nirs4all-methods/icon-512.png +0 -0
- package/assets/brands/nirs4all-methods/icon.svg +33 -0
- package/assets/brands/nirs4all-methods/og.png +0 -0
- package/assets/brands/nirs4all-methods/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-methods/stacked.png +0 -0
- package/assets/brands/nirs4all-methods/stacked.svg +36 -0
- package/assets/brands/nirs4all-papers/favicon.ico +0 -0
- package/assets/brands/nirs4all-papers/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-papers/horizontal.png +0 -0
- package/assets/brands/nirs4all-papers/horizontal.svg +37 -0
- package/assets/brands/nirs4all-papers/icon-180.png +0 -0
- package/assets/brands/nirs4all-papers/icon-256.png +0 -0
- package/assets/brands/nirs4all-papers/icon-32.png +0 -0
- package/assets/brands/nirs4all-papers/icon-512.png +0 -0
- package/assets/brands/nirs4all-papers/icon.svg +33 -0
- package/assets/brands/nirs4all-papers/og.png +0 -0
- package/assets/brands/nirs4all-papers/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-papers/stacked.png +0 -0
- package/assets/brands/nirs4all-papers/stacked.svg +36 -0
- package/assets/brands/nirs4all-providers/favicon.ico +0 -0
- package/assets/brands/nirs4all-providers/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-providers/horizontal.png +0 -0
- package/assets/brands/nirs4all-providers/horizontal.svg +36 -11
- package/assets/brands/nirs4all-providers/icon-180.png +0 -0
- package/assets/brands/nirs4all-providers/icon-256.png +0 -0
- package/assets/brands/nirs4all-providers/icon-32.png +0 -0
- package/assets/brands/nirs4all-providers/icon-512.png +0 -0
- package/assets/brands/nirs4all-providers/icon.svg +32 -7
- package/assets/brands/nirs4all-providers/og.png +0 -0
- package/assets/brands/nirs4all-providers/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-providers/stacked.png +0 -0
- package/assets/brands/nirs4all-providers/stacked.svg +35 -11
- package/assets/brands/nirs4all-quality/favicon.ico +0 -0
- package/assets/brands/nirs4all-quality/horizontal-dark.svg +36 -0
- package/assets/brands/nirs4all-quality/horizontal.svg +35 -11
- package/assets/brands/nirs4all-quality/icon-180.png +0 -0
- package/assets/brands/nirs4all-quality/icon-256.png +0 -0
- package/assets/brands/nirs4all-quality/icon-32.png +0 -0
- package/assets/brands/nirs4all-quality/icon-512.png +0 -0
- package/assets/brands/nirs4all-quality/icon.svg +32 -7
- package/assets/brands/nirs4all-quality/og.png +0 -0
- package/assets/brands/nirs4all-quality/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-quality/stacked.svg +35 -11
- package/assets/brands/nirs4all-repository/favicon.ico +0 -0
- package/assets/brands/nirs4all-repository/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-repository/horizontal.png +0 -0
- package/assets/brands/nirs4all-repository/horizontal.svg +37 -0
- package/assets/brands/nirs4all-repository/icon-180.png +0 -0
- package/assets/brands/nirs4all-repository/icon-256.png +0 -0
- package/assets/brands/nirs4all-repository/icon-32.png +0 -0
- package/assets/brands/nirs4all-repository/icon-512.png +0 -0
- package/assets/brands/nirs4all-repository/icon.svg +33 -0
- package/assets/brands/nirs4all-repository/og.png +0 -0
- package/assets/brands/nirs4all-repository/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-repository/stacked.png +0 -0
- package/assets/brands/nirs4all-repository/stacked.svg +36 -0
- package/assets/brands/nirs4all-studio/favicon.ico +0 -0
- package/assets/brands/nirs4all-studio/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-studio/horizontal.png +0 -0
- package/assets/brands/nirs4all-studio/horizontal.svg +37 -0
- package/assets/brands/nirs4all-studio/icon-180.png +0 -0
- package/assets/brands/nirs4all-studio/icon-256.png +0 -0
- package/assets/brands/nirs4all-studio/icon-32.png +0 -0
- package/assets/brands/nirs4all-studio/icon-512.png +0 -0
- package/assets/brands/nirs4all-studio/icon.svg +33 -0
- package/assets/brands/nirs4all-studio/og.png +0 -0
- package/assets/brands/nirs4all-studio/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-studio/stacked.png +0 -0
- package/assets/brands/nirs4all-studio/stacked.svg +36 -0
- package/assets/brands/nirs4all-tools/favicon.ico +0 -0
- package/assets/brands/nirs4all-tools/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-tools/horizontal.png +0 -0
- package/assets/brands/nirs4all-tools/horizontal.svg +37 -0
- package/assets/brands/nirs4all-tools/icon-180.png +0 -0
- package/assets/brands/nirs4all-tools/icon-256.png +0 -0
- package/assets/brands/nirs4all-tools/icon-32.png +0 -0
- package/assets/brands/nirs4all-tools/icon-512.png +0 -0
- package/assets/brands/nirs4all-tools/icon.svg +33 -0
- package/assets/brands/nirs4all-tools/og.png +0 -0
- package/assets/brands/nirs4all-tools/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-tools/stacked.png +0 -0
- package/assets/brands/nirs4all-tools/stacked.svg +36 -0
- package/assets/brands/nirs4all-ui/favicon.ico +0 -0
- package/assets/brands/nirs4all-ui/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-ui/horizontal.png +0 -0
- package/assets/brands/nirs4all-ui/horizontal.svg +36 -11
- package/assets/brands/nirs4all-ui/icon-180.png +0 -0
- package/assets/brands/nirs4all-ui/icon-256.png +0 -0
- package/assets/brands/nirs4all-ui/icon-32.png +0 -0
- package/assets/brands/nirs4all-ui/icon-512.png +0 -0
- package/assets/brands/nirs4all-ui/icon.svg +32 -7
- package/assets/brands/nirs4all-ui/og.png +0 -0
- package/assets/brands/nirs4all-ui/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-ui/stacked.png +0 -0
- package/assets/brands/nirs4all-ui/stacked.svg +35 -11
- package/assets/brands/nirs4all-web/favicon.ico +0 -0
- package/assets/brands/nirs4all-web/horizontal-dark.svg +37 -0
- package/assets/brands/nirs4all-web/horizontal.png +0 -0
- package/assets/brands/nirs4all-web/horizontal.svg +37 -0
- package/assets/brands/nirs4all-web/icon-180.png +0 -0
- package/assets/brands/nirs4all-web/icon-256.png +0 -0
- package/assets/brands/nirs4all-web/icon-32.png +0 -0
- package/assets/brands/nirs4all-web/icon-512.png +0 -0
- package/assets/brands/nirs4all-web/icon.svg +33 -0
- package/assets/brands/nirs4all-web/og.png +0 -0
- package/assets/brands/nirs4all-web/stacked-dark.svg +36 -0
- package/assets/brands/nirs4all-web/stacked.png +0 -0
- package/assets/brands/nirs4all-web/stacked.svg +36 -0
- package/assets/chains.css +601 -0
- package/assets/conformal.css +323 -0
- package/assets/dag.css +446 -0
- package/assets/motion/nirs-spectra.svg +26 -9
- package/assets/viz.css +152 -0
- package/dist/brand/index.d.ts +24 -126
- package/dist/brand/index.d.ts.map +1 -1
- package/dist/brand/index.js +52 -200
- package/dist/brand/index.js.map +1 -1
- package/dist/chains/ChainExplorer.d.ts +34 -0
- package/dist/chains/ChainExplorer.d.ts.map +1 -0
- package/dist/chains/ChainExplorer.js +119 -0
- package/dist/chains/ChainExplorer.js.map +1 -0
- package/dist/chains/ChainNodeHub.d.ts +31 -0
- package/dist/chains/ChainNodeHub.d.ts.map +1 -0
- package/dist/chains/ChainNodeHub.js +150 -0
- package/dist/chains/ChainNodeHub.js.map +1 -0
- package/dist/chains/ChainNodeOrbit.d.ts +31 -0
- package/dist/chains/ChainNodeOrbit.d.ts.map +1 -0
- package/dist/chains/ChainNodeOrbit.js +158 -0
- package/dist/chains/ChainNodeOrbit.js.map +1 -0
- package/dist/chains/ChainScoreBeeswarm.d.ts +25 -0
- package/dist/chains/ChainScoreBeeswarm.d.ts.map +1 -0
- package/dist/chains/ChainScoreBeeswarm.js +84 -0
- package/dist/chains/ChainScoreBeeswarm.js.map +1 -0
- package/dist/chains/NodeEffectForest.d.ts +33 -0
- package/dist/chains/NodeEffectForest.d.ts.map +1 -0
- package/dist/chains/NodeEffectForest.js +85 -0
- package/dist/chains/NodeEffectForest.js.map +1 -0
- package/dist/chains/PositionEffectHeatmap.d.ts +25 -0
- package/dist/chains/PositionEffectHeatmap.d.ts.map +1 -0
- package/dist/chains/PositionEffectHeatmap.js +77 -0
- package/dist/chains/PositionEffectHeatmap.js.map +1 -0
- package/dist/chains/SequenceEffectHeatmap.d.ts +22 -0
- package/dist/chains/SequenceEffectHeatmap.d.ts.map +1 -0
- package/dist/chains/SequenceEffectHeatmap.js +74 -0
- package/dist/chains/SequenceEffectHeatmap.js.map +1 -0
- package/dist/chains/_cx.d.ts +2 -0
- package/dist/chains/_cx.d.ts.map +1 -0
- package/dist/chains/_cx.js +8 -0
- package/dist/chains/_cx.js.map +1 -0
- package/dist/chains/analysis.d.ts +100 -0
- package/dist/chains/analysis.d.ts.map +1 -0
- package/dist/chains/analysis.js +440 -0
- package/dist/chains/analysis.js.map +1 -0
- package/dist/chains/colors.d.ts +26 -0
- package/dist/chains/colors.d.ts.map +1 -0
- package/dist/chains/colors.js +58 -0
- package/dist/chains/colors.js.map +1 -0
- package/dist/chains/contract.d.ts +54 -0
- package/dist/chains/contract.d.ts.map +1 -0
- package/dist/chains/contract.js +125 -0
- package/dist/chains/contract.js.map +1 -0
- package/dist/chains/index.d.ts +35 -0
- package/dist/chains/index.d.ts.map +1 -0
- package/dist/chains/index.js +41 -0
- package/dist/chains/index.js.map +1 -0
- package/dist/chains/normalize.d.ts +27 -0
- package/dist/chains/normalize.d.ts.map +1 -0
- package/dist/chains/normalize.js +104 -0
- package/dist/chains/normalize.js.map +1 -0
- package/dist/chains/radial.d.ts +21 -0
- package/dist/chains/radial.d.ts.map +1 -0
- package/dist/chains/radial.js +52 -0
- package/dist/chains/radial.js.map +1 -0
- package/dist/chains/types.d.ts +240 -0
- package/dist/chains/types.d.ts.map +1 -0
- package/dist/chains/types.js +52 -0
- package/dist/chains/types.js.map +1 -0
- package/dist/components/ConformalPredictionTree.d.ts +79 -0
- package/dist/components/ConformalPredictionTree.d.ts.map +1 -0
- package/dist/components/ConformalPredictionTree.js +223 -0
- package/dist/components/ConformalPredictionTree.js.map +1 -0
- package/dist/components/DatasetResultCard.d.ts +33 -0
- package/dist/components/DatasetResultCard.d.ts.map +1 -0
- package/dist/components/DatasetResultCard.js +9 -0
- package/dist/components/DatasetResultCard.js.map +1 -0
- package/dist/components/PerClassTable.d.ts +27 -0
- package/dist/components/PerClassTable.d.ts.map +1 -0
- package/dist/components/PerClassTable.js +9 -0
- package/dist/components/PerClassTable.js.map +1 -0
- package/dist/components/PredictionCard.d.ts +27 -0
- package/dist/components/PredictionCard.d.ts.map +1 -0
- package/dist/components/PredictionCard.js +6 -0
- package/dist/components/PredictionCard.js.map +1 -0
- package/dist/components/RankingsTable.d.ts +28 -0
- package/dist/components/RankingsTable.d.ts.map +1 -0
- package/dist/components/RankingsTable.js +14 -0
- package/dist/components/RankingsTable.js.map +1 -0
- package/dist/components/ScoreCardTree.d.ts +31 -0
- package/dist/components/ScoreCardTree.d.ts.map +1 -0
- package/dist/components/ScoreCardTree.js +17 -0
- package/dist/components/ScoreCardTree.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -0
- package/dist/components/index.js.map +1 -1
- package/dist/conformal/index.d.ts +2 -0
- package/dist/conformal/index.d.ts.map +1 -0
- package/dist/conformal/index.js +2 -0
- package/dist/conformal/index.js.map +1 -0
- package/dist/conformal/result.d.ts +224 -0
- package/dist/conformal/result.d.ts.map +1 -0
- package/dist/conformal/result.js +461 -0
- package/dist/conformal/result.js.map +1 -0
- package/dist/dag/DagGraphView.d.ts +35 -0
- package/dist/dag/DagGraphView.d.ts.map +1 -0
- package/dist/dag/DagGraphView.js +424 -0
- package/dist/dag/DagGraphView.js.map +1 -0
- package/dist/dag/_cx.d.ts +2 -0
- package/dist/dag/_cx.d.ts.map +1 -0
- package/dist/dag/_cx.js +8 -0
- package/dist/dag/_cx.js.map +1 -0
- package/dist/dag/collapse.d.ts +81 -0
- package/dist/dag/collapse.d.ts.map +1 -0
- package/dist/dag/collapse.js +210 -0
- package/dist/dag/collapse.js.map +1 -0
- package/dist/dag/colors.d.ts +19 -0
- package/dist/dag/colors.d.ts.map +1 -0
- package/dist/dag/colors.js +54 -0
- package/dist/dag/colors.js.map +1 -0
- package/dist/dag/fromCompiledGraph.d.ts +27 -0
- package/dist/dag/fromCompiledGraph.d.ts.map +1 -0
- package/dist/dag/fromCompiledGraph.js +133 -0
- package/dist/dag/fromCompiledGraph.js.map +1 -0
- package/dist/dag/hierarchy.d.ts +38 -0
- package/dist/dag/hierarchy.d.ts.map +1 -0
- package/dist/dag/hierarchy.js +75 -0
- package/dist/dag/hierarchy.js.map +1 -0
- package/dist/dag/index.d.ts +28 -0
- package/dist/dag/index.d.ts.map +1 -0
- package/dist/dag/index.js +33 -0
- package/dist/dag/index.js.map +1 -0
- package/dist/dag/layout.d.ts +57 -0
- package/dist/dag/layout.d.ts.map +1 -0
- package/dist/dag/layout.js +267 -0
- package/dist/dag/layout.js.map +1 -0
- package/dist/dag/locale.d.ts +31 -0
- package/dist/dag/locale.d.ts.map +1 -0
- package/dist/dag/locale.js +32 -0
- package/dist/dag/locale.js.map +1 -0
- package/dist/dag/shape.d.ts +48 -0
- package/dist/dag/shape.d.ts.map +1 -0
- package/dist/dag/shape.js +263 -0
- package/dist/dag/shape.js.map +1 -0
- package/dist/dag/types.d.ts +106 -0
- package/dist/dag/types.d.ts.map +1 -0
- package/dist/dag/types.js +56 -0
- package/dist/dag/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/keywordRegistry/index.d.ts +9 -0
- package/dist/keywordRegistry/index.d.ts.map +1 -0
- package/dist/keywordRegistry/index.js +9 -0
- package/dist/keywordRegistry/index.js.map +1 -0
- package/dist/keywordRegistry/registry.d.ts +107 -0
- package/dist/keywordRegistry/registry.d.ts.map +1 -0
- package/dist/keywordRegistry/registry.js +234 -0
- package/dist/keywordRegistry/registry.js.map +1 -0
- package/dist/robustness/index.d.ts +12 -0
- package/dist/robustness/index.d.ts.map +1 -0
- package/dist/robustness/index.js +12 -0
- package/dist/robustness/index.js.map +1 -0
- package/dist/robustness/modes.d.ts +15 -0
- package/dist/robustness/modes.d.ts.map +1 -0
- package/dist/robustness/modes.js +64 -0
- package/dist/robustness/modes.js.map +1 -0
- package/dist/robustness/scenarios.d.ts +38 -0
- package/dist/robustness/scenarios.d.ts.map +1 -0
- package/dist/robustness/scenarios.js +159 -0
- package/dist/robustness/scenarios.js.map +1 -0
- package/dist/robustness/summary.d.ts +135 -0
- package/dist/robustness/summary.d.ts.map +1 -0
- package/dist/robustness/summary.js +284 -0
- package/dist/robustness/summary.js.map +1 -0
- package/dist/styles/index.d.ts +19 -1
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +21 -0
- package/dist/styles/index.js.map +1 -1
- package/dist/tuning/index.d.ts +3 -0
- package/dist/tuning/index.d.ts.map +1 -0
- package/dist/tuning/index.js +3 -0
- package/dist/tuning/index.js.map +1 -0
- package/dist/tuning/result.d.ts +144 -0
- package/dist/tuning/result.d.ts.map +1 -0
- package/dist/tuning/result.js +277 -0
- package/dist/tuning/result.js.map +1 -0
- package/dist/tuning/searchSpace.d.ts +54 -0
- package/dist/tuning/searchSpace.d.ts.map +1 -0
- package/dist/tuning/searchSpace.js +118 -0
- package/dist/tuning/searchSpace.js.map +1 -0
- package/dist/viz/BiasVarianceBars.d.ts +27 -0
- package/dist/viz/BiasVarianceBars.d.ts.map +1 -0
- package/dist/viz/BiasVarianceBars.js +53 -0
- package/dist/viz/BiasVarianceBars.js.map +1 -0
- package/dist/viz/BoxPlot.d.ts +24 -0
- package/dist/viz/BoxPlot.d.ts.map +1 -0
- package/dist/viz/BoxPlot.js +50 -0
- package/dist/viz/BoxPlot.js.map +1 -0
- package/dist/viz/ConformalIntervalStrip.d.ts +66 -0
- package/dist/viz/ConformalIntervalStrip.d.ts.map +1 -0
- package/dist/viz/ConformalIntervalStrip.js +167 -0
- package/dist/viz/ConformalIntervalStrip.js.map +1 -0
- package/dist/viz/ConfusionMatrix.d.ts +24 -0
- package/dist/viz/ConfusionMatrix.d.ts.map +1 -0
- package/dist/viz/ConfusionMatrix.js +39 -0
- package/dist/viz/ConfusionMatrix.js.map +1 -0
- package/dist/viz/FeatureImportanceBar.d.ts +26 -0
- package/dist/viz/FeatureImportanceBar.d.ts.map +1 -0
- package/dist/viz/FeatureImportanceBar.js +49 -0
- package/dist/viz/FeatureImportanceBar.js.map +1 -0
- package/dist/viz/FoldStabilityLines.d.ts +29 -0
- package/dist/viz/FoldStabilityLines.d.ts.map +1 -0
- package/dist/viz/FoldStabilityLines.js +57 -0
- package/dist/viz/FoldStabilityLines.js.map +1 -0
- package/dist/viz/Histogram.d.ts +33 -0
- package/dist/viz/Histogram.d.ts.map +1 -0
- package/dist/viz/Histogram.js +64 -0
- package/dist/viz/Histogram.js.map +1 -0
- package/dist/viz/PcaScatter.d.ts +36 -0
- package/dist/viz/PcaScatter.d.ts.map +1 -0
- package/dist/viz/PcaScatter.js +72 -0
- package/dist/viz/PcaScatter.js.map +1 -0
- package/dist/viz/PipelineFlow.d.ts +28 -0
- package/dist/viz/PipelineFlow.d.ts.map +1 -0
- package/dist/viz/PipelineFlow.js +57 -0
- package/dist/viz/PipelineFlow.js.map +1 -0
- package/dist/viz/PredictionScatter.d.ts +41 -0
- package/dist/viz/PredictionScatter.d.ts.map +1 -0
- package/dist/viz/PredictionScatter.js +41 -0
- package/dist/viz/PredictionScatter.js.map +1 -0
- package/dist/viz/ResidualPlot.d.ts +32 -0
- package/dist/viz/ResidualPlot.d.ts.map +1 -0
- package/dist/viz/ResidualPlot.js +58 -0
- package/dist/viz/ResidualPlot.js.map +1 -0
- package/dist/viz/ScoreHeatmap.d.ts +30 -0
- package/dist/viz/ScoreHeatmap.d.ts.map +1 -0
- package/dist/viz/ScoreHeatmap.js +61 -0
- package/dist/viz/ScoreHeatmap.js.map +1 -0
- package/dist/viz/ScoreSummary.d.ts +23 -0
- package/dist/viz/ScoreSummary.d.ts.map +1 -0
- package/dist/viz/ScoreSummary.js +32 -0
- package/dist/viz/ScoreSummary.js.map +1 -0
- package/dist/viz/ShapBeeswarm.d.ts +29 -0
- package/dist/viz/ShapBeeswarm.d.ts.map +1 -0
- package/dist/viz/ShapBeeswarm.js +60 -0
- package/dist/viz/ShapBeeswarm.js.map +1 -0
- package/dist/viz/SpectraPlot.d.ts +50 -0
- package/dist/viz/SpectraPlot.d.ts.map +1 -0
- package/dist/viz/SpectraPlot.js +46 -0
- package/dist/viz/SpectraPlot.js.map +1 -0
- package/dist/viz/WaterfallChart.d.ts +30 -0
- package/dist/viz/WaterfallChart.d.ts.map +1 -0
- package/dist/viz/WaterfallChart.js +73 -0
- package/dist/viz/WaterfallChart.js.map +1 -0
- package/dist/viz/_cx.d.ts +2 -0
- package/dist/viz/_cx.d.ts.map +1 -0
- package/dist/viz/_cx.js +8 -0
- package/dist/viz/_cx.js.map +1 -0
- package/dist/viz/geometry.d.ts +87 -0
- package/dist/viz/geometry.d.ts.map +1 -0
- package/dist/viz/geometry.js +208 -0
- package/dist/viz/geometry.js.map +1 -0
- package/dist/viz/index.d.ts +33 -0
- package/dist/viz/index.d.ts.map +1 -0
- package/dist/viz/index.js +38 -0
- package/dist/viz/index.js.map +1 -0
- package/dist/viz/theme.d.ts +50 -0
- package/dist/viz/theme.d.ts.map +1 -0
- package/dist/viz/theme.js +100 -0
- package/dist/viz/theme.js.map +1 -0
- package/package.json +34 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type PlotPadding } from "./geometry.js";
|
|
2
|
+
/** One group's bias²/variance decomposition of its prediction error. */
|
|
3
|
+
export interface BiasVarianceEntry {
|
|
4
|
+
label: string;
|
|
5
|
+
biasSquared: number;
|
|
6
|
+
variance: number;
|
|
7
|
+
}
|
|
8
|
+
export interface BiasVarianceBarsProps {
|
|
9
|
+
entries: readonly BiasVarianceEntry[];
|
|
10
|
+
biasColor?: string;
|
|
11
|
+
varianceColor?: string;
|
|
12
|
+
width?: number;
|
|
13
|
+
height?: number;
|
|
14
|
+
padding?: PlotPadding;
|
|
15
|
+
yLabel?: string;
|
|
16
|
+
title?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Stacked bias²/variance decomposition per group — the Studio Inspector
|
|
21
|
+
* bias-variance view. Each vertical bar stacks variance on top of bias², so the
|
|
22
|
+
* full bar height is the total error and the split shows where it comes from. A
|
|
23
|
+
* two-swatch legend keys the segments. Pure inline SVG; hosts pass the
|
|
24
|
+
* decomposition per group.
|
|
25
|
+
*/
|
|
26
|
+
export declare function BiasVarianceBars({ entries, biasColor, varianceColor, width, height, padding, yLabel, title, className, }: BiasVarianceBarsProps): import("react").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=BiasVarianceBars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BiasVarianceBars.d.ts","sourceRoot":"","sources":["../../src/viz/BiasVarianceBars.tsx"],"names":[],"mappings":"AACA,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtF,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,SAAgC,EAChC,aAAmC,EACnC,KAAW,EACX,MAAY,EACZ,OAAO,EACP,MAAgB,EAChB,KAA0B,EAC1B,SAAS,GACV,EAAE,qBAAqB,+BA8GvB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./_cx.js";
|
|
3
|
+
import { buildFrame, makeScale, round, ticks } from "./geometry.js";
|
|
4
|
+
import { N4_VIZ_COLORS } from "./theme.js";
|
|
5
|
+
function fmt(value) {
|
|
6
|
+
if (!Number.isFinite(value))
|
|
7
|
+
return "—";
|
|
8
|
+
if (Math.abs(value) >= 1000)
|
|
9
|
+
return value.toFixed(0);
|
|
10
|
+
if (Math.abs(value) >= 1)
|
|
11
|
+
return value.toFixed(2);
|
|
12
|
+
return value.toFixed(3);
|
|
13
|
+
}
|
|
14
|
+
function safe(value) {
|
|
15
|
+
return Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Stacked bias²/variance decomposition per group — the Studio Inspector
|
|
19
|
+
* bias-variance view. Each vertical bar stacks variance on top of bias², so the
|
|
20
|
+
* full bar height is the total error and the split shows where it comes from. A
|
|
21
|
+
* two-swatch legend keys the segments. Pure inline SVG; hosts pass the
|
|
22
|
+
* decomposition per group.
|
|
23
|
+
*/
|
|
24
|
+
export function BiasVarianceBars({ entries, biasColor = N4_VIZ_COLORS.indigo, varianceColor = N4_VIZ_COLORS.amber, width = 420, height = 250, padding, yLabel = "Error", title = "Bias² / variance", className, }) {
|
|
25
|
+
const frame = buildFrame(width, height, { top: 34, ...(padding ?? {}) });
|
|
26
|
+
const { top, left } = frame.padding;
|
|
27
|
+
const bottom = top + frame.innerHeight;
|
|
28
|
+
const right = left + frame.innerWidth;
|
|
29
|
+
const totals = entries.map((e) => safe(e.biasSquared) + safe(e.variance));
|
|
30
|
+
const maxTotal = Math.max(0, ...totals.filter((t) => Number.isFinite(t)));
|
|
31
|
+
const yDomain = { min: 0, max: maxTotal || 1 };
|
|
32
|
+
const yScale = makeScale(yDomain, bottom, top);
|
|
33
|
+
const yTicks = ticks(yDomain, 5);
|
|
34
|
+
const slotW = entries.length > 0 ? frame.innerWidth / entries.length : frame.innerWidth;
|
|
35
|
+
const barW = Math.min(48, slotW * 0.6);
|
|
36
|
+
const legend = [
|
|
37
|
+
{ color: biasColor, label: "Bias²" },
|
|
38
|
+
{ color: varianceColor, label: "Variance" },
|
|
39
|
+
];
|
|
40
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-biasvariance", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), legend.map((item, k) => {
|
|
41
|
+
const lx = left + k * 92;
|
|
42
|
+
return (_jsxs("g", { children: [_jsx("rect", { x: round(lx), y: 12, width: 11, height: 11, rx: 2, fill: item.color }), _jsx("text", { className: "n4viz-badge", x: round(lx + 16), y: 21, textAnchor: "start", children: item.label })] }, item.label));
|
|
43
|
+
}), yTicks.map((t) => (_jsx("line", { className: "n4viz-grid", x1: left, x2: right, y1: round(yScale(t)), y2: round(yScale(t)) }, `gy-${t}`))), entries.map((entry, i) => {
|
|
44
|
+
const center = left + (i + 0.5) * slotW;
|
|
45
|
+
const bias = safe(entry.biasSquared);
|
|
46
|
+
const variance = safe(entry.variance);
|
|
47
|
+
const yBias = yScale(bias);
|
|
48
|
+
const yTotal = yScale(bias + variance);
|
|
49
|
+
const x = center - barW / 2;
|
|
50
|
+
return (_jsxs("g", { children: [_jsx("rect", { className: "n4viz-bar", x: round(x), y: round(yBias), width: round(barW), height: round(Math.max(0, bottom - yBias)), fill: biasColor }), _jsx("rect", { className: "n4viz-bar", x: round(x), y: round(yTotal), width: round(barW), height: round(Math.max(0, yBias - yTotal)), fill: varianceColor })] }, `${entry.label}-${i}`));
|
|
51
|
+
}), _jsx("line", { className: "n4viz-axis", x1: left, x2: right, y1: bottom, y2: bottom }), _jsx("line", { className: "n4viz-axis", x1: left, x2: left, y1: top, y2: bottom }), entries.map((entry, i) => (_jsx("text", { className: "n4viz-tick", x: round(left + (i + 0.5) * slotW), y: bottom + 15, textAnchor: "middle", children: entry.label }, `lx-${entry.label}-${i}`))), yTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: left - 6, y: round(yScale(t)) + 3, textAnchor: "end", children: fmt(t) }, `ty-${t}`))), _jsx("text", { className: "n4viz-axis-label", transform: `translate(11 ${top + frame.innerHeight / 2}) rotate(-90)`, textAnchor: "middle", children: yLabel })] }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=BiasVarianceBars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BiasVarianceBars.js","sourceRoot":"","sources":["../../src/viz/BiasVarianceBars.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type PlotPadding } from "./geometry.js";
|
|
2
|
+
/** One category's raw score distribution (summarized into a box internally). */
|
|
3
|
+
export interface BoxPlotGroup {
|
|
4
|
+
label: string;
|
|
5
|
+
values: readonly number[];
|
|
6
|
+
color?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface BoxPlotProps {
|
|
9
|
+
groups: readonly BoxPlotGroup[];
|
|
10
|
+
width?: number;
|
|
11
|
+
height?: number;
|
|
12
|
+
padding?: PlotPadding;
|
|
13
|
+
yLabel?: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Box-and-whisker plot per category — a score distribution across categories
|
|
19
|
+
* (Studio's Inspector candlestick view). Each box is a five-number summary with
|
|
20
|
+
* a median line, whiskers over the min→max span, and dots for 1.5·IQR outliers.
|
|
21
|
+
* Pure inline SVG; hosts pass grouped raw values.
|
|
22
|
+
*/
|
|
23
|
+
export declare function BoxPlot({ groups, width, height, padding, yLabel, title, className, }: BoxPlotProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=BoxPlot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxPlot.d.ts","sourceRoot":"","sources":["../../src/viz/BoxPlot.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAGvB,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EACtB,MAAM,EACN,KAAW,EACX,MAAY,EACZ,OAAO,EACP,MAAgB,EAChB,KAA4B,EAC5B,SAAS,GACV,EAAE,YAAY,+BAmJd"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./_cx.js";
|
|
3
|
+
import { buildFrame, fiveNumberSummary, makeScale, niceExtent, round, ticks, } from "./geometry.js";
|
|
4
|
+
import { categoricalColor } from "./theme.js";
|
|
5
|
+
function fmt(value) {
|
|
6
|
+
if (!Number.isFinite(value))
|
|
7
|
+
return "—";
|
|
8
|
+
if (Math.abs(value) >= 1000)
|
|
9
|
+
return value.toFixed(0);
|
|
10
|
+
if (Math.abs(value) >= 1)
|
|
11
|
+
return value.toFixed(2);
|
|
12
|
+
return value.toFixed(3);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Box-and-whisker plot per category — a score distribution across categories
|
|
16
|
+
* (Studio's Inspector candlestick view). Each box is a five-number summary with
|
|
17
|
+
* a median line, whiskers over the min→max span, and dots for 1.5·IQR outliers.
|
|
18
|
+
* Pure inline SVG; hosts pass grouped raw values.
|
|
19
|
+
*/
|
|
20
|
+
export function BoxPlot({ groups, width = 420, height = 260, padding, yLabel = "Score", title = "Score distribution", className, }) {
|
|
21
|
+
const frame = buildFrame(width, height, padding);
|
|
22
|
+
const { top, left } = frame.padding;
|
|
23
|
+
const bottom = top + frame.innerHeight;
|
|
24
|
+
const right = left + frame.innerWidth;
|
|
25
|
+
const allValues = groups.flatMap((g) => [...g.values].filter((v) => Number.isFinite(v)));
|
|
26
|
+
const yDomain = niceExtent(allValues.length > 0 ? allValues : [0, 1], 0.06);
|
|
27
|
+
const yScale = makeScale(yDomain, bottom, top);
|
|
28
|
+
const yTicks = ticks(yDomain, 5);
|
|
29
|
+
const slotW = groups.length > 0 ? frame.innerWidth / groups.length : frame.innerWidth;
|
|
30
|
+
const boxHalf = Math.min(slotW * 0.28, 26);
|
|
31
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-boxplot", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), yTicks.map((t) => (_jsx("line", { className: "n4viz-grid", x1: left, x2: right, y1: round(yScale(t)), y2: round(yScale(t)) }, `gy-${t}`))), groups.map((group, i) => {
|
|
32
|
+
const center = left + (i + 0.5) * slotW;
|
|
33
|
+
const summary = fiveNumberSummary(group.values);
|
|
34
|
+
const color = group.color ?? categoricalColor(i);
|
|
35
|
+
const hasData = Number.isFinite(summary.q1) && Number.isFinite(summary.q3);
|
|
36
|
+
if (!hasData)
|
|
37
|
+
return _jsx("g", {}, `box-${group.label}-${i}`);
|
|
38
|
+
const iqr = summary.q3 - summary.q1;
|
|
39
|
+
const lowerFence = summary.q1 - 1.5 * iqr;
|
|
40
|
+
const upperFence = summary.q3 + 1.5 * iqr;
|
|
41
|
+
const outliers = [...group.values].filter((v) => Number.isFinite(v) && (v < lowerFence || v > upperFence));
|
|
42
|
+
const yMax = yScale(summary.max);
|
|
43
|
+
const yMin = yScale(summary.min);
|
|
44
|
+
const yq1 = yScale(summary.q1);
|
|
45
|
+
const yq3 = yScale(summary.q3);
|
|
46
|
+
const yMedian = yScale(summary.median);
|
|
47
|
+
return (_jsxs("g", { children: [_jsx("line", { className: "n4viz-whisker", x1: round(center), x2: round(center), y1: round(yMax), y2: round(yMin), stroke: color, strokeWidth: 1.2 }), _jsx("line", { className: "n4viz-whisker", x1: round(center - boxHalf / 2), x2: round(center + boxHalf / 2), y1: round(yMax), y2: round(yMax), stroke: color, strokeWidth: 1.2 }), _jsx("line", { className: "n4viz-whisker", x1: round(center - boxHalf / 2), x2: round(center + boxHalf / 2), y1: round(yMin), y2: round(yMin), stroke: color, strokeWidth: 1.2 }), _jsx("rect", { className: "n4viz-box", x: round(center - boxHalf), y: round(yq3), width: round(boxHalf * 2), height: round(Math.max(0, yq1 - yq3)), fill: color, fillOpacity: 0.18, stroke: color, strokeWidth: 1.2 }), _jsx("line", { className: "n4viz-median", x1: round(center - boxHalf), x2: round(center + boxHalf), y1: round(yMedian), y2: round(yMedian), stroke: color, strokeWidth: 1.8 }), outliers.map((v, k) => (_jsx("circle", { className: "n4viz-dot", cx: round(center), cy: round(yScale(v)), r: 2.4, fill: color, fillOpacity: 0.7 }, `out-${i}-${k}`)))] }, `box-${group.label}-${i}`));
|
|
48
|
+
}), _jsx("line", { className: "n4viz-axis", x1: left, x2: right, y1: bottom, y2: bottom }), _jsx("line", { className: "n4viz-axis", x1: left, x2: left, y1: top, y2: bottom }), groups.map((group, i) => (_jsx("text", { className: "n4viz-tick", x: round(left + (i + 0.5) * slotW), y: bottom + 15, textAnchor: "middle", children: group.label }, `lx-${group.label}-${i}`))), yTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: left - 6, y: round(yScale(t)) + 3, textAnchor: "end", children: fmt(t) }, `ty-${t}`))), _jsx("text", { className: "n4viz-axis-label", transform: `translate(11 ${top + frame.innerHeight / 2}) rotate(-90)`, textAnchor: "middle", children: yLabel })] }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=BoxPlot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxPlot.js","sourceRoot":"","sources":["../../src/viz/BoxPlot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type PlotPadding } from "./geometry.js";
|
|
3
|
+
import type { ConformalPredictionRow } from "../conformal/result.js";
|
|
4
|
+
/** One nested prediction interval at a nominal coverage level. */
|
|
5
|
+
export interface ConformalBand {
|
|
6
|
+
/** Nominal (target) coverage in [0, 1], e.g. 0.9 for a 90% interval. */
|
|
7
|
+
coverage: number;
|
|
8
|
+
lower: number;
|
|
9
|
+
upper: number;
|
|
10
|
+
}
|
|
11
|
+
/** A single calibrated prediction: a point estimate wrapped by nested intervals. */
|
|
12
|
+
export interface ConformalStripSample {
|
|
13
|
+
prediction: number;
|
|
14
|
+
bands: readonly ConformalBand[];
|
|
15
|
+
/** Ground-truth value, when known — drives the covered/missed marker. */
|
|
16
|
+
actual?: number | null;
|
|
17
|
+
label?: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ConformalIntervalStripProps {
|
|
20
|
+
samples: readonly ConformalStripSample[];
|
|
21
|
+
width?: number;
|
|
22
|
+
height?: number;
|
|
23
|
+
padding?: PlotPadding;
|
|
24
|
+
/** Ordering of the sample columns along x. */
|
|
25
|
+
sort?: "index" | "prediction" | "width";
|
|
26
|
+
/**
|
|
27
|
+
* Coverage level treated as the headline guarantee: its band drives the
|
|
28
|
+
* covered/missed classification and the observed-coverage badge. Defaults to
|
|
29
|
+
* the widest coverage present.
|
|
30
|
+
*/
|
|
31
|
+
targetCoverage?: number | null;
|
|
32
|
+
unit?: string;
|
|
33
|
+
/** Cap the number of drawn columns (keeps very large test sets responsive). */
|
|
34
|
+
maxSamples?: number;
|
|
35
|
+
coveredColor?: string;
|
|
36
|
+
missedColor?: string;
|
|
37
|
+
predictionColor?: string;
|
|
38
|
+
/** Sequential ramp (pale → dark) for widest → narrowest nested band. */
|
|
39
|
+
bandStops?: readonly string[];
|
|
40
|
+
title?: string;
|
|
41
|
+
yLabel?: string;
|
|
42
|
+
xLabel?: string;
|
|
43
|
+
className?: string;
|
|
44
|
+
children?: ReactNode;
|
|
45
|
+
}
|
|
46
|
+
/** Sequential teal ramp: widest coverage (least certain area) is palest. */
|
|
47
|
+
export declare const CONFORMAL_BAND_STOPS: readonly ["#5eead4", "#2dd4bf", "#14b8a6", "#0d9488", "#0f766e"];
|
|
48
|
+
/** Map a widest→narrowest rank fraction in [0, 1] to a band shade. */
|
|
49
|
+
export declare function conformalBandShade(rankFraction: number, stops?: readonly string[]): string;
|
|
50
|
+
/**
|
|
51
|
+
* Adapt the `conformal` domain's per-sample prediction rows (from
|
|
52
|
+
* {@link file://../conformal/result.ts createConformalPredictionRows}) into
|
|
53
|
+
* strip samples, optionally attaching aligned ground-truth values.
|
|
54
|
+
*/
|
|
55
|
+
export declare function conformalStripSamplesFromRows(rows: readonly ConformalPredictionRow[], actuals?: readonly (number | null | undefined)[]): ConformalStripSample[];
|
|
56
|
+
/**
|
|
57
|
+
* Per-sample **nested prediction-interval envelope** — the whole calibrated
|
|
58
|
+
* prediction set at a glance. Each sample is a column of concentric conformal
|
|
59
|
+
* bands (widest coverage palest at the back, narrowest core darkest at the
|
|
60
|
+
* front) centered on the point estimate; when ground truth is supplied it is
|
|
61
|
+
* dropped in as a covered/missed marker so empirical coverage and heteroscedastic
|
|
62
|
+
* uncertainty read together. Pure inline SVG; hosts pass already-shaped samples
|
|
63
|
+
* (adapt `conformal` rows with {@link conformalStripSamplesFromRows}).
|
|
64
|
+
*/
|
|
65
|
+
export declare function ConformalIntervalStrip({ samples, width, height, padding, sort, targetCoverage, unit, maxSamples, coveredColor, missedColor, predictionColor, bandStops, title, yLabel, xLabel, className, children, }: ConformalIntervalStripProps): import("react").JSX.Element;
|
|
66
|
+
//# sourceMappingURL=ConformalIntervalStrip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConformalIntervalStrip.d.ts","sourceRoot":"","sources":["../../src/viz/ConformalIntervalStrip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IAChC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,kEAAmE,CAAC;AAMrG,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAyB,GAAG,MAAM,CAEhH;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,SAAS,sBAAsB,EAAE,EACvC,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAC/C,oBAAoB,EAAE,CAOxB;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,KAAW,EACX,MAAY,EACZ,OAAO,EACP,IAAc,EACd,cAAqB,EACrB,IAAI,EACJ,UAAgB,EAChB,YAA4B,EAC5B,WAA0B,EAC1B,eAAkC,EAClC,SAAgC,EAChC,KAAwC,EACxC,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,GACT,EAAE,2BAA2B,+BA8N7B"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./_cx.js";
|
|
3
|
+
import { buildFrame, makeScale, niceExtent, round, ticks, } from "./geometry.js";
|
|
4
|
+
import { N4_VIZ_COLORS, rampAt } from "./theme.js";
|
|
5
|
+
/** Sequential teal ramp: widest coverage (least certain area) is palest. */
|
|
6
|
+
export const CONFORMAL_BAND_STOPS = ["#5eead4", "#2dd4bf", "#14b8a6", "#0d9488", "#0f766e"];
|
|
7
|
+
const COVERED_COLOR = "#059669";
|
|
8
|
+
const MISSED_COLOR = N4_VIZ_COLORS.rose;
|
|
9
|
+
const PREDICTION_COLOR = N4_VIZ_COLORS.indigo;
|
|
10
|
+
/** Map a widest→narrowest rank fraction in [0, 1] to a band shade. */
|
|
11
|
+
export function conformalBandShade(rankFraction, stops = CONFORMAL_BAND_STOPS) {
|
|
12
|
+
return rampAt(stops, rankFraction);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Adapt the `conformal` domain's per-sample prediction rows (from
|
|
16
|
+
* {@link file://../conformal/result.ts createConformalPredictionRows}) into
|
|
17
|
+
* strip samples, optionally attaching aligned ground-truth values.
|
|
18
|
+
*/
|
|
19
|
+
export function conformalStripSamplesFromRows(rows, actuals) {
|
|
20
|
+
return rows.map((row, index) => ({
|
|
21
|
+
prediction: row.yPred,
|
|
22
|
+
label: row.sampleId,
|
|
23
|
+
actual: actuals?.[index] ?? null,
|
|
24
|
+
bands: row.intervals.map((cell) => ({ coverage: cell.coverage, lower: cell.lower, upper: cell.upper })),
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
function fmt(value) {
|
|
28
|
+
if (!Number.isFinite(value))
|
|
29
|
+
return "—";
|
|
30
|
+
if (Math.abs(value) >= 1000)
|
|
31
|
+
return value.toFixed(0);
|
|
32
|
+
if (Math.abs(value) >= 1)
|
|
33
|
+
return value.toFixed(2);
|
|
34
|
+
return value.toFixed(3);
|
|
35
|
+
}
|
|
36
|
+
function fmtCoverage(coverage) {
|
|
37
|
+
const percent = coverage * 100;
|
|
38
|
+
return `${Number.isInteger(percent) ? percent.toFixed(0) : percent.toFixed(1)}%`;
|
|
39
|
+
}
|
|
40
|
+
function sampleWidth(sample, coverage) {
|
|
41
|
+
const band = sample.bands.find((candidate) => candidate.coverage === coverage) ?? widestBand(sample);
|
|
42
|
+
return band ? band.upper - band.lower : Number.POSITIVE_INFINITY;
|
|
43
|
+
}
|
|
44
|
+
function widestBand(sample) {
|
|
45
|
+
let widest = null;
|
|
46
|
+
for (const band of sample.bands) {
|
|
47
|
+
if (widest === null || band.coverage > widest.coverage)
|
|
48
|
+
widest = band;
|
|
49
|
+
}
|
|
50
|
+
return widest;
|
|
51
|
+
}
|
|
52
|
+
function isCovered(sample, coverage) {
|
|
53
|
+
if (sample.actual == null || !Number.isFinite(sample.actual))
|
|
54
|
+
return null;
|
|
55
|
+
const band = sample.bands.find((candidate) => candidate.coverage === coverage);
|
|
56
|
+
if (!band)
|
|
57
|
+
return null;
|
|
58
|
+
return sample.actual >= band.lower && sample.actual <= band.upper;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Per-sample **nested prediction-interval envelope** — the whole calibrated
|
|
62
|
+
* prediction set at a glance. Each sample is a column of concentric conformal
|
|
63
|
+
* bands (widest coverage palest at the back, narrowest core darkest at the
|
|
64
|
+
* front) centered on the point estimate; when ground truth is supplied it is
|
|
65
|
+
* dropped in as a covered/missed marker so empirical coverage and heteroscedastic
|
|
66
|
+
* uncertainty read together. Pure inline SVG; hosts pass already-shaped samples
|
|
67
|
+
* (adapt `conformal` rows with {@link conformalStripSamplesFromRows}).
|
|
68
|
+
*/
|
|
69
|
+
export function ConformalIntervalStrip({ samples, width = 640, height = 340, padding, sort = "index", targetCoverage = null, unit, maxSamples = 400, coveredColor = COVERED_COLOR, missedColor = MISSED_COLOR, predictionColor = PREDICTION_COLOR, bandStops = CONFORMAL_BAND_STOPS, title = "Conformal prediction intervals", yLabel, xLabel, className, children, }) {
|
|
70
|
+
const frame = buildFrame(width, height, padding ?? { top: 58, right: 18, bottom: 38, left: 50 });
|
|
71
|
+
const { top, left } = frame.padding;
|
|
72
|
+
const bottom = top + frame.innerHeight;
|
|
73
|
+
const right = left + frame.innerWidth;
|
|
74
|
+
const valid = samples.filter((sample) => Number.isFinite(sample.prediction)
|
|
75
|
+
&& sample.bands.some((band) => Number.isFinite(band.lower) && Number.isFinite(band.upper)));
|
|
76
|
+
const coverages = [...new Set(valid.flatMap((sample) => sample.bands.map((band) => band.coverage)))]
|
|
77
|
+
.filter((coverage) => Number.isFinite(coverage))
|
|
78
|
+
.sort((leftCoverage, rightCoverage) => rightCoverage - leftCoverage);
|
|
79
|
+
const target = targetCoverage != null && coverages.includes(targetCoverage)
|
|
80
|
+
? targetCoverage
|
|
81
|
+
: (coverages[0] ?? Number.NaN);
|
|
82
|
+
const shadeOf = (coverage) => {
|
|
83
|
+
if (coverages.length <= 1)
|
|
84
|
+
return rampAt(bandStops, 0.62);
|
|
85
|
+
const rank = coverages.indexOf(coverage);
|
|
86
|
+
return rampAt(bandStops, rank / (coverages.length - 1));
|
|
87
|
+
};
|
|
88
|
+
const ordered = [...valid];
|
|
89
|
+
if (sort === "prediction") {
|
|
90
|
+
ordered.sort((a, b) => a.prediction - b.prediction);
|
|
91
|
+
}
|
|
92
|
+
else if (sort === "width") {
|
|
93
|
+
ordered.sort((a, b) => sampleWidth(a, target) - sampleWidth(b, target));
|
|
94
|
+
}
|
|
95
|
+
const drawn = ordered.slice(0, Math.max(1, maxSamples));
|
|
96
|
+
const truncated = ordered.length - drawn.length;
|
|
97
|
+
const valuePool = [];
|
|
98
|
+
for (const sample of drawn) {
|
|
99
|
+
valuePool.push(sample.prediction);
|
|
100
|
+
if (sample.actual != null && Number.isFinite(sample.actual))
|
|
101
|
+
valuePool.push(sample.actual);
|
|
102
|
+
for (const band of sample.bands) {
|
|
103
|
+
if (Number.isFinite(band.lower))
|
|
104
|
+
valuePool.push(band.lower);
|
|
105
|
+
if (Number.isFinite(band.upper))
|
|
106
|
+
valuePool.push(band.upper);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const yDomain = niceExtent(valuePool, 0.06);
|
|
110
|
+
const yScale = makeScale(yDomain, bottom, top);
|
|
111
|
+
const yTicks = ticks(yDomain, 5);
|
|
112
|
+
const slot = frame.innerWidth / Math.max(1, drawn.length);
|
|
113
|
+
const barHalf = Math.max(1, Math.min(13, slot * 0.4));
|
|
114
|
+
// Observed coverage at the target level (over samples with ground truth).
|
|
115
|
+
let covered = 0;
|
|
116
|
+
let evaluated = 0;
|
|
117
|
+
for (const sample of drawn) {
|
|
118
|
+
const state = isCovered(sample, target);
|
|
119
|
+
if (state === null)
|
|
120
|
+
continue;
|
|
121
|
+
evaluated += 1;
|
|
122
|
+
if (state)
|
|
123
|
+
covered += 1;
|
|
124
|
+
}
|
|
125
|
+
const observed = evaluated > 0 ? covered / evaluated : null;
|
|
126
|
+
const hasActuals = evaluated > 0;
|
|
127
|
+
const axisLabelY = yLabel ?? (unit ? `Value (${unit})` : "Value");
|
|
128
|
+
const axisLabelX = xLabel ?? `Samples (n = ${valid.length})`;
|
|
129
|
+
// ---- SVG legend (deterministic mono-width slots) ----
|
|
130
|
+
const legendItems = [
|
|
131
|
+
...coverages.map((coverage) => ({ kind: "band", color: shadeOf(coverage), label: fmtCoverage(coverage) })),
|
|
132
|
+
];
|
|
133
|
+
if (hasActuals) {
|
|
134
|
+
legendItems.push({ kind: "covered", color: coveredColor, label: "covered" });
|
|
135
|
+
legendItems.push({ kind: "missed", color: missedColor, label: "missed" });
|
|
136
|
+
}
|
|
137
|
+
let legendCursor = left;
|
|
138
|
+
const legendY = top - 16;
|
|
139
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-conformal-strip", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("text", { className: "n4viz-conf-title", x: left, y: top - 34, children: title }), legendItems.map((item, index) => {
|
|
140
|
+
const swatchX = legendCursor;
|
|
141
|
+
const textX = swatchX + 15;
|
|
142
|
+
const advance = 15 + item.label.length * 6.2 + 16;
|
|
143
|
+
legendCursor += advance;
|
|
144
|
+
return (_jsxs("g", { children: [item.kind === "band" ? (_jsx("rect", { x: swatchX, y: legendY - 8, width: 11, height: 11, rx: 2, fill: item.color })) : item.kind === "covered" ? (_jsx("circle", { cx: swatchX + 5, cy: legendY - 2.5, r: 4, fill: item.color, stroke: "var(--n4-color-surface, #fff)", strokeWidth: 1.5 })) : (_jsx("path", { d: diamond(swatchX + 5, legendY - 2.5, 4.5), fill: "none", stroke: item.color, strokeWidth: 1.8 })), _jsx("text", { className: "n4viz-legend-label", x: textX, y: legendY + 1, children: item.label })] }, `legend-${item.kind}-${index}`));
|
|
145
|
+
}), observed != null ? (_jsx("text", { className: "n4viz-conf-readout", x: right, y: top - 34, textAnchor: "end", children: `target ${fmtCoverage(target)} · obs ${fmtCoverage(observed)} (${covered}/${evaluated})` })) : Number.isFinite(target) ? (_jsx("text", { className: "n4viz-conf-readout", x: right, y: top - 34, textAnchor: "end", children: `target ${fmtCoverage(target)}` })) : null, yTicks.map((tick) => (_jsx("line", { className: "n4viz-grid", x1: left, x2: right, y1: round(yScale(tick)), y2: round(yScale(tick)) }, `grid-${tick}`))), drawn.map((sample, index) => {
|
|
146
|
+
const xc = left + (index + 0.5) * slot;
|
|
147
|
+
const bands = [...sample.bands]
|
|
148
|
+
.filter((band) => Number.isFinite(band.lower) && Number.isFinite(band.upper))
|
|
149
|
+
.sort((a, b) => b.coverage - a.coverage);
|
|
150
|
+
const state = isCovered(sample, target);
|
|
151
|
+
return (_jsxs("g", { className: "n4viz-conf-col", children: [bands.map((band) => {
|
|
152
|
+
const yUpper = round(yScale(band.upper));
|
|
153
|
+
const yLower = round(yScale(band.lower));
|
|
154
|
+
const y = Math.min(yUpper, yLower);
|
|
155
|
+
const bandHeight = Math.max(1, Math.abs(yLower - yUpper));
|
|
156
|
+
const emphasized = band.coverage === target;
|
|
157
|
+
return (_jsx("rect", { className: cx("n4viz-conf-band", emphasized && "n4viz-conf-band--target"), x: round(xc - barHalf), y: y, width: round(barHalf * 2), height: bandHeight, rx: Math.min(2.5, barHalf), fill: shadeOf(band.coverage) }, `band-${band.coverage}`));
|
|
158
|
+
}), _jsx("line", { className: "n4viz-conf-point", x1: round(xc - barHalf), x2: round(xc + barHalf), y1: round(yScale(sample.prediction)), y2: round(yScale(sample.prediction)), stroke: predictionColor, strokeWidth: 2 }), state != null && sample.actual != null && Number.isFinite(sample.actual) ? (state ? (_jsx("circle", { className: "n4viz-conf-actual", cx: round(xc), cy: round(yScale(sample.actual)), r: 3.4, fill: coveredColor, stroke: "var(--n4-color-surface, #fff)", strokeWidth: 1.6 })) : (_jsx("path", { className: "n4viz-conf-actual", d: diamond(xc, yScale(sample.actual), 4.2), fill: missedColor, stroke: "var(--n4-color-surface, #fff)", strokeWidth: 1.6 }))) : null] }, sample.label ?? index));
|
|
159
|
+
}), _jsx("line", { className: "n4viz-axis", x1: left, x2: right, y1: bottom, y2: bottom }), _jsx("line", { className: "n4viz-axis", x1: left, x2: left, y1: top, y2: bottom }), yTicks.map((tick) => (_jsx("text", { className: "n4viz-tick", x: left - 6, y: round(yScale(tick)) + 3, textAnchor: "end", children: fmt(tick) }, `ty-${tick}`))), _jsx("text", { className: "n4viz-axis-label", x: left + frame.innerWidth / 2, y: height - 2, textAnchor: "middle", children: truncated > 0 ? `${axisLabelX} · showing ${drawn.length}` : axisLabelX }), _jsx("text", { className: "n4viz-axis-label", transform: `translate(12 ${top + frame.innerHeight / 2}) rotate(-90)`, textAnchor: "middle", children: axisLabelY }), valid.length === 0 ? (_jsx("text", { className: "n4viz-conf-empty", x: left + frame.innerWidth / 2, y: top + frame.innerHeight / 2, textAnchor: "middle", children: "No calibrated intervals" })) : null, children] }));
|
|
160
|
+
}
|
|
161
|
+
function diamond(cx, cy, radius) {
|
|
162
|
+
const x = round(cx);
|
|
163
|
+
const y = round(cy);
|
|
164
|
+
const r = round(radius);
|
|
165
|
+
return `M${x} ${y - r} L${x + r} ${y} L${x} ${y + r} L${x - r} ${y} Z`;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ConformalIntervalStrip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConformalIntervalStrip.js","sourceRoot":"","sources":["../../src/viz/ConformalIntervalStrip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ConfusionMatrixProps {
|
|
2
|
+
/** Class labels, index-aligned to matrix rows (true) and columns (predicted). */
|
|
3
|
+
labels: readonly string[];
|
|
4
|
+
/** `matrix[trueClass][predClass]` raw counts. */
|
|
5
|
+
matrix: ReadonlyArray<readonly number[]>;
|
|
6
|
+
/** Shade each cell by its share of the true-class row instead of the global max. */
|
|
7
|
+
normalize?: boolean;
|
|
8
|
+
width?: number;
|
|
9
|
+
height?: number;
|
|
10
|
+
/** Cell fill given the 0..1 intensity and whether the cell is on the diagonal. */
|
|
11
|
+
cellColor?: (intensity: number, isDiagonal: boolean) => string;
|
|
12
|
+
showCounts?: boolean;
|
|
13
|
+
xLabel?: string;
|
|
14
|
+
yLabel?: string;
|
|
15
|
+
title?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Classification confusion matrix as intensity-shaded cells (teal diagonal,
|
|
20
|
+
* amber off-diagonal) — the Studio Inspector / Web results classification view.
|
|
21
|
+
* Pure inline SVG; hosts pass labels + a counts matrix.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ConfusionMatrix({ labels, matrix, normalize, width, height, cellColor, showCounts, xLabel, yLabel, title, className, }: ConfusionMatrixProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=ConfusionMatrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfusionMatrix.d.ts","sourceRoot":"","sources":["../../src/viz/ConfusionMatrix.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,iDAAiD;IACjD,MAAM,EAAE,aAAa,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IACzC,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,SAAiB,EACjB,KAAW,EACX,MAAY,EACZ,SAA4B,EAC5B,UAAiB,EACjB,MAAoB,EACpB,MAAiB,EACjB,KAA0B,EAC1B,SAAS,GACV,EAAE,oBAAoB,+BA+FtB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./_cx.js";
|
|
3
|
+
import { round } from "./geometry.js";
|
|
4
|
+
import { N4_VIZ_COLORS } from "./theme.js";
|
|
5
|
+
function mix(hex, intensity) {
|
|
6
|
+
const clamped = Math.max(0, Math.min(1, intensity));
|
|
7
|
+
return `color-mix(in srgb, ${hex} ${round(12 + clamped * 78)}%, transparent)`;
|
|
8
|
+
}
|
|
9
|
+
function defaultCellColor(intensity, isDiagonal) {
|
|
10
|
+
return mix(isDiagonal ? N4_VIZ_COLORS.teal : N4_VIZ_COLORS.amber, intensity);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Classification confusion matrix as intensity-shaded cells (teal diagonal,
|
|
14
|
+
* amber off-diagonal) — the Studio Inspector / Web results classification view.
|
|
15
|
+
* Pure inline SVG; hosts pass labels + a counts matrix.
|
|
16
|
+
*/
|
|
17
|
+
export function ConfusionMatrix({ labels, matrix, normalize = false, width = 320, height = 320, cellColor = defaultCellColor, showCounts = true, xLabel = "Predicted", yLabel = "Actual", title = "Confusion matrix", className, }) {
|
|
18
|
+
const n = labels.length;
|
|
19
|
+
const padLeft = 46;
|
|
20
|
+
const padTop = 30;
|
|
21
|
+
const padRight = 12;
|
|
22
|
+
const padBottom = 34;
|
|
23
|
+
const gridW = Math.max(0, width - padLeft - padRight);
|
|
24
|
+
const gridH = Math.max(0, height - padTop - padBottom);
|
|
25
|
+
const cellW = n > 0 ? gridW / n : gridW;
|
|
26
|
+
const cellH = n > 0 ? gridH / n : gridH;
|
|
27
|
+
const globalMax = Math.max(1, ...matrix.flatMap((row) => row.map((v) => (Number.isFinite(v) ? v : 0))));
|
|
28
|
+
const rowTotals = matrix.map((row) => Math.max(1, row.reduce((s, v) => s + (Number.isFinite(v) ? v : 0), 0)));
|
|
29
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-confusion", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), labels.map((_, trueIdx) => labels.map((__, predIdx) => {
|
|
30
|
+
const value = matrix[trueIdx]?.[predIdx] ?? 0;
|
|
31
|
+
const denom = normalize ? (rowTotals[trueIdx] ?? 1) : globalMax;
|
|
32
|
+
const intensity = denom > 0 ? value / denom : 0;
|
|
33
|
+
const x = padLeft + predIdx * cellW;
|
|
34
|
+
const y = padTop + trueIdx * cellH;
|
|
35
|
+
const isDiagonal = trueIdx === predIdx;
|
|
36
|
+
return (_jsxs("g", { children: [_jsx("rect", { className: "n4viz-cell", x: round(x + 1), y: round(y + 1), width: round(cellW - 2), height: round(cellH - 2), rx: 4, fill: cellColor(intensity, isDiagonal), stroke: isDiagonal ? N4_VIZ_COLORS.teal : "transparent", strokeOpacity: 0.5 }), showCounts ? (_jsx("text", { className: cx("n4viz-cell-value", intensity > 0.55 ? "n4viz-cell-value-strong" : undefined), x: round(x + cellW / 2), y: round(y + cellH / 2 + 4), textAnchor: "middle", children: normalize ? (value / (rowTotals[trueIdx] ?? 1)).toFixed(2) : value })) : null] }, `c-${trueIdx}-${predIdx}`));
|
|
37
|
+
})), labels.map((label, i) => (_jsx("text", { className: "n4viz-tick", x: padLeft - 6, y: round(padTop + i * cellH + cellH / 2 + 3), textAnchor: "end", children: label }, `row-${label}-${i}`))), labels.map((label, i) => (_jsx("text", { className: "n4viz-tick", x: round(padLeft + i * cellW + cellW / 2), y: padTop - 8, textAnchor: "middle", children: label }, `col-${label}-${i}`))), _jsx("text", { className: "n4viz-axis-label", x: padLeft + gridW / 2, y: height - 4, textAnchor: "middle", children: xLabel }), _jsx("text", { className: "n4viz-axis-label", transform: `translate(12 ${padTop + gridH / 2}) rotate(-90)`, textAnchor: "middle", children: yLabel })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ConfusionMatrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfusionMatrix.js","sourceRoot":"","sources":["../../src/viz/ConfusionMatrix.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** One ranked feature / wavelength-region contribution. */
|
|
2
|
+
export interface ImportanceItem {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
color?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface FeatureImportanceBarProps {
|
|
8
|
+
items: readonly ImportanceItem[];
|
|
9
|
+
/** Sort by value descending and keep the top N (default 12). */
|
|
10
|
+
topN?: number;
|
|
11
|
+
barColor?: string;
|
|
12
|
+
valueFormat?: (v: number) => string;
|
|
13
|
+
width?: number;
|
|
14
|
+
/** Auto-sized from `topN` when omitted. */
|
|
15
|
+
height?: number;
|
|
16
|
+
title?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ranked horizontal-bar chart of the most important features / wavelength
|
|
21
|
+
* regions — the Studio Variable-Importance view. Sorts by value, keeps the top
|
|
22
|
+
* N, left-labels each bar and prints its value on the right. Pure inline SVG;
|
|
23
|
+
* hosts pass precomputed importances.
|
|
24
|
+
*/
|
|
25
|
+
export declare function FeatureImportanceBar({ items, topN, barColor, valueFormat, width, height, title, className, }: FeatureImportanceBarProps): import("react").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=FeatureImportanceBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureImportanceBar.d.ts","sourceRoot":"","sources":["../../src/viz/FeatureImportanceBar.tsx"],"names":[],"mappings":"AAIA,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAS,EACT,QAA6B,EAC7B,WAA2B,EAC3B,KAAW,EACX,MAAM,EACN,KAA4B,EAC5B,SAAS,GACV,EAAE,yBAAyB,+BA6F3B"}
|