scitex 2.10.3__py3-none-any.whl → 2.13.0__py3-none-any.whl

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 (504) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__main__.py +24 -5
  3. scitex/__version__.py +1 -1
  4. scitex/_install_guide.py +14 -2
  5. scitex/_optional_deps.py +33 -0
  6. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  7. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  8. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  9. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
  10. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
  11. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  12. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  13. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  14. scitex/ai/plt/_plot_feature_importance.py +1 -1
  15. scitex/ai/plt/_plot_learning_curve.py +1 -1
  16. scitex/ai/plt/_plot_optuna_study.py +1 -1
  17. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  18. scitex/ai/plt/_plot_roc_curve.py +1 -1
  19. scitex/ai/plt/_stx_conf_mat.py +1 -1
  20. scitex/ai/training/_LearningCurveLogger.py +1 -1
  21. scitex/audio/mcp_server.py +38 -8
  22. scitex/bridge/_figrecipe.py +1 -1
  23. scitex/bridge/_helpers.py +1 -1
  24. scitex/bridge/_plt_vis.py +1 -1
  25. scitex/bridge/_stats_plt.py +1 -1
  26. scitex/bridge/_stats_vis.py +2 -2
  27. scitex/browser/automation/CookieHandler.py +1 -1
  28. scitex/browser/core/BrowserMixin.py +1 -1
  29. scitex/browser/core/ChromeProfileManager.py +1 -1
  30. scitex/browser/debugging/_browser_logger.py +1 -1
  31. scitex/browser/debugging/_highlight_element.py +1 -1
  32. scitex/browser/debugging/_show_grid.py +1 -1
  33. scitex/browser/interaction/click_center.py +1 -1
  34. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  35. scitex/browser/interaction/close_popups.py +1 -1
  36. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  37. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  38. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  39. scitex/browser/stealth/HumanBehavior.py +1 -1
  40. scitex/browser/stealth/StealthManager.py +1 -1
  41. scitex/{fig → canvas}/__init__.py +84 -96
  42. scitex/canvas/_mcp_handlers.py +372 -0
  43. scitex/canvas/_mcp_tool_schemas.py +219 -0
  44. scitex/{fig → canvas}/backend/_parser.py +1 -1
  45. scitex/{fig → canvas}/canvas.py +13 -14
  46. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  47. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  48. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  49. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  50. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  51. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  52. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  53. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  54. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  55. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  56. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  57. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  58. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  59. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  60. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  61. scitex/{fig → canvas}/io/__init__.py +32 -38
  62. scitex/{fig → canvas}/io/_bundle.py +217 -154
  63. scitex/{fig → canvas}/io/_canvas.py +1 -1
  64. scitex/{fig → canvas}/io/_data.py +1 -1
  65. scitex/{fig → canvas}/io/_export.py +1 -1
  66. scitex/{fig → canvas}/io/_load.py +1 -1
  67. scitex/{fig → canvas}/io/_panel.py +1 -1
  68. scitex/{fig → canvas}/io/_save.py +1 -1
  69. scitex/canvas/mcp_server.py +151 -0
  70. scitex/{fig → canvas}/model/__init__.py +1 -1
  71. scitex/{fig → canvas}/model/_annotations.py +1 -1
  72. scitex/{fig → canvas}/model/_axes.py +1 -1
  73. scitex/{fig → canvas}/model/_figure.py +1 -1
  74. scitex/{fig → canvas}/model/_guides.py +1 -1
  75. scitex/{fig → canvas}/model/_plot.py +1 -1
  76. scitex/{fig → canvas}/model/_styles.py +1 -1
  77. scitex/{fig → canvas}/utils/__init__.py +1 -1
  78. scitex/capture/mcp_server.py +41 -12
  79. scitex/cli/audio.py +233 -0
  80. scitex/cli/capture.py +307 -0
  81. scitex/cli/convert.py +10 -6
  82. scitex/cli/main.py +27 -4
  83. scitex/cli/repro.py +233 -0
  84. scitex/cli/resource.py +240 -0
  85. scitex/cli/stats.py +325 -0
  86. scitex/cli/template.py +236 -0
  87. scitex/cli/tex.py +286 -0
  88. scitex/cli/web.py +11 -12
  89. scitex/dev/__init__.py +3 -0
  90. scitex/dev/_pyproject.py +405 -0
  91. scitex/dev/plt/__init__.py +2 -2
  92. scitex/dev/plt/mpl/get_dir_ax.py +1 -1
  93. scitex/dev/plt/mpl/get_signatures.py +1 -1
  94. scitex/dev/plt/mpl/get_signatures_details.py +1 -1
  95. scitex/diagram/README.md +7 -7
  96. scitex/diagram/_mcp_handlers.py +400 -0
  97. scitex/diagram/_mcp_tool_schemas.py +157 -0
  98. scitex/diagram/mcp_server.py +151 -0
  99. scitex/dsp/_demo_sig.py +51 -5
  100. scitex/dsp/_mne.py +13 -2
  101. scitex/dsp/_modulation_index.py +15 -3
  102. scitex/dsp/_pac.py +23 -5
  103. scitex/dsp/_psd.py +16 -4
  104. scitex/dsp/_resample.py +24 -4
  105. scitex/dsp/_transform.py +16 -3
  106. scitex/dsp/add_noise.py +15 -1
  107. scitex/dsp/norm.py +17 -2
  108. scitex/dsp/reference.py +17 -1
  109. scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
  110. scitex/dsp/utils/_zero_pad.py +18 -4
  111. scitex/dt/_normalize_timestamp.py +1 -1
  112. scitex/git/_session.py +1 -1
  113. scitex/io/__init__.py +7 -19
  114. scitex/io/_load.py +15 -19
  115. scitex/io/_load_modules/_canvas.py +2 -2
  116. scitex/io/_load_modules/_con.py +17 -6
  117. scitex/io/_load_modules/_eeg.py +28 -13
  118. scitex/io/_load_modules/_optuna.py +21 -63
  119. scitex/io/_load_modules/_torch.py +11 -3
  120. scitex/io/_save.py +11 -16
  121. scitex/io/_save_modules/__init__.py +6 -10
  122. scitex/io/_save_modules/_canvas.py +3 -3
  123. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
  124. scitex/io/_save_modules/_plot_bundle.py +112 -0
  125. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  126. scitex/io/_save_modules/_stx_bundle.py +16 -16
  127. scitex/io/_save_modules/_torch.py +11 -3
  128. scitex/io/bundle/README.md +89 -80
  129. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  130. scitex/io/bundle/__init__.py +67 -35
  131. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  132. scitex/io/bundle/_core.py +184 -97
  133. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  134. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  135. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  136. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  137. scitex/io/bundle/_manifest.py +99 -0
  138. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  139. scitex/io/bundle/_nested.py +113 -100
  140. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  141. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  142. scitex/io/bundle/_types.py +41 -16
  143. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  144. scitex/io/bundle/_zip.py +21 -31
  145. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  146. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  147. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  148. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  149. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  150. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  151. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  152. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  153. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  154. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  155. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  156. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  157. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  158. scitex/io/bundle/schemas/__init__.py +30 -0
  159. scitex/mcp_server.py +159 -0
  160. scitex/parallel/_run.py +5 -4
  161. scitex/path/_find.py +60 -83
  162. scitex/path/_get_module_path.py +23 -21
  163. scitex/path/_get_spath.py +6 -27
  164. scitex/path/_getsize.py +23 -9
  165. scitex/path/_increment_version.py +31 -38
  166. scitex/path/_mk_spath.py +26 -29
  167. scitex/path/_path.py +5 -12
  168. scitex/path/_split.py +27 -15
  169. scitex/path/_this_path.py +23 -9
  170. scitex/plt/_mcp_handlers.py +361 -0
  171. scitex/plt/_mcp_tool_schemas.py +169 -0
  172. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  173. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  174. scitex/plt/gallery/_generate.py +76 -50
  175. scitex/plt/io/__init__.py +17 -19
  176. scitex/plt/io/_bundle.py +99 -52
  177. scitex/plt/io/_layered_bundle.py +303 -168
  178. scitex/plt/mcp_server.py +205 -0
  179. scitex/plt/utils/_csv_column_naming.py +250 -118
  180. scitex/repro/README_RandomStateManager.md +3 -3
  181. scitex/repro/_RandomStateManager.py +14 -14
  182. scitex/repro/_gen_ID.py +1 -1
  183. scitex/repro/_gen_timestamp.py +1 -1
  184. scitex/repro/_hash_array.py +4 -4
  185. scitex/schema/__init__.py +69 -73
  186. scitex/schema/_canvas.py +1 -1
  187. scitex/schema/_stats.py +2 -2
  188. scitex/scholar/__main__.py +24 -2
  189. scitex/scholar/_mcp_handlers.py +685 -0
  190. scitex/scholar/_mcp_tool_schemas.py +339 -0
  191. scitex/scholar/docs/template.py +1 -1
  192. scitex/scholar/examples/07_storage_integration.py +1 -1
  193. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  194. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  195. scitex/scholar/mcp_server.py +315 -0
  196. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  197. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  198. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  199. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  200. scitex/scholar/storage/PaperIO.py +1 -1
  201. scitex/session/README.md +4 -4
  202. scitex/session/__init__.py +1 -1
  203. scitex/session/_decorator.py +9 -9
  204. scitex/session/_lifecycle.py +5 -5
  205. scitex/session/template.py +1 -1
  206. scitex/stats/__init__.py +30 -33
  207. scitex/stats/__main__.py +281 -0
  208. scitex/stats/_mcp_handlers.py +1191 -0
  209. scitex/stats/_mcp_tool_schemas.py +384 -0
  210. scitex/stats/_schema.py +1 -1
  211. scitex/stats/correct/_correct_bonferroni.py +1 -1
  212. scitex/stats/correct/_correct_fdr.py +1 -1
  213. scitex/stats/correct/_correct_fdr_.py +1 -1
  214. scitex/stats/correct/_correct_holm.py +1 -1
  215. scitex/stats/correct/_correct_sidak.py +1 -1
  216. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  217. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  218. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  219. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  220. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  221. scitex/stats/io/__init__.py +10 -11
  222. scitex/stats/io/_bundle.py +16 -16
  223. scitex/stats/mcp_server.py +405 -0
  224. scitex/stats/posthoc/_dunnett.py +1 -1
  225. scitex/stats/posthoc/_games_howell.py +1 -1
  226. scitex/stats/posthoc/_tukey_hsd.py +1 -1
  227. scitex/stats/power/_power.py +1 -1
  228. scitex/stats/utils/_effect_size.py +1 -1
  229. scitex/stats/utils/_formatters.py +1 -1
  230. scitex/stats/utils/_power.py +1 -1
  231. scitex/template/_mcp_handlers.py +259 -0
  232. scitex/template/_mcp_tool_schemas.py +112 -0
  233. scitex/template/mcp_server.py +186 -0
  234. scitex/utils/_verify_scitex_format.py +2 -2
  235. scitex/utils/template.py +1 -1
  236. scitex/web/__init__.py +12 -11
  237. scitex/web/_scraping.py +26 -265
  238. scitex/web/download_images.py +316 -0
  239. scitex/writer/Writer.py +1 -1
  240. scitex/writer/_clone_writer_project.py +1 -1
  241. scitex/writer/_validate_tree_structures.py +1 -1
  242. scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
  243. scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
  244. scitex/writer/dataclasses/core/_Document.py +1 -1
  245. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  246. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  247. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  248. scitex/writer/utils/.legacy_git_retry.py +7 -5
  249. scitex/writer/utils/_parse_latex_logs.py +1 -1
  250. scitex-2.13.0.dist-info/METADATA +1231 -0
  251. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
  252. scitex-2.13.0.dist-info/entry_points.txt +11 -0
  253. scitex/fig/editor/_defaults.py +0 -300
  254. scitex/fig/editor/edit/panel_loader.py +0 -232
  255. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  256. scitex/fig/editor/flask_editor/_core.py +0 -1429
  257. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  258. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  259. scitex/fts/README.md +0 -262
  260. scitex/fts/TODO.md +0 -66
  261. scitex/fts/__init__.py +0 -90
  262. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  263. scitex/fts/_bundle/__init__.py +0 -38
  264. scitex/fts/_bundle/_utils/__init__.py +0 -55
  265. scitex/fts/_bundle/_utils/_const.py +0 -26
  266. scitex/fts/_bundle/_utils/_errors.py +0 -73
  267. scitex/fts/_bundle/_utils/_generate.py +0 -21
  268. scitex/fts/_bundle/_utils/_types.py +0 -76
  269. scitex/fts/_bundle/_zipbundle.py +0 -165
  270. scitex/fts/_fig/__init__.py +0 -22
  271. scitex/fts/_fig/_backend/_parser.py +0 -188
  272. scitex/fts/_fig/_editor/__init__.py +0 -14
  273. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  274. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  275. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  276. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  277. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  278. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  279. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  280. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  281. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  282. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  283. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  284. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  285. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  286. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  287. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  288. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  289. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  290. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  291. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  292. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  293. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  294. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  295. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  296. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  297. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  298. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  299. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  300. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  328. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  329. scitex/fts/_fig/_models/_Annotations.py +0 -115
  330. scitex/fts/_fig/_models/_Axes.py +0 -152
  331. scitex/fts/_fig/_models/_Figure.py +0 -138
  332. scitex/fts/_fig/_models/_Plot.py +0 -123
  333. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  334. scitex/fts/_kinds/_figure/_composite.py +0 -345
  335. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  336. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  337. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  338. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  339. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  340. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  341. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  342. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  343. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  344. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  345. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  346. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  347. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  348. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  349. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  350. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  351. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  352. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  353. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  354. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  355. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  356. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  357. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  358. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  359. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  360. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  361. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  362. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  363. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  364. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  365. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  366. scitex/fts/_stats/__init__.py +0 -48
  367. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  368. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  369. scitex/fts/_tables/__init__.py +0 -65
  370. scitex/fts/_tables/_latex/__init__.py +0 -93
  371. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  372. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  373. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  374. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  375. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  376. scitex/fts/_tables/_latex/_utils.py +0 -369
  377. scitex/fts/_tables/_latex/_validator.py +0 -445
  378. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  379. scitex-2.10.3.dist-info/METADATA +0 -952
  380. scitex-2.10.3.dist-info/entry_points.txt +0 -2
  381. /scitex/{fig → canvas}/README.md +0 -0
  382. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  383. /scitex/{fig → canvas}/backend/_export.py +0 -0
  384. /scitex/{fig → canvas}/backend/_render.py +0 -0
  385. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  386. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  387. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  388. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  389. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  390. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  391. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  392. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  393. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  394. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  395. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  396. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  397. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  398. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  399. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  400. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  401. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  402. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  403. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  404. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  405. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  406. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  407. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  408. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  409. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  410. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  411. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  412. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  413. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  414. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  415. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  416. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  417. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  418. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  419. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  420. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  421. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  422. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  423. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  424. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  425. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  426. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  427. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  428. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  429. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  430. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  431. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  432. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  433. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  434. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  435. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  436. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  437. /scitex/{fig → canvas}/io/_directory.py +0 -0
  438. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  439. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  440. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  441. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  442. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  443. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  444. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  445. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  446. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  447. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  448. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  449. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  450. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  451. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  452. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  453. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  454. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  455. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  456. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  457. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  458. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  459. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  460. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  461. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  462. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  463. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  464. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  465. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  466. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  467. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  468. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  469. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  470. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  471. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  472. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  473. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  474. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  475. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  476. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  477. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  478. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  479. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  480. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  481. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  482. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  483. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  484. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  485. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  486. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  487. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  488. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  489. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  490. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  491. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  492. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  493. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  494. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  495. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  496. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  497. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  498. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  499. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  500. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  501. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  502. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  503. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
  504. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: 2025-12-08
