matterviz 0.3.6 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (926) hide show
  1. package/dist/EmptyState.svelte.d.ts +9 -0
  2. package/dist/FilePicker.svelte +360 -0
  3. package/dist/FilePicker.svelte.d.ts +17 -0
  4. package/dist/Icon.svelte +44 -0
  5. package/dist/Icon.svelte.d.ts +13 -0
  6. package/dist/MillerIndexInput.svelte +66 -0
  7. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  8. package/dist/api/mp.d.ts +6 -0
  9. package/dist/api/mp.js +22 -0
  10. package/dist/api/optimade.d.ts +45 -0
  11. package/dist/api/optimade.js +141 -0
  12. package/dist/app.css +244 -0
  13. package/dist/brillouin/BrillouinZone.svelte +554 -0
  14. package/dist/brillouin/BrillouinZone.svelte.d.ts +84 -0
  15. package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
  17. package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
  18. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
  19. package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  20. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
  21. package/dist/brillouin/BrillouinZoneScene.svelte +522 -0
  22. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +49 -0
  23. package/dist/brillouin/BrillouinZoneTooltip.svelte +83 -0
  24. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
  25. package/dist/brillouin/compute.d.ts +17 -0
  26. package/dist/brillouin/compute.js +422 -0
  27. package/dist/brillouin/index.d.ts +8 -0
  28. package/dist/brillouin/index.js +7 -0
  29. package/dist/brillouin/types.d.ts +43 -0
  30. package/dist/brillouin/types.js +1 -0
  31. package/dist/chempot-diagram/ChemPotDiagram.svelte +328 -0
  32. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  33. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +843 -0
  34. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  35. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3191 -0
  36. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  37. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  38. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  39. package/dist/chempot-diagram/async-compute.svelte.js +80 -0
  40. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  41. package/dist/chempot-diagram/chempot-worker.js +12 -0
  42. package/dist/chempot-diagram/color.d.ts +10 -0
  43. package/dist/chempot-diagram/color.js +32 -0
  44. package/dist/chempot-diagram/compute.d.ts +48 -0
  45. package/dist/chempot-diagram/compute.js +804 -0
  46. package/dist/chempot-diagram/index.d.ts +6 -0
  47. package/dist/chempot-diagram/index.js +6 -0
  48. package/dist/chempot-diagram/pointer.d.ts +16 -0
  49. package/dist/chempot-diagram/pointer.js +40 -0
  50. package/dist/chempot-diagram/temperature.d.ts +15 -0
  51. package/dist/chempot-diagram/temperature.js +34 -0
  52. package/dist/chempot-diagram/types.d.ts +81 -0
  53. package/dist/chempot-diagram/types.js +28 -0
  54. package/dist/colors/index.d.ts +47 -0
  55. package/dist/colors/index.js +204 -0
  56. package/dist/composition/BarChart.svelte +297 -0
  57. package/dist/composition/BarChart.svelte.d.ts +39 -0
  58. package/dist/composition/BubbleChart.svelte +218 -0
  59. package/dist/composition/BubbleChart.svelte.d.ts +28 -0
  60. package/dist/composition/Composition.svelte +165 -0
  61. package/dist/composition/Composition.svelte.d.ts +15 -0
  62. package/dist/composition/Formula.svelte +268 -0
  63. package/dist/composition/Formula.svelte.d.ts +19 -0
  64. package/dist/composition/FormulaFilter.svelte +1263 -0
  65. package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
  66. package/dist/composition/PieChart.svelte +324 -0
  67. package/dist/composition/PieChart.svelte.d.ts +37 -0
  68. package/dist/composition/chem-sys.d.ts +8 -0
  69. package/dist/composition/chem-sys.js +85 -0
  70. package/dist/composition/format.d.ts +15 -0
  71. package/dist/composition/format.js +111 -0
  72. package/dist/composition/index.d.ts +21 -0
  73. package/dist/composition/index.js +15 -0
  74. package/dist/composition/parse.d.ts +56 -0
  75. package/dist/composition/parse.js +486 -0
  76. package/dist/constants.d.ts +29 -0
  77. package/dist/constants.js +99 -0
  78. package/dist/controls.d.ts +14 -0
  79. package/dist/controls.js +30 -0
  80. package/dist/convex-hull/ConvexHull.svelte +157 -0
  81. package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
  82. package/dist/convex-hull/ConvexHull2D.svelte +827 -0
  83. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
  84. package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
  85. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
  86. package/dist/convex-hull/ConvexHull4D.svelte +1394 -0
  87. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
  88. package/dist/convex-hull/ConvexHullControls.svelte +535 -0
  89. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
  90. package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
  91. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
  92. package/dist/convex-hull/ConvexHullStats.svelte +929 -0
  93. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
  94. package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
  95. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
  96. package/dist/convex-hull/GasPressureControls.svelte +247 -0
  97. package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
  98. package/dist/convex-hull/StructurePopup.svelte +151 -0
  99. package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
  100. package/dist/convex-hull/TemperatureSlider.svelte +140 -0
  101. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
  102. package/dist/convex-hull/barycentric-coords.d.ts +18 -0
  103. package/dist/convex-hull/barycentric-coords.js +182 -0
  104. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  105. package/dist/convex-hull/demo-temperature.js +38 -0
  106. package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
  107. package/dist/convex-hull/gas-thermodynamics.js +306 -0
  108. package/dist/convex-hull/helpers.d.ts +117 -0
  109. package/dist/convex-hull/helpers.js +718 -0
  110. package/dist/convex-hull/index.d.ts +119 -0
  111. package/dist/convex-hull/index.js +58 -0
  112. package/dist/convex-hull/thermodynamics.d.ts +67 -0
  113. package/dist/convex-hull/thermodynamics.js +1757 -0
  114. package/dist/convex-hull/types.d.ts +162 -0
  115. package/dist/convex-hull/types.js +36 -0
  116. package/dist/coordination/CoordinationBarPlot.svelte +311 -0
  117. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
  118. package/dist/coordination/calc-coordination.d.ts +15 -0
  119. package/dist/coordination/calc-coordination.js +63 -0
  120. package/dist/coordination/index.d.ts +8 -0
  121. package/dist/coordination/index.js +7 -0
  122. package/dist/effects.svelte.d.ts +12 -0
  123. package/dist/effects.svelte.js +37 -0
  124. package/dist/element/BohrAtom.svelte.d.ts +20 -0
  125. package/dist/element/ElementHeading.svelte +26 -0
  126. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  127. package/dist/element/ElementPhoto.svelte +57 -0
  128. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  129. package/dist/element/ElementStats.svelte +80 -0
  130. package/dist/element/ElementStats.svelte.d.ts +8 -0
  131. package/dist/element/ElementTile.svelte +484 -0
  132. package/dist/element/ElementTile.svelte.d.ts +29 -0
  133. package/dist/element/Nucleus.svelte.d.ts +17 -0
  134. package/dist/element/data.d.ts +2 -0
  135. package/dist/element/data.js +2 -0
  136. package/dist/element/index.d.ts +8 -0
  137. package/dist/element/index.js +7 -0
  138. package/dist/element/types.d.ts +57 -0
  139. package/dist/element/types.js +1 -0
  140. package/dist/feedback/ClickFeedback.svelte +58 -0
  141. package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
  142. package/dist/feedback/DragOverlay.svelte +42 -0
  143. package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
  144. package/dist/feedback/Spinner.svelte.d.ts +7 -0
  145. package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
  146. package/dist/feedback/index.d.ts +4 -0
  147. package/dist/feedback/index.js +4 -0
  148. package/dist/fermi-surface/FermiSlice.svelte +197 -0
  149. package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
  150. package/dist/fermi-surface/FermiSurface.svelte +606 -0
  151. package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
  152. package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
  153. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
  154. package/dist/fermi-surface/FermiSurfaceScene.svelte +797 -0
  155. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
  156. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +85 -0
  157. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
  158. package/dist/fermi-surface/compute.d.ts +5 -0
  159. package/dist/fermi-surface/compute.js +538 -0
  160. package/dist/fermi-surface/constants.d.ts +9 -0
  161. package/dist/fermi-surface/constants.js +27 -0
  162. package/dist/fermi-surface/export.d.ts +5 -0
  163. package/dist/fermi-surface/export.js +51 -0
  164. package/dist/fermi-surface/index.d.ts +12 -0
  165. package/dist/fermi-surface/index.js +13 -0
  166. package/dist/fermi-surface/marching-cubes.d.ts +2 -0
  167. package/dist/fermi-surface/marching-cubes.js +2 -0
  168. package/dist/fermi-surface/parse.d.ts +2 -0
  169. package/dist/fermi-surface/parse.js +494 -0
  170. package/dist/fermi-surface/symmetry.d.ts +3 -0
  171. package/dist/fermi-surface/symmetry.js +46 -0
  172. package/dist/fermi-surface/types.d.ts +111 -0
  173. package/dist/fermi-surface/types.js +4 -0
  174. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1547 -0
  175. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  176. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  177. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  178. package/dist/heatmap-matrix/index.d.ts +53 -0
  179. package/dist/heatmap-matrix/index.js +100 -0
  180. package/dist/heatmap-matrix/shared.d.ts +2 -0
  181. package/dist/heatmap-matrix/shared.js +4 -0
  182. package/dist/icons.d.ts +569 -0
  183. package/dist/icons.js +648 -0
  184. package/dist/index.d.ts +39 -0
  185. package/dist/index.js +39 -0
  186. package/dist/io/decompress.d.ts +11 -0
  187. package/dist/io/decompress.js +76 -0
  188. package/dist/io/export.d.ts +16 -0
  189. package/dist/io/export.js +338 -0
  190. package/dist/io/fetch.d.ts +5 -0
  191. package/dist/io/fetch.js +43 -0
  192. package/dist/io/file-drop.d.ts +7 -0
  193. package/dist/io/file-drop.js +42 -0
  194. package/dist/io/index.d.ts +7 -0
  195. package/dist/io/index.js +6 -0
  196. package/dist/io/is-binary.d.ts +1 -0
  197. package/dist/io/is-binary.js +20 -0
  198. package/dist/io/types.d.ts +8 -0
  199. package/dist/io/types.js +1 -0
  200. package/dist/io/url-drop.d.ts +2 -0
  201. package/dist/io/url-drop.js +154 -0
  202. package/dist/isosurface/Isosurface.svelte +285 -0
  203. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  204. package/dist/isosurface/IsosurfaceControls.svelte +277 -0
  205. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  206. package/dist/isosurface/index.d.ts +5 -0
  207. package/dist/isosurface/index.js +6 -0
  208. package/dist/isosurface/parse.d.ts +6 -0
  209. package/dist/isosurface/parse.js +552 -0
  210. package/dist/isosurface/slice.d.ts +11 -0
  211. package/dist/isosurface/slice.js +141 -0
  212. package/dist/isosurface/types.d.ts +56 -0
  213. package/dist/isosurface/types.js +227 -0
  214. package/dist/keyboard.d.ts +3 -0
  215. package/dist/keyboard.js +23 -0
  216. package/dist/labels.d.ts +53 -0
  217. package/dist/labels.js +278 -0
  218. package/dist/layout/FullscreenToggle.svelte +50 -0
  219. package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
  220. package/dist/layout/InfoCard.svelte +120 -0
  221. package/dist/layout/InfoCard.svelte.d.ts +21 -0
  222. package/dist/layout/InfoTag.svelte +185 -0
  223. package/dist/layout/InfoTag.svelte.d.ts +19 -0
  224. package/dist/layout/PropertyFilter.svelte +247 -0
  225. package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
  226. package/dist/layout/SettingsSection.svelte +148 -0
  227. package/dist/layout/SettingsSection.svelte.d.ts +17 -0
  228. package/dist/layout/SubpageGrid.svelte +82 -0
  229. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  230. package/dist/layout/fullscreen.d.ts +9 -0
  231. package/dist/layout/fullscreen.js +53 -0
  232. package/dist/layout/index.d.ts +10 -0
  233. package/dist/layout/index.js +8 -0
  234. package/dist/layout/json-tree/JsonNode.svelte +548 -0
  235. package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
  236. package/dist/layout/json-tree/JsonTree.svelte +1230 -0
  237. package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
  238. package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
  239. package/dist/layout/json-tree/index.d.ts +3 -0
  240. package/dist/layout/json-tree/index.js +3 -0
  241. package/dist/layout/json-tree/types.d.ts +74 -0
  242. package/dist/layout/json-tree/types.js +2 -0
  243. package/dist/layout/json-tree/utils.d.ts +29 -0
  244. package/dist/layout/json-tree/utils.js +642 -0
  245. package/dist/marching-cubes.d.ts +14 -0
  246. package/dist/marching-cubes.js +535 -0
  247. package/dist/math.d.ts +105 -0
  248. package/dist/math.js +920 -0
  249. package/dist/overlays/ContextMenu.svelte +162 -0
  250. package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
  251. package/dist/overlays/CopyButton.svelte +45 -0
  252. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  253. package/dist/overlays/DragControlTab.svelte +98 -0
  254. package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
  255. package/dist/overlays/DraggablePane.svelte +487 -0
  256. package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
  257. package/dist/overlays/InfoPaneCards.svelte +149 -0
  258. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  259. package/dist/overlays/index.d.ts +3 -0
  260. package/dist/overlays/index.js +3 -0
  261. package/dist/periodic-table/PeriodicTable.svelte +480 -0
  262. package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
  263. package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
  264. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
  265. package/dist/periodic-table/PropertySelect.svelte +38 -0
  266. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  267. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  268. package/dist/periodic-table/index.d.ts +10 -0
  269. package/dist/periodic-table/index.js +4 -0
  270. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1092 -0
  271. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
  272. package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
  273. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
  274. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +127 -0
  275. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  276. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  277. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
  278. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  279. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
  280. package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
  281. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
  282. package/dist/phase-diagram/build-diagram.d.ts +11 -0
  283. package/dist/phase-diagram/build-diagram.js +160 -0
  284. package/dist/phase-diagram/colors.d.ts +35 -0
  285. package/dist/phase-diagram/colors.js +51 -0
  286. package/dist/phase-diagram/diagram-input.d.ts +29 -0
  287. package/dist/phase-diagram/diagram-input.js +3 -0
  288. package/dist/phase-diagram/index.d.ts +13 -0
  289. package/dist/phase-diagram/index.js +11 -0
  290. package/dist/phase-diagram/parse.d.ts +55 -0
  291. package/dist/phase-diagram/parse.js +273 -0
  292. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  293. package/dist/phase-diagram/svg-to-diagram.js +867 -0
  294. package/dist/phase-diagram/types.d.ts +93 -0
  295. package/dist/phase-diagram/types.js +1 -0
  296. package/dist/phase-diagram/utils.d.ts +118 -0
  297. package/dist/phase-diagram/utils.js +600 -0
  298. package/dist/plot/bar/BarPlot.svelte +1755 -0
  299. package/dist/plot/bar/BarPlot.svelte.d.ts +84 -0
  300. package/dist/plot/bar/BarPlotControls.svelte +67 -0
  301. package/dist/plot/bar/BarPlotControls.svelte.d.ts +18 -0
  302. package/dist/plot/bar/SpacegroupBarPlot.svelte +293 -0
  303. package/dist/plot/bar/SpacegroupBarPlot.svelte.d.ts +9 -0
  304. package/dist/plot/bar/data.d.ts +40 -0
  305. package/dist/plot/bar/data.js +154 -0
  306. package/dist/plot/bar/geometry.d.ts +39 -0
  307. package/dist/plot/bar/geometry.js +60 -0
  308. package/dist/plot/bar/index.d.ts +3 -0
  309. package/dist/plot/bar/index.js +3 -0
  310. package/dist/plot/box/BoxPlot.svelte +1462 -0
  311. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  312. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  313. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  314. package/dist/plot/box/Violin.svelte +14 -0
  315. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  316. package/dist/plot/box/box-plot.d.ts +55 -0
  317. package/dist/plot/box/box-plot.js +126 -0
  318. package/dist/plot/box/index.d.ts +5 -0
  319. package/dist/plot/box/index.js +5 -0
  320. package/dist/plot/box/kde.d.ts +16 -0
  321. package/dist/plot/box/kde.js +160 -0
  322. package/dist/plot/box/quantile.d.ts +3 -0
  323. package/dist/plot/box/quantile.js +53 -0
  324. package/dist/plot/core/auto-place.d.ts +43 -0
  325. package/dist/plot/core/auto-place.js +122 -0
  326. package/dist/plot/core/axis-utils.d.ts +46 -0
  327. package/dist/plot/core/axis-utils.js +110 -0
  328. package/dist/plot/core/components/AxisLabel.svelte +51 -0
  329. package/dist/plot/core/components/AxisLabel.svelte.d.ts +16 -0
  330. package/dist/plot/core/components/ColorBar.svelte +724 -0
  331. package/dist/plot/core/components/ColorBar.svelte.d.ts +31 -0
  332. package/dist/plot/core/components/ColorScaleSelect.svelte +55 -0
  333. package/dist/plot/core/components/ColorScaleSelect.svelte.d.ts +15 -0
  334. package/dist/plot/core/components/ControlPane.svelte +46 -0
  335. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  336. package/dist/plot/core/components/FillArea.svelte +234 -0
  337. package/dist/plot/core/components/FillArea.svelte.d.ts +21 -0
  338. package/dist/plot/core/components/InteractiveAxisLabel.svelte +96 -0
  339. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +14 -0
  340. package/dist/plot/core/components/Line.svelte +101 -0
  341. package/dist/plot/core/components/Line.svelte.d.ts +15 -0
  342. package/dist/plot/core/components/PlotAxis.svelte +171 -0
  343. package/dist/plot/core/components/PlotAxis.svelte.d.ts +25 -0
  344. package/dist/plot/core/components/PlotControls.svelte +525 -0
  345. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  346. package/dist/plot/core/components/PlotLegend.svelte +580 -0
  347. package/dist/plot/core/components/PlotLegend.svelte.d.ts +30 -0
  348. package/dist/plot/core/components/PlotTooltip.svelte +83 -0
  349. package/dist/plot/core/components/PlotTooltip.svelte.d.ts +25 -0
  350. package/dist/plot/core/components/PortalSelect.svelte +257 -0
  351. package/dist/plot/core/components/PortalSelect.svelte.d.ts +16 -0
  352. package/dist/plot/core/components/ReferenceLine.svelte +204 -0
  353. package/dist/plot/core/components/ReferenceLine.svelte.d.ts +20 -0
  354. package/dist/plot/core/components/ReferenceLine3D.svelte +156 -0
  355. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +14 -0
  356. package/dist/plot/core/components/ReferencePlane.svelte +175 -0
  357. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +14 -0
  358. package/dist/plot/core/components/ZeroLines.svelte +97 -0
  359. package/dist/plot/core/components/ZeroLines.svelte.d.ts +33 -0
  360. package/dist/plot/core/components/ZoomRect.svelte +23 -0
  361. package/dist/plot/core/components/ZoomRect.svelte.d.ts +8 -0
  362. package/dist/plot/core/components/index.d.ts +17 -0
  363. package/dist/plot/core/components/index.js +17 -0
  364. package/dist/plot/core/data-cleaning.d.ts +107 -0
  365. package/dist/plot/core/data-cleaning.js +853 -0
  366. package/dist/plot/core/data-transform.d.ts +16 -0
  367. package/dist/plot/core/data-transform.js +45 -0
  368. package/dist/plot/core/fill-utils.d.ts +33 -0
  369. package/dist/plot/core/fill-utils.js +388 -0
  370. package/dist/plot/core/hover-lock.svelte.d.ts +14 -0
  371. package/dist/plot/core/hover-lock.svelte.js +45 -0
  372. package/dist/plot/core/index.d.ts +10 -0
  373. package/dist/plot/core/index.js +11 -0
  374. package/dist/plot/core/interactions.d.ts +35 -0
  375. package/dist/plot/core/interactions.js +195 -0
  376. package/dist/plot/core/layout.d.ts +79 -0
  377. package/dist/plot/core/layout.js +281 -0
  378. package/dist/plot/core/reference-line.d.ts +60 -0
  379. package/dist/plot/core/reference-line.js +301 -0
  380. package/dist/plot/core/scales.d.ts +48 -0
  381. package/dist/plot/core/scales.js +480 -0
  382. package/dist/plot/core/svg.d.ts +2 -0
  383. package/dist/plot/core/svg.js +41 -0
  384. package/dist/plot/core/types.d.ts +771 -0
  385. package/dist/plot/core/types.js +99 -0
  386. package/dist/plot/core/utils/label-placement.d.ts +68 -0
  387. package/dist/plot/core/utils/label-placement.js +326 -0
  388. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  389. package/dist/plot/core/utils/series-visibility.js +112 -0
  390. package/dist/plot/core/utils.d.ts +11 -0
  391. package/dist/plot/core/utils.js +27 -0
  392. package/dist/plot/histogram/Histogram.svelte +1418 -0
  393. package/dist/plot/histogram/Histogram.svelte.d.ts +50 -0
  394. package/dist/plot/histogram/HistogramControls.svelte +212 -0
  395. package/dist/plot/histogram/HistogramControls.svelte.d.ts +22 -0
  396. package/dist/plot/histogram/index.d.ts +2 -0
  397. package/dist/plot/histogram/index.js +2 -0
  398. package/dist/plot/index.d.ts +8 -0
  399. package/dist/plot/index.js +10 -0
  400. package/dist/plot/sankey/Sankey.svelte +700 -0
  401. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  402. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  403. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  404. package/dist/plot/sankey/index.d.ts +4 -0
  405. package/dist/plot/sankey/index.js +3 -0
  406. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  407. package/dist/plot/sankey/sankey-types.js +4 -0
  408. package/dist/plot/sankey/sankey.d.ts +52 -0
  409. package/dist/plot/sankey/sankey.js +187 -0
  410. package/dist/plot/scatter/BinnedScatterPlot.svelte +1116 -0
  411. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +66 -0
  412. package/dist/plot/scatter/ElementScatter.svelte +63 -0
  413. package/dist/plot/scatter/ElementScatter.svelte.d.ts +14 -0
  414. package/dist/plot/scatter/ScatterPlot.svelte +2357 -0
  415. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +96 -0
  416. package/dist/plot/scatter/ScatterPlotControls.svelte +307 -0
  417. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +17 -0
  418. package/dist/plot/scatter/ScatterPoint.svelte +182 -0
  419. package/dist/plot/scatter/ScatterPoint.svelte.d.ts +22 -0
  420. package/dist/plot/scatter/adaptive-density.d.ts +79 -0
  421. package/dist/plot/scatter/adaptive-density.js +217 -0
  422. package/dist/plot/scatter/binned-scatter-types.d.ts +59 -0
  423. package/dist/plot/scatter/binned-scatter-types.js +1 -0
  424. package/dist/plot/scatter/index.d.ts +7 -0
  425. package/dist/plot/scatter/index.js +5 -0
  426. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  427. package/dist/plot/scatter/scatter-data.js +212 -0
  428. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +531 -0
  429. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +95 -0
  430. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +438 -0
  431. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +20 -0
  432. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +912 -0
  433. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +74 -0
  434. package/dist/plot/scatter-3d/Surface3D.svelte +197 -0
  435. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +13 -0
  436. package/dist/plot/scatter-3d/index.d.ts +4 -0
  437. package/dist/plot/scatter-3d/index.js +4 -0
  438. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  439. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  440. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  441. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  442. package/dist/plot/sunburst/index.d.ts +4 -0
  443. package/dist/plot/sunburst/index.js +4 -0
  444. package/dist/plot/sunburst/render.d.ts +34 -0
  445. package/dist/plot/sunburst/render.js +122 -0
  446. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  447. package/dist/plot/sunburst/sunburst.js +266 -0
  448. package/dist/rdf/RdfPlot.svelte +248 -0
  449. package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
  450. package/dist/rdf/calc-rdf.d.ts +4 -0
  451. package/dist/rdf/calc-rdf.js +98 -0
  452. package/dist/rdf/index.d.ts +23 -0
  453. package/dist/rdf/index.js +2 -0
  454. package/dist/sanitize.d.ts +6 -0
  455. package/dist/sanitize.js +116 -0
  456. package/dist/settings.d.ts +319 -0
  457. package/dist/settings.js +1394 -0
  458. package/dist/spectral/Bands.svelte +1050 -0
  459. package/dist/spectral/Bands.svelte.d.ts +39 -0
  460. package/dist/spectral/BandsAndDos.svelte +134 -0
  461. package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
  462. package/dist/spectral/BrillouinBandsDos.svelte +264 -0
  463. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
  464. package/dist/spectral/Dos.svelte +688 -0
  465. package/dist/spectral/Dos.svelte.d.ts +29 -0
  466. package/dist/spectral/helpers.d.ts +121 -0
  467. package/dist/spectral/helpers.js +1098 -0
  468. package/dist/spectral/index.d.ts +6 -0
  469. package/dist/spectral/index.js +6 -0
  470. package/dist/spectral/types.d.ts +84 -0
  471. package/dist/spectral/types.js +2 -0
  472. package/dist/state.svelte.d.ts +25 -0
  473. package/dist/state.svelte.js +45 -0
  474. package/dist/structure/Arrow.svelte +72 -0
  475. package/dist/structure/Arrow.svelte.d.ts +15 -0
  476. package/dist/structure/AtomLegend.svelte +814 -0
  477. package/dist/structure/AtomLegend.svelte.d.ts +35 -0
  478. package/dist/structure/Bond.svelte +140 -0
  479. package/dist/structure/Bond.svelte.d.ts +9 -0
  480. package/dist/structure/CanvasTooltip.svelte +33 -0
  481. package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
  482. package/dist/structure/CellSelect.svelte +348 -0
  483. package/dist/structure/CellSelect.svelte.d.ts +13 -0
  484. package/dist/structure/Cylinder.svelte +49 -0
  485. package/dist/structure/Cylinder.svelte.d.ts +13 -0
  486. package/dist/structure/Lattice.svelte +196 -0
  487. package/dist/structure/Lattice.svelte.d.ts +17 -0
  488. package/dist/structure/Structure.svelte +2254 -0
  489. package/dist/structure/Structure.svelte.d.ts +89 -0
  490. package/dist/structure/StructureControls.svelte +1273 -0
  491. package/dist/structure/StructureControls.svelte.d.ts +31 -0
  492. package/dist/structure/StructureExportPane.svelte +252 -0
  493. package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
  494. package/dist/structure/StructureInfoPane.svelte +736 -0
  495. package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
  496. package/dist/structure/StructureScene.svelte +2256 -0
  497. package/dist/structure/StructureScene.svelte.d.ts +111 -0
  498. package/dist/structure/atom-properties.d.ts +37 -0
  499. package/dist/structure/atom-properties.js +200 -0
  500. package/dist/structure/bond-order-perception.d.ts +13 -0
  501. package/dist/structure/bond-order-perception.js +384 -0
  502. package/dist/structure/bonding.d.ts +69 -0
  503. package/dist/structure/bonding.js +724 -0
  504. package/dist/structure/export.d.ts +20 -0
  505. package/dist/structure/export.js +731 -0
  506. package/dist/structure/index.d.ts +124 -0
  507. package/dist/structure/index.js +167 -0
  508. package/dist/structure/label-placement.d.ts +14 -0
  509. package/dist/structure/label-placement.js +72 -0
  510. package/dist/structure/measure.d.ts +7 -0
  511. package/dist/structure/measure.js +30 -0
  512. package/dist/structure/parse.d.ts +66 -0
  513. package/dist/structure/parse.js +1410 -0
  514. package/dist/structure/partial-occupancy.d.ts +25 -0
  515. package/dist/structure/partial-occupancy.js +99 -0
  516. package/dist/structure/pbc.d.ts +9 -0
  517. package/dist/structure/pbc.js +127 -0
  518. package/dist/structure/supercell.d.ts +8 -0
  519. package/dist/structure/supercell.js +170 -0
  520. package/dist/structure/validation.d.ts +2 -0
  521. package/dist/structure/validation.js +10 -0
  522. package/dist/symmetry/SymmetryStats.svelte +226 -0
  523. package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
  524. package/dist/symmetry/WyckoffTable.svelte +120 -0
  525. package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
  526. package/dist/symmetry/cell-transform.d.ts +12 -0
  527. package/dist/symmetry/cell-transform.js +91 -0
  528. package/dist/symmetry/index.d.ts +43 -0
  529. package/dist/symmetry/index.js +226 -0
  530. package/dist/symmetry/spacegroups.d.ts +16 -0
  531. package/dist/symmetry/spacegroups.js +429 -0
  532. package/dist/table/HeatmapTable.svelte +1885 -0
  533. package/dist/table/HeatmapTable.svelte.d.ts +49 -0
  534. package/dist/table/ToggleMenu.svelte +385 -0
  535. package/dist/table/ToggleMenu.svelte.d.ts +11 -0
  536. package/dist/table/index.d.ts +72 -0
  537. package/dist/table/index.js +38 -0
  538. package/dist/theme/ThemeControl.svelte +53 -0
  539. package/dist/theme/ThemeControl.svelte.d.ts +9 -0
  540. package/dist/theme/index.d.ts +29 -0
  541. package/dist/theme/index.js +79 -0
  542. package/dist/time.d.ts +4 -0
  543. package/dist/time.js +70 -0
  544. package/dist/tooltip/KCoords.svelte +45 -0
  545. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  546. package/dist/tooltip/TooltipContent.svelte +58 -0
  547. package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
  548. package/dist/tooltip/index.d.ts +3 -0
  549. package/dist/tooltip/index.js +2 -0
  550. package/dist/tooltip/types.d.ts +8 -0
  551. package/dist/tooltip/types.js +1 -0
  552. package/dist/trajectory/Trajectory.svelte +1571 -0
  553. package/dist/trajectory/Trajectory.svelte.d.ts +78 -0
  554. package/dist/trajectory/TrajectoryError.svelte +128 -0
  555. package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
  556. package/dist/trajectory/TrajectoryExportPane.svelte +358 -0
  557. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
  558. package/dist/trajectory/TrajectoryInfoPane.svelte +314 -0
  559. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
  560. package/dist/trajectory/constants.d.ts +6 -0
  561. package/dist/trajectory/constants.js +7 -0
  562. package/dist/trajectory/extract.d.ts +5 -0
  563. package/dist/trajectory/extract.js +162 -0
  564. package/dist/trajectory/format-detect.d.ts +10 -0
  565. package/dist/trajectory/format-detect.js +90 -0
  566. package/dist/trajectory/frame-reader.d.ts +17 -0
  567. package/dist/trajectory/frame-reader.js +299 -0
  568. package/dist/trajectory/helpers.d.ts +15 -0
  569. package/dist/trajectory/helpers.js +164 -0
  570. package/dist/trajectory/index.d.ts +63 -0
  571. package/dist/trajectory/index.js +126 -0
  572. package/dist/trajectory/parse/ase.d.ts +2 -0
  573. package/dist/trajectory/parse/ase.js +73 -0
  574. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  575. package/dist/trajectory/parse/hdf5.js +127 -0
  576. package/dist/trajectory/parse/index.d.ts +12 -0
  577. package/dist/trajectory/parse/index.js +306 -0
  578. package/dist/trajectory/parse/lammps.d.ts +5 -0
  579. package/dist/trajectory/parse/lammps.js +179 -0
  580. package/dist/trajectory/parse/vasp.d.ts +2 -0
  581. package/dist/trajectory/parse/vasp.js +87 -0
  582. package/dist/trajectory/parse/xyz.d.ts +26 -0
  583. package/dist/trajectory/parse/xyz.js +123 -0
  584. package/dist/trajectory/plotting.d.ts +28 -0
  585. package/dist/trajectory/plotting.js +423 -0
  586. package/dist/trajectory/types.d.ts +11 -0
  587. package/dist/trajectory/types.js +1 -0
  588. package/dist/utils.d.ts +7 -0
  589. package/dist/utils.js +47 -0
  590. package/dist/xrd/XrdPlot.svelte +616 -0
  591. package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
  592. package/dist/xrd/broadening.d.ts +20 -0
  593. package/dist/xrd/broadening.js +97 -0
  594. package/dist/xrd/calc-xrd.d.ts +37 -0
  595. package/dist/xrd/calc-xrd.js +339 -0
  596. package/dist/xrd/index.d.ts +37 -0
  597. package/dist/xrd/index.js +4 -0
  598. package/dist/xrd/parse.d.ts +13 -0
  599. package/dist/xrd/parse.js +749 -0
  600. package/license +1 -1
  601. package/package.json +237 -1458
  602. package/readme.md +98 -171
  603. package/.vscode/launch.json +0 -13
  604. package/.vscodeignore +0 -7
  605. package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
  606. package/dist/assets/browser-DdDecX_W.js +0 -1
  607. package/dist/assets/export-qgn-H9y6.js +0 -2
  608. package/dist/assets/main-DiKYzti2.css +0 -1
  609. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  610. package/dist/extension.js +0 -31293
  611. package/dist/src/lib/FilePicker.svelte +0 -360
  612. package/dist/src/lib/Icon.svelte +0 -41
  613. package/dist/src/lib/MillerIndexInput.svelte +0 -66
  614. package/dist/src/lib/api/mp.ts +0 -26
  615. package/dist/src/lib/api/optimade.ts +0 -204
  616. package/dist/src/lib/app.css +0 -247
  617. package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
  618. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
  619. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
  620. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  621. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
  622. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
  623. package/dist/src/lib/brillouin/compute.ts +0 -529
  624. package/dist/src/lib/brillouin/index.ts +0 -8
  625. package/dist/src/lib/brillouin/types.ts +0 -51
  626. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
  627. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
  628. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
  629. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
  630. package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
  631. package/dist/src/lib/chempot-diagram/color.ts +0 -42
  632. package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
  633. package/dist/src/lib/chempot-diagram/index.ts +0 -6
  634. package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
  635. package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
  636. package/dist/src/lib/chempot-diagram/types.ts +0 -130
  637. package/dist/src/lib/colors/index.ts +0 -249
  638. package/dist/src/lib/composition/BarChart.svelte +0 -297
  639. package/dist/src/lib/composition/BubbleChart.svelte +0 -218
  640. package/dist/src/lib/composition/Composition.svelte +0 -165
  641. package/dist/src/lib/composition/Formula.svelte +0 -268
  642. package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
  643. package/dist/src/lib/composition/PieChart.svelte +0 -323
  644. package/dist/src/lib/composition/format.ts +0 -155
  645. package/dist/src/lib/composition/index.ts +0 -37
  646. package/dist/src/lib/composition/parse.ts +0 -605
  647. package/dist/src/lib/constants.ts +0 -134
  648. package/dist/src/lib/controls.ts +0 -42
  649. package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
  650. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
  651. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
  652. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
  653. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
  654. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
  655. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
  656. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
  657. package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
  658. package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
  659. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +0 -140
  660. package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
  661. package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
  662. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
  663. package/dist/src/lib/convex-hull/helpers.ts +0 -932
  664. package/dist/src/lib/convex-hull/index.ts +0 -202
  665. package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
  666. package/dist/src/lib/convex-hull/types.ts +0 -267
  667. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
  668. package/dist/src/lib/coordination/calc-coordination.ts +0 -93
  669. package/dist/src/lib/coordination/index.ts +0 -9
  670. package/dist/src/lib/effects.svelte.ts +0 -48
  671. package/dist/src/lib/element/ElementHeading.svelte +0 -26
  672. package/dist/src/lib/element/ElementPhoto.svelte +0 -57
  673. package/dist/src/lib/element/ElementStats.svelte +0 -80
  674. package/dist/src/lib/element/ElementTile.svelte +0 -484
  675. package/dist/src/lib/element/data.ts +0 -14
  676. package/dist/src/lib/element/index.ts +0 -8
  677. package/dist/src/lib/element/types.ts +0 -62
  678. package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
  679. package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
  680. package/dist/src/lib/feedback/index.ts +0 -4
  681. package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
  682. package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
  683. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
  684. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
  685. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  686. package/dist/src/lib/fermi-surface/compute.ts +0 -728
  687. package/dist/src/lib/fermi-surface/constants.ts +0 -32
  688. package/dist/src/lib/fermi-surface/export.ts +0 -64
  689. package/dist/src/lib/fermi-surface/index.ts +0 -14
  690. package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
  691. package/dist/src/lib/fermi-surface/parse.ts +0 -574
  692. package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
  693. package/dist/src/lib/fermi-surface/types.ts +0 -159
  694. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
  695. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  696. package/dist/src/lib/heatmap-matrix/index.ts +0 -167
  697. package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
  698. package/dist/src/lib/icons.ts +0 -650
  699. package/dist/src/lib/index.ts +0 -61
  700. package/dist/src/lib/io/decompress.ts +0 -92
  701. package/dist/src/lib/io/export.ts +0 -385
  702. package/dist/src/lib/io/fetch.ts +0 -46
  703. package/dist/src/lib/io/file-drop.ts +0 -51
  704. package/dist/src/lib/io/index.ts +0 -7
  705. package/dist/src/lib/io/is-binary.ts +0 -24
  706. package/dist/src/lib/io/types.ts +0 -8
  707. package/dist/src/lib/io/url-drop.ts +0 -141
  708. package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
  709. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
  710. package/dist/src/lib/isosurface/index.ts +0 -7
  711. package/dist/src/lib/isosurface/parse.ts +0 -656
  712. package/dist/src/lib/isosurface/slice.ts +0 -175
  713. package/dist/src/lib/isosurface/types.ts +0 -309
  714. package/dist/src/lib/labels.ts +0 -320
  715. package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
  716. package/dist/src/lib/layout/InfoCard.svelte +0 -120
  717. package/dist/src/lib/layout/InfoTag.svelte +0 -185
  718. package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
  719. package/dist/src/lib/layout/SettingsSection.svelte +0 -148
  720. package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
  721. package/dist/src/lib/layout/fullscreen.ts +0 -65
  722. package/dist/src/lib/layout/index.ts +0 -11
  723. package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
  724. package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
  725. package/dist/src/lib/layout/json-tree/index.ts +0 -3
  726. package/dist/src/lib/layout/json-tree/types.ts +0 -126
  727. package/dist/src/lib/layout/json-tree/utils.ts +0 -682
  728. package/dist/src/lib/marching-cubes.ts +0 -614
  729. package/dist/src/lib/math.ts +0 -1081
  730. package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
  731. package/dist/src/lib/overlays/CopyButton.svelte +0 -45
  732. package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
  733. package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
  734. package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
  735. package/dist/src/lib/overlays/index.ts +0 -3
  736. package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
  737. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
  738. package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
  739. package/dist/src/lib/periodic-table/index.ts +0 -12
  740. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  741. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
  742. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  743. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
  744. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
  745. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
  746. package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
  747. package/dist/src/lib/phase-diagram/colors.ts +0 -58
  748. package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
  749. package/dist/src/lib/phase-diagram/index.ts +0 -13
  750. package/dist/src/lib/phase-diagram/parse.ts +0 -348
  751. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
  752. package/dist/src/lib/phase-diagram/types.ts +0 -144
  753. package/dist/src/lib/phase-diagram/utils.ts +0 -775
  754. package/dist/src/lib/plot/AxisLabel.svelte +0 -51
  755. package/dist/src/lib/plot/BarPlot.svelte +0 -2113
  756. package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
  757. package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
  758. package/dist/src/lib/plot/ColorBar.svelte +0 -721
  759. package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
  760. package/dist/src/lib/plot/ElementScatter.svelte +0 -63
  761. package/dist/src/lib/plot/FillArea.svelte +0 -223
  762. package/dist/src/lib/plot/Histogram.svelte +0 -1558
  763. package/dist/src/lib/plot/HistogramControls.svelte +0 -212
  764. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
  765. package/dist/src/lib/plot/Line.svelte +0 -84
  766. package/dist/src/lib/plot/PlotAxis.svelte +0 -169
  767. package/dist/src/lib/plot/PlotControls.svelte +0 -537
  768. package/dist/src/lib/plot/PlotLegend.svelte +0 -569
  769. package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
  770. package/dist/src/lib/plot/PortalSelect.svelte +0 -253
  771. package/dist/src/lib/plot/ReferenceLine.svelte +0 -204
  772. package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
  773. package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
  774. package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
  775. package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
  776. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
  777. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
  778. package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
  779. package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
  780. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
  781. package/dist/src/lib/plot/Surface3D.svelte +0 -197
  782. package/dist/src/lib/plot/ZeroLines.svelte +0 -97
  783. package/dist/src/lib/plot/ZoomRect.svelte +0 -23
  784. package/dist/src/lib/plot/adaptive-density.ts +0 -316
  785. package/dist/src/lib/plot/auto-place.ts +0 -184
  786. package/dist/src/lib/plot/axis-utils.ts +0 -122
  787. package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
  788. package/dist/src/lib/plot/data-cleaning.ts +0 -1069
  789. package/dist/src/lib/plot/data-transform.ts +0 -69
  790. package/dist/src/lib/plot/defaults.ts +0 -9
  791. package/dist/src/lib/plot/fill-utils.ts +0 -494
  792. package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
  793. package/dist/src/lib/plot/index.ts +0 -53
  794. package/dist/src/lib/plot/interactions.ts +0 -119
  795. package/dist/src/lib/plot/layout.ts +0 -425
  796. package/dist/src/lib/plot/reference-line.ts +0 -426
  797. package/dist/src/lib/plot/scales.ts +0 -654
  798. package/dist/src/lib/plot/svg.ts +0 -23
  799. package/dist/src/lib/plot/types.ts +0 -1144
  800. package/dist/src/lib/plot/utils/label-placement.ts +0 -541
  801. package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
  802. package/dist/src/lib/plot/utils.ts +0 -11
  803. package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
  804. package/dist/src/lib/rdf/calc-rdf.ts +0 -167
  805. package/dist/src/lib/rdf/index.ts +0 -27
  806. package/dist/src/lib/sanitize.ts +0 -126
  807. package/dist/src/lib/settings.ts +0 -1479
  808. package/dist/src/lib/spectral/Bands.svelte +0 -1040
  809. package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
  810. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
  811. package/dist/src/lib/spectral/Dos.svelte +0 -697
  812. package/dist/src/lib/spectral/helpers.ts +0 -1381
  813. package/dist/src/lib/spectral/index.ts +0 -8
  814. package/dist/src/lib/spectral/types.ts +0 -112
  815. package/dist/src/lib/state.svelte.ts +0 -64
  816. package/dist/src/lib/structure/Arrow.svelte +0 -72
  817. package/dist/src/lib/structure/AtomLegend.svelte +0 -815
  818. package/dist/src/lib/structure/Bond.svelte +0 -140
  819. package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
  820. package/dist/src/lib/structure/CellSelect.svelte +0 -349
  821. package/dist/src/lib/structure/Cylinder.svelte +0 -45
  822. package/dist/src/lib/structure/Lattice.svelte +0 -196
  823. package/dist/src/lib/structure/Structure.svelte +0 -2248
  824. package/dist/src/lib/structure/StructureControls.svelte +0 -1273
  825. package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
  826. package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
  827. package/dist/src/lib/structure/StructureScene.svelte +0 -2255
  828. package/dist/src/lib/structure/atom-properties.ts +0 -316
  829. package/dist/src/lib/structure/bond-order-perception.ts +0 -447
  830. package/dist/src/lib/structure/bonding.ts +0 -944
  831. package/dist/src/lib/structure/export.ts +0 -861
  832. package/dist/src/lib/structure/index.ts +0 -291
  833. package/dist/src/lib/structure/label-placement.ts +0 -130
  834. package/dist/src/lib/structure/measure.ts +0 -45
  835. package/dist/src/lib/structure/parse.ts +0 -1705
  836. package/dist/src/lib/structure/partial-occupancy.ts +0 -183
  837. package/dist/src/lib/structure/pbc.ts +0 -164
  838. package/dist/src/lib/structure/supercell.ts +0 -226
  839. package/dist/src/lib/structure/validation.ts +0 -11
  840. package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
  841. package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
  842. package/dist/src/lib/symmetry/cell-transform.ts +0 -118
  843. package/dist/src/lib/symmetry/index.ts +0 -348
  844. package/dist/src/lib/symmetry/spacegroups.ts +0 -404
  845. package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
  846. package/dist/src/lib/table/ToggleMenu.svelte +0 -385
  847. package/dist/src/lib/table/index.ts +0 -139
  848. package/dist/src/lib/theme/ThemeControl.svelte +0 -53
  849. package/dist/src/lib/theme/index.ts +0 -107
  850. package/dist/src/lib/time.ts +0 -71
  851. package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
  852. package/dist/src/lib/tooltip/index.ts +0 -2
  853. package/dist/src/lib/tooltip/types.ts +0 -13
  854. package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
  855. package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
  856. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
  857. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
  858. package/dist/src/lib/trajectory/constants.ts +0 -7
  859. package/dist/src/lib/trajectory/extract.ts +0 -196
  860. package/dist/src/lib/trajectory/format-detect.ts +0 -96
  861. package/dist/src/lib/trajectory/frame-reader.ts +0 -456
  862. package/dist/src/lib/trajectory/helpers.ts +0 -217
  863. package/dist/src/lib/trajectory/index.ts +0 -218
  864. package/dist/src/lib/trajectory/parse/ase.ts +0 -109
  865. package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
  866. package/dist/src/lib/trajectory/parse/index.ts +0 -411
  867. package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
  868. package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
  869. package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
  870. package/dist/src/lib/trajectory/plotting.ts +0 -599
  871. package/dist/src/lib/trajectory/types.ts +0 -13
  872. package/dist/src/lib/utils.ts +0 -56
  873. package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
  874. package/dist/src/lib/xrd/broadening.ts +0 -130
  875. package/dist/src/lib/xrd/calc-xrd.ts +0 -397
  876. package/dist/src/lib/xrd/index.ts +0 -38
  877. package/dist/src/lib/xrd/parse.ts +0 -858
  878. package/dist/webview.js +0 -29421
  879. package/icon.png +0 -0
  880. package/matterviz-0.3.2.vsix +0 -0
  881. package/matterviz-0.3.4.vsix +0 -0
  882. package/matterviz-0.3.5.vsix +0 -0
  883. package/scripts/sync-config.ts +0 -101
  884. package/src/declarations.d.ts +0 -2
  885. package/src/extension.ts +0 -972
  886. package/src/node-io.ts +0 -65
  887. package/src/types.ts +0 -17
  888. package/src/webview/JsonBrowser.svelte +0 -1079
  889. package/src/webview/PlotPanel.svelte +0 -346
  890. package/src/webview/detect.ts +0 -444
  891. package/src/webview/main.ts +0 -764
  892. package/src/webview/plot-utils.ts +0 -250
  893. package/test-fixtures/all-viz-types.json.gz +0 -0
  894. package/test-fixtures/plot-demo-data.json.gz +0 -0
  895. package/tests/detect.test.ts +0 -604
  896. package/tests/extension.test.ts +0 -2041
  897. package/tests/node-io.test.ts +0 -39
  898. package/tests/plot-utils.test.ts +0 -302
  899. package/tests/vite-plugin-json-gz.test.ts +0 -114
  900. package/tests/vscode-mock.ts +0 -18
  901. package/tests/webview.test.ts +0 -231
  902. package/tsconfig.json +0 -20
  903. package/vite-plugin-json-gz.ts +0 -29
  904. package/vite.config.ts +0 -34
  905. package/vite.extension.config.ts +0 -34
  906. /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
  907. /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
  908. /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
  909. /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
  910. /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
  911. /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
  912. /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
  913. /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
  914. /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
  915. /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
  916. /package/dist/{src/lib/element → element}/data.json +0 -0
  917. /package/dist/{src/lib/element → element}/data.json.gz +0 -0
  918. /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
  919. /package/dist/{src/lib/element → element}/data.schema.json +0 -0
  920. /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
  921. /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
  922. /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
  923. /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
  924. /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
  925. /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
  926. /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,853 @@
