scitex 2.0.0__py2.py3-none-any.whl → 2.1.0__py2.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 (704) hide show
  1. scitex/__init__.py +53 -15
  2. scitex/__main__.py +72 -26
  3. scitex/__version__.py +1 -1
  4. scitex/_sh.py +145 -23
  5. scitex/ai/__init__.py +30 -16
  6. scitex/ai/_gen_ai/_Anthropic.py +5 -7
  7. scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
  8. scitex/ai/_gen_ai/_DeepSeek.py +10 -2
  9. scitex/ai/_gen_ai/_Google.py +2 -2
  10. scitex/ai/_gen_ai/_Llama.py +2 -2
  11. scitex/ai/_gen_ai/_OpenAI.py +2 -2
  12. scitex/ai/_gen_ai/_PARAMS.py +51 -65
  13. scitex/ai/_gen_ai/_Perplexity.py +2 -2
  14. scitex/ai/_gen_ai/__init__.py +25 -14
  15. scitex/ai/_gen_ai/_format_output_func.py +4 -4
  16. scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
  17. scitex/ai/classification/CrossValidationExperiment.py +374 -0
  18. scitex/ai/classification/__init__.py +43 -4
  19. scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
  20. scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
  21. scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
  22. scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
  23. scitex/ai/classification/reporters/__init__.py +11 -0
  24. scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
  25. scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
  26. scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
  27. scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
  28. scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
  29. scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
  30. scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
  31. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
  32. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
  33. scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
  34. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
  35. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
  36. scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
  37. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
  38. scitex/ai/classification/timeseries/__init__.py +39 -0
  39. scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
  40. scitex/ai/clustering/_umap.py +2 -2
  41. scitex/ai/feature_extraction/vit.py +1 -0
  42. scitex/ai/feature_selection/__init__.py +30 -0
  43. scitex/ai/feature_selection/feature_selection.py +364 -0
  44. scitex/ai/loss/multi_task_loss.py +1 -1
  45. scitex/ai/metrics/__init__.py +51 -4
  46. scitex/ai/metrics/_calc_bacc.py +61 -0
  47. scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
  48. scitex/ai/metrics/_calc_clf_report.py +78 -0
  49. scitex/ai/metrics/_calc_conf_mat.py +93 -0
  50. scitex/ai/metrics/_calc_feature_importance.py +183 -0
  51. scitex/ai/metrics/_calc_mcc.py +61 -0
  52. scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
  53. scitex/ai/metrics/_calc_roc_auc.py +110 -0
  54. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
  55. scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
  56. scitex/ai/metrics/_normalize_labels.py +83 -0
  57. scitex/ai/plt/__init__.py +47 -8
  58. scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
  59. scitex/ai/plt/_plot_feature_importance.py +323 -0
  60. scitex/ai/plt/_plot_learning_curve.py +345 -0
  61. scitex/ai/plt/_plot_optuna_study.py +225 -0
  62. scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
  63. scitex/ai/plt/_plot_roc_curve.py +255 -0
  64. scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
  65. scitex/ai/training/__init__.py +2 -2
  66. scitex/ai/utils/grid_search.py +3 -3
  67. scitex/benchmark/__init__.py +52 -0
  68. scitex/benchmark/benchmark.py +400 -0
  69. scitex/benchmark/monitor.py +370 -0
  70. scitex/benchmark/profiler.py +297 -0
  71. scitex/browser/__init__.py +48 -0
  72. scitex/browser/automation/CookieHandler.py +216 -0
  73. scitex/browser/automation/__init__.py +7 -0
  74. scitex/browser/collaboration/__init__.py +55 -0
  75. scitex/browser/collaboration/auth_helpers.py +94 -0
  76. scitex/browser/collaboration/collaborative_agent.py +136 -0
  77. scitex/browser/collaboration/credential_manager.py +188 -0
  78. scitex/browser/collaboration/interactive_panel.py +400 -0
  79. scitex/browser/collaboration/persistent_browser.py +170 -0
  80. scitex/browser/collaboration/shared_session.py +383 -0
  81. scitex/browser/collaboration/standard_interactions.py +246 -0
  82. scitex/browser/collaboration/visual_feedback.py +181 -0
  83. scitex/browser/core/BrowserMixin.py +326 -0
  84. scitex/browser/core/ChromeProfileManager.py +446 -0
  85. scitex/browser/core/__init__.py +9 -0
  86. scitex/browser/debugging/__init__.py +18 -0
  87. scitex/browser/debugging/_browser_logger.py +657 -0
  88. scitex/browser/debugging/_highlight_element.py +143 -0
  89. scitex/browser/debugging/_show_grid.py +154 -0
  90. scitex/browser/interaction/__init__.py +24 -0
  91. scitex/browser/interaction/click_center.py +149 -0
  92. scitex/browser/interaction/click_with_fallbacks.py +206 -0
  93. scitex/browser/interaction/close_popups.py +498 -0
  94. scitex/browser/interaction/fill_with_fallbacks.py +209 -0
  95. scitex/browser/pdf/__init__.py +14 -0
  96. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
  97. scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
  98. scitex/browser/remote/CaptchaHandler.py +434 -0
  99. scitex/browser/remote/ZenRowsAPIClient.py +347 -0
  100. scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
  101. scitex/browser/remote/__init__.py +11 -0
  102. scitex/browser/stealth/HumanBehavior.py +344 -0
  103. scitex/browser/stealth/StealthManager.py +1008 -0
  104. scitex/browser/stealth/__init__.py +9 -0
  105. scitex/browser/template.py +122 -0
  106. scitex/capture/__init__.py +110 -0
  107. scitex/capture/__main__.py +25 -0
  108. scitex/capture/capture.py +848 -0
  109. scitex/capture/cli.py +233 -0
  110. scitex/capture/gif.py +344 -0
  111. scitex/capture/mcp_server.py +961 -0
  112. scitex/capture/session.py +70 -0
  113. scitex/capture/utils.py +705 -0
  114. scitex/cli/__init__.py +17 -0
  115. scitex/cli/cloud.py +447 -0
  116. scitex/cli/main.py +42 -0
  117. scitex/cli/scholar.py +280 -0
  118. scitex/context/_suppress_output.py +5 -3
  119. scitex/db/__init__.py +30 -3
  120. scitex/db/__main__.py +75 -0
  121. scitex/db/_check_health.py +381 -0
  122. scitex/db/_delete_duplicates.py +25 -386
  123. scitex/db/_inspect.py +335 -114
  124. scitex/db/_inspect_optimized.py +301 -0
  125. scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
  126. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
  127. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
  128. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
  129. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
  130. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
  131. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
  132. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
  133. scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
  134. scitex/db/_postgresql/__init__.py +6 -0
  135. scitex/db/_sqlite3/_SQLite3.py +210 -0
  136. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
  137. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
  138. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
  139. scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
  140. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
  141. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
  142. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
  143. scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
  144. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
  145. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
  146. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
  147. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
  148. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
  149. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
  150. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
  151. scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
  152. scitex/db/_sqlite3/__init__.py +7 -0
  153. scitex/db/_sqlite3/_delete_duplicates.py +274 -0
  154. scitex/decorators/__init__.py +2 -0
  155. scitex/decorators/_cache_disk.py +13 -5
  156. scitex/decorators/_cache_disk_async.py +49 -0
  157. scitex/decorators/_deprecated.py +175 -10
  158. scitex/decorators/_timeout.py +1 -1
  159. scitex/dev/_analyze_code_flow.py +2 -2
  160. scitex/dict/_DotDict.py +73 -15
  161. scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
  162. scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
  163. scitex/dict/__init__.py +2 -0
  164. scitex/dict/_flatten.py +27 -0
  165. scitex/dsp/_crop.py +2 -2
  166. scitex/dsp/_demo_sig.py +2 -2
  167. scitex/dsp/_detect_ripples.py +2 -2
  168. scitex/dsp/_hilbert.py +2 -2
  169. scitex/dsp/_listen.py +6 -6
  170. scitex/dsp/_modulation_index.py +2 -2
  171. scitex/dsp/_pac.py +1 -1
  172. scitex/dsp/_psd.py +2 -2
  173. scitex/dsp/_resample.py +2 -1
  174. scitex/dsp/_time.py +3 -2
  175. scitex/dsp/_wavelet.py +3 -2
  176. scitex/dsp/add_noise.py +2 -2
  177. scitex/dsp/example.py +1 -0
  178. scitex/dsp/filt.py +10 -9
  179. scitex/dsp/template.py +3 -2
  180. scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
  181. scitex/dsp/utils/pac.py +2 -2
  182. scitex/dt/_normalize_timestamp.py +432 -0
  183. scitex/errors.py +572 -0
  184. scitex/gen/_DimHandler.py +2 -2
  185. scitex/gen/__init__.py +37 -7
  186. scitex/gen/_deprecated_close.py +80 -0
  187. scitex/gen/_deprecated_start.py +26 -0
  188. scitex/gen/_detect_environment.py +152 -0
  189. scitex/gen/_detect_notebook_path.py +169 -0
  190. scitex/gen/_embed.py +6 -2
  191. scitex/gen/_get_notebook_path.py +257 -0
  192. scitex/gen/_less.py +1 -1
  193. scitex/gen/_list_packages.py +2 -2
  194. scitex/gen/_norm.py +44 -9
  195. scitex/gen/_norm_cache.py +269 -0
  196. scitex/gen/_src.py +3 -5
  197. scitex/gen/_title_case.py +3 -3
  198. scitex/io/__init__.py +28 -6
  199. scitex/io/_glob.py +13 -7
  200. scitex/io/_load.py +108 -21
  201. scitex/io/_load_cache.py +303 -0
  202. scitex/io/_load_configs.py +40 -15
  203. scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
  204. scitex/io/_load_modules/_ZarrExplorer.py +114 -0
  205. scitex/io/_load_modules/_bibtex.py +207 -0
  206. scitex/io/_load_modules/_hdf5.py +53 -178
  207. scitex/io/_load_modules/_json.py +5 -3
  208. scitex/io/_load_modules/_pdf.py +871 -16
  209. scitex/io/_load_modules/_sqlite3.py +15 -0
  210. scitex/io/_load_modules/_txt.py +41 -12
  211. scitex/io/_load_modules/_yaml.py +4 -3
  212. scitex/io/_load_modules/_zarr.py +126 -0
  213. scitex/io/_save.py +429 -171
  214. scitex/io/_save_modules/__init__.py +6 -0
  215. scitex/io/_save_modules/_bibtex.py +194 -0
  216. scitex/io/_save_modules/_csv.py +8 -4
  217. scitex/io/_save_modules/_excel.py +174 -15
  218. scitex/io/_save_modules/_hdf5.py +251 -226
  219. scitex/io/_save_modules/_image.py +1 -3
  220. scitex/io/_save_modules/_json.py +49 -4
  221. scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
  222. scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
  223. scitex/io/_save_modules/_tex.py +277 -0
  224. scitex/io/_save_modules/_yaml.py +42 -3
  225. scitex/io/_save_modules/_zarr.py +160 -0
  226. scitex/io/utils/__init__.py +20 -0
  227. scitex/io/utils/h5_to_zarr.py +616 -0
  228. scitex/linalg/_geometric_median.py +6 -2
  229. scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
  230. scitex/logging/__init__.py +122 -0
  231. scitex/logging/_config.py +158 -0
  232. scitex/logging/_context.py +103 -0
  233. scitex/logging/_formatters.py +128 -0
  234. scitex/logging/_handlers.py +64 -0
  235. scitex/logging/_levels.py +35 -0
  236. scitex/logging/_logger.py +163 -0
  237. scitex/logging/_print_capture.py +95 -0
  238. scitex/ml/__init__.py +69 -0
  239. scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
  240. scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
  241. scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
  242. scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
  243. scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
  244. scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
  245. scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
  246. scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
  247. scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
  248. scitex/ml/_gen_ai/__init__.py +43 -0
  249. scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
  250. scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
  251. scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
  252. scitex/ml/activation/__init__.py +8 -0
  253. scitex/ml/activation/_define.py +11 -0
  254. scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
  255. scitex/ml/classification/CrossValidationExperiment.py +374 -0
  256. scitex/ml/classification/__init__.py +46 -0
  257. scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
  258. scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
  259. scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
  260. scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
  261. scitex/ml/classification/reporters/__init__.py +11 -0
  262. scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
  263. scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
  264. scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
  265. scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
  266. scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
  267. scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
  268. scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
  269. scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
  270. scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
  271. scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
  272. scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
  273. scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
  274. scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
  275. scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
  276. scitex/ml/classification/timeseries/__init__.py +39 -0
  277. scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
  278. scitex/ml/clustering/__init__.py +11 -0
  279. scitex/ml/clustering/_pca.py +115 -0
  280. scitex/ml/clustering/_umap.py +376 -0
  281. scitex/ml/feature_extraction/__init__.py +56 -0
  282. scitex/ml/feature_extraction/vit.py +149 -0
  283. scitex/ml/feature_selection/__init__.py +30 -0
  284. scitex/ml/feature_selection/feature_selection.py +364 -0
  285. scitex/ml/loss/_L1L2Losses.py +34 -0
  286. scitex/ml/loss/__init__.py +12 -0
  287. scitex/ml/loss/multi_task_loss.py +47 -0
  288. scitex/ml/metrics/__init__.py +56 -0
  289. scitex/ml/metrics/_calc_bacc.py +61 -0
  290. scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
  291. scitex/ml/metrics/_calc_clf_report.py +78 -0
  292. scitex/ml/metrics/_calc_conf_mat.py +93 -0
  293. scitex/ml/metrics/_calc_feature_importance.py +183 -0
  294. scitex/ml/metrics/_calc_mcc.py +61 -0
  295. scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
  296. scitex/ml/metrics/_calc_roc_auc.py +110 -0
  297. scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
  298. scitex/ml/metrics/_calc_silhouette_score.py +503 -0
  299. scitex/ml/metrics/_normalize_labels.py +83 -0
  300. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  301. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  302. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  303. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  304. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  305. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  306. scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  307. scitex/ml/optim/__init__.py +13 -0
  308. scitex/ml/optim/_get_set.py +31 -0
  309. scitex/ml/optim/_optimizers.py +71 -0
  310. scitex/ml/plt/__init__.py +60 -0
  311. scitex/ml/plt/_plot_conf_mat.py +663 -0
  312. scitex/ml/plt/_plot_feature_importance.py +323 -0
  313. scitex/ml/plt/_plot_learning_curve.py +345 -0
  314. scitex/ml/plt/_plot_optuna_study.py +225 -0
  315. scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
  316. scitex/ml/plt/_plot_roc_curve.py +255 -0
  317. scitex/ml/sk/__init__.py +11 -0
  318. scitex/ml/sk/_clf.py +58 -0
  319. scitex/ml/sk/_to_sktime.py +100 -0
  320. scitex/ml/sklearn/__init__.py +26 -0
  321. scitex/ml/sklearn/clf.py +58 -0
  322. scitex/ml/sklearn/to_sktime.py +100 -0
  323. scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
  324. scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
  325. scitex/ml/training/__init__.py +7 -0
  326. scitex/ml/utils/__init__.py +22 -0
  327. scitex/ml/utils/_check_params.py +50 -0
  328. scitex/ml/utils/_default_dataset.py +46 -0
  329. scitex/ml/utils/_format_samples_for_sktime.py +26 -0
  330. scitex/ml/utils/_label_encoder.py +134 -0
  331. scitex/ml/utils/_merge_labels.py +22 -0
  332. scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
  333. scitex/ml/utils/_under_sample.py +51 -0
  334. scitex/ml/utils/_verify_n_gpus.py +16 -0
  335. scitex/ml/utils/grid_search.py +148 -0
  336. scitex/nn/_BNet.py +15 -9
  337. scitex/nn/_Filters.py +2 -2
  338. scitex/nn/_ModulationIndex.py +2 -2
  339. scitex/nn/_PAC.py +1 -1
  340. scitex/nn/_Spectrogram.py +12 -3
  341. scitex/nn/__init__.py +9 -10
  342. scitex/path/__init__.py +18 -0
  343. scitex/path/_clean.py +4 -0
  344. scitex/path/_find.py +9 -4
  345. scitex/path/_symlink.py +348 -0
  346. scitex/path/_version.py +4 -3
  347. scitex/pd/__init__.py +2 -0
  348. scitex/pd/_get_unique.py +99 -0
  349. scitex/plt/__init__.py +114 -5
  350. scitex/plt/_subplots/_AxesWrapper.py +1 -3
  351. scitex/plt/_subplots/_AxisWrapper.py +7 -3
  352. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
  353. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
  354. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
  355. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
  356. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
  357. scitex/plt/_subplots/_FigWrapper.py +62 -6
  358. scitex/plt/_subplots/_export_as_csv.py +43 -27
  359. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
  360. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
  361. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
  362. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
  363. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
  364. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
  365. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
  366. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
  367. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
  368. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
  369. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
  370. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
  371. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
  372. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
  373. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
  374. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
  375. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
  376. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
  377. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
  378. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
  379. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
  380. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
  407. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
  408. scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
  409. scitex/plt/ax/_style/_hide_spines.py +1 -3
  410. scitex/plt/ax/_style/_rotate_labels.py +180 -76
  411. scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
  412. scitex/plt/ax/_style/_set_meta.py +11 -4
  413. scitex/plt/ax/_style/_set_supxyt.py +3 -3
  414. scitex/plt/ax/_style/_set_xyt.py +3 -3
  415. scitex/plt/ax/_style/_share_axes.py +2 -2
  416. scitex/plt/color/__init__.py +4 -4
  417. scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
  418. scitex/plt/utils/_configure_mpl.py +99 -86
  419. scitex/plt/utils/_histogram_utils.py +1 -3
  420. scitex/plt/utils/_is_valid_axis.py +1 -3
  421. scitex/plt/utils/_scitex_config.py +1 -0
  422. scitex/repro/__init__.py +75 -0
  423. scitex/{reproduce → repro}/_gen_ID.py +1 -1
  424. scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
  425. scitex/repro_rng/_RandomStateManager.py +590 -0
  426. scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
  427. scitex/repro_rng/__init__.py +39 -0
  428. scitex/reproduce/__init__.py +25 -13
  429. scitex/reproduce/_hash_array.py +22 -0
  430. scitex/resource/_get_processor_usages.py +4 -4
  431. scitex/resource/_get_specs.py +2 -2
  432. scitex/resource/_log_processor_usages.py +2 -2
  433. scitex/rng/_RandomStateManager.py +590 -0
  434. scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
  435. scitex/rng/__init__.py +39 -0
  436. scitex/scholar/__init__.py +309 -19
  437. scitex/scholar/__main__.py +319 -0
  438. scitex/scholar/auth/ScholarAuthManager.py +308 -0
  439. scitex/scholar/auth/__init__.py +12 -0
  440. scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
  441. scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
  442. scitex/scholar/auth/core/StrategyResolver.py +309 -0
  443. scitex/scholar/auth/core/__init__.py +16 -0
  444. scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
  445. scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
  446. scitex/scholar/auth/gateway/__init__.py +38 -0
  447. scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
  448. scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
  449. scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
  450. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
  451. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
  452. scitex/scholar/auth/providers/__init__.py +18 -0
  453. scitex/scholar/auth/session/AuthCacheManager.py +189 -0
  454. scitex/scholar/auth/session/SessionManager.py +159 -0
  455. scitex/scholar/auth/session/__init__.py +11 -0
  456. scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
  457. scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
  458. scitex/scholar/auth/sso/SSOAutomator.py +180 -0
  459. scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
  460. scitex/scholar/auth/sso/__init__.py +15 -0
  461. scitex/scholar/browser/ScholarBrowserManager.py +705 -0
  462. scitex/scholar/browser/__init__.py +38 -0
  463. scitex/scholar/browser/utils/__init__.py +13 -0
  464. scitex/scholar/browser/utils/click_and_wait.py +205 -0
  465. scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
  466. scitex/scholar/browser/utils/wait_redirects.py +732 -0
  467. scitex/scholar/config/PublisherRules.py +132 -0
  468. scitex/scholar/config/ScholarConfig.py +126 -0
  469. scitex/scholar/config/__init__.py +17 -0
  470. scitex/scholar/core/Paper.py +627 -0
  471. scitex/scholar/core/Papers.py +722 -0
  472. scitex/scholar/core/Scholar.py +1975 -0
  473. scitex/scholar/core/__init__.py +9 -0
  474. scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
  475. scitex/scholar/impact_factor/__init__.py +20 -0
  476. scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
  477. scitex/scholar/impact_factor/estimation/__init__.py +40 -0
  478. scitex/scholar/impact_factor/estimation/build_database.py +0 -0
  479. scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
  480. scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
  481. scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
  482. scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
  483. scitex/scholar/integration/__init__.py +59 -0
  484. scitex/scholar/integration/base.py +502 -0
  485. scitex/scholar/integration/mendeley/__init__.py +22 -0
  486. scitex/scholar/integration/mendeley/exporter.py +166 -0
  487. scitex/scholar/integration/mendeley/importer.py +236 -0
  488. scitex/scholar/integration/mendeley/linker.py +79 -0
  489. scitex/scholar/integration/mendeley/mapper.py +212 -0
  490. scitex/scholar/integration/zotero/__init__.py +27 -0
  491. scitex/scholar/integration/zotero/__main__.py +264 -0
  492. scitex/scholar/integration/zotero/exporter.py +351 -0
  493. scitex/scholar/integration/zotero/importer.py +372 -0
  494. scitex/scholar/integration/zotero/linker.py +415 -0
  495. scitex/scholar/integration/zotero/mapper.py +286 -0
  496. scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
  497. scitex/scholar/metadata_engines/__init__.py +21 -0
  498. scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
  499. scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
  500. scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
  501. scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
  502. scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
  503. scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
  504. scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
  505. scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
  506. scitex/scholar/metadata_engines/individual/__init__.py +7 -0
  507. scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
  508. scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
  509. scitex/scholar/metadata_engines/utils/__init__.py +30 -0
  510. scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
  511. scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
  512. scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
  513. scitex/scholar/pdf_download/__init__.py +5 -0
  514. scitex/scholar/pdf_download/strategies/__init__.py +38 -0
  515. scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
  516. scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
  517. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
  518. scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
  519. scitex/scholar/pdf_download/strategies/response_body.py +207 -0
  520. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
  521. scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
  522. scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
  523. scitex/scholar/pipelines/__init__.py +49 -0
  524. scitex/scholar/storage/BibTeXHandler.py +1018 -0
  525. scitex/scholar/storage/PaperIO.py +468 -0
  526. scitex/scholar/storage/ScholarLibrary.py +182 -0
  527. scitex/scholar/storage/_DeduplicationManager.py +548 -0
  528. scitex/scholar/storage/_LibraryCacheManager.py +724 -0
  529. scitex/scholar/storage/_LibraryManager.py +1835 -0
  530. scitex/scholar/storage/__init__.py +28 -0
  531. scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
  532. scitex/scholar/url_finder/__init__.py +7 -0
  533. scitex/scholar/url_finder/strategies/__init__.py +33 -0
  534. scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
  535. scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
  536. scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
  537. scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
  538. scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
  539. scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
  540. scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
  541. scitex/scholar/utils/__init__.py +22 -0
  542. scitex/scholar/utils/bibtex/__init__.py +9 -0
  543. scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
  544. scitex/scholar/utils/cleanup/__init__.py +8 -0
  545. scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
  546. scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
  547. scitex/scholar/utils/text/_TextNormalizer.py +407 -0
  548. scitex/scholar/utils/text/__init__.py +9 -0
  549. scitex/scholar/zotero/__init__.py +38 -0
  550. scitex/session/__init__.py +51 -0
  551. scitex/session/_lifecycle.py +736 -0
  552. scitex/session/_manager.py +102 -0
  553. scitex/session/template.py +122 -0
  554. scitex/stats/__init__.py +30 -26
  555. scitex/stats/correct/__init__.py +21 -0
  556. scitex/stats/correct/_correct_bonferroni.py +551 -0
  557. scitex/stats/correct/_correct_fdr.py +634 -0
  558. scitex/stats/correct/_correct_holm.py +548 -0
  559. scitex/stats/correct/_correct_sidak.py +499 -0
  560. scitex/stats/descriptive/__init__.py +85 -0
  561. scitex/stats/descriptive/_circular.py +540 -0
  562. scitex/stats/descriptive/_describe.py +219 -0
  563. scitex/stats/descriptive/_nan.py +518 -0
  564. scitex/stats/descriptive/_real.py +189 -0
  565. scitex/stats/effect_sizes/__init__.py +41 -0
  566. scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
  567. scitex/stats/effect_sizes/_cohens_d.py +342 -0
  568. scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
  569. scitex/stats/effect_sizes/_eta_squared.py +302 -0
  570. scitex/stats/effect_sizes/_prob_superiority.py +296 -0
  571. scitex/stats/posthoc/__init__.py +19 -0
  572. scitex/stats/posthoc/_dunnett.py +463 -0
  573. scitex/stats/posthoc/_games_howell.py +383 -0
  574. scitex/stats/posthoc/_tukey_hsd.py +367 -0
  575. scitex/stats/power/__init__.py +19 -0
  576. scitex/stats/power/_power.py +433 -0
  577. scitex/stats/template.py +119 -0
  578. scitex/stats/utils/__init__.py +62 -0
  579. scitex/stats/utils/_effect_size.py +985 -0
  580. scitex/stats/utils/_formatters.py +270 -0
  581. scitex/stats/utils/_normalizers.py +927 -0
  582. scitex/stats/utils/_power.py +433 -0
  583. scitex/stats_v01/_EffectSizeCalculator.py +488 -0
  584. scitex/stats_v01/_StatisticalValidator.py +411 -0
  585. scitex/stats_v01/__init__.py +60 -0
  586. scitex/stats_v01/_additional_tests.py +415 -0
  587. scitex/{stats → stats_v01}/_p2stars.py +19 -5
  588. scitex/stats_v01/_two_sample_tests.py +141 -0
  589. scitex/stats_v01/desc/__init__.py +83 -0
  590. scitex/stats_v01/desc/_circular.py +540 -0
  591. scitex/stats_v01/desc/_describe.py +219 -0
  592. scitex/stats_v01/desc/_nan.py +518 -0
  593. scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
  594. scitex/stats_v01/desc/_real.py +189 -0
  595. scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
  596. scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
  597. scitex/str/__init__.py +1 -3
  598. scitex/str/_clean_path.py +6 -2
  599. scitex/str/_latex_fallback.py +267 -160
  600. scitex/str/_parse.py +44 -36
  601. scitex/str/_printc.py +1 -3
  602. scitex/template/__init__.py +87 -0
  603. scitex/template/_create_project.py +267 -0
  604. scitex/template/create_pip_project.py +80 -0
  605. scitex/template/create_research.py +80 -0
  606. scitex/template/create_singularity.py +80 -0
  607. scitex/units.py +291 -0
  608. scitex/utils/_compress_hdf5.py +14 -3
  609. scitex/utils/_email.py +21 -2
  610. scitex/utils/_grid.py +6 -4
  611. scitex/utils/_notify.py +13 -10
  612. scitex/utils/_verify_scitex_format.py +589 -0
  613. scitex/utils/_verify_scitex_format_v01.py +370 -0
  614. scitex/utils/template.py +122 -0
  615. scitex/web/_search_pubmed.py +62 -16
  616. scitex-2.1.0.dist-info/LICENSE +21 -0
  617. scitex-2.1.0.dist-info/METADATA +677 -0
  618. scitex-2.1.0.dist-info/RECORD +919 -0
  619. {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
  620. scitex-2.1.0.dist-info/entry_points.txt +3 -0
  621. scitex/ai/__Classifiers.py +0 -101
  622. scitex/ai/classification/classification_reporter.py +0 -1137
  623. scitex/ai/classification/classifiers.py +0 -101
  624. scitex/ai/classification_reporter.py +0 -1161
  625. scitex/ai/genai/__init__.py +0 -277
  626. scitex/ai/genai/anthropic_provider.py +0 -320
  627. scitex/ai/genai/anthropic_refactored.py +0 -109
  628. scitex/ai/genai/auth_manager.py +0 -200
  629. scitex/ai/genai/base_provider.py +0 -291
  630. scitex/ai/genai/chat_history.py +0 -307
  631. scitex/ai/genai/cost_tracker.py +0 -276
  632. scitex/ai/genai/deepseek_provider.py +0 -251
  633. scitex/ai/genai/google_provider.py +0 -228
  634. scitex/ai/genai/groq_provider.py +0 -248
  635. scitex/ai/genai/image_processor.py +0 -250
  636. scitex/ai/genai/llama_provider.py +0 -214
  637. scitex/ai/genai/mock_provider.py +0 -127
  638. scitex/ai/genai/model_registry.py +0 -304
  639. scitex/ai/genai/openai_provider.py +0 -293
  640. scitex/ai/genai/perplexity_provider.py +0 -205
  641. scitex/ai/genai/provider_base.py +0 -302
  642. scitex/ai/genai/provider_factory.py +0 -370
  643. scitex/ai/genai/response_handler.py +0 -235
  644. scitex/ai/layer/_Pass.py +0 -21
  645. scitex/ai/layer/__init__.py +0 -10
  646. scitex/ai/layer/_switch.py +0 -8
  647. scitex/ai/metrics/_bACC.py +0 -51
  648. scitex/ai/plt/_learning_curve.py +0 -194
  649. scitex/ai/plt/_optuna_study.py +0 -111
  650. scitex/ai/plt/aucs/__init__.py +0 -2
  651. scitex/ai/plt/aucs/example.py +0 -60
  652. scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
  653. scitex/ai/plt/aucs/roc_auc.py +0 -246
  654. scitex/ai/sampling/undersample.py +0 -29
  655. scitex/db/_SQLite3.py +0 -2136
  656. scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
  657. scitex/gen/_close.py +0 -222
  658. scitex/gen/_start.py +0 -451
  659. scitex/general/__init__.py +0 -5
  660. scitex/io/_load_modules/_db.py +0 -24
  661. scitex/life/__init__.py +0 -10
  662. scitex/life/_monitor_rain.py +0 -49
  663. scitex/reproduce/_fix_seeds.py +0 -45
  664. scitex/res/__init__.py +0 -5
  665. scitex/scholar/_local_search.py +0 -454
  666. scitex/scholar/_paper.py +0 -244
  667. scitex/scholar/_pdf_downloader.py +0 -325
  668. scitex/scholar/_search.py +0 -393
  669. scitex/scholar/_vector_search.py +0 -370
  670. scitex/scholar/_web_sources.py +0 -457
  671. scitex/stats/desc/__init__.py +0 -40
  672. scitex-2.0.0.dist-info/METADATA +0 -307
  673. scitex-2.0.0.dist-info/RECORD +0 -572
  674. scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
  675. /scitex/ai/{act → activation}/__init__.py +0 -0
  676. /scitex/ai/{act → activation}/_define.py +0 -0
  677. /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
  678. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
  679. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
  680. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
  681. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
  682. /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
  683. /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
  684. /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
  685. /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
  686. /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
  687. /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
  688. /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
  689. /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
  690. /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
  691. /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
  692. /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
  693. /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
  694. /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
  695. /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
  696. /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
  697. /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
  698. /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
  699. /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
  700. /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
  701. /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
  702. /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
  703. /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
  704. {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
@@ -1,23 +1,28 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-20 08:49:50 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/ai/_LearningCurveLogger.py
5
-
6
- THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_LearningCurveLogger.py"
3
+ # Timestamp: "2024-11-20 08:49:50 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/training/_LearningCurveLogger.py
5
+ # ----------------------------------------
6
+ from __future__ import annotations
7
+ import os
8
+ __FILE__ = __file__
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
7
11
 
8
12
  """
9
13
  Functionality:
10
14
  - Records and visualizes learning curves during model training
11
15
  - Supports tracking of multiple metrics across training/validation/test phases
12
16
  - Generates plots showing training progress over iterations and epochs
17
+ - Delegates plotting to scitex.ml.plt.plot_learning_curve for consistency
13
18
 
14
19
  Input:
15
20
  - Training metrics dictionary containing loss, accuracy, predictions etc.
16
21
  - Step information (Training/Validation/Test)
17
22
 
18
23
  Output:
19
- - Learning curve plots
20
- - Dataframes with recorded metrics
24
+ - Learning curve plots via scitex.ml.plt.plot_learning_curve
25
+ - DataFrames with recorded metrics
21
26
  - Training progress prints
22
27
 
23
28
  Prerequisites:
@@ -26,46 +31,19 @@ Prerequisites:
26
31
  - matplotlib
27
32
  - pandas
28
33
  - numpy
34
+ - scitex
29
35
  """
30
36
 
31
- import re as _re
32
- from collections import defaultdict as _defaultdict
33
- from pprint import pprint as _pprint
34
- from typing import Dict as _Dict
35
- from typing import List as _List
36
- from typing import Union as _Union
37
- from typing import Optional as _Optional
38
- from typing import Any as _Any
39
-
40
- import matplotlib as _matplotlib
41
- import pandas as _pd
42
- import numpy as _np
43
- import warnings as _warnings
44
- import torch as _torch
45
-
46
- # Import scitex modules for plotting
47
- try:
48
- import scitex.plt.utils as _plt_utils
49
- import scitex.plt.color as _plt_color
50
-
51
- class _plt_module:
52
- configure_mpl = _plt_utils.configure_mpl
53
- colors = _plt_color
54
- except ImportError:
55
- # Mock for testing when scitex is not available
56
- class _plt_module:
57
- @staticmethod
58
- def configure_mpl(*args, **kwargs):
59
- pass
60
-
61
- class colors:
62
- @staticmethod
63
- def to_RGBA(color, alpha=1.0):
64
- return color
65
-
66
- @staticmethod
67
- def to_rgba(color, alpha=1.0):
68
- return color
37
+ import re
38
+ import warnings
39
+ from collections import defaultdict
40
+ from pprint import pprint
41
+ from typing import Any, Dict, List, Optional, Union
42
+
43
+ import matplotlib
44
+ import matplotlib.pyplot as plt
45
+ import numpy as np
46
+ import pandas as pd
69
47
 
70
48
 
71
49
  class LearningCurveLogger:
@@ -84,89 +62,96 @@ class LearningCurveLogger:
84
62
  ... "i_global": 100
85
63
  ... }
86
64
  >>> logger(metrics, "Training")
87
- >>> fig = logger.plot_learning_curves(plt)
65
+ >>> fig = logger.plot_learning_curves()
88
66
  """
89
67
 
90
68
  def __init__(self) -> None:
91
- self.logged_dict: _Dict[str, _Dict] = _defaultdict(dict)
69
+ self.logged_dict: Dict[str, Dict] = defaultdict(dict)
92
70
 
93
- _warnings.warn(
71
+ warnings.warn(
94
72
  '\n"gt_label" will be removed in the future. Please use "true_class" instead.\n',
95
73
  DeprecationWarning,
96
74
  )
97
75
 
98
- def __call__(self, dict_to_log: _Dict[str, _Any], step: str) -> None:
76
+ def __call__(self, dict_to_log: Dict[str, Any], step: str) -> None:
99
77
  """Logs metrics for a training step.
100
78
 
101
79
  Parameters
102
80
  ----------
103
- dict_to_log : _Dict[str, _Any]
104
- _Dictionary containing metrics to log
81
+ dict_to_log : Dict[str, Any]
82
+ Dictionary containing metrics to log
105
83
  step : str
106
84
  Phase of training ('Training', 'Validation', or 'Test')
107
85
  """
86
+ # Handle deprecated gt_label
108
87
  if "gt_label" in dict_to_log:
109
88
  dict_to_log["true_class"] = dict_to_log.pop("gt_label")
110
89
 
111
90
  for k_to_log in dict_to_log:
112
91
  try:
113
92
  self.logged_dict[step][k_to_log].append(dict_to_log[k_to_log])
114
- except:
93
+ except KeyError:
115
94
  self.logged_dict[step][k_to_log] = [dict_to_log[k_to_log]]
116
95
 
117
96
  @property
118
- def dfs(self) -> _Dict[str, _pd.DataFrame]:
97
+ def dfs(self) -> Dict[str, pd.DataFrame]:
119
98
  """Returns DataFrames of logged metrics.
120
99
 
121
100
  Returns
122
101
  -------
123
- _Dict[str, _pd.DataFrame]
124
- _Dictionary of DataFrames for each step
102
+ Dict[str, pd.DataFrame]
103
+ Dictionary of DataFrames for each step
125
104
  """
126
- return self._to_dfs_pivot(
127
- self.logged_dict,
128
- pivot_column=None,
129
- )
105
+ return self._to_dfs_pivot(self.logged_dict, pivot_column=None)
130
106
 
131
- def get_x_of_i_epoch(self, x: str, step: str, i_epoch: int) -> _np.ndarray:
132
- """Gets metric values for a specific epoch.
133
-
134
- Parameters
135
- ----------
136
- x : str
137
- Name of metric to retrieve
138
- step : str
139
- Training phase
140
- i_epoch : int
141
- Epoch number
107
+ def to_metrics_df(self) -> pd.DataFrame:
108
+ """Convert logged data to metrics DataFrame for plot_learning_curve.
142
109
 
143
110
  Returns
144
111
  -------
145
- _np.ndarray
146
- Array of metric values for specified epoch
112
+ pd.DataFrame
113
+ DataFrame with columns: step, i_global, i_epoch, i_batch, and metric columns
147
114
  """
148
- indi = _np.array(self.logged_dict[step]["i_epoch"]) == i_epoch
149
- x_all_arr = _np.array(self.logged_dict[step][x])
150
- assert len(indi) == len(x_all_arr)
151
- return x_all_arr[indi]
115
+ all_rows = []
116
+
117
+ for step, metrics in self.logged_dict.items():
118
+ n_samples = len(metrics['i_global'])
119
+
120
+ for i in range(n_samples):
121
+ row = {'step': step}
122
+ for key, values in metrics.items():
123
+ # Only include scalar metrics for the DataFrame
124
+ if key.endswith('_plot') or key in ['i_global', 'i_epoch', 'i_batch', 'i_fold']:
125
+ row[key] = values[i]
126
+ all_rows.append(row)
127
+
128
+ df = pd.DataFrame(all_rows)
129
+
130
+ # Rename _plot columns
131
+ df.columns = [col.replace('_plot', '') if col.endswith('_plot') else col
132
+ for col in df.columns]
133
+
134
+ # Ensure i_batch exists (create dummy if not logged)
135
+ if 'i_batch' not in df.columns:
136
+ df['i_batch'] = df.groupby(['step', 'i_epoch']).cumcount()
137
+
138
+ return df
152
139
 
153
140
  def plot_learning_curves(
154
141
  self,
155
- plt: _Any,
156
- plt_config_dict: _Optional[_Dict] = None,
157
- title: _Optional[str] = None,
142
+ title: Optional[str] = None,
158
143
  max_n_ticks: int = 4,
159
144
  linewidth: float = 1,
160
- scattersize: float = 50,
161
- ) -> _matplotlib.figure.Figure:
145
+ scattersize: float = 3,
146
+ yscale: str = "linear",
147
+ spath: Optional[str] = None,
148
+ ) -> matplotlib.figure.Figure:
162
149
  """Plots learning curves from logged metrics.
163
150
 
151
+ Delegates to scitex.ml.plt.plot_learning_curve for consistent plotting.
152
+
164
153
  Parameters
165
154
  ----------
166
- plt : _matplotlib.pyplot
167
- _Matplotlib pyplot object
168
- plt_config_dict : _Dict, optional
169
- Plot configuration parameters
170
155
  title : str, optional
171
156
  Plot title
172
157
  max_n_ticks : int
@@ -175,98 +160,72 @@ class LearningCurveLogger:
175
160
  Width of plot lines
176
161
  scattersize : float
177
162
  Size of scatter points
163
+ yscale : str
164
+ Y-axis scale ('linear' or 'log')
165
+ spath : str, optional
166
+ Save path for the figure
178
167
 
179
168
  Returns
180
169
  -------
181
- _matplotlib.figure.Figure
170
+ matplotlib.figure.Figure
182
171
  Figure containing learning curves
183
172
  """