4
3
  # File: ./src/scitex/plt/utils/_csv_column_naming.py
5
4
 
@@ -10,68 +9,68 @@ This module ensures consistent column naming between:
10
9
  - CSV export (_export_as_csv)
11
10
  - JSON metadata (_collect_figure_metadata)
12
11
  - GUI editors (reading CSV data back)
12
+ - figrecipe compatibility
13
13
 
14
- Column naming convention:
15
- {domain-name-value}_{domain-name-value}_...
16
-
17
- - Underscore (_) separates different domains
18
- - Hyphen (-) within domain name and between name-value
19
-
20
- Format:
21
- ax-row-{row}-col-{col}_trace-id-{trace_id}_variable-{variable}
14
+ Column naming convention (figrecipe-compatible):
15
+ r{row}c{col}_{caller}-{id}_{var}
22
16
 
23
17
  Where:
24
- - ax-row-{row}-col-{col}: axes position in grid
25
- - trace-id-{id}: unique identifier for the trace, which can be:
26
- * User-provided id kwarg (e.g., "sine", "my-data")
27
- * Generated from label (e.g., "sin-x" from "sin(x)")
28
- * Auto-generated index (e.g., "0", "1")
29
- - variable-{var}: type of data variable (e.g., "x", "y", "bins", "heights")
18
+ - r{row}c{col}: axes position in grid (e.g., r0c0, r1c2)
19
+ - {caller}: plotting method name (e.g., plot, scatter, bar)
20
+ - {id}: user-provided id kwarg OR auto-generated per-method counter
21
+ - {var}: variable name (e.g., x, y, bins, heights)
30
22
 
