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
@@ -660,7 +660,7 @@ def run_main() -> None:
660
660
 
661
661
  args = parse_args()
662
662
 
663
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
663
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
664
664
  sys,
665
665
  plt,
666
666
  args=args,
@@ -316,7 +316,7 @@ def run_main() -> None:
316
316
 
317
317
  args = parse_args()
318
318
 
319
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
319
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
320
320
  sys,
321
321
  plt,
322
322
  args=args,
@@ -406,7 +406,7 @@ def run_main() -> None:
406
406
 
407
407
  args = parse_args()
408
408
 
409
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
409
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
410
410
  sys,
411
411
  plt,
412
412
  args=args,
@@ -694,7 +694,7 @@ def run_main() -> None:
694
694
 
695
695
  args = parse_args()
696
696
 
697
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
697
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
698
698
  sys,
699
699
  plt,
700
700
  args=args,
@@ -438,7 +438,7 @@ def run_main() -> None:
438
438
 
439
439
  args = parse_args()
440
440
 
441
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
441
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
442
442
  sys,
443
443
  plt,
444
444
  args=args,
scitex/session/README.md CHANGED
@@ -22,7 +22,7 @@ def main(
22
22
  CONFIG=scitex.INJECTED,
23
23
  plt=scitex.INJECTED,
24
24
  COLORS=scitex.INJECTED,
25
- rng_manager=scitex.INJECTED,
25
+ rng=scitex.INJECTED,
26
26
  ):
27
27
  """Args injected by @scitex.session decorator"""
28
28
  print(f"Session ID: {CONFIG['ID']}")
@@ -46,7 +46,7 @@ def main(
46
46
  CONFIG=scitex.INJECTED,
47
47
  plt=scitex.INJECTED,
48
48
  COLORS=scitex.INJECTED,
49
- rng_manager=scitex.INJECTED,
49
+ rng=scitex.INJECTED,
50
50
  ):
51
51
  """Args injected by @scitex.session decorator"""
52
52
  print(f"Session ID: {CONFIG['ID']}")
@@ -59,7 +59,7 @@ The decorator automatically injects the following parameters:
59
59
  - `CONFIG`: Configuration dictionary with session metadata
60
60
  - `plt`: Configured matplotlib.pyplot module
61
61
  - `COLORS`: Color cycle dictionary
62
- - `rng_manager`: RandomStateManager instance
62
+ - `rng`: RandomStateManager instance
63
63
 
64
64
  Using `scitex.INJECTED` as default values makes it explicit that these parameters are injected by the decorator.
65
65
 
@@ -249,4 +249,4 @@ if __name__ == "__main__":
249
249
  - Automatically fixes seeds for all libraries
250
250
  - Reproducible across runs
251
251
 
252
- <!-- EOF -->
252
+ <!-- EOF -->
@@ -22,7 +22,7 @@ Usage:
22
22
  from scitex import session
23
23
 
24
24
  # Start a session
25
- CONFIG, sys.stdout, sys.stderr, plt, COLORS, rng_manager = session.start(sys, plt)
25
+ CONFIG, sys.stdout, sys.stderr, plt, COLORS, rng = session.start(sys, plt)
26
26
 
27
27
  # Your experiment code here
28
28
 