173
+ from scitex.ml.plt import plot_learning_curve
184
174
 
185
- if plt_config_dict is not None:
186
- _plt_module.configure_mpl(plt, **plt_config_dict)
175
+ # Convert to metrics DataFrame
176
+ metrics_df = self.to_metrics_df()
187
177
 
188
- self.dfs_pivot_i_global = self._to_dfs_pivot(
189
- self.logged_dict, pivot_column="i_global"
190
- )
191
-
192
- COLOR_DICT = {
193
- "Training": "blue",
194
- "Validation": "green",
195
- "Test": "red",
196
- }
197
-
198
- keys_to_plot = self._find_keys_to_plot(self.logged_dict)
178
+ # Find keys to plot (exclude metadata columns)
179
+ keys_to_plot = [
180
+ col for col in metrics_df.columns
181
+ if col not in ['step', 'i_global', 'i_epoch', 'i_batch', 'i_fold']
182
+ ]
199
183
 
200
184
  if len(keys_to_plot) == 0:
201
185
  # Create empty plot when no plot keys found
202
- fig, axes = plt.subplots(1, 1)
203
- axes.set_xlabel("Iteration#")
204
- axes.set_ylabel("No metrics to plot")
205
- fig.text(0.5, 0.95, title, ha="center")
186
+ fig, ax = plt.subplots(1, 1)
187
+ ax.set_xlabel("Iteration #")
188
+ ax.set_ylabel("No metrics to plot")
189
+ if title:
190
+ fig.text(0.5, 0.95, title, ha="center")
206
191
  return fig