31
23
  Examples:
32
- ax-row-0-col-0_trace-id-sine_variable-x (row 0, col 0, id "sine", x)
33
- ax-row-0-col-0_trace-id-sine_variable-y (row 0, col 0, id "sine", y)
34
- ax-row-0-col-1_trace-id-0_variable-x (row 0, col 1, auto id 0, x)
35
- ax-row-1-col-0_trace-id-my-data_variable-bins (row 1, col 0, "my-data", bins)
24
+ r0c0_plot-0_x (row 0, col 0, plot method, auto-id 0, x variable)
25
+ r0c0_plot-sine_y (row 0, col 0, plot method, id "sine", y variable)
26
+ r0c1_scatter-0_x (row 0, col 1, scatter method, auto-id 0, x)
27
+ r1c0_bar-sales_height (row 1, col 0, bar method, id "sales", height)
28
+
29
+ Legacy format (still supported for parsing):
30
+ ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
36
31
  """
37
32
 
33
+ import re
34
+
38
35
  __all__ = [
39
36
  "get_csv_column_name",
40
37
  "get_csv_column_prefix",
41
38
  "parse_csv_column_name",
42
- "sanitize_trace_id",
39
+ "sanitize_id",
43
40
  "get_unique_trace_id",
44
41
  ]
45
42
 
46
43
 
47
- def sanitize_trace_id(trace_id: str) -> str:
48
- """Sanitize trace ID for use in CSV column names.
44
+ def sanitize_id(raw_id: str) -> str:
45
+ """Sanitize ID for use in CSV column names.
49
46
 
50
47
  Removes or replaces characters that could cause issues in column names.
51
48
  Uses hyphen (-) for word separation within values.
52
49
 
53
50
  Parameters
54
51
  ----------
55
- trace_id : str
56
- Raw trace identifier (label, id kwarg, or generated)
52
+ raw_id : str
53
+ Raw identifier (label, id kwarg, or generated)
57
54
 
58
55
  Returns
59
56
  -------
60
57
  str
61
- Sanitized trace ID safe for CSV column names
58
+ Sanitized ID safe for CSV column names
62
59
 
63
60
  Examples
64
61
  --------
65
- >>> sanitize_trace_id("sin(x)")
62
+ >>> sanitize_id("sin(x)")
66
63
  'sin-x'
67
- >>> sanitize_trace_id("My Data")
64
+ >>> sanitize_id("My Data")
68
65
  'my-data'
66
+ >>> sanitize_id("hello_world")
67
+ 'hello-world'
69
68
  """
