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
@@ -0,0 +1,1231 @@
1
+ Metadata-Version: 2.4
2
+ Name: scitex
3
+ Version: 2.13.0
4
+ Summary: A comprehensive Python library for scientific computing and data analysis
5
+ Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-code
6
+ Project-URL: Documentation, https://scitex.readthedocs.io
7
+ Project-URL: Repository, https://github.com/ywatanabe1989/scitex-code
8
+ Project-URL: Bug Tracker, https://github.com/ywatanabe1989/scitex-code/issues
9
+ Author-email: Yusuke Watanabe <ywatanabe@scitex.ai>
10
+ License: AGPL-3.0
11
+ License-File: LICENSE
12
+ Keywords: data-analysis,machine-learning,neural-networks,research,scientific-computing,signal-processing
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Topic :: Scientific/Engineering
25
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
26
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Requires-Python: >=3.8
29
+ Requires-Dist: natsort
30
+ Requires-Dist: numpy
31
+ Requires-Dist: packaging
32
+ Requires-Dist: pandas
33
+ Requires-Dist: pyyaml
34
+ Requires-Dist: tqdm
35
+ Provides-Extra: ai
36
+ Requires-Dist: anthropic; extra == 'ai'
37
+ Requires-Dist: google-genai; extra == 'ai'
38
+ Requires-Dist: groq; extra == 'ai'
39
+ Requires-Dist: imbalanced-learn; extra == 'ai'
40
+ Requires-Dist: joblib; extra == 'ai'
41
+ Requires-Dist: markdown2; extra == 'ai'
42
+ Requires-Dist: matplotlib; extra == 'ai'
43
+ Requires-Dist: natsort; extra == 'ai'
44
+ Requires-Dist: openai; extra == 'ai'
45
+ Requires-Dist: pillow; extra == 'ai'
46
+ Requires-Dist: pyyaml; extra == 'ai'
47
+ Requires-Dist: requests; extra == 'ai'
48
+ Requires-Dist: ruamel-yaml; extra == 'ai'
49
+ Requires-Dist: scikit-learn; extra == 'ai'
50
+ Requires-Dist: scipy; extra == 'ai'
51
+ Requires-Dist: seaborn; extra == 'ai'
52
+ Requires-Dist: sktime; extra == 'ai'
53
+ Requires-Dist: umap-learn; extra == 'ai'
54
+ Requires-Dist: xarray; extra == 'ai'
55
+ Provides-Extra: all
56
+ Requires-Dist: accelerate; extra == 'all'
57
+ Requires-Dist: aiohttp; extra == 'all'
58
+ Requires-Dist: anthropic; extra == 'all'
59
+ Requires-Dist: beautifulsoup4; extra == 'all'
60
+ Requires-Dist: bibtexparser; extra == 'all'
61
+ Requires-Dist: bitsandbytes; extra == 'all'
62
+ Requires-Dist: catboost; extra == 'all'
63
+ Requires-Dist: celery; extra == 'all'
64
+ Requires-Dist: click; extra == 'all'
65
+ Requires-Dist: crawl4ai; extra == 'all'
66
+ Requires-Dist: csv2latex; extra == 'all'
67
+ Requires-Dist: dearpygui; extra == 'all'
68
+ Requires-Dist: einops; extra == 'all'
69
+ Requires-Dist: elevenlabs; extra == 'all'
70
+ Requires-Dist: fairscale; extra == 'all'
71
+ Requires-Dist: fastapi; extra == 'all'
72
+ Requires-Dist: feedparser; extra == 'all'
73
+ Requires-Dist: figrecipe; extra == 'all'
74
+ Requires-Dist: flask; extra == 'all'
75
+ Requires-Dist: geom-median; extra == 'all'
76
+ Requires-Dist: gitpython; extra == 'all'
77
+ Requires-Dist: google-genai; extra == 'all'
78
+ Requires-Dist: groq; extra == 'all'
79
+ Requires-Dist: gtts; extra == 'all'
80
+ Requires-Dist: h5py; extra == 'all'
81
+ Requires-Dist: html2text; extra == 'all'
82
+ Requires-Dist: httpx; extra == 'all'
83
+ Requires-Dist: imbalanced-learn; extra == 'all'
84
+ Requires-Dist: ipdb; extra == 'all'
85
+ Requires-Dist: ipykernel; extra == 'all'
86
+ Requires-Dist: ipython; extra == 'all'
87
+ Requires-Dist: joblib; extra == 'all'
88
+ Requires-Dist: julius; extra == 'all'
89
+ Requires-Dist: jupyter-collaboration; extra == 'all'
90
+ Requires-Dist: jupyterlab; extra == 'all'
91
+ Requires-Dist: jupytext; extra == 'all'
92
+ Requires-Dist: llvmlite>=0.39.0; extra == 'all'
93
+ Requires-Dist: lxml; extra == 'all'
94
+ Requires-Dist: lxml-html-clean; extra == 'all'
95
+ Requires-Dist: markdown; extra == 'all'
96
+ Requires-Dist: matplotlib; extra == 'all'
97
+ Requires-Dist: mcp; extra == 'all'
98
+ Requires-Dist: mne; extra == 'all'
99
+ Requires-Dist: mss; extra == 'all'
100
+ Requires-Dist: natsort; extra == 'all'
101
+ Requires-Dist: nbsphinx; extra == 'all'
102
+ Requires-Dist: nest-asyncio; extra == 'all'
103
+ Requires-Dist: numcodecs; extra == 'all'
104
+ Requires-Dist: obspy; extra == 'all'
105
+ Requires-Dist: openai; extra == 'all'
106
+ Requires-Dist: opencv-python; extra == 'all'
107
+ Requires-Dist: openpyxl; extra == 'all'
108
+ Requires-Dist: optuna; extra == 'all'
109
+ Requires-Dist: papermill; extra == 'all'
110
+ Requires-Dist: pdfplumber; extra == 'all'
111
+ Requires-Dist: piexif; extra == 'all'
112
+ Requires-Dist: pillow; extra == 'all'
113
+ Requires-Dist: playwright>=1.40.0; extra == 'all'
114
+ Requires-Dist: plotly; extra == 'all'
115
+ Requires-Dist: psutil; extra == 'all'
116
+ Requires-Dist: psycopg2-binary; extra == 'all'
117
+ Requires-Dist: pybids; extra == 'all'
118
+ Requires-Dist: pydantic; extra == 'all'
119
+ Requires-Dist: pydub; extra == 'all'
120
+ Requires-Dist: pyedflib; extra == 'all'
121
+ Requires-Dist: pymatreader; extra == 'all'
122
+ Requires-Dist: pymed; extra == 'all'
123
+ Requires-Dist: pymupdf; extra == 'all'
124
+ Requires-Dist: pypandoc; extra == 'all'
125
+ Requires-Dist: pypdf; extra == 'all'
126
+ Requires-Dist: pypdf2; extra == 'all'
127
+ Requires-Dist: pyperclip; extra == 'all'
128
+ Requires-Dist: pyqt6; extra == 'all'
129
+ Requires-Dist: pytesseract; extra == 'all'
130
+ Requires-Dist: python-docx; extra == 'all'
131
+ Requires-Dist: pytorch-optimizer; extra == 'all'
132
+ Requires-Dist: pytorch-pretrained-vit; extra == 'all'
133
+ Requires-Dist: pyttsx3; extra == 'all'
134
+ Requires-Dist: qrcode[pil]; extra == 'all'
135
+ Requires-Dist: readability-lxml; extra == 'all'
136
+ Requires-Dist: readchar; extra == 'all'
137
+ Requires-Dist: requests; extra == 'all'
138
+ Requires-Dist: ripple-detection; extra == 'all'
139
+ Requires-Dist: ruamel-yaml; extra == 'all'
140
+ Requires-Dist: scholarly; extra == 'all'
141
+ Requires-Dist: scikit-image; extra == 'all'
142
+ Requires-Dist: scikit-learn; extra == 'all'
143
+ Requires-Dist: scipy; extra == 'all'
144
+ Requires-Dist: seaborn; extra == 'all'
145
+ Requires-Dist: selenium; extra == 'all'
146
+ Requires-Dist: sktime; extra == 'all'
147
+ Requires-Dist: sounddevice; extra == 'all'
148
+ Requires-Dist: sqlalchemy; extra == 'all'
149
+ Requires-Dist: statsmodels; extra == 'all'
150
+ Requires-Dist: streamlit; extra == 'all'
151
+ Requires-Dist: sympy; extra == 'all'
152
+ Requires-Dist: tenacity; extra == 'all'
153
+ Requires-Dist: tensorpac; extra == 'all'
154
+ Requires-Dist: termplotlib; extra == 'all'
155
+ Requires-Dist: torch; extra == 'all'
156
+ Requires-Dist: torchaudio; extra == 'all'
157
+ Requires-Dist: torchsummary; extra == 'all'
158
+ Requires-Dist: torchvision; extra == 'all'
159
+ Requires-Dist: transformers; extra == 'all'
160
+ Requires-Dist: umap-learn>=0.5.4; extra == 'all'
161
+ Requires-Dist: watchdog; extra == 'all'
162
+ Requires-Dist: webdriver-manager; extra == 'all'
163
+ Requires-Dist: xarray; extra == 'all'
164
+ Requires-Dist: xlrd; extra == 'all'
165
+ Requires-Dist: xlsx2csv; extra == 'all'
166
+ Requires-Dist: yq; extra == 'all'
167
+ Requires-Dist: zarr; extra == 'all'
168
+ Provides-Extra: audio
169
+ Requires-Dist: elevenlabs; extra == 'audio'
170
+ Requires-Dist: gtts; extra == 'audio'
171
+ Requires-Dist: mcp; extra == 'audio'
172
+ Requires-Dist: pydub; extra == 'audio'
173
+ Requires-Dist: pytest-asyncio; extra == 'audio'
174
+ Requires-Dist: pyttsx3; extra == 'audio'
175
+ Provides-Extra: benchmark
176
+ Requires-Dist: psutil; extra == 'benchmark'
177
+ Provides-Extra: bridge
178
+ Requires-Dist: matplotlib; extra == 'bridge'
179
+ Requires-Dist: scipy; extra == 'bridge'
180
+ Provides-Extra: browser
181
+ Requires-Dist: aiohttp; extra == 'browser'
182
+ Requires-Dist: matplotlib; extra == 'browser'
183
+ Requires-Dist: playwright>=1.40.0; extra == 'browser'
184
+ Provides-Extra: capture
185
+ Requires-Dist: mcp; extra == 'capture'
186
+ Requires-Dist: mss; extra == 'capture'
187
+ Requires-Dist: pillow; extra == 'capture'
188
+ Requires-Dist: playwright>=1.40.0; extra == 'capture'
189
+ Provides-Extra: cli
190
+ Requires-Dist: aiohttp; extra == 'cli'
191
+ Requires-Dist: beautifulsoup4; extra == 'cli'
192
+ Requires-Dist: click; extra == 'cli'
193
+ Requires-Dist: gitpython; extra == 'cli'
194
+ Requires-Dist: playwright; extra == 'cli'
195
+ Requires-Dist: pyyaml; extra == 'cli'
196
+ Requires-Dist: requests; extra == 'cli'
197
+ Provides-Extra: cloud
198
+ Requires-Dist: matplotlib; extra == 'cloud'
199
+ Provides-Extra: config
200
+ Requires-Dist: pyyaml; extra == 'config'
201
+ Provides-Extra: db
202
+ Requires-Dist: psycopg2-binary; extra == 'db'
203
+ Requires-Dist: sqlalchemy; extra == 'db'
204
+ Provides-Extra: decorators
205
+ Requires-Dist: joblib; extra == 'decorators'
206
+ Requires-Dist: matplotlib; extra == 'decorators'
207
+ Requires-Dist: pytest-asyncio; extra == 'decorators'
208
+ Requires-Dist: scipy; extra == 'decorators'
209
+ Requires-Dist: tqdm; extra == 'decorators'
210
+ Requires-Dist: xarray; extra == 'decorators'
211
+ Provides-Extra: dev
212
+ Requires-Dist: build; extra == 'dev'
213
+ Requires-Dist: jedi; extra == 'dev'
214
+ Requires-Dist: line-profiler; extra == 'dev'
215
+ Requires-Dist: markdown; extra == 'dev'
216
+ Requires-Dist: markdown2; extra == 'dev'
217
+ Requires-Dist: matplotlib; extra == 'dev'
218
+ Requires-Dist: memory-profiler; extra == 'dev'
219
+ Requires-Dist: mypy; extra == 'dev'
220
+ Requires-Dist: myst-parser; extra == 'dev'
221
+ Requires-Dist: pre-commit; extra == 'dev'
222
+ Requires-Dist: pygments; extra == 'dev'
223
+ Requires-Dist: pyright; extra == 'dev'
224
+ Requires-Dist: pytest; extra == 'dev'
225
+ Requires-Dist: pytest-asyncio; extra == 'dev'
226
+ Requires-Dist: pytest-cov; extra == 'dev'
227
+ Requires-Dist: pytest-env; extra == 'dev'
228
+ Requires-Dist: pytest-json-report; extra == 'dev'
229
+ Requires-Dist: pytest-mock; extra == 'dev'
230
+ Requires-Dist: pytest-testmon; extra == 'dev'
231
+ Requires-Dist: pytest-timeout; extra == 'dev'
232
+ Requires-Dist: pytest-xdist; extra == 'dev'
233
+ Requires-Dist: python-lsp-server; extra == 'dev'
234
+ Requires-Dist: pyyaml; extra == 'dev'
235
+ Requires-Dist: rope; extra == 'dev'
236
+ Requires-Dist: ruff; extra == 'dev'
237
+ Requires-Dist: setuptools; extra == 'dev'
238
+ Requires-Dist: sphinx; extra == 'dev'
239
+ Requires-Dist: sphinx-autobuild; extra == 'dev'
240
+ Requires-Dist: sphinx-autodoc-typehints; extra == 'dev'
241
+ Requires-Dist: sphinx-rtd-theme; extra == 'dev'
242
+ Requires-Dist: stdlib-list; extra == 'dev'
243
+ Requires-Dist: tomlkit; extra == 'dev'
244
+ Requires-Dist: twine; extra == 'dev'
245
+ Requires-Dist: types-pyyaml; extra == 'dev'
246
+ Requires-Dist: types-requests; extra == 'dev'
247
+ Requires-Dist: types-setuptools; extra == 'dev'
248
+ Requires-Dist: wheel; extra == 'dev'
249
+ Provides-Extra: devtools
250
+ Requires-Dist: joblib; extra == 'devtools'
251
+ Requires-Dist: matplotlib; extra == 'devtools'
252
+ Requires-Dist: ruamel-yaml; extra == 'devtools'
253
+ Requires-Dist: scipy; extra == 'devtools'
254
+ Requires-Dist: seaborn; extra == 'devtools'
255
+ Requires-Dist: xarray; extra == 'devtools'
256
+ Provides-Extra: diagram
257
+ Requires-Dist: pyyaml; extra == 'diagram'
258
+ Provides-Extra: dsp
259
+ Requires-Dist: h5py; extra == 'dsp'
260
+ Requires-Dist: joblib; extra == 'dsp'
261
+ Requires-Dist: matplotlib; extra == 'dsp'
262
+ Requires-Dist: readchar; extra == 'dsp'
263
+ Requires-Dist: ruamel-yaml; extra == 'dsp'
264
+ Requires-Dist: scipy; extra == 'dsp'
265
+ Requires-Dist: seaborn; extra == 'dsp'
266
+ Requires-Dist: sounddevice; extra == 'dsp'
267
+ Requires-Dist: tensorpac; extra == 'dsp'
268
+ Requires-Dist: xarray; extra == 'dsp'
269
+ Provides-Extra: dt
270
+ Requires-Dist: matplotlib; extra == 'dt'
271
+ Provides-Extra: gen
272
+ Requires-Dist: h5py; extra == 'gen'
273
+ Requires-Dist: ipython; extra == 'gen'
274
+ Requires-Dist: joblib; extra == 'gen'
275
+ Requires-Dist: matplotlib; extra == 'gen'
276
+ Requires-Dist: pyperclip; extra == 'gen'
277
+ Requires-Dist: readchar; extra == 'gen'
278
+ Requires-Dist: requests; extra == 'gen'
279
+ Requires-Dist: scipy; extra == 'gen'
280
+ Requires-Dist: xarray; extra == 'gen'
281
+ Provides-Extra: git
282
+ Requires-Dist: gitpython; extra == 'git'
283
+ Requires-Dist: matplotlib; extra == 'git'
284
+ Provides-Extra: heavy
285
+ Requires-Dist: catboost; extra == 'heavy'
286
+ Requires-Dist: jax; extra == 'heavy'
287
+ Requires-Dist: julius; extra == 'heavy'
288
+ Requires-Dist: mne; extra == 'heavy'
289
+ Requires-Dist: optuna; extra == 'heavy'
290
+ Requires-Dist: psutil; extra == 'heavy'
291
+ Requires-Dist: pytorch-pretrained-vit; extra == 'heavy'
292
+ Requires-Dist: ripple-detection; extra == 'heavy'
293
+ Requires-Dist: tensorflow; extra == 'heavy'
294
+ Requires-Dist: torch; extra == 'heavy'
295
+ Requires-Dist: torchaudio; extra == 'heavy'
296
+ Requires-Dist: torchsummary; extra == 'heavy'
297
+ Requires-Dist: torchvision; extra == 'heavy'
298
+ Requires-Dist: umap-learn; extra == 'heavy'
299
+ Provides-Extra: io
300
+ Requires-Dist: gitpython; extra == 'io'
301
+ Requires-Dist: h5py; extra == 'io'
302
+ Requires-Dist: html2text; extra == 'io'
303
+ Requires-Dist: joblib; extra == 'io'
304
+ Requires-Dist: lxml; extra == 'io'
305
+ Requires-Dist: lxml-html-clean; extra == 'io'
306
+ Requires-Dist: markdown; extra == 'io'
307
+ Requires-Dist: matplotlib; extra == 'io'
308
+ Requires-Dist: natsort; extra == 'io'
309
+ Requires-Dist: numcodecs; extra == 'io'
310
+ Requires-Dist: openpyxl; extra == 'io'
311
+ Requires-Dist: pdfplumber; extra == 'io'
312
+ Requires-Dist: piexif; extra == 'io'
313
+ Requires-Dist: pillow; extra == 'io'
314
+ Requires-Dist: plotly; extra == 'io'
315
+ Requires-Dist: pyarrow; extra == 'io'
316
+ Requires-Dist: pymatreader; extra == 'io'
317
+ Requires-Dist: pymupdf; extra == 'io'
318
+ Requires-Dist: pypdf; extra == 'io'
319
+ Requires-Dist: pypdf2; extra == 'io'
320
+ Requires-Dist: python-docx; extra == 'io'
321
+ Requires-Dist: pyyaml; extra == 'io'
322
+ Requires-Dist: qrcode[pil]; extra == 'io'
323
+ Requires-Dist: ruamel-yaml; extra == 'io'
324
+ Requires-Dist: scipy; extra == 'io'
325
+ Requires-Dist: tqdm; extra == 'io'
326
+ Requires-Dist: xarray; extra == 'io'
327
+ Requires-Dist: xlrd; extra == 'io'
328
+ Requires-Dist: zarr; extra == 'io'
329
+ Provides-Extra: linalg
330
+ Requires-Dist: geom-median; extra == 'linalg'
331
+ Requires-Dist: joblib; extra == 'linalg'
332
+ Requires-Dist: matplotlib; extra == 'linalg'
333
+ Requires-Dist: scipy; extra == 'linalg'
334
+ Requires-Dist: sympy; extra == 'linalg'
335
+ Requires-Dist: xarray; extra == 'linalg'
336
+ Provides-Extra: logging
337
+ Requires-Dist: matplotlib; extra == 'logging'
338
+ Provides-Extra: msword
339
+ Requires-Dist: pypandoc; extra == 'msword'
340
+ Requires-Dist: python-docx; extra == 'msword'
341
+ Provides-Extra: nn
342
+ Requires-Dist: h5py; extra == 'nn'
343
+ Requires-Dist: ipdb; extra == 'nn'
344
+ Requires-Dist: joblib; extra == 'nn'
345
+ Requires-Dist: matplotlib; extra == 'nn'
346
+ Requires-Dist: readchar; extra == 'nn'
347
+ Requires-Dist: ruamel-yaml; extra == 'nn'
348
+ Requires-Dist: seaborn; extra == 'nn'
349
+ Requires-Dist: tensorpac; extra == 'nn'
350
+ Requires-Dist: xarray; extra == 'nn'
351
+ Provides-Extra: parallel
352
+ Requires-Dist: tqdm; extra == 'parallel'
353
+ Provides-Extra: path
354
+ Requires-Dist: gitpython; extra == 'path'
355
+ Requires-Dist: matplotlib; extra == 'path'
356
+ Provides-Extra: pd
357
+ Requires-Dist: xarray; extra == 'pd'
358
+ Provides-Extra: plt
359
+ Requires-Dist: joblib; extra == 'plt'
360
+ Requires-Dist: matplotlib; extra == 'plt'
361
+ Requires-Dist: piexif; extra == 'plt'
362
+ Requires-Dist: pillow; extra == 'plt'
363
+ Requires-Dist: pyyaml; extra == 'plt'
364
+ Requires-Dist: ruamel-yaml; extra == 'plt'
365
+ Requires-Dist: scipy; extra == 'plt'
366
+ Requires-Dist: seaborn; extra == 'plt'
367
+ Requires-Dist: termplotlib; extra == 'plt'
368
+ Requires-Dist: xarray; extra == 'plt'
369
+ Provides-Extra: repro
370
+ Requires-Dist: matplotlib; extra == 'repro'
371
+ Provides-Extra: resource
372
+ Requires-Dist: h5py; extra == 'resource'
373
+ Requires-Dist: joblib; extra == 'resource'
374
+ Requires-Dist: matplotlib; extra == 'resource'
375
+ Requires-Dist: psutil; extra == 'resource'
376
+ Requires-Dist: pyyaml; extra == 'resource'
377
+ Requires-Dist: readchar; extra == 'resource'
378
+ Requires-Dist: ruamel-yaml; extra == 'resource'
379
+ Requires-Dist: scipy; extra == 'resource'
380
+ Provides-Extra: scholar
381
+ Requires-Dist: aiohttp; extra == 'scholar'
382
+ Requires-Dist: beautifulsoup4; extra == 'scholar'
383
+ Requires-Dist: bibtexparser; extra == 'scholar'
384
+ Requires-Dist: crawl4ai; extra == 'scholar'
385
+ Requires-Dist: feedparser; extra == 'scholar'
386
+ Requires-Dist: html2text; extra == 'scholar'
387
+ Requires-Dist: httpx; extra == 'scholar'
388
+ Requires-Dist: matplotlib; extra == 'scholar'
389
+ Requires-Dist: natsort; extra == 'scholar'
390
+ Requires-Dist: nest-asyncio; extra == 'scholar'
391
+ Requires-Dist: openpyxl; extra == 'scholar'
392
+ Requires-Dist: pdfplumber; extra == 'scholar'
393
+ Requires-Dist: pillow; extra == 'scholar'
394
+ Requires-Dist: playwright>=1.40.0; extra == 'scholar'
395
+ Requires-Dist: pydantic; extra == 'scholar'
396
+ Requires-Dist: pymed; extra == 'scholar'
397
+ Requires-Dist: pymupdf; extra == 'scholar'
398
+ Requires-Dist: pypdf2; extra == 'scholar'
399
+ Requires-Dist: pytesseract; extra == 'scholar'
400
+ Requires-Dist: python-docx; extra == 'scholar'
401
+ Requires-Dist: pyyaml; extra == 'scholar'
402
+ Requires-Dist: requests; extra == 'scholar'
403
+ Requires-Dist: ruamel-yaml; extra == 'scholar'
404
+ Requires-Dist: scholarly; extra == 'scholar'
405
+ Requires-Dist: scikit-learn; extra == 'scholar'
406
+ Requires-Dist: seaborn; extra == 'scholar'
407
+ Requires-Dist: selenium; extra == 'scholar'
408
+ Requires-Dist: sql-manager; extra == 'scholar'
409
+ Requires-Dist: sqlalchemy; extra == 'scholar'
410
+ Requires-Dist: tenacity; extra == 'scholar'
411
+ Requires-Dist: tqdm; extra == 'scholar'
412
+ Requires-Dist: watchdog; extra == 'scholar'
413
+ Requires-Dist: webdriver-manager; extra == 'scholar'
414
+ Provides-Extra: session
415
+ Requires-Dist: matplotlib; extra == 'session'
416
+ Requires-Dist: pyyaml; extra == 'session'
417
+ Provides-Extra: sh
418
+ Requires-Dist: matplotlib; extra == 'sh'
419
+ Provides-Extra: stats
420
+ Requires-Dist: matplotlib; extra == 'stats'
421
+ Requires-Dist: scipy; extra == 'stats'
422
+ Requires-Dist: statsmodels; extra == 'stats'
423
+ Requires-Dist: tabulate; extra == 'stats'
424
+ Provides-Extra: str
425
+ Requires-Dist: matplotlib; extra == 'str'
426
+ Requires-Dist: natsort; extra == 'str'
427
+ Requires-Dist: xarray; extra == 'str'
428
+ Provides-Extra: tex
429
+ Requires-Dist: matplotlib; extra == 'tex'
430
+ Provides-Extra: torch
431
+ Requires-Dist: torch; extra == 'torch'
432
+ Provides-Extra: types
433
+ Requires-Dist: xarray; extra == 'types'
434
+ Provides-Extra: utils
435
+ Requires-Dist: h5py; extra == 'utils'
436
+ Requires-Dist: matplotlib; extra == 'utils'
437
+ Requires-Dist: natsort; extra == 'utils'
438
+ Requires-Dist: tqdm; extra == 'utils'
439
+ Requires-Dist: xarray; extra == 'utils'
440
+ Provides-Extra: web
441
+ Requires-Dist: aiohttp; extra == 'web'
442
+ Requires-Dist: anthropic; extra == 'web'
443
+ Requires-Dist: beautifulsoup4; extra == 'web'
444
+ Requires-Dist: google-genai; extra == 'web'
445
+ Requires-Dist: groq; extra == 'web'
446
+ Requires-Dist: joblib; extra == 'web'
447
+ Requires-Dist: markdown2; extra == 'web'
448
+ Requires-Dist: matplotlib; extra == 'web'
449
+ Requires-Dist: openai; extra == 'web'
450
+ Requires-Dist: pillow; extra == 'web'
451
+ Requires-Dist: pytest-asyncio; extra == 'web'
452
+ Requires-Dist: readability-lxml; extra == 'web'
453
+ Requires-Dist: requests; extra == 'web'
454
+ Requires-Dist: ruamel-yaml; extra == 'web'
455
+ Requires-Dist: scikit-learn; extra == 'web'
456
+ Requires-Dist: scipy; extra == 'web'
457
+ Requires-Dist: seaborn; extra == 'web'
458
+ Requires-Dist: tqdm; extra == 'web'
459
+ Requires-Dist: xarray; extra == 'web'
460
+ Provides-Extra: writer
461
+ Requires-Dist: csv2latex; extra == 'writer'
462
+ Requires-Dist: gitpython; extra == 'writer'
463
+ Requires-Dist: matplotlib; extra == 'writer'
464
+ Requires-Dist: pytest-asyncio; extra == 'writer'
465
+ Requires-Dist: xlsx2csv; extra == 'writer'
466
+ Requires-Dist: yq; extra == 'writer'
467
+ Description-Content-Type: text/markdown
468
+
469
+ <!-- ---
470
+ !-- Timestamp: 2026-01-08 11:41:42
471
+ !-- Author: ywatanabe
472
+ !-- File: /home/ywatanabe/proj/scitex-code/README.md
473
+ !-- --- -->
474
+
475
+ # SciTeX
476
+
477
+ A Python framework for scientific research that makes the entire research pipeline more standardized, structured, and reproducible by automating repetitive processes.
478
+
479
+ Part of the fully open-source SciTeX project: https://scitex.ai
480
+
481
+ ## 📊 Status
482
+
483
+ <!-- badges -->
484
+ <div align="center">
485
+ <table>
486
+ <tr>
487
+ <td align="center"><strong>Package</strong></td>
488
+ <td>
489
+ <a href="https://badge.fury.io/py/scitex"><img src="https://badge.fury.io/py/scitex.svg" alt="PyPI version"></a>
490
+ <a href="https://pypi.org/project/scitex/"><img src="https://img.shields.io/pypi/pyversions/scitex.svg" alt="Python Versions"></a>
491
+ <a href="https://github.com/ywatanabe1989/SciTeX-Code/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ywatanabe1989/SciTeX-Code" alt="License"></a>
492
+ </td>
493
+ </tr>
494
+ <tr>
495
+ <td align="center"><strong>Install</strong></td>
496
+ <td>
497
+ <img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/core.json&label=core" alt="Core Install Time">
498
+ <img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/all.json&label=all" alt="All Install Time">
499
+ <img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/heavy.json&label=heavy" alt="Heavy Install Time">
500
+ <img src="https://img.shields.io/badge/uv-recommended-blue" alt="uv recommended">
501
+ </td>
502
+ </tr>
503
+ </table>
504
+ </div>
505
+
506
+ <details>
507
+ <summary><strong>Module Status - Tests & Installation</strong></summary>
508
+
509
+ ### Core Modules
510
+
511
+ | Module | Description | Install (Time) | Tests |
512
+ |--------|-------------|----------------|-------|
513
+ | [`io`](./src/scitex/io#readme) | Universal I/O (30+ formats) | `scitex[io]` ![io](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/io.json) | [![io](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-io.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-io.yml) |
514
+ | [`path`](./src/scitex/path#readme) | Path utilities | `scitex[path]` ![path](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/path.json) | [![path](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-path.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-path.yml) |
515
+ | [`str`](./src/scitex/str#readme) | String processing | `scitex[str]` ![str](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/str.json) | [![str](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-str.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-str.yml) |
516
+ | [`dict`](./src/scitex/dict#readme) | Dictionary utilities | core ![dict](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/dict.json) | [![dict](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dict.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dict.yml) |
517
+ | [`types`](./src/scitex/types#readme) | Type checking | core ![types](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/types.json) | [![types](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-types.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-types.yml) |
518
+ | [`config`](./src/scitex/config#readme) | Configuration management | `scitex[config]` ![config](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/config.json) | [![config](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-config.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-config.yml) |
519
+ | [`utils`](./src/scitex/utils#readme) | General utilities | `scitex[utils]` ![utils](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/utils.json) | [![utils](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-utils.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-utils.yml) |
520
+ | [`decorators`](./src/scitex/decorators#readme) | Function decorators | `scitex[decorators]` ![decorators](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/decorators.json) | [![decorators](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-decorators.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-decorators.yml) |
521
+ | [`logging`](./src/scitex/logging#readme) | Structured logging | `scitex[logging]` ![logging](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/logging.json) | [![logging](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-logging.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-logging.yml) |
522
+ | [`gen`](./src/scitex/gen#readme) | Project setup | `scitex[gen]` ![gen](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/gen.json) | [![gen](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-gen.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-gen.yml) |
523
+
524
+ ### Data Science & Statistics
525
+
526
+ | Module | Description | Install (Time) | Tests |
527
+ |--------|-------------|----------------|-------|
528
+ | [`stats`](./src/scitex/stats#readme) | Statistical tests & analysis | `scitex[stats]` ![stats](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/stats.json) | [![stats](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-stats.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-stats.yml) |
529
+ | [`pd`](./src/scitex/pd#readme) | Pandas extensions | `scitex[pd]` ![pd](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/pd.json) | [![pd](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-pd.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-pd.yml) |
530
+ | [`linalg`](./src/scitex/linalg#readme) | Linear algebra | `scitex[linalg]` ![linalg](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/linalg.json) | [![linalg](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-linalg.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-linalg.yml) |
531
+ | [`plt`](./src/scitex/plt#readme) | Enhanced matplotlib | `scitex[plt]` ![plt](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/plt.json) | [![plt](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-plt.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-plt.yml) |
532
+ | [`dsp`](./src/scitex/dsp#readme) | Signal processing | `scitex[dsp]` ![dsp](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/dsp.json) | [![dsp](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dsp.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dsp.yml) |
533
+
534
+ ### AI & Machine Learning
535
+
536
+ | Module | Description | Install (Time) | Tests |
537
+ |--------|-------------|----------------|-------|
538
+ | [`ai`](./src/scitex/ai#readme) | GenAI (7 providers) | `scitex[ai]` ![ai](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/ai.json) | [![ai](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-ai.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-ai.yml) |
539
+ | [`nn`](./src/scitex/nn#readme) | Neural network layers | `scitex[nn]` ![nn](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/nn.json) | [![nn](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-nn.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-nn.yml) |
540
+ | [`torch`](./src/scitex/torch#readme) | PyTorch utilities | `scitex[torch]` ![torch](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/torch.json) | [![torch](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-torch.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-torch.yml) |
541
+
542
+ ### System & Tools
543
+
544
+ | Module | Description | Install (Time) | Tests |
545
+ |--------|-------------|----------------|-------|
546
+ | [`cli`](./src/scitex/cli#readme) | Command-line tools | `scitex[cli]` ![cli](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/cli.json) | [![cli](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-cli.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-cli.yml) |
547
+ | [`sh`](./src/scitex/sh#readme) | Shell utilities | `scitex[sh]` ![sh](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/sh.json) | [![sh](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-sh.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-sh.yml) |
548
+ | [`git`](./src/scitex/git#readme) | Git operations | `scitex[git]` ![git](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/git.json) | [![git](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-git.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-git.yml) |
549
+ | [`session`](./src/scitex/session#readme) | Session management | `scitex[session]` ![session](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/session.json) | [![session](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-session.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-session.yml) |
550
+ | [`resource`](./src/scitex/resource#readme) | System monitoring | `scitex[resource]` ![resource](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/resource.json) | [![resource](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-resource.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-resource.yml) |
551
+ | [`db`](./src/scitex/db#readme) | Database abstractions | `scitex[db]` ![db](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/db.json) | [![db](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-db.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-db.yml) |
552
+
553
+ ### Research & Publishing
554
+
555
+ | Module | Description | Install (Time) | Tests |
556
+ |--------|-------------|----------------|-------|
557
+ | [`writer`](./src/scitex/writer#readme) | Document generation | `scitex[writer]` ![writer](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/writer.json) | [![writer](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-writer.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-writer.yml) |
558
+ | [`tex`](./src/scitex/tex#readme) | LaTeX processing | `scitex[tex]` ![tex](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/tex.json) | [![tex](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-tex.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-tex.yml) |
559
+ | [`msword`](./src/scitex/msword#readme) | MS Word conversion | `scitex[msword]` ![msword](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/msword.json) | [![msword](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-msword.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-msword.yml) |
560
+ | [`scholar`](./src/scitex/scholar#readme) | Literature management | `scitex[scholar]` ![scholar](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/scholar.json) | [![scholar](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-scholar.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-scholar.yml) |
561
+ | [`diagram`](./src/scitex/diagram#readme) | Diagram generation | `scitex[diagram]` ![diagram](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/diagram.json) | [![diagram](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-diagram.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-diagram.yml) |
562
+
563
+ ### Web & Automation
564
+
565
+ | Module | Description | Install (Time) | Tests |
566
+ |--------|-------------|----------------|-------|
567
+ | [`web`](./src/scitex/web#readme) | Web scraping | `scitex[web]` ![web](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/web.json) | [![web](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-web.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-web.yml) |
568
+ | [`browser`](./src/scitex/browser#readme) | Browser automation | `scitex[browser]` ![browser](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/browser.json) | [![browser](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-browser.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-browser.yml) |
569
+
570
+ ### Other Modules
571
+
572
+ | Module | Description | Install (Time) | Tests |
573
+ |--------|-------------|----------------|-------|
574
+ | [`audio`](./src/scitex/audio#readme) | Audio processing | `scitex[audio]` ![audio](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/audio.json) | [![audio](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-audio.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-audio.yml) |
575
+ | [`capture`](./src/scitex/capture#readme) | Screen capture | `scitex[capture]` ![capture](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/capture.json) | [![capture](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-capture.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-capture.yml) |
576
+ | [`repro`](./src/scitex/repro#readme) | Reproducibility | `scitex[repro]` ![repro](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/repro.json) | [![repro](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-repro.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-repro.yml) |
577
+ | [`benchmark`](./src/scitex/benchmark#readme) | Performance testing | `scitex[benchmark]` ![benchmark](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/benchmark.json) | [![benchmark](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-benchmark.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-benchmark.yml) |
578
+ | [`security`](./src/scitex/security#readme) | Security utilities | `scitex[security]` ![security](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/security.json) | [![security](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-security.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-security.yml) |
579
+ | [`dt`](./src/scitex/dt#readme) | Datetime utilities | `scitex[dt]` ![dt](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/dt.json) | [![dt](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dt.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dt.yml) |
580
+ | [`dev`](./src/scitex/dev#readme) | Development tools | `scitex[dev]` ![dev](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/dev.json) | [![dev](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dev.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dev.yml) |
581
+ | [`schema`](./src/scitex/schema#readme) | Data schemas | `scitex[schema]` ![schema](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/schema.json) | [![schema](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-schema.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-schema.yml) |
582
+ | [`bridge`](./src/scitex/bridge#readme) | Module integration | `scitex[bridge]` ![bridge](https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/bridge.json) | [![bridge](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-bridge.yml/badge.svg)](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-bridge.yml) |
583
+
584
+ </details>
585
+
586
+ ## 📦 Installation
587
+
588
+ ``` bash
589
+ uv pip install scitex[all] # Recommended: Full installation with all modules
590
+ uv pip install scitex # Core only (numpy, pandas, PyYAML, tqdm)
591
+ uv pip install scitex[heavy] # Include heavy deps (torch, mne, optuna, etc.)
592
+ ```
593
+
594
+ > **Note**: Heavy dependencies (torch, mne, optuna, catboost, jax, tensorflow, umap-learn)
595
+ > are optional and NOT included by default. Install with `scitex[heavy]` if needed.
596
+ > Modules gracefully handle missing dependencies with `*_AVAILABLE` flags.
597
+
598
+ <details>
599
+ <summary><strong>Arial Font Setup for Figures</strong></summary>
600
+
601
+ ``` bash
602
+ # Ubuntu
603
+ sudo apt update
604
+ sudo apt-get install ttf-mscorefonts-installer
605
+ sudo DEBIAN_FRONTEND=noninteractive \
606
+ apt install -y ttf-mscorefonts-installer
607
+ sudo mkdir -p /usr/share/fonts/truetype/custom
608
+ sudo cp /mnt/c/Windows/Fonts/arial*.ttf /usr/share/fonts/truetype/custom/
609
+ sudo fc-cache -fv
610
+ rm ~/.cache/matplotlib -rf
611
+
612
+ # WSL
613
+ mkdir -p ~/.local/share/fonts/windows
614
+ cp /mnt/c/Windows/Fonts/arial*.ttf ~/.local/share/fonts/windows/
615
+ fc-cache -fv ~/.local/share/fonts/windows
616
+ rm ~/.cache/matplotlib -rf
617
+ ```
618
+
619
+ ``` python
620
+ # Check
621
+ import matplotlib
622
+ print(matplotlib.rcParams['font.family'])
623
+
624
+ import matplotlib.font_manager as fm
625
+ fonts = fm.findSystemFonts()
626
+ print("Arial found:", any("Arial" in f or "arial" in f for f in fonts))
627
+ [a for a in fonts if "Arial" in a or "arial" in a][:5]
628
+
629
+ import matplotlib as mpl
630
+ import matplotlib.pyplot as plt
631
+
632
+ mpl.rcParams["font.family"] = "Arial"
633
+ mpl.rcParams["font.sans-serif"] = ["Arial"] # 念のため
634
+
635
+ fig, ax = plt.subplots(figsize=(3, 2))
636
+ ax.text(0.5, 0.5, "Arial Test", fontsize=32, ha="center", va="center")
637
+ ax.set_axis_off()
638
+
639
+ fig.savefig("arial_test.png", dpi=300)
640
+ plt.close(fig)
641
+ ```
642
+
643
+ </details>
644
+
645
+ ## Why SciTeX?
646
+
647
+ SciTeX automates research analysis code.
648
+
649
+ <!-- **What SciTeX Automates:**
650
+ !-- - ✅ Symlink management for centralized outputs
651
+ !-- - ✅ Error handling and directory cleanup
652
+ !-- - ✅ Global variable injection (CONFIG, plt, COLORS, logger, rng)
653
+ !--
654
+ !-- **Research Benefits:**
655
+ !-- - 📊 **Figures + data always together** - CSV auto-exported from every plot
656
+ !-- - 🔄 **Perfect reproducibility** - Every run tracked with unique session ID
657
+ !-- - 🌍 **Universal format** - CSV data readable anywhere
658
+ !-- - 📝 **Zero manual work** - Metadata embedded automatically
659
+ !-- - 🎯 **3.3× less code** - Focus on research, not infrastructure -->
660
+
661
+
662
+ <details>
663
+ <summary><strong><code>@scitex.session</code></strong> — Reproducible Experiment Tracking + Auto-CLI</summary>
664
+
665
+ Standardized outputs with automatic logging. Scripts and outputs closely linked for full traceability.
666
+
667
+ **Auto-CLI Generation**: Function arguments automatically become argparse options:
668
+
669
+ ```python
670
+ # /path/to/script.py
671
+ import scitex as stx
672
+
673
+ @stx.session
674
+ def main(
675
+ # arg1, # Required: -a ARG1, --arg1 ARG1
676
+ # kwarg1="value1", # Optional: -k KWARG1, --kwarg1 KWARG1 (default: value1)
677
+ CONFIG=stx.INJECTED, # Auto-injected from $(pwd)/config/*.yaml files
678
+ plt=stx.INJECTED, # Pre-configured matplotlib
679
+ COLORS=stx.INJECTED, # Color palette
680
+ rng=stx.INJECTED, # Seeded random generator
681
+ logger=stx.INJECTED, # Session logger
682
+ ):
683
+ """This docstring becomes --help description."""
684
+
685
+ stx.io.save(results, "results.csv", symlink_to="./data/")
686
+ # SUCC: Saved to: /path/to/script_out/tmp.txt (4.0 B)
687
+ # SUCC: Symlinked: /path/to/script_out/tmp.txt ->
688
+ # SUCC: ./data/tmp.txt
689
+
690
+ return 0
691
+ ```
692
+
693
+ ```bash
694
+ $ python script.py --help
695
+ usage: script.py [-a ARG1] [-k KWARG1]
696
+ -a ARG1, --arg1 ARG1 (required)
697
+ -k KWARG1, --kwarg1 KWARG1 (default: value1)
698
+
699
+ $ python script.py -a myvalue
700
+ # Runs with arg1="myvalue", kwarg1="value1"
701
+ ```
702
+
703
+ **Output Structure**:
704
+ ```bash
705
+ /path/to/script.py
706
+ /path/to/script_out/
707
+ ├── FINISHED_SUCCESS/
708
+ │ └── 2025-01-08_12-30-00_AbC1/ # Session ID allocated
709
+ │ ├── results.csv
710
+ │ ├── CONFIGS/
711
+ │ │ ├── CONFIG.pkl # Python object
712
+ │ │ └── CONFIG.yaml # Human-readable
713
+ │ └── logs/
714
+ │ ├── stderr.log # Standard Errors
715
+ │ └── stdout.log # Standard Outputs
716
+ ├── FINISHED_FAILED/
717
+ │ └── ...
718
+ └── RUNNING/
719
+ └── ...
720
+ ```
721
+
722
+ </details>
723
+
724
+ <details>
725
+ <summary><strong><code>scitex.plt</code></strong> — Auto-Export Figures with Data</summary>
726
+
727
+ Figures and data always together. CSV auto-exported from every plot.
728
+
729
+ ```python
730
+ import scitex as stx
731
+
732
+ fig, ax = stx.plt.subplots()
733
+ ax.plot_line(x, y) # Data tracked automatically
734
+ stx.io.save(fig, "plot.png")
735
+ # Creates: plot.png + plot.csv
736
+ ```
737
+
738
+ </details>
739
+
740
+ <details>
741
+ <summary><strong><code>scitex.io</code></strong> — Universal File I/O (30+ formats)</summary>
742
+
743
+ One API for all formats: CSV, JSON, YAML, pickle, NumPy, HDF5, Zarr, PyTorch, images, PDFs, EEG formats.
744
+
745
+ ```python
746
+ import scitex as stx
747
+
748
+ # Unified API Call for +30 formats
749
+ stx.io.save(df, "output.csv")
750
+ stx.io.save(arr, "output.npy")
751
+ stx.io.save(fig, "output.jpg")
752
+
753
+ # Round Trip Loading
754
+ df = stx.io.load("output.csv")
755
+ arr = stx.io.load("output.npy")
756
+ ```
757
+
758
+ </details>
759
+
760
+ <details>
761
+ <summary><strong><code>scitex.stats</code></strong> — Publication-Ready Statistics (23 tests)</summary>
762
+
763
+ Automatic assumption checking, effect sizes, multiple comparison corrections, 9 export formats.
764
+
765
+ ```python
766
+ import scitex as stx
767
+
768
+ result = stx.stats.test_ttest_ind(
769
+ group1, group2,
770
+ return_as="dataframe" # or "latex", "markdown", "excel"
771
+ )
772
+ # Includes: p-value, effect size, CI, normality check, power analysis
773
+ ```
774
+
775
+ </details>
776
+
777
+ <details>
778
+ <summary><strong><code>scitex.scholar</code></strong> — Literature Management & BibTeX Enrichment</summary>
779
+
780
+ BibTeX enrichment with abstracts for LLM context, DOI resolution, PDF download, Impact Factor.
781
+
782
+ ```bash
783
+ scitex scholar bibtex papers.bib --project myresearch --num-workers 8
784
+ ```
785
+
786
+ ```bibtex
787
+ # Before: Minimal BibTeX
788
+ @article{Smith2024,
789
+ title = {Neural Networks},
790
+ author = {Smith, John},
791
+ doi = {10.1038/s41586-024-00001-1}
792
+ }
793
+
794
+ # After: Enriched with abstract for LLM context
795
+ @article{Smith2024,
796
+ title = {Neural Networks for Brain Signal Analysis},
797
+ author = {Smith, John and Lee, Alice},
798
+ doi = {10.1038/s41586-024-00001-1},
799
+ journal = {Nature},
800
+ year = {2024},
801
+ abstract = {We present a novel deep learning approach...}, # Rich context for LLMs
802
+ impact_factor = {64.8}
803
+ }
804
+ ```
805
+
806
+ </details>
807
+
808
+ <details>
809
+ <summary><strong><code>scitex.writer</code></strong> — LaTeX Manuscript Management</summary>
810
+
811
+ Python interface for LaTeX manuscripts with git-based version control.
812
+
813
+ ```python
814
+ from scitex.writer import Writer
815
+
816
+ writer = Writer("my_paper")
817
+ intro = writer.manuscript.contents.introduction
818
+
819
+ lines = intro.read()
820
+ intro.write(lines + ["New paragraph..."])
821
+ intro.commit("Update introduction")
822
+
823
+ result = writer.compile_manuscript()
824
+ ```
825
+
826
+ </details>
827
+
828
+ <details>
829
+ <summary><strong><code>scitex.ai</code></strong> — Unified AI/ML Interface (7 providers)</summary>
830
+
831
+ Single API for OpenAI, Anthropic, Google, Perplexity, DeepSeek, Groq, local models.
832
+
833
+ ```python
834
+ from scitex.ai.genai import GenAI
835
+
836
+ ai = GenAI(provider="openai")
837
+ response = ai("Explain this data pattern")
838
+
839
+ # Switch providers instantly
840
+ ai = GenAI(provider="anthropic", model="claude-3-opus-20240229")
841
+ ```
842
+
843
+ </details>
844
+
845
+ ## 🖥️ CLI Commands
846
+
847
+ SciTeX provides a comprehensive command-line interface:
848
+
849
+ <details>
850
+ <summary><strong>CLI Commands</strong></summary>
851
+
852
+ ```bash
853
+ # SciTeX Cloud (https://scitex.ai)
854
+ scitex cloud login # Login to SciTeX Cloud
855
+ scitex cloud clone user/project # Clone from cloud
856
+ scitex cloud create my-project # Create new repository
857
+ scitex cloud enrich -i refs.bib -o enriched.bib # BibTeX enrichment API
858
+
859
+ # Configuration
860
+ scitex config list # Show all configured paths
861
+ scitex config init # Initialize directories
862
+
863
+ # Research Tools
864
+ scitex scholar bibtex papers.bib # Process BibTeX, download PDFs
865
+ scitex scholar single --doi "10.1038/nature12373"
866
+
867
+ # TIP: Get BibTeX from Scholar QA (https://scholarqa.allen.ai/chat/)
868
+ # Ask questions → Export All Citations → Save as .bib file
869
+ scitex stats recommend --data data.csv
870
+
871
+ # Media
872
+ scitex audio speak "Hello world"
873
+ scitex capture snap --output screenshot.jpg
874
+
875
+ # Document Processing
876
+ scitex tex compile manuscript.tex
877
+ scitex writer compile my_paper
878
+
879
+ # Utilities
880
+ scitex resource usage # System resource monitoring
881
+ scitex security check --save # Security audit
882
+ scitex web get-urls https://example.com
883
+ scitex completion # Enable tab completion
884
+ ```
885
+
886
+ </details>
887
+
888
+ ## 🔌 MCP Servers
889
+
890
+ <details>
891
+ <summary><strong>Model Context Protocol (MCP) servers for AI agent integration</strong></summary>
892
+
893
+ SciTeX provides Model Context Protocol (MCP) servers for AI agent integration:
894
+
895
+ | Server | Description |
896
+ |--------|-------------|
897
+ | `scitex-audio` | Text-to-speech for agent feedback |
898
+ | `scitex-capture` | Screen monitoring and capture |
899
+ | `scitex-plt` | Matplotlib figure creation |
900
+ | `scitex-stats` | Automated statistical testing |
901
+ | `scitex-scholar` | PDF download and metadata enrichment |
902
+ | `scitex-diagram` | Mermaid and flowchart creation |
903
+ | `scitex-template` | Project scaffolding |
904
+ | `scitex-canvas` | Scientific figure canvas |
905
+
906
+ **Claude Desktop Configuration** (`~/.config/claude/claude_desktop_config.json`):
907
+
908
+ ```json
909
+ {
910
+ "mcpServers": {
911
+ "scitex-audio": {
912
+ "command": "scitex-audio"
913
+ },
914
+ "scitex-capture": {
915
+ "command": "scitex-capture"
916
+ },
917
+ "scitex-scholar": {
918
+ "command": "scitex-scholar"
919
+ }
920
+ }
921
+ }
922
+ ```
923
+
924
+ </details>
925
+
926
+ ## 🚀 Quick Start
927
+
928
+
929
+ ### Research Analysis with **70% Less Code**
930
+
931
+ Compare these two implementations that produce **identical research outputs**:
932
+
933
+ #### With SciTeX ([57 Lines of Code]((./examples/demo_session_plt_io.py)))
934
+
935
+ ```python
936
+ #!/usr/bin/env python3
937
+ # -*- coding: utf-8 -*-
938
+ # Timestamp: "2025-11-18 09:34:36 (ywatanabe)"
939
+ # File: /home/ywatanabe/proj/scitex-code/examples/demo_session_plt_io.py
940
+
941
+
942
+ """Minimal Demonstration for scitex.{session,io,plt}"""
943
+
944
+ import numpy as np
945
+ import scitex as stx
946
+
947
+
948
+ def demo(filename, verbose=False):
949
+ """Show metadata without QR code (just embedded)."""
950
+
951
+ # matplotlib.pyplot wrapper.
952
+ fig, ax = stx.plt.subplots()
953
+
954
+ t = np.linspace(0, 2, 1000)
955
+ signal = np.sin(2 * np.pi * 5 * t) * np.exp(-t / 2)
956
+
957
+ ax.plot_line(t, signal) # Original plot for automatic CSV export
958
+ ax.set_xyt(
959
+ "Time (s)",
960
+ "Amplitude",
961
+ "Clean Figure (metadata embedded, no QR overlay)",
962
+ )
963
+
964
+ # Saving: stx.io.save(obj, rel_path, **kwargs)
965
+ stx.io.save(
966
+ fig,
967
+ filename,
968
+ metadata={"exp": "s01", "subj": "S001"}, # with meatadata embedding
969
+ symlink_to="./data", # Symlink for centralized outputs
970
+ verbose=verbose, # Automatic terminal logging (no manual print())
971
+ )
972
+ fig.close()
973
+
974
+ # Loading: stx.io.load(path)
975
+ ldir = __file__.replace(".py", "_out")
976
+ img, meta = stx.io.load(
977
+ f"{ldir}/{filename}",
978
+ verbose=verbose,
979
+ )
980
+
981
+
982
+ @stx.session
983
+ def main(filename="demo.jpg", verbose=True):
984
+ """Run demo for scitex.{session,plt,io}."""
985
+
986
+ demo(filename, verbose=verbose)
987
+
988
+ return 0
989
+
990
+
991
+ if __name__ == "__main__":
992
+ main()
993
+ ```
994
+
995
+
996
+ <details>
997
+ <summary><strong>Equivalent Script without SciTeX ([188 Lines of Code](./examples/demo_session_plt_io_pure_python.py)), requiring 3.3× more code</strong></summary>
998
+
999
+ ```python
1000
+ #!/usr/bin/env python3
1001
+ # -*- coding: utf-8 -*-
1002
+ # Timestamp: "2025-11-18 09:34:51 (ywatanabe)"
1003
+ # File: /home/ywatanabe/proj/scitex-code/examples/demo_session_plt_io_pure_python.py
1004
+
1005
+
1006
+ """Minimal Demonstration - Pure Python Version"""
1007
+
1008
+ import argparse
1009
+ import json
1010
+ import logging
1011
+ import os
1012
+ import shutil
1013
+ import sys
1014
+ from datetime import datetime
1015
+ from pathlib import Path
1016
+ import random
1017
+ import string
1018
+
1019
+ import matplotlib.pyplot as plt
1020
+ import numpy as np
1021
+ from PIL import Image
1022
+ from PIL.PngImagePlugin import PngInfo
1023
+
1024
+
1025
+ def generate_session_id():
1026
+ """Generate unique session ID."""
1027
+ timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
1028
+ random_suffix = ''.join(random.choices(string.ascii_uppercase + string.digits, k=4))
1029
+ return f"{timestamp}_{random_suffix}"
1030
+
1031
+
1032
+ def setup_logging(log_dir):
1033
+ """Set up logging infrastructure."""
1034
+ log_dir.mkdir(parents=True, exist_ok=True)
1035
+ logger = logging.getLogger(__name__)
1036
+ logger.setLevel(logging.INFO)
1037
+
1038
+ stdout_handler = logging.FileHandler(log_dir / "stdout.log")
1039
+ stderr_handler = logging.FileHandler(log_dir / "stderr.log")
1040
+ console_handler = logging.StreamHandler(sys.stdout)
1041
+
1042
+ formatter = logging.Formatter('%(levelname)s: %(message)s')
1043
+ stdout_handler.setFormatter(formatter)
1044
+ stderr_handler.setFormatter(formatter)
1045
+ console_handler.setFormatter(formatter)
1046
+
1047
+ logger.addHandler(stdout_handler)
1048
+ logger.addHandler(stderr_handler)
1049
+ logger.addHandler(console_handler)
1050
+
1051
+ return logger
1052
+
1053
+
1054
+ def save_plot_data_to_csv(fig, output_path):
1055
+ """Extract and save plot data."""
1056
+ csv_path = output_path.with_suffix('.csv')
1057
+ data_lines = ["ax_00_plot_line_0_line_x,ax_00_plot_line_0_line_y"]
1058
+
1059
+ for ax in fig.get_axes():
1060
+ for line in ax.get_lines():
1061
+ x_data = line.get_xdata()
1062
+ y_data = line.get_ydata()
1063
+ for x, y in zip(x_data, y_data):
1064
+ data_lines.append(f"{x},{y}")
1065
+
1066
+ csv_path.write_text('\n'.join(data_lines))
1067
+ return csv_path, csv_path.stat().st_size / 1024
1068
+
1069
+
1070
+ def embed_metadata_in_image(image_path, metadata):
1071
+ """Embed metadata into image file."""
1072
+ img = Image.open(image_path)
1073
+
1074
+ if image_path.suffix.lower() in ['.png']:
1075
+ pnginfo = PngInfo()
1076
+ for key, value in metadata.items():
1077
+ pnginfo.add_text(key, str(value))
1078
+ img.save(image_path, pnginfo=pnginfo)
1079
+ elif image_path.suffix.lower() in ['.jpg', '.jpeg']:
1080
+ json_path = image_path.with_suffix(image_path.suffix + '.meta.json')
1081
+ json_path.write_text(json.dumps(metadata, indent=2))
1082
+ img.save(image_path, quality=95)
1083
+
1084
+
1085
+ def save_figure(fig, output_path, metadata=None, symlink_to=None, logger=None):
1086
+ """Save figure with metadata and symlink."""
1087
+ output_path = Path(output_path)
1088
+ output_path.parent.mkdir(parents=True, exist_ok=True)
1089
+
1090
+ if metadata is None:
1091
+ metadata = {}
1092
+ metadata['url'] = 'https://scitex.ai'
1093
+
1094
+ if logger:
1095
+ logger.info(f"📝 Saving figure with metadata to: {output_path}")
1096
+ logger.info(f" • Embedded metadata: {metadata}")
1097
+
1098
+ csv_path, csv_size = save_plot_data_to_csv(fig, output_path)
1099
+ if logger:
1100
+ logger.info(f"✅ Saved to: {csv_path} ({csv_size:.1f} KiB)")
1101
+
1102
+ fig.savefig(output_path, dpi=150, bbox_inches='tight')
1103
+ embed_metadata_in_image(output_path, metadata)
1104
+
1105
+ if symlink_to:
1106
+ symlink_dir = Path(symlink_to)
1107
+ symlink_dir.mkdir(parents=True, exist_ok=True)
1108
+ symlink_path = symlink_dir / output_path.name
1109
+ if symlink_path.exists() or symlink_path.is_symlink():
1110
+ symlink_path.unlink()
1111
+ symlink_path.symlink_to(output_path.resolve())
1112
+
1113
+
1114
+ def demo(output_dir, filename, verbose=False, logger=None):
1115
+ """Generate, plot, and save signal."""
1116
+ fig, ax = plt.subplots(figsize=(8, 6))
1117
+
1118
+ t = np.linspace(0, 2, 1000)
1119
+ signal = np.sin(2 * np.pi * 5 * t) * np.exp(-t / 2)
1120
+
1121
+ ax.plot(t, signal)
1122
+ ax.set_xlabel("Time (s)")
1123
+ ax.set_ylabel("Amplitude")
1124
+ ax.set_title("Damped Oscillation")
1125
+ ax.grid(True, alpha=0.3)
1126
+
1127
+ output_path = output_dir / filename
1128
+ save_figure(fig, output_path, metadata={"exp": "s01", "subj": "S001"},
1129
+ symlink_to=output_dir.parent / "data", logger=logger)
1130
+ plt.close(fig)
1131
+
1132
+ return 0
1133
+
1134
+
1135
+ def main():
1136
+ """Run demo - Pure Python Version."""
1137
+ parser = argparse.ArgumentParser(description="Run demo - Pure Python Version")
1138
+ parser.add_argument('-f', '--filename', default='demo.jpg')
1139
+ parser.add_argument('-v', '--verbose', type=bool, default=True)
1140
+ args = parser.parse_args()
1141
+
1142
+ session_id = generate_session_id()
1143
+ script_path = Path(__file__).resolve()
1144
+ output_base = script_path.parent / (script_path.stem + "_out")
1145
+ running_dir = output_base / "RUNNING" / session_id
1146
+ logs_dir = running_dir / "logs"
1147
+ config_dir = running_dir / "CONFIGS"
1148
+
1149
+ logger = setup_logging(logs_dir)
1150
+
1151
+ print("=" * 40)
1152
+ print(f"Pure Python Demo")
1153
+ print(f"{session_id} (PID: {os.getpid()})")
1154
+ print(f"\n{script_path}")
1155
+ print(f"\nArguments:")
1156
+ print(f" filename: {args.filename}")
1157
+ print(f" verbose: {args.verbose}")
1158
+ print("=" * 40)
1159
+
1160
+ config_dir.mkdir(parents=True, exist_ok=True)
1161
+ config_data = {
1162
+ 'ID': session_id,
1163
+ 'FILE': str(script_path),
1164
+ 'SDIR_OUT': str(output_base),
1165
+ 'SDIR_RUN': str(running_dir),
1166
+ 'PID': os.getpid(),
1167
+ 'ARGS': vars(args)
1168
+ }
1169
+ (config_dir / "CONFIG.json").write_text(json.dumps(config_data, indent=2))
1170
+
1171
+ try:
1172
+ result = demo(output_base, args.filename, args.verbose, logger)
1173
+ success_dir = output_base / "FINISHED_SUCCESS" / session_id
1174
+ success_dir.parent.mkdir(parents=True, exist_ok=True)
1175
+ shutil.move(str(running_dir), str(success_dir))
1176
+ logger.info(f"\n✅ Script completed: {success_dir}")
1177
+ return result
1178
+ except Exception as e:
1179
+ error_dir = output_base / "FINISHED_ERROR" / session_id
1180
+ error_dir.parent.mkdir(parents=True, exist_ok=True)
1181
+ shutil.move(str(running_dir), str(error_dir))
1182
+ logger.error(f"\n❌ Error: {e}", exc_info=True)
1183
+ raise
1184
+
1185
+
1186
+ if __name__ == "__main__":
1187
+ sys.exit(main())
1188
+ ```
1189
+
1190
+ </details>
1191
+
1192
+
1193
+ ## 📖 Documentation
1194
+
1195
+ <details>
1196
+ <summary><strong>Resources</strong></summary>
1197
+
1198
+ ### Online Documentation
1199
+ - **[Read the Docs](https://scitex.readthedocs.io/)**: Complete API reference and guides
1200
+ - **[Interactive Examples](https://scitex.readthedocs.io/en/latest/examples/index.html)**: Browse all tutorial notebooks
1201
+ - **[Quick Start Guide](https://scitex.readthedocs.io/en/latest/getting_started.html)**: Get up and running quickly
1202
+
1203
+ ### Local Resources
1204
+ - **[Master Tutorial Index](./examples/00_SCITEX_MASTER_INDEX.ipynb)**: Comprehensive guide to all features
1205
+ - **[Examples Directory](./examples/)**: 25+ Jupyter notebooks covering all modules
1206
+ - **[Module List](./docs/scitex_modules.csv)**: Complete list of all functions
1207
+ - **(Experimental) [MCP Servers Documentation](./mcp_servers/README.md)**
1208
+
1209
+ ### Key Tutorials
1210
+ 1. **[I/O Operations](./examples/01_scitex_io.ipynb)**: Essential file handling (start here!)
1211
+ 2. **[Plotting](./examples/14_scitex_plt.ipynb)**: Publication-ready visualizations
1212
+ 3. **[Statistics](./examples/11_scitex_stats.ipynb)**: Research-grade statistical analysis
1213
+ 4. **[Scholar](./examples/16_scitex_scholar.ipynb)**: Literature management with impact factors
1214
+ 5. **[AI/ML](./examples/16_scitex_ai.ipynb)**: Complete machine learning toolkit
1215
+
1216
+ </details>
1217
+
1218
+ ## 🤝 Contributing
1219
+
1220
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
1221
+
1222
+
1223
+ ## 📄 License
1224
+
1225
+ AGPL-3.0.
1226
+
1227
+ ## 📧 Contact
1228
+
1229
+ Yusuke Watanabe (ywatanabe@scitex.ai)
1230
+
1231
+ <!-- EOF -->