207
192
 
208
- fig, axes = plt.subplots(len(keys_to_plot), 1, sharex=True, sharey=False)
209
-
210
- # Handle both single and multiple axes cases
211
- if len(keys_to_plot) == 1:
212
- axes = [axes] # Make it a list for consistent indexing
213
-
214
- axes[-1].set_xlabel("Iteration#")
215
- fig.text(0.5, 0.95, title, ha="center")
216
-
217
- for i_plt, plt_k in enumerate(keys_to_plot):
218
- ax = axes[i_plt]
219
- ax.set_ylabel(self._rename_if_key_to_plot(plt_k))
220
- ax.xaxis.set_major_locator(_matplotlib.ticker.MaxNLocator(max_n_ticks))
221
- ax.yaxis.set_major_locator(_matplotlib.ticker.MaxNLocator(max_n_ticks))
222
-
223
- if _re.search("[aA][cC][cC]", plt_k):
224
- ax.set_ylim(0, 1)
225
- ax.set_yticks([0, 0.5, 1.0])
226
-
227
- for step_k in self.dfs_pivot_i_global.keys():
228
- if step_k == _re.search("^[Tt]rain", step_k):
229
- ax.plot(
230
- self.dfs_pivot_i_global[step_k].index,
231
- self.dfs_pivot_i_global[step_k][plt_k],
232
- label=step_k,
233
- color=_plt_module.colors.to_rgba(COLOR_DICT[step_k], alpha=0.9),
234
- linewidth=linewidth,
235
- )
236
- ax.legend()
237
-
238
- epoch_starts = abs(
239
- self.dfs_pivot_i_global[step_k]["i_epoch"]
240
- - self.dfs_pivot_i_global[step_k]["i_epoch"].shift(-1)
241
- )
242
- indi_global_epoch_starts = [0] + list(
243
- epoch_starts[epoch_starts == 1].index
244
- )
245
-
246
- for i_epoch, i_global_epoch_start in enumerate(
247
- indi_global_epoch_starts
248
- ):
249
- ax.axvline(
250
- x=i_global_epoch_start,
251
- ymin=-1e4,
252
- ymax=1e4,
253
- linestyle="--",
254
- color=_plt_module.colors.to_rgba("gray", alpha=0.5),
255
- )
256
-
257
- if (step_k == "Validation") or (step_k == "Test"):
258
- ax.scatter(
259
- self.dfs_pivot_i_global[step_k].index,
260
- self.dfs_pivot_i_global[step_k][plt_k],
261
- label=step_k,
262
- color=_plt_module.colors.to_rgba(COLOR_DICT[step_k], alpha=0.9),
263
- s=scattersize,
264
- alpha=0.9,
265
- )
266
- ax.legend()
193
+ # Delegate to centralized plotting function
194
+ fig = plot_learning_curve(
195
+ metrics_df=metrics_df,
196
+ keys=keys_to_plot,
197
+ title=title or "Learning Curves",
198
+ max_n_ticks=max_n_ticks,
199
+ scattersize=scattersize,
200
+ linewidth=linewidth,
201
+ yscale=yscale,
202
+ spath=spath,
203
+ )
267
204
 
