nirs4all-ui 0.1.12 → 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,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapse a graph against a set of collapsed group ids → the *effective* graph
|
|
3
|
+
* actually drawn.
|
|
4
|
+
*
|
|
5
|
+
* Collapsing a cluster hides all of its leaf nodes and replaces them with a
|
|
6
|
+
* single super-node; every edge that crossed the cluster boundary is re-routed
|
|
7
|
+
* to that super-node, and edges fully inside a collapsed cluster disappear. This
|
|
8
|
+
* is what keeps a 6000-node graph readable: the effective graph shrinks to the
|
|
9
|
+
* clusters the user has chosen to open. Pure + testable — no layout, no React.
|
|
10
|
+
*/
|
|
11
|
+
import { dagCategory } from "./types.js";
|
|
12
|
+
/** Prefix distinguishing a collapsed-group super-node id from a real node id. */
|
|
13
|
+
export const GROUP_NODE_PREFIX = "grp:";
|
|
14
|
+
/** Outermost collapsed group on a node's ancestor chain wins (it hides the rest). */
|
|
15
|
+
function representativeOf(hierarchy, nodeId, collapsed) {
|
|
16
|
+
let current = hierarchy.nodeGroupId.get(nodeId) ?? null;
|
|
17
|
+
let outermostCollapsed = null;
|
|
18
|
+
while (current !== null) {
|
|
19
|
+
if (collapsed.has(current))
|
|
20
|
+
outermostCollapsed = current;
|
|
21
|
+
current = hierarchy.groups.get(current)?.parent ?? null;
|
|
22
|
+
}
|
|
23
|
+
if (outermostCollapsed !== null) {
|
|
24
|
+
return { id: GROUP_NODE_PREFIX + outermostCollapsed, collapsedGroupId: outermostCollapsed };
|
|
25
|
+
}
|
|
26
|
+
return { id: nodeId, collapsedGroupId: null };
|
|
27
|
+
}
|
|
28
|
+
/** Innermost expanded (visible) group that should frame a visible node. */
|
|
29
|
+
function visibleContainer(hierarchy, innermostGroupId, collapsed) {
|
|
30
|
+
let current = innermostGroupId;
|
|
31
|
+
while (current !== null) {
|
|
32
|
+
if (!collapsed.has(current))
|
|
33
|
+
return current;
|
|
34
|
+
current = hierarchy.groups.get(current)?.parent ?? null;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function dominantCategory(counts) {
|
|
39
|
+
let best = "group";
|
|
40
|
+
let bestN = -1;
|
|
41
|
+
for (const [cat, n] of counts) {
|
|
42
|
+
if (n > bestN) {
|
|
43
|
+
best = cat;
|
|
44
|
+
bestN = n;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return best;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compute the effective (collapsed) graph. `collapsed` holds group ids from the
|
|
51
|
+
* {@link DagHierarchy}; an empty set returns the fully-expanded graph.
|
|
52
|
+
*/
|
|
53
|
+
export function computeEffectiveGraph(graph, hierarchy, collapsed) {
|
|
54
|
+
const rep = new Map();
|
|
55
|
+
const nodes = [];
|
|
56
|
+
const superNodes = new Map();
|
|
57
|
+
// dominant-category vote per collapsed group
|
|
58
|
+
const groupCats = new Map();
|
|
59
|
+
// original node id → shape leaving it (for edge labels + node chips)
|
|
60
|
+
const outShapeById = new Map();
|
|
61
|
+
for (const node of graph.nodes)
|
|
62
|
+
if (node.io?.out)
|
|
63
|
+
outShapeById.set(node.id, node.io.out);
|
|
64
|
+
for (const node of graph.nodes) {
|
|
65
|
+
const r = representativeOf(hierarchy, node.id, collapsed);
|
|
66
|
+
rep.set(node.id, r);
|
|
67
|
+
if (r.collapsedGroupId === null) {
|
|
68
|
+
const innermost = hierarchy.nodeGroupId.get(node.id) ?? null;
|
|
69
|
+
const category = dagCategory(node.kind);
|
|
70
|
+
const eff = {
|
|
71
|
+
id: node.id,
|
|
72
|
+
isGroup: false,
|
|
73
|
+
category,
|
|
74
|
+
label: node.label ?? shortLabel(node.id),
|
|
75
|
+
containerId: visibleContainer(hierarchy, innermost, collapsed),
|
|
76
|
+
};
|
|
77
|
+
if (node.detail !== undefined)
|
|
78
|
+
eff.detail = node.detail;
|
|
79
|
+
if (node.kind !== undefined)
|
|
80
|
+
eff.kind = node.kind;
|
|
81
|
+
if (node.status !== undefined)
|
|
82
|
+
eff.status = node.status;
|
|
83
|
+
if (node.variants !== undefined)
|
|
84
|
+
eff.variants = node.variants;
|
|
85
|
+
if (node.metric !== undefined)
|
|
86
|
+
eff.metric = node.metric;
|
|
87
|
+
if (node.io?.out !== undefined)
|
|
88
|
+
eff.outShape = node.io.out;
|
|
89
|
+
if (node.io?.in !== undefined)
|
|
90
|
+
eff.inShapes = node.io.in;
|
|
91
|
+
nodes.push(eff);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const votes = groupCats.get(r.collapsedGroupId) ?? new Map();
|
|
95
|
+
const cat = dagCategory(node.kind);
|
|
96
|
+
votes.set(cat, (votes.get(cat) ?? 0) + 1);
|
|
97
|
+
groupCats.set(r.collapsedGroupId, votes);
|
|
98
|
+
if (!superNodes.has(r.id)) {
|
|
99
|
+
const group = hierarchy.groups.get(r.collapsedGroupId);
|
|
100
|
+
const parent = group?.parent ?? null;
|
|
101
|
+
const eff = {
|
|
102
|
+
id: r.id,
|
|
103
|
+
isGroup: true,
|
|
104
|
+
category: "group",
|
|
105
|
+
label: group?.label ?? r.collapsedGroupId,
|
|
106
|
+
containerId: visibleContainer(hierarchy, parent, collapsed),
|
|
107
|
+
childCount: group?.descendantLeafCount ?? 0,
|
|
108
|
+
groupId: r.collapsedGroupId,
|
|
109
|
+
};
|
|
110
|
+
superNodes.set(r.id, eff);
|
|
111
|
+
nodes.push(eff);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Resolve each super-node's dominant category from the collected votes.
|
|
116
|
+
for (const [groupId, votes] of groupCats) {
|
|
117
|
+
const eff = superNodes.get(GROUP_NODE_PREFIX + groupId);
|
|
118
|
+
if (eff)
|
|
119
|
+
eff.category = dominantCategory(votes);
|
|
120
|
+
}
|
|
121
|
+
const edgeMap = new Map();
|
|
122
|
+
for (const edge of graph.edges) {
|
|
123
|
+
const s = rep.get(edge.source)?.id;
|
|
124
|
+
const t = rep.get(edge.target)?.id;
|
|
125
|
+
if (s === undefined || t === undefined || s === t)
|
|
126
|
+
continue;
|
|
127
|
+
const key = `${s}${t}`;
|
|
128
|
+
const existing = edgeMap.get(key);
|
|
129
|
+
if (existing) {
|
|
130
|
+
existing.weight += 1;
|
|
131
|
+
existing.oof = existing.oof || edge.oof === true;
|
|
132
|
+
if (existing.kind === undefined && edge.kind !== undefined)
|
|
133
|
+
existing.kind = edge.kind;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const eff = { id: key, source: s, target: t, oof: edge.oof === true, weight: 1 };
|
|
137
|
+
if (edge.kind !== undefined)
|
|
138
|
+
eff.kind = edge.kind;
|
|
139
|
+
const shape = outShapeById.get(edge.source);
|
|
140
|
+
if (shape !== undefined)
|
|
141
|
+
eff.shape = shape;
|
|
142
|
+
edgeMap.set(key, eff);
|
|
143
|
+
}
|
|
144
|
+
return { nodes, edges: [...edgeMap.values()] };
|
|
145
|
+
}
|
|
146
|
+
/** Last `.`/`:`/`/` segment of an id — a readable fallback node label. */
|
|
147
|
+
export function shortLabel(id) {
|
|
148
|
+
const parts = id.split(/[./]/);
|
|
149
|
+
return parts[parts.length - 1] ?? id;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Collapse every cluster at exactly `depth` (deeper ones are hidden inside them,
|
|
153
|
+
* so they need not be listed). `depth < 0` or `depth > maxDepth` → fully
|
|
154
|
+
* expanded. This is the primitive behind the depth stepper and expand/collapse
|
|
155
|
+
* all.
|
|
156
|
+
*/
|
|
157
|
+
export function collapseAtDepth(hierarchy, depth) {
|
|
158
|
+
const collapsed = new Set();
|
|
159
|
+
if (depth < 0)
|
|
160
|
+
return collapsed;
|
|
161
|
+
for (const group of hierarchy.groups.values()) {
|
|
162
|
+
if (group.depth === depth)
|
|
163
|
+
collapsed.add(group.id);
|
|
164
|
+
}
|
|
165
|
+
return collapsed;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Choose an initial collapse state. With an explicit `depth`, collapse to it.
|
|
169
|
+
* Otherwise pick the most-expanded depth whose visible node count still fits
|
|
170
|
+
* under `targetVisible` — so a small graph opens fully and a 6000-node graph
|
|
171
|
+
* opens as a handful of clusters.
|
|
172
|
+
*/
|
|
173
|
+
export function defaultCollapsed(hierarchy, totalNodes, options = {}) {
|
|
174
|
+
const maxDepth = hierarchy.maxDepth;
|
|
175
|
+
if (options.depth !== undefined) {
|
|
176
|
+
return { collapsed: collapseAtDepth(hierarchy, options.depth), depth: options.depth };
|
|
177
|
+
}
|
|
178
|
+
const target = options.targetVisible ?? 160;
|
|
179
|
+
if (maxDepth < 0 || totalNodes <= target) {
|
|
180
|
+
return { collapsed: new Set(), depth: maxDepth + 1 };
|
|
181
|
+
}
|
|
182
|
+
const groupsAtDepth = new Array(maxDepth + 1).fill(0);
|
|
183
|
+
for (const group of hierarchy.groups.values()) {
|
|
184
|
+
groupsAtDepth[group.depth] = groupsAtDepth[group.depth] + 1;
|
|
185
|
+
}
|
|
186
|
+
const leafByDepth = new Map();
|
|
187
|
+
for (const gid of hierarchy.nodeGroupId.values()) {
|
|
188
|
+
const d = gid === null ? -1 : hierarchy.groups.get(gid)?.depth ?? -1;
|
|
189
|
+
leafByDepth.set(d, (leafByDepth.get(d) ?? 0) + 1);
|
|
190
|
+
}
|
|
191
|
+
const visibleAt = (d) => {
|
|
192
|
+
let leaves = 0;
|
|
193
|
+
for (const [depth, count] of leafByDepth)
|
|
194
|
+
if (depth < d)
|
|
195
|
+
leaves += count;
|
|
196
|
+
return leaves + (groupsAtDepth[d] ?? 0);
|
|
197
|
+
};
|
|
198
|
+
// visible count grows monotonically with depth → keep the deepest that fits.
|
|
199
|
+
let best = 0;
|
|
200
|
+
for (let d = 0; d <= maxDepth + 1; d += 1) {
|
|
201
|
+
const visible = d > maxDepth ? totalNodes : visibleAt(d);
|
|
202
|
+
if (visible <= target)
|
|
203
|
+
best = d;
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
collapsed: best > maxDepth ? new Set() : collapseAtDepth(hierarchy, best),
|
|
207
|
+
depth: best,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=collapse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapse.js","sourceRoot":"","sources":["../../src/dag/collapse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category → color mapping for the DAG viewer.
|
|
3
|
+
*
|
|
4
|
+
* Reuses the canonical nirs4all `viz` teal system as the single source of truth
|
|
5
|
+
* (same hues as {@link file://../viz/PipelineFlow.tsx PipelineFlow}), so the DAG
|
|
6
|
+
* view sits inside the existing design language rather than introducing a new
|
|
7
|
+
* one. The adjacent-pair palette is CVD-validated; identity is never carried by
|
|
8
|
+
* color alone — every node also shows its kind label and every category appears
|
|
9
|
+
* in the legend. Hosts may retheme any slot via the `colors` prop.
|
|
10
|
+
*/
|
|
11
|
+
import type { DagCategory, DagEdgeKind } from "./types.js";
|
|
12
|
+
export declare const DAG_CATEGORY_COLORS: Readonly<Record<DagCategory, string>>;
|
|
13
|
+
/** Human-facing category labels for the legend. */
|
|
14
|
+
export declare const DAG_CATEGORY_LABELS: Readonly<Record<DagCategory, string>>;
|
|
15
|
+
/** Edge accent by semantic kind (mixed into the recessive base stroke). */
|
|
16
|
+
export declare const DAG_EDGE_COLORS: Readonly<Record<DagEdgeKind, string>>;
|
|
17
|
+
/** Resolve a category color, honoring per-host overrides. */
|
|
18
|
+
export declare function categoryColor(category: DagCategory, overrides?: Partial<Record<DagCategory, string>>): string;
|
|
19
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/dag/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAarE,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAarE,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAOjE,CAAC;AAEF,6DAA6D;AAC7D,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAC/C,MAAM,CAER"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category → color mapping for the DAG viewer.
|
|
3
|
+
*
|
|
4
|
+
* Reuses the canonical nirs4all `viz` teal system as the single source of truth
|
|
5
|
+
* (same hues as {@link file://../viz/PipelineFlow.tsx PipelineFlow}), so the DAG
|
|
6
|
+
* view sits inside the existing design language rather than introducing a new
|
|
7
|
+
* one. The adjacent-pair palette is CVD-validated; identity is never carried by
|
|
8
|
+
* color alone — every node also shows its kind label and every category appears
|
|
9
|
+
* in the legend. Hosts may retheme any slot via the `colors` prop.
|
|
10
|
+
*/
|
|
11
|
+
import { N4_VIZ_COLORS } from "../viz/theme.js";
|
|
12
|
+
export const DAG_CATEGORY_COLORS = {
|
|
13
|
+
data: N4_VIZ_COLORS.slate,
|
|
14
|
+
split: N4_VIZ_COLORS.indigo,
|
|
15
|
+
preprocess: N4_VIZ_COLORS.cyan,
|
|
16
|
+
model: N4_VIZ_COLORS.teal,
|
|
17
|
+
merge: N4_VIZ_COLORS.green,
|
|
18
|
+
branch: N4_VIZ_COLORS.amber,
|
|
19
|
+
search: N4_VIZ_COLORS.violet,
|
|
20
|
+
aggregate: N4_VIZ_COLORS.rose,
|
|
21
|
+
subgraph: "#0284c7",
|
|
22
|
+
chart: "#db2777",
|
|
23
|
+
group: N4_VIZ_COLORS.slate,
|
|
24
|
+
unknown: N4_VIZ_COLORS.slate,
|
|
25
|
+
};
|
|
26
|
+
/** Human-facing category labels for the legend. */
|
|
27
|
+
export const DAG_CATEGORY_LABELS = {
|
|
28
|
+
data: "Data / source",
|
|
29
|
+
split: "Split / CV",
|
|
30
|
+
preprocess: "Preprocess",
|
|
31
|
+
model: "Model",
|
|
32
|
+
merge: "Merge / join",
|
|
33
|
+
branch: "Branch",
|
|
34
|
+
search: "Variant / tune",
|
|
35
|
+
aggregate: "Aggregate",
|
|
36
|
+
subgraph: "Subgraph",
|
|
37
|
+
chart: "Chart",
|
|
38
|
+
group: "Collapsed group",
|
|
39
|
+
unknown: "Other",
|
|
40
|
+
};
|
|
41
|
+
/** Edge accent by semantic kind (mixed into the recessive base stroke). */
|
|
42
|
+
export const DAG_EDGE_COLORS = {
|
|
43
|
+
data: N4_VIZ_COLORS.slate,
|
|
44
|
+
prediction: N4_VIZ_COLORS.teal,
|
|
45
|
+
target: N4_VIZ_COLORS.indigo,
|
|
46
|
+
artifact: N4_VIZ_COLORS.violet,
|
|
47
|
+
metric: N4_VIZ_COLORS.amber,
|
|
48
|
+
control: N4_VIZ_COLORS.rose,
|
|
49
|
+
};
|
|
50
|
+
/** Resolve a category color, honoring per-host overrides. */
|
|
51
|
+
export function categoryColor(category, overrides) {
|
|
52
|
+
return overrides?.[category] ?? DAG_CATEGORY_COLORS[category];
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/dag/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,CAAC,MAAM,mBAAmB,GAA0C;IACxE,IAAI,EAAE,aAAa,CAAC,KAAK;IACzB,KAAK,EAAE,aAAa,CAAC,MAAM;IAC3B,UAAU,EAAE,aAAa,CAAC,IAAI;IAC9B,KAAK,EAAE,aAAa,CAAC,IAAI;IACzB,KAAK,EAAE,aAAa,CAAC,KAAK;IAC1B,MAAM,EAAE,aAAa,CAAC,KAAK;IAC3B,MAAM,EAAE,aAAa,CAAC,MAAM;IAC5B,SAAS,EAAE,aAAa,CAAC,IAAI;IAC7B,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,aAAa,CAAC,KAAK;IAC1B,OAAO,EAAE,aAAa,CAAC,KAAK;CAC7B,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAA0C;IACxE,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAA0C;IACpE,IAAI,EAAE,aAAa,CAAC,KAAK;IACzB,UAAU,EAAE,aAAa,CAAC,IAAI;IAC9B,MAAM,EAAE,aAAa,CAAC,MAAM;IAC5B,QAAQ,EAAE,aAAa,CAAC,MAAM;IAC9B,MAAM,EAAE,aAAa,CAAC,KAAK;IAC3B,OAAO,EAAE,aAAa,CAAC,IAAI;CAC5B,CAAC;AAEF,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAC3B,QAAqB,EACrB,SAAgD;IAEhD,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: a dag-ml compiled `GraphSpec` / `ExecutionPlan` → {@link DagGraph}.
|
|
3
|
+
*
|
|
4
|
+
* The package does NOT depend on dag-ml; this reads the *serialized* compiled
|
|
5
|
+
* graph (the JSON a host already has) and projects the fields the viewer needs.
|
|
6
|
+
* It is defensive because this is a real system boundary — arbitrary JSON in,
|
|
7
|
+
* a well-typed view-model out. Unknown / malformed entries are skipped, never
|
|
8
|
+
* thrown on. Recognized inputs:
|
|
9
|
+
* • `ExecutionPlan` → uses `graph_plan.graph`, plus `variants[]` for badges
|
|
10
|
+
* • `{ graph: GraphSpec }`
|
|
11
|
+
* • `GraphSpec` → `{ nodes, edges }`
|
|
12
|
+
*
|
|
13
|
+
* Group nesting is derived from the dag-ml node-id convention
|
|
14
|
+
* (`branch:b0.model:ridge` → cluster `branch:b0`), or from `seed_label`.
|
|
15
|
+
*/
|
|
16
|
+
import type { DagGraph } from "./types.js";
|
|
17
|
+
/** How collapsible clusters are derived from the compiled graph. */
|
|
18
|
+
export type GroupBy = "id" | "seed_label" | "none";
|
|
19
|
+
export interface FromCompiledGraphOptions {
|
|
20
|
+
/** Cluster derivation strategy (default `"id"`). */
|
|
21
|
+
groupBy?: GroupBy;
|
|
22
|
+
/** Show a `×N` variant badge on generator/tuner nodes (default `true`). */
|
|
23
|
+
variantBadges?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Project a serialized dag-ml compiled graph into the viewer's contract. */
|
|
26
|
+
export declare function fromCompiledGraph(input: unknown, options?: FromCompiledGraphOptions): DagGraph;
|
|
27
|
+
//# sourceMappingURL=fromCompiledGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fromCompiledGraph.d.ts","sourceRoot":"","sources":["../../src/dag/fromCompiledGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAwB,QAAQ,EAAW,MAAM,YAAY,CAAC;AAE1E,oEAAoE;AACpE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,YAAY,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAsFD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,wBAA6B,GAAG,QAAQ,CA4BlG"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: a dag-ml compiled `GraphSpec` / `ExecutionPlan` → {@link DagGraph}.
|
|
3
|
+
*
|
|
4
|
+
* The package does NOT depend on dag-ml; this reads the *serialized* compiled
|
|
5
|
+
* graph (the JSON a host already has) and projects the fields the viewer needs.
|
|
6
|
+
* It is defensive because this is a real system boundary — arbitrary JSON in,
|
|
7
|
+
* a well-typed view-model out. Unknown / malformed entries are skipped, never
|
|
8
|
+
* thrown on. Recognized inputs:
|
|
9
|
+
* • `ExecutionPlan` → uses `graph_plan.graph`, plus `variants[]` for badges
|
|
10
|
+
* • `{ graph: GraphSpec }`
|
|
11
|
+
* • `GraphSpec` → `{ nodes, edges }`
|
|
12
|
+
*
|
|
13
|
+
* Group nesting is derived from the dag-ml node-id convention
|
|
14
|
+
* (`branch:b0.model:ridge` → cluster `branch:b0`), or from `seed_label`.
|
|
15
|
+
*/
|
|
16
|
+
const EDGE_KINDS = new Set(["data", "prediction", "target", "artifact", "metric", "control"]);
|
|
17
|
+
const VARIANT_KINDS = new Set(["generator", "tuner"]);
|
|
18
|
+
function isRecord(value) {
|
|
19
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
20
|
+
}
|
|
21
|
+
function asString(value) {
|
|
22
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Unwrap the innermost `GraphSpec`-shaped object from any recognized input. */
|
|
25
|
+
function resolveGraphSpec(input) {
|
|
26
|
+
let variantCount = 0;
|
|
27
|
+
let root = input;
|
|
28
|
+
if (isRecord(root) && Array.isArray(root["variants"]))
|
|
29
|
+
variantCount = root["variants"].length;
|
|
30
|
+
if (isRecord(root) && isRecord(root["graph_plan"]) && isRecord(root["graph_plan"]["graph"])) {
|
|
31
|
+
root = root["graph_plan"]["graph"];
|
|
32
|
+
}
|
|
33
|
+
else if (isRecord(root) && isRecord(root["graph"])) {
|
|
34
|
+
root = root["graph"];
|
|
35
|
+
}
|
|
36
|
+
return { spec: isRecord(root) ? root : {}, variantCount };
|
|
37
|
+
}
|
|
38
|
+
function groupPathFromId(id) {
|
|
39
|
+
const segments = id.split(".");
|
|
40
|
+
return segments.length > 1 ? segments.slice(0, -1) : [];
|
|
41
|
+
}
|
|
42
|
+
function deriveGroup(id, seedLabel, groupBy) {
|
|
43
|
+
if (groupBy === "none")
|
|
44
|
+
return [];
|
|
45
|
+
if (groupBy === "seed_label")
|
|
46
|
+
return seedLabel && seedLabel !== id ? [seedLabel] : [];
|
|
47
|
+
const byId = groupPathFromId(id);
|
|
48
|
+
if (byId.length > 0)
|
|
49
|
+
return byId;
|
|
50
|
+
return seedLabel && seedLabel !== id ? [seedLabel] : [];
|
|
51
|
+
}
|
|
52
|
+
function lastSegment(id) {
|
|
53
|
+
const parts = id.split(".");
|
|
54
|
+
return parts[parts.length - 1] ?? id;
|
|
55
|
+
}
|
|
56
|
+
function portRefNodeId(ref) {
|
|
57
|
+
if (typeof ref === "string")
|
|
58
|
+
return asString(ref);
|
|
59
|
+
if (isRecord(ref))
|
|
60
|
+
return asString(ref["node_id"]) ?? asString(ref["id"]);
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
function mapNode(raw, groupBy, variantCount, variantBadges) {
|
|
64
|
+
if (!isRecord(raw))
|
|
65
|
+
return null;
|
|
66
|
+
const id = asString(raw["id"]);
|
|
67
|
+
if (id === undefined)
|
|
68
|
+
return null;
|
|
69
|
+
const kind = asString(raw["kind"]);
|
|
70
|
+
const operator = raw["operator"];
|
|
71
|
+
const operatorType = isRecord(operator) ? asString(operator["type"]) : undefined;
|
|
72
|
+
const seedLabel = asString(raw["seed_label"]);
|
|
73
|
+
const group = deriveGroup(id, seedLabel, groupBy);
|
|
74
|
+
const node = { id, label: operatorType ?? lastSegment(id) };
|
|
75
|
+
if (kind !== undefined)
|
|
76
|
+
node.kind = kind;
|
|
77
|
+
if (kind !== undefined && operatorType !== undefined)
|
|
78
|
+
node.detail = kind;
|
|
79
|
+
if (group.length > 0)
|
|
80
|
+
node.group = group;
|
|
81
|
+
if (variantBadges && variantCount > 1 && kind !== undefined && VARIANT_KINDS.has(kind)) {
|
|
82
|
+
node.variants = variantCount;
|
|
83
|
+
}
|
|
84
|
+
if (isRecord(raw["metadata"]) && Object.keys(raw["metadata"]).length > 0) {
|
|
85
|
+
node.meta = raw["metadata"];
|
|
86
|
+
}
|
|
87
|
+
return node;
|
|
88
|
+
}
|
|
89
|
+
function mapEdge(raw) {
|
|
90
|
+
if (!isRecord(raw))
|
|
91
|
+
return null;
|
|
92
|
+
const source = portRefNodeId(raw["source"]) ?? asString(raw["from"]);
|
|
93
|
+
const target = portRefNodeId(raw["target"]) ?? asString(raw["to"]);
|
|
94
|
+
if (source === undefined || target === undefined)
|
|
95
|
+
return null;
|
|
96
|
+
const contract = isRecord(raw["contract"]) ? raw["contract"] : undefined;
|
|
97
|
+
const kindRaw = asString(contract?.["kind"]) ?? asString(raw["kind"]);
|
|
98
|
+
const edge = { source, target };
|
|
99
|
+
if (kindRaw !== undefined && EDGE_KINDS.has(kindRaw))
|
|
100
|
+
edge.kind = kindRaw;
|
|
101
|
+
if (contract?.["requires_oof"] === true)
|
|
102
|
+
edge.oof = true;
|
|
103
|
+
return edge;
|
|
104
|
+
}
|
|
105
|
+
/** Project a serialized dag-ml compiled graph into the viewer's contract. */
|
|
106
|
+
export function fromCompiledGraph(input, options = {}) {
|
|
107
|
+
const groupBy = options.groupBy ?? "id";
|
|
108
|
+
const variantBadges = options.variantBadges ?? true;
|
|
109
|
+
const { spec, variantCount } = resolveGraphSpec(input);
|
|
110
|
+
const rawNodes = Array.isArray(spec["nodes"]) ? spec["nodes"] : [];
|
|
111
|
+
const rawEdges = Array.isArray(spec["edges"]) ? spec["edges"] : [];
|
|
112
|
+
const nodes = [];
|
|
113
|
+
const ids = new Set();
|
|
114
|
+
for (const raw of rawNodes) {
|
|
115
|
+
const node = mapNode(raw, groupBy, variantCount, variantBadges);
|
|
116
|
+
if (node && !ids.has(node.id)) {
|
|
117
|
+
ids.add(node.id);
|
|
118
|
+
nodes.push(node);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const edges = [];
|
|
122
|
+
for (const raw of rawEdges) {
|
|
123
|
+
const edge = mapEdge(raw);
|
|
124
|
+
if (edge && ids.has(edge.source) && ids.has(edge.target))
|
|
125
|
+
edges.push(edge);
|
|
126
|
+
}
|
|
127
|
+
const name = asString(spec["id"]) ?? (isRecord(input) ? asString(input["id"]) : undefined);
|
|
128
|
+
const graph = { nodes, edges };
|
|
129
|
+
if (name !== undefined)
|
|
130
|
+
graph.name = name;
|
|
131
|
+
return graph;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=fromCompiledGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fromCompiledGraph.js","sourceRoot":"","sources":["../../src/dag/fromCompiledGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAc,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3G,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,gFAAgF;AAChF,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAE,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAC9F,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC5F,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,SAA6B,EAAE,OAAgB;IAC9E,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAClC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,GAAY,EAAE,OAAgB,EAAE,YAAoB,EAAE,aAAsB;IAC3F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,IAAI,GAAY,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACzC,IAAI,aAAa,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvF,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,UAAU,CAA4B,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,GAAY;IAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,OAAsB,CAAC;QAAE,IAAI,CAAC,IAAI,GAAG,OAAsB,CAAC;IACxG,IAAI,QAAQ,EAAE,CAAC,cAAc,CAAC,KAAK,IAAI;QAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,UAAoC,EAAE;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IACpD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QAChE,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Group hierarchy derived from node `group` paths.
|
|
3
|
+
*
|
|
4
|
+
* A DAG is not a tree, but nodes carry a hierarchical *group* path (e.g.
|
|
5
|
+
* `["branch:b0"]`). Those paths form a nesting tree of clusters that the viewer
|
|
6
|
+
* can collapse/expand independently of the edge topology. This module turns the
|
|
7
|
+
* flat node list into that cluster tree; everything here is pure and testable.
|
|
8
|
+
*/
|
|
9
|
+
import type { DagGraph } from "./types.js";
|
|
10
|
+
export interface DagGroup {
|
|
11
|
+
/** Stable id = the group path joined by `/`. */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Innermost segment — what the frame header shows. */
|
|
14
|
+
label: string;
|
|
15
|
+
path: readonly string[];
|
|
16
|
+
/** 0 = top-level cluster. */
|
|
17
|
+
depth: number;
|
|
18
|
+
parent: string | null;
|
|
19
|
+
children: string[];
|
|
20
|
+
/** Leaf node ids whose innermost group is exactly this one. */
|
|
21
|
+
memberIds: string[];
|
|
22
|
+
/** Total leaf nodes anywhere under this cluster. */
|
|
23
|
+
descendantLeafCount: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DagHierarchy {
|
|
26
|
+
groups: Map<string, DagGroup>;
|
|
27
|
+
/** Top-level group ids, in first-seen order. */
|
|
28
|
+
roots: string[];
|
|
29
|
+
/** node id → innermost group id (or `null` for a top-level node). */
|
|
30
|
+
nodeGroupId: Map<string, string | null>;
|
|
31
|
+
/** Deepest group depth present (−1 when the graph is flat). */
|
|
32
|
+
maxDepth: number;
|
|
33
|
+
}
|
|
34
|
+
/** Build the cluster tree for a graph. O(nodes × path depth). */
|
|
35
|
+
export declare function buildHierarchy(graph: DagGraph): DagHierarchy;
|
|
36
|
+
/** Ancestor group ids for a node, innermost → outermost. */
|
|
37
|
+
export declare function ancestorGroupIds(hierarchy: DagHierarchy, nodeId: string): string[];
|
|
38
|
+
//# sourceMappingURL=hierarchy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/dag/hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,QAAQ;IACvB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,oDAAoD;IACpD,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,CAiD5D;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAQlF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Group hierarchy derived from node `group` paths.
|
|
3
|
+
*
|
|
4
|
+
* A DAG is not a tree, but nodes carry a hierarchical *group* path (e.g.
|
|
5
|
+
* `["branch:b0"]`). Those paths form a nesting tree of clusters that the viewer
|
|
6
|
+
* can collapse/expand independently of the edge topology. This module turns the
|
|
7
|
+
* flat node list into that cluster tree; everything here is pure and testable.
|
|
8
|
+
*/
|
|
9
|
+
const SEP = "/";
|
|
10
|
+
function groupIdOf(path, end) {
|
|
11
|
+
return path.slice(0, end).join(SEP);
|
|
12
|
+
}
|
|
13
|
+
/** Build the cluster tree for a graph. O(nodes × path depth). */
|
|
14
|
+
export function buildHierarchy(graph) {
|
|
15
|
+
const groups = new Map();
|
|
16
|
+
const roots = [];
|
|
17
|
+
const nodeGroupId = new Map();
|
|
18
|
+
let maxDepth = -1;
|
|
19
|
+
const ensure = (path, depth) => {
|
|
20
|
+
const id = groupIdOf(path, depth + 1);
|
|
21
|
+
const existing = groups.get(id);
|
|
22
|
+
if (existing)
|
|
23
|
+
return existing;
|
|
24
|
+
const parentId = depth > 0 ? groupIdOf(path, depth) : null;
|
|
25
|
+
const group = {
|
|
26
|
+
id,
|
|
27
|
+
label: path[depth] ?? id,
|
|
28
|
+
path: path.slice(0, depth + 1),
|
|
29
|
+
depth,
|
|
30
|
+
parent: parentId,
|
|
31
|
+
children: [],
|
|
32
|
+
memberIds: [],
|
|
33
|
+
descendantLeafCount: 0,
|
|
34
|
+
};
|
|
35
|
+
groups.set(id, group);
|
|
36
|
+
if (parentId === null) {
|
|
37
|
+
roots.push(id);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const parent = groups.get(parentId);
|
|
41
|
+
if (parent)
|
|
42
|
+
parent.children.push(id);
|
|
43
|
+
}
|
|
44
|
+
if (depth > maxDepth)
|
|
45
|
+
maxDepth = depth;
|
|
46
|
+
return group;
|
|
47
|
+
};
|
|
48
|
+
for (const node of graph.nodes) {
|
|
49
|
+
const path = node.group?.filter((seg) => seg.length > 0) ?? [];
|
|
50
|
+
if (path.length === 0) {
|
|
51
|
+
nodeGroupId.set(node.id, null);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Materialize every prefix so intermediate clusters exist even if empty.
|
|
55
|
+
for (let depth = 0; depth < path.length; depth += 1) {
|
|
56
|
+
const group = ensure(path, depth);
|
|
57
|
+
group.descendantLeafCount += 1;
|
|
58
|
+
}
|
|
59
|
+
const innermost = ensure(path, path.length - 1);
|
|
60
|
+
innermost.memberIds.push(node.id);
|
|
61
|
+
nodeGroupId.set(node.id, innermost.id);
|
|
62
|
+
}
|
|
63
|
+
return { groups, roots, nodeGroupId, maxDepth };
|
|
64
|
+
}
|
|
65
|
+
/** Ancestor group ids for a node, innermost → outermost. */
|
|
66
|
+
export function ancestorGroupIds(hierarchy, nodeId) {
|
|
67
|
+
const chain = [];
|
|
68
|
+
let current = hierarchy.nodeGroupId.get(nodeId) ?? null;
|
|
69
|
+
while (current !== null) {
|
|
70
|
+
chain.push(current);
|
|
71
|
+
current = hierarchy.groups.get(current)?.parent ?? null;
|
|
72
|
+
}
|
|
73
|
+
return chain;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/dag/hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nirs4all-ui `dag` domain — the interactive compiled-DAG viewer.
|
|
3
|
+
*
|
|
4
|
+
* A dedicated, self-contained component for exploring a *compiled* DAG-ML graph
|
|
5
|
+
* (or any bound variant) at any scale: layered layout, pan / zoom, viewport
|
|
6
|
+
* culling and level-of-detail keep thousands of nodes responsive, while a
|
|
7
|
+
* collapsible group hierarchy keeps a 5–6000-node graph readable. Unlike the
|
|
8
|
+
* `viz` `PipelineFlow` (a small editable spine), this is a read-only *explorer*
|
|
9
|
+
* of the whole graph.
|
|
10
|
+
*
|
|
11
|
+
* Same package boundary as the rest of nirs4all-ui: presentational + local UI
|
|
12
|
+
* state only — NO app state, routing, network/IO, or runtime execution. Hosts
|
|
13
|
+
* pass a {@link DagGraph} (adapt a real compiled graph with
|
|
14
|
+
* {@link fromCompiledGraph}). A default stylesheet ships at
|
|
15
|
+
* `nirs4all-ui/assets/dag.css`.
|
|
16
|
+
*
|
|
17
|
+
* Consumed as `nirs4all-ui/dag`.
|
|
18
|
+
*/
|
|
19
|
+
export * from "./types.js";
|
|
20
|
+
export * from "./colors.js";
|
|
21
|
+
export * from "./fromCompiledGraph.js";
|
|
22
|
+
export { deriveShapes, formatShape, formatCount, shapeChange, describeShapeDelta, SHAPE_CHANGE_STYLE, type ShapeChangeKind, type ShapeRule, type ShapeRuleContext, type DeriveShapesOptions, } from "./shape.js";
|
|
23
|
+
export { DEFAULT_DAG_LABELS, resolveLabels, type DagViewLabels } from "./locale.js";
|
|
24
|
+
export { buildHierarchy, ancestorGroupIds, type DagGroup, type DagHierarchy, } from "./hierarchy.js";
|
|
25
|
+
export { computeEffectiveGraph, collapseAtDepth, defaultCollapsed, shortLabel, GROUP_NODE_PREFIX, type EffNode, type EffEdge, type EffectiveGraph, type DefaultCollapseOptions, } from "./collapse.js";
|
|
26
|
+
export { layoutDag, type DagLayout, type DagLayoutNode, type DagLayoutEdge, type DagLayoutFrame, type LayoutOptions, } from "./layout.js";
|
|
27
|
+
export { DagGraphView, type DagGraphViewProps } from "./DagGraphView.js";
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dag/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGpF,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|