@@ -79,7 +79,7 @@ def session(
79
79
  # - CONFIG: Session configuration dict
80
80
  # - plt: Matplotlib pyplot (configured for session)
81
81
  # - COLORS: Custom Colors
82
- # - rng_manager: RandomStateManager (fixes seeds, creates named generators)
82
+ # - rng: RandomStateManager (fixes seeds, creates named generators)
83
83
  logger.info(f"Session ID: {CONFIG['ID']}")
84
84
  logger.info(f"Output directory: {CONFIG['SDIR_RUN']}")
85
85
  # ... training code ...
@@ -100,8 +100,8 @@ def session(
100
100
  - CONFIG (dict): Session configuration with ID, SDIR, paths, etc.
101
101
  - plt (module): matplotlib.pyplot configured with session settings
102
102
  - COLORS (CustomColors): Custom Colors for consistent plotting
103
- - rng_manager (RandomStateManager): Manages reproducibility by fixing global seeds
104
- and creating named generators via rng_manager("name")
103
+ - rng (RandomStateManager): Manages reproducibility by fixing global seeds
104
+ and creating named generators via rng("name")
105
105
  """
106
106
 
107
107
  def decorator(func: Callable) -> Callable:
@@ -163,7 +163,7 @@ def _run_with_session(
163
163
  # Start session
164
164
  import matplotlib.pyplot as plt
165
165
 
166
- CONFIG, stdout, stderr, plt, COLORS, rng_manager = start(
166
+ CONFIG, stdout, stderr, plt, COLORS, rng = start(
167
167
  sys=sys_module,
168
168
  plt=plt,
169
169
  args=cleaned_args,
@@ -182,7 +182,7 @@ def _run_with_session(
182
182
  func_globals["CONFIG"] = CONFIG
183
183
  func_globals["plt"] = plt
184
184
  func_globals["COLORS"] = COLORS
185
- func_globals["rng_manager"] = rng_manager
185
+ func_globals["rng"] = rng
186
186
  func_globals["logger"] = script_logger
187
187
 
188
188
  # Log injected globals for user awareness (only in verbose mode)
@@ -195,7 +195,7 @@ def _run_with_session(
195
195
  _decorator_logger.info(f" - CONFIG['PID']: {CONFIG['PID']}")
196
196
  _decorator_logger.info(" • plt - matplotlib.pyplot (configured for session)")
197
197
  _decorator_logger.info(" • COLORS - CustomColors (for consistent plotting)")
198
- _decorator_logger.info(" • rng_manager - RandomStateManager (for reproducibility)")
198
+ _decorator_logger.info(" • rng - RandomStateManager (for reproducibility)")
199
199
  _decorator_logger.info(" • logger - SciTeX logger (configured for your script)")
200
200
  _decorator_logger.info("=" * 60)
201
201
 
@@ -216,7 +216,7 @@ def _run_with_session(
216
216
  "CONFIG": CONFIG,
217
217
  "plt": plt,
218
218
  "COLORS": COLORS,
219
- "rng_manager": rng_manager,
219
+ "rng": rng,
220
220
  "logger": script_logger,
221
221
  }
222
222
 
@@ -419,7 +419,7 @@ Global Variables Injected by @session Decorator:
419
419
  plt.plot(x, y, color=COLORS.blue)
420
420
  plt.plot(x, y, color=COLORS['blue'])
421
421
 
422
- rng_manager (RandomStateManager)
422
+ rng (RandomStateManager)
423
423
  Manages reproducible randomness
424
424
 
425
425
  logger (SciTeXLogger)
@@ -596,7 +596,7 @@ def run(func: Callable, parse_args: Callable = None, **session_kwargs) -> Any:
596
596
  # Start session
597
597
  import matplotlib.pyplot as plt
598
598
 
599
- CONFIG, stdout, stderr, plt, COLORS, rng_manager = start(
599
+ CONFIG, stdout, stderr, plt, COLORS, rng = start(
600
600
  sys=sys_module,
601
601
  plt=plt,
602
602
  args=args,
@@ -411,12 +411,12 @@ def start(
411
411
  Returns
412
412
  -------
413
413
  tuple
414
- (CONFIGS, stdout, stderr, plt, COLORS, rng_manager)
414
+ (CONFIGS, stdout, stderr, plt, COLORS, rng)
415
415
  - CONFIGS: Configuration dictionary
416
416
  - stdout, stderr: Redirected output streams
417
417
  - plt: Configured matplotlib.pyplot module
418
418
  - COLORS: Color cycle dictionary
419
- - rng_manager: Global RandomStateManager instance for reproducible random generation
419
+ - rng: Global RandomStateManager instance for reproducible random generation
420
420
  """
421
421
  IS_DEBUG = _get_debug_mode()
422
422
  ID, PID = _initialize_env(IS_DEBUG)
@@ -516,7 +516,7 @@ def start(
516
516
  pass
517
517
 
518
518
  # Initialize RandomStateManager (automatically fixes all seeds)
519
- rng_manager = RandomStateManager(seed=seed, verbose=verbose)
519
+ rng = RandomStateManager(seed=seed, verbose=verbose)
520
520
  if verbose:
521
521
  logger.info(f"Initialized RandomStateManager with seed {seed}")
522
522
 
@@ -554,9 +554,9 @@ def start(
554
554
 
555
555
  # Return appropriate values based on whether sys was provided
556
556
  if sys is not None:
557
- return CONFIGS, sys.stdout, sys.stderr, plt, COLORS, rng_manager
557
+ return CONFIGS, sys.stdout, sys.stderr, plt, COLORS, rng
558
558
  else:
559
- return CONFIGS, None, None, plt, COLORS, rng_manager
559
+ return CONFIGS, None, None, plt, COLORS, rng
560
560
 
561
561
 
562
562
  def _format_diff_time(diff_time):
@@ -16,7 +16,7 @@ def main(
16
16
  CONFIG=INJECTED,
17
17
  plt=INJECTED,
18
18
  COLORS=INJECTED,
19
- rng_manager=INJECTED,
19
+ rng=INJECTED,
20
20
  logger=INJECTED,
21
21
  ):
22
22
  """Demonstration for scitex.session.session"""
scitex/stats/__init__.py CHANGED
@@ -57,21 +57,21 @@ from .auto import (
57
57
  )
58
58
 
59
59
  # =============================================================================
60
- # Stats Schema - Use scitex.fts.Stats as single source of truth
60
+ # Stats Schema - Use scitex.io.bundle.Stats as single source of truth
61
61
  # =============================================================================
62
62
 
63
- # For backward compatibility, re-export from fts
63
+ # Re-export Stats from bundle module
64
64
  try:
65
- from scitex.fts import Stats
65
+ from scitex.io.bundle import Stats
66
66
 
67
- FTS_AVAILABLE = True
67
+ BUNDLE_AVAILABLE = True
68
68
  except ImportError:
69
69
  Stats = None
70
- FTS_AVAILABLE = False
70
+ BUNDLE_AVAILABLE = False
71
71
 
72
72
 
73
73
  def test_result_to_stats(result: dict) -> "Stats":
74
- """Convert test result dict to FTS Stats schema.
74
+ """Convert test result dict to Stats schema.
75
75
 
76
76
  Parameters
77
77
  ----------
@@ -92,26 +92,24 @@ def test_result_to_stats(result: dict) -> "Stats":
92
92
  Returns
93
93
  -------
94
94
  Stats
95
- FTS Stats object suitable for bundle storage
95
+ Stats object suitable for bundle storage
96
96
 
97
97
  Example
98
98
  -------
99
99
  >>> result = stats.t_test(x, y)
100
- >>> fts_stats = stats.test_result_to_stats(result)
101
- >>> bundle.stats = fts_stats
100
+ >>> stat_obj = stats.test_result_to_stats(result)
101
+ >>> bundle.stats = stat_obj
102
102
  """
103
- if not FTS_AVAILABLE:
104
- raise ImportError("scitex.fts is required for Stats conversion")
103
+ if not BUNDLE_AVAILABLE:
104
+ raise ImportError("scitex.io.bundle is required for Stats conversion")
105
105
 
106
106
  import uuid
107
107
 
108
- from scitex.fts._stats._dataclasses._Stats import (
108
+ from scitex.io.bundle._stats._dataclasses._Stats import (
109
109
  Analysis,
110
110
  EffectSize,
111
111
  StatMethod,
112
- )
113
- from scitex.fts._stats._dataclasses._Stats import (
114
- StatResult as FTSStatResult,
112
+ StatResult,
115
113
  )
116
114
 
117
115
  # Handle legacy flat format vs new nested format
@@ -134,7 +132,7 @@ def test_result_to_stats(result: dict) -> "Stats":
134
132
  ci_lower=ci[0] if len(ci) > 0 else None,
135
133
  ci_upper=ci[1] if len(ci) > 1 else None,
136
134
  )
137
- stat_result = FTSStatResult(
135
+ stat_result = StatResult(
138
136
  statistic=result.get("statistic", 0.0),
139
137
  statistic_name=result.get("statistic_name", ""),
140
138
  p_value=result.get("p_value", 1.0),
@@ -164,7 +162,7 @@ def test_result_to_stats(result: dict) -> "Stats":
164
162
  ci_upper=es.get("ci_upper"),
165
163
  )
166
164
 
167
- stat_result = FTSStatResult(
165
+ stat_result = StatResult(
168
166
  statistic=results_data.get("statistic", 0.0),
169
167
  statistic_name=results_data.get("statistic_name", ""),
170
168
  p_value=results_data.get("p_value", 1.0),
@@ -189,25 +187,25 @@ def test_result_to_stats(result: dict) -> "Stats":
189
187
 
190
188
 
191
189
  # =============================================================================
192
- # .statsz Bundle Support - Using FTS
190
+ # .stats Bundle Support
193
191
  # =============================================================================
194
192
 
195
193
 
196
- def save_statsz(
194
+ def save_stats(
197
195
  comparisons,
198
196
  path,
199
197
  metadata=None,
200
198
  as_zip=False,
201
199
  ):
202
200
  """
203
- Save statistical results as an FTS bundle.
201
+ Save statistical results as a SciTeX bundle.
204
202
 
205
203
  Parameters
206
204
  ----------
207
205
  comparisons : list of dict
208
206
  List of comparison results.
209
207
  path : str or Path
210
- Output path (e.g., "results.zip").
208
+ Output path (e.g., "results.stats" or "results.stats.zip").
211
209
  metadata : dict, optional
212
210
  Additional metadata.
213
211
  as_zip : bool, optional
@@ -220,14 +218,14 @@ def save_statsz(
220
218
  """
221
219
  from pathlib import Path
222
220
 
223
- from scitex.fts import FTS
221
+ from scitex.io.bundle import Bundle
224
222
 
225
223
  p = Path(path)
226
224
  if as_zip and not p.suffix == ".zip":
227
225
  p = p.with_suffix(".zip")
228
226
 
229
- # Create FTS bundle
230
- bundle = FTS(p, create=True, node_type="stats")
227
+ # Create bundle
228
+ bundle = Bundle(p, create=True, bundle_type="stats")
231
229
 
232
230
  # Convert comparisons to Stats
233
231
  if comparisons:
@@ -246,14 +244,14 @@ def save_statsz(
246
244
  return p
247
245
 
248
246
 
249
- def load_statsz(path):
247
+ def load_stats(path):
250
248
  """
251
- Load a stats bundle using FTS.
249
+ Load a stats bundle.
252
250
 
253
251
  Parameters
254
252
  ----------
255
253
  path : str or Path
256
- Path to bundle.
254
+ Path to bundle (.stats or .stats.zip).
257
255
 
258
256
  Returns
259
257
  -------
@@ -262,9 +260,9 @@ def load_statsz(path):
262
260
  Each comparison is a flat dict with:
263
261
  - name, method, p_value, effect_size, ci95, formatted
264
262
  """
265
- from scitex.fts import FTS
263
+ from scitex.io.bundle import Bundle
266
264
 
267
- bundle = FTS(path)
265
+ bundle = Bundle(path)
268
266
 
269
267
  comparisons = []
270
268
  if bundle.stats and bundle.stats.analyses:
@@ -317,9 +315,8 @@ __all__ = [
317
315
  "describe",
318
316
  # Torch availability flag (for GPU acceleration)
319
317
  "TORCH_AVAILABLE",
320
- # Stats schema (from FTS)
318
+ # Stats schema
321
319
  "Stats",
322
- "FTS_AVAILABLE",
323
320
  # Auto module convenience exports
324
321
  "StatContext",
325
322
  "TestRule",
@@ -334,8 +331,8 @@ __all__ = [
334
331
  # Conversion utilities
335
332
  "test_result_to_stats",
336
333
  # Bundle functions
337
- "save_statsz",
338
- "load_statsz",
334
+ "save_stats",
335
+ "load_stats",
339
336
  ]
340
337
 
341
338
  __version__ = "2.2.0"
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-08
3
+ # File: src/scitex/stats/__main__.py
4
+ # ----------------------------------------
5
+
6
+ """Stats CLI entry point.
7
+
8
+ Subcommand-based interface:
9
+ - recommend: Recommend statistical tests based on data characteristics
10
+ - test: Run a statistical test
11
+ - power: Power analysis and sample size calculation
12
+ - mcp: Start MCP server for LLM integration
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import argparse
18
+ import asyncio
19
+ import json
20
+ import sys
21
+
22
+
23
+ def create_parser():
24
+ """Create main argument parser with subcommands."""
25
+ parser = argparse.ArgumentParser(
26
+ prog="python -m scitex.stats",
27
+ description="""
28
+ SciTeX Stats - Statistical Testing Framework
29
+ ═══════════════════════════════════════════
30
+
31
+ Subcommand interface:
32
+ recommend - Recommend statistical tests
33
+ test - Run a statistical test
34
+ power - Power analysis
35
+ mcp - Start MCP server for LLM integration
36
+ """,
37
+ formatter_class=argparse.RawDescriptionHelpFormatter,
38
+ )
39
+
40
+ subparsers = parser.add_subparsers(
41
+ dest="command",
42
+ help="Available commands",
43
+ required=True,
44
+ )
45
+
46
+ # ========================================
47
+ # Subcommand: recommend
48
+ # ========================================
49
+ recommend_parser = subparsers.add_parser(
50
+ "recommend",
51
+ help="Recommend statistical tests",
52
+ description="Recommend appropriate statistical tests based on data characteristics",
53
+ formatter_class=argparse.RawDescriptionHelpFormatter,
54
+ )
55
+ recommend_parser.add_argument(
56
+ "--n-groups",
57
+ type=int,
58
+ default=2,
59
+ help="Number of groups to compare (default: 2)",
60
+ )
61
+ recommend_parser.add_argument(
62
+ "--sample-sizes",
63
+ type=int,
64
+ nargs="+",
65
+ help="Sample sizes for each group",
66
+ )
67
+ recommend_parser.add_argument(
68
+ "--outcome",
69
+ type=str,
70
+ choices=["continuous", "ordinal", "categorical", "binary"],
71
+ default="continuous",
72
+ help="Outcome variable type (default: continuous)",
73
+ )
74
+ recommend_parser.add_argument(
75
+ "--design",
76
+ type=str,
77
+ choices=["between", "within", "mixed"],
78
+ default="between",
79
+ help="Study design (default: between)",
80
+ )
81
+ recommend_parser.add_argument(
82
+ "--paired",
83
+ action="store_true",
84
+ help="Data is paired/matched",
85
+ )
86
+ recommend_parser.add_argument(
87
+ "--has-control",
88
+ action="store_true",
89
+ help="Has a control group",
90
+ )
91
+ recommend_parser.add_argument(
92
+ "--top-k",
93
+ type=int,
94
+ default=3,
95
+ help="Number of recommendations (default: 3)",
96
+ )
97
+
98
+ # ========================================
99
+ # Subcommand: test
100
+ # ========================================
101
+ test_parser = subparsers.add_parser(
102
+ "test",
103
+ help="Run a statistical test",
104
+ description="Execute a statistical test on provided data",
105
+ formatter_class=argparse.RawDescriptionHelpFormatter,
106
+ )
107
+ test_parser.add_argument(
108
+ "test_name",
109
+ type=str,
110
+ help="Name of the test to run",
111
+ )
112
+ test_parser.add_argument(
113
+ "--data",
114
+ type=str,
115
+ help="JSON array of group data, e.g., '[[1,2,3],[4,5,6]]'",
116
+ )
117
+ test_parser.add_argument(
118
+ "--alternative",
119
+ type=str,
120
+ choices=["two-sided", "less", "greater"],
121
+ default="two-sided",
122
+ help="Alternative hypothesis (default: two-sided)",
123
+ )
124
+
125
+ # ========================================
126
+ # Subcommand: power
127
+ # ========================================
128
+ power_parser = subparsers.add_parser(
129
+ "power",
130
+ help="Power analysis",
131
+ description="Calculate statistical power or required sample size",
132
+ formatter_class=argparse.RawDescriptionHelpFormatter,
133
+ )
134
+ power_parser.add_argument(
135
+ "--test-type",
136
+ type=str,
137
+ choices=["ttest", "anova", "correlation", "chi2"],
138
+ default="ttest",
139
+ help="Type of statistical test (default: ttest)",
140
+ )
141
+ power_parser.add_argument(
142
+ "--effect-size",
143
+ type=float,
144
+ help="Expected effect size (Cohen's d, f, r, or w)",
145
+ )
146
+ power_parser.add_argument(
147
+ "--n",
148
+ type=int,
149
+ help="Sample size per group (for power calculation)",
150
+ )
151
+ power_parser.add_argument(
152
+ "--power",
153
+ type=float,
154
+ default=0.8,
155
+ help="Desired power (default: 0.8)",
156
+ )
157
+ power_parser.add_argument(
158
+ "--alpha",
159
+ type=float,
160
+ default=0.05,
161
+ help="Significance level (default: 0.05)",
162
+ )
163
+
164
+ # ========================================
165
+ # Subcommand: mcp
166
+ # ========================================
167
+ subparsers.add_parser(
168
+ "mcp",
169
+ help="Start MCP server for LLM integration",
170
+ description="Start the MCP (Model Context Protocol) server for Claude/LLM integration",
171
+ formatter_class=argparse.RawDescriptionHelpFormatter,
172
+ )
173
+
174
+ return parser
175
+
176
+
177
+ def run_recommend(args):
178
+ """Run test recommendation."""
179
+ from scitex.stats.auto import StatContext, recommend_tests
180
+ from scitex.stats.auto._rules import TEST_RULES
181
+
182
+ ctx = StatContext(
183
+ n_groups=args.n_groups,
184
+ sample_sizes=args.sample_sizes or [30] * args.n_groups,
185
+ outcome_type=args.outcome,
186
+ design=args.design,
187
+ paired=args.paired,
188
+ has_control_group=args.has_control,
189
+ n_factors=1,
190
+ )
191
+
192
+ tests = recommend_tests(ctx, top_k=args.top_k)
193
+
194
+ print("\n=== Recommended Statistical Tests ===\n")
195
+ for i, test_name in enumerate(tests, 1):
196
+ rule = TEST_RULES.get(test_name)
197
+ if rule:
198
+ print(f"{i}. {test_name}")
199
+ print(f" Family: {rule.family}")
200
+ print(f" Priority: {rule.priority}")
201
+ if rule.needs_normality:
202
+ print(" Requires: normality assumption")
203
+ if rule.needs_equal_variance:
204
+ print(" Requires: equal variance assumption")
205
+ print()
206
+
207
+ return 0
208
+
209
+
210
+ def run_test(args):
211
+ """Run a statistical test."""
212
+ if not args.data:
213
+ print("Error: --data is required")
214
+ return 1
215
+
216
+ data = json.loads(args.data)
217
+
218
+ from scitex.stats._mcp_handlers import run_test_handler
219
+
220
+ result = asyncio.run(
221
+ run_test_handler(
222
+ test_name=args.test_name,
223
+ data=data,
224
+ alternative=args.alternative,
225
+ )
226
+ )
227
+
228
+ print(json.dumps(result, indent=2))
229
+ return 0 if result.get("success") else 1
230
+
231
+
232
+ def run_power(args):
233
+ """Run power analysis."""
234
+ from scitex.stats._mcp_handlers import power_analysis_handler
235
+
236
+ result = asyncio.run(
237
+ power_analysis_handler(
238
+ test_type=args.test_type,
239
+ effect_size=args.effect_size,
240
+ n=args.n,
241
+ power=args.power,
242
+ alpha=args.alpha,
243
+ )
244
+ )
245
+
246
+ print(json.dumps(result, indent=2))
247
+ return 0 if result.get("success") else 1
248
+
249
+
250
+ async def run_mcp_server():
251
+ """Run MCP server."""
252
+ from .mcp_server import main as mcp_main
253
+
254
+ print("Starting Stats MCP server...", file=sys.stderr)
255
+ await mcp_main()
256
+ return 0
257
+
258
+
259
+ def main():
260
+ """Main entry point."""
261
+ parser = create_parser()
262
+ args = parser.parse_args()
263
+
264
+ if args.command == "recommend":
265
+ return run_recommend(args)
266
+ elif args.command == "test":
267
+ return run_test(args)
268
+ elif args.command == "power":
269
+ return run_power(args)
270
+ elif args.command == "mcp":
271
+ return asyncio.run(run_mcp_server())
272
+ else:
273
+ print(f"Unknown command: {args.command}")
274
+ return 1
275
+
276
+
277
+ if __name__ == "__main__":
278
+ sys.exit(main())
279
+
280
+
281
+ # EOF