70
- if not trace_id:
71
- return "unnamed"
69
+ if not raw_id:
70
+ return "0"
72
71
 
73
- # Replace problematic characters with hyphen (word separator within values)
74
- sanitized = str(trace_id).lower()
72
+ # Replace problematic characters with hyphen
73
+ sanitized = str(raw_id).lower()
75
74
  result = []
76
75
  for char in sanitized:
77
76
  if char.isalnum():
@@ -89,16 +88,16 @@ def sanitize_trace_id(trace_id: str) -> str:
89
88
  # Remove leading/trailing hyphens
90
89
  sanitized = sanitized.strip("-")
91
90
 
92
- return sanitized if sanitized else "unnamed"
91
+ return sanitized if sanitized else "0"
92
+
93
+
94
+ # Backward compatibility alias
95
+ sanitize_trace_id = sanitize_id
93
96
 
94
97
 
95
98
  def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
96
99
  """Get unique trace ID, adding suffix if collision detected.
97
100
 
98
- This function ensures trace IDs remain unique even when multiple traces
99
- have IDs that sanitize to the same value (e.g., "A" and "a" both become "a").
100
- When a collision is detected, suffixes are added: a -> a-1 -> a-2, etc.
101
-
102
101
  Parameters
103
102
  ----------
104
103
  trace_id : str
@@ -116,20 +115,10 @@ def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
116
115
  >>> ids = set()
117
116
  >>> get_unique_trace_id("A", ids)
118
117
  'a'
119
- >>> ids
120
- {'a'}
121
118
  >>> get_unique_trace_id("a", ids) # collision!
122
119
  'a-1'
123
- >>> ids
124
- {'a', 'a-1'}
125
- >>> get_unique_trace_id("A ", ids) # another collision!
126
- 'a-2'
127
- >>> ids
128
- {'a', 'a-1', 'a-2'}
129
- >>> get_unique_trace_id("B", ids) # no collision
130
- 'b'
131
120
  """
