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.
Files changed (521) hide show
  1. package/README.md +39 -1
  2. package/assets/brands/README.md +28 -8
  3. package/assets/brands/dag-ml/favicon.ico +0 -0
  4. package/assets/brands/dag-ml/horizontal-dark.svg +5 -0
  5. package/assets/brands/dag-ml/horizontal.png +0 -0
  6. package/assets/brands/dag-ml/horizontal.svg +5 -0
  7. package/assets/brands/dag-ml/icon-180.png +0 -0
  8. package/assets/brands/dag-ml/icon-256.png +0 -0
  9. package/assets/brands/dag-ml/icon-32.png +0 -0
  10. package/assets/brands/dag-ml/icon-512.png +0 -0
  11. package/assets/brands/dag-ml/icon.svg +3 -0
  12. package/assets/brands/dag-ml/og.png +0 -0
  13. package/assets/brands/dag-ml/stacked-dark.svg +5 -0
  14. package/assets/brands/dag-ml/stacked.png +0 -0
  15. package/assets/brands/dag-ml/stacked.svg +5 -0
  16. package/assets/brands/dag-ml-data/favicon.ico +0 -0
  17. package/assets/brands/dag-ml-data/horizontal-dark.svg +6 -0
  18. package/assets/brands/dag-ml-data/horizontal.png +0 -0
  19. package/assets/brands/dag-ml-data/horizontal.svg +6 -0
  20. package/assets/brands/dag-ml-data/icon-180.png +0 -0
  21. package/assets/brands/dag-ml-data/icon-256.png +0 -0
  22. package/assets/brands/dag-ml-data/icon-32.png +0 -0
  23. package/assets/brands/dag-ml-data/icon-512.png +0 -0
  24. package/assets/brands/dag-ml-data/icon.svg +3 -0
  25. package/assets/brands/dag-ml-data/og.png +0 -0
  26. package/assets/brands/dag-ml-data/stacked-dark.svg +6 -0
  27. package/assets/brands/dag-ml-data/stacked.png +0 -0
  28. package/assets/brands/dag-ml-data/stacked.svg +6 -0
  29. package/assets/brands/nirs4all/favicon.ico +0 -0
  30. package/assets/brands/nirs4all/horizontal-dark.svg +36 -0
  31. package/assets/brands/nirs4all/horizontal.png +0 -0
  32. package/assets/brands/nirs4all/horizontal.svg +35 -11
  33. package/assets/brands/nirs4all/icon-180.png +0 -0
  34. package/assets/brands/nirs4all/icon-256.png +0 -0
  35. package/assets/brands/nirs4all/icon-32.png +0 -0
  36. package/assets/brands/nirs4all/icon-512.png +0 -0
  37. package/assets/brands/nirs4all/icon.svg +32 -7
  38. package/assets/brands/nirs4all/og.png +0 -0
  39. package/assets/brands/nirs4all/stacked-dark.svg +36 -0
  40. package/assets/brands/nirs4all/stacked.png +0 -0
  41. package/assets/brands/nirs4all/stacked.svg +35 -11
  42. package/assets/brands/nirs4all-benchmarks/favicon.ico +0 -0
  43. package/assets/brands/nirs4all-benchmarks/horizontal-dark.svg +37 -0
  44. package/assets/brands/nirs4all-benchmarks/horizontal.png +0 -0
  45. package/assets/brands/nirs4all-benchmarks/horizontal.svg +37 -0
  46. package/assets/brands/nirs4all-benchmarks/icon-180.png +0 -0
  47. package/assets/brands/nirs4all-benchmarks/icon-256.png +0 -0
  48. package/assets/brands/nirs4all-benchmarks/icon-32.png +0 -0
  49. package/assets/brands/nirs4all-benchmarks/icon-512.png +0 -0
  50. package/assets/brands/nirs4all-benchmarks/icon.svg +33 -0
  51. package/assets/brands/nirs4all-benchmarks/og.png +0 -0
  52. package/assets/brands/nirs4all-benchmarks/stacked-dark.svg +36 -0
  53. package/assets/brands/nirs4all-benchmarks/stacked.png +0 -0
  54. package/assets/brands/nirs4all-benchmarks/stacked.svg +36 -0
  55. package/assets/brands/nirs4all-cluster/favicon.ico +0 -0
  56. package/assets/brands/nirs4all-cluster/horizontal-dark.svg +37 -0
  57. package/assets/brands/nirs4all-cluster/horizontal.png +0 -0
  58. package/assets/brands/nirs4all-cluster/horizontal.svg +37 -0
  59. package/assets/brands/nirs4all-cluster/icon-180.png +0 -0
  60. package/assets/brands/nirs4all-cluster/icon-256.png +0 -0
  61. package/assets/brands/nirs4all-cluster/icon-32.png +0 -0
  62. package/assets/brands/nirs4all-cluster/icon-512.png +0 -0
  63. package/assets/brands/nirs4all-cluster/icon.svg +33 -0
  64. package/assets/brands/nirs4all-cluster/og.png +0 -0
  65. package/assets/brands/nirs4all-cluster/stacked-dark.svg +36 -0
  66. package/assets/brands/nirs4all-cluster/stacked.png +0 -0
  67. package/assets/brands/nirs4all-cluster/stacked.svg +36 -0
  68. package/assets/brands/nirs4all-core/favicon.ico +0 -0
  69. package/assets/brands/nirs4all-core/horizontal-dark.svg +37 -0
  70. package/assets/brands/nirs4all-core/horizontal.png +0 -0
  71. package/assets/brands/nirs4all-core/horizontal.svg +36 -11
  72. package/assets/brands/nirs4all-core/icon-180.png +0 -0
  73. package/assets/brands/nirs4all-core/icon-256.png +0 -0
  74. package/assets/brands/nirs4all-core/icon-32.png +0 -0
  75. package/assets/brands/nirs4all-core/icon-512.png +0 -0
  76. package/assets/brands/nirs4all-core/icon.svg +32 -7
  77. package/assets/brands/nirs4all-core/og.png +0 -0
  78. package/assets/brands/nirs4all-core/stacked-dark.svg +36 -0
  79. package/assets/brands/nirs4all-core/stacked.png +0 -0
  80. package/assets/brands/nirs4all-core/stacked.svg +35 -11
  81. package/assets/brands/nirs4all-datasets/favicon.ico +0 -0
  82. package/assets/brands/nirs4all-datasets/horizontal-dark.svg +37 -0
  83. package/assets/brands/nirs4all-datasets/horizontal.png +0 -0
  84. package/assets/brands/nirs4all-datasets/horizontal.svg +37 -0
  85. package/assets/brands/nirs4all-datasets/icon-180.png +0 -0
  86. package/assets/brands/nirs4all-datasets/icon-256.png +0 -0
  87. package/assets/brands/nirs4all-datasets/icon-32.png +0 -0
  88. package/assets/brands/nirs4all-datasets/icon-512.png +0 -0
  89. package/assets/brands/nirs4all-datasets/icon.svg +33 -0
  90. package/assets/brands/nirs4all-datasets/og.png +0 -0
  91. package/assets/brands/nirs4all-datasets/stacked-dark.svg +36 -0
  92. package/assets/brands/nirs4all-datasets/stacked.png +0 -0
  93. package/assets/brands/nirs4all-datasets/stacked.svg +36 -0
  94. package/assets/brands/nirs4all-device/favicon.ico +0 -0
  95. package/assets/brands/nirs4all-device/horizontal-dark.svg +37 -0
  96. package/assets/brands/nirs4all-device/horizontal.png +0 -0
  97. package/assets/brands/nirs4all-device/horizontal.svg +37 -0
  98. package/assets/brands/nirs4all-device/icon-180.png +0 -0
  99. package/assets/brands/nirs4all-device/icon-256.png +0 -0
  100. package/assets/brands/nirs4all-device/icon-32.png +0 -0
  101. package/assets/brands/nirs4all-device/icon-512.png +0 -0
  102. package/assets/brands/nirs4all-device/icon.svg +33 -0
  103. package/assets/brands/nirs4all-device/og.png +0 -0
  104. package/assets/brands/nirs4all-device/stacked-dark.svg +36 -0
  105. package/assets/brands/nirs4all-device/stacked.png +0 -0
  106. package/assets/brands/nirs4all-device/stacked.svg +36 -0
  107. package/assets/brands/nirs4all-formats/favicon.ico +0 -0
  108. package/assets/brands/nirs4all-formats/horizontal-dark.svg +37 -0
  109. package/assets/brands/nirs4all-formats/horizontal.png +0 -0
  110. package/assets/brands/nirs4all-formats/horizontal.svg +37 -0
  111. package/assets/brands/nirs4all-formats/icon-180.png +0 -0
  112. package/assets/brands/nirs4all-formats/icon-256.png +0 -0
  113. package/assets/brands/nirs4all-formats/icon-32.png +0 -0
  114. package/assets/brands/nirs4all-formats/icon-512.png +0 -0
  115. package/assets/brands/nirs4all-formats/icon.svg +33 -0
  116. package/assets/brands/nirs4all-formats/og.png +0 -0
  117. package/assets/brands/nirs4all-formats/stacked-dark.svg +36 -0
  118. package/assets/brands/nirs4all-formats/stacked.png +0 -0
  119. package/assets/brands/nirs4all-formats/stacked.svg +36 -0
  120. package/assets/brands/nirs4all-io/favicon.ico +0 -0
  121. package/assets/brands/nirs4all-io/horizontal-dark.svg +37 -0
  122. package/assets/brands/nirs4all-io/horizontal.png +0 -0
  123. package/assets/brands/nirs4all-io/horizontal.svg +37 -0
  124. package/assets/brands/nirs4all-io/icon-180.png +0 -0
  125. package/assets/brands/nirs4all-io/icon-256.png +0 -0
  126. package/assets/brands/nirs4all-io/icon-32.png +0 -0
  127. package/assets/brands/nirs4all-io/icon-512.png +0 -0
  128. package/assets/brands/nirs4all-io/icon.svg +33 -0
  129. package/assets/brands/nirs4all-io/og.png +0 -0
  130. package/assets/brands/nirs4all-io/stacked-dark.svg +36 -0
  131. package/assets/brands/nirs4all-io/stacked.png +0 -0
  132. package/assets/brands/nirs4all-io/stacked.svg +36 -0
  133. package/assets/brands/nirs4all-methods/favicon.ico +0 -0
  134. package/assets/brands/nirs4all-methods/horizontal-dark.svg +37 -0
  135. package/assets/brands/nirs4all-methods/horizontal.png +0 -0
  136. package/assets/brands/nirs4all-methods/horizontal.svg +37 -0
  137. package/assets/brands/nirs4all-methods/icon-180.png +0 -0
  138. package/assets/brands/nirs4all-methods/icon-256.png +0 -0
  139. package/assets/brands/nirs4all-methods/icon-32.png +0 -0
  140. package/assets/brands/nirs4all-methods/icon-512.png +0 -0
  141. package/assets/brands/nirs4all-methods/icon.svg +33 -0
  142. package/assets/brands/nirs4all-methods/og.png +0 -0
  143. package/assets/brands/nirs4all-methods/stacked-dark.svg +36 -0
  144. package/assets/brands/nirs4all-methods/stacked.png +0 -0
  145. package/assets/brands/nirs4all-methods/stacked.svg +36 -0
  146. package/assets/brands/nirs4all-papers/favicon.ico +0 -0
  147. package/assets/brands/nirs4all-papers/horizontal-dark.svg +37 -0
  148. package/assets/brands/nirs4all-papers/horizontal.png +0 -0
  149. package/assets/brands/nirs4all-papers/horizontal.svg +37 -0
  150. package/assets/brands/nirs4all-papers/icon-180.png +0 -0
  151. package/assets/brands/nirs4all-papers/icon-256.png +0 -0
  152. package/assets/brands/nirs4all-papers/icon-32.png +0 -0
  153. package/assets/brands/nirs4all-papers/icon-512.png +0 -0
  154. package/assets/brands/nirs4all-papers/icon.svg +33 -0
  155. package/assets/brands/nirs4all-papers/og.png +0 -0
  156. package/assets/brands/nirs4all-papers/stacked-dark.svg +36 -0
  157. package/assets/brands/nirs4all-papers/stacked.png +0 -0
  158. package/assets/brands/nirs4all-papers/stacked.svg +36 -0
  159. package/assets/brands/nirs4all-providers/favicon.ico +0 -0
  160. package/assets/brands/nirs4all-providers/horizontal-dark.svg +37 -0
  161. package/assets/brands/nirs4all-providers/horizontal.png +0 -0
  162. package/assets/brands/nirs4all-providers/horizontal.svg +36 -11
  163. package/assets/brands/nirs4all-providers/icon-180.png +0 -0
  164. package/assets/brands/nirs4all-providers/icon-256.png +0 -0
  165. package/assets/brands/nirs4all-providers/icon-32.png +0 -0
  166. package/assets/brands/nirs4all-providers/icon-512.png +0 -0
  167. package/assets/brands/nirs4all-providers/icon.svg +32 -7
  168. package/assets/brands/nirs4all-providers/og.png +0 -0
  169. package/assets/brands/nirs4all-providers/stacked-dark.svg +36 -0
  170. package/assets/brands/nirs4all-providers/stacked.png +0 -0
  171. package/assets/brands/nirs4all-providers/stacked.svg +35 -11
  172. package/assets/brands/nirs4all-quality/favicon.ico +0 -0
  173. package/assets/brands/nirs4all-quality/horizontal-dark.svg +36 -0
  174. package/assets/brands/nirs4all-quality/horizontal.svg +35 -11
  175. package/assets/brands/nirs4all-quality/icon-180.png +0 -0
  176. package/assets/brands/nirs4all-quality/icon-256.png +0 -0
  177. package/assets/brands/nirs4all-quality/icon-32.png +0 -0
  178. package/assets/brands/nirs4all-quality/icon-512.png +0 -0
  179. package/assets/brands/nirs4all-quality/icon.svg +32 -7
  180. package/assets/brands/nirs4all-quality/og.png +0 -0
  181. package/assets/brands/nirs4all-quality/stacked-dark.svg +36 -0
  182. package/assets/brands/nirs4all-quality/stacked.svg +35 -11
  183. package/assets/brands/nirs4all-repository/favicon.ico +0 -0
  184. package/assets/brands/nirs4all-repository/horizontal-dark.svg +37 -0
  185. package/assets/brands/nirs4all-repository/horizontal.png +0 -0
  186. package/assets/brands/nirs4all-repository/horizontal.svg +37 -0
  187. package/assets/brands/nirs4all-repository/icon-180.png +0 -0
  188. package/assets/brands/nirs4all-repository/icon-256.png +0 -0
  189. package/assets/brands/nirs4all-repository/icon-32.png +0 -0
  190. package/assets/brands/nirs4all-repository/icon-512.png +0 -0
  191. package/assets/brands/nirs4all-repository/icon.svg +33 -0
  192. package/assets/brands/nirs4all-repository/og.png +0 -0
  193. package/assets/brands/nirs4all-repository/stacked-dark.svg +36 -0
  194. package/assets/brands/nirs4all-repository/stacked.png +0 -0
  195. package/assets/brands/nirs4all-repository/stacked.svg +36 -0
  196. package/assets/brands/nirs4all-studio/favicon.ico +0 -0
  197. package/assets/brands/nirs4all-studio/horizontal-dark.svg +37 -0
  198. package/assets/brands/nirs4all-studio/horizontal.png +0 -0
  199. package/assets/brands/nirs4all-studio/horizontal.svg +37 -0
  200. package/assets/brands/nirs4all-studio/icon-180.png +0 -0
  201. package/assets/brands/nirs4all-studio/icon-256.png +0 -0
  202. package/assets/brands/nirs4all-studio/icon-32.png +0 -0
  203. package/assets/brands/nirs4all-studio/icon-512.png +0 -0
  204. package/assets/brands/nirs4all-studio/icon.svg +33 -0
  205. package/assets/brands/nirs4all-studio/og.png +0 -0
  206. package/assets/brands/nirs4all-studio/stacked-dark.svg +36 -0
  207. package/assets/brands/nirs4all-studio/stacked.png +0 -0
  208. package/assets/brands/nirs4all-studio/stacked.svg +36 -0
  209. package/assets/brands/nirs4all-tools/favicon.ico +0 -0
  210. package/assets/brands/nirs4all-tools/horizontal-dark.svg +37 -0
  211. package/assets/brands/nirs4all-tools/horizontal.png +0 -0
  212. package/assets/brands/nirs4all-tools/horizontal.svg +37 -0
  213. package/assets/brands/nirs4all-tools/icon-180.png +0 -0
  214. package/assets/brands/nirs4all-tools/icon-256.png +0 -0
  215. package/assets/brands/nirs4all-tools/icon-32.png +0 -0
  216. package/assets/brands/nirs4all-tools/icon-512.png +0 -0
  217. package/assets/brands/nirs4all-tools/icon.svg +33 -0
  218. package/assets/brands/nirs4all-tools/og.png +0 -0
  219. package/assets/brands/nirs4all-tools/stacked-dark.svg +36 -0
  220. package/assets/brands/nirs4all-tools/stacked.png +0 -0
  221. package/assets/brands/nirs4all-tools/stacked.svg +36 -0
  222. package/assets/brands/nirs4all-ui/favicon.ico +0 -0
  223. package/assets/brands/nirs4all-ui/horizontal-dark.svg +37 -0
  224. package/assets/brands/nirs4all-ui/horizontal.png +0 -0
  225. package/assets/brands/nirs4all-ui/horizontal.svg +36 -11
  226. package/assets/brands/nirs4all-ui/icon-180.png +0 -0
  227. package/assets/brands/nirs4all-ui/icon-256.png +0 -0
  228. package/assets/brands/nirs4all-ui/icon-32.png +0 -0
  229. package/assets/brands/nirs4all-ui/icon-512.png +0 -0
  230. package/assets/brands/nirs4all-ui/icon.svg +32 -7
  231. package/assets/brands/nirs4all-ui/og.png +0 -0
  232. package/assets/brands/nirs4all-ui/stacked-dark.svg +36 -0
  233. package/assets/brands/nirs4all-ui/stacked.png +0 -0
  234. package/assets/brands/nirs4all-ui/stacked.svg +35 -11
  235. package/assets/brands/nirs4all-web/favicon.ico +0 -0
  236. package/assets/brands/nirs4all-web/horizontal-dark.svg +37 -0
  237. package/assets/brands/nirs4all-web/horizontal.png +0 -0
  238. package/assets/brands/nirs4all-web/horizontal.svg +37 -0
  239. package/assets/brands/nirs4all-web/icon-180.png +0 -0
  240. package/assets/brands/nirs4all-web/icon-256.png +0 -0
  241. package/assets/brands/nirs4all-web/icon-32.png +0 -0
  242. package/assets/brands/nirs4all-web/icon-512.png +0 -0
  243. package/assets/brands/nirs4all-web/icon.svg +33 -0
  244. package/assets/brands/nirs4all-web/og.png +0 -0
  245. package/assets/brands/nirs4all-web/stacked-dark.svg +36 -0
  246. package/assets/brands/nirs4all-web/stacked.png +0 -0
  247. package/assets/brands/nirs4all-web/stacked.svg +36 -0
  248. package/assets/chains.css +601 -0
  249. package/assets/conformal.css +323 -0
  250. package/assets/dag.css +446 -0
  251. package/assets/motion/nirs-spectra.svg +26 -9
  252. package/assets/viz.css +152 -0
  253. package/dist/brand/index.d.ts +24 -126
  254. package/dist/brand/index.d.ts.map +1 -1
  255. package/dist/brand/index.js +52 -200
  256. package/dist/brand/index.js.map +1 -1
  257. package/dist/chains/ChainExplorer.d.ts +34 -0
  258. package/dist/chains/ChainExplorer.d.ts.map +1 -0
  259. package/dist/chains/ChainExplorer.js +119 -0
  260. package/dist/chains/ChainExplorer.js.map +1 -0
  261. package/dist/chains/ChainNodeHub.d.ts +31 -0
  262. package/dist/chains/ChainNodeHub.d.ts.map +1 -0
  263. package/dist/chains/ChainNodeHub.js +150 -0
  264. package/dist/chains/ChainNodeHub.js.map +1 -0
  265. package/dist/chains/ChainNodeOrbit.d.ts +31 -0
  266. package/dist/chains/ChainNodeOrbit.d.ts.map +1 -0
  267. package/dist/chains/ChainNodeOrbit.js +158 -0
  268. package/dist/chains/ChainNodeOrbit.js.map +1 -0
  269. package/dist/chains/ChainScoreBeeswarm.d.ts +25 -0
  270. package/dist/chains/ChainScoreBeeswarm.d.ts.map +1 -0
  271. package/dist/chains/ChainScoreBeeswarm.js +84 -0
  272. package/dist/chains/ChainScoreBeeswarm.js.map +1 -0
  273. package/dist/chains/NodeEffectForest.d.ts +33 -0
  274. package/dist/chains/NodeEffectForest.d.ts.map +1 -0
  275. package/dist/chains/NodeEffectForest.js +85 -0
  276. package/dist/chains/NodeEffectForest.js.map +1 -0
  277. package/dist/chains/PositionEffectHeatmap.d.ts +25 -0
  278. package/dist/chains/PositionEffectHeatmap.d.ts.map +1 -0
  279. package/dist/chains/PositionEffectHeatmap.js +77 -0
  280. package/dist/chains/PositionEffectHeatmap.js.map +1 -0
  281. package/dist/chains/SequenceEffectHeatmap.d.ts +22 -0
  282. package/dist/chains/SequenceEffectHeatmap.d.ts.map +1 -0
  283. package/dist/chains/SequenceEffectHeatmap.js +74 -0
  284. package/dist/chains/SequenceEffectHeatmap.js.map +1 -0
  285. package/dist/chains/_cx.d.ts +2 -0
  286. package/dist/chains/_cx.d.ts.map +1 -0
  287. package/dist/chains/_cx.js +8 -0
  288. package/dist/chains/_cx.js.map +1 -0
  289. package/dist/chains/analysis.d.ts +100 -0
  290. package/dist/chains/analysis.d.ts.map +1 -0
  291. package/dist/chains/analysis.js +440 -0
  292. package/dist/chains/analysis.js.map +1 -0
  293. package/dist/chains/colors.d.ts +26 -0
  294. package/dist/chains/colors.d.ts.map +1 -0
  295. package/dist/chains/colors.js +58 -0
  296. package/dist/chains/colors.js.map +1 -0
  297. package/dist/chains/contract.d.ts +54 -0
  298. package/dist/chains/contract.d.ts.map +1 -0
  299. package/dist/chains/contract.js +125 -0
  300. package/dist/chains/contract.js.map +1 -0
  301. package/dist/chains/index.d.ts +35 -0
  302. package/dist/chains/index.d.ts.map +1 -0
  303. package/dist/chains/index.js +41 -0
  304. package/dist/chains/index.js.map +1 -0
  305. package/dist/chains/normalize.d.ts +27 -0
  306. package/dist/chains/normalize.d.ts.map +1 -0
  307. package/dist/chains/normalize.js +104 -0
  308. package/dist/chains/normalize.js.map +1 -0
  309. package/dist/chains/radial.d.ts +21 -0
  310. package/dist/chains/radial.d.ts.map +1 -0
  311. package/dist/chains/radial.js +52 -0
  312. package/dist/chains/radial.js.map +1 -0
  313. package/dist/chains/types.d.ts +240 -0
  314. package/dist/chains/types.d.ts.map +1 -0
  315. package/dist/chains/types.js +52 -0
  316. package/dist/chains/types.js.map +1 -0
  317. package/dist/components/ConformalPredictionTree.d.ts +79 -0
  318. package/dist/components/ConformalPredictionTree.d.ts.map +1 -0
  319. package/dist/components/ConformalPredictionTree.js +223 -0
  320. package/dist/components/ConformalPredictionTree.js.map +1 -0
  321. package/dist/components/DatasetResultCard.d.ts +33 -0
  322. package/dist/components/DatasetResultCard.d.ts.map +1 -0
  323. package/dist/components/DatasetResultCard.js +9 -0
  324. package/dist/components/DatasetResultCard.js.map +1 -0
  325. package/dist/components/PerClassTable.d.ts +27 -0
  326. package/dist/components/PerClassTable.d.ts.map +1 -0
  327. package/dist/components/PerClassTable.js +9 -0
  328. package/dist/components/PerClassTable.js.map +1 -0
  329. package/dist/components/PredictionCard.d.ts +27 -0
  330. package/dist/components/PredictionCard.d.ts.map +1 -0
  331. package/dist/components/PredictionCard.js +6 -0
  332. package/dist/components/PredictionCard.js.map +1 -0
  333. package/dist/components/RankingsTable.d.ts +28 -0
  334. package/dist/components/RankingsTable.d.ts.map +1 -0
  335. package/dist/components/RankingsTable.js +14 -0
  336. package/dist/components/RankingsTable.js.map +1 -0
  337. package/dist/components/ScoreCardTree.d.ts +31 -0
  338. package/dist/components/ScoreCardTree.d.ts.map +1 -0
  339. package/dist/components/ScoreCardTree.js +17 -0
  340. package/dist/components/ScoreCardTree.js.map +1 -0
  341. package/dist/components/index.d.ts +6 -0
  342. package/dist/components/index.d.ts.map +1 -1
  343. package/dist/components/index.js +6 -0
  344. package/dist/components/index.js.map +1 -1
  345. package/dist/conformal/index.d.ts +2 -0
  346. package/dist/conformal/index.d.ts.map +1 -0
  347. package/dist/conformal/index.js +2 -0
  348. package/dist/conformal/index.js.map +1 -0
  349. package/dist/conformal/result.d.ts +224 -0
  350. package/dist/conformal/result.d.ts.map +1 -0
  351. package/dist/conformal/result.js +461 -0
  352. package/dist/conformal/result.js.map +1 -0
  353. package/dist/dag/DagGraphView.d.ts +35 -0
  354. package/dist/dag/DagGraphView.d.ts.map +1 -0
  355. package/dist/dag/DagGraphView.js +424 -0
  356. package/dist/dag/DagGraphView.js.map +1 -0
  357. package/dist/dag/_cx.d.ts +2 -0
  358. package/dist/dag/_cx.d.ts.map +1 -0
  359. package/dist/dag/_cx.js +8 -0
  360. package/dist/dag/_cx.js.map +1 -0
  361. package/dist/dag/collapse.d.ts +81 -0
  362. package/dist/dag/collapse.d.ts.map +1 -0
  363. package/dist/dag/collapse.js +210 -0
  364. package/dist/dag/collapse.js.map +1 -0
  365. package/dist/dag/colors.d.ts +19 -0
  366. package/dist/dag/colors.d.ts.map +1 -0
  367. package/dist/dag/colors.js +54 -0
  368. package/dist/dag/colors.js.map +1 -0
  369. package/dist/dag/fromCompiledGraph.d.ts +27 -0
  370. package/dist/dag/fromCompiledGraph.d.ts.map +1 -0
  371. package/dist/dag/fromCompiledGraph.js +133 -0
  372. package/dist/dag/fromCompiledGraph.js.map +1 -0
  373. package/dist/dag/hierarchy.d.ts +38 -0
  374. package/dist/dag/hierarchy.d.ts.map +1 -0
  375. package/dist/dag/hierarchy.js +75 -0
  376. package/dist/dag/hierarchy.js.map +1 -0
  377. package/dist/dag/index.d.ts +28 -0
  378. package/dist/dag/index.d.ts.map +1 -0
  379. package/dist/dag/index.js +33 -0
  380. package/dist/dag/index.js.map +1 -0
  381. package/dist/dag/layout.d.ts +57 -0
  382. package/dist/dag/layout.d.ts.map +1 -0
  383. package/dist/dag/layout.js +267 -0
  384. package/dist/dag/layout.js.map +1 -0
  385. package/dist/dag/locale.d.ts +31 -0
  386. package/dist/dag/locale.d.ts.map +1 -0
  387. package/dist/dag/locale.js +32 -0
  388. package/dist/dag/locale.js.map +1 -0
  389. package/dist/dag/shape.d.ts +48 -0
  390. package/dist/dag/shape.d.ts.map +1 -0
  391. package/dist/dag/shape.js +263 -0
  392. package/dist/dag/shape.js.map +1 -0
  393. package/dist/dag/types.d.ts +106 -0
  394. package/dist/dag/types.d.ts.map +1 -0
  395. package/dist/dag/types.js +56 -0
  396. package/dist/dag/types.js.map +1 -0
  397. package/dist/index.d.ts +7 -0
  398. package/dist/index.d.ts.map +1 -1
  399. package/dist/index.js +7 -0
  400. package/dist/index.js.map +1 -1
  401. package/dist/keywordRegistry/index.d.ts +9 -0
  402. package/dist/keywordRegistry/index.d.ts.map +1 -0
  403. package/dist/keywordRegistry/index.js +9 -0
  404. package/dist/keywordRegistry/index.js.map +1 -0
  405. package/dist/keywordRegistry/registry.d.ts +107 -0
  406. package/dist/keywordRegistry/registry.d.ts.map +1 -0
  407. package/dist/keywordRegistry/registry.js +234 -0
  408. package/dist/keywordRegistry/registry.js.map +1 -0
  409. package/dist/robustness/index.d.ts +12 -0
  410. package/dist/robustness/index.d.ts.map +1 -0
  411. package/dist/robustness/index.js +12 -0
  412. package/dist/robustness/index.js.map +1 -0
  413. package/dist/robustness/modes.d.ts +15 -0
  414. package/dist/robustness/modes.d.ts.map +1 -0
  415. package/dist/robustness/modes.js +64 -0
  416. package/dist/robustness/modes.js.map +1 -0
  417. package/dist/robustness/scenarios.d.ts +38 -0
  418. package/dist/robustness/scenarios.d.ts.map +1 -0
  419. package/dist/robustness/scenarios.js +159 -0
  420. package/dist/robustness/scenarios.js.map +1 -0
  421. package/dist/robustness/summary.d.ts +135 -0
  422. package/dist/robustness/summary.d.ts.map +1 -0
  423. package/dist/robustness/summary.js +284 -0
  424. package/dist/robustness/summary.js.map +1 -0
  425. package/dist/styles/index.d.ts +19 -1
  426. package/dist/styles/index.d.ts.map +1 -1
  427. package/dist/styles/index.js +21 -0
  428. package/dist/styles/index.js.map +1 -1
  429. package/dist/tuning/index.d.ts +3 -0
  430. package/dist/tuning/index.d.ts.map +1 -0
  431. package/dist/tuning/index.js +3 -0
  432. package/dist/tuning/index.js.map +1 -0
  433. package/dist/tuning/result.d.ts +144 -0
  434. package/dist/tuning/result.d.ts.map +1 -0
  435. package/dist/tuning/result.js +277 -0
  436. package/dist/tuning/result.js.map +1 -0
  437. package/dist/tuning/searchSpace.d.ts +54 -0
  438. package/dist/tuning/searchSpace.d.ts.map +1 -0
  439. package/dist/tuning/searchSpace.js +118 -0
  440. package/dist/tuning/searchSpace.js.map +1 -0
  441. package/dist/viz/BiasVarianceBars.d.ts +27 -0
  442. package/dist/viz/BiasVarianceBars.d.ts.map +1 -0
  443. package/dist/viz/BiasVarianceBars.js +53 -0
  444. package/dist/viz/BiasVarianceBars.js.map +1 -0
  445. package/dist/viz/BoxPlot.d.ts +24 -0
  446. package/dist/viz/BoxPlot.d.ts.map +1 -0
  447. package/dist/viz/BoxPlot.js +50 -0
  448. package/dist/viz/BoxPlot.js.map +1 -0
  449. package/dist/viz/ConformalIntervalStrip.d.ts +66 -0
  450. package/dist/viz/ConformalIntervalStrip.d.ts.map +1 -0
  451. package/dist/viz/ConformalIntervalStrip.js +167 -0
  452. package/dist/viz/ConformalIntervalStrip.js.map +1 -0
  453. package/dist/viz/ConfusionMatrix.d.ts +24 -0
  454. package/dist/viz/ConfusionMatrix.d.ts.map +1 -0
  455. package/dist/viz/ConfusionMatrix.js +39 -0
  456. package/dist/viz/ConfusionMatrix.js.map +1 -0
  457. package/dist/viz/FeatureImportanceBar.d.ts +26 -0
  458. package/dist/viz/FeatureImportanceBar.d.ts.map +1 -0
  459. package/dist/viz/FeatureImportanceBar.js +49 -0
  460. package/dist/viz/FeatureImportanceBar.js.map +1 -0
  461. package/dist/viz/FoldStabilityLines.d.ts +29 -0
  462. package/dist/viz/FoldStabilityLines.d.ts.map +1 -0
  463. package/dist/viz/FoldStabilityLines.js +57 -0
  464. package/dist/viz/FoldStabilityLines.js.map +1 -0
  465. package/dist/viz/Histogram.d.ts +33 -0
  466. package/dist/viz/Histogram.d.ts.map +1 -0
  467. package/dist/viz/Histogram.js +64 -0
  468. package/dist/viz/Histogram.js.map +1 -0
  469. package/dist/viz/PcaScatter.d.ts +36 -0
  470. package/dist/viz/PcaScatter.d.ts.map +1 -0
  471. package/dist/viz/PcaScatter.js +72 -0
  472. package/dist/viz/PcaScatter.js.map +1 -0
  473. package/dist/viz/PipelineFlow.d.ts +28 -0
  474. package/dist/viz/PipelineFlow.d.ts.map +1 -0
  475. package/dist/viz/PipelineFlow.js +57 -0
  476. package/dist/viz/PipelineFlow.js.map +1 -0
  477. package/dist/viz/PredictionScatter.d.ts +41 -0
  478. package/dist/viz/PredictionScatter.d.ts.map +1 -0
  479. package/dist/viz/PredictionScatter.js +41 -0
  480. package/dist/viz/PredictionScatter.js.map +1 -0
  481. package/dist/viz/ResidualPlot.d.ts +32 -0
  482. package/dist/viz/ResidualPlot.d.ts.map +1 -0
  483. package/dist/viz/ResidualPlot.js +58 -0
  484. package/dist/viz/ResidualPlot.js.map +1 -0
  485. package/dist/viz/ScoreHeatmap.d.ts +30 -0
  486. package/dist/viz/ScoreHeatmap.d.ts.map +1 -0
  487. package/dist/viz/ScoreHeatmap.js +61 -0
  488. package/dist/viz/ScoreHeatmap.js.map +1 -0
  489. package/dist/viz/ScoreSummary.d.ts +23 -0
  490. package/dist/viz/ScoreSummary.d.ts.map +1 -0
  491. package/dist/viz/ScoreSummary.js +32 -0
  492. package/dist/viz/ScoreSummary.js.map +1 -0
  493. package/dist/viz/ShapBeeswarm.d.ts +29 -0
  494. package/dist/viz/ShapBeeswarm.d.ts.map +1 -0
  495. package/dist/viz/ShapBeeswarm.js +60 -0
  496. package/dist/viz/ShapBeeswarm.js.map +1 -0
  497. package/dist/viz/SpectraPlot.d.ts +50 -0
  498. package/dist/viz/SpectraPlot.d.ts.map +1 -0
  499. package/dist/viz/SpectraPlot.js +46 -0
  500. package/dist/viz/SpectraPlot.js.map +1 -0
  501. package/dist/viz/WaterfallChart.d.ts +30 -0
  502. package/dist/viz/WaterfallChart.d.ts.map +1 -0
  503. package/dist/viz/WaterfallChart.js +73 -0
  504. package/dist/viz/WaterfallChart.js.map +1 -0
  505. package/dist/viz/_cx.d.ts +2 -0
  506. package/dist/viz/_cx.d.ts.map +1 -0
  507. package/dist/viz/_cx.js +8 -0
  508. package/dist/viz/_cx.js.map +1 -0
  509. package/dist/viz/geometry.d.ts +87 -0
  510. package/dist/viz/geometry.d.ts.map +1 -0
  511. package/dist/viz/geometry.js +208 -0
  512. package/dist/viz/geometry.js.map +1 -0
  513. package/dist/viz/index.d.ts +33 -0
  514. package/dist/viz/index.d.ts.map +1 -0
  515. package/dist/viz/index.js +38 -0
  516. package/dist/viz/index.js.map +1 -0
  517. package/dist/viz/theme.d.ts +50 -0
  518. package/dist/viz/theme.d.ts.map +1 -0
  519. package/dist/viz/theme.js +100 -0
  520. package/dist/viz/theme.js.map +1 -0
  521. package/package.json +34 -2
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Package-level view-model contract for the chain-effect explorer.
3
+ *
4
+ * A "chain" is one executed *linear* pipeline — an ordered sequence of steps
5
+ * (e.g. `SNV → SavGol → PLS`) that produced a comparable score (nRMSE, RMSE,
6
+ * R², …) on some dataset/source. This domain turns a corpus of *hundreds* of
7
+ * scored chains into the influence of each node: how much a step helps or
8
+ * hurts globally, whether it is better early / mid / late in the chain, and
9
+ * whether its effect depends on what precedes it (e.g. "MSC after SNV").
10
+ *
11
+ * This is a small, framework-free contract — deliberately NOT a dependency on
12
+ * `dag-ml`. The *authoritative* analysis (per-dataset score normalization with
13
+ * lineage) is a coordination concern that lives native in `dag-ml`; this
14
+ * package renders its serialized artifact (see {@link file://./contract.ts})
15
+ * and also ships a descriptive {@link file://./analysis.ts fromScoredChains}
16
+ * adapter — the same view-model tier as `viz/geometry` — so hosts can render
17
+ * from a raw scored-chain list before the native producer exists.
18
+ */
19
+ /** Coarse role of a step; drives color, legend, and position/sequence scoping. */
20
+ export type ChainStepRole = "split" | "preprocess" | "feature" | "model" | "augmentation" | "target" | "other";
21
+ /** One node occurrence inside a chain. */
22
+ export interface ChainStep {
23
+ /** Canonical id, e.g. `"snv"`, `"msc"`, `"savgol"`, `"pls"`. */
24
+ token: string;
25
+ /** Display label; defaults to `token`. */
26
+ label?: string;
27
+ role: ChainStepRole;
28
+ }
29
+ /** A single executed chain with a comparable score (host-provided raw input). */
30
+ export interface ScoredChain {
31
+ id: string;
32
+ /** Ordered steps, first → last. */
33
+ steps: readonly ChainStep[];
34
+ /** Metric value (e.g. nRMSE). Direction is carried by {@link ChainMetric}. */
35
+ score: number;
36
+ /** Dataset the chain ran on — the unit of per-dataset normalization. */
37
+ dataset?: string;
38
+ /** Source / modality (multisource, multimodal). */
39
+ source?: string;
40
+ }
41
+ /** The metric the scores are expressed in, plus its optimization direction. */
42
+ export interface ChainMetric {
43
+ key: string;
44
+ label: string;
45
+ /** `true` for error metrics (nRMSE, RMSE); `false` for R²/accuracy. */
46
+ lowerIsBetter: boolean;
47
+ }
48
+ /**
49
+ * Normalization lens that makes heterogeneous datasets comparable.
50
+ * - `raw`: oriented score as-is (best for a single dataset).
51
+ * - `rankByDataset`: percentile rank within each dataset (0..1, 1 = best) —
52
+ * robust, non-parametric; the recommended default for cross-dataset corpora.
53
+ * - `zByDataset`: z-score within each dataset (higher = better).
54
+ */
55
+ export type ScoreLens = "raw" | "rankByDataset" | "zByDataset";
56
+ /** A deduplicated token reference (first-occurrence order within a chain). */
57
+ export interface ChainTokenRef {
58
+ token: string;
59
+ label: string;
60
+ role: ChainStepRole;
61
+ }
62
+ /** One chain projected to a comparable "goodness" (higher = better). */
63
+ export interface ChainPoint {
64
+ id: string;
65
+ /** Raw metric value (for tooltips). */
66
+ score: number;
67
+ /** Oriented, lens-normalized score; higher is always better. */
68
+ goodness: number;
69
+ /** Dataset key (`"∗"` when unknown). */
70
+ dataset: string;
71
+ /** Source key (`"∗"` when unknown). */
72
+ source: string;
73
+ /** Unique tokens present (membership test). */
74
+ tokens: readonly string[];
75
+ /** First-occurrence-ordered, deduped step references. */
76
+ orderedTokens: readonly ChainTokenRef[];
77
+ }
78
+ /** Five-number summary + sample size of a goodness distribution. */
79
+ export interface Stat {
80
+ n: number;
81
+ min: number;
82
+ q1: number;
83
+ median: number;
84
+ q3: number;
85
+ max: number;
86
+ mean: number;
87
+ }
88
+ /** Global effect of one token: distribution with vs without, and the delta. */
89
+ export interface TokenEffect {
90
+ token: string;
91
+ label: string;
92
+ role: ChainStepRole;
93
+ /** Chains containing the token. */
94
+ n: number;
95
+ /** `n / total`. */
96
+ coverage: number;
97
+ /** Goodness of chains that contain the token. */
98
+ with: Stat;
99
+ /** Goodness of chains that do not. */
100
+ without: Stat;
101
+ /** `with.median − without.median` (NaN when either side is empty). */
102
+ delta: number;
103
+ }
104
+ /** The full analysis view-model consumed by every chart in this domain. */
105
+ export interface ChainEffectAnalysis {
106
+ lens: ScoreLens;
107
+ metric: ChainMetric;
108
+ total: number;
109
+ datasets: readonly string[];
110
+ sources: readonly string[];
111
+ roles: readonly ChainStepRole[];
112
+ /** Reference goodness (global median); the diverging color pivot. */
113
+ baseline: number;
114
+ goodnessExtent: {
115
+ min: number;
116
+ max: number;
117
+ };
118
+ points: readonly ChainPoint[];
119
+ /** Per-token effects, sorted by `delta` desc (NaN last). */
120
+ tokens: readonly TokenEffect[];
121
+ }
122
+ /** Position bucketization: absolute ordinal or relative early/mid/late phase. */
123
+ export type PositionMode = "absolute" | "phase";
124
+ export interface PositionBucket {
125
+ key: string;
126
+ label: string;
127
+ }
128
+ export interface PositionRow {
129
+ token: string;
130
+ label: string;
131
+ role: ChainStepRole;
132
+ /** Index-aligned to the matrix buckets; `null` below the min-count gate. */
133
+ cells: readonly (Stat | null)[];
134
+ }
135
+ export interface PositionMatrix {
136
+ mode: PositionMode;
137
+ buckets: readonly PositionBucket[];
138
+ rows: readonly PositionRow[];
139
+ baseline: number;
140
+ }
141
+ /** Predecessor (rows) × successor (cols) goodness matrix. */
142
+ export interface SequenceMatrix {
143
+ tokens: readonly ChainTokenRef[];
144
+ /** `cells[pred][succ]`; `null` on the diagonal or below the min-count gate. */
145
+ cells: readonly (readonly (Stat | null)[])[];
146
+ baseline: number;
147
+ adjacentOnly: boolean;
148
+ }
149
+ export interface ContextRow {
150
+ token: string;
151
+ label: string;
152
+ role: ChainStepRole;
153
+ stat: Stat;
154
+ /** `stat.median − baseline`. */
155
+ delta: number;
156
+ }
157
+ /** Best/worst neighbours for a focus token (drives the explorer detail panel). */
158
+ export interface TokenContexts {
159
+ token: string;
160
+ /** Tokens occurring before the focus, sorted by median goodness desc. */
161
+ predecessors: readonly ContextRow[];
162
+ /** Tokens occurring after the focus, sorted by median goodness desc. */
163
+ successors: readonly ContextRow[];
164
+ }
165
+ /** One co-occurring node linked to a focus node (an orbit wedge). */
166
+ export interface NeighborLink {
167
+ token: string;
168
+ label: string;
169
+ role: ChainStepRole;
170
+ /** Chains containing both the focus and this token — the link weight. */
171
+ count: number;
172
+ /** Goodness distribution of those shared chains. */
173
+ stat: Stat;
174
+ /** `stat.median − baseline` (the combined effect). */
175
+ delta: number;
176
+ }
177
+ /** One node in the directional flow tree (a sunburst wedge with children). */
178
+ export interface FlowNode {
179
+ token: string;
180
+ label: string;
181
+ role: ChainStepRole;
182
+ /** Chains matching the ordered path focus → … → this node. */
183
+ count: number;
184
+ stat: Stat;
185
+ /** `stat.median − baseline`. */
186
+ delta: number;
187
+ /** The next step(s) after this node, nested one ring further out. */
188
+ children: readonly FlowNode[];
189
+ }
190
+ /**
191
+ * Directional flow around a focus node — the multi-ring sunburst model:
192
+ * predecessors (what leads in, one inner ring) and a successor tree (what
193
+ * follows, expanded outward `depth` rings).
194
+ */
195
+ export interface NodeFlow {
196
+ token: string;
197
+ label: string;
198
+ role: ChainStepRole;
199
+ /** Goodness of every chain containing the focus. */
200
+ self: Stat;
201
+ /** Nodes occurring before the focus — the inner ring. */
202
+ predecessors: readonly NeighborLink[];
203
+ /** Ordered continuation after the focus — the outer sunburst. */
204
+ successors: readonly FlowNode[];
205
+ baseline: number;
206
+ goodnessExtent: {
207
+ min: number;
208
+ max: number;
209
+ };
210
+ }
211
+ /** A focus node and its co-occurring neighbours — the single-ring model. */
212
+ export interface NodeNeighborhood {
213
+ token: string;
214
+ label: string;
215
+ role: ChainStepRole;
216
+ /** Goodness of every chain containing the focus. */
217
+ self: Stat;
218
+ /** Neighbours sorted by link weight desc (capped by `maxNeighbors`). */
219
+ neighbors: readonly NeighborLink[];
220
+ /** Neighbour tokens folded out beyond the cap. */
221
+ otherCount: number;
222
+ /** Summed link weight of the folded neighbours (the "others" wedge span). */
223
+ otherWeight: number;
224
+ baseline: number;
225
+ goodnessExtent: {
226
+ min: number;
227
+ max: number;
228
+ };
229
+ }
230
+ /** Human-facing role labels for legends and chips. */
231
+ export declare const CHAIN_ROLE_LABELS: Readonly<Record<ChainStepRole, string>>;
232
+ /** Stable display order for roles (used when listing/grouping). */
233
+ export declare const CHAIN_ROLE_ORDER: readonly ChainStepRole[];
234
+ /** Roles whose *order* is meaningful — the "transform stack" of a chain. */
235
+ export declare const CHAIN_TRANSFORM_ROLES: readonly ChainStepRole[];
236
+ /** Short labels for each normalization lens. */
237
+ export declare const CHAIN_LENS_LABELS: Readonly<Record<ScoreLens, string>>;
238
+ /** Coerce an arbitrary role string to a known {@link ChainStepRole}. */
239
+ export declare function coerceChainRole(role: string | undefined): ChainStepRole;
240
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chains/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Package-level view-model contract for the chain-effect explorer.
3
+ *
4
+ * A "chain" is one executed *linear* pipeline — an ordered sequence of steps
5
+ * (e.g. `SNV → SavGol → PLS`) that produced a comparable score (nRMSE, RMSE,
6
+ * R², …) on some dataset/source. This domain turns a corpus of *hundreds* of
7
+ * scored chains into the influence of each node: how much a step helps or
8
+ * hurts globally, whether it is better early / mid / late in the chain, and
9
+ * whether its effect depends on what precedes it (e.g. "MSC after SNV").
10
+ *
11
+ * This is a small, framework-free contract — deliberately NOT a dependency on
12
+ * `dag-ml`. The *authoritative* analysis (per-dataset score normalization with
13
+ * lineage) is a coordination concern that lives native in `dag-ml`; this
14
+ * package renders its serialized artifact (see {@link file://./contract.ts})
15
+ * and also ships a descriptive {@link file://./analysis.ts fromScoredChains}
16
+ * adapter — the same view-model tier as `viz/geometry` — so hosts can render
17
+ * from a raw scored-chain list before the native producer exists.
18
+ */
19
+ /** Human-facing role labels for legends and chips. */
20
+ export const CHAIN_ROLE_LABELS = {
21
+ split: "Split / CV",
22
+ preprocess: "Preprocess",
23
+ feature: "Feature",
24
+ model: "Model",
25
+ augmentation: "Augmentation",
26
+ target: "Target",
27
+ other: "Other",
28
+ };
29
+ /** Stable display order for roles (used when listing/grouping). */
30
+ export const CHAIN_ROLE_ORDER = [
31
+ "split",
32
+ "preprocess",
33
+ "feature",
34
+ "augmentation",
35
+ "model",
36
+ "target",
37
+ "other",
38
+ ];
39
+ /** Roles whose *order* is meaningful — the "transform stack" of a chain. */
40
+ export const CHAIN_TRANSFORM_ROLES = ["preprocess", "feature", "augmentation"];
41
+ /** Short labels for each normalization lens. */
42
+ export const CHAIN_LENS_LABELS = {
43
+ raw: "Raw score",
44
+ rankByDataset: "Rank in dataset",
45
+ zByDataset: "Z in dataset",
46
+ };
47
+ const VALID_ROLES = new Set(CHAIN_ROLE_ORDER);
48
+ /** Coerce an arbitrary role string to a known {@link ChainStepRole}. */
49
+ export function coerceChainRole(role) {
50
+ return role && VALID_ROLES.has(role) ? role : "other";
51
+ }
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chains/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAwOH,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,OAAO;IACP,YAAY;IACZ,SAAS;IACT,cAAc;IACd,OAAO;IACP,QAAQ;IACR,OAAO;CACR,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAA6B,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAEzG,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAwC;IACpE,GAAG,EAAE,WAAW;IAChB,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,cAAc;CAC3B,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAgB,gBAAgB,CAAC,CAAC;AAE7D,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,OAAO,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,IAAqB,CAAC,CAAC,CAAC,CAAE,IAAsB,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { ReactNode } from "react";
2
+ import { type Extent } from "../viz/geometry.js";
3
+ import type { ConformalGuaranteeView, ConformalIntervalSummaryRow, ConformalPredictionIntervalCell, ConformalPredictionRow } from "../conformal/result.js";
4
+ export type ConformalTreeGroupMode = "conformance" | "uncertainty" | "none";
5
+ export type ConformalTierTone = "success" | "warning" | "danger" | "neutral";
6
+ /** One prediction, projected onto its conformance / uncertainty coordinates. */
7
+ export interface ConformalTreeSample {
8
+ index: number;
9
+ sampleId: string | null;
10
+ prediction: number;
11
+ predictionLabel: string;
12
+ actual: number | null;
13
+ /** Width of the target-coverage interval (falls back to the widest band). */
14
+ targetWidth: number | null;
15
+ widestWidth: number;
16
+ coveredAtTarget: boolean | null;
17
+ /** Smallest coverage level whose interval still contains the truth. */
18
+ tightestCovering: number | null;
19
+ intervals: readonly ConformalPredictionIntervalCell[];
20
+ }
21
+ export interface ConformalTreeTier {
22
+ id: string;
23
+ label: string;
24
+ description: string;
25
+ tone: ConformalTierTone;
26
+ samples: ConformalTreeSample[];
27
+ count: number;
28
+ share: number;
29
+ meanWidth: number | null;
30
+ }
31
+ export interface ConformalTreeModel {
32
+ tiers: ConformalTreeTier[];
33
+ coverages: number[];
34
+ domain: Extent;
35
+ target: number;
36
+ total: number;
37
+ hasActuals: boolean;
38
+ groupBy: ConformalTreeGroupMode;
39
+ }
40
+ export interface BuildConformalTreeOptions {
41
+ actuals?: readonly (number | null | undefined)[] | undefined;
42
+ targetCoverage?: number | null | undefined;
43
+ groupBy?: "auto" | ConformalTreeGroupMode | undefined;
44
+ }
45
+ /**
46
+ * Project calibrated prediction rows into a grouped, nesting-aware tree model —
47
+ * the pure view-model behind {@link ConformalPredictionTree}. Grouping is by
48
+ * where the truth falls within the nested intervals (conformance) when ground
49
+ * truth is present, otherwise by interval width (uncertainty).
50
+ */
51
+ export declare function buildConformalTreeModel(rows: readonly ConformalPredictionRow[], options?: BuildConformalTreeOptions): ConformalTreeModel;
52
+ export interface ConformalPredictionTreeProps {
53
+ rows: readonly ConformalPredictionRow[];
54
+ /** Ground-truth values aligned to `rows` — enables conformance grouping + scoring. */
55
+ actuals?: readonly (number | null | undefined)[];
56
+ /** Materialized interval summaries (qhat per coverage) for the leaf rows. */
57
+ summaries?: readonly ConformalIntervalSummaryRow[];
58
+ guarantee?: ConformalGuaranteeView | null;
59
+ targetCoverage?: number | null;
60
+ groupBy?: "auto" | ConformalTreeGroupMode;
61
+ unit?: string;
62
+ defaultOpenTiers?: boolean;
63
+ maxSamplesPerTier?: number;
64
+ glyphWidth?: number;
65
+ className?: string;
66
+ empty?: ReactNode;
67
+ }
68
+ /**
69
+ * Calibrated **predictions as a nested conformance tree** — the drill-down
70
+ * companion to {@link file://../viz/ConformalIntervalStrip.tsx ConformalIntervalStrip}.
71
+ * Predictions are grouped into conformance tiers (where the truth lands inside
72
+ * the nested intervals) or uncertainty tiers (interval width), each tier opening
73
+ * into per-sample nodes that carry a nesting glyph, and each sample opening into
74
+ * its per-coverage interval rows. Presentational + local `<details>` state only;
75
+ * hosts pass `conformal` view-model rows. Default styles ship at
76
+ * `nirs4all-ui/assets/conformal.css`.
77
+ */
78
+ export declare function ConformalPredictionTree({ rows, actuals, summaries, guarantee, targetCoverage, groupBy, unit, defaultOpenTiers, maxSamplesPerTier, glyphWidth, className, empty, }: ConformalPredictionTreeProps): import("react").JSX.Element;
79
+ //# sourceMappingURL=ConformalPredictionTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConformalPredictionTree.d.ts","sourceRoot":"","sources":["../../src/components/ConformalPredictionTree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { clamp, makeScale, niceExtent, quantileSorted, round, } from "../viz/geometry.js";
3
+ import { N4_VIZ_COLORS } from "../viz/theme.js";
4
+ import { conformalBandShade } from "../viz/ConformalIntervalStrip.js";
5
+ const COVERED_COLOR = "#059669";
6
+ const MISSED_COLOR = N4_VIZ_COLORS.rose;
7
+ const PREDICTION_COLOR = N4_VIZ_COLORS.indigo;
8
+ function cellWidth(cell) {
9
+ return cell.upper - cell.lower;
10
+ }
11
+ function coversActual(cell, actual) {
12
+ return actual >= cell.lower && actual <= cell.upper;
13
+ }
14
+ /**
15
+ * Project calibrated prediction rows into a grouped, nesting-aware tree model —
16
+ * the pure view-model behind {@link ConformalPredictionTree}. Grouping is by
17
+ * where the truth falls within the nested intervals (conformance) when ground
18
+ * truth is present, otherwise by interval width (uncertainty).
19
+ */
20
+ export function buildConformalTreeModel(rows, options = {}) {
21
+ const { actuals, targetCoverage = null, groupBy = "auto" } = options;
22
+ const coverages = [...new Set(rows.flatMap((row) => row.intervals.map((cell) => cell.coverage)))]
23
+ .filter((coverage) => Number.isFinite(coverage))
24
+ .sort((a, b) => b - a);
25
+ const minCoverage = coverages.length > 0 ? coverages[coverages.length - 1] : Number.NaN;
26
+ const target = targetCoverage != null && coverages.includes(targetCoverage)
27
+ ? targetCoverage
28
+ : (coverages[0] ?? Number.NaN);
29
+ const valuePool = [];
30
+ const samples = rows.map((row, index) => {
31
+ const rawActual = actuals?.[index];
32
+ const actual = rawActual != null && Number.isFinite(rawActual) ? rawActual : null;
33
+ valuePool.push(row.yPred);
34
+ if (actual != null)
35
+ valuePool.push(actual);
36
+ let widest = 0;
37
+ let tightestCovering = null;
38
+ for (const cell of row.intervals) {
39
+ valuePool.push(cell.lower, cell.upper);
40
+ widest = Math.max(widest, cellWidth(cell));
41
+ if (actual != null && coversActual(cell, actual)) {
42
+ tightestCovering = tightestCovering == null ? cell.coverage : Math.min(tightestCovering, cell.coverage);
43
+ }
44
+ }
45
+ const targetCell = row.intervals.find((cell) => cell.coverage === target) ?? null;
46
+ return {
47
+ index: row.index,
48
+ sampleId: row.sampleId,
49
+ prediction: row.yPred,
50
+ predictionLabel: row.yPredLabel,
51
+ actual,
52
+ targetWidth: targetCell ? cellWidth(targetCell) : null,
53
+ widestWidth: widest,
54
+ coveredAtTarget: actual == null ? null : tightestCovering != null && tightestCovering <= target,
55
+ tightestCovering,
56
+ intervals: row.intervals,
57
+ };
58
+ });
59
+ const hasActuals = samples.some((sample) => sample.actual != null);
60
+ const mode = groupBy === "auto"
61
+ ? (hasActuals ? "conformance" : "uncertainty")
62
+ : groupBy;
63
+ const domain = niceExtent(valuePool, 0.04);
64
+ const tiers = mode === "conformance"
65
+ ? conformanceTiers(samples, target, minCoverage)
66
+ : mode === "uncertainty"
67
+ ? uncertaintyTiers(samples)
68
+ : flatTier(samples);
69
+ return {
70
+ tiers: tiers.filter((tier) => tier.count > 0),
71
+ coverages,
72
+ domain,
73
+ target,
74
+ total: samples.length,
75
+ hasActuals,
76
+ groupBy: mode,
77
+ };
78
+ }
79
+ function tierWidth(sample) {
80
+ return sample.targetWidth ?? sample.widestWidth;
81
+ }
82
+ function finalizeTier(id, label, description, tone, samples, total) {
83
+ const widths = samples.map(tierWidth).filter((width) => Number.isFinite(width));
84
+ const meanWidth = widths.length > 0 ? widths.reduce((sum, width) => sum + width, 0) / widths.length : null;
85
+ return {
86
+ id,
87
+ label,
88
+ description,
89
+ tone,
90
+ samples,
91
+ count: samples.length,
92
+ share: total > 0 ? samples.length / total : 0,
93
+ meanWidth,
94
+ };
95
+ }
96
+ function conformanceTiers(samples, target, minCoverage) {
97
+ const core = [];
98
+ const within = [];
99
+ const wide = [];
100
+ const violation = [];
101
+ const unknown = [];
102
+ for (const sample of samples) {
103
+ if (sample.actual == null) {
104
+ unknown.push(sample);
105
+ }
106
+ else if (sample.tightestCovering == null) {
107
+ violation.push(sample);
108
+ }
109
+ else if (sample.tightestCovering <= minCoverage) {
110
+ core.push(sample);
111
+ }
112
+ else if (sample.tightestCovering <= target) {
113
+ within.push(sample);
114
+ }
115
+ else {
116
+ wide.push(sample);
117
+ }
118
+ }
119
+ return [
120
+ finalizeTier("core", "Truth in the tightest band", "Covered even by the narrowest calibrated interval.", "success", core, samples.length),
121
+ finalizeTier("within", "Covered at target", "Covered at the guarantee level but not the tightest band.", "success", within, samples.length),
122
+ finalizeTier("wide", "Covered only when widened", "Truth falls outside the target band but inside a wider one.", "warning", wide, samples.length),
123
+ finalizeTier("violation", "Interval violations", "Truth escapes every calibrated interval.", "danger", violation, samples.length),
124
+ finalizeTier("unknown", "No ground truth", "Prediction intervals only — no observed value to score.", "neutral", unknown, samples.length),
125
+ ];
126
+ }
127
+ function uncertaintyTiers(samples) {
128
+ const sortedWidths = samples.map(tierWidth).filter((width) => Number.isFinite(width)).sort((a, b) => a - b);
129
+ const q33 = quantileSorted(sortedWidths, 1 / 3);
130
+ const q66 = quantileSorted(sortedWidths, 2 / 3);
131
+ const tight = [];
132
+ const moderate = [];
133
+ const broad = [];
134
+ for (const sample of samples) {
135
+ const width = tierWidth(sample);
136
+ if (width <= q33)
137
+ tight.push(sample);
138
+ else if (width <= q66)
139
+ moderate.push(sample);
140
+ else
141
+ broad.push(sample);
142
+ }
143
+ return [
144
+ finalizeTier("tight", "Tight intervals", "The most confident predictions — narrowest calibrated intervals.", "success", tight, samples.length),
145
+ finalizeTier("moderate", "Typical intervals", "Interval widths around the median of the set.", "neutral", moderate, samples.length),
146
+ finalizeTier("broad", "Wide intervals", "The least certain predictions — widest calibrated intervals.", "warning", broad, samples.length),
147
+ ];
148
+ }
149
+ function flatTier(samples) {
150
+ return [finalizeTier("all", "All predictions", "Every calibrated prediction.", "neutral", samples, samples.length)];
151
+ }
152
+ function fmtCoverage(coverage) {
153
+ if (!Number.isFinite(coverage))
154
+ return "—";
155
+ const percent = coverage * 100;
156
+ return `${Number.isInteger(percent) ? percent.toFixed(0) : percent.toFixed(1)}%`;
157
+ }
158
+ function fmtShare(share) {
159
+ const percent = share * 100;
160
+ return `${percent < 10 && percent > 0 ? percent.toFixed(1) : percent.toFixed(0)}%`;
161
+ }
162
+ function fmtWidth(width) {
163
+ if (width == null || !Number.isFinite(width))
164
+ return "—";
165
+ if (Math.abs(width) >= 1000)
166
+ return width.toFixed(0);
167
+ if (Math.abs(width) >= 1)
168
+ return width.toFixed(2);
169
+ return width.toFixed(3);
170
+ }
171
+ function shadeForCoverage(coverage, coverages) {
172
+ if (coverages.length <= 1)
173
+ return conformalBandShade(0.62);
174
+ const rank = coverages.indexOf(coverage);
175
+ return conformalBandShade(rank / (coverages.length - 1));
176
+ }
177
+ /** Per-sample horizontal nesting of the calibrated intervals + truth marker. */
178
+ function NestedBandGlyph({ sample, coverages, domain, width, height = 22 }) {
179
+ const padX = 3;
180
+ const scale = makeScale(domain, padX, width - padX);
181
+ const barTop = 3;
182
+ const barHeight = height - barTop * 2;
183
+ const bands = [...sample.intervals].sort((a, b) => b.coverage - a.coverage);
184
+ return (_jsxs("svg", { className: "n4conf-glyph", viewBox: `0 0 ${width} ${height}`, width: width, height: height, role: "img", "aria-label": `Nested intervals for ${sample.sampleId ?? `sample ${sample.index}`}`, preserveAspectRatio: "none", children: [bands.map((cell) => {
185
+ const x1 = scale(cell.lower);
186
+ const x2 = scale(cell.upper);
187
+ return (_jsx("rect", { className: "n4conf-glyph-band", x: round(Math.min(x1, x2)), y: barTop, width: round(Math.abs(x2 - x1)), height: barHeight, rx: 2, fill: shadeForCoverage(cell.coverage, coverages) }, `b-${cell.coverage}`));
188
+ }), _jsx("line", { className: "n4conf-glyph-point", x1: round(scale(sample.prediction)), x2: round(scale(sample.prediction)), y1: barTop - 1, y2: height - barTop + 1, stroke: PREDICTION_COLOR, strokeWidth: 2 }), sample.actual != null ? (sample.coveredAtTarget !== false ? (_jsx("circle", { cx: round(scale(sample.actual)), cy: height / 2, r: 3.2, fill: COVERED_COLOR, stroke: "var(--n4-color-surface, #fff)", strokeWidth: 1.5 })) : (_jsx("path", { d: diamond(scale(sample.actual), height / 2, 3.8), fill: MISSED_COLOR, stroke: "var(--n4-color-surface, #fff)", strokeWidth: 1.5 }))) : null] }));
189
+ }
190
+ /**
191
+ * Calibrated **predictions as a nested conformance tree** — the drill-down
192
+ * companion to {@link file://../viz/ConformalIntervalStrip.tsx ConformalIntervalStrip}.
193
+ * Predictions are grouped into conformance tiers (where the truth lands inside
194
+ * the nested intervals) or uncertainty tiers (interval width), each tier opening
195
+ * into per-sample nodes that carry a nesting glyph, and each sample opening into
196
+ * its per-coverage interval rows. Presentational + local `<details>` state only;
197
+ * hosts pass `conformal` view-model rows. Default styles ship at
198
+ * `nirs4all-ui/assets/conformal.css`.
199
+ */
200
+ export function ConformalPredictionTree({ rows, actuals, summaries, guarantee = null, targetCoverage = null, groupBy = "auto", unit, defaultOpenTiers = true, maxSamplesPerTier = 50, glyphWidth = 150, className, empty, }) {
201
+ if (rows.length === 0)
202
+ return empty == null ? _jsx("div", { className: cx("n4conf-tree", className) }) : _jsx(_Fragment, { children: empty });
203
+ const model = buildConformalTreeModel(rows, { actuals, targetCoverage, groupBy });
204
+ const qhatByCoverage = new Map((summaries ?? []).map((row) => [row.coverage, row.qhatLabel]));
205
+ const maxWidth = Math.max(1e-9, ...rows.flatMap((row) => row.intervals.map((cell) => cell.width)));
206
+ const unitSuffix = unit ? ` ${unit}` : "";
207
+ return (_jsxs("div", { className: cx("n4conf-tree", className), children: [guarantee ? (_jsxs("header", { className: "n4conf-guarantee", "data-tone": guarantee.tone, children: [_jsx("span", { className: "n4conf-guarantee-status", "data-status": guarantee.status }), _jsx("span", { className: "n4conf-guarantee-label", children: guarantee.label }), _jsxs("span", { className: "n4conf-guarantee-meta", children: [guarantee.method, " \u00B7 ", guarantee.effectiveEngine, " \u00B7 target ", guarantee.coverageLabel] })] })) : null, _jsxs("div", { className: "n4conf-legend", role: "note", children: [_jsxs("span", { className: "n4conf-legend-item", children: [_jsx("i", { className: "n4conf-swatch", style: { background: PREDICTION_COLOR } }), " prediction"] }), model.hasActuals ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "n4conf-legend-item", children: [_jsx("i", { className: "n4conf-dot", style: { background: COVERED_COLOR } }), " covered"] }), _jsxs("span", { className: "n4conf-legend-item", children: [_jsx("i", { className: "n4conf-diamond", style: { background: MISSED_COLOR } }), " missed"] })] })) : null, _jsxs("span", { className: "n4conf-legend-item n4conf-legend-ramp", "aria-hidden": "true", children: [model.coverages.map((coverage) => (_jsx("i", { className: "n4conf-swatch", title: fmtCoverage(coverage), style: { background: shadeForCoverage(coverage, model.coverages) } }, coverage))), _jsx("span", { className: "n4conf-legend-ramp-label", children: "wide \u2192 tight" })] })] }), model.tiers.map((tier) => (_jsxs("details", { className: "n4conf-tier", "data-tone": tier.tone, open: defaultOpenTiers, children: [_jsxs("summary", { className: "n4conf-tier-summary", children: [_jsx("span", { className: "n4conf-chevron", "aria-hidden": "true" }), _jsx("span", { className: "n4conf-tier-label", children: tier.label }), _jsx("span", { className: "n4conf-tier-desc", children: tier.description }), _jsxs("span", { className: "n4conf-tier-stats", children: [_jsx("span", { className: "n4conf-badge", children: tier.count }), _jsx("span", { className: "n4conf-share", children: fmtShare(tier.share) }), _jsxs("span", { className: "n4conf-meanwidth", children: ["x\u0304 width ", fmtWidth(tier.meanWidth), unitSuffix] })] })] }), _jsxs("div", { className: "n4conf-samples", children: [tier.samples.slice(0, maxSamplesPerTier).map((sample) => (_jsxs("details", { className: "n4conf-sample", children: [_jsxs("summary", { className: "n4conf-sample-summary", children: [_jsx("span", { className: "n4conf-chevron", "aria-hidden": "true" }), _jsx("span", { className: "n4conf-sample-id", children: sample.sampleId ?? `#${sample.index}` }), _jsxs("span", { className: "n4conf-sample-pred", children: ["\u0177 ", sample.predictionLabel, unitSuffix] }), _jsx(NestedBandGlyph, { sample: sample, coverages: model.coverages, domain: model.domain, width: glyphWidth }), sample.coveredAtTarget == null ? (_jsxs("span", { className: "n4conf-chip", "data-tone": "neutral", children: ["\u00B1", fmtWidth(sample.targetWidth ?? sample.widestWidth)] })) : sample.coveredAtTarget ? (_jsxs("span", { className: "n4conf-chip", "data-tone": "success", children: ["covered ", sample.tightestCovering != null ? fmtCoverage(sample.tightestCovering) : ""] })) : (_jsx("span", { className: "n4conf-chip", "data-tone": "danger", children: "missed" }))] }), _jsx("div", { className: "n4conf-levels", children: [...sample.intervals].sort((a, b) => a.coverage - b.coverage).map((cell) => {
208
+ const covered = sample.actual == null ? null : coversActual(cell, sample.actual);
209
+ const qhat = qhatByCoverage.get(cell.coverage);
210
+ return (_jsxs("div", { className: "n4conf-level", "data-covered": covered == null ? "na" : covered ? "yes" : "no", children: [_jsx("span", { className: "n4conf-level-cov", children: cell.coverageLabel }), qhat ? _jsxs("span", { className: "n4conf-level-qhat", children: ["q\u0302 ", qhat] }) : null, _jsxs("span", { className: "n4conf-level-range", children: ["[", cell.lowerLabel, ", ", cell.upperLabel, "]"] }), _jsx("span", { className: "n4conf-level-bar", "aria-hidden": "true", children: _jsx("i", { className: "n4conf-level-bar-fill", style: { width: `${clamp((cell.width / maxWidth) * 100, 2, 100)}%`, background: shadeForCoverage(cell.coverage, model.coverages) } }) }), _jsxs("span", { className: "n4conf-level-width", children: [cell.widthLabel, unitSuffix] }), covered != null ? (_jsx("span", { className: "n4conf-level-mark", "data-covered": covered ? "yes" : "no", children: covered ? "✓" : "✗" })) : null] }, cell.coverage));
211
+ }) })] }, sample.index))), tier.samples.length > maxSamplesPerTier ? (_jsxs("p", { className: "n4conf-more", children: ["+", tier.samples.length - maxSamplesPerTier, " more predictions"] })) : null] })] }, tier.id)))] }));
212
+ }
213
+ function diamond(cx, cy, radius) {
214
+ const x = round(cx);
215
+ const y = round(cy);
216
+ const r = round(radius);
217
+ return `M${x} ${y - r} L${x + r} ${y} L${x} ${y + r} L${x - r} ${y} Z`;
218
+ }
219
+ function cx(...parts) {
220
+ const resolved = parts.filter((part) => typeof part === "string" && part.length > 0);
221
+ return resolved.length > 0 ? resolved.join(" ") : undefined;
222
+ }
223
+ //# sourceMappingURL=ConformalPredictionTree.js.map