268
205
  return fig
269
206
 
207
+ def get_x_of_i_epoch(self, x: str, step: str, i_epoch: int) -> np.ndarray:
208
+ """Gets metric values for a specific epoch.
209
+
210
+ Parameters
211
+ ----------
212
+ x : str
213
+ Name of metric to retrieve
214
+ step : str
215
+ Training phase
216
+ i_epoch : int
217
+ Epoch number
218
+
219
+ Returns
220
+ -------
221
+ np.ndarray
222
+ Array of metric values for specified epoch
223
+ """
224
+ indi = np.array(self.logged_dict[step]["i_epoch"]) == i_epoch
225
+ x_all_arr = np.array(self.logged_dict[step][x])
226
+ assert len(indi) == len(x_all_arr)
227
+ return x_all_arr[indi]
228
+
270
229
  def print(self, step: str) -> None:
271
230
  """Prints metrics for given step.
272
231
 
@@ -282,48 +241,25 @@ class LearningCurveLogger:
282
241
  )
283
242
  print("\n----------------------------------------\n")
284
243
  print(f"\n{step}: (mean of batches)\n")
285
- _pprint(df_pivot_i_epoch_step)
244
+ pprint(df_pivot_i_epoch_step)
286
245
  print("\n----------------------------------------\n")
287
246
 
288
247
  @staticmethod
289
- def _find_keys_to_plot(logged_dict: _Dict) -> _List[str]:
290
- """Find metrics to plot from logged dictionary.
291
-
292
- Parameters
293
- ----------
294
- logged_dict : _Dict
295
- _Dictionary of logged metrics
296
-
297
- Returns
298
- -------
299
- _List[str]
300
- _List of metric names to plot
301
- """
302
- for step_k in logged_dict.keys():
303
- break
304
-
305
- keys_to_plot = []
306
- for k in logged_dict[step_k].keys():
307
- if _re.search("_plot$", k):
308
- keys_to_plot.append(k)
309
- return keys_to_plot
310
-
311
- @staticmethod
312
- def _rename_if_key_to_plot(x: _Union[str, _pd.Index]) -> _Union[str, _pd.Index]:
248
+ def _rename_if_key_to_plot(x: Union[str, pd.Index]) -> Union[str, pd.Index]:
313
249
  """Rename metric keys for plotting.