132
- base_id = sanitize_trace_id(trace_id)
121
+ base_id = sanitize_id(trace_id)
133
122
 
134
123
  if base_id not in existing_ids:
135
124
  existing_ids.add(base_id)
@@ -146,13 +135,15 @@ def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
146
135
 
147
136
 
148
137
  def get_csv_column_prefix(
149
- ax_row: int = 0, ax_col: int = 0, trace_id: str = None, trace_index: int = None
138
+ ax_row: int = 0,
139
+ ax_col: int = 0,
140
+ caller: str = "plot",
141
+ trace_id: str = None,
142
+ trace_index: int = None,
150
143
  ) -> str:
151
144
  """Get CSV column prefix for a trace.
152
145
 
153
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-
154
- - Underscore (_) separates domains
155
- - Hyphen (-) within domain names and between name-value
146
+ Format: r{row}c{col}_{caller}-{id}_
156
147
 
157
148
  Parameters
158
149
  ----------
@@ -160,45 +151,152 @@ def get_csv_column_prefix(
160
151
  Row position of axes in grid (default: 0)
161
152
  ax_col : int
162
153
  Column position of axes in grid (default: 0)
154
+ caller : str
155
+ Plotting method name (default: "plot")
163
156
  trace_id : str, optional
164
- Trace identifier (from label or id kwarg). If None, uses trace_index.
157
+ User-provided trace identifier. If None, uses trace_index.
165
158
  trace_index : int, optional
166
- Index of trace when no trace_id is provided (default: 0)
159
+ Auto-generated index when no trace_id provided (default: 0)
167
160
 
168
161
  Returns
169
162
  -------
170
163
  str
171
- Column prefix like "ax-row-0-col-0_trace-id-sine_variable-"
164
+ Column prefix like "r0c0_plot-sine_"
172
165
 
173
166
  Examples
174
167
  --------
175
- >>> get_csv_column_prefix(trace_id="sine")
176
- 'ax-row-0-col-0_trace-id-sine_variable-'
177
- >>> get_csv_column_prefix(ax_row=1, ax_col=2, trace_index=0)
178
- 'ax-row-1-col-2_trace-id-0_variable-'
168
+ >>> get_csv_column_prefix(caller="plot", trace_id="sine")
169
+ 'r0c0_plot-sine_'
170
+ >>> get_csv_column_prefix(ax_row=1, ax_col=2, caller="scatter", trace_index=0)
171
+ 'r1c2_scatter-0_'
179
172
  """
180
173
  if trace_id:
181
- safe_id = sanitize_trace_id(trace_id)
174
+ safe_id = sanitize_id(trace_id)
182
175
  elif trace_index is not None:
183
176
  safe_id = str(trace_index)
184
177
  else:
185
178
  safe_id = "0"
186
179
 
