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
scitex/cli/resource.py ADDED
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SciTeX CLI - Resource Commands (System Monitoring)
4
+
5
+ Provides system resource monitoring and specifications.
6
+ """
7
+
8
+ import sys
9
+
10
+ import click
11
+
12
+
13
+ @click.group(context_settings={"help_option_names": ["-h", "--help"]})
14
+ def resource():
15
+ """
16
+ System resource monitoring
17
+
18
+ \b
19
+ Commands:
20
+ specs Show system specifications
21
+ usage Show current resource usage
22
+ monitor Continuously monitor resource usage
23
+
24
+ \b
25
+ Examples:
26
+ scitex resource specs # Show system specs
27
+ scitex resource usage # Current CPU/memory/GPU usage
28
+ scitex resource monitor --interval 5
29
+ """
30
+ pass
31
+
32
+
33
+ @resource.command()
34
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
35
+ @click.option(
36
+ "--category",
37
+ "-c",
38
+ multiple=True,
39
+ type=click.Choice(["cpu", "memory", "disk", "network", "gpu", "os", "python"]),
40
+ help="Specific category to show",
41
+ )
42
+ def specs(as_json, category):
43
+ """
44
+ Show system specifications
45
+
46
+ \b
47
+ Categories:
48
+ cpu - Processor information
49
+ memory - RAM information
50
+ disk - Storage information
51
+ network - Network interfaces
52
+ gpu - GPU/CUDA information
53
+ os - Operating system details
54
+ python - Python environment
55
+
56
+ \b
57
+ Examples:
58
+ scitex resource specs
59
+ scitex resource specs --json
60
+ scitex resource specs --category cpu --category gpu
61
+ """
62
+ try:
63
+ from scitex.resource import get_specs
64
+
65
+ specs_data = get_specs()
66
+
67
+ # Filter categories if specified
68
+ if category:
69
+ category_map = {
70
+ "cpu": "_cpu_info",
71
+ "memory": "_memory_info",
72
+ "disk": "_disk_info",
73
+ "network": "_network_info",
74
+ "gpu": "_supple_nvidia_info",
75
+ "os": "_supple_os_info",
76
+ "python": "_supple_python_info",
77
+ }
78
+ filtered = {}
79
+ for cat in category:
80
+ key = category_map.get(cat, cat)
81
+ if key in specs_data:
82
+ filtered[key] = specs_data[key]
83
+ elif cat in specs_data:
84
+ filtered[cat] = specs_data[cat]
85
+ specs_data = filtered
86
+
87
+ if as_json:
88
+ import json
89
+
90
+ click.echo(json.dumps(specs_data, indent=2, default=str))
91
+ else:
92
+ click.secho("System Specifications", fg="cyan", bold=True)
93
+ click.echo("=" * 50)
94
+
95
+ for section, data in specs_data.items():
96
+ section_name = (
97
+ section.replace("_info", "").replace("_supple_", "").upper()
98
+ )
99
+ click.secho(f"\n{section_name}:", fg="yellow")
100
+ if isinstance(data, dict):
101
+ for key, value in data.items():
102
+ click.echo(f" {key}: {value}")
103
+ else:
104
+ click.echo(f" {data}")
105
+
106
+ except Exception as e:
107
+ click.secho(f"Error: {e}", fg="red", err=True)
108
+ sys.exit(1)
109
+
110
+
111
+ @resource.command()
112
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
113
+ def usage(as_json):
114
+ """
115
+ Show current resource usage (CPU, memory, GPU)
116
+
117
+ \b
118
+ Examples:
119
+ scitex resource usage
120
+ scitex resource usage --json
121
+ """
122
+ try:
123
+ from scitex.resource import get_processor_usages
124
+
125
+ usage_data = get_processor_usages()
126
+
127
+ if as_json:
128
+ import json
129
+
130
+ click.echo(json.dumps(usage_data, indent=2, default=str))
131
+ else:
132
+ click.secho("Resource Usage", fg="cyan", bold=True)
133
+ click.echo("=" * 50)
134
+
135
+ # CPU
136
+ cpu = usage_data.get("cpu", {})
137
+ click.secho("\nCPU:", fg="yellow")
138
+ click.echo(f" Usage: {cpu.get('percent', 'N/A')}%")
139
+ click.echo(f" Cores: {cpu.get('count', 'N/A')}")
140
+
141
+ # Memory
142
+ mem = usage_data.get("memory", {})
143
+ click.secho("\nMemory:", fg="yellow")
144
+ click.echo(f" Used: {mem.get('percent', 'N/A')}%")
145
+ click.echo(f" Total: {mem.get('total_gb', 'N/A')} GB")
146
+ click.echo(f" Available: {mem.get('available_gb', 'N/A')} GB")
147
+
148
+ # GPU (if available)
149
+ gpu = usage_data.get("gpu", {})
150
+ if gpu:
151
+ click.secho("\nGPU:", fg="yellow")
152
+ for i, g in enumerate(gpu.get("devices", [])):
153
+ click.echo(f" [{i}] {g.get('name', 'Unknown')}")
154
+ click.echo(
155
+ f" Memory: {g.get('memory_used', 'N/A')} / {g.get('memory_total', 'N/A')} MB"
156
+ )
157
+ click.echo(f" Utilization: {g.get('utilization', 'N/A')}%")
158
+
159
+ except Exception as e:
160
+ click.secho(f"Error: {e}", fg="red", err=True)
161
+ sys.exit(1)
162
+
163
+
164
+ @resource.command()
165
+ @click.option(
166
+ "--interval",
167
+ "-i",
168
+ type=float,
169
+ default=2.0,
170
+ help="Update interval in seconds (default: 2.0)",
171
+ )
172
+ @click.option("--count", "-n", type=int, help="Number of updates (default: continuous)")
173
+ @click.option("--log", "-l", type=click.Path(), help="Log to file")
174
+ def monitor(interval, count, log):
175
+ """
176
+ Continuously monitor resource usage
177
+
178
+ \b
179
+ Examples:
180
+ scitex resource monitor
181
+ scitex resource monitor --interval 5
182
+ scitex resource monitor --count 10 --log usage.log
183
+ """
184
+ try:
185
+ import time
186
+
187
+ from scitex.resource import get_processor_usages
188
+
189
+ click.echo(f"Monitoring resources (interval: {interval}s)")
190
+ click.echo("Press Ctrl+C to stop")
191
+ click.echo()
192
+
193
+ log_file = None
194
+ if log:
195
+ log_file = open(log, "w")
196
+ log_file.write("timestamp,cpu_percent,memory_percent,gpu_percent\n")
197
+
198
+ iteration = 0
199
+ try:
200
+ while True:
201
+ if count and iteration >= count:
202
+ break
203
+
204
+ usage_data = get_processor_usages()
205
+ cpu_pct = usage_data.get("cpu", {}).get("percent", 0)
206
+ mem_pct = usage_data.get("memory", {}).get("percent", 0)
207
+ gpu_pct = 0
208
+ gpu_info = usage_data.get("gpu", {})
209
+ if gpu_info and gpu_info.get("devices"):
210
+ gpu_pct = gpu_info["devices"][0].get("utilization", 0)
211
+
212
+ # Display
213
+ from datetime import datetime
214
+
215
+ ts = datetime.now().strftime("%H:%M:%S")
216
+ line = f"[{ts}] CPU: {cpu_pct:5.1f}% MEM: {mem_pct:5.1f}% GPU: {gpu_pct:5.1f}%"
217
+ click.echo(line)
218
+
219
+ # Log
220
+ if log_file:
221
+ log_file.write(f"{ts},{cpu_pct},{mem_pct},{gpu_pct}\n")
222
+ log_file.flush()
223
+
224
+ iteration += 1
225
+ time.sleep(interval)
226
+
227
+ except KeyboardInterrupt:
228
+ click.echo("\nMonitoring stopped")
229
+ finally:
230
+ if log_file:
231
+ log_file.close()
232
+ click.echo(f"Log saved: {log}")
233
+
234
+ except Exception as e:
235
+ click.secho(f"Error: {e}", fg="red", err=True)
236
+ sys.exit(1)
237
+
238
+
239
+ if __name__ == "__main__":
240
+ resource()
scitex/cli/stats.py ADDED
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SciTeX CLI - Stats Commands (Statistical Analysis)
4
+
5
+ Provides statistical testing, test recommendation, and result management.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ import click
12
+
13
+
14
+ @click.group(context_settings={"help_option_names": ["-h", "--help"]})
15
+ def stats():
16
+ """
17
+ Statistical analysis and testing utilities
18
+
19
+ \b
20
+ Commands:
21
+ recommend Get recommended statistical tests for your data
22
+ describe Compute descriptive statistics
23
+ save Save statistical results to bundle
24
+ load Load statistical results from bundle
25
+
26
+ \b
27
+ Examples:
28
+ scitex stats recommend --n-groups 2 --design between
29
+ scitex stats describe data.csv
30
+ scitex stats save results.json --output analysis.stats
31
+ """
32
+ pass
33
+
34
+
35
+ @stats.command()
36
+ @click.option(
37
+ "--n-groups", "-n", type=int, required=True, help="Number of groups to compare"
38
+ )
39
+ @click.option(
40
+ "--sample-sizes",
41
+ "-s",
42
+ multiple=True,
43
+ type=int,
44
+ help="Sample size for each group (can specify multiple times)",
45
+ )
46
+ @click.option(
47
+ "--outcome-type",
48
+ "-o",
49
+ type=click.Choice(["continuous", "binary", "ordinal", "count", "time_to_event"]),
50
+ default="continuous",
51
+ help="Type of outcome variable (default: continuous)",
52
+ )
53
+ @click.option(
54
+ "--design",
55
+ "-d",
56
+ type=click.Choice(["between", "within", "mixed"]),
57
+ default="between",
58
+ help="Study design (default: between)",
59
+ )
60
+ @click.option("--paired", is_flag=True, help="Whether measurements are paired")
61
+ @click.option("--has-control", is_flag=True, help="Whether there is a control group")
62
+ @click.option("--n-factors", type=int, default=1, help="Number of factors (default: 1)")
63
+ @click.option(
64
+ "--top-k", "-k", type=int, default=3, help="Number of recommendations (default: 3)"
65
+ )
66
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
67
+ def recommend(
68
+ n_groups,
69
+ sample_sizes,
70
+ outcome_type,
71
+ design,
72
+ paired,
73
+ has_control,
74
+ n_factors,
75
+ top_k,
76
+ as_json,
77
+ ):
78
+ """
79
+ Get recommended statistical tests for your experimental design
80
+
81
+ \b
82
+ Examples:
83
+ # Two-group comparison
84
+ scitex stats recommend --n-groups 2 --sample-sizes 30 --sample-sizes 32
85
+
86
+ # Three-group ANOVA
87
+ scitex stats recommend --n-groups 3 --design between
88
+
89
+ # Paired t-test scenario
90
+ scitex stats recommend --n-groups 2 --paired --design within
91
+
92
+ # Binary outcome (chi-square)
93
+ scitex stats recommend --n-groups 2 --outcome-type binary
94
+ """
95
+ try:
96
+ from scitex.stats import StatContext, recommend_tests
97
+
98
+ # Build context
99
+ ctx = StatContext(
100
+ n_groups=n_groups,
101
+ sample_sizes=list(sample_sizes) if sample_sizes else [30] * n_groups,
102
+ outcome_type=outcome_type,
103
+ design=design,
104
+ paired=paired,
105
+ has_control_group=has_control,
106
+ n_factors=n_factors,
107
+ )
108
+
109
+ tests = recommend_tests(ctx, top_k=top_k)
110
+
111
+ if as_json:
112
+ import json
113
+
114
+ output = {
115
+ "context": {
116
+ "n_groups": n_groups,
117
+ "sample_sizes": list(sample_sizes)
118
+ if sample_sizes
119
+ else [30] * n_groups,
120
+ "outcome_type": outcome_type,
121
+ "design": design,
122
+ "paired": paired,
123
+ "has_control_group": has_control,
124
+ "n_factors": n_factors,
125
+ },
126
+ "recommended_tests": tests,
127
+ }
128
+ click.echo(json.dumps(output, indent=2))
129
+ else:
130
+ click.secho("Recommended Statistical Tests", fg="cyan", bold=True)
131
+ click.echo("=" * 40)
132
+ click.echo("\nContext:")
133
+ click.echo(f" Groups: {n_groups}")
134
+ click.echo(f" Design: {design}")
135
+ click.echo(f" Outcome: {outcome_type}")
136
+ click.echo(f" Paired: {paired}")
137
+ click.echo(f"\nTop {top_k} Recommendations:")
138
+ for i, test in enumerate(tests, 1):
139
+ click.secho(f" {i}. {test}", fg="green")
140
+
141
+ except Exception as e:
142
+ click.secho(f"Error: {e}", fg="red", err=True)
143
+ sys.exit(1)
144
+
145
+
146
+ @stats.command()
147
+ @click.argument("data_path", type=click.Path(exists=True))
148
+ @click.option("--column", "-c", multiple=True, help="Specific column(s) to describe")
149
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
150
+ def describe(data_path, column, as_json):
151
+ """
152
+ Compute descriptive statistics for data
153
+
154
+ \b
155
+ Examples:
156
+ scitex stats describe data.csv
157
+ scitex stats describe data.csv --column age --column score
158
+ scitex stats describe data.csv --json
159
+ """
160
+ try:
161
+ import pandas as pd
162
+
163
+ from scitex.stats import describe as describe_data
164
+
165
+ # Load data
166
+ path = Path(data_path)
167
+ if path.suffix == ".csv":
168
+ df = pd.read_csv(path)
169
+ elif path.suffix in (".xls", ".xlsx"):
170
+ df = pd.read_excel(path)
171
+ elif path.suffix == ".json":
172
+ df = pd.read_json(path)
173
+ else:
174
+ click.secho(f"Unsupported file format: {path.suffix}", fg="red", err=True)
175
+ sys.exit(1)
176
+
177
+ # Filter columns if specified
178
+ if column:
179
+ df = df[list(column)]
180
+
181
+ # Get descriptive stats
182
+ result = describe_data(df)
183
+
184
+ if as_json:
185
+ import json
186
+
187
+ # Convert to JSON-serializable format
188
+ if hasattr(result, "to_dict"):
189
+ click.echo(json.dumps(result.to_dict(), indent=2, default=str))
190
+ else:
191
+ click.echo(json.dumps(result, indent=2, default=str))
192
+ else:
193
+ click.secho(f"Descriptive Statistics: {path.name}", fg="cyan", bold=True)
194
+ click.echo("=" * 50)
195
+ click.echo(result)
196
+
197
+ except ImportError:
198
+ click.secho(
199
+ "Error: pandas required. Install: pip install pandas", fg="red", err=True
200
+ )
201
+ sys.exit(1)
202
+ except Exception as e:
203
+ click.secho(f"Error: {e}", fg="red", err=True)
204
+ sys.exit(1)
205
+
206
+
207
+ @stats.command()
208
+ @click.argument("input_path", type=click.Path(exists=True))
209
+ @click.option(
210
+ "--output",
211
+ "-o",
212
+ type=click.Path(),
213
+ required=True,
214
+ help="Output bundle path (.stats)",
215
+ )
216
+ @click.option("--as-zip", is_flag=True, help="Save as ZIP archive")
217
+ def save(input_path, output, as_zip):
218
+ """
219
+ Save statistical results to a SciTeX bundle
220
+
221
+ \b
222
+ Examples:
223
+ scitex stats save results.json --output analysis.stats
224
+ scitex stats save comparisons.json --output analysis.stats --as-zip
225
+ """
226
+ try:
227
+ import json
228
+
229
+ from scitex.stats import save_stats
230
+
231
+ # Load input
232
+ with open(input_path) as f:
233
+ data = json.load(f)
234
+
235
+ # Handle different input formats
236
+ if isinstance(data, list):
237
+ comparisons = data
238
+ elif isinstance(data, dict) and "comparisons" in data:
239
+ comparisons = data["comparisons"]
240
+ else:
241
+ comparisons = [data]
242
+
243
+ # Save bundle
244
+ result_path = save_stats(comparisons, output, as_zip=as_zip)
245
+ click.secho(f"Stats bundle saved: {result_path}", fg="green")
246
+
247
+ except Exception as e:
248
+ click.secho(f"Error: {e}", fg="red", err=True)
249
+ sys.exit(1)
250
+
251
+
252
+ @stats.command()
253
+ @click.argument("bundle_path", type=click.Path(exists=True))
254
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
255
+ def load(bundle_path, as_json):
256
+ """
257
+ Load statistical results from a SciTeX bundle
258
+
259
+ \b
260
+ Examples:
261
+ scitex stats load analysis.stats
262
+ scitex stats load analysis.stats --json
263
+ """
264
+ try:
265
+ from scitex.stats import load_stats
266
+
267
+ data = load_stats(bundle_path)
268
+
269
+ if as_json:
270
+ import json
271
+
272
+ click.echo(json.dumps(data, indent=2, default=str))
273
+ else:
274
+ click.secho(f"Statistics Bundle: {bundle_path}", fg="cyan", bold=True)
275
+ click.echo("=" * 50)
276
+
277
+ comparisons = data.get("comparisons", [])
278
+ click.echo(f"\nComparisons ({len(comparisons)}):")
279
+ for comp in comparisons:
280
+ name = comp.get("name", "unnamed")
281
+ method = comp.get("method", "unknown")
282
+ p_val = comp.get("p_value", "N/A")
283
+ formatted = comp.get("formatted", "")
284
+ click.echo(f" - {name}: {method}, p={p_val} {formatted}")
285
+
286
+ except Exception as e:
287
+ click.secho(f"Error: {e}", fg="red", err=True)
288
+ sys.exit(1)
289
+
290
+
291
+ @stats.command()
292
+ def tests():
293
+ """
294
+ List available statistical tests
295
+
296
+ \b
297
+ Example:
298
+ scitex stats tests
299
+ """
300
+ try:
301
+ from scitex.stats import TEST_RULES
302
+
303
+ click.secho("Available Statistical Tests", fg="cyan", bold=True)
304
+ click.echo("=" * 50)
305
+
306
+ # Group by category
307
+ categories = {}
308
+ for rule in TEST_RULES:
309
+ cat = getattr(rule, "category", "other")
310
+ if cat not in categories:
311
+ categories[cat] = []
312
+ categories[cat].append(rule.name)
313
+
314
+ for cat, tests_list in sorted(categories.items()):
315
+ click.secho(f"\n{cat.title()}:", fg="yellow")
316
+ for test in sorted(tests_list):
317
+ click.echo(f" - {test}")
318
+
319
+ except Exception as e:
320
+ click.secho(f"Error: {e}", fg="red", err=True)
321
+ sys.exit(1)
322
+
323
+
324
+ if __name__ == "__main__":
325
+ stats()