314
250
 
315
251
  Parameters
316
252
  ----------
317
- x : str or _pd.Index
253
+ x : str or pd.Index
318
254
  Metric name(s) to rename
319
255
 
320
256
  Returns
321
257
  -------
322
- str or _pd.Index
258
+ str or pd.Index
323
259
  Renamed metric name(s)
324
260
  """
325
261
  if isinstance(x, str):
326
- if _re.search("_plot$", x):
262
+ if re.search("_plot$", x):
327
263
  return x.replace("_plot", "")
328
264
  else:
329
265
  return x
@@ -332,31 +268,30 @@ class LearningCurveLogger:
332
268
 
333
269
  @staticmethod
334
270
  def _to_dfs_pivot(
335
- logged_dict: _Dict[str, _Dict],
336
- pivot_column: _Optional[str] = None,
337
- ) -> _Dict[str, _pd.DataFrame]:
271
+ logged_dict: Dict[str, Dict],
272
+ pivot_column: Optional[str] = None,
273
+ ) -> Dict[str, pd.DataFrame]:
338
274
  """Convert logged dictionary to pivot DataFrames.
339
275
 
340
276
  Parameters
341
277
  ----------
342
- logged_dict : _Dict[str, _Dict]
343
- _Dictionary of logged metrics
278
+ logged_dict : Dict[str, Dict]
279
+ Dictionary of logged metrics
344
280
  pivot_column : str, optional