187
- return f"ax-row-{ax_row}-col-{ax_col}_trace-id-{safe_id}_variable-"
180
+ return f"r{ax_row}c{ax_col}_{caller}-{safe_id}_"
181
+
182
+
183
+ def _extract_caller_and_id(trace_id: str) -> tuple:
184
+ """Extract caller (method) and id from a combined trace_id.
185
+
186
+ Handles various formats:
187
+ - "plot_0" -> ("plot", "0")
188
+ - "scatter_1" -> ("scatter", "1")
189
+ - "stx_line_0" -> ("stx_line", "0")
190
+ - "sine" -> ("plot", "sine") # user-provided, default to "plot"
191
+ - "plot-sine" -> ("plot", "sine")
192
+
193
+ Parameters
194
+ ----------
195
+ trace_id : str
196
+ Combined trace identifier
197
+
198
+ Returns
199
+ -------
200
+ tuple
201
+ (caller, id)
202
+ """
203
+ if not trace_id:
204
+ return ("plot", "0")
205
+
206
+ # Known method prefixes (order matters - longer first)
207
+ known_methods = [
208
+ "stx_line",
209
+ "stx_scatter",
210
+ "stx_bar",
211
+ "stx_barh",
212
+ "stx_box",
213
+ "stx_violin",
214
+ "stx_heatmap",
215
+ "stx_image",
216
+ "stx_imshow",
217
+ "stx_contour",
218
+ "stx_raster",
219
+ "stx_conf_mat",
220
+ "stx_joyplot",
221
+ "stx_rectangle",
222
+ "stx_fillv",
223
+ "stx_kde",
224
+ "stx_ecdf",
225
+ "stx_mean_std",
226
+ "stx_mean_ci",
227
+ "stx_median_iqr",
228
+ "stx_shaded_line",
229
+ "stx_errorbar",
230
+ "stx_fill_between",
231
+ "sns_boxplot",
232
+ "sns_violinplot",
233
+ "sns_barplot",
234
+ "sns_histplot",
235
+ "sns_kdeplot",
236
+ "sns_scatterplot",
237
+ "sns_lineplot",
238
+ "sns_swarmplot",
239
+ "sns_stripplot",
240
+ "sns_heatmap",
241
+ "sns_jointplot",
242
+ "sns_pairplot",
243
+ "plot_scatter",
244
+ "plot_box",
245
+ "plot_imshow",
246
+ "plot_kde",
247
+ "plot",
248
+ "scatter",
249
+ "bar",
250
+ "barh",
251
+ "hist",
252
+ "boxplot",
253
+ "violinplot",
254
+ "errorbar",
255
+ "fill_between",
256
+ "contour",
257
+ "contourf",
258
+ "imshow",
259
+ "pcolormesh",
260
+ "quiver",
261
+ "streamplot",
262
+ "stem",
263
+ "step",
264
+ "pie",
265
+ "hexbin",
266
+ "matshow",
267
+ "eventplot",
268
+ "stackplot",
269
+ "fill",
270
+ "text",
271
+ "annotate",
272
+ ]
273
+
274
+ # Check if trace_id starts with a known method
275
+ for method in known_methods:
276
+ # Check with underscore separator (e.g., "plot_0", "stx_line_0")
277
+ if trace_id.startswith(f"{method}_"):
278
+ remainder = trace_id[len(method) + 1 :]
279
+ return (method, remainder if remainder else "0")
280
+ # Check with hyphen separator (e.g., "plot-sine")
281
+ if trace_id.startswith(f"{method}-"):
282
+ remainder = trace_id[len(method) + 1 :]
283
+ return (method, remainder if remainder else "0")
284
+
285
+ # No known method prefix - assume user-provided ID, default caller to "plot"
286
+ return ("plot", trace_id)
188
287
 
189
288
 
190
289
  def get_csv_column_name(
191
290
  variable: str,
192
291
  ax_row: int = 0,
193
292
  ax_col: int = 0,
293
+ caller: str = None,
194
294
  trace_id: str = None,
195
295
  trace_index: int = None,
196
296
  ) -> str:
197
297
  """Get full CSV column name for a data field.
198
298
 
199
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
200
- - Underscore (_) separates domains
201
- - Hyphen (-) within domain names and between name-value
299
+ Format: r{row}c{col}_{caller}-{id}_{var}
202
300
 
203
301
  Parameters
204
302
  ----------
@@ -208,25 +306,34 @@ def get_csv_column_name(
208
306
  Row position of axes in grid (default: 0)
209
307
  ax_col : int
210
308
  Column position of axes in grid (default: 0)
309
+ caller : str, optional
310
+ Plotting method name. If None, extracted from trace_id or defaults to "plot"
211
311
  trace_id : str, optional
212
- Trace identifier (from label or id kwarg)
312
+ User-provided trace identifier. May contain method prefix (e.g., "plot_0")
213
313
  trace_index : int, optional
214
- Index of trace when no trace_id is provided
314
+ Auto-generated index when no trace_id provided
215
315
 
216
316
  Returns
217
317
  -------
218
318
  str
219
- Full column name like "ax-row-0-col-0_trace-id-sine_variable-x"
319
+ Full column name like "r0c0_plot-sine_x"
220
320
 
221
321
  Examples
222
322
  --------
223
- >>> get_csv_column_name("x", trace_id="sin(x)")
224
- 'ax-row-0-col-0_trace-id-sin-x_variable-x'
225
- >>> get_csv_column_name("y", ax_row=1, ax_col=2, trace_index=0)
226
- 'ax-row-1-col-2_trace-id-0_variable-y'
323
+ >>> get_csv_column_name("x", caller="plot", trace_id="sine")
324
+ 'r0c0_plot-sine_x'
325
+ >>> get_csv_column_name("y", ax_row=1, ax_col=2, caller="scatter", trace_index=0)
326
+ 'r1c2_scatter-0_y'
327
+ >>> get_csv_column_name("x", trace_id="plot_0") # backward compatible
328
+ 'r0c0_plot-0_x'
227
329
  """