1
+ // Data cleaning utilities for plot data
2
+ // Detects oscillations, enforces physical bounds, and handles multi-dimensional datasets
3
+ import { apply_gaussian_smearing } from '../../spectral/helpers';
4
+ // Default configuration values
5
+ const DEFAULT_WINDOW_SIZE = 5;
6
+ const DEFAULT_OSCILLATION_THRESHOLD = 3.0;
7
+ const DEFAULT_POLYNOMIAL_ORDER = 2;
8
+ // --- Core Detection Functions ---
9
+ // Compute rolling variance using Welford's online algorithm - O(n)
10
+ // Returns variance for each point based on surrounding window
11
+ export function compute_local_variance(values, window_size) {
12
+ const len = values.length;
13
+ if (len === 0)
14
+ return [];
15
+ if (len === 1)
16
+ return [0];
17
+ const half_window = Math.floor(window_size / 2);
18
+ const result = Array(len);
19
+ // Single pass for each index, no slice allocation (avoids O(n × window) allocations)
20
+ for (let idx = 0; idx < len; idx++) {
21
+ const start = Math.max(0, idx - half_window);
22
+ const end = Math.min(len, idx + half_window + 1);
23
+ // Welford's online variance calculation
24
+ let [mean, m2, count] = [0, 0, 0];
25
+ for (let jdx = start; jdx < end; jdx++) {
26
+ const val = values[jdx];
27
+ if (!Number.isFinite(val))
28
+ continue;
29
+ count++;
30
+ const delta = val - mean;
31
+ mean += delta / count;
32
+ const delta2 = val - mean;
33
+ m2 += delta * delta2;
34
+ }
35
+ result[idx] = count > 1 ? m2 / (count - 1) : 0;
36
+ }
37
+ return result;
38
+ }
39
+ // Compute first-order finite differences (discrete derivative)
40
+ function compute_derivatives(values) {
41
+ if (values.length < 2)
42
+ return [];
43
+ const derivs = Array(values.length - 1);
44
+ for (let idx = 0; idx < values.length - 1; idx++) {
45
+ derivs[idx] = values[idx + 1] - values[idx];
46
+ }
47
+ return derivs;
48
+ }
49
+ // Detect derivative variance spikes (method 1)
50
+ // Returns onset index where derivative variance exceeds threshold
51
+ function detect_derivative_variance(values, window_size, threshold_multiplier) {
52
+ const derivs = compute_derivatives(values);
53
+ if (derivs.length < window_size) {
54
+ return { onset_index: -1, score: 0 };
55
+ }
56
+ const local_var = compute_local_variance(derivs, window_size);
57
+ // Compute baseline variance from first stable portion
58
+ const baseline_end = Math.min(Math.floor(derivs.length / 4), 50);
59
+ const baseline_vars = local_var.slice(0, Math.max(baseline_end, window_size));
60
+ const baseline_median = median(baseline_vars.filter((val) => val > 0));
61
+ if (baseline_median === 0) {
62
+ return { onset_index: -1, score: 0 };
63
+ }
64
+ // Find first point where variance exceeds threshold
65
+ let max_score = 0;
66
+ for (let idx = baseline_end; idx < local_var.length; idx++) {
67
+ const ratio = local_var[idx] / baseline_median;
68
+ if (ratio > max_score)
69
+ max_score = ratio;
70
+ if (ratio > threshold_multiplier) {
71
+ return { onset_index: idx + 1, score: ratio }; // +1 to convert from deriv index to value index
72
+ }
73
+ }
74
+ return { onset_index: -1, score: max_score };
75
+ }
76
+ // Detect exponential amplitude growth (method 2)
77
+ // Looks for values growing exponentially from their mean
78
+ function detect_amplitude_growth(values, window_size) {
79
+ if (values.length < window_size * 3) {
80
+ return { onset_index: -1, score: 0 };
81
+ }
82
+ // Compute running amplitude (deviation from local mean)
83
+ const amplitudes = [];
84
+ const half_window = Math.floor(window_size / 2);
85
+ for (let idx = half_window; idx < values.length - half_window; idx++) {
86
+ const start = idx - half_window;
87
+ const end = idx + half_window + 1;
88
+ const window_len = end - start;
89
+ // Compute local mean without slice allocation
90
+ let sum = 0;
91
+ for (let jdx = start; jdx < end; jdx++)
92
+ sum += values[jdx];
93
+ const local_mean = sum / window_len;
94
+ // Find max deviation without slice allocation
95
+ let max_deviation = 0;
96
+ for (let jdx = start; jdx < end; jdx++) {
97
+ const deviation = Math.abs(values[jdx] - local_mean);
98
+ if (deviation > max_deviation)
99
+ max_deviation = deviation;
100
+ }
101
+ amplitudes.push(max_deviation);
102
+ }
103
+ if (amplitudes.length < 10) {
104
+ return { onset_index: -1, score: 0 };
105
+ }
106
+ // Detect exponential growth by checking if amplitude ratio increases
107
+ const baseline_amp = median(amplitudes.slice(0, Math.floor(amplitudes.length / 4)));
108
+ if (baseline_amp === 0) {
109
+ return { onset_index: -1, score: 0 };
110
+ }
111
+ let max_score = 0;
112
+ for (let idx = Math.floor(amplitudes.length / 4); idx < amplitudes.length; idx++) {
113
+ const ratio = amplitudes[idx] / baseline_amp;
114
+ if (ratio > max_score)
115
+ max_score = ratio;
116
+ // Exponential growth threshold: amplitude 10x baseline
117
+ if (ratio > 10) {
118
+ return { onset_index: idx + half_window, score: ratio / 10 };
119
+ }
120
+ }
121
+ return { onset_index: -1, score: max_score / 10 };
122
+ }
123
+ // Count derivative sign changes per window (method 3)
124
+ // Detects high-frequency oscillations
125
+ function detect_sign_change_frequency(values, window_size, max_changes_per_window = 3) {
126
+ const derivs = compute_derivatives(values);
127
+ if (derivs.length < window_size * 2) {
128
+ return { onset_index: -1, score: 0 };
129
+ }
130
+ // Count sign changes in sliding windows
131
+ const half_window = Math.floor(window_size / 2);
132
+ let max_score = 0;
133
+ for (let idx = half_window; idx < derivs.length - half_window; idx++) {
134
+ const start = idx - half_window;
135
+ const end = idx + half_window + 1;
136
+ let sign_changes = 0;
137
+ // Count sign changes without slice allocation
138
+ for (let jdx = start + 1; jdx < end; jdx++) {
139
+ if (derivs[jdx] * derivs[jdx - 1] < 0) {
140
+ sign_changes++;
141
+ }
142
+ }
143
+ const normalized_score = sign_changes / max_changes_per_window;
144
+ if (normalized_score > max_score)
145
+ max_score = normalized_score;
146
+ if (sign_changes > max_changes_per_window) {
147
+ return { onset_index: idx + 1, score: normalized_score };
148
+ }
149
+ }
150
+ return { onset_index: -1, score: max_score };
151
+ }
152
+ // Combined detection with configurable weights
153
+ export function detect_instability(x_values, y_values, config = {}) {
154
+ const window_size = config.window_size ?? DEFAULT_WINDOW_SIZE;
155
+ const threshold = config.oscillation_threshold ?? DEFAULT_OSCILLATION_THRESHOLD;
156
+ const weights = {
157
+ derivative_variance: config.oscillation_weights?.derivative_variance ?? 1.0,
158
+ amplitude_growth: config.oscillation_weights?.amplitude_growth ?? 1.0,
159
+ sign_changes: config.oscillation_weights?.sign_changes ?? 1.0,
160
+ };
161
+ // Filter out invalid values for detection
162
+ const valid_indices = [];
163
+ const valid_y = [];
164
+ for (let idx = 0; idx < y_values.length; idx++) {
165
+ if (Number.isFinite(y_values[idx])) {
166
+ valid_indices.push(idx);
167
+ valid_y.push(y_values[idx]);
168
+ }
169
+ }
170
+ if (valid_y.length < window_size * 2) {
171
+ const method_scores = { derivative_variance: 0, amplitude_growth: 0, sign_changes: 0 };
172
+ const detected = false;
173
+ return { detected, onset_index: -1, onset_x: NaN, combined_score: 0, method_scores };
174
+ }
175
+ // Run all three detection methods
176
+ const deriv_result = detect_derivative_variance(valid_y, window_size, threshold);
177
+ const amp_result = detect_amplitude_growth(valid_y, window_size);
178
+ const sign_result = detect_sign_change_frequency(valid_y, window_size);
179
+ const method_scores = {
180
+ derivative_variance: deriv_result.score,
181
+ amplitude_growth: amp_result.score,
182
+ sign_changes: sign_result.score,
183
+ };
184
+ // Compute weighted combined score
185
+ const total_weight = weights.derivative_variance + weights.amplitude_growth + weights.sign_changes;
186
+ const combined_score = total_weight > 0
187
+ ? (weights.derivative_variance * deriv_result.score +
188
+ weights.amplitude_growth * amp_result.score +
189
+ weights.sign_changes * sign_result.score) /
190
+ total_weight
191
+ : 0;
192
+ // Find earliest onset across all methods that exceeded threshold
193
+ const onset_candidates = [
194
+ {
195
+ idx: deriv_result.onset_index,
196
+ score: deriv_result.score * weights.derivative_variance,
197
+ },
198
+ { idx: amp_result.onset_index, score: amp_result.score * weights.amplitude_growth },
199
+ { idx: sign_result.onset_index, score: sign_result.score * weights.sign_changes },
200
+ ].filter((candidate) => candidate.idx >= 0);
201
+ let onset_index = -1;
202
+ if (onset_candidates.length > 0) {
203
+ // Take earliest detected onset
204
+ onset_index = Math.min(...onset_candidates.map((candidate) => candidate.idx));
205
+ // Map back to original index if we filtered values
206
+ if (onset_index >= 0 && onset_index < valid_indices.length) {
207
+ onset_index = valid_indices[onset_index];
208
+ }
209
+ }
210
+ const detected = combined_score >= threshold || onset_index >= 0;
211
+ const onset_x = onset_index >= 0 && onset_index < x_values.length ? x_values[onset_index] : NaN;
212
+ return { detected, onset_index, onset_x, combined_score, method_scores };
213
+ }
214
+ // --- Smoothing Functions ---
215
+ // Moving average - O(n)
216
+ export function smooth_moving_average(values, window) {
217
+ if (values.length === 0 || window <= 1)
218
+ return [...values];
219
+ const result = Array(values.length);
220
+ const half_window = Math.floor(window / 2);
221
+ for (let idx = 0; idx < values.length; idx++) {
222
+ const start = Math.max(0, idx - half_window);
223
+ const end = Math.min(values.length, idx + half_window + 1);
224
+ let [sum, count] = [0, 0];
225
+ for (let jdx = start; jdx < end; jdx++) {
226
+ if (Number.isFinite(values[jdx])) {
227
+ sum += values[jdx];
228
+ count++;
229
+ }
230
+ }
231
+ result[idx] = count > 0 ? sum / count : values[idx];
232
+ }
233
+ return result;
234
+ }
235
+ // Savitzky-Golay filter coefficients for polynomial smoothing
236
+ // Uses least-squares polynomial fitting in each window
237
+ function compute_savgol_coefficients(window, order) {
238
+ // Ensure window is odd
239
+ const half = Math.floor(window / 2);
240
+ const size = 2 * half + 1;
241
+ // Build Vandermonde matrix for polynomial fitting
242
+ const vandermonde = [];
243
+ for (let idx = -half; idx <= half; idx++) {
244
+ const row = [];
245
+ for (let power = 0; power <= order; power++) {
246
+ row.push(idx ** power);
247
+ }
248
+ vandermonde.push(row);
249
+ }
250
+ // Compute (V^T V)^-1 V^T using simple pseudoinverse
251
+ // For smoothing, we only need the first row (constant term coefficients)
252
+ const vtv = multiply_matrices(transpose(vandermonde), vandermonde);
253
+ const vtv_inv = invert_matrix(vtv);
254
+ if (!vtv_inv) {
255
+ // Fallback to uniform weights
256
+ return Array(size).fill(1 / size);
257
+ }
258
+ const vt = transpose(vandermonde);
259
+ const coeffs_matrix = multiply_matrices(vtv_inv, vt);
260
+ // First row gives smoothing coefficients
261
+ return coeffs_matrix[0];
262
+ }
263
+ // Savitzky-Golay filter (derivative-preserving) - O(n * window)
264
+ export function smooth_savitzky_golay(values, window, polynomial_order = DEFAULT_POLYNOMIAL_ORDER) {
265
+ if (values.length === 0)
266
+ return [];
267
+ // Ensure window is odd and >= polynomial_order + 1
268
+ let actual_window = window % 2 === 0 ? window + 1 : window;
269
+ actual_window = Math.max(actual_window, polynomial_order + 2);
270
+ actual_window = Math.min(actual_window, values.length);
271
+ if (actual_window < 3)
272
+ return [...values];
273
+ const coeffs = compute_savgol_coefficients(actual_window, polynomial_order);
274
+ const half = Math.floor(actual_window / 2);
275
+ const result = Array(values.length);
276
+ // Cache coefficient sum to avoid O(n × window) redundant reductions in loop
277
+ const coeffs_sum = coeffs.reduce((a, b) => a + b, 0);
278
+ for (let idx = 0; idx < values.length; idx++) {
279
+ let [sum, weight_sum] = [0, 0];
280
+ for (let jdx = 0; jdx < actual_window; jdx++) {
281
+ const data_idx = idx - half + jdx;
282
+ if (data_idx >= 0 && data_idx < values.length && Number.isFinite(values[data_idx])) {
283
+ sum += coeffs[jdx] * values[data_idx];
284
+ weight_sum += coeffs[jdx];
285
+ }
286
+ }
287
+ result[idx] = weight_sum !== 0 ? (sum / weight_sum) * coeffs_sum : values[idx];
288
+ }
289
+ return result;
290
+ }
291
+ // Apply smoothing based on config
292
+ function apply_smoothing(x_values, y_values, config) {
293
+ if (config.type === `moving_avg`) {
294
+ return smooth_moving_average(y_values, config.window);
295
+ }
296
+ else if (config.type === `savgol`) {
297
+ return smooth_savitzky_golay(y_values, config.window, config.polynomial_order ?? DEFAULT_POLYNOMIAL_ORDER);
298
+ }
299
+ else if (config.type === `gaussian`) {
300
+ return apply_gaussian_smearing(x_values, y_values, config.sigma);
301
+ }
302
+ return y_values;
303
+ }
304
+ // --- Local Outlier Detection ---
305
+ // Default values for local outlier detection
306
+ const DEFAULT_LOCAL_WINDOW_HALF = 7;
307
+ const DEFAULT_LOCAL_MAD_THRESHOLD = 2.0;
308
+ const DEFAULT_LOCAL_MAX_ITERATIONS = 5;
309
+ // Compute local median within a window, excluding the center point
310
+ // This allows detecting if the center point is an outlier relative to its neighbors
311
+ function compute_local_median_excluding_center(values, center_idx, window_half) {
312
+ const window_values = [];
313
+ const start = Math.max(0, center_idx - window_half);
314
+ const end = Math.min(values.length - 1, center_idx + window_half);
315
+ for (let idx = start; idx <= end; idx++) {
316
+ if (idx !== center_idx && Number.isFinite(values[idx])) {
317
+ window_values.push(values[idx]);
318
+ }
319
+ }
320
+ if (window_values.length === 0)
321
+ return values[center_idx];
322
+ return median(window_values);
323
+ }
324
+ // Compute local MAD (median absolute deviation) within a window, excluding center
325
+ function compute_local_mad_excluding_center(values, center_idx, window_half, local_median) {
326
+ const abs_devs = [];
327
+ const start = Math.max(0, center_idx - window_half);
328
+ const end = Math.min(values.length - 1, center_idx + window_half);
329
+ for (let idx = start; idx <= end; idx++) {
330
+ if (idx !== center_idx && Number.isFinite(values[idx])) {
331
+ abs_devs.push(Math.abs(values[idx] - local_median));
332
+ }
333
+ }
334
+ if (abs_devs.length === 0)
335
+ return 0;
336
+ return median(abs_devs);
337
+ }
338
+ // Remove local outliers using iterative sliding window MAD-based detection
339
+ // Detects points that deviate significantly from their local neighborhood
340
+ // Returns only the indices to keep, preserving good data before AND after bad regions
341
+ export function remove_local_outliers(y_values, config = {}) {
342
+ const window_half = config.window_half ?? DEFAULT_LOCAL_WINDOW_HALF;
343
+ const mad_threshold = config.mad_threshold ?? DEFAULT_LOCAL_MAD_THRESHOLD;
344
+ const max_iterations = config.max_iterations ?? DEFAULT_LOCAL_MAX_ITERATIONS;
345
+ const len = y_values.length;
346
+ if (len === 0) {
347
+ return { kept_indices: [], removed_indices: [], iterations_used: 0 };
348
+ }
349
+ // Need enough neighbors for meaningful local statistics
350
+ const min_points_needed = window_half * 2 + 1;
351
+ if (len < min_points_needed) {
352
+ return {
353
+ kept_indices: Array.from({ length: len }, (_, idx) => idx),
354
+ removed_indices: [],
355
+ iterations_used: 0,
356
+ };
357
+ }
358
+ let kept_mask = Array(len).fill(true);
359
+ let iterations_used = 0;
360
+ for (let iter = 0; iter < max_iterations; iter++) {
361
+ let removed_any = false;
362
+ const new_kept_mask = [...kept_mask];
363
+ // Note: Local statistics are computed from original values, not filtered values.
364
+ // This prevents cascading removals where one outlier's removal dramatically
365
+ // shifts statistics and causes false positives on neighboring points.
366
+ for (let idx = 0; idx < len; idx++) {
367
+ if (!kept_mask[idx])
368
+ continue; // Already removed
369
+ if (!Number.isFinite(y_values[idx]))
370
+ continue; // Skip invalid values
371
+ const local_median = compute_local_median_excluding_center(y_values, idx, window_half);
372
+ const local_mad = compute_local_mad_excluding_center(y_values, idx, window_half, local_median);
373
+ // Cannot compute robust threshold if MAD is zero (all neighbors identical)
374
+ if (local_mad === 0)
375
+ continue;
376
+ const threshold = local_mad * mad_threshold;
377
+ const deviation = Math.abs(y_values[idx] - local_median);
378
+ if (deviation > threshold) {
379
+ new_kept_mask[idx] = false;
380
+ removed_any = true;
381
+ }
382
+ }
383
+ kept_mask = new_kept_mask;
384
+ iterations_used = iter + 1;
385
+ if (!removed_any)
386
+ break;
387
+ }
388
+ const kept_indices = [];
389
+ const removed_indices = [];
390
+ for (let idx = 0; idx < len; idx++) {
391
+ if (kept_mask[idx]) {
392
+ kept_indices.push(idx);
393
+ }
394
+ else {
395
+ removed_indices.push(idx);
396
+ }
397
+ }
398
+ return { kept_indices, removed_indices, iterations_used };
399
+ }
400
+ // --- Helper Functions ---
401
+ // Handle NaN/Infinity based on mode
402
+ export function handle_invalid_values(values, mode) {
403
+ const removed_indices = [];
404
+ let invalid_count = 0;
405
+ if (mode === `propagate`) {
406
+ for (const val of values) {
407
+ if (!Number.isFinite(val))
408
+ invalid_count++;
409
+ }
410
+ return { cleaned: [...values], removed_indices: [], invalid_count };
411
+ }
412
+ if (mode === `remove`) {
413
+ const cleaned = [];
414
+ for (let idx = 0; idx < values.length; idx++) {
415
+ if (Number.isFinite(values[idx])) {
416
+ cleaned.push(values[idx]);
417
+ }
418
+ else {
419
+ removed_indices.push(idx);
420
+ invalid_count++;
421
+ }
422
+ }
423
+ return { cleaned, removed_indices, invalid_count };
424
+ }
425
+ // Interpolate mode
426
+ const cleaned = [...values];
427
+ for (let idx = 0; idx < cleaned.length; idx++) {
428
+ if (!Number.isFinite(cleaned[idx])) {
429
+ invalid_count++;
430
+ // Find nearest valid neighbors
431
+ let left_idx = idx - 1;
432
+ while (left_idx >= 0 && !Number.isFinite(cleaned[left_idx]))
433
+ left_idx--;
434
+ let right_idx = idx + 1;
435
+ while (right_idx < cleaned.length && !Number.isFinite(cleaned[right_idx])) {
436
+ right_idx++;
437
+ }
438
+ if (left_idx >= 0 && right_idx < cleaned.length) {
439
+ // Linear interpolation
440
+ const t = (idx - left_idx) / (right_idx - left_idx);
441
+ cleaned[idx] = cleaned[left_idx] + t * (cleaned[right_idx] - cleaned[left_idx]);
442
+ }
443
+ else if (left_idx >= 0) {
444
+ cleaned[idx] = cleaned[left_idx];
445
+ }
446
+ else if (right_idx < cleaned.length) {
447
+ cleaned[idx] = cleaned[right_idx];
448
+ }
449
+ else {
450
+ cleaned[idx] = 0;
451
+ }
452
+ }
453
+ }
454
+ return { cleaned, removed_indices: [], invalid_count };
455
+ }
456
+ // Apply physical bounds
457
+ export function apply_bounds(x_values, y_values, bounds) {
458
+ const result = [...y_values];
459
+ const filtered_indices = [];
460
+ let violations = 0;
461
+ for (let idx = 0; idx < result.length; idx++) {
462
+ const x_val = x_values[idx];
463
+ const y_val = result[idx];
464
+ const min_bound = typeof bounds.min === `function` ? bounds.min(x_val) : bounds.min;
465
+ const max_bound = typeof bounds.max === `function` ? bounds.max(x_val) : bounds.max;
466
+ let violated = false;
467
+ if (min_bound !== undefined && y_val < min_bound)
468
+ violated = true;
469
+ if (max_bound !== undefined && y_val > max_bound)
470
+ violated = true;
471
+ if (violated) {
472
+ violations++;
473
+ const mode = bounds.mode ?? `clamp`;
474
+ if (mode === `clamp`) {
475
+ if (min_bound !== undefined && y_val < min_bound)
476
+ result[idx] = min_bound;
477
+ if (max_bound !== undefined && y_val > max_bound)
478
+ result[idx] = max_bound;
479
+ }
480
+ else if (mode === `filter`) {
481
+ filtered_indices.push(idx);
482
+ }
483
+ else if (mode === `null`) {
484
+ result[idx] = NaN;
485
+ }
486
+ }
487
+ }
488
+ return { y: result, violations, filtered_indices };
489
+ }
490
+ // Sync metadata arrays with filtered data
491
+ export function sync_metadata(metadata, kept_indices) {
492
+ if (metadata === undefined)
493
+ return undefined;
494
+ if (!Array.isArray(metadata))
495
+ return metadata; // Scalar metadata unchanged
496
+ return kept_indices.map((idx) => metadata[idx]);
497
+ }
498
+ // Filter arrays by kept indices
499
+ const filter_by_indices = (arr, kept_indices) => kept_indices.map((idx) => arr[idx]);
500
+ // Check if value is within bounds (static or x-dependent)
501
+ function is_in_bounds(val, x_val, bounds) {
502
+ const min = typeof bounds.min === `function` ? bounds.min(x_val) : bounds.min;
503
+ const max = typeof bounds.max === `function` ? bounds.max(x_val) : bounds.max;
504
+ if (min !== undefined && val < min)
505
+ return false;
506
+ if (max !== undefined && val > max)
507
+ return false;
508
+ return true;
509
+ }
510
+ // Compute kept indices by excluding removed indices
511
+ function kept_indices_excluding(length, removed) {
512
+ const removed_set = new Set(removed);
513
+ return Array.from({ length }, (_, idx) => idx).filter((idx) => !removed_set.has(idx));
514
+ }
515
+ // --- Main API ---
516
+ // Clean a single series - main entry point
517
+ export function clean_series(series, config = {}) {
518
+ const in_place = config.in_place ?? true;
519
+ const invalid_mode = config.invalid_values ?? `remove`;
520
+ const truncation_mode = config.truncation_mode ?? `mark_unstable`;
521
+ // Always work with copies initially
522
+ let x_arr = [...series.x];
523
+ let y_arr = [...series.y];
524
+ let metadata = series.metadata;
525
+ let color_values = series.color_values ? [...series.color_values] : undefined;
526
+ let size_values = series.size_values ? [...series.size_values] : undefined;
527
+ const quality = {
528
+ points_removed: 0,
529
+ invalid_values_found: 0,
530
+ oscillation_detected: false,
531
+ bounds_violations: 0,
532
+ };
533
+ // Helper to apply filtering to all arrays
534
+ const apply_filter = (kept, removed_count) => {
535
+ x_arr = filter_by_indices(x_arr, kept);
536
+ y_arr = filter_by_indices(y_arr, kept);
537
+ if (Array.isArray(metadata)) {
538
+ metadata = filter_by_indices(metadata, kept);
539
+ }
540
+ if (color_values)
541
+ color_values = filter_by_indices(color_values, kept);
542
+ if (size_values)
543
+ size_values = filter_by_indices(size_values, kept);
544
+ quality.points_removed += removed_count;
545
+ };
546
+ // Step 1: Handle invalid values
547
+ const invalid_result = handle_invalid_values(y_arr, invalid_mode);
548
+ quality.invalid_values_found = invalid_result.invalid_count;
549
+ if (invalid_mode === `remove` && invalid_result.removed_indices.length > 0) {
550
+ const kept = kept_indices_excluding(x_arr.length, invalid_result.removed_indices);
551
+ apply_filter(kept, invalid_result.removed_indices.length);
552
+ }
553
+ else {
554
+ y_arr = invalid_result.cleaned;
555
+ }
556
+ // Step 2: Apply physical bounds
557
+ if (config.bounds) {
558
+ const bounds_result = apply_bounds(x_arr, y_arr, config.bounds);
559
+ y_arr = bounds_result.y;
560
+ quality.bounds_violations = bounds_result.violations;
561
+ if (config.bounds.mode === `filter` && bounds_result.filtered_indices.length > 0) {
562
+ const kept = kept_indices_excluding(x_arr.length, bounds_result.filtered_indices);
563
+ apply_filter(kept, bounds_result.filtered_indices.length);
564
+ }
565
+ }
566
+ // Step 3: Remove local outliers (if configured)
567
+ if (config.local_outliers) {
568
+ const outlier_result = remove_local_outliers(y_arr, config.local_outliers);
569
+ quality.outliers_removed = outlier_result.removed_indices.length;
570
+ if (outlier_result.removed_indices.length > 0) {
571
+ apply_filter(outlier_result.kept_indices, outlier_result.removed_indices.length);
572
+ }
573
+ }
574
+ // Step 4: Apply smoothing
575
+ if (config.smooth) {
576
+ y_arr = apply_smoothing(x_arr, y_arr, config.smooth);
577
+ }
578
+ // Step 5: Detect instability
579
+ const instability = detect_instability(x_arr, y_arr, config);
580
+ quality.oscillation_detected = instability.detected;
581
+ quality.oscillation_score = instability.combined_score;
582
+ if (instability.detected && instability.onset_index >= 0) {
583
+ if (truncation_mode === `hard_cut`) {
584
+ const kept = Array.from({ length: instability.onset_index }, (_, idx) => idx);
585
+ quality.truncated_at_x = instability.onset_x;
586
+ apply_filter(kept, x_arr.length - instability.onset_index);
587
+ }
588
+ else {
589
+ quality.stable_range = [x_arr[0], instability.onset_x];
590
+ }
591
+ }
592
+ // Build result series
593
+ const result_series = in_place ? series : { ...series };
594
+ result_series.x = x_arr;
595
+ result_series.y = y_arr;
596
+ if (metadata !== undefined)
597
+ result_series.metadata = metadata;
598
+ if (color_values)
599
+ result_series.color_values = color_values;
600
+ if (size_values)
601
+ result_series.size_values = size_values;
602
+ return { series: result_series, quality };
603
+ }
604
+ // Clean multiple y-series with shared x, filtering to intersection of valid indices
605
+ export function clean_multi_series(x_values, y_arrays, config = {}) {
606
+ if (y_arrays.length === 0) {
607
+ return { x: [...x_values], cleaned_y: [], quality: [] };
608
+ }
609
+ const invalid_mode = config.invalid_values ?? `remove`;
610
+ const length = Math.min(x_values.length, ...y_arrays.map((arr) => arr.length));
611
+ const { bounds, smooth } = config;
612
+ // Find indices valid across ALL y series (remove mode filters invalid values)
613
+ let kept_indices = Array.from({ length }, (_, idx) => idx);
614
+ if (invalid_mode === `remove`) {
615
+ kept_indices = kept_indices.filter((idx) => y_arrays.every((y_arr) => Number.isFinite(y_arr[idx])));
616
+ }
617
+ // Apply bounds filter across all series
618
+ if (bounds?.mode === `filter`) {
619
+ kept_indices = kept_indices.filter((idx) => {
620
+ const x_val = x_values[idx];
621
+ return y_arrays.every((y_arr) => is_in_bounds(y_arr[idx], x_val, bounds));
622
+ });
623
+ }
624
+ const filtered_x = kept_indices.map((idx) => x_values[idx]);
625
+ const cleaned_y = [];
626
+ const quality_reports = [];
627
+ for (const y_arr of y_arrays) {
628
+ let filtered_y = kept_indices.map((idx) => y_arr[idx]);
629
+ // Count invalid values only in aligned prefix (not beyond length)
630
+ let invalid_count = 0;
631
+ for (let idx = 0; idx < length; idx++) {
632
+ if (!Number.isFinite(y_arr[idx]))
633
+ invalid_count++;
634
+ }
635
+ const quality = {
636
+ points_removed: length - kept_indices.length,
637
+ invalid_values_found: invalid_count,
638
+ oscillation_detected: false,
639
+ bounds_violations: 0,
640
+ };
641
+ if (invalid_mode === `interpolate`) {
642
+ filtered_y = handle_invalid_values(filtered_y, `interpolate`).cleaned;
643
+ }
644
+ if (bounds && bounds.mode !== `filter`) {
645
+ const result = apply_bounds(filtered_x, filtered_y, bounds);
646
+ filtered_y = result.y;
647
+ quality.bounds_violations = result.violations;
648
+ }
649
+ if (smooth) {
650
+ filtered_y = apply_smoothing(filtered_x, filtered_y, smooth);
651
+ }
652
+ cleaned_y.push(filtered_y);
653
+ quality_reports.push(quality);
654
+ }
655
+ return { x: filtered_x, cleaned_y, quality: quality_reports };
656
+ }
657
+ // Clean correlated x/y/z for 3D data
658
+ // All three arrays are filtered to the intersection of valid indices
659
+ export function clean_xyz(x_values, y_values, z_values, config = {}) {
660
+ const invalid_mode = config.invalid_values ?? `remove`;
661
+ const length = Math.min(x_values.length, y_values.length, z_values.length);
662
+ const all_arrays = [x_values, y_values, z_values];
663
+ const { bounds, smooth } = config;
664
+ // Count invalid values across all arrays
665
+ let invalid_count = 0;
666
+ for (let idx = 0; idx < length; idx++) {
667
+ if (!all_arrays.every((arr) => Number.isFinite(arr[idx])))
668
+ invalid_count++;
669
+ }
670
+ // Find indices where ALL values are valid (remove mode filters)
671
+ let kept_indices = Array.from({ length }, (_, idx) => idx);
672
+ if (invalid_mode === `remove`) {
673
+ kept_indices = kept_indices.filter((idx) => all_arrays.every((arr) => Number.isFinite(arr[idx])));
674
+ }
675
+ let filtered = {
676
+ x: kept_indices.map((idx) => x_values[idx]),
677
+ y: kept_indices.map((idx) => y_values[idx]),
678
+ z: kept_indices.map((idx) => z_values[idx]),
679
+ };
680
+ const quality = {
681
+ points_removed: length - kept_indices.length,
682
+ invalid_values_found: invalid_count,
683
+ oscillation_detected: false,
684
+ bounds_violations: 0,
685
+ };
686
+ if (invalid_mode === `interpolate`) {
687
+ filtered.x = handle_invalid_values(filtered.x, `interpolate`).cleaned;
688
+ filtered.y = handle_invalid_values(filtered.y, `interpolate`).cleaned;
689
+ filtered.z = handle_invalid_values(filtered.z, `interpolate`).cleaned;
690
+ }
691
+ // Apply bounds filter on primary axis
692
+ if (bounds?.mode === `filter`) {
693
+ const primary = config.primary_axis ?? `x`;
694
+ const bounds_kept = [];
695
+ for (let idx = 0; idx < filtered.x.length; idx++) {
696
+ const primary_val = filtered[primary][idx];
697
+ // Use x-axis value for dynamic bounds computation (e.g., max: (x_val) => x_val * 2)
698
+ if (is_in_bounds(primary_val, filtered.x[idx], bounds)) {
699
+ bounds_kept.push(idx);
700
+ }
701
+ else {
702
+ quality.bounds_violations++;
703
+ }
704
+ }
705
+ filtered = {
706
+ x: bounds_kept.map((idx) => filtered.x[idx]),
707
+ y: bounds_kept.map((idx) => filtered.y[idx]),
708
+ z: bounds_kept.map((idx) => filtered.z[idx]),
709
+ };
710
+ quality.points_removed += kept_indices.length - bounds_kept.length;
711
+ }
712
+ // Smooth dependent axes (y, z) using x as independent reference
713
+ // x-axis is never smoothed as it's typically the independent variable (time, index, etc.)
714
+ if (smooth) {
715
+ filtered.y = apply_smoothing(filtered.x, filtered.y, smooth);
716
+ filtered.z = apply_smoothing(filtered.x, filtered.z, smooth);
717
+ }
718
+ return { ...filtered, quality };
719
+ }
720
+ // Clean trajectory properties, filtering to intersection of valid indices
721
+ export function clean_trajectory_props(props, config = {}) {
722
+ const entries = Object.entries(props);
723
+ if (entries.length === 0) {
724
+ return { props: {}, quality: {} };
725
+ }
726
+ const independent_axis = config.independent_axis ?? `Step`;
727
+ const invalid_mode = config.invalid_values ?? `remove`;
728
+ const { smooth } = config;
729
+ const length = Math.min(...entries.map(([, arr]) => arr.length));
730
+ // Use existing or generate independent axis
731
+ const x_values = props[independent_axis] ?? Array.from({ length }, (_, idx) => idx);
732
+ // Count invalid values per property (only within aligned prefix)
733
+ const invalid_counts = Object.fromEntries(entries.map(([key, arr]) => {
734
+ let count = 0;
735
+ for (let idx = 0; idx < length; idx++) {
736
+ if (!Number.isFinite(arr[idx]))
737
+ count++;
738
+ }
739
+ return [key, count];
740
+ }));
741
+ // Find indices valid across ALL properties (remove mode filters)
742
+ let kept_indices = Array.from({ length }, (_, idx) => idx);
743
+ if (invalid_mode === `remove`) {
744
+ kept_indices = kept_indices.filter((idx) => entries.every(([, arr]) => Number.isFinite(arr[idx])));
745
+ }
746
+ const filtered_x = kept_indices.map((idx) => x_values[idx]);
747
+ const result_props = {};
748
+ const quality_reports = {};
749
+ for (const [key, arr] of entries) {
750
+ let filtered = kept_indices.map((idx) => arr[idx]);
751
+ const quality = {
752
+ points_removed: length - kept_indices.length,
753
+ invalid_values_found: invalid_counts[key],
754
+ oscillation_detected: false,
755
+ bounds_violations: 0,
756
+ };
757
+ if (invalid_mode === `interpolate`) {
758
+ filtered = handle_invalid_values(filtered, `interpolate`).cleaned;
759
+ }
760
+ if (smooth && key !== independent_axis) {
761
+ filtered = apply_smoothing(filtered_x, filtered, smooth);
762
+ }
763
+ result_props[key] = filtered;
764
+ quality_reports[key] = quality;
765
+ }
766
+ // Add independent axis if not in original props
767
+ if (!props[independent_axis]) {
768
+ result_props[independent_axis] = filtered_x;
769
+ quality_reports[independent_axis] = {
770
+ points_removed: length - kept_indices.length,
771
+ invalid_values_found: 0,
772
+ oscillation_detected: false,
773
+ bounds_violations: 0,
774
+ };
775
+ }
776
+ return { props: result_props, quality: quality_reports };
777
+ }
778
+ // --- Utility Functions ---
779
+ function median(values) {
780
+ if (values.length === 0)
781
+ return 0;
782
+ const sorted = [...values].sort((a, b) => a - b);
783
+ const mid = Math.floor(sorted.length / 2);
784
+ return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
785
+ }
786
+ // Simple matrix operations for Savitzky-Golay
787
+ function transpose(matrix) {
788
+ if (matrix.length === 0)
789
+ return [];
790
+ const rows = matrix.length;
791
+ const cols = matrix[0].length;
792
+ const result = Array.from({ length: cols }, () => Array(rows).fill(0));
793
+ for (let row = 0; row < rows; row++) {
794
+ for (let col = 0; col < cols; col++) {
795
+ result[col][row] = matrix[row][col];
796
+ }
797
+ }
798
+ return result;
799
+ }
800
+ function multiply_matrices(a, b) {
801
+ const rows_a = a.length;
802
+ const cols_a = a[0]?.length ?? 0;
803
+ const cols_b = b[0]?.length ?? 0;
804
+ const result = Array.from({ length: rows_a }, () => Array(cols_b).fill(0));
805
+ for (let row = 0; row < rows_a; row++) {
806
+ for (let col = 0; col < cols_b; col++) {
807
+ for (let k = 0; k < cols_a; k++) {
808
+ result[row][col] += a[row][k] * b[k][col];
809
+ }
810
+ }
811
+ }
812
+ return result;
813
+ }
814
+ function invert_matrix(matrix) {
815
+ const n = matrix.length;
816
+ if (n === 0 || matrix[0].length !== n)
817
+ return null;
818
+ // Create augmented matrix [A | I]
819
+ const aug = matrix.map((row, idx) => [
820
+ ...row,
821
+ ...Array.from({ length: n }, (_, jdx) => (idx === jdx ? 1 : 0)),
822
+ ]);
823
+ // Gaussian elimination with partial pivoting
824
+ for (let col = 0; col < n; col++) {
825
+ // Find pivot
826
+ let max_row = col;
827
+ for (let row = col + 1; row < n; row++) {
828
+ if (Math.abs(aug[row][col]) > Math.abs(aug[max_row][col])) {
829
+ max_row = row;
830
+ }
831
+ }
832
+ if (Math.abs(aug[max_row][col]) < 1e-10) {
833
+ return null; // Singular
834
+ } // Swap rows
835
+ ;
836
+ [aug[col], aug[max_row]] = [aug[max_row], aug[col]];
837
+ // Eliminate column
838
+ const pivot = aug[col][col];
839
+ for (let jdx = 0; jdx < 2 * n; jdx++) {
840
+ aug[col][jdx] /= pivot;
841
+ }
842
+ for (let row = 0; row < n; row++) {
843
+ if (row !== col) {
844
+ const factor = aug[row][col];
845
+ for (let jdx = 0; jdx < 2 * n; jdx++) {
846
+ aug[row][jdx] -= factor * aug[col][jdx];
847
+ }
848
+ }
849
+ }
850
+ }
851
+ // Extract inverse
852
+ return aug.map((row) => row.slice(n));
853
+ }