345
281
  Column to pivot on
346
282
 
347
283
  Returns
348
284
  -------
349
- _Dict[str, _pd.DataFrame]
350
- _Dictionary of pivot DataFrames
285
+ Dict[str, pd.DataFrame]
286
+ Dictionary of pivot DataFrames
351
287
  """
352
-
353
288
  dfs_pivot = {}
354
289
  for step_k in logged_dict.keys():
355
290
  if pivot_column is None:
356
- df = _pd.DataFrame(logged_dict[step_k])
291
+ df = pd.DataFrame(logged_dict[step_k])
357
292
  else:
358
293
  df = (
359
- _pd.DataFrame(logged_dict[step_k])
294
+ pd.DataFrame(logged_dict[step_k])
360
295
  .groupby(pivot_column)
361
296
  .mean()
362
297
  .reset_index()
@@ -366,24 +301,16 @@ class LearningCurveLogger:
366
301
  return dfs_pivot
367
302
 
368
303
 
369
- if __name__ == "__main__":
370
- import warnings
371
-
372
- import matplotlib.pyplot as plt
304
+ """Functions & Classes"""
305
+ def main(args):
306
+ """Demo learning curve logger with MNIST training."""
373
307
  import torch
374
308
  import torch.nn as nn
375
309
  from sklearn.metrics import balanced_accuracy_score
376
310
  from torch.utils.data import DataLoader, TensorDataset
377
311
  from torch.utils.data.dataset import Subset
378
312
  from torchvision import datasets
379
-
380
- import sys
381
-
382
- ################################################################################
383
- ## Sets tee
384
- ################################################################################
385
- sdir = scitex.io.path.mk_spath("") # "/tmp/sdir/"
386
- sys.stdout, sys.stderr = scitex.gen.tee(sys, sdir)
313
+ import scitex
387
314
 
388
315
  ################################################################################
389
316
  ## NN
@@ -401,33 +328,33 @@ if __name__ == "__main__":
401
328
  return x
402
329
 
403
330
  ################################################################################
404
- ## Prepaires demo data
331
+ ## Prepare demo data
405
332
  ################################################################################
406
333
  ## Downloads
407
334
  _ds_tra_val = datasets.MNIST("/tmp/mnist", train=True, download=True)
408
335
  _ds_tes = datasets.MNIST("/tmp/mnist", train=False, download=True)
409
336
 
410
337
  ## Training-Validation splitting
411
- n_samples = len(_ds_tra_val) # n_samples is 60000
412
- train_size = int(n_samples * 0.8) # train_size is 48000
338
+ n_samples = len(_ds_tra_val)
339
+ train_size = int(n_samples * 0.8)
413
340
 
414
- subset1_indices = list(range(0, train_size)) # [0,1,.....47999]
415
- subset2_indices = list(range(train_size, n_samples)) # [48000,48001,.....59999]
341
+ subset1_indices = list(range(0, train_size))
342
+ subset2_indices = list(range(train_size, n_samples))
416
343
 
417
344
  _ds_tra = Subset(_ds_tra_val, subset1_indices)
418
345
  _ds_val = Subset(_ds_tra_val, subset2_indices)
419
346
 
420
347
  ## to tensors
421
348
  ds_tra = TensorDataset(
422
- _ds_tra.dataset.data.to(_torch.float32),
349
+ _ds_tra.dataset.data.to(torch.float32),
423
350
  _ds_tra.dataset.targets,
424
351
  )
425
352
  ds_val = TensorDataset(
426
- _ds_val.dataset.data.to(_torch.float32),
353
+ _ds_val.dataset.data.to(torch.float32),
427
354
  _ds_val.dataset.targets,
428
355
  )
429
356
  ds_tes = TensorDataset(
430
- _ds_tes.data.to(_torch.float32),
357
+ _ds_tes.data.to(torch.float32),
431
358
  _ds_tes.targets,
432
359
  )
433
360
 
@@ -459,7 +386,7 @@ if __name__ == "__main__":
459
386
  ################################################################################
460
387
  model = Perceptron()
461
388
  loss_func = nn.CrossEntropyLoss()
462
- optimizer = _torch.optim.SGD(model.parameters(), lr=1e-3)
389
+ optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
463
390
  softmax = nn.Softmax(dim=-1)
464
391
 
465
392
  ################################################################################
@@ -468,14 +395,12 @@ if __name__ == "__main__":
468
395
  lc_logger = LearningCurveLogger()
469
396
  i_global = 0
470
397
 
471
- n_classes = len(dl_tra.dataset.tensors[1].unique())
472
398
  i_fold = 0
473
399
  max_epochs = 3
474
400
 
475
401
  for i_epoch in range(max_epochs):
476
402
  step = "Validation"
477
403
  for i_batch, batch in enumerate(dl_val):
478
-
479
404
  X, T = batch
480
405
  logits = model(X)
481
406
  pred_proba = softmax(logits)
@@ -490,10 +415,10 @@ if __name__ == "__main__":
490
415
  "loss_plot": float(loss),
491
416
  "balanced_ACC_plot": float(bACC),
492
417
  "pred_proba": pred_proba.detach().cpu().numpy(),
493
- "gt_label": T.cpu().numpy(),
494
- # "true_class": T.cpu().numpy(),
418
+ "true_class": T.cpu().numpy(),
495
419
  "i_fold": i_fold,
496
420
  "i_epoch": i_epoch,
421
+ "i_batch": i_batch,
497
422
  "i_global": i_global,
498
423
  }
499
424
  lc_logger(dict_to_log, step)
@@ -521,10 +446,10 @@ if __name__ == "__main__":
521
446
  "loss_plot": float(loss),
522
447
  "balanced_ACC_plot": float(bACC),
523
448
  "pred_proba": pred_proba.detach().cpu().numpy(),
524
- "gt_label": T.cpu().numpy(),
525
- # "true_class": T.cpu().numpy(),
449
+ "true_class": T.cpu().numpy(),
526
450
  "i_fold": i_fold,
527
451
  "i_epoch": i_epoch,
452
+ "i_batch": i_batch,
528
453
  "i_global": i_global,
529
454
  }
530
455
  lc_logger(dict_to_log, step)
@@ -535,7 +460,6 @@ if __name__ == "__main__":
535
460
 
536
461
  step = "Test"
537
462
  for i_batch, batch in enumerate(dl_tes):
538
-
539
463
  X, T = batch
540
464
  logits = model(X)
541
465
  pred_proba = softmax(logits)
@@ -550,34 +474,66 @@ if __name__ == "__main__":
550
474
  "loss_plot": float(loss),
551
475
  "balanced_ACC_plot": float(bACC),
552
476
  "pred_proba": pred_proba.detach().cpu().numpy(),
553
- # "gt_label": T.cpu().numpy(),
554
477
  "true_class": T.cpu().numpy(),
555
478
  "i_fold": i_fold,
556
479
  "i_epoch": i_epoch,
480
+ "i_batch": i_batch,
557
481
  "i_global": i_global,
558
482
  }
559
483
  lc_logger(dict_to_log, step)
560
484
 
561
485
  lc_logger.print(step)
562
486
 
563
- plt_config_dict = dict(
564
- # figsize=(8.7, 10),
565
- figscale=2.5,
566
- labelsize=16,
567
- fontsize=12,
568
- legendfontsize=12,
569
- tick_size=0.8,
570
- tick_width=0.2,
571
- )
572
-
487
+ # Plot using refactored method
573
488
  fig = lc_logger.plot_learning_curves(
574
- plt,
575
- plt_config_dict=plt_config_dict,
576
489
  title=f"fold#{i_fold}",
577
490
  linewidth=1,
578
491
  scattersize=50,
492
+ spath="learning_curve_logger_demo.jpg",
493
+ )
494
+
495
+ return 0
496
+
497
+
498
+ import argparse
499
+ def parse_args() -> argparse.Namespace:
500
+ """Parse command line arguments."""
501
+ parser = argparse.ArgumentParser(description='Demo learning curve logger')
502
+ return parser.parse_args()
503
+
504
+
505
+ def run_main() -> None:
506
+ """Initialize scitex framework, run main function, and cleanup."""
507
+ global CONFIG, CC, sys, plt, rng
508
+
509
+ import sys
510
+ import matplotlib.pyplot as plt
511
+ import scitex as stx
512
+
513
+ args = parse_args()
514
+
515
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
516
+ sys,
517
+ plt,
518
+ args=args,
519
+ file=__FILE__,
520
+ sdir_suffix=None,
521
+ verbose=False,
522
+ agg=True,
579
523
  )
580
- fig.show()
581
- # scitex.gen.save(fig, sdir + f"fold#{i_fold}.png")
524
+
525
+ exit_status = main(args)
526
+
527
+ stx.session.close(
528
+ CONFIG,
529
+ verbose=False,
530
+ notify=False,
531
+ message="",
532
+ exit_status=exit_status,
533
+ )
534
+
535
+
536
+ if __name__ == "__main__":
537
+ run_main()
582
538
 
583
539
  # EOF
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env python3
2
+ """Training utilities."""
3
+
4
+ from ._EarlyStopping import EarlyStopping
5
+ from ._LearningCurveLogger import LearningCurveLogger
6
+
7
+ __all__ = ["EarlyStopping", "LearningCurveLogger"]