228
- prefix = get_csv_column_prefix(ax_row, ax_col, trace_id, trace_index)
229
- # Variable names are simple (x, y, bins, etc.)
330
+ # If caller not provided, try to extract from trace_id
331
+ if caller is None and trace_id:
332
+ caller, trace_id = _extract_caller_and_id(trace_id)
333
+ elif caller is None:
334
+ caller = "plot"
335
+
336
+ prefix = get_csv_column_prefix(ax_row, ax_col, caller, trace_id, trace_index)
230
337
  safe_variable = variable.lower()
231
338
  return f"{prefix}{safe_variable}"
232
339
 
@@ -234,14 +341,14 @@ def get_csv_column_name(
234
341
  def parse_csv_column_name(column_name: str) -> dict:
235
342
  """Parse CSV column name to extract components.
236
343
 
237
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
238
- - Underscore (_) separates domains
239
- - Hyphen (-) within domain names and between name-value
344
+ Supports both new format and legacy format:
345
+ - New: r{row}c{col}_{caller}-{id}_{var}
346
+ - Legacy: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
240
347
 
241
348
  Parameters
242
349
  ----------
243
350
  column_name : str
244
- Full column name (e.g., "ax-row-0-col-0_trace-id-sine_variable-x")
351
+ Full column name
245
352
 
246
353
  Returns
247
354
  -------
@@ -249,61 +356,73 @@ def parse_csv_column_name(column_name: str) -> dict:
249
356
  Dictionary with keys:
250
357
  - ax_row: int
251
358
  - ax_col: int
359
+ - caller: str (method name, empty for legacy format)
252
360
  - trace_id: str
253
361
  - variable: str
254
362
  - valid: bool (True if parsing succeeded)
255
363
 
256
364
  Examples
257
365
  --------
258
- >>> parse_csv_column_name("ax-row-0-col-0_trace-id-sine_variable-x")
259
- {'ax_row': 0, 'ax_col': 0, 'trace_id': 'sine', 'variable': 'x', 'valid': True}
260
- >>> parse_csv_column_name("ax-row-1-col-2_trace-id-my-data_variable-bins")
261
- {'ax_row': 1, 'ax_col': 2, 'trace_id': 'my-data', 'variable': 'bins', 'valid': True}
366
+ >>> parse_csv_column_name("r0c0_plot-sine_x")
367
+ {'ax_row': 0, 'ax_col': 0, 'caller': 'plot', 'trace_id': 'sine', 'variable': 'x', 'valid': True}
368
+ >>> parse_csv_column_name("r1c2_scatter-0_y")
369
+ {'ax_row': 1, 'ax_col': 2, 'caller': 'scatter', 'trace_id': '0', 'variable': 'y', 'valid': True}
262
370
  """
263
371
  result = {
264
372
  "ax_row": 0,
265
373
  "ax_col": 0,
374
+ "caller": "",
266
375
  "trace_id": "",
267
376
  "variable": "",
268
377
  "valid": False,
269
378
  }
270
379
 
271
- if not column_name or not column_name.startswith("ax-row-"):
380
+ if not column_name:
381
+ return result
382
+
383
+ # Try new format: r{row}c{col}_{caller}-{id}_{var}
384
+ new_pattern = re.compile(r"^r(\d+)c(\d+)_([a-z_]+)-([^_]+)_([a-z]+)$")
385
+ match = new_pattern.match(column_name)
386
+ if match:
387
+ result["ax_row"] = int(match.group(1))
388
+ result["ax_col"] = int(match.group(2))
389
+ result["caller"] = match.group(3)
390
+ result["trace_id"] = match.group(4)
391
+ result["variable"] = match.group(5)
392
+ result["valid"] = True
272
393
  return result
273
394
 
274
- try:
275
- # Split by underscore to get domain groups
276
- parts = column_name.split("_")
277
- # Expected: ["ax-row-0-col-0", "trace-id-sine", "variable-x"]
278
-
279
- for part in parts:
280
- if part.startswith("ax-row-"):
281
- # Parse ax-row-{row}-col-{col}
282
- # Remove "ax-row-" prefix and split by "-col-"
283
- rest = part[7:] # Remove "ax-row-"
284
- if "-col-" in rest:
285
- row_str, col_str = rest.split("-col-")
286
- result["ax_row"] = int(row_str)
287
- result["ax_col"] = int(col_str)
288
- elif part.startswith("trace-id-"):
289
- # Extract trace id (everything after "trace-id-")
290
- result["trace_id"] = part[9:]
291
- elif part.startswith("variable-"):
292
- # Extract variable (everything after "variable-")
293
- result["variable"] = part[9:]
294
-
295
- # Validate we got all required fields
296
- if result["variable"]:
297
- result["valid"] = True
298
-
299
- except (ValueError, IndexError):
300
- pass
395
+ # Try legacy format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
396
+ if column_name.startswith("ax-row-"):
397
+ try:
398
+ parts = column_name.split("_")
399
+ for part in parts:
400
+ if part.startswith("ax-row-"):
401
+ rest = part[7:]
402
+ if "-col-" in rest:
403
+ row_str, col_str = rest.split("-col-")
404
+ result["ax_row"] = int(row_str)
405
+ result["ax_col"] = int(col_str)
406
+ elif part.startswith("trace-id-"):
407
+ result["trace_id"] = part[9:]
408
+ elif part.startswith("variable-"):
409
+ result["variable"] = part[9:]
410
+
411
+ if result["variable"]:
412
+ result["valid"] = True
413
+ except (ValueError, IndexError):
414
+ pass
301
415
 
302
416
  return result
303
417
 
304
418
 
305
419
  def get_trace_columns_from_df(
306
- df, trace_id: str = None, trace_index: int = None, ax_row: int = 0, ax_col: int = 0
420
+ df,
421
+ caller: str = None,
422
+ trace_id: str = None,
423
+ trace_index: int = None,
424
+ ax_row: int = 0,
425
+ ax_col: int = 0,
307
426
  ) -> dict:
308
427
  """Find CSV columns for a specific trace in a DataFrame.
309
428
 
@@ -311,6 +430,8 @@ def get_trace_columns_from_df(
311
430
  ----------
312
431
  df : pandas.DataFrame
313
432
  DataFrame with CSV data
433
+ caller : str, optional
434
+ Plotting method name to filter by
314
435
  trace_id : str, optional
315
436
  Trace identifier to search for
316
437
  trace_index : int, optional
@@ -323,18 +444,29 @@ def get_trace_columns_from_df(
323
444
  Returns
324
445
  -------
325
446
  dict
326
- Dictionary mapping variable names to column names, e.g.:
327
- {'x': 'ax-row-0-col-0_trace-id-sine_variable-x',
328
- 'y': 'ax-row-0-col-0_trace-id-sine_variable-y'}
447
+ Dictionary mapping variable names to column names
329
448
  """
330
449
  result = {}
331
- prefix = get_csv_column_prefix(ax_row, ax_col, trace_id, trace_index)
332
450
 
333
- for col in df.columns:
334
- if col.startswith(prefix):
335
- # Extract variable from column name
336
- variable = col[len(prefix):]
337
- result[variable] = col
451
+ if caller:
452
+ prefix = get_csv_column_prefix(ax_row, ax_col, caller, trace_id, trace_index)
453
+ for col in df.columns:
454
+ if col.startswith(prefix):
455
+ variable = col[len(prefix) :]
456
+ result[variable] = col
457
+ else:
458
+ # Search all columns matching position and trace
459
+ for col in df.columns:
460
+ parsed = parse_csv_column_name(col)
461
+ if (
462
+ parsed["valid"]
463
+ and parsed["ax_row"] == ax_row
464
+ and parsed["ax_col"] == ax_col
465
+ ):
466
+ if trace_id and parsed["trace_id"] == sanitize_id(trace_id):
467
+ result[parsed["variable"]] = col
468
+ elif trace_index is not None and parsed["trace_id"] == str(trace_index):
469
+ result[parsed["variable"]] = col
338
470
 
339
471
  return result
340
472
 
@@ -28,7 +28,7 @@ import torch
28
28
  import tensorflow as tf
29
29
 
30
30
  # Initialize once - fixes everything!
31
- rng_manager = stx.rng.RandomStateManager(seed=42)
31
+ rng = stx.rng.RandomStateManager(seed=42)
32
32
 
33
33
  # Python random - automatically fixed
34
34
  python_val = random.random() # Reproducible!
@@ -87,7 +87,7 @@ import sys
87
87
  import scitex as stx
88
88
 
89
89
  # Session.start returns RNG, fixing random seeds of the supported libraries automatically
90
- CONFIG, stdout, stderr, plt, CC, rng_manager = stx.session.start(
90
+ CONFIG, stdout, stderr, plt, CC, rng = stx.session.start(
91
91
  sys=sys,
92
92
  seed=42
93
93
  )
@@ -208,4 +208,4 @@ When you create a RandomStateManager, it automatically:
208
208
 
209
209
  yusuke.watanabe@scitex.ai
210
210
 
211
- <!-- EOF -->
211
+ <!-- EOF -->