scitex 2.5.0__py3-none-any.whl → 2.7.3__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 (1179) hide show
  1. scitex/__init__.py +25 -10
  2. scitex/__main__.py +2 -1
  3. scitex/__version__.py +1 -1
  4. scitex/_optional_deps.py +13 -20
  5. scitex/ai/__init__.py +5 -0
  6. scitex/ai/_gen_ai/_Anthropic.py +3 -1
  7. scitex/ai/_gen_ai/_BaseGenAI.py +3 -2
  8. scitex/ai/_gen_ai/_DeepSeek.py +1 -1
  9. scitex/ai/_gen_ai/_Google.py +3 -2
  10. scitex/ai/_gen_ai/_Llama.py +4 -2
  11. scitex/ai/_gen_ai/_OpenAI.py +3 -1
  12. scitex/ai/_gen_ai/_PARAMS.py +1 -0
  13. scitex/ai/_gen_ai/_Perplexity.py +3 -1
  14. scitex/ai/_gen_ai/__init__.py +1 -0
  15. scitex/ai/_gen_ai/_format_output_func.py +3 -1
  16. scitex/ai/classification/CrossValidationExperiment.py +8 -14
  17. scitex/ai/classification/examples/timeseries_cv_demo.py +128 -112
  18. scitex/ai/classification/reporters/_BaseClassificationReporter.py +2 -0
  19. scitex/ai/classification/reporters/_ClassificationReporter.py +30 -45
  20. scitex/ai/classification/reporters/_MultiClassificationReporter.py +8 -11
  21. scitex/ai/classification/reporters/_SingleClassificationReporter.py +126 -182
  22. scitex/ai/classification/reporters/__init__.py +1 -1
  23. scitex/ai/classification/reporters/reporter_utils/_Plotter.py +213 -119
  24. scitex/ai/classification/reporters/reporter_utils/__init__.py +28 -36
  25. scitex/ai/classification/reporters/reporter_utils/aggregation.py +125 -143
  26. scitex/ai/classification/reporters/reporter_utils/data_models.py +128 -120
  27. scitex/ai/classification/reporters/reporter_utils/reporting.py +507 -340
  28. scitex/ai/classification/reporters/reporter_utils/storage.py +4 -1
  29. scitex/ai/classification/reporters/reporter_utils/validation.py +141 -154
  30. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +204 -129
  31. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +215 -171
  32. scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +17 -17
  33. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +67 -143
  34. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +67 -143
  35. scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +12 -13
  36. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +231 -144
  37. scitex/ai/classification/timeseries/__init__.py +2 -4
  38. scitex/ai/classification/timeseries/_normalize_timestamp.py +3 -0
  39. scitex/ai/clustering/_pca.py +0 -1
  40. scitex/ai/clustering/_umap.py +1 -2
  41. scitex/ai/feature_extraction/__init__.py +10 -8
  42. scitex/ai/feature_extraction/vit.py +0 -1
  43. scitex/ai/feature_selection/feature_selection.py +3 -8
  44. scitex/ai/metrics/_calc_conf_mat.py +2 -0
  45. scitex/ai/metrics/_calc_feature_importance.py +3 -7
  46. scitex/ai/metrics/_calc_pre_rec_auc.py +5 -5
  47. scitex/ai/metrics/_calc_roc_auc.py +4 -2
  48. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +35 -20
  49. scitex/ai/metrics/_calc_silhouette_score.py +1 -3
  50. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +0 -3
  51. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +0 -3
  52. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +0 -3
  53. scitex/ai/optim/_optimizers.py +1 -1
  54. scitex/ai/plt/__init__.py +6 -1
  55. scitex/ai/plt/_plot_feature_importance.py +1 -3
  56. scitex/ai/plt/_plot_learning_curve.py +9 -24
  57. scitex/ai/plt/_plot_optuna_study.py +4 -3
  58. scitex/ai/plt/_plot_pre_rec_curve.py +9 -15
  59. scitex/ai/plt/_plot_roc_curve.py +6 -8
  60. scitex/ai/plt/_stx_conf_mat.py +121 -122
  61. scitex/ai/sampling/undersample.py +3 -2
  62. scitex/ai/sklearn/__init__.py +2 -2
  63. scitex/ai/training/_LearningCurveLogger.py +23 -10
  64. scitex/ai/utils/_check_params.py +0 -1
  65. scitex/audio/README.md +52 -0
  66. scitex/audio/__init__.py +384 -0
  67. scitex/audio/__main__.py +129 -0
  68. scitex/audio/_tts.py +334 -0
  69. scitex/audio/engines/__init__.py +44 -0
  70. scitex/audio/engines/base.py +275 -0
  71. scitex/audio/engines/elevenlabs_engine.py +143 -0
  72. scitex/audio/engines/gtts_engine.py +162 -0
  73. scitex/audio/engines/pyttsx3_engine.py +131 -0
  74. scitex/audio/mcp_server.py +757 -0
  75. scitex/benchmark/__init__.py +15 -25
  76. scitex/benchmark/benchmark.py +124 -117
  77. scitex/benchmark/monitor.py +117 -107
  78. scitex/benchmark/profiler.py +61 -58
  79. scitex/bridge/__init__.py +110 -0
  80. scitex/bridge/_helpers.py +149 -0
  81. scitex/bridge/_plt_vis.py +529 -0
  82. scitex/bridge/_protocol.py +283 -0
  83. scitex/bridge/_stats_plt.py +261 -0
  84. scitex/bridge/_stats_vis.py +265 -0
  85. scitex/browser/__init__.py +0 -2
  86. scitex/browser/auth/__init__.py +0 -0
  87. scitex/browser/auth/google.py +16 -11
  88. scitex/browser/automation/CookieHandler.py +2 -3
  89. scitex/browser/collaboration/__init__.py +3 -0
  90. scitex/browser/collaboration/auth_helpers.py +3 -1
  91. scitex/browser/collaboration/collaborative_agent.py +2 -0
  92. scitex/browser/collaboration/interactive_panel.py +2 -2
  93. scitex/browser/collaboration/shared_session.py +20 -11
  94. scitex/browser/collaboration/standard_interactions.py +1 -0
  95. scitex/browser/core/BrowserMixin.py +12 -30
  96. scitex/browser/core/ChromeProfileManager.py +9 -24
  97. scitex/browser/debugging/_browser_logger.py +15 -25
  98. scitex/browser/debugging/_failure_capture.py +9 -2
  99. scitex/browser/debugging/_highlight_element.py +15 -6
  100. scitex/browser/debugging/_show_grid.py +5 -6
  101. scitex/browser/debugging/_sync_session.py +4 -3
  102. scitex/browser/debugging/_test_monitor.py +14 -5
  103. scitex/browser/debugging/_visual_cursor.py +46 -35
  104. scitex/browser/interaction/click_center.py +4 -3
  105. scitex/browser/interaction/click_with_fallbacks.py +7 -10
  106. scitex/browser/interaction/close_popups.py +79 -66
  107. scitex/browser/interaction/fill_with_fallbacks.py +8 -8
  108. scitex/browser/pdf/__init__.py +3 -1
  109. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +11 -10
  110. scitex/browser/pdf/detect_chrome_pdf_viewer.py +3 -6
  111. scitex/browser/remote/CaptchaHandler.py +109 -96
  112. scitex/browser/remote/ZenRowsAPIClient.py +91 -97
  113. scitex/browser/remote/ZenRowsBrowserManager.py +138 -112
  114. scitex/browser/stealth/HumanBehavior.py +4 -9
  115. scitex/browser/stealth/StealthManager.py +11 -26
  116. scitex/capture/__init__.py +17 -17
  117. scitex/capture/__main__.py +2 -3
  118. scitex/capture/capture.py +23 -51
  119. scitex/capture/cli.py +14 -39
  120. scitex/capture/gif.py +5 -9
  121. scitex/capture/mcp_server.py +7 -20
  122. scitex/capture/session.py +4 -3
  123. scitex/capture/utils.py +18 -53
  124. scitex/cli/__init__.py +1 -1
  125. scitex/cli/cloud.py +158 -116
  126. scitex/cli/config.py +224 -0
  127. scitex/cli/main.py +41 -40
  128. scitex/cli/scholar.py +60 -27
  129. scitex/cli/security.py +14 -20
  130. scitex/cli/web.py +87 -90
  131. scitex/cli/writer.py +51 -45
  132. scitex/cloud/__init__.py +14 -11
  133. scitex/cloud/_matplotlib_hook.py +6 -6
  134. scitex/config/README.md +313 -0
  135. scitex/config/{PriorityConfig.py → _PriorityConfig.py} +114 -17
  136. scitex/config/_ScitexConfig.py +319 -0
  137. scitex/config/__init__.py +41 -9
  138. scitex/config/_paths.py +325 -0
  139. scitex/config/default.yaml +81 -0
  140. scitex/context/_suppress_output.py +2 -3
  141. scitex/db/_BaseMixins/_BaseBackupMixin.py +3 -1
  142. scitex/db/_BaseMixins/_BaseBatchMixin.py +3 -1
  143. scitex/db/_BaseMixins/_BaseBlobMixin.py +3 -1
  144. scitex/db/_BaseMixins/_BaseImportExportMixin.py +1 -3
  145. scitex/db/_BaseMixins/_BaseIndexMixin.py +3 -1
  146. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +1 -3
  147. scitex/db/_BaseMixins/_BaseQueryMixin.py +3 -1
  148. scitex/db/_BaseMixins/_BaseRowMixin.py +3 -1
  149. scitex/db/_BaseMixins/_BaseTableMixin.py +3 -1
  150. scitex/db/_BaseMixins/_BaseTransactionMixin.py +1 -3
  151. scitex/db/_BaseMixins/__init__.py +1 -1
  152. scitex/db/__init__.py +9 -1
  153. scitex/db/__main__.py +8 -21
  154. scitex/db/_check_health.py +15 -31
  155. scitex/db/_delete_duplicates.py +7 -4
  156. scitex/db/_inspect.py +22 -38
  157. scitex/db/_inspect_optimized.py +89 -85
  158. scitex/db/_postgresql/_PostgreSQL.py +0 -1
  159. scitex/db/_postgresql/_PostgreSQLMixins/_BlobMixin.py +3 -1
  160. scitex/db/_postgresql/_PostgreSQLMixins/_ConnectionMixin.py +1 -3
  161. scitex/db/_postgresql/_PostgreSQLMixins/_ImportExportMixin.py +1 -3
  162. scitex/db/_postgresql/_PostgreSQLMixins/_MaintenanceMixin.py +1 -4
  163. scitex/db/_postgresql/_PostgreSQLMixins/_QueryMixin.py +3 -3
  164. scitex/db/_postgresql/_PostgreSQLMixins/_RowMixin.py +3 -1
  165. scitex/db/_postgresql/_PostgreSQLMixins/_TransactionMixin.py +1 -3
  166. scitex/db/_postgresql/__init__.py +1 -1
  167. scitex/db/_sqlite3/_SQLite3.py +2 -4
  168. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +11 -12
  169. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +19 -14
  170. scitex/db/_sqlite3/_SQLite3Mixins/_BatchMixin.py +3 -1
  171. scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +7 -7
  172. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +118 -111
  173. scitex/db/_sqlite3/_SQLite3Mixins/_ConnectionMixin.py +8 -10
  174. scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +17 -45
  175. scitex/db/_sqlite3/_SQLite3Mixins/_ImportExportMixin.py +1 -3
  176. scitex/db/_sqlite3/_SQLite3Mixins/_IndexMixin.py +3 -1
  177. scitex/db/_sqlite3/_SQLite3Mixins/_QueryMixin.py +3 -4
  178. scitex/db/_sqlite3/_SQLite3Mixins/_RowMixin.py +9 -9
  179. scitex/db/_sqlite3/_SQLite3Mixins/_TableMixin.py +18 -11
  180. scitex/db/_sqlite3/_SQLite3Mixins/__init__.py +1 -0
  181. scitex/db/_sqlite3/__init__.py +1 -1
  182. scitex/db/_sqlite3/_delete_duplicates.py +13 -11
  183. scitex/decorators/__init__.py +29 -4
  184. scitex/decorators/_auto_order.py +43 -43
  185. scitex/decorators/_batch_fn.py +12 -6
  186. scitex/decorators/_cache_disk.py +8 -9
  187. scitex/decorators/_cache_disk_async.py +8 -7
  188. scitex/decorators/_combined.py +19 -13
  189. scitex/decorators/_converters.py +16 -3
  190. scitex/decorators/_deprecated.py +32 -22
  191. scitex/decorators/_numpy_fn.py +18 -4
  192. scitex/decorators/_pandas_fn.py +17 -5
  193. scitex/decorators/_signal_fn.py +17 -3
  194. scitex/decorators/_torch_fn.py +32 -15
  195. scitex/decorators/_xarray_fn.py +23 -9
  196. scitex/dev/_analyze_code_flow.py +0 -2
  197. scitex/dev/plt/__init__.py +272 -0
  198. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  199. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  200. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  201. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  202. scitex/dev/plt/plot_mpl_bar.py +29 -0
  203. scitex/dev/plt/plot_mpl_barh.py +29 -0
  204. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  205. scitex/dev/plt/plot_mpl_contour.py +31 -0
  206. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  207. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  208. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  209. scitex/dev/plt/plot_mpl_fill.py +30 -0
  210. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  211. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  212. scitex/dev/plt/plot_mpl_hist.py +28 -0
  213. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  214. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  215. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  216. scitex/dev/plt/plot_mpl_pie.py +29 -0
  217. scitex/dev/plt/plot_mpl_plot.py +29 -0
  218. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  219. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  220. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  221. scitex/dev/plt/plot_mpl_stem.py +29 -0
  222. scitex/dev/plt/plot_mpl_step.py +29 -0
  223. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  224. scitex/dev/plt/plot_sns_barplot.py +29 -0
  225. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  226. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  227. scitex/dev/plt/plot_sns_histplot.py +29 -0
  228. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  229. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  230. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  231. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  232. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  233. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  234. scitex/dev/plt/plot_stx_bar.py +29 -0
  235. scitex/dev/plt/plot_stx_barh.py +29 -0
  236. scitex/dev/plt/plot_stx_box.py +28 -0
  237. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  238. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  239. scitex/dev/plt/plot_stx_contour.py +31 -0
  240. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  241. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  242. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  243. scitex/dev/plt/plot_stx_fillv.py +28 -0
  244. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  245. scitex/dev/plt/plot_stx_image.py +28 -0
  246. scitex/dev/plt/plot_stx_imshow.py +28 -0
  247. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  248. scitex/dev/plt/plot_stx_kde.py +28 -0
  249. scitex/dev/plt/plot_stx_line.py +28 -0
  250. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  251. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  252. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  253. scitex/dev/plt/plot_stx_raster.py +28 -0
  254. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  255. scitex/dev/plt/plot_stx_scatter.py +29 -0
  256. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  257. scitex/dev/plt/plot_stx_violin.py +28 -0
  258. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  259. scitex/dict/_DotDict.py +15 -19
  260. scitex/dict/_flatten.py +1 -0
  261. scitex/dict/_listed_dict.py +1 -0
  262. scitex/dict/_pop_keys.py +1 -0
  263. scitex/dict/_replace.py +1 -0
  264. scitex/dict/_safe_merge.py +1 -0
  265. scitex/dict/_to_str.py +2 -3
  266. scitex/dsp/__init__.py +13 -4
  267. scitex/dsp/_crop.py +3 -1
  268. scitex/dsp/_detect_ripples.py +3 -1
  269. scitex/dsp/_modulation_index.py +3 -1
  270. scitex/dsp/_time.py +3 -1
  271. scitex/dsp/_wavelet.py +0 -1
  272. scitex/dsp/example.py +0 -5
  273. scitex/dsp/filt.py +4 -0
  274. scitex/dsp/utils/__init__.py +4 -1
  275. scitex/dsp/utils/pac.py +3 -3
  276. scitex/dt/_normalize_timestamp.py +4 -1
  277. scitex/errors.py +3 -6
  278. scitex/etc/__init__.py +1 -1
  279. scitex/fig/__init__.py +352 -0
  280. scitex/{vis → fig}/backend/__init__.py +3 -3
  281. scitex/{vis/backend/export.py → fig/backend/_export.py} +1 -1
  282. scitex/{vis/backend/parser.py → fig/backend/_parser.py} +2 -4
  283. scitex/{vis/backend/render.py → fig/backend/_render.py} +1 -1
  284. scitex/{vis → fig}/canvas.py +16 -4
  285. scitex/{vis → fig}/editor/__init__.py +0 -0
  286. scitex/{vis → fig}/editor/_dearpygui_editor.py +450 -304
  287. scitex/fig/editor/_defaults.py +300 -0
  288. scitex/fig/editor/_edit.py +751 -0
  289. scitex/{vis → fig}/editor/_flask_editor.py +8 -8
  290. scitex/{vis → fig}/editor/_mpl_editor.py +63 -48
  291. scitex/{vis → fig}/editor/_qt_editor.py +391 -160
  292. scitex/{vis → fig}/editor/_tkinter_editor.py +146 -89
  293. scitex/fig/editor/flask_editor/__init__.py +21 -0
  294. scitex/fig/editor/flask_editor/_bbox.py +1276 -0
  295. scitex/fig/editor/flask_editor/_core.py +624 -0
  296. scitex/fig/editor/flask_editor/_plotter.py +601 -0
  297. scitex/fig/editor/flask_editor/_renderer.py +739 -0
  298. scitex/{vis/editor/flask_editor/utils.py → fig/editor/flask_editor/_utils.py} +13 -14
  299. scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +6 -6
  300. scitex/fig/editor/flask_editor/templates/_html.py +834 -0
  301. scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
  302. scitex/fig/editor/flask_editor/templates/_styles.py +1346 -0
  303. scitex/{vis → fig}/io/__init__.py +18 -6
  304. scitex/fig/io/_bundle.py +973 -0
  305. scitex/{vis/io/canvas.py → fig/io/_canvas.py} +9 -5
  306. scitex/{vis/io/data.py → fig/io/_data.py} +14 -10
  307. scitex/{vis/io/directory.py → fig/io/_directory.py} +7 -4
  308. scitex/{vis/io/export.py → fig/io/_export.py} +16 -13
  309. scitex/{vis/io/load.py → fig/io/_load.py} +2 -2
  310. scitex/{vis/io/panel.py → fig/io/_panel.py} +22 -14
  311. scitex/{vis/io/save.py → fig/io/_save.py} +1 -1
  312. scitex/{vis → fig}/model/__init__.py +8 -8
  313. scitex/{vis/model/annotations.py → fig/model/_annotations.py} +3 -5
  314. scitex/{vis/model/axes.py → fig/model/_axes.py} +2 -2
  315. scitex/{vis/model/figure.py → fig/model/_figure.py} +1 -1
  316. scitex/{vis/model/guides.py → fig/model/_guides.py} +2 -2
  317. scitex/{vis/model/plot.py → fig/model/_plot.py} +3 -5
  318. scitex/{vis/model/plot_types.py → fig/model/_plot_types.py} +0 -0
  319. scitex/{vis/model/styles.py → fig/model/_styles.py} +1 -1
  320. scitex/{vis → fig}/utils/__init__.py +3 -3
  321. scitex/{vis/utils/defaults.py → fig/utils/_defaults.py} +1 -2
  322. scitex/{vis/utils/validate.py → fig/utils/_validate.py} +3 -9
  323. scitex/gen/_DimHandler.py +6 -6
  324. scitex/gen/__init__.py +5 -1
  325. scitex/gen/_deprecated_close.py +1 -0
  326. scitex/gen/_deprecated_start.py +5 -3
  327. scitex/gen/_detect_environment.py +44 -41
  328. scitex/gen/_detect_notebook_path.py +51 -47
  329. scitex/gen/_embed.py +1 -1
  330. scitex/gen/_get_notebook_path.py +81 -62
  331. scitex/gen/_inspect_module.py +0 -1
  332. scitex/gen/_norm.py +16 -7
  333. scitex/gen/_norm_cache.py +78 -65
  334. scitex/gen/_print_config.py +0 -3
  335. scitex/gen/_src.py +2 -3
  336. scitex/gen/_title_case.py +3 -2
  337. scitex/gen/_to_even.py +8 -8
  338. scitex/gen/_transpose.py +3 -3
  339. scitex/gen/misc.py +0 -3
  340. scitex/gists/_SigMacro_processFigure_S.py +2 -2
  341. scitex/gists/_SigMacro_toBlue.py +2 -2
  342. scitex/gists/__init__.py +4 -1
  343. scitex/git/_branch.py +19 -11
  344. scitex/git/_clone.py +23 -15
  345. scitex/git/_commit.py +10 -12
  346. scitex/git/_init.py +15 -38
  347. scitex/git/_remote.py +9 -3
  348. scitex/git/_result.py +3 -0
  349. scitex/git/_retry.py +2 -5
  350. scitex/git/_types.py +4 -0
  351. scitex/git/_validation.py +8 -8
  352. scitex/git/_workflow.py +4 -4
  353. scitex/io/__init__.py +12 -27
  354. scitex/io/_bundle.py +434 -0
  355. scitex/io/_flush.py +5 -2
  356. scitex/io/_glob.py +2 -2
  357. scitex/io/_json2md.py +3 -3
  358. scitex/io/_load.py +104 -8
  359. scitex/io/_load_cache.py +71 -71
  360. scitex/io/_load_configs.py +2 -3
  361. scitex/io/_load_modules/_H5Explorer.py +11 -14
  362. scitex/io/_load_modules/_ZarrExplorer.py +3 -3
  363. scitex/io/_load_modules/_bibtex.py +62 -63
  364. scitex/io/_load_modules/_canvas.py +6 -11
  365. scitex/io/_load_modules/_catboost.py +7 -2
  366. scitex/io/_load_modules/_hdf5.py +2 -0
  367. scitex/io/_load_modules/_image.py +7 -4
  368. scitex/io/_load_modules/_matlab.py +3 -1
  369. scitex/io/_load_modules/_optuna.py +0 -1
  370. scitex/io/_load_modules/_pdf.py +38 -29
  371. scitex/io/_load_modules/_sqlite3.py +1 -0
  372. scitex/io/_load_modules/_txt.py +6 -2
  373. scitex/io/_load_modules/_xml.py +9 -9
  374. scitex/io/_load_modules/_zarr.py +12 -10
  375. scitex/io/_metadata.py +34 -285
  376. scitex/io/_metadata_modules/__init__.py +46 -0
  377. scitex/io/_metadata_modules/_embed.py +70 -0
  378. scitex/io/_metadata_modules/_read.py +64 -0
  379. scitex/io/_metadata_modules/_utils.py +79 -0
  380. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  381. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  382. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  383. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  384. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  385. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  386. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  387. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  388. scitex/io/_qr_utils.py +21 -14
  389. scitex/io/_save.py +755 -80
  390. scitex/io/_save_modules/__init__.py +7 -2
  391. scitex/io/_save_modules/_bibtex.py +66 -61
  392. scitex/io/_save_modules/_canvas.py +8 -9
  393. scitex/io/_save_modules/_catboost.py +2 -2
  394. scitex/io/_save_modules/_csv.py +4 -4
  395. scitex/io/_save_modules/_excel.py +5 -9
  396. scitex/io/_save_modules/_hdf5.py +9 -21
  397. scitex/io/_save_modules/_html.py +5 -5
  398. scitex/io/_save_modules/_image.py +107 -14
  399. scitex/io/_save_modules/_joblib.py +2 -2
  400. scitex/io/_save_modules/_json.py +51 -6
  401. scitex/io/_save_modules/_listed_dfs_as_csv.py +2 -1
  402. scitex/io/_save_modules/_listed_scalars_as_csv.py +2 -1
  403. scitex/io/_save_modules/_matlab.py +2 -2
  404. scitex/io/_save_modules/_numpy.py +6 -8
  405. scitex/io/_save_modules/_pickle.py +4 -4
  406. scitex/io/_save_modules/_plotly.py +3 -3
  407. scitex/io/_save_modules/_tex.py +30 -29
  408. scitex/io/_save_modules/_text.py +2 -2
  409. scitex/io/_save_modules/_yaml.py +9 -9
  410. scitex/io/_save_modules/_zarr.py +15 -15
  411. scitex/io/utils/__init__.py +2 -1
  412. scitex/io/utils/h5_to_zarr.py +183 -163
  413. scitex/linalg/__init__.py +1 -1
  414. scitex/linalg/_geometric_median.py +4 -3
  415. scitex/logging/_Tee.py +5 -7
  416. scitex/logging/__init__.py +18 -19
  417. scitex/logging/_config.py +4 -1
  418. scitex/logging/_context.py +6 -5
  419. scitex/logging/_formatters.py +2 -3
  420. scitex/logging/_handlers.py +19 -20
  421. scitex/logging/_levels.py +9 -17
  422. scitex/logging/_logger.py +74 -15
  423. scitex/logging/_print_capture.py +17 -17
  424. scitex/msword/__init__.py +255 -0
  425. scitex/msword/profiles.py +357 -0
  426. scitex/msword/reader.py +753 -0
  427. scitex/msword/utils.py +289 -0
  428. scitex/msword/writer.py +362 -0
  429. scitex/nn/_BNet.py +1 -3
  430. scitex/nn/_Filters.py +6 -2
  431. scitex/nn/_ModulationIndex.py +3 -1
  432. scitex/nn/_PAC.py +3 -2
  433. scitex/nn/_PSD.py +0 -1
  434. scitex/nn/__init__.py +16 -3
  435. scitex/path/_clean.py +10 -8
  436. scitex/path/_find.py +1 -1
  437. scitex/path/_get_spath.py +1 -2
  438. scitex/path/_mk_spath.py +1 -1
  439. scitex/path/_symlink.py +5 -10
  440. scitex/pd/__init__.py +4 -1
  441. scitex/pd/_force_df.py +24 -24
  442. scitex/pd/_get_unique.py +1 -0
  443. scitex/pd/_merge_columns.py +1 -1
  444. scitex/pd/_round.py +11 -7
  445. scitex/pd/_to_xy.py +0 -1
  446. scitex/plt/__init__.py +190 -89
  447. scitex/plt/_subplots/_AxesWrapper.py +28 -12
  448. scitex/plt/_subplots/_AxisWrapper.py +114 -47
  449. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  450. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  451. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  452. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  453. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  454. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  455. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  456. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  457. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  458. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  459. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  460. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  461. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  462. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +26 -14
  463. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +80 -73
  464. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  465. scitex/plt/_subplots/_FigWrapper.py +97 -64
  466. scitex/plt/_subplots/_SubplotsWrapper.py +161 -84
  467. scitex/plt/_subplots/__init__.py +10 -0
  468. scitex/plt/_subplots/_export_as_csv.py +124 -52
  469. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +9 -0
  470. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +14 -23
  471. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +88 -38
  472. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +25 -31
  473. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +53 -23
  474. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +38 -25
  475. scitex/plt/_subplots/_export_as_csv_formatters/_format_contourf.py +17 -9
  476. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +70 -124
  477. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +30 -17
  478. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +31 -17
  479. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +33 -21
  480. scitex/plt/_subplots/_export_as_csv_formatters/_format_hexbin.py +14 -4
  481. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +43 -29
  482. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist2d.py +14 -4
  483. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +27 -11
  484. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +34 -16
  485. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +16 -8
  486. scitex/plt/_subplots/_export_as_csv_formatters/_format_pie.py +15 -6
  487. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +85 -46
  488. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +52 -27
  489. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +14 -1
  490. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +27 -18
  491. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +14 -5
  492. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +16 -8
  493. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +17 -6
  494. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +43 -26
  495. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +68 -47
  496. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +52 -64
  497. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +55 -50
  498. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +23 -10
  499. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +63 -29
  500. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +48 -40
  501. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +20 -6
  502. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +44 -40
  503. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +46 -39
  504. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +46 -39
  505. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +75 -94
  506. scitex/plt/_subplots/_export_as_csv_formatters/_format_stem.py +12 -3
  507. scitex/plt/_subplots/_export_as_csv_formatters/_format_step.py +12 -3
  508. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +17 -9
  509. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  510. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  511. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +31 -18
  512. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  513. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +24 -11
  514. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  515. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_fillv.py +35 -31
  516. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +33 -23
  517. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +44 -28
  518. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  519. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +31 -12
  520. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_line.py +34 -23
  521. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +32 -26
  522. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +29 -23
  523. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +32 -26
  524. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +21 -11
  525. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_rectangle.py +84 -56
  526. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  527. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +46 -34
  528. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_shaded_line.py +46 -30
  529. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_violin.py +51 -51
  530. scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +32 -31
  531. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +34 -31
  532. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +44 -37
  533. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +91 -74
  534. scitex/plt/_tpl.py +6 -5
  535. scitex/plt/ax/_plot/__init__.py +24 -0
  536. scitex/plt/ax/_plot/_add_fitted_line.py +12 -11
  537. scitex/plt/ax/_plot/_plot_circular_hist.py +3 -1
  538. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +25 -19
  539. scitex/plt/ax/_plot/_stx_conf_mat.py +6 -3
  540. scitex/plt/ax/_plot/_stx_ecdf.py +9 -5
  541. scitex/plt/ax/_plot/_stx_fillv.py +4 -2
  542. scitex/plt/ax/_plot/_stx_heatmap.py +7 -4
  543. scitex/plt/ax/_plot/_stx_image.py +7 -5
  544. scitex/plt/ax/_plot/_stx_joyplot.py +32 -10
  545. scitex/plt/ax/_plot/_stx_raster.py +26 -11
  546. scitex/plt/ax/_plot/_stx_rectangle.py +2 -2
  547. scitex/plt/ax/_plot/_stx_shaded_line.py +15 -11
  548. scitex/plt/ax/_plot/_stx_violin.py +3 -1
  549. scitex/plt/ax/_style/_add_marginal_ax.py +6 -4
  550. scitex/plt/ax/_style/_auto_scale_axis.py +14 -10
  551. scitex/plt/ax/_style/_extend.py +3 -1
  552. scitex/plt/ax/_style/_force_aspect.py +5 -3
  553. scitex/plt/ax/_style/_format_units.py +2 -2
  554. scitex/plt/ax/_style/_hide_spines.py +5 -1
  555. scitex/plt/ax/_style/_map_ticks.py +5 -3
  556. scitex/plt/ax/_style/_rotate_labels.py +5 -4
  557. scitex/plt/ax/_style/_rotate_labels_v01.py +73 -63
  558. scitex/plt/ax/_style/_set_log_scale.py +120 -85
  559. scitex/plt/ax/_style/_set_meta.py +99 -76
  560. scitex/plt/ax/_style/_set_supxyt.py +33 -16
  561. scitex/plt/ax/_style/_set_xyt.py +27 -18
  562. scitex/plt/ax/_style/_share_axes.py +15 -5
  563. scitex/plt/ax/_style/_show_spines.py +58 -57
  564. scitex/plt/ax/_style/_style_barplot.py +1 -1
  565. scitex/plt/ax/_style/_style_boxplot.py +25 -14
  566. scitex/plt/ax/_style/_style_errorbar.py +0 -0
  567. scitex/plt/ax/_style/_style_scatter.py +1 -1
  568. scitex/plt/ax/_style/_style_suptitles.py +3 -3
  569. scitex/plt/ax/_style/_style_violinplot.py +8 -2
  570. scitex/plt/color/__init__.py +34 -2
  571. scitex/plt/color/_add_hue_col.py +1 -0
  572. scitex/plt/color/_colors.py +0 -1
  573. scitex/plt/color/_get_colors_from_conf_matap.py +3 -1
  574. scitex/plt/color/_vizualize_colors.py +0 -1
  575. scitex/plt/docs/FIGURE_ARCHITECTURE.md +155 -97
  576. scitex/plt/gallery/README.md +75 -0
  577. scitex/plt/gallery/__init__.py +29 -0
  578. scitex/plt/gallery/_generate.py +560 -0
  579. scitex/plt/gallery/_plots.py +594 -0
  580. scitex/plt/gallery/_registry.py +153 -0
  581. scitex/plt/io/__init__.py +53 -0
  582. scitex/plt/io/_bundle.py +490 -0
  583. scitex/plt/io/_layered_bundle.py +1343 -0
  584. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  585. scitex/plt/styles/__init__.py +23 -9
  586. scitex/plt/styles/_plot_defaults.py +62 -61
  587. scitex/plt/styles/_plot_postprocess.py +126 -77
  588. scitex/plt/styles/_style_loader.py +0 -0
  589. scitex/plt/styles/presets.py +121 -18
  590. scitex/plt/utils/__init__.py +42 -3
  591. scitex/plt/utils/_close.py +8 -3
  592. scitex/plt/utils/_collect_figure_metadata.py +3033 -271
  593. scitex/plt/utils/_colorbar.py +15 -17
  594. scitex/plt/utils/_configure_mpl.py +26 -30
  595. scitex/plt/utils/_crop.py +87 -36
  596. scitex/plt/utils/_csv_column_naming.py +177 -72
  597. scitex/plt/utils/_dimension_viewer.py +7 -19
  598. scitex/plt/utils/_figure_from_axes_mm.py +70 -16
  599. scitex/plt/utils/_figure_mm.py +119 -3
  600. scitex/plt/utils/_get_actual_font.py +5 -4
  601. scitex/plt/utils/_histogram_utils.py +52 -48
  602. scitex/plt/utils/_hitmap.py +1643 -0
  603. scitex/plt/utils/_is_valid_axis.py +19 -13
  604. scitex/plt/utils/_mk_colorbar.py +3 -3
  605. scitex/plt/utils/_scientific_captions.py +202 -139
  606. scitex/plt/utils/_scitex_config.py +98 -98
  607. scitex/plt/utils/_units.py +0 -0
  608. scitex/plt/utils/metadata/__init__.py +61 -0
  609. scitex/plt/utils/metadata/_artist_extraction.py +119 -0
  610. scitex/plt/utils/metadata/_axes_metadata.py +93 -0
  611. scitex/plt/utils/metadata/_collection_artists.py +292 -0
  612. scitex/plt/utils/metadata/_core.py +207 -0
  613. scitex/plt/utils/metadata/_csv_column_extraction.py +186 -0
  614. scitex/plt/utils/metadata/_csv_hash.py +115 -0
  615. scitex/plt/utils/metadata/_csv_verification.py +95 -0
  616. scitex/plt/utils/metadata/_data_linkage.py +263 -0
  617. scitex/plt/utils/metadata/_dimensions.py +242 -0
  618. scitex/plt/utils/metadata/_editable_export.py +405 -0
  619. scitex/plt/utils/metadata/_figure_metadata.py +58 -0
  620. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  621. scitex/plt/utils/metadata/_image_text_artists.py +168 -0
  622. scitex/plt/utils/metadata/_label_parsing.py +82 -0
  623. scitex/plt/utils/metadata/_legend_extraction.py +120 -0
  624. scitex/plt/utils/metadata/_line_artists.py +367 -0
  625. scitex/plt/utils/metadata/_line_semantic_handling.py +173 -0
  626. scitex/plt/utils/metadata/_patch_artists.py +211 -0
  627. scitex/plt/utils/metadata/_plot_content.py +26 -0
  628. scitex/plt/utils/metadata/_plot_type_detection.py +184 -0
  629. scitex/plt/utils/metadata/_precision.py +134 -0
  630. scitex/plt/utils/metadata/_precision_config.py +68 -0
  631. scitex/plt/utils/metadata/_precision_sections.py +211 -0
  632. scitex/plt/utils/metadata/_recipe_extraction.py +267 -0
  633. scitex/plt/utils/metadata/_style_parsing.py +174 -0
  634. scitex/repro/_RandomStateManager.py +33 -38
  635. scitex/repro/__init__.py +16 -7
  636. scitex/repro/_gen_ID.py +7 -9
  637. scitex/repro/_gen_timestamp.py +7 -6
  638. scitex/repro/_hash_array.py +8 -12
  639. scitex/reproduce/__init__.py +1 -1
  640. scitex/resource/_get_processor_usages.py +3 -1
  641. scitex/resource/_log_processor_usages.py +3 -1
  642. scitex/rng/__init__.py +1 -1
  643. scitex/schema/README.md +178 -0
  644. scitex/schema/__init__.py +237 -0
  645. scitex/schema/_canvas.py +444 -0
  646. scitex/schema/_plot.py +1015 -0
  647. scitex/schema/_stats.py +762 -0
  648. scitex/schema/_validation.py +590 -0
  649. scitex/scholar/.legacy/Scholar.py +5 -12
  650. scitex/scholar/.legacy/_Scholar.py +66 -99
  651. scitex/scholar/.legacy/_ScholarAPI.py +75 -66
  652. scitex/scholar/.legacy/_tmp/search_engine/_BaseSearchEngine.py +3 -3
  653. scitex/scholar/.legacy/_tmp/search_engine/_UnifiedSearcher.py +4 -9
  654. scitex/scholar/.legacy/_tmp/search_engine/__init__.py +14 -21
  655. scitex/scholar/.legacy/_tmp/search_engine/local/_LocalSearchEngine.py +40 -37
  656. scitex/scholar/.legacy/_tmp/search_engine/local/_VectorSearchEngine.py +31 -28
  657. scitex/scholar/.legacy/_tmp/search_engine/web/_ArxivSearchEngine.py +74 -65
  658. scitex/scholar/.legacy/_tmp/search_engine/web/_CrossRefSearchEngine.py +122 -116
  659. scitex/scholar/.legacy/_tmp/search_engine/web/_GoogleScholarSearchEngine.py +65 -59
  660. scitex/scholar/.legacy/_tmp/search_engine/web/_PubMedSearchEngine.py +121 -107
  661. scitex/scholar/.legacy/_tmp/search_engine/web/_SemanticScholarSearchEngine.py +5 -12
  662. scitex/scholar/.legacy/database/_DatabaseEntry.py +49 -45
  663. scitex/scholar/.legacy/database/_DatabaseIndex.py +131 -94
  664. scitex/scholar/.legacy/database/_LibraryManager.py +65 -63
  665. scitex/scholar/.legacy/database/_PaperDatabase.py +138 -124
  666. scitex/scholar/.legacy/database/_ScholarDatabaseIntegration.py +14 -36
  667. scitex/scholar/.legacy/database/_StorageIntegratedDB.py +192 -156
  668. scitex/scholar/.legacy/database/_ZoteroCompatibleDB.py +300 -237
  669. scitex/scholar/.legacy/database/__init__.py +2 -1
  670. scitex/scholar/.legacy/database/manage.py +92 -84
  671. scitex/scholar/.legacy/lookup/_LookupIndex.py +157 -101
  672. scitex/scholar/.legacy/lookup/__init__.py +2 -1
  673. scitex/scholar/.legacy/metadata/doi/batch/_MetadataHandlerForBatchDOIResolution.py +4 -9
  674. scitex/scholar/.legacy/metadata/doi/batch/_ProgressManagerForBatchDOIResolution.py +10 -23
  675. scitex/scholar/.legacy/metadata/doi/batch/_SourceStatsManagerForBatchDOIResolution.py +4 -9
  676. scitex/scholar/.legacy/metadata/doi/batch/__init__.py +3 -1
  677. scitex/scholar/.legacy/metadata/doi/resolvers/_BatchDOIResolver.py +10 -25
  678. scitex/scholar/.legacy/metadata/doi/resolvers/_BibTeXDOIResolver.py +19 -49
  679. scitex/scholar/.legacy/metadata/doi/resolvers/_DOIResolver.py +1 -0
  680. scitex/scholar/.legacy/metadata/doi/resolvers/_SingleDOIResolver.py +8 -20
  681. scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSource.py +37 -35
  682. scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py +49 -37
  683. scitex/scholar/.legacy/metadata/doi/sources/_ArXivSource.py +11 -30
  684. scitex/scholar/.legacy/metadata/doi/sources/_BaseDOISource.py +19 -47
  685. scitex/scholar/.legacy/metadata/doi/sources/_CrossRefLocalSource.py +1 -0
  686. scitex/scholar/.legacy/metadata/doi/sources/_CrossRefSource.py +12 -33
  687. scitex/scholar/.legacy/metadata/doi/sources/_OpenAlexSource.py +8 -20
  688. scitex/scholar/.legacy/metadata/doi/sources/_PubMedSource.py +10 -27
  689. scitex/scholar/.legacy/metadata/doi/sources/_SemanticScholarSource.py +11 -29
  690. scitex/scholar/.legacy/metadata/doi/sources/_SourceManager.py +8 -21
  691. scitex/scholar/.legacy/metadata/doi/sources/_SourceResolutionStrategy.py +24 -55
  692. scitex/scholar/.legacy/metadata/doi/sources/_SourceRotationManager.py +8 -21
  693. scitex/scholar/.legacy/metadata/doi/sources/_URLDOISource.py +9 -16
  694. scitex/scholar/.legacy/metadata/doi/sources/_UnifiedSource.py +8 -22
  695. scitex/scholar/.legacy/metadata/doi/sources/__init__.py +1 -0
  696. scitex/scholar/.legacy/metadata/doi/utils/_PubMedConverter.py +4 -8
  697. scitex/scholar/.legacy/metadata/doi/utils/_RateLimitHandler.py +17 -43
  698. scitex/scholar/.legacy/metadata/doi/utils/_TextNormalizer.py +8 -18
  699. scitex/scholar/.legacy/metadata/doi/utils/_URLDOIExtractor.py +4 -8
  700. scitex/scholar/.legacy/metadata/doi/utils/__init__.py +1 -0
  701. scitex/scholar/.legacy/metadata/doi/utils/_to_complete_metadata_structure.py +1 -0
  702. scitex/scholar/.legacy/metadata/enrichment/_LibraryEnricher.py +2 -3
  703. scitex/scholar/.legacy/metadata/enrichment/enrichers/_ImpactFactorEnricher.py +6 -12
  704. scitex/scholar/.legacy/metadata/enrichment/enrichers/_SmartEnricher.py +5 -10
  705. scitex/scholar/.legacy/metadata/enrichment/sources/_UnifiedMetadataSource.py +4 -5
  706. scitex/scholar/.legacy/metadata/query_to_full_meta_json.py +8 -12
  707. scitex/scholar/.legacy/metadata/urls/_URLMetadataHandler.py +3 -3
  708. scitex/scholar/.legacy/metadata/urls/_ZoteroTranslatorRunner.py +15 -21
  709. scitex/scholar/.legacy/metadata/urls/__init__.py +3 -3
  710. scitex/scholar/.legacy/metadata/urls/_finder.py +4 -6
  711. scitex/scholar/.legacy/metadata/urls/_handler.py +7 -15
  712. scitex/scholar/.legacy/metadata/urls/_resolver.py +6 -12
  713. scitex/scholar/.legacy/search/_Embedder.py +74 -69
  714. scitex/scholar/.legacy/search/_SemanticSearch.py +91 -90
  715. scitex/scholar/.legacy/search/_SemanticSearchEngine.py +104 -109
  716. scitex/scholar/.legacy/search/_UnifiedSearcher.py +530 -471
  717. scitex/scholar/.legacy/search/_VectorDatabase.py +111 -92
  718. scitex/scholar/.legacy/search/__init__.py +1 -0
  719. scitex/scholar/.legacy/storage/_EnhancedStorageManager.py +182 -154
  720. scitex/scholar/.legacy/storage/__init__.py +2 -1
  721. scitex/scholar/__init__.py +0 -2
  722. scitex/scholar/__main__.py +1 -3
  723. scitex/scholar/auth/ScholarAuthManager.py +13 -36
  724. scitex/scholar/auth/core/AuthenticationGateway.py +15 -29
  725. scitex/scholar/auth/core/BrowserAuthenticator.py +22 -57
  726. scitex/scholar/auth/core/StrategyResolver.py +10 -27
  727. scitex/scholar/auth/core/__init__.py +5 -1
  728. scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +11 -21
  729. scitex/scholar/auth/gateway/_OpenURLResolver.py +10 -18
  730. scitex/scholar/auth/gateway/_resolve_functions.py +3 -3
  731. scitex/scholar/auth/providers/BaseAuthenticator.py +1 -0
  732. scitex/scholar/auth/providers/EZProxyAuthenticator.py +7 -14
  733. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +29 -57
  734. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +87 -73
  735. scitex/scholar/auth/session/AuthCacheManager.py +12 -22
  736. scitex/scholar/auth/session/SessionManager.py +4 -6
  737. scitex/scholar/auth/sso/BaseSSOAutomator.py +13 -19
  738. scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +16 -45
  739. scitex/scholar/auth/sso/SSOAutomator.py +8 -15
  740. scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +13 -23
  741. scitex/scholar/browser/ScholarBrowserManager.py +31 -56
  742. scitex/scholar/browser/__init__.py +1 -0
  743. scitex/scholar/browser/utils/click_and_wait.py +3 -4
  744. scitex/scholar/browser/utils/close_unwanted_pages.py +4 -7
  745. scitex/scholar/browser/utils/wait_redirects.py +15 -40
  746. scitex/scholar/citation_graph/__init__.py +0 -0
  747. scitex/scholar/citation_graph/builder.py +3 -7
  748. scitex/scholar/citation_graph/database.py +4 -11
  749. scitex/scholar/citation_graph/example.py +5 -10
  750. scitex/scholar/citation_graph/models.py +0 -0
  751. scitex/scholar/cli/_url_utils.py +1 -1
  752. scitex/scholar/cli/chrome.py +5 -3
  753. scitex/scholar/cli/download_pdf.py +13 -14
  754. scitex/scholar/cli/handlers/bibtex_handler.py +4 -12
  755. scitex/scholar/cli/handlers/doi_handler.py +1 -3
  756. scitex/scholar/cli/handlers/project_handler.py +6 -20
  757. scitex/scholar/cli/open_browser.py +41 -39
  758. scitex/scholar/cli/open_browser_auto.py +31 -39
  759. scitex/scholar/cli/open_browser_monitored.py +27 -24
  760. scitex/scholar/config/ScholarConfig.py +5 -8
  761. scitex/scholar/config/__init__.py +1 -0
  762. scitex/scholar/config/core/_CascadeConfig.py +3 -3
  763. scitex/scholar/config/core/_PathManager.py +16 -28
  764. scitex/scholar/core/Paper.py +79 -78
  765. scitex/scholar/core/Papers.py +16 -27
  766. scitex/scholar/core/Scholar.py +98 -229
  767. scitex/scholar/core/journal_normalizer.py +52 -49
  768. scitex/scholar/core/oa_cache.py +27 -23
  769. scitex/scholar/core/open_access.py +17 -8
  770. scitex/scholar/docs/template.py +4 -3
  771. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/clf_svm.py +0 -0
  772. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/download.py +0 -0
  773. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_conf_mat.py +0 -0
  774. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_digits.py +0 -0
  775. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_umap_space.py +0 -0
  776. scitex/scholar/examples/00_config.py +10 -9
  777. scitex/scholar/examples/01_auth.py +3 -0
  778. scitex/scholar/examples/02_browser.py +14 -10
  779. scitex/scholar/examples/03_01-engine.py +3 -0
  780. scitex/scholar/examples/03_02-engine-for-bibtex.py +4 -3
  781. scitex/scholar/examples/04_01-url.py +9 -9
  782. scitex/scholar/examples/04_02-url-for-bibtex.py +7 -3
  783. scitex/scholar/examples/04_02-url-for-dois.py +87 -97
  784. scitex/scholar/examples/05_download_pdf.py +10 -4
  785. scitex/scholar/examples/06_find_and_download.py +6 -6
  786. scitex/scholar/examples/06_parse_bibtex.py +17 -17
  787. scitex/scholar/examples/07_storage_integration.py +6 -9
  788. scitex/scholar/examples/99_fullpipeline-for-bibtex.py +14 -15
  789. scitex/scholar/examples/99_fullpipeline-for-one-entry.py +31 -23
  790. scitex/scholar/examples/99_maintenance.py +3 -0
  791. scitex/scholar/examples/dev.py +2 -3
  792. scitex/scholar/examples/zotero_integration.py +11 -18
  793. scitex/scholar/impact_factor/ImpactFactorEngine.py +7 -9
  794. scitex/scholar/impact_factor/estimation/__init__.py +4 -4
  795. scitex/scholar/impact_factor/estimation/core/__init__.py +3 -7
  796. scitex/scholar/impact_factor/estimation/core/cache_manager.py +223 -211
  797. scitex/scholar/impact_factor/estimation/core/calculator.py +165 -131
  798. scitex/scholar/impact_factor/estimation/core/journal_matcher.py +217 -172
  799. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +6 -14
  800. scitex/scholar/impact_factor/jcr/build_database.py +4 -3
  801. scitex/scholar/integration/base.py +9 -17
  802. scitex/scholar/integration/mendeley/exporter.py +2 -4
  803. scitex/scholar/integration/mendeley/importer.py +3 -3
  804. scitex/scholar/integration/mendeley/linker.py +3 -3
  805. scitex/scholar/integration/mendeley/mapper.py +9 -6
  806. scitex/scholar/integration/zotero/__main__.py +26 -43
  807. scitex/scholar/integration/zotero/exporter.py +15 -11
  808. scitex/scholar/integration/zotero/importer.py +12 -10
  809. scitex/scholar/integration/zotero/linker.py +8 -12
  810. scitex/scholar/integration/zotero/mapper.py +17 -12
  811. scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSource.py +37 -35
  812. scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py +47 -35
  813. scitex/scholar/metadata_engines/ScholarEngine.py +21 -43
  814. scitex/scholar/metadata_engines/__init__.py +1 -0
  815. scitex/scholar/metadata_engines/individual/ArXivEngine.py +15 -37
  816. scitex/scholar/metadata_engines/individual/CrossRefEngine.py +15 -42
  817. scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +24 -45
  818. scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +11 -21
  819. scitex/scholar/metadata_engines/individual/PubMedEngine.py +10 -27
  820. scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +28 -35
  821. scitex/scholar/metadata_engines/individual/URLDOIEngine.py +11 -22
  822. scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +20 -49
  823. scitex/scholar/metadata_engines/utils/_PubMedConverter.py +4 -8
  824. scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +5 -10
  825. scitex/scholar/metadata_engines/utils/__init__.py +2 -0
  826. scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +3 -0
  827. scitex/scholar/metadata_engines/utils/_standardize_metadata.py +2 -3
  828. scitex/scholar/pdf_download/ScholarPDFDownloader.py +25 -37
  829. scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +11 -19
  830. scitex/scholar/pdf_download/strategies/direct_download.py +5 -9
  831. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +3 -3
  832. scitex/scholar/pdf_download/strategies/manual_download_utils.py +6 -13
  833. scitex/scholar/pdf_download/strategies/open_access_download.py +49 -31
  834. scitex/scholar/pdf_download/strategies/response_body.py +8 -19
  835. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +9 -18
  836. scitex/scholar/pipelines/ScholarPipelineMetadataParallel.py +25 -26
  837. scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py +62 -23
  838. scitex/scholar/pipelines/ScholarPipelineParallel.py +13 -30
  839. scitex/scholar/pipelines/ScholarPipelineSearchParallel.py +299 -220
  840. scitex/scholar/pipelines/ScholarPipelineSearchSingle.py +202 -165
  841. scitex/scholar/pipelines/ScholarPipelineSingle.py +25 -51
  842. scitex/scholar/pipelines/SearchQueryParser.py +55 -55
  843. scitex/scholar/search_engines/ScholarSearchEngine.py +31 -27
  844. scitex/scholar/search_engines/_BaseSearchEngine.py +20 -23
  845. scitex/scholar/search_engines/individual/ArXivSearchEngine.py +53 -35
  846. scitex/scholar/search_engines/individual/CrossRefSearchEngine.py +47 -40
  847. scitex/scholar/search_engines/individual/OpenAlexSearchEngine.py +55 -50
  848. scitex/scholar/search_engines/individual/PubMedSearchEngine.py +8 -10
  849. scitex/scholar/search_engines/individual/SemanticScholarSearchEngine.py +55 -49
  850. scitex/scholar/storage/BibTeXHandler.py +150 -95
  851. scitex/scholar/storage/PaperIO.py +3 -6
  852. scitex/scholar/storage/ScholarLibrary.py +70 -49
  853. scitex/scholar/storage/_DeduplicationManager.py +52 -25
  854. scitex/scholar/storage/_LibraryCacheManager.py +19 -46
  855. scitex/scholar/storage/_LibraryManager.py +65 -175
  856. scitex/scholar/url_finder/ScholarURLFinder.py +9 -25
  857. scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +1 -1
  858. scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +6 -10
  859. scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +4 -6
  860. scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +8 -15
  861. scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +3 -3
  862. scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +3 -3
  863. scitex/scholar/url_finder/translators/core/patterns.py +6 -4
  864. scitex/scholar/url_finder/translators/core/registry.py +6 -9
  865. scitex/scholar/url_finder/translators/individual/BOFiP_Impots.py +60 -52
  866. scitex/scholar/url_finder/translators/individual/Baidu_Scholar.py +54 -62
  867. scitex/scholar/url_finder/translators/individual/Bangkok_Post.py +38 -44
  868. scitex/scholar/url_finder/translators/individual/Baruch_Foundation.py +43 -47
  869. scitex/scholar/url_finder/translators/individual/Beobachter.py +46 -50
  870. scitex/scholar/url_finder/translators/individual/Bezneng_Gajit.py +37 -41
  871. scitex/scholar/url_finder/translators/individual/BibLaTeX.py +59 -52
  872. scitex/scholar/url_finder/translators/individual/BibTeX.py +83 -79
  873. scitex/scholar/url_finder/translators/individual/Biblio_com.py +48 -51
  874. scitex/scholar/url_finder/translators/individual/Bibliontology_RDF.py +58 -56
  875. scitex/scholar/url_finder/translators/individual/Camara_Brasileira_do_Livro_ISBN.py +102 -99
  876. scitex/scholar/url_finder/translators/individual/CanLII.py +49 -43
  877. scitex/scholar/url_finder/translators/individual/Canada_com.py +36 -40
  878. scitex/scholar/url_finder/translators/individual/Canadian_Letters_and_Images.py +43 -43
  879. scitex/scholar/url_finder/translators/individual/Canadiana_ca.py +77 -66
  880. scitex/scholar/url_finder/translators/individual/Cascadilla_Proceedings_Project.py +68 -62
  881. scitex/scholar/url_finder/translators/individual/Central_and_Eastern_European_Online_Library_Journals.py +60 -60
  882. scitex/scholar/url_finder/translators/individual/Champlain_Society_Collection.py +63 -61
  883. scitex/scholar/url_finder/translators/individual/Chicago_Journal_of_Theoretical_Computer_Science.py +74 -58
  884. scitex/scholar/url_finder/translators/individual/Christian_Science_Monitor.py +32 -38
  885. scitex/scholar/url_finder/translators/individual/Columbia_University_Press.py +51 -47
  886. scitex/scholar/url_finder/translators/individual/Common_Place.py +66 -57
  887. scitex/scholar/url_finder/translators/individual/Cornell_LII.py +66 -62
  888. scitex/scholar/url_finder/translators/individual/Cornell_University_Press.py +38 -45
  889. scitex/scholar/url_finder/translators/individual/CourtListener.py +52 -56
  890. scitex/scholar/url_finder/translators/individual/DAI_Zenon.py +53 -54
  891. scitex/scholar/url_finder/translators/individual/access_medicine.py +27 -33
  892. scitex/scholar/url_finder/translators/individual/acm.py +1 -1
  893. scitex/scholar/url_finder/translators/individual/acm_digital_library.py +93 -63
  894. scitex/scholar/url_finder/translators/individual/airiti.py +3 -1
  895. scitex/scholar/url_finder/translators/individual/aosic.py +3 -1
  896. scitex/scholar/url_finder/translators/individual/archive_ouverte_aosic.py +3 -1
  897. scitex/scholar/url_finder/translators/individual/archive_ouverte_en_sciences_de_l_information_et_de_la_communication___aosic_.py +6 -2
  898. scitex/scholar/url_finder/translators/individual/artforum.py +35 -27
  899. scitex/scholar/url_finder/translators/individual/arxiv.py +1 -1
  900. scitex/scholar/url_finder/translators/individual/arxiv_org.py +8 -4
  901. scitex/scholar/url_finder/translators/individual/atlanta_journal_constitution.py +22 -18
  902. scitex/scholar/url_finder/translators/individual/atypon_journals.py +19 -11
  903. scitex/scholar/url_finder/translators/individual/austlii_and_nzlii.py +48 -44
  904. scitex/scholar/url_finder/translators/individual/australian_dictionary_of_biography.py +21 -17
  905. scitex/scholar/url_finder/translators/individual/bailii.py +22 -19
  906. scitex/scholar/url_finder/translators/individual/bbc.py +46 -42
  907. scitex/scholar/url_finder/translators/individual/bbc_genome.py +37 -25
  908. scitex/scholar/url_finder/translators/individual/biblioteca_nacional_de_maestros.py +24 -20
  909. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationale_quebec_pistard.py +42 -43
  910. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationales_quebec.py +87 -81
  911. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_france.py +39 -37
  912. scitex/scholar/url_finder/translators/individual/bibsys.py +32 -28
  913. scitex/scholar/url_finder/translators/individual/bioconductor.py +58 -52
  914. scitex/scholar/url_finder/translators/individual/biomed_central.py +23 -15
  915. scitex/scholar/url_finder/translators/individual/biorxiv.py +26 -13
  916. scitex/scholar/url_finder/translators/individual/blogger.py +39 -43
  917. scitex/scholar/url_finder/translators/individual/bloomberg.py +48 -52
  918. scitex/scholar/url_finder/translators/individual/bloomsbury_food_library.py +37 -37
  919. scitex/scholar/url_finder/translators/individual/bluesky.py +30 -28
  920. scitex/scholar/url_finder/translators/individual/bnf_isbn.py +1 -1
  921. scitex/scholar/url_finder/translators/individual/bocc.py +66 -60
  922. scitex/scholar/url_finder/translators/individual/boe.py +52 -52
  923. scitex/scholar/url_finder/translators/individual/brill.py +3 -1
  924. scitex/scholar/url_finder/translators/individual/business_standard.py +36 -38
  925. scitex/scholar/url_finder/translators/individual/cabi_cab_abstracts.py +39 -41
  926. scitex/scholar/url_finder/translators/individual/cambridge.py +3 -1
  927. scitex/scholar/url_finder/translators/individual/cambridge_core.py +30 -24
  928. scitex/scholar/url_finder/translators/individual/caod.py +50 -46
  929. scitex/scholar/url_finder/translators/individual/cbc.py +91 -67
  930. scitex/scholar/url_finder/translators/individual/ccfr_bnf.py +49 -53
  931. scitex/scholar/url_finder/translators/individual/cia_world_factbook.py +43 -33
  932. scitex/scholar/url_finder/translators/individual/crossref_rest.py +208 -174
  933. scitex/scholar/url_finder/translators/individual/current_affairs.py +29 -35
  934. scitex/scholar/url_finder/translators/individual/dabi.py +70 -66
  935. scitex/scholar/url_finder/translators/individual/dagens_nyheter.py +3 -1
  936. scitex/scholar/url_finder/translators/individual/dagstuhl.py +10 -15
  937. scitex/scholar/url_finder/translators/individual/dar_almandumah.py +13 -9
  938. scitex/scholar/url_finder/translators/individual/dart_europe.py +19 -22
  939. scitex/scholar/url_finder/translators/individual/data_gov.py +2 -2
  940. scitex/scholar/url_finder/translators/individual/databrary.py +27 -28
  941. scitex/scholar/url_finder/translators/individual/datacite_json.py +152 -137
  942. scitex/scholar/url_finder/translators/individual/dataverse.py +68 -64
  943. scitex/scholar/url_finder/translators/individual/daum_news.py +38 -38
  944. scitex/scholar/url_finder/translators/individual/dblp.py +4 -8
  945. scitex/scholar/url_finder/translators/individual/dblp_computer_science_bibliography.py +8 -3
  946. scitex/scholar/url_finder/translators/individual/dbpia.py +5 -3
  947. scitex/scholar/url_finder/translators/individual/defense_technical_information_center.py +30 -28
  948. scitex/scholar/url_finder/translators/individual/delpher.py +102 -79
  949. scitex/scholar/url_finder/translators/individual/demographic_research.py +35 -31
  950. scitex/scholar/url_finder/translators/individual/denik_cz.py +58 -54
  951. scitex/scholar/url_finder/translators/individual/depatisnet.py +7 -10
  952. scitex/scholar/url_finder/translators/individual/der_freitag.py +81 -66
  953. scitex/scholar/url_finder/translators/individual/der_spiegel.py +56 -54
  954. scitex/scholar/url_finder/translators/individual/digibib_net.py +3 -1
  955. scitex/scholar/url_finder/translators/individual/digizeitschriften.py +3 -1
  956. scitex/scholar/url_finder/translators/individual/dpla.py +13 -14
  957. scitex/scholar/url_finder/translators/individual/dspace.py +2 -2
  958. scitex/scholar/url_finder/translators/individual/ebrary.py +3 -1
  959. scitex/scholar/url_finder/translators/individual/ebscohost.py +3 -1
  960. scitex/scholar/url_finder/translators/individual/electronic_colloquium_on_computational_complexity.py +3 -1
  961. scitex/scholar/url_finder/translators/individual/elife.py +3 -1
  962. scitex/scholar/url_finder/translators/individual/elsevier_health_journals.py +3 -1
  963. scitex/scholar/url_finder/translators/individual/emerald.py +3 -1
  964. scitex/scholar/url_finder/translators/individual/emerald_insight.py +3 -1
  965. scitex/scholar/url_finder/translators/individual/epicurious.py +3 -1
  966. scitex/scholar/url_finder/translators/individual/eurogamerusgamer.py +3 -1
  967. scitex/scholar/url_finder/translators/individual/fachportal_padagogik.py +3 -1
  968. scitex/scholar/url_finder/translators/individual/frontiers.py +1 -1
  969. scitex/scholar/url_finder/translators/individual/gale_databases.py +3 -1
  970. scitex/scholar/url_finder/translators/individual/gms_german_medical_science.py +6 -2
  971. scitex/scholar/url_finder/translators/individual/ieee_computer_society.py +6 -2
  972. scitex/scholar/url_finder/translators/individual/ieee_xplore.py +41 -35
  973. scitex/scholar/url_finder/translators/individual/inter_research_science_center.py +6 -2
  974. scitex/scholar/url_finder/translators/individual/jisc_historical_texts.py +3 -1
  975. scitex/scholar/url_finder/translators/individual/jstor.py +14 -12
  976. scitex/scholar/url_finder/translators/individual/korean_national_library.py +3 -1
  977. scitex/scholar/url_finder/translators/individual/la_times.py +3 -1
  978. scitex/scholar/url_finder/translators/individual/landesbibliographie_baden_wurttemberg.py +3 -1
  979. scitex/scholar/url_finder/translators/individual/legislative_insight.py +3 -1
  980. scitex/scholar/url_finder/translators/individual/libraries_tasmania.py +3 -1
  981. scitex/scholar/url_finder/translators/individual/library_catalog__koha_.py +3 -1
  982. scitex/scholar/url_finder/translators/individual/lingbuzz.py +2 -2
  983. scitex/scholar/url_finder/translators/individual/max_planck_institute_for_the_history_of_science_virtual_laboratory_library.py +3 -1
  984. scitex/scholar/url_finder/translators/individual/mdpi.py +12 -6
  985. scitex/scholar/url_finder/translators/individual/microbiology_society_journals.py +3 -1
  986. scitex/scholar/url_finder/translators/individual/midas_journals.py +3 -1
  987. scitex/scholar/url_finder/translators/individual/nagoya_university_opac.py +3 -1
  988. scitex/scholar/url_finder/translators/individual/nature_publishing_group.py +32 -19
  989. scitex/scholar/url_finder/translators/individual/ntsb_accident_reports.py +3 -1
  990. scitex/scholar/url_finder/translators/individual/openedition_journals.py +8 -4
  991. scitex/scholar/url_finder/translators/individual/orcid.py +16 -15
  992. scitex/scholar/url_finder/translators/individual/oxford.py +25 -19
  993. scitex/scholar/url_finder/translators/individual/oxford_dictionaries_premium.py +3 -1
  994. scitex/scholar/url_finder/translators/individual/ozon_ru.py +3 -1
  995. scitex/scholar/url_finder/translators/individual/plos.py +9 -12
  996. scitex/scholar/url_finder/translators/individual/polygon.py +3 -1
  997. scitex/scholar/url_finder/translators/individual/primo.py +3 -1
  998. scitex/scholar/url_finder/translators/individual/project_muse.py +3 -1
  999. scitex/scholar/url_finder/translators/individual/pubfactory_journals.py +3 -1
  1000. scitex/scholar/url_finder/translators/individual/pubmed.py +71 -65
  1001. scitex/scholar/url_finder/translators/individual/pubmed_central.py +8 -6
  1002. scitex/scholar/url_finder/translators/individual/rechtspraak_nl.py +3 -1
  1003. scitex/scholar/url_finder/translators/individual/sage_journals.py +25 -17
  1004. scitex/scholar/url_finder/translators/individual/sciencedirect.py +36 -17
  1005. scitex/scholar/url_finder/translators/individual/semantics_visual_library.py +3 -1
  1006. scitex/scholar/url_finder/translators/individual/silverchair.py +70 -52
  1007. scitex/scholar/url_finder/translators/individual/sora.py +3 -1
  1008. scitex/scholar/url_finder/translators/individual/springer.py +15 -11
  1009. scitex/scholar/url_finder/translators/individual/ssrn.py +3 -3
  1010. scitex/scholar/url_finder/translators/individual/stanford_encyclopedia_of_philosophy.py +3 -1
  1011. scitex/scholar/url_finder/translators/individual/superlib.py +3 -1
  1012. scitex/scholar/url_finder/translators/individual/treesearch.py +3 -1
  1013. scitex/scholar/url_finder/translators/individual/university_of_chicago_press_books.py +3 -1
  1014. scitex/scholar/url_finder/translators/individual/vlex.py +3 -1
  1015. scitex/scholar/url_finder/translators/individual/web_of_science.py +3 -1
  1016. scitex/scholar/url_finder/translators/individual/web_of_science_nextgen.py +3 -1
  1017. scitex/scholar/url_finder/translators/individual/wiley.py +31 -25
  1018. scitex/scholar/url_finder/translators/individual/wilson_center_digital_archive.py +3 -1
  1019. scitex/scholar/utils/bibtex/_parse_bibtex.py +3 -3
  1020. scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +5 -9
  1021. scitex/scholar/utils/text/_TextNormalizer.py +249 -176
  1022. scitex/scholar/utils/validation/DOIValidator.py +31 -28
  1023. scitex/scholar/utils/validation/__init__.py +0 -0
  1024. scitex/scholar/utils/validation/validate_library_dois.py +61 -57
  1025. scitex/scholar/zotero/__init__.py +1 -1
  1026. scitex/security/cli.py +7 -20
  1027. scitex/security/github.py +45 -32
  1028. scitex/session/__init__.py +8 -9
  1029. scitex/session/_decorator.py +49 -42
  1030. scitex/session/_lifecycle.py +39 -39
  1031. scitex/session/_manager.py +24 -20
  1032. scitex/sh/__init__.py +4 -3
  1033. scitex/sh/_execute.py +10 -7
  1034. scitex/sh/_security.py +3 -3
  1035. scitex/sh/_types.py +2 -3
  1036. scitex/stats/__init__.py +174 -6
  1037. scitex/stats/_schema.py +42 -569
  1038. scitex/stats/auto/__init__.py +188 -0
  1039. scitex/stats/auto/_context.py +331 -0
  1040. scitex/stats/auto/_formatting.py +679 -0
  1041. scitex/stats/auto/_rules.py +901 -0
  1042. scitex/stats/auto/_selector.py +554 -0
  1043. scitex/stats/auto/_styles.py +721 -0
  1044. scitex/stats/correct/__init__.py +4 -4
  1045. scitex/stats/correct/_correct_bonferroni.py +43 -34
  1046. scitex/stats/correct/_correct_fdr.py +14 -40
  1047. scitex/stats/correct/_correct_fdr_.py +39 -46
  1048. scitex/stats/correct/_correct_holm.py +14 -32
  1049. scitex/stats/correct/_correct_sidak.py +36 -21
  1050. scitex/stats/descriptive/_circular.py +20 -21
  1051. scitex/stats/descriptive/_describe.py +19 -5
  1052. scitex/stats/descriptive/_nan.py +5 -7
  1053. scitex/stats/descriptive/_real.py +4 -3
  1054. scitex/stats/effect_sizes/__init__.py +10 -11
  1055. scitex/stats/effect_sizes/_cliffs_delta.py +35 -32
  1056. scitex/stats/effect_sizes/_cohens_d.py +30 -31
  1057. scitex/stats/effect_sizes/_epsilon_squared.py +19 -22
  1058. scitex/stats/effect_sizes/_eta_squared.py +23 -27
  1059. scitex/stats/effect_sizes/_prob_superiority.py +18 -21
  1060. scitex/stats/io/__init__.py +29 -0
  1061. scitex/stats/io/_bundle.py +156 -0
  1062. scitex/stats/posthoc/__init__.py +3 -3
  1063. scitex/stats/posthoc/_dunnett.py +75 -55
  1064. scitex/stats/posthoc/_games_howell.py +61 -43
  1065. scitex/stats/posthoc/_tukey_hsd.py +42 -34
  1066. scitex/stats/power/__init__.py +2 -2
  1067. scitex/stats/power/_power.py +56 -56
  1068. scitex/stats/tests/__init__.py +1 -1
  1069. scitex/stats/tests/correlation/__init__.py +1 -1
  1070. scitex/stats/tests/correlation/_test_pearson.py +28 -38
  1071. scitex/stats/utils/__init__.py +14 -17
  1072. scitex/stats/utils/_effect_size.py +85 -78
  1073. scitex/stats/utils/_formatters.py +49 -43
  1074. scitex/stats/utils/_normalizers.py +7 -14
  1075. scitex/stats/utils/_power.py +56 -56
  1076. scitex/str/__init__.py +1 -0
  1077. scitex/str/_clean_path.py +3 -3
  1078. scitex/str/_factor_out_digits.py +86 -58
  1079. scitex/str/_format_plot_text.py +180 -111
  1080. scitex/str/_latex.py +19 -19
  1081. scitex/str/_latex_fallback.py +9 -10
  1082. scitex/str/_parse.py +3 -6
  1083. scitex/str/_print_debug.py +13 -13
  1084. scitex/str/_printc.py +2 -0
  1085. scitex/str/_search.py +3 -3
  1086. scitex/template/.legacy/_clone_project.py +9 -13
  1087. scitex/template/__init__.py +10 -2
  1088. scitex/template/_clone_project.py +7 -2
  1089. scitex/template/_copy.py +1 -0
  1090. scitex/template/_customize.py +3 -6
  1091. scitex/template/_git_strategy.py +2 -3
  1092. scitex/template/_rename.py +1 -0
  1093. scitex/template/clone_pip_project.py +6 -7
  1094. scitex/template/clone_research.py +7 -10
  1095. scitex/template/clone_singularity.py +6 -7
  1096. scitex/template/clone_writer_directory.py +6 -7
  1097. scitex/tex/__init__.py +4 -0
  1098. scitex/tex/_export.py +890 -0
  1099. scitex/tex/_preview.py +26 -11
  1100. scitex/tex/_to_vec.py +10 -7
  1101. scitex/torch/__init__.py +11 -1
  1102. scitex/types/_ArrayLike.py +2 -0
  1103. scitex/types/_is_listed_X.py +3 -3
  1104. scitex/units.py +110 -77
  1105. scitex/utils/_compress_hdf5.py +3 -3
  1106. scitex/utils/_email.py +8 -4
  1107. scitex/utils/_notify.py +14 -8
  1108. scitex/utils/_search.py +6 -6
  1109. scitex/utils/_verify_scitex_format.py +17 -42
  1110. scitex/utils/_verify_scitex_format_v01.py +12 -34
  1111. scitex/utils/template.py +4 -3
  1112. scitex/web/__init__.py +7 -1
  1113. scitex/web/_scraping.py +54 -38
  1114. scitex/web/_search_pubmed.py +30 -14
  1115. scitex/writer/.legacy/Writer_v01-refactored.py +4 -4
  1116. scitex/writer/.legacy/_compile.py +18 -28
  1117. scitex/writer/Writer.py +8 -21
  1118. scitex/writer/__init__.py +11 -11
  1119. scitex/writer/_clone_writer_project.py +2 -6
  1120. scitex/writer/_compile/__init__.py +1 -0
  1121. scitex/writer/_compile/_parser.py +1 -0
  1122. scitex/writer/_compile/_runner.py +35 -38
  1123. scitex/writer/_compile/_validator.py +1 -0
  1124. scitex/writer/_compile/manuscript.py +1 -0
  1125. scitex/writer/_compile/revision.py +1 -0
  1126. scitex/writer/_compile/supplementary.py +1 -0
  1127. scitex/writer/_compile_async.py +5 -12
  1128. scitex/writer/_project/__init__.py +1 -0
  1129. scitex/writer/_project/_create.py +10 -25
  1130. scitex/writer/_project/_trees.py +4 -9
  1131. scitex/writer/_project/_validate.py +2 -3
  1132. scitex/writer/_validate_tree_structures.py +7 -18
  1133. scitex/writer/dataclasses/__init__.py +8 -10
  1134. scitex/writer/dataclasses/config/_CONSTANTS.py +2 -3
  1135. scitex/writer/dataclasses/config/_WriterConfig.py +4 -9
  1136. scitex/writer/dataclasses/contents/_ManuscriptContents.py +14 -25
  1137. scitex/writer/dataclasses/contents/_RevisionContents.py +21 -16
  1138. scitex/writer/dataclasses/contents/_SupplementaryContents.py +21 -24
  1139. scitex/writer/dataclasses/core/_Document.py +2 -3
  1140. scitex/writer/dataclasses/core/_DocumentSection.py +8 -23
  1141. scitex/writer/dataclasses/results/_CompilationResult.py +2 -3
  1142. scitex/writer/dataclasses/results/_LaTeXIssue.py +3 -6
  1143. scitex/writer/dataclasses/results/_SaveSectionsResponse.py +20 -9
  1144. scitex/writer/dataclasses/results/_SectionReadResponse.py +24 -10
  1145. scitex/writer/dataclasses/tree/_ConfigTree.py +7 -4
  1146. scitex/writer/dataclasses/tree/_ManuscriptTree.py +10 -13
  1147. scitex/writer/dataclasses/tree/_RevisionTree.py +16 -17
  1148. scitex/writer/dataclasses/tree/_ScriptsTree.py +10 -5
  1149. scitex/writer/dataclasses/tree/_SharedTree.py +10 -13
  1150. scitex/writer/dataclasses/tree/_SupplementaryTree.py +15 -14
  1151. scitex/writer/utils/.legacy_git_retry.py +3 -8
  1152. scitex/writer/utils/_parse_latex_logs.py +2 -3
  1153. scitex/writer/utils/_parse_script_args.py +20 -23
  1154. scitex/writer/utils/_watch.py +5 -5
  1155. {scitex-2.5.0.dist-info → scitex-2.7.3.dist-info}/METADATA +14 -10
  1156. {scitex-2.5.0.dist-info → scitex-2.7.3.dist-info}/RECORD +1149 -985
  1157. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +0 -583
  1158. scitex/io/memo.md +0 -2827
  1159. scitex/plt/_subplots/TODO.md +0 -53
  1160. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -537
  1161. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1499
  1162. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -431
  1163. scitex/plt/_subplots/_export_as_csv_formatters.py +0 -112
  1164. scitex/vis/__init__.py +0 -177
  1165. scitex/vis/editor/_defaults.py +0 -244
  1166. scitex/vis/editor/_edit.py +0 -378
  1167. scitex/vis/editor/flask_editor/__init__.py +0 -21
  1168. scitex/vis/editor/flask_editor/bbox.py +0 -216
  1169. scitex/vis/editor/flask_editor/core.py +0 -152
  1170. scitex/vis/editor/flask_editor/plotter.py +0 -130
  1171. scitex/vis/editor/flask_editor/renderer.py +0 -184
  1172. scitex/vis/editor/flask_editor/templates/html.py +0 -295
  1173. scitex/vis/editor/flask_editor/templates/scripts.py +0 -614
  1174. scitex/vis/editor/flask_editor/templates/styles.py +0 -549
  1175. /scitex/{vis → fig}/README.md +0 -0
  1176. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  1177. {scitex-2.5.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
  1178. {scitex-2.5.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
  1179. {scitex-2.5.0.dist-info → scitex-2.7.3.dist-info}/licenses/LICENSE +0 -0
@@ -54,9 +54,9 @@ def pandas_fn(func: Callable) -> Callable:
54
54
  except:
55
55
  # If list can't be converted to DataFrame, return as is
56
56
  return data
57
- elif hasattr(data, '__class__') and data.__class__.__name__ == 'Tensor':
57
+ elif hasattr(data, "__class__") and data.__class__.__name__ == "Tensor":
58
58
  return pd.DataFrame(data.detach().cpu().numpy())
59
- elif hasattr(data, '__class__') and data.__class__.__name__ == 'DataArray':
59
+ elif hasattr(data, "__class__") and data.__class__.__name__ == "DataArray":
60
60
  return pd.DataFrame(data.values)
61
61
  elif isinstance(data, (int, float, str)):
62
62
  # Don't convert scalars to DataFrames
@@ -73,6 +73,7 @@ def pandas_fn(func: Callable) -> Callable:
73
73
 
74
74
  # Skip strict assertion for certain types
75
75
  import pandas as pd
76
+
76
77
  validated_args = []
77
78
  for arg_index, arg in enumerate(converted_args):
78
79
  if isinstance(arg, pd.DataFrame):
@@ -80,7 +81,9 @@ def pandas_fn(func: Callable) -> Callable:
80
81
  elif isinstance(arg, (int, float, str, type(None), pd.Series)):
81
82
  # Pass through scalars, strings, Series, and None unchanged
82
83
  validated_args.append(arg)
83
- elif isinstance(arg, list) and all(isinstance(item, pd.DataFrame) for item in arg):
84
+ elif isinstance(arg, list) and all(
85
+ isinstance(item, pd.DataFrame) for item in arg
86
+ ):
84
87
  # List of DataFrames - pass through as is
85
88
  validated_args.append(arg)
86
89
  else:
@@ -95,14 +98,19 @@ def pandas_fn(func: Callable) -> Callable:
95
98
 
96
99
  # Convert results back to original input types
97
100
  import pandas as pd
101
+
98
102
  if isinstance(results, pd.DataFrame):
99
103
  if original_object is not None:
100
104
  if isinstance(original_object, list):
101
105
  return results.values.tolist()
102
106
  elif isinstance(original_object, np.ndarray):
103
107
  return results.values
104
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'Tensor':
108
+ elif (
109
+ hasattr(original_object, "__class__")
110
+ and original_object.__class__.__name__ == "Tensor"
111
+ ):
105
112
  import torch
113
+
106
114
  return torch.tensor(results.values)
107
115
  elif isinstance(original_object, pd.Series):
108
116
  return (
@@ -110,8 +118,12 @@ def pandas_fn(func: Callable) -> Callable:
110
118
  if results.shape[1] > 0
111
119
  else pd.Series()
112
120
  )
113
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataArray':
121
+ elif (
122
+ hasattr(original_object, "__class__")
123
+ and original_object.__class__.__name__ == "DataArray"
124
+ ):
114
125
  import xarray as xr
126
+
115
127
  return xr.DataArray(results.values)
116
128
  return results
117
129
 
@@ -53,26 +53,40 @@ def signal_fn(func: Callable) -> Callable:
53
53
 
54
54
  # Convert results back to original input types
55
55
  import torch
56
+
56
57
  if isinstance(results, torch.Tensor):
57
58
  if original_object is not None:
58
59
  if isinstance(original_object, list):
59
60
  return results.detach().cpu().numpy().tolist()
60
61
  elif isinstance(original_object, np.ndarray):
61
62
  return results.detach().cpu().numpy()
62
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataFrame':
63
+ elif (
64
+ hasattr(original_object, "__class__")
65
+ and original_object.__class__.__name__ == "DataFrame"
66
+ ):
63
67
  import pandas as pd
68
+
64
69
  return pd.DataFrame(results.detach().cpu().numpy())
65
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'Series':
70
+ elif (
71
+ hasattr(original_object, "__class__")
72
+ and original_object.__class__.__name__ == "Series"
73
+ ):
66
74
  import pandas as pd
75
+
67
76
  return pd.Series(results.detach().cpu().numpy().flatten())
68
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataArray':
77
+ elif (
78
+ hasattr(original_object, "__class__")
79
+ and original_object.__class__.__name__ == "DataArray"
80
+ ):
69
81
  import xarray as xr
82
+
70
83
  return xr.DataArray(results.detach().cpu().numpy())
71
84
  return results
72
85
 
73
86
  # Handle tuple returns (e.g., (signal, frequencies))
74
87
  elif isinstance(results, tuple):
75
88
  import torch
89
+
76
90
  converted_results = []
77
91
  for r in results:
78
92
  if isinstance(r, torch.Tensor):
@@ -20,54 +20,55 @@ from ._converters import _return_always, is_nested_decorator, to_torch
20
20
 
21
21
  def torch_fn(func: Callable) -> Callable:
22
22
  """Decorator for PyTorch function compatibility.
23
-
23
+
24
24
  Automatically converts inputs to PyTorch tensors and handles various data types
25
25
  gracefully. Preserves the original input type in the output.
26
-
26
+
27
27
  Features
28
28
  --------
29
29
  - Converts inputs to PyTorch tensors
30
- - Preserves scalar parameters (int, float, bool, str)
30
+ - Preserves scalar parameters (int, float, bool, str)
31
31
  - Preserves dimension tuples like dim=(0, 1)
32
32
  - Handles nested lists/tuples gracefully
33
33
  - Automatically converts axis to dim for torch functions
34
34
  - Applies device="cuda" if available
35
35
  - Returns output in same type as input (numpy->numpy, pandas->pandas, etc.)
36
-
36
+
37
37
  Parameters
38
38
  ----------
39
39
  func : Callable
40
40
  The function to decorate
41
-
41
+
42
42
  Returns
43
43
  -------
44
44
  Callable
45
45
  The decorated function
46
-
46
+
47
47
  Examples
48
48
  --------
49
49
  >>> @torch_fn
50
50
  ... def mean_squared(x, dim=None):
51
51
  ... return (x ** 2).mean(dim=dim)
52
- >>>
52
+ >>>
53
53
  >>> # Works with numpy arrays
54
54
  >>> result = mean_squared(np.array([1, 2, 3]))
55
- >>>
55
+ >>>
56
56
  >>> # Works with nested lists
57
57
  >>> result = mean_squared([[1, 2], [3, 4]])
58
- >>>
58
+ >>>
59
59
  >>> # Preserves dimension tuples
60
60
  >>> result = mean_squared(data, dim=(0, 1))
61
-
61
+
62
62
  Notes
63
63
  -----
64
64
  For optimal performance with batch processing, apply torch_fn before batch_fn:
65
65
  @batch_fn
66
66
  @torch_fn
67
67
  def my_function(x): ...
68
-
68
+
69
69
  Or use auto-ordering to handle this automatically.
70
70
  """
71
+
71
72
  @wraps(func)
72
73
  def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
73
74
  # Skip conversion if already in a nested decorator context
@@ -88,6 +89,7 @@ def torch_fn(func: Callable) -> Callable:
88
89
  # Skip strict assertion for certain types that may not convert to tensors
89
90
  # Instead, convert what we can and pass through what we can't
90
91
  import torch
92
+
91
93
  validated_args = []
92
94
  for arg_index, arg in enumerate(converted_args):
93
95
  if isinstance(arg, torch.Tensor):
@@ -95,7 +97,9 @@ def torch_fn(func: Callable) -> Callable:
95
97
  elif isinstance(arg, (int, float, str, type(None))):
96
98
  # Pass through scalars and strings unchanged
97
99
  validated_args.append(arg)
98
- elif isinstance(arg, list) and all(isinstance(item, torch.Tensor) for item in arg):
100
+ elif isinstance(arg, list) and all(
101
+ isinstance(item, torch.Tensor) for item in arg
102
+ ):
99
103
  # List of tensors - pass through as is
100
104
  validated_args.append(arg)
101
105
  else:
@@ -110,20 +114,33 @@ def torch_fn(func: Callable) -> Callable:
110
114
 
111
115
  # Convert results back to original input types
112
116
  import torch
117
+
113
118
  if isinstance(results, torch.Tensor):
114
119
  if original_object is not None:
115
120
  if isinstance(original_object, list):
116
121
  return results.detach().cpu().numpy().tolist()
117
122
  elif isinstance(original_object, np.ndarray):
118
123
  return results.detach().cpu().numpy()
119
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataFrame':
124
+ elif (
125
+ hasattr(original_object, "__class__")
126
+ and original_object.__class__.__name__ == "DataFrame"
127
+ ):
120
128
  import pandas as pd
129
+
121
130
  return pd.DataFrame(results.detach().cpu().numpy())
122
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'Series':
131
+ elif (
132
+ hasattr(original_object, "__class__")
133
+ and original_object.__class__.__name__ == "Series"
134
+ ):
123
135
  import pandas as pd
136
+
124
137
  return pd.Series(results.detach().cpu().numpy().flatten())
125
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataArray':
138
+ elif (
139
+ hasattr(original_object, "__class__")
140
+ and original_object.__class__.__name__ == "DataArray"
141
+ ):
126
142
  import xarray as xr
143
+
127
144
  return xr.DataArray(results.detach().cpu().numpy())
128
145
  return results
129
146
 
@@ -43,11 +43,11 @@ def xarray_fn(func: Callable) -> Callable:
43
43
  return xr.DataArray(data)
44
44
  elif isinstance(data, list):
45
45
  return xr.DataArray(data)
46
- elif hasattr(data, '__class__') and data.__class__.__name__ == 'Tensor':
46
+ elif hasattr(data, "__class__") and data.__class__.__name__ == "Tensor":
47
47
  return xr.DataArray(data.detach().cpu().numpy())
48
- elif hasattr(data, '__class__') and data.__class__.__name__ == 'DataFrame':
48
+ elif hasattr(data, "__class__") and data.__class__.__name__ == "DataFrame":
49
49
  return xr.DataArray(data.values)
50
- elif hasattr(data, '__class__') and data.__class__.__name__ == 'Series':
50
+ elif hasattr(data, "__class__") and data.__class__.__name__ == "Series":
51
51
  return xr.DataArray(data.values)
52
52
  else:
53
53
  return xr.DataArray([data])
@@ -57,29 +57,43 @@ def xarray_fn(func: Callable) -> Callable:
57
57
 
58
58
  # Assertion to ensure all args are converted to xarray DataArrays
59
59
  import xarray as xr
60
+
60
61
  for arg_index, arg in enumerate(converted_args):
61
- assert isinstance(
62
- arg, xr.DataArray
63
- ), f"Argument {arg_index} not converted to DataArray: {type(arg)}"
62
+ assert isinstance(arg, xr.DataArray), (
63
+ f"Argument {arg_index} not converted to DataArray: {type(arg)}"
64
+ )
64
65
 
65
66
  results = func(*converted_args, **converted_kwargs)
66
67
 
67
68
  # Convert results back to original input types
68
69
  import xarray as xr
70
+
69
71
  if isinstance(results, xr.DataArray):
70
72
  if original_object is not None:
71
73
  if isinstance(original_object, list):
72
74
  return results.values.tolist()
73
75
  elif isinstance(original_object, np.ndarray):
74
76
  return results.values
75
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'Tensor':
77
+ elif (
78
+ hasattr(original_object, "__class__")
79
+ and original_object.__class__.__name__ == "Tensor"
80
+ ):
76
81
  import torch
82
+
77
83
  return torch.tensor(results.values)
78
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'DataFrame':
84
+ elif (
85
+ hasattr(original_object, "__class__")
86
+ and original_object.__class__.__name__ == "DataFrame"
87
+ ):
79
88
  import pandas as pd
89
+
80
90
  return pd.DataFrame(results.values)
81
- elif hasattr(original_object, '__class__') and original_object.__class__.__name__ == 'Series':
91
+ elif (
92
+ hasattr(original_object, "__class__")
93
+ and original_object.__class__.__name__ == "Series"
94
+ ):
82
95
  import pandas as pd
96
+
83
97
  return pd.Series(results.values.flatten())
84
98
  return results
85
99
 
@@ -97,7 +97,6 @@ class CodeFlowAnalyzer:
97
97
  sequence_orig = self.sequence
98
98
 
99
99
  if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
100
-
101
100
  if node.name not in self.skip_functions:
102
101
  # Track all function definitions
103
102
  self.execution_flow.append((depth, node.name, self.sequence))
@@ -158,7 +157,6 @@ class CodeFlowAnalyzer:
158
157
  filtered_flow = []
159
158
 
160
159
  for depth, call, seq in self.execution_flow:
161
-
162
160
  # Start skipping when encountering private method
163
161
  if call.startswith(("_", "self._")):
164
162
  skip_until_depth = depth
@@ -0,0 +1,272 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/dev/plt/__init__.py
4
+
5
+ """
6
+ Development plotting utilities with three API layers.
7
+
8
+ All plotters follow signature: (plt, rng, ax=None) -> (fig, ax)
9
+
10
+ API Layers:
11
+ -----------
12
+ stx_* : SciTeX canonical (ArrayLike input, tracked)
13
+ sns_* : Seaborn-style (DataFrame input, tracked)
14
+ mpl_* : Matplotlib-style (raw args, tracked)
15
+
16
+ Usage:
17
+ from scitex.dev.plt import PLOTTERS_STX, PLOTTERS_SNS, PLOTTERS_MPL
18
+
19
+ @stx.session
20
+ def main(plt=stx.INJECTED, rng_manager=stx.INJECTED):
21
+ rng = rng_manager("demo")
22
+
23
+ # stx_* API (ArrayLike)
24
+ for name, plotter in PLOTTERS_STX.items():
25
+ fig, ax = plotter(plt, rng)
26
+
27
+ # sns_* API (DataFrame)
28
+ for name, plotter in PLOTTERS_SNS.items():
29
+ fig, ax = plotter(plt, rng)
30
+
31
+ # mpl_* API (matplotlib-style)
32
+ for name, plotter in PLOTTERS_MPL.items():
33
+ fig, ax = plotter(plt, rng)
34
+ """
35
+
36
+ # =============================================================================
37
+ # stx_* API Layer - ArrayLike input (25 plotters)
38
+ # =============================================================================
39
+ from .plot_stx_line import plot_stx_line
40
+ from .plot_stx_mean_std import plot_stx_mean_std
41
+ from .plot_stx_mean_ci import plot_stx_mean_ci
42
+ from .plot_stx_median_iqr import plot_stx_median_iqr
43
+ from .plot_stx_shaded_line import plot_stx_shaded_line
44
+ from .plot_stx_box import plot_stx_box
45
+ from .plot_stx_violin import plot_stx_violin
46
+ from .plot_stx_scatter import plot_stx_scatter
47
+ from .plot_stx_bar import plot_stx_bar
48
+ from .plot_stx_barh import plot_stx_barh
49
+ from .plot_stx_errorbar import plot_stx_errorbar
50
+ from .plot_stx_fill_between import plot_stx_fill_between
51
+ from .plot_stx_kde import plot_stx_kde
52
+ from .plot_stx_ecdf import plot_stx_ecdf
53
+ from .plot_stx_heatmap import plot_stx_heatmap
54
+ from .plot_stx_image import plot_stx_image
55
+ from .plot_stx_imshow import plot_stx_imshow
56
+ from .plot_stx_contour import plot_stx_contour
57
+ from .plot_stx_raster import plot_stx_raster
58
+ from .plot_stx_conf_mat import plot_stx_conf_mat
59
+ from .plot_stx_joyplot import plot_stx_joyplot
60
+ from .plot_stx_rectangle import plot_stx_rectangle
61
+ from .plot_stx_fillv import plot_stx_fillv
62
+ from .plot_stx_boxplot import plot_stx_boxplot
63
+ from .plot_stx_violinplot import plot_stx_violinplot
64
+
65
+ PLOTTERS_STX = {
66
+ "stx_line": plot_stx_line,
67
+ "stx_mean_std": plot_stx_mean_std,
68
+ "stx_mean_ci": plot_stx_mean_ci,
69
+ "stx_median_iqr": plot_stx_median_iqr,
70
+ "stx_shaded_line": plot_stx_shaded_line,
71
+ "stx_box": plot_stx_box,
72
+ "stx_violin": plot_stx_violin,
73
+ "stx_scatter": plot_stx_scatter,
74
+ "stx_bar": plot_stx_bar,
75
+ "stx_barh": plot_stx_barh,
76
+ "stx_errorbar": plot_stx_errorbar,
77
+ "stx_fill_between": plot_stx_fill_between,
78
+ "stx_kde": plot_stx_kde,
79
+ "stx_ecdf": plot_stx_ecdf,
80
+ "stx_heatmap": plot_stx_heatmap,
81
+ "stx_image": plot_stx_image,
82
+ "stx_imshow": plot_stx_imshow,
83
+ "stx_contour": plot_stx_contour,
84
+ "stx_raster": plot_stx_raster,
85
+ "stx_conf_mat": plot_stx_conf_mat,
86
+ "stx_joyplot": plot_stx_joyplot,
87
+ "stx_rectangle": plot_stx_rectangle,
88
+ "stx_fillv": plot_stx_fillv,
89
+ "stx_boxplot": plot_stx_boxplot,
90
+ "stx_violinplot": plot_stx_violinplot,
91
+ }
92
+
93
+ # =============================================================================
94
+ # sns_* API Layer - DataFrame input (10 plotters)
95
+ # =============================================================================
96
+ from .plot_sns_boxplot import plot_sns_boxplot
97
+ from .plot_sns_violinplot import plot_sns_violinplot
98
+ from .plot_sns_barplot import plot_sns_barplot
99
+ from .plot_sns_histplot import plot_sns_histplot
100
+ from .plot_sns_kdeplot import plot_sns_kdeplot
101
+ from .plot_sns_scatterplot import plot_sns_scatterplot
102
+ from .plot_sns_lineplot import plot_sns_lineplot
103
+ from .plot_sns_swarmplot import plot_sns_swarmplot
104
+ from .plot_sns_stripplot import plot_sns_stripplot
105
+ from .plot_sns_heatmap import plot_sns_heatmap
106
+
107
+ PLOTTERS_SNS = {
108
+ "sns_boxplot": plot_sns_boxplot,
109
+ "sns_violinplot": plot_sns_violinplot,
110
+ "sns_barplot": plot_sns_barplot,
111
+ "sns_histplot": plot_sns_histplot,
112
+ "sns_kdeplot": plot_sns_kdeplot,
113
+ "sns_scatterplot": plot_sns_scatterplot,
114
+ "sns_lineplot": plot_sns_lineplot,
115
+ "sns_swarmplot": plot_sns_swarmplot,
116
+ "sns_stripplot": plot_sns_stripplot,
117
+ "sns_heatmap": plot_sns_heatmap,
118
+ }
119
+
120
+ # =============================================================================
121
+ # mpl_* API Layer - Matplotlib-style input (26 plotters)
122
+ # =============================================================================
123
+ from .plot_mpl_plot import plot_mpl_plot
124
+ from .plot_mpl_scatter import plot_mpl_scatter
125
+ from .plot_mpl_bar import plot_mpl_bar
126
+ from .plot_mpl_barh import plot_mpl_barh
127
+ from .plot_mpl_hist import plot_mpl_hist
128
+ from .plot_mpl_hist2d import plot_mpl_hist2d
129
+ from .plot_mpl_hexbin import plot_mpl_hexbin
130
+ from .plot_mpl_boxplot import plot_mpl_boxplot
131
+ from .plot_mpl_violinplot import plot_mpl_violinplot
132
+ from .plot_mpl_errorbar import plot_mpl_errorbar
133
+ from .plot_mpl_step import plot_mpl_step
134
+ from .plot_mpl_stem import plot_mpl_stem
135
+ from .plot_mpl_fill import plot_mpl_fill
136
+ from .plot_mpl_fill_between import plot_mpl_fill_between
137
+ from .plot_mpl_stackplot import plot_mpl_stackplot
138
+ from .plot_mpl_contour import plot_mpl_contour
139
+ from .plot_mpl_contourf import plot_mpl_contourf
140
+ from .plot_mpl_imshow import plot_mpl_imshow
141
+ from .plot_mpl_pcolormesh import plot_mpl_pcolormesh
142
+ from .plot_mpl_pie import plot_mpl_pie
143
+ from .plot_mpl_eventplot import plot_mpl_eventplot
144
+ from .plot_mpl_quiver import plot_mpl_quiver
145
+ from .plot_mpl_axhline import plot_mpl_axhline
146
+ from .plot_mpl_axvline import plot_mpl_axvline
147
+ from .plot_mpl_axhspan import plot_mpl_axhspan
148
+ from .plot_mpl_axvspan import plot_mpl_axvspan
149
+
150
+ PLOTTERS_MPL = {
151
+ "mpl_plot": plot_mpl_plot,
152
+ "mpl_scatter": plot_mpl_scatter,
153
+ "mpl_bar": plot_mpl_bar,
154
+ "mpl_barh": plot_mpl_barh,
155
+ "mpl_hist": plot_mpl_hist,
156
+ "mpl_hist2d": plot_mpl_hist2d,
157
+ "mpl_hexbin": plot_mpl_hexbin,
158
+ "mpl_boxplot": plot_mpl_boxplot,
159
+ "mpl_violinplot": plot_mpl_violinplot,
160
+ "mpl_errorbar": plot_mpl_errorbar,
161
+ "mpl_step": plot_mpl_step,
162
+ "mpl_stem": plot_mpl_stem,
163
+ "mpl_fill": plot_mpl_fill,
164
+ "mpl_fill_between": plot_mpl_fill_between,
165
+ "mpl_stackplot": plot_mpl_stackplot,
166
+ "mpl_contour": plot_mpl_contour,
167
+ "mpl_contourf": plot_mpl_contourf,
168
+ "mpl_imshow": plot_mpl_imshow,
169
+ "mpl_pcolormesh": plot_mpl_pcolormesh,
170
+ "mpl_pie": plot_mpl_pie,
171
+ "mpl_eventplot": plot_mpl_eventplot,
172
+ "mpl_quiver": plot_mpl_quiver,
173
+ "mpl_axhline": plot_mpl_axhline,
174
+ "mpl_axvline": plot_mpl_axvline,
175
+ "mpl_axhspan": plot_mpl_axhspan,
176
+ "mpl_axvspan": plot_mpl_axvspan,
177
+ }
178
+
179
+ # =============================================================================
180
+ # Combined registry
181
+ # =============================================================================
182
+ PLOTTERS = {**PLOTTERS_STX, **PLOTTERS_SNS, **PLOTTERS_MPL}
183
+
184
+
185
+ def get_plotter(name):
186
+ """Get a plotter function by name."""
187
+ if name in PLOTTERS:
188
+ return PLOTTERS[name]
189
+ raise KeyError(f"Unknown plotter: {name}. Available: {list(PLOTTERS.keys())}")
190
+
191
+
192
+ def list_plotters():
193
+ """List all available plotter names."""
194
+ return list(PLOTTERS.keys())
195
+
196
+
197
+ __all__ = [
198
+ # stx_* plotters (25)
199
+ "plot_stx_line",
200
+ "plot_stx_mean_std",
201
+ "plot_stx_mean_ci",
202
+ "plot_stx_median_iqr",
203
+ "plot_stx_shaded_line",
204
+ "plot_stx_box",
205
+ "plot_stx_violin",
206
+ "plot_stx_scatter",
207
+ "plot_stx_bar",
208
+ "plot_stx_barh",
209
+ "plot_stx_errorbar",
210
+ "plot_stx_fill_between",
211
+ "plot_stx_kde",
212
+ "plot_stx_ecdf",
213
+ "plot_stx_heatmap",
214
+ "plot_stx_image",
215
+ "plot_stx_imshow",
216
+ "plot_stx_contour",
217
+ "plot_stx_raster",
218
+ "plot_stx_conf_mat",
219
+ "plot_stx_joyplot",
220
+ "plot_stx_rectangle",
221
+ "plot_stx_fillv",
222
+ "plot_stx_boxplot",
223
+ "plot_stx_violinplot",
224
+ # sns_* plotters (10)
225
+ "plot_sns_boxplot",
226
+ "plot_sns_violinplot",
227
+ "plot_sns_barplot",
228
+ "plot_sns_histplot",
229
+ "plot_sns_kdeplot",
230
+ "plot_sns_scatterplot",
231
+ "plot_sns_lineplot",
232
+ "plot_sns_swarmplot",
233
+ "plot_sns_stripplot",
234
+ "plot_sns_heatmap",
235
+ # mpl_* plotters (26)
236
+ "plot_mpl_plot",
237
+ "plot_mpl_scatter",
238
+ "plot_mpl_bar",
239
+ "plot_mpl_barh",
240
+ "plot_mpl_hist",
241
+ "plot_mpl_hist2d",
242
+ "plot_mpl_hexbin",
243
+ "plot_mpl_boxplot",
244
+ "plot_mpl_violinplot",
245
+ "plot_mpl_errorbar",
246
+ "plot_mpl_step",
247
+ "plot_mpl_stem",
248
+ "plot_mpl_fill",
249
+ "plot_mpl_fill_between",
250
+ "plot_mpl_stackplot",
251
+ "plot_mpl_contour",
252
+ "plot_mpl_contourf",
253
+ "plot_mpl_imshow",
254
+ "plot_mpl_pcolormesh",
255
+ "plot_mpl_pie",
256
+ "plot_mpl_eventplot",
257
+ "plot_mpl_quiver",
258
+ "plot_mpl_axhline",
259
+ "plot_mpl_axvline",
260
+ "plot_mpl_axhspan",
261
+ "plot_mpl_axvspan",
262
+ # Registries
263
+ "PLOTTERS_STX",
264
+ "PLOTTERS_SNS",
265
+ "PLOTTERS_MPL",
266
+ "PLOTTERS",
267
+ # Helper functions
268
+ "get_plotter",
269
+ "list_plotters",
270
+ ]
271
+
272
+ # EOF
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_mpl_axhline.py - mpl_axhline demo
4
+
5
+ """mpl_axhline: horizontal line."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_mpl_axhline(plt, rng, ax=None):
11
+ """mpl_axhline - horizontal line.
12
+
13
+ Demonstrates: ax.mpl_axhline() - identical to ax.axhline()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ ax.plot(rng.uniform(0, 10, 20))
21
+ ax.mpl_axhline(y=5, color='r', linestyle='--', label='threshold')
22
+ ax.set_xyt("X", "Y", "mpl_axhline")
23
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
24
+ ax.legend()
25
+ return fig, ax
26
+
27
+
28
+ # EOF
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_mpl_axhspan.py - mpl_axhspan demo
4
+
5
+ """mpl_axhspan: horizontal span."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_mpl_axhspan(plt, rng, ax=None):
11
+ """mpl_axhspan - horizontal span.
12
+
13
+ Demonstrates: ax.mpl_axhspan() - identical to ax.axhspan()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ ax.plot(rng.uniform(0, 10, 20))
21
+ ax.mpl_axhspan(3, 7, alpha=0.3, color='yellow', label='range')
22
+ ax.set_xyt("X", "Y", "mpl_axhspan")
23
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
24
+ ax.legend()
25
+ return fig, ax
26
+
27
+
28
+ # EOF
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_mpl_axvline.py - mpl_axvline demo
4
+
5
+ """mpl_axvline: vertical line."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_mpl_axvline(plt, rng, ax=None):
11
+ """mpl_axvline - vertical line.
12
+
13
+ Demonstrates: ax.mpl_axvline() - identical to ax.axvline()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ ax.plot(rng.uniform(0, 10, 20))
21
+ ax.mpl_axvline(x=10, color='r', linestyle='--', label='event')
22
+ ax.set_xyt("X", "Y", "mpl_axvline")
23
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
24
+ ax.legend()
25
+ return fig, ax
26
+
27
+
28
+ # EOF