scitex 2.1.1__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 (2926) hide show
  1. scitex/.claude/mcp-config.json +42 -0
  2. scitex/.mcp.json +46 -0
  3. scitex/__init__.py +137 -0
  4. scitex/__main__.py +135 -0
  5. scitex/__version__.py +14 -0
  6. scitex/_optional_deps.py +140 -0
  7. scitex/_sh.py +18 -0
  8. scitex/ai/README.md +295 -0
  9. scitex/ai/__init__.py +69 -0
  10. scitex/ai/_gen_ai/_Anthropic.py +171 -0
  11. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  12. scitex/ai/_gen_ai/_DeepSeek.py +183 -0
  13. scitex/ai/_gen_ai/_Google.py +161 -0
  14. scitex/ai/_gen_ai/_Groq.py +97 -0
  15. scitex/ai/_gen_ai/_Llama.py +142 -0
  16. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  17. scitex/ai/_gen_ai/_PARAMS.py +551 -0
  18. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  19. scitex/ai/_gen_ai/__init__.py +43 -0
  20. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  21. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  22. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  23. scitex/ai/activation/__init__.py +8 -0
  24. scitex/ai/activation/_define.py +11 -0
  25. scitex/ai/classification/Classifier.py +131 -0
  26. scitex/ai/classification/CrossValidationExperiment.py +374 -0
  27. scitex/ai/classification/README.md +251 -0
  28. scitex/ai/classification/__init__.py +46 -0
  29. scitex/ai/classification/examples/timeseries_cv_demo.py +400 -0
  30. scitex/ai/classification/examples/verify_multi/config.json +13 -0
  31. scitex/ai/classification/examples/verify_multi/multi_task_comparison.md +20 -0
  32. scitex/ai/classification/examples/verify_multi/multi_task_validation.json +103 -0
  33. scitex/ai/classification/examples/verify_multi/paper_export/README.md +20 -0
  34. scitex/ai/classification/examples/verify_multi/paper_export/raw_results.json +174 -0
  35. scitex/ai/classification/examples/verify_multi/task1/metadata.json +56 -0
  36. scitex/ai/classification/examples/verify_multi/task1/paper_export/README.md +20 -0
  37. scitex/ai/classification/examples/verify_multi/task1/paper_export/raw_results.json +93 -0
  38. scitex/ai/classification/examples/verify_multi/task1/paper_export/summary_table.tex +15 -0
  39. scitex/ai/classification/examples/verify_multi/task1/report.md +31 -0
  40. scitex/ai/classification/examples/verify_multi/task1/validation_report.json +47 -0
  41. scitex/ai/classification/examples/verify_multi/task2/metadata.json +56 -0
  42. scitex/ai/classification/examples/verify_multi/task2/paper_export/README.md +20 -0
  43. scitex/ai/classification/examples/verify_multi/task2/paper_export/raw_results.json +93 -0
  44. scitex/ai/classification/examples/verify_multi/task2/paper_export/summary_table.tex +15 -0
  45. scitex/ai/classification/examples/verify_multi/task2/report.md +31 -0
  46. scitex/ai/classification/examples/verify_multi/task2/validation_report.json +47 -0
  47. scitex/ai/classification/examples/verify_test/metadata.json +62 -0
  48. scitex/ai/classification/examples/verify_test/paper_export/README.md +20 -0
  49. scitex/ai/classification/examples/verify_test/paper_export/raw_results.json +131 -0
  50. scitex/ai/classification/examples/verify_test/paper_export/summary_table.tex +15 -0
  51. scitex/ai/classification/examples/verify_test/report.md +31 -0
  52. scitex/ai/classification/examples/verify_test/validation_report.json +52 -0
  53. scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
  54. scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
  55. scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
  56. scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
  57. scitex/ai/classification/reporters/__init__.py +11 -0
  58. scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
  59. scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
  60. scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
  61. scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
  62. scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
  63. scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
  64. scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
  65. scitex/ai/classification/timeseries/README.md +313 -0
  66. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
  67. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
  68. scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
  69. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
  70. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
  71. scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
  72. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
  73. scitex/ai/classification/timeseries/__init__.py +39 -0
  74. scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
  75. scitex/ai/classification/timeseries/run_all.sh +30 -0
  76. scitex/ai/clustering/__init__.py +11 -0
  77. scitex/ai/clustering/_pca.py +115 -0
  78. scitex/ai/clustering/_umap.py +376 -0
  79. scitex/ai/feature_extraction/__init__.py +56 -0
  80. scitex/ai/feature_extraction/vit.py +149 -0
  81. scitex/ai/feature_selection/__init__.py +30 -0
  82. scitex/ai/feature_selection/feature_selection.py +364 -0
  83. scitex/ai/loss/_L1L2Losses.py +34 -0
  84. scitex/ai/loss/__init__.py +12 -0
  85. scitex/ai/loss/multi_task_loss.py +47 -0
  86. scitex/ai/metrics/__init__.py +56 -0
  87. scitex/ai/metrics/_calc_bacc.py +61 -0
  88. scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
  89. scitex/ai/metrics/_calc_clf_report.py +78 -0
  90. scitex/ai/metrics/_calc_conf_mat.py +93 -0
  91. scitex/ai/metrics/_calc_feature_importance.py +183 -0
  92. scitex/ai/metrics/_calc_mcc.py +61 -0
  93. scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
  94. scitex/ai/metrics/_calc_roc_auc.py +110 -0
  95. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
  96. scitex/ai/metrics/_calc_silhouette_score.py +503 -0
  97. scitex/ai/metrics/_normalize_labels.py +83 -0
  98. scitex/ai/optim/MIGRATION.md +43 -0
  99. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/LICENSE +201 -0
  100. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/README.md +80 -0
  101. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  102. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  103. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  104. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  105. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  106. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  107. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger-init.jpg +0 -0
  108. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger-with-gc-options.jpg +0 -0
  109. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  110. scitex/ai/optim/__init__.py +13 -0
  111. scitex/ai/optim/_get_set.py +31 -0
  112. scitex/ai/optim/_optimizers.py +71 -0
  113. scitex/ai/plt/__init__.py +60 -0
  114. scitex/ai/plt/_plot_conf_mat.py +663 -0
  115. scitex/ai/plt/_plot_feature_importance.py +323 -0
  116. scitex/ai/plt/_plot_learning_curve.py +345 -0
  117. scitex/ai/plt/_plot_optuna_study.py +225 -0
  118. scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
  119. scitex/ai/plt/_plot_roc_curve.py +255 -0
  120. scitex/ai/sampling/undersample.py +43 -0
  121. scitex/ai/sk/__init__.py +11 -0
  122. scitex/ai/sk/_clf.py +58 -0
  123. scitex/ai/sk/_to_sktime.py +100 -0
  124. scitex/ai/sklearn/__init__.py +26 -0
  125. scitex/ai/sklearn/clf.py +58 -0
  126. scitex/ai/sklearn/to_sktime.py +100 -0
  127. scitex/ai/training/_EarlyStopping.py +149 -0
  128. scitex/ai/training/_LearningCurveLogger.py +539 -0
  129. scitex/ai/training/__init__.py +7 -0
  130. scitex/ai/training/legacy/early_stopping.py +150 -0
  131. scitex/ai/training/legacy/learning_curve_logger.py +557 -0
  132. scitex/ai/utils/__init__.py +22 -0
  133. scitex/ai/utils/_check_params.py +50 -0
  134. scitex/ai/utils/_default_dataset.py +46 -0
  135. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  136. scitex/ai/utils/_label_encoder.py +134 -0
  137. scitex/ai/utils/_merge_labels.py +22 -0
  138. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  139. scitex/ai/utils/_under_sample.py +51 -0
  140. scitex/ai/utils/_verify_n_gpus.py +16 -0
  141. scitex/ai/utils/grid_search.py +148 -0
  142. scitex/ai/viewed-ai.md +4984 -0
  143. scitex/benchmark/__init__.py +52 -0
  144. scitex/benchmark/benchmark.py +400 -0
  145. scitex/benchmark/monitor.py +370 -0
  146. scitex/benchmark/profiler.py +297 -0
  147. scitex/browser/ARCHITECTURE_PROPOSAL.md +795 -0
  148. scitex/browser/INTERACTIVE_COLLABORATION.md +782 -0
  149. scitex/browser/README.md +167 -0
  150. scitex/browser/SAFE_IMPLEMENTATION_PLAN.md +363 -0
  151. scitex/browser/SHARED_BROWSER_SESSION.md +652 -0
  152. scitex/browser/TODO.md +11 -0
  153. scitex/browser/__init__.py +48 -0
  154. scitex/browser/automation/CookieHandler.py +216 -0
  155. scitex/browser/automation/__init__.py +7 -0
  156. scitex/browser/collaboration/CLIENTSERVER_ARCHITECTURE.md +165 -0
  157. scitex/browser/collaboration/INTERACTION_STRATEGY.md +547 -0
  158. scitex/browser/collaboration/NON_INTERFERING_LOGIC.md +730 -0
  159. scitex/browser/collaboration/__init__.py +55 -0
  160. scitex/browser/collaboration/auth_helpers.py +94 -0
  161. scitex/browser/collaboration/collaborative_agent.py +136 -0
  162. scitex/browser/collaboration/credential_manager.py +188 -0
  163. scitex/browser/collaboration/interactive_panel.py +400 -0
  164. scitex/browser/collaboration/persistent_browser.py +170 -0
  165. scitex/browser/collaboration/shared_session.py +383 -0
  166. scitex/browser/collaboration/standard_interactions.py +246 -0
  167. scitex/browser/collaboration/visual_feedback.py +181 -0
  168. scitex/browser/core/BrowserMixin.py +326 -0
  169. scitex/browser/core/ChromeProfileManager.py +446 -0
  170. scitex/browser/core/__init__.py +9 -0
  171. scitex/browser/debugging/__init__.py +18 -0
  172. scitex/browser/debugging/_browser_logger.py +657 -0
  173. scitex/browser/debugging/_highlight_element.py +143 -0
  174. scitex/browser/debugging/_show_grid.py +154 -0
  175. scitex/browser/docs/ABOUT_PLAYWRIGHT.md +49 -0
  176. scitex/browser/interaction/__init__.py +24 -0
  177. scitex/browser/interaction/click_center.py +149 -0
  178. scitex/browser/interaction/click_with_fallbacks.py +206 -0
  179. scitex/browser/interaction/close_popups.py +498 -0
  180. scitex/browser/interaction/fill_with_fallbacks.py +209 -0
  181. scitex/browser/pdf/__init__.py +14 -0
  182. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
  183. scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
  184. scitex/browser/remote/CaptchaHandler.py +434 -0
  185. scitex/browser/remote/ZenRowsAPIClient.py +347 -0
  186. scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
  187. scitex/browser/remote/__init__.py +11 -0
  188. scitex/browser/stealth/HumanBehavior.py +344 -0
  189. scitex/browser/stealth/StealthManager.py +1008 -0
  190. scitex/browser/stealth/__init__.py +9 -0
  191. scitex/browser/template.py +122 -0
  192. scitex/capture/README.md +284 -0
  193. scitex/capture/TODO.md +40 -0
  194. scitex/capture/__init__.py +110 -0
  195. scitex/capture/__main__.py +25 -0
  196. scitex/capture/capture.py +848 -0
  197. scitex/capture/cli.py +233 -0
  198. scitex/capture/gif.py +344 -0
  199. scitex/capture/mcp_server.py +961 -0
  200. scitex/capture/powershell/capture_all_desktops.ps1 +79 -0
  201. scitex/capture/powershell/capture_all_monitors.ps1 +63 -0
  202. scitex/capture/powershell/capture_single_monitor.ps1 +77 -0
  203. scitex/capture/powershell/capture_url.ps1 +170 -0
  204. scitex/capture/powershell/capture_window_by_handle.ps1 +129 -0
  205. scitex/capture/powershell/detect_monitors_and_desktops.ps1 +143 -0
  206. scitex/capture/powershell/enumerate_virtual_desktops.ps1 +60 -0
  207. scitex/capture/session.py +70 -0
  208. scitex/capture/utils.py +705 -0
  209. scitex/cli/__init__.py +17 -0
  210. scitex/cli/cloud.py +531 -0
  211. scitex/cli/main.py +42 -0
  212. scitex/cli/scholar.py +280 -0
  213. scitex/context/__init__.py +9 -0
  214. scitex/context/_suppress_output.py +40 -0
  215. scitex/db/README.md +281 -0
  216. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  217. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  218. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  219. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  220. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  221. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  222. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  223. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  224. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  225. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  226. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  227. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  228. scitex/db/_BaseMixins/__init__.py +30 -0
  229. scitex/db/__init__.py +41 -0
  230. scitex/db/__main__.py +75 -0
  231. scitex/db/_check_health.py +381 -0
  232. scitex/db/_delete_duplicates.py +36 -0
  233. scitex/db/_inspect.py +384 -0
  234. scitex/db/_inspect_optimized.py +301 -0
  235. scitex/db/_postgresql/_PostgreSQL.py +126 -0
  236. scitex/db/_postgresql/_PostgreSQLMixins/_BackupMixin.py +166 -0
  237. scitex/db/_postgresql/_PostgreSQLMixins/_BatchMixin.py +82 -0
  238. scitex/db/_postgresql/_PostgreSQLMixins/_BlobMixin.py +231 -0
  239. scitex/db/_postgresql/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  240. scitex/db/_postgresql/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  241. scitex/db/_postgresql/_PostgreSQLMixins/_IndexMixin.py +64 -0
  242. scitex/db/_postgresql/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  243. scitex/db/_postgresql/_PostgreSQLMixins/_QueryMixin.py +108 -0
  244. scitex/db/_postgresql/_PostgreSQLMixins/_RowMixin.py +75 -0
  245. scitex/db/_postgresql/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  246. scitex/db/_postgresql/_PostgreSQLMixins/_TableMixin.py +176 -0
  247. scitex/db/_postgresql/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  248. scitex/db/_postgresql/_PostgreSQLMixins/__init__.py +34 -0
  249. scitex/db/_postgresql/__init__.py +6 -0
  250. scitex/db/_sqlite3/README.md +191 -0
  251. scitex/db/_sqlite3/README_v01.md +126 -0
  252. scitex/db/_sqlite3/_SQLite3.py +210 -0
  253. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
  254. scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
  255. scitex/db/_sqlite3/_SQLite3Mixins/_BatchMixin.py +243 -0
  256. scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
  257. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
  258. scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
  259. scitex/db/_sqlite3/_SQLite3Mixins/_ConnectionMixin.py +124 -0
  260. scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
  261. scitex/db/_sqlite3/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  262. scitex/db/_sqlite3/_SQLite3Mixins/_IndexMixin.py +32 -0
  263. scitex/db/_sqlite3/_SQLite3Mixins/_MaintenanceMixin.py +177 -0
  264. scitex/db/_sqlite3/_SQLite3Mixins/_QueryMixin.py +110 -0
  265. scitex/db/_sqlite3/_SQLite3Mixins/_RowMixin.py +115 -0
  266. scitex/db/_sqlite3/_SQLite3Mixins/_TableMixin.py +229 -0
  267. scitex/db/_sqlite3/_SQLite3Mixins/_TransactionMixin.py +71 -0
  268. scitex/db/_sqlite3/_SQLite3Mixins/__init__.py +42 -0
  269. scitex/db/_sqlite3/__init__.py +7 -0
  270. scitex/db/_sqlite3/_delete_duplicates.py +274 -0
  271. scitex/db/legacy/_inspect_v02.py +171 -0
  272. scitex/db/legacy/_inspect_v03-not-optimized.py +179 -0
  273. scitex/db/legacy/_inspect_v04-working-but-printing-both-scheme-and-first-row.py +337 -0
  274. scitex/db/legacy/_inspect_v05-working-but-no-clear-separation-between-dtype-and-actual-values.py +358 -0
  275. scitex/decorators/BLUEPRINT.md +101 -0
  276. scitex/decorators/README.md +179 -0
  277. scitex/decorators/__init__.py +56 -0
  278. scitex/decorators/_auto_order.py +172 -0
  279. scitex/decorators/_batch_fn.py +128 -0
  280. scitex/decorators/_cache_disk.py +40 -0
  281. scitex/decorators/_cache_disk_async.py +49 -0
  282. scitex/decorators/_cache_mem.py +12 -0
  283. scitex/decorators/_combined.py +98 -0
  284. scitex/decorators/_converters.py +290 -0
  285. scitex/decorators/_deprecated.py +191 -0
  286. scitex/decorators/_not_implemented.py +30 -0
  287. scitex/decorators/_numpy_fn.py +87 -0
  288. scitex/decorators/_pandas_fn.py +126 -0
  289. scitex/decorators/_preserve_doc.py +19 -0
  290. scitex/decorators/_signal_fn.py +97 -0
  291. scitex/decorators/_timeout.py +55 -0
  292. scitex/decorators/_torch_fn.py +138 -0
  293. scitex/decorators/_wrap.py +39 -0
  294. scitex/decorators/_xarray_fn.py +94 -0
  295. scitex/dev/__init__.py +15 -0
  296. scitex/dev/_analyze_code_flow.py +284 -0
  297. scitex/dev/_reload.py +59 -0
  298. scitex/dict/_DotDict.py +500 -0
  299. scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
  300. scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
  301. scitex/dict/__init__.py +20 -0
  302. scitex/dict/_flatten.py +27 -0
  303. scitex/dict/_listed_dict.py +42 -0
  304. scitex/dict/_pop_keys.py +36 -0
  305. scitex/dict/_replace.py +13 -0
  306. scitex/dict/_safe_merge.py +62 -0
  307. scitex/dict/_to_str.py +32 -0
  308. scitex/dsp/README.md +147 -0
  309. scitex/dsp/__init__.py +72 -0
  310. scitex/dsp/_crop.py +122 -0
  311. scitex/dsp/_demo_sig.py +331 -0
  312. scitex/dsp/_detect_ripples.py +212 -0
  313. scitex/dsp/_ensure_3d.py +18 -0
  314. scitex/dsp/_hilbert.py +78 -0
  315. scitex/dsp/_listen.py +702 -0
  316. scitex/dsp/_misc.py +30 -0
  317. scitex/dsp/_mne.py +32 -0
  318. scitex/dsp/_modulation_index.py +79 -0
  319. scitex/dsp/_pac.py +319 -0
  320. scitex/dsp/_psd.py +102 -0
  321. scitex/dsp/_resample.py +66 -0
  322. scitex/dsp/_time.py +37 -0
  323. scitex/dsp/_transform.py +68 -0
  324. scitex/dsp/_wavelet.py +213 -0
  325. scitex/dsp/add_noise.py +111 -0
  326. scitex/dsp/audio.md +22 -0
  327. scitex/dsp/example.py +254 -0
  328. scitex/dsp/filt.py +156 -0
  329. scitex/dsp/norm.py +18 -0
  330. scitex/dsp/params.py +51 -0
  331. scitex/dsp/reference.py +43 -0
  332. scitex/dsp/template.py +26 -0
  333. scitex/dsp/utils/__init__.py +15 -0
  334. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  335. scitex/dsp/utils/_ensure_3d.py +18 -0
  336. scitex/dsp/utils/_ensure_even_len.py +10 -0
  337. scitex/dsp/utils/_zero_pad.py +48 -0
  338. scitex/dsp/utils/filter.py +408 -0
  339. scitex/dsp/utils/pac.py +177 -0
  340. scitex/dt/__init__.py +8 -0
  341. scitex/dt/_linspace.py +130 -0
  342. scitex/dt/_normalize_timestamp.py +432 -0
  343. scitex/errors.py +572 -0
  344. scitex/etc/__init__.py +15 -0
  345. scitex/etc/wait_key.py +34 -0
  346. scitex/gen/README.md +71 -0
  347. scitex/gen/_DimHandler.py +196 -0
  348. scitex/gen/_TimeStamper.py +244 -0
  349. scitex/gen/__init__.py +125 -0
  350. scitex/gen/_alternate_kwarg.py +13 -0
  351. scitex/gen/_cache.py +11 -0
  352. scitex/gen/_check_host.py +34 -0
  353. scitex/gen/_ci.py +12 -0
  354. scitex/gen/_deprecated_close.py +80 -0
  355. scitex/gen/_deprecated_start.py +26 -0
  356. scitex/gen/_detect_environment.py +152 -0
  357. scitex/gen/_detect_notebook_path.py +169 -0
  358. scitex/gen/_embed.py +82 -0
  359. scitex/gen/_get_notebook_path.py +257 -0
  360. scitex/gen/_inspect_module.py +257 -0
  361. scitex/gen/_is_ipython.py +12 -0
  362. scitex/gen/_less.py +48 -0
  363. scitex/gen/_list_packages.py +139 -0
  364. scitex/gen/_mat2py.py +88 -0
  365. scitex/gen/_norm.py +205 -0
  366. scitex/gen/_norm_cache.py +269 -0
  367. scitex/gen/_paste.py +18 -0
  368. scitex/gen/_print_config.py +84 -0
  369. scitex/gen/_shell.py +48 -0
  370. scitex/gen/_src.py +109 -0
  371. scitex/gen/_symlink.py +55 -0
  372. scitex/gen/_symlog.py +27 -0
  373. scitex/gen/_title2path.py +60 -0
  374. scitex/gen/_title_case.py +88 -0
  375. scitex/gen/_to_even.py +84 -0
  376. scitex/gen/_to_odd.py +34 -0
  377. scitex/gen/_to_rank.py +39 -0
  378. scitex/gen/_transpose.py +37 -0
  379. scitex/gen/_type.py +78 -0
  380. scitex/gen/_var_info.py +73 -0
  381. scitex/gen/_wrap.py +17 -0
  382. scitex/gen/_xml2dict.py +76 -0
  383. scitex/gen/misc.py +730 -0
  384. scitex/gen/path.py +0 -0
  385. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  386. scitex/gists/_SigMacro_toBlue.py +172 -0
  387. scitex/gists/__init__.py +12 -0
  388. scitex/gists/guideline.md +42 -0
  389. scitex/git/README.md +121 -0
  390. scitex/git/__init__.py +61 -0
  391. scitex/git/_branch.py +175 -0
  392. scitex/git/_clone.py +130 -0
  393. scitex/git/_commit.py +171 -0
  394. scitex/git/_constants.py +17 -0
  395. scitex/git/_init.py +202 -0
  396. scitex/git/_remote.py +185 -0
  397. scitex/git/_result.py +67 -0
  398. scitex/git/_retry.py +116 -0
  399. scitex/git/_session.py +60 -0
  400. scitex/git/_types.py +132 -0
  401. scitex/git/_utils.py +28 -0
  402. scitex/git/_validation.py +117 -0
  403. scitex/git/_workflow.py +87 -0
  404. scitex/io/.gitkeep +0 -0
  405. scitex/io/README.md +312 -0
  406. scitex/io/__init__.py +104 -0
  407. scitex/io/_cache.py +101 -0
  408. scitex/io/_flush.py +24 -0
  409. scitex/io/_glob.py +109 -0
  410. scitex/io/_json2md.py +118 -0
  411. scitex/io/_load.py +255 -0
  412. scitex/io/_load_cache.py +303 -0
  413. scitex/io/_load_configs.py +171 -0
  414. scitex/io/_load_modules/_H5Explorer.py +355 -0
  415. scitex/io/_load_modules/_ZarrExplorer.py +114 -0
  416. scitex/io/_load_modules/__init__.py +38 -0
  417. scitex/io/_load_modules/_bibtex.py +207 -0
  418. scitex/io/_load_modules/_catboost.py +66 -0
  419. scitex/io/_load_modules/_con.py +20 -0
  420. scitex/io/_load_modules/_docx.py +42 -0
  421. scitex/io/_load_modules/_eeg.py +110 -0
  422. scitex/io/_load_modules/_hdf5.py +71 -0
  423. scitex/io/_load_modules/_image.py +19 -0
  424. scitex/io/_load_modules/_joblib.py +19 -0
  425. scitex/io/_load_modules/_json.py +20 -0
  426. scitex/io/_load_modules/_markdown.py +103 -0
  427. scitex/io/_load_modules/_matlab.py +37 -0
  428. scitex/io/_load_modules/_numpy.py +39 -0
  429. scitex/io/_load_modules/_optuna.py +155 -0
  430. scitex/io/_load_modules/_pandas.py +70 -0
  431. scitex/io/_load_modules/_pdf.py +886 -0
  432. scitex/io/_load_modules/_pickle.py +24 -0
  433. scitex/io/_load_modules/_sqlite3.py +15 -0
  434. scitex/io/_load_modules/_torch.py +17 -0
  435. scitex/io/_load_modules/_txt.py +160 -0
  436. scitex/io/_load_modules/_xml.py +49 -0
  437. scitex/io/_load_modules/_yaml.py +24 -0
  438. scitex/io/_load_modules/_zarr.py +126 -0
  439. scitex/io/_mv_to_tmp.py +19 -0
  440. scitex/io/_path.py +286 -0
  441. scitex/io/_reload.py +78 -0
  442. scitex/io/_save.py +797 -0
  443. scitex/io/_save_modules/__init__.py +72 -0
  444. scitex/io/_save_modules/_bibtex.py +194 -0
  445. scitex/io/_save_modules/_catboost.py +22 -0
  446. scitex/io/_save_modules/_csv.py +95 -0
  447. scitex/io/_save_modules/_excel.py +214 -0
  448. scitex/io/_save_modules/_hdf5.py +274 -0
  449. scitex/io/_save_modules/_html.py +48 -0
  450. scitex/io/_save_modules/_image.py +138 -0
  451. scitex/io/_save_modules/_joblib.py +25 -0
  452. scitex/io/_save_modules/_json.py +70 -0
  453. scitex/io/_save_modules/_listed_dfs_as_csv.py +55 -0
  454. scitex/io/_save_modules/_listed_scalars_as_csv.py +41 -0
  455. scitex/io/_save_modules/_matlab.py +24 -0
  456. scitex/io/_save_modules/_mp4.py +29 -0
  457. scitex/io/_save_modules/_numpy.py +57 -0
  458. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  459. scitex/io/_save_modules/_pickle.py +45 -0
  460. scitex/io/_save_modules/_plotly.py +27 -0
  461. scitex/io/_save_modules/_tex.py +277 -0
  462. scitex/io/_save_modules/_text.py +23 -0
  463. scitex/io/_save_modules/_torch.py +27 -0
  464. scitex/io/_save_modules/_yaml.py +68 -0
  465. scitex/io/_save_modules/_zarr.py +160 -0
  466. scitex/io/utils/__init__.py +20 -0
  467. scitex/io/utils/h5_to_zarr.py +616 -0
  468. scitex/linalg/__init__.py +17 -0
  469. scitex/linalg/_distance.py +63 -0
  470. scitex/linalg/_geometric_median.py +68 -0
  471. scitex/linalg/_misc.py +73 -0
  472. scitex/logging/README.md +374 -0
  473. scitex/logging/_Tee.py +197 -0
  474. scitex/logging/__init__.py +122 -0
  475. scitex/logging/_config.py +158 -0
  476. scitex/logging/_context.py +103 -0
  477. scitex/logging/_formatters.py +128 -0
  478. scitex/logging/_handlers.py +64 -0
  479. scitex/logging/_levels.py +35 -0
  480. scitex/logging/_logger.py +163 -0
  481. scitex/logging/_print_capture.py +95 -0
  482. scitex/nn/_AxiswiseDropout.py +27 -0
  483. scitex/nn/_BNet.py +132 -0
  484. scitex/nn/_BNet_Res.py +164 -0
  485. scitex/nn/_ChannelGainChanger.py +44 -0
  486. scitex/nn/_DropoutChannels.py +50 -0
  487. scitex/nn/_Filters.py +489 -0
  488. scitex/nn/_FreqGainChanger.py +110 -0
  489. scitex/nn/_GaussianFilter.py +48 -0
  490. scitex/nn/_Hilbert.py +111 -0
  491. scitex/nn/_MNet_1000.py +157 -0
  492. scitex/nn/_ModulationIndex.py +221 -0
  493. scitex/nn/_PAC.py +414 -0
  494. scitex/nn/_PSD.py +40 -0
  495. scitex/nn/_ResNet1D.py +120 -0
  496. scitex/nn/_SpatialAttention.py +25 -0
  497. scitex/nn/_Spectrogram.py +170 -0
  498. scitex/nn/_SwapChannels.py +50 -0
  499. scitex/nn/_TransposeLayer.py +19 -0
  500. scitex/nn/_Wavelet.py +183 -0
  501. scitex/nn/__init__.py +62 -0
  502. scitex/os/__init__.py +8 -0
  503. scitex/os/_mv.py +50 -0
  504. scitex/parallel/__init__.py +8 -0
  505. scitex/parallel/_run.py +151 -0
  506. scitex/path/README.md +77 -0
  507. scitex/path/__init__.py +51 -0
  508. scitex/path/_clean.py +56 -0
  509. scitex/path/_find.py +113 -0
  510. scitex/path/_get_module_path.py +51 -0
  511. scitex/path/_get_spath.py +35 -0
  512. scitex/path/_getsize.py +18 -0
  513. scitex/path/_increment_version.py +87 -0
  514. scitex/path/_mk_spath.py +51 -0
  515. scitex/path/_path.py +19 -0
  516. scitex/path/_split.py +23 -0
  517. scitex/path/_symlink.py +348 -0
  518. scitex/path/_this_path.py +19 -0
  519. scitex/path/_version.py +102 -0
  520. scitex/pd/__init__.py +43 -0
  521. scitex/pd/_find_indi.py +126 -0
  522. scitex/pd/_find_pval.py +113 -0
  523. scitex/pd/_force_df.py +154 -0
  524. scitex/pd/_from_xyz.py +71 -0
  525. scitex/pd/_get_unique.py +99 -0
  526. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  527. scitex/pd/_melt_cols.py +81 -0
  528. scitex/pd/_merge_columns.py +221 -0
  529. scitex/pd/_mv.py +63 -0
  530. scitex/pd/_replace.py +62 -0
  531. scitex/pd/_round.py +93 -0
  532. scitex/pd/_slice.py +63 -0
  533. scitex/pd/_sort.py +91 -0
  534. scitex/pd/_to_numeric.py +53 -0
  535. scitex/pd/_to_xy.py +59 -0
  536. scitex/pd/_to_xyz.py +110 -0
  537. scitex/plt/KNOWN_ISSUES.md +68 -0
  538. scitex/plt/README.md +1650 -0
  539. scitex/plt/TODO.md +7 -0
  540. scitex/plt/__init__.py +145 -0
  541. scitex/plt/_subplots/TODO.md +53 -0
  542. scitex/plt/_subplots/_AxesWrapper.py +180 -0
  543. scitex/plt/_subplots/_AxisWrapper.py +253 -0
  544. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +448 -0
  545. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +1054 -0
  546. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +390 -0
  547. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  548. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
  549. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +17 -0
  550. scitex/plt/_subplots/_FigWrapper.py +282 -0
  551. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  552. scitex/plt/_subplots/__init__.py +111 -0
  553. scitex/plt/_subplots/_export_as_csv.py +248 -0
  554. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +62 -0
  555. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
  556. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +88 -0
  557. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +64 -0
  558. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +44 -0
  559. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +37 -0
  560. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +142 -0
  561. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +70 -0
  562. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +32 -0
  563. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +34 -0
  564. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +77 -0
  565. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +57 -0
  566. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +30 -0
  567. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +91 -0
  568. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +73 -0
  569. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +62 -0
  570. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +42 -0
  571. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +68 -0
  572. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +64 -0
  573. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +93 -0
  574. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +65 -0
  575. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +50 -0
  576. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +44 -0
  577. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +44 -0
  578. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +44 -0
  579. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +44 -0
  580. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +42 -0
  581. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +101 -0
  582. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
  583. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +80 -0
  584. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +56 -0
  585. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +115 -0
  586. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +32 -0
  587. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +49 -0
  588. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +91 -0
  589. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +92 -0
  590. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +90 -0
  591. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +63 -0
  592. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +57 -0
  593. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +56 -0
  594. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +43 -0
  595. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +68 -0
  596. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +73 -0
  597. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +73 -0
  598. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +153 -0
  599. scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
  600. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +62 -0
  601. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +75 -0
  602. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  603. scitex/plt/_subplots/_export_as_csv_formatters.py +112 -0
  604. scitex/plt/_tpl.py +28 -0
  605. scitex/plt/ax/__init__.py +114 -0
  606. scitex/plt/ax/_plot/__init__.py +53 -0
  607. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  608. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  609. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  610. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  611. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  612. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  613. scitex/plt/ax/_plot/_plot_image.py +94 -0
  614. scitex/plt/ax/_plot/_plot_joyplot.py +77 -0
  615. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  616. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  617. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  618. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  619. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  620. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  621. scitex/plt/ax/_style/__init__.py +38 -0
  622. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  623. scitex/plt/ax/_style/_add_panel.py +92 -0
  624. scitex/plt/ax/_style/_extend.py +64 -0
  625. scitex/plt/ax/_style/_force_aspect.py +37 -0
  626. scitex/plt/ax/_style/_format_label.py +23 -0
  627. scitex/plt/ax/_style/_hide_spines.py +82 -0
  628. scitex/plt/ax/_style/_map_ticks.py +182 -0
  629. scitex/plt/ax/_style/_rotate_labels.py +319 -0
  630. scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
  631. scitex/plt/ax/_style/_sci_note.py +279 -0
  632. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  633. scitex/plt/ax/_style/_set_meta.py +268 -0
  634. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  635. scitex/plt/ax/_style/_set_size.py +16 -0
  636. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  637. scitex/plt/ax/_style/_set_ticks.py +276 -0
  638. scitex/plt/ax/_style/_set_xyt.py +121 -0
  639. scitex/plt/ax/_style/_share_axes.py +264 -0
  640. scitex/plt/ax/_style/_shift.py +139 -0
  641. scitex/plt/ax/_style/_show_spines.py +333 -0
  642. scitex/plt/color/_PARAMS.py +70 -0
  643. scitex/plt/color/__init__.py +52 -0
  644. scitex/plt/color/_add_hue_col.py +41 -0
  645. scitex/plt/color/_colors.py +205 -0
  646. scitex/plt/color/_get_colors_from_conf_matap.py +134 -0
  647. scitex/plt/color/_interpolate.py +29 -0
  648. scitex/plt/color/_vizualize_colors.py +54 -0
  649. scitex/plt/gallery.md +170 -0
  650. scitex/plt/utils/__init__.py +44 -0
  651. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  652. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  653. scitex/plt/utils/_close.py +68 -0
  654. scitex/plt/utils/_colorbar.py +96 -0
  655. scitex/plt/utils/_configure_mpl.py +308 -0
  656. scitex/plt/utils/_histogram_utils.py +130 -0
  657. scitex/plt/utils/_im2grid.py +70 -0
  658. scitex/plt/utils/_is_valid_axis.py +76 -0
  659. scitex/plt/utils/_mk_colorbar.py +65 -0
  660. scitex/plt/utils/_mk_patches.py +26 -0
  661. scitex/plt/utils/_scientific_captions.py +638 -0
  662. scitex/plt/utils/_scitex_config.py +224 -0
  663. scitex/project/DESIGN.md +423 -0
  664. scitex/project/DJANGO_INTEGRATION.md +546 -0
  665. scitex/project/NAMING.md +251 -0
  666. scitex/project/README.md +441 -0
  667. scitex/project/__init__.py +80 -0
  668. scitex/project/core.py +466 -0
  669. scitex/project/metadata.py +345 -0
  670. scitex/project/storage.py +321 -0
  671. scitex/project/validators.py +296 -0
  672. scitex/repro/__init__.py +75 -0
  673. scitex/repro/_gen_ID.py +55 -0
  674. scitex/repro/_gen_timestamp.py +35 -0
  675. scitex/repro_rng/README.md +211 -0
  676. scitex/repro_rng/_RandomStateManager.py +595 -0
  677. scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
  678. scitex/repro_rng/__init__.py +39 -0
  679. scitex/reproduce/__init__.py +26 -0
  680. scitex/reproduce/_hash_array.py +22 -0
  681. scitex/resource/README.md +81 -0
  682. scitex/resource/__init__.py +13 -0
  683. scitex/resource/_get_processor_usages.py +281 -0
  684. scitex/resource/_get_specs/info.yaml +122 -0
  685. scitex/resource/_get_specs/specs.yaml +129 -0
  686. scitex/resource/_get_specs.py +280 -0
  687. scitex/resource/_log_processor_usages.py +190 -0
  688. scitex/resource/_utils/__init__.py +31 -0
  689. scitex/resource/_utils/_get_env_info.py +481 -0
  690. scitex/resource/limit_ram.py +33 -0
  691. scitex/scholar/.claude/agents/ArchitectAgent.md +50 -0
  692. scitex/scholar/.claude/agents/BulletinBoardOrganizerAgent.md +24 -0
  693. scitex/scholar/.claude/agents/DebuggerAgent.md +38 -0
  694. scitex/scholar/.claude/agents/ExamplesDeveloperAgent.md +49 -0
  695. scitex/scholar/.claude/agents/ExperimentationAgent.md +13 -0
  696. scitex/scholar/.claude/agents/GitHandlerAgent.md +38 -0
  697. scitex/scholar/.claude/agents/ResearcherAgent.md +35 -0
  698. scitex/scholar/.claude/agents/ReviewerAgent.md +70 -0
  699. scitex/scholar/.claude/agents/SciTeXTranslatorAgent.md +55 -0
  700. scitex/scholar/.claude/agents/SourceDeveloperAgent.md +48 -0
  701. scitex/scholar/.claude/agents/TestDeveloperAgent.md +48 -0
  702. scitex/scholar/.claude/agents/TestResultsReportAgent.md +52 -0
  703. scitex/scholar/.claude/agents/TestRunnerAgent.md +48 -0
  704. scitex/scholar/.claude/mcp-config.json +42 -0
  705. scitex/scholar/.gitignore +23 -0
  706. scitex/scholar/.legacy/Scholar.py +407 -0
  707. scitex/scholar/.legacy/_Scholar.py +1796 -0
  708. scitex/scholar/.legacy/_ScholarAPI.py +307 -0
  709. scitex/scholar/.legacy/_tmp/search_engine/_BaseSearchEngine.py +101 -0
  710. scitex/scholar/.legacy/_tmp/search_engine/_UnifiedSearcher.py +397 -0
  711. scitex/scholar/.legacy/_tmp/search_engine/__init__.py +60 -0
  712. scitex/scholar/.legacy/_tmp/search_engine/local/_LocalSearchEngine.py +131 -0
  713. scitex/scholar/.legacy/_tmp/search_engine/local/_VectorSearchEngine.py +126 -0
  714. scitex/scholar/.legacy/_tmp/search_engine/web/_ArxivSearchEngine.py +270 -0
  715. scitex/scholar/.legacy/_tmp/search_engine/web/_CrossRefSearchEngine.py +313 -0
  716. scitex/scholar/.legacy/_tmp/search_engine/web/_GoogleScholarSearchEngine.py +203 -0
  717. scitex/scholar/.legacy/_tmp/search_engine/web/_PubMedSearchEngine.py +360 -0
  718. scitex/scholar/.legacy/_tmp/search_engine/web/_SemanticScholarSearchEngine.py +369 -0
  719. scitex/scholar/.legacy/database/README.md +121 -0
  720. scitex/scholar/.legacy/database/README_CONCURRENT_ACCESS.md +103 -0
  721. scitex/scholar/.legacy/database/_DatabaseEntry.py +228 -0
  722. scitex/scholar/.legacy/database/_DatabaseIndex.py +389 -0
  723. scitex/scholar/.legacy/database/_LibraryManager.py +274 -0
  724. scitex/scholar/.legacy/database/_PaperDatabase.py +529 -0
  725. scitex/scholar/.legacy/database/_ScholarDatabaseIntegration.py +413 -0
  726. scitex/scholar/.legacy/database/_StorageIntegratedDB.py +583 -0
  727. scitex/scholar/.legacy/database/_ZoteroCompatibleDB.py +1131 -0
  728. scitex/scholar/.legacy/database/__init__.py +27 -0
  729. scitex/scholar/.legacy/database/manage.py +266 -0
  730. scitex/scholar/.legacy/lookup/_LookupIndex.py +414 -0
  731. scitex/scholar/.legacy/lookup/__init__.py +21 -0
  732. scitex/scholar/.legacy/metadata/README.md +62 -0
  733. scitex/scholar/.legacy/metadata/__init__.py +1 -0
  734. scitex/scholar/.legacy/metadata/doi/README.md +368 -0
  735. scitex/scholar/.legacy/metadata/doi/__init__.py +7 -0
  736. scitex/scholar/.legacy/metadata/doi/batch/_MetadataHandlerForBatchDOIResolution.py +309 -0
  737. scitex/scholar/.legacy/metadata/doi/batch/_ProgressManagerForBatchDOIResolution.py +317 -0
  738. scitex/scholar/.legacy/metadata/doi/batch/_SourceStatsManagerForBatchDOIResolution.py +304 -0
  739. scitex/scholar/.legacy/metadata/doi/batch/__init__.py +24 -0
  740. scitex/scholar/.legacy/metadata/doi/resolvers/_BatchDOIResolver.py +601 -0
  741. scitex/scholar/.legacy/metadata/doi/resolvers/_BibTeXDOIResolver.py +639 -0
  742. scitex/scholar/.legacy/metadata/doi/resolvers/_DOIResolver.py +191 -0
  743. scitex/scholar/.legacy/metadata/doi/resolvers/_SingleDOIResolver.py +407 -0
  744. scitex/scholar/.legacy/metadata/doi/resolvers/__init__.py +2 -0
  745. scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSource.py +287 -0
  746. scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py +217 -0
  747. scitex/scholar/.legacy/metadata/doi/sources/_ArXivSource.py +325 -0
  748. scitex/scholar/.legacy/metadata/doi/sources/_BaseDOISource.py +375 -0
  749. scitex/scholar/.legacy/metadata/doi/sources/_CrossRefLocalSource.py +78 -0
  750. scitex/scholar/.legacy/metadata/doi/sources/_CrossRefSource.py +246 -0
  751. scitex/scholar/.legacy/metadata/doi/sources/_OpenAlexSource.py +318 -0
  752. scitex/scholar/.legacy/metadata/doi/sources/_PubMedSource.py +319 -0
  753. scitex/scholar/.legacy/metadata/doi/sources/_SemanticScholarSource.py +359 -0
  754. scitex/scholar/.legacy/metadata/doi/sources/_SourceManager.py +330 -0
  755. scitex/scholar/.legacy/metadata/doi/sources/_SourceResolutionStrategy.py +626 -0
  756. scitex/scholar/.legacy/metadata/doi/sources/_SourceRotationManager.py +598 -0
  757. scitex/scholar/.legacy/metadata/doi/sources/_URLDOISource.py +401 -0
  758. scitex/scholar/.legacy/metadata/doi/sources/_UnifiedSource.py +426 -0
  759. scitex/scholar/.legacy/metadata/doi/sources/__init__.py +37 -0
  760. scitex/scholar/.legacy/metadata/doi/utils/_PubMedConverter.py +469 -0
  761. scitex/scholar/.legacy/metadata/doi/utils/_RateLimitHandler.py +733 -0
  762. scitex/scholar/.legacy/metadata/doi/utils/_TextNormalizer.py +597 -0
  763. scitex/scholar/.legacy/metadata/doi/utils/_URLDOIExtractor.py +282 -0
  764. scitex/scholar/.legacy/metadata/doi/utils/__init__.py +39 -0
  765. scitex/scholar/.legacy/metadata/doi/utils/_to_complete_metadata_structure.py +314 -0
  766. scitex/scholar/.legacy/metadata/doi/utils/legacy/_ConfigurationResolver.py +387 -0
  767. scitex/scholar/.legacy/metadata/enrichment/README.md +51 -0
  768. scitex/scholar/.legacy/metadata/enrichment/_LibraryEnricher.py +100 -0
  769. scitex/scholar/.legacy/metadata/enrichment/__init__.py +2 -0
  770. scitex/scholar/.legacy/metadata/enrichment/enrichers/_ImpactFactorEnricher.py +113 -0
  771. scitex/scholar/.legacy/metadata/enrichment/enrichers/_SmartEnricher.py +169 -0
  772. scitex/scholar/.legacy/metadata/enrichment/enrichers/__init__.py +4 -0
  773. scitex/scholar/.legacy/metadata/enrichment/sources/_UnifiedMetadataSource.py +127 -0
  774. scitex/scholar/.legacy/metadata/enrichment/sources/__init__.py +3 -0
  775. scitex/scholar/.legacy/metadata/query_to_full_meta_json.py +188 -0
  776. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  777. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/README.md +223 -0
  778. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_DOIToURLResolver.py +694 -0
  779. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_OpenURLResolver.py +1160 -0
  780. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  781. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/__init__.py +24 -0
  782. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_MultiInstitutionalResolver.py +397 -0
  783. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_OpenURLResolverWithZenRows.py +718 -0
  784. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_ResumableOpenURLResolver.py +298 -0
  785. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_UnimelbLibraryGoButtonSelector.py +466 -0
  786. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_ZenRowsOpenURLResolver.py +372 -0
  787. scitex/scholar/.legacy/metadata/urls/README.md +142 -0
  788. scitex/scholar/.legacy/metadata/urls/_URLMetadataHandler.py +383 -0
  789. scitex/scholar/.legacy/metadata/urls/_ZoteroTranslatorRunner.py +300 -0
  790. scitex/scholar/.legacy/metadata/urls/__init__.py +39 -0
  791. scitex/scholar/.legacy/metadata/urls/_finder.py +321 -0
  792. scitex/scholar/.legacy/metadata/urls/_handler.py +334 -0
  793. scitex/scholar/.legacy/metadata/urls/_resolver.py +293 -0
  794. scitex/scholar/.legacy/metadata/urls/docs/CORE_URL_TYPES.md +187 -0
  795. scitex/scholar/.legacy/metadata/urls/docs/URL_SCHEMA.md +223 -0
  796. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/.eslintrc +11 -0
  797. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/AGPL +22 -0
  798. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/checkDeletedTxt.sh +46 -0
  799. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/bin/teslint.js +9 -0
  800. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/index.js +15 -0
  801. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/package-lock.json +151 -0
  802. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/package.json +21 -0
  803. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/processor.js +257 -0
  804. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/helper.sh +29 -0
  805. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/lint.sh +12 -0
  806. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/check-pull-request.sh +39 -0
  807. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/selenium-test.js +147 -0
  808. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/translator-server.js +72 -0
  809. scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/updateTypes.mjs +75 -0
  810. scitex/scholar/.legacy/metadata/urls/zotero_translators/.editorconfig +8 -0
  811. scitex/scholar/.legacy/metadata/urls/zotero_translators/.eslintrc +70 -0
  812. scitex/scholar/.legacy/metadata/urls/zotero_translators/ABC News Australia.js +224 -0
  813. scitex/scholar/.legacy/metadata/urls/zotero_translators/ACLS Humanities EBook.js +165 -0
  814. scitex/scholar/.legacy/metadata/urls/zotero_translators/ACLWeb.js +600 -0
  815. scitex/scholar/.legacy/metadata/urls/zotero_translators/ACM Digital Library.js +710 -0
  816. scitex/scholar/.legacy/metadata/urls/zotero_translators/ACS Publications.js +633 -0
  817. scitex/scholar/.legacy/metadata/urls/zotero_translators/ADS Bibcode.js +664 -0
  818. scitex/scholar/.legacy/metadata/urls/zotero_translators/AEA Web.js +450 -0
  819. scitex/scholar/.legacy/metadata/urls/zotero_translators/AGRIS.js +311 -0
  820. scitex/scholar/.legacy/metadata/urls/zotero_translators/AIP.js +295 -0
  821. scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS Journals.js +136 -0
  822. scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS MathSciNet (Legacy).js +313 -0
  823. scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS MathSciNet.js +288 -0
  824. scitex/scholar/.legacy/metadata/urls/zotero_translators/APA PsycNET.js +915 -0
  825. scitex/scholar/.legacy/metadata/urls/zotero_translators/APN.ru.js +132 -0
  826. scitex/scholar/.legacy/metadata/urls/zotero_translators/APS-Physics.js +204 -0
  827. scitex/scholar/.legacy/metadata/urls/zotero_translators/APS.js +542 -0
  828. scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTFL Encyclopedie.js +283 -0
  829. scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTnews.js +155 -0
  830. scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTstor.js +619 -0
  831. scitex/scholar/.legacy/metadata/urls/zotero_translators/ASCE.js +199 -0
  832. scitex/scholar/.legacy/metadata/urls/zotero_translators/ASCO Meeting Library.js +153 -0
  833. scitex/scholar/.legacy/metadata/urls/zotero_translators/ASTIS.js +337 -0
  834. scitex/scholar/.legacy/metadata/urls/zotero_translators/ATS International Journal.js +290 -0
  835. scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Engineering.js +384 -0
  836. scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Medicine.js +343 -0
  837. scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Science.js +391 -0
  838. scitex/scholar/.legacy/metadata/urls/zotero_translators/Adam Matthew Digital.js +405 -0
  839. scitex/scholar/.legacy/metadata/urls/zotero_translators/Agencia del ISBN.js +77 -0
  840. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ahval News.js +309 -0
  841. scitex/scholar/.legacy/metadata/urls/zotero_translators/Air University Journals.js +236 -0
  842. scitex/scholar/.legacy/metadata/urls/zotero_translators/Airiti.js +423 -0
  843. scitex/scholar/.legacy/metadata/urls/zotero_translators/Alexander Street Press.js +198 -0
  844. scitex/scholar/.legacy/metadata/urls/zotero_translators/AllAfrica.js +291 -0
  845. scitex/scholar/.legacy/metadata/urls/zotero_translators/Alsharekh.js +242 -0
  846. scitex/scholar/.legacy/metadata/urls/zotero_translators/AlterNet.js +134 -0
  847. scitex/scholar/.legacy/metadata/urls/zotero_translators/Aluka.js +261 -0
  848. scitex/scholar/.legacy/metadata/urls/zotero_translators/Amazon.js +1043 -0
  849. scitex/scholar/.legacy/metadata/urls/zotero_translators/American Archive of Public Broadcasting.js +592 -0
  850. scitex/scholar/.legacy/metadata/urls/zotero_translators/American Institute of Aeronautics and Astronautics.js +210 -0
  851. scitex/scholar/.legacy/metadata/urls/zotero_translators/American Prospect.js +114 -0
  852. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ancestry.com US Federal Census.js +164 -0
  853. scitex/scholar/.legacy/metadata/urls/zotero_translators/Annual Reviews.js +329 -0
  854. scitex/scholar/.legacy/metadata/urls/zotero_translators/Antikvarium.hu.js +280 -0
  855. scitex/scholar/.legacy/metadata/urls/zotero_translators/AquaDocs.js +390 -0
  856. scitex/scholar/.legacy/metadata/urls/zotero_translators/Archeion.js +249 -0
  857. scitex/scholar/.legacy/metadata/urls/zotero_translators/Archiv fuer Sozialgeschichte.js +157 -0
  858. scitex/scholar/.legacy/metadata/urls/zotero_translators/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js +179 -0
  859. scitex/scholar/.legacy/metadata/urls/zotero_translators/Archives Canada.js +142 -0
  860. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ariana News.js +203 -0
  861. scitex/scholar/.legacy/metadata/urls/zotero_translators/Art Institute of Chicago.js +279 -0
  862. scitex/scholar/.legacy/metadata/urls/zotero_translators/Artefacts Canada.js +192 -0
  863. scitex/scholar/.legacy/metadata/urls/zotero_translators/Artforum.js +438 -0
  864. scitex/scholar/.legacy/metadata/urls/zotero_translators/Atlanta Journal-Constitution.js +311 -0
  865. scitex/scholar/.legacy/metadata/urls/zotero_translators/Atypon Journals.js +1204 -0
  866. scitex/scholar/.legacy/metadata/urls/zotero_translators/AustLII and NZLII.js +604 -0
  867. scitex/scholar/.legacy/metadata/urls/zotero_translators/Australian Dictionary of Biography.js +196 -0
  868. scitex/scholar/.legacy/metadata/urls/zotero_translators/BAILII.js +176 -0
  869. scitex/scholar/.legacy/metadata/urls/zotero_translators/BBC Genome.js +254 -0
  870. scitex/scholar/.legacy/metadata/urls/zotero_translators/BBC.js +430 -0
  871. scitex/scholar/.legacy/metadata/urls/zotero_translators/BIBSYS.js +112 -0
  872. scitex/scholar/.legacy/metadata/urls/zotero_translators/BOCC.js +217 -0
  873. scitex/scholar/.legacy/metadata/urls/zotero_translators/BOE.js +229 -0
  874. scitex/scholar/.legacy/metadata/urls/zotero_translators/BOFiP-Impots.js +132 -0
  875. scitex/scholar/.legacy/metadata/urls/zotero_translators/Baidu Scholar.js +276 -0
  876. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bangkok Post.js +216 -0
  877. scitex/scholar/.legacy/metadata/urls/zotero_translators/Baruch Foundation.js +175 -0
  878. scitex/scholar/.legacy/metadata/urls/zotero_translators/Beobachter.js +175 -0
  879. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bezneng Gajit.js +92 -0
  880. scitex/scholar/.legacy/metadata/urls/zotero_translators/BibLaTeX.js +888 -0
  881. scitex/scholar/.legacy/metadata/urls/zotero_translators/BibTeX.js +4236 -0
  882. scitex/scholar/.legacy/metadata/urls/zotero_translators/Biblio.com.js +216 -0
  883. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliontology RDF.js +1166 -0
  884. scitex/scholar/.legacy/metadata/urls/zotero_translators/Biblioteca Nacional de Maestros.js +213 -0
  885. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque et Archives Nationale du Quebec (Pistard).js +147 -0
  886. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque et Archives Nationales du Quebec.js +266 -0
  887. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque nationale de France.js +872 -0
  888. scitex/scholar/.legacy/metadata/urls/zotero_translators/BioMed Central.js +585 -0
  889. scitex/scholar/.legacy/metadata/urls/zotero_translators/BioOne.js +233 -0
  890. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bioconductor.js +343 -0
  891. scitex/scholar/.legacy/metadata/urls/zotero_translators/Blaetter.js +192 -0
  892. scitex/scholar/.legacy/metadata/urls/zotero_translators/Blogger.js +244 -0
  893. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bloomberg.js +205 -0
  894. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bloomsbury Food Library.js +296 -0
  895. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bluesky.js +195 -0
  896. scitex/scholar/.legacy/metadata/urls/zotero_translators/BnF ISBN.js +129 -0
  897. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bookmarks.js +282 -0
  898. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bookshop.org.js +223 -0
  899. scitex/scholar/.legacy/metadata/urls/zotero_translators/Boston Review.js +332 -0
  900. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bosworth Toller's Anglo-Saxon Dictionary Online.js +496 -0
  901. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bracero History Archive.js +200 -0
  902. scitex/scholar/.legacy/metadata/urls/zotero_translators/Brill.js +434 -0
  903. scitex/scholar/.legacy/metadata/urls/zotero_translators/Brukerhandboken.js +153 -0
  904. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bryn Mawr Classical Review.js +303 -0
  905. scitex/scholar/.legacy/metadata/urls/zotero_translators/Bundesgesetzblatt.js +231 -0
  906. scitex/scholar/.legacy/metadata/urls/zotero_translators/Business Standard.js +151 -0
  907. scitex/scholar/.legacy/metadata/urls/zotero_translators/CABI - CAB Abstracts.js +317 -0
  908. scitex/scholar/.legacy/metadata/urls/zotero_translators/CAOD.js +260 -0
  909. scitex/scholar/.legacy/metadata/urls/zotero_translators/CBC.js +439 -0
  910. scitex/scholar/.legacy/metadata/urls/zotero_translators/CCfr (BnF).js +162 -0
  911. scitex/scholar/.legacy/metadata/urls/zotero_translators/CERN Document Server.js +277 -0
  912. scitex/scholar/.legacy/metadata/urls/zotero_translators/CEUR Workshop Proceedings.js +145 -0
  913. scitex/scholar/.legacy/metadata/urls/zotero_translators/CFF References.js +170 -0
  914. scitex/scholar/.legacy/metadata/urls/zotero_translators/CFF.js +113 -0
  915. scitex/scholar/.legacy/metadata/urls/zotero_translators/CIA World Factbook.js +128 -0
  916. scitex/scholar/.legacy/metadata/urls/zotero_translators/CLACSO.js +226 -0
  917. scitex/scholar/.legacy/metadata/urls/zotero_translators/CLASE.js +135 -0
  918. scitex/scholar/.legacy/metadata/urls/zotero_translators/CNKI.js +731 -0
  919. scitex/scholar/.legacy/metadata/urls/zotero_translators/COBISS.js +1945 -0
  920. scitex/scholar/.legacy/metadata/urls/zotero_translators/COinS.js +336 -0
  921. scitex/scholar/.legacy/metadata/urls/zotero_translators/CQ Press.js +418 -0
  922. scitex/scholar/.legacy/metadata/urls/zotero_translators/CROSBI.js +227 -0
  923. scitex/scholar/.legacy/metadata/urls/zotero_translators/CSIRO Publishing.js +139 -0
  924. scitex/scholar/.legacy/metadata/urls/zotero_translators/CSL JSON.js +203 -0
  925. scitex/scholar/.legacy/metadata/urls/zotero_translators/CSV.js +294 -0
  926. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cairn.info.js +368 -0
  927. scitex/scholar/.legacy/metadata/urls/zotero_translators/CalMatters.js +228 -0
  928. scitex/scholar/.legacy/metadata/urls/zotero_translators/Calisphere.js +355 -0
  929. scitex/scholar/.legacy/metadata/urls/zotero_translators/Camara Brasileira do Livro ISBN.js +842 -0
  930. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cambridge Core.js +580 -0
  931. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cambridge Engage Preprints.js +276 -0
  932. scitex/scholar/.legacy/metadata/urls/zotero_translators/CanLII.js +284 -0
  933. scitex/scholar/.legacy/metadata/urls/zotero_translators/Canada.com.js +171 -0
  934. scitex/scholar/.legacy/metadata/urls/zotero_translators/Canadian Letters and Images.js +148 -0
  935. scitex/scholar/.legacy/metadata/urls/zotero_translators/Canadiana.ca.js +196 -0
  936. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cascadilla Proceedings Project.js +390 -0
  937. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cell Press.js +516 -0
  938. scitex/scholar/.legacy/metadata/urls/zotero_translators/Central and Eastern European Online Library Journals.js +313 -0
  939. scitex/scholar/.legacy/metadata/urls/zotero_translators/Champlain Society - Collection.js +220 -0
  940. scitex/scholar/.legacy/metadata/urls/zotero_translators/Chicago Journal of Theoretical Computer Science.js +203 -0
  941. scitex/scholar/.legacy/metadata/urls/zotero_translators/Christian Science Monitor.js +148 -0
  942. scitex/scholar/.legacy/metadata/urls/zotero_translators/Chronicling America.js +131 -0
  943. scitex/scholar/.legacy/metadata/urls/zotero_translators/CiNii Research.js +168 -0
  944. scitex/scholar/.legacy/metadata/urls/zotero_translators/Citavi 5 XML.js +516 -0
  945. scitex/scholar/.legacy/metadata/urls/zotero_translators/CiteSeer.js +196 -0
  946. scitex/scholar/.legacy/metadata/urls/zotero_translators/Citizen Lab.js +347 -0
  947. scitex/scholar/.legacy/metadata/urls/zotero_translators/Civilization.ca.js +146 -0
  948. scitex/scholar/.legacy/metadata/urls/zotero_translators/Climate Change and Human Health Literature Portal.js +283 -0
  949. scitex/scholar/.legacy/metadata/urls/zotero_translators/Clinical Key.js +367 -0
  950. scitex/scholar/.legacy/metadata/urls/zotero_translators/Code4Lib Journal.js +143 -0
  951. scitex/scholar/.legacy/metadata/urls/zotero_translators/Colorado State Legislature.js +215 -0
  952. scitex/scholar/.legacy/metadata/urls/zotero_translators/Columbia University Press.js +238 -0
  953. scitex/scholar/.legacy/metadata/urls/zotero_translators/Common-Place.js +218 -0
  954. scitex/scholar/.legacy/metadata/urls/zotero_translators/Computer History Museum Archive.js +1319 -0
  955. scitex/scholar/.legacy/metadata/urls/zotero_translators/Copernicus.js +461 -0
  956. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cornell LII.js +252 -0
  957. scitex/scholar/.legacy/metadata/urls/zotero_translators/Cornell University Press.js +235 -0
  958. scitex/scholar/.legacy/metadata/urls/zotero_translators/CourtListener.js +265 -0
  959. scitex/scholar/.legacy/metadata/urls/zotero_translators/Crossref REST.js +1757 -0
  960. scitex/scholar/.legacy/metadata/urls/zotero_translators/Crossref Unixref XML.js +965 -0
  961. scitex/scholar/.legacy/metadata/urls/zotero_translators/Current Affairs.js +160 -0
  962. scitex/scholar/.legacy/metadata/urls/zotero_translators/DABI.js +476 -0
  963. scitex/scholar/.legacy/metadata/urls/zotero_translators/DAI-Zenon.js +392 -0
  964. scitex/scholar/.legacy/metadata/urls/zotero_translators/DART-Europe.js +176 -0
  965. scitex/scholar/.legacy/metadata/urls/zotero_translators/DBLP Computer Science Bibliography.js +462 -0
  966. scitex/scholar/.legacy/metadata/urls/zotero_translators/DBpia.js +233 -0
  967. scitex/scholar/.legacy/metadata/urls/zotero_translators/DEPATISnet.js +373 -0
  968. scitex/scholar/.legacy/metadata/urls/zotero_translators/DOAJ.js +242 -0
  969. scitex/scholar/.legacy/metadata/urls/zotero_translators/DOI Content Negotiation.js +352 -0
  970. scitex/scholar/.legacy/metadata/urls/zotero_translators/DOI.js +322 -0
  971. scitex/scholar/.legacy/metadata/urls/zotero_translators/DPLA.js +425 -0
  972. scitex/scholar/.legacy/metadata/urls/zotero_translators/DSpace Intermediate Metadata.js +208 -0
  973. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dagens Nyheter.js +369 -0
  974. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dagstuhl Research Online Publication Server.js +278 -0
  975. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dar Almandumah.js +253 -0
  976. scitex/scholar/.legacy/metadata/urls/zotero_translators/Data.gov.js +225 -0
  977. scitex/scholar/.legacy/metadata/urls/zotero_translators/Databrary.js +184 -0
  978. scitex/scholar/.legacy/metadata/urls/zotero_translators/Datacite JSON.js +1182 -0
  979. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dataverse.js +418 -0
  980. scitex/scholar/.legacy/metadata/urls/zotero_translators/Daum News.js +139 -0
  981. scitex/scholar/.legacy/metadata/urls/zotero_translators/De Gruyter Brill.js +674 -0
  982. scitex/scholar/.legacy/metadata/urls/zotero_translators/Defense Technical Information Center.js +146 -0
  983. scitex/scholar/.legacy/metadata/urls/zotero_translators/Delpher.js +413 -0
  984. scitex/scholar/.legacy/metadata/urls/zotero_translators/Demographic Research.js +164 -0
  985. scitex/scholar/.legacy/metadata/urls/zotero_translators/Denik CZ.js +273 -0
  986. scitex/scholar/.legacy/metadata/urls/zotero_translators/Der Freitag.js +236 -0
  987. scitex/scholar/.legacy/metadata/urls/zotero_translators/Der Spiegel.js +479 -0
  988. scitex/scholar/.legacy/metadata/urls/zotero_translators/Desiring God.js +216 -0
  989. scitex/scholar/.legacy/metadata/urls/zotero_translators/Deutsche Fotothek.js +364 -0
  990. scitex/scholar/.legacy/metadata/urls/zotero_translators/Deutsche Nationalbibliothek.js +594 -0
  991. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dialnet.js +258 -0
  992. scitex/scholar/.legacy/metadata/urls/zotero_translators/Die Zeit.js +378 -0
  993. scitex/scholar/.legacy/metadata/urls/zotero_translators/DigiZeitschriften.js +269 -0
  994. scitex/scholar/.legacy/metadata/urls/zotero_translators/Digital Humanities Quarterly.js +207 -0
  995. scitex/scholar/.legacy/metadata/urls/zotero_translators/Digital Spy.js +215 -0
  996. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dimensions.js +233 -0
  997. scitex/scholar/.legacy/metadata/urls/zotero_translators/Douban.js +316 -0
  998. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dreier Neuerscheinungsdienst.js +209 -0
  999. scitex/scholar/.legacy/metadata/urls/zotero_translators/DrugBank.ca.js +209 -0
  1000. scitex/scholar/.legacy/metadata/urls/zotero_translators/Dryad Digital Repository.js +323 -0
  1001. scitex/scholar/.legacy/metadata/urls/zotero_translators/Duke University Press Books.js +250 -0
  1002. scitex/scholar/.legacy/metadata/urls/zotero_translators/E-periodica Switzerland.js +347 -0
  1003. scitex/scholar/.legacy/metadata/urls/zotero_translators/EBSCO Discovery Layer.js +147 -0
  1004. scitex/scholar/.legacy/metadata/urls/zotero_translators/EBSCOhost.js +592 -0
  1005. scitex/scholar/.legacy/metadata/urls/zotero_translators/EIDR.js +184 -0
  1006. scitex/scholar/.legacy/metadata/urls/zotero_translators/EPA National Library Catalog.js +245 -0
  1007. scitex/scholar/.legacy/metadata/urls/zotero_translators/ERIC.js +986 -0
  1008. scitex/scholar/.legacy/metadata/urls/zotero_translators/ESpacenet.js +465 -0
  1009. scitex/scholar/.legacy/metadata/urls/zotero_translators/EUR-Lex.js +423 -0
  1010. scitex/scholar/.legacy/metadata/urls/zotero_translators/Eastview.js +336 -0
  1011. scitex/scholar/.legacy/metadata/urls/zotero_translators/Edinburgh University Press Journals.js +178 -0
  1012. scitex/scholar/.legacy/metadata/urls/zotero_translators/Education Week.js +197 -0
  1013. scitex/scholar/.legacy/metadata/urls/zotero_translators/El Comercio (Peru).js +347 -0
  1014. scitex/scholar/.legacy/metadata/urls/zotero_translators/El Pais.js +262 -0
  1015. scitex/scholar/.legacy/metadata/urls/zotero_translators/Electronic Colloquium on Computational Complexity.js +230 -0
  1016. scitex/scholar/.legacy/metadata/urls/zotero_translators/Elicit.js +120 -0
  1017. scitex/scholar/.legacy/metadata/urls/zotero_translators/Elsevier Health Journals.js +531 -0
  1018. scitex/scholar/.legacy/metadata/urls/zotero_translators/Elsevier Pure.js +420 -0
  1019. scitex/scholar/.legacy/metadata/urls/zotero_translators/Embedded Metadata.js +1951 -0
  1020. scitex/scholar/.legacy/metadata/urls/zotero_translators/Emerald Insight.js +626 -0
  1021. scitex/scholar/.legacy/metadata/urls/zotero_translators/Encyclopedia of Chicago.js +162 -0
  1022. scitex/scholar/.legacy/metadata/urls/zotero_translators/Encyclopedia of Korean Culture.js +221 -0
  1023. scitex/scholar/.legacy/metadata/urls/zotero_translators/Endnote XML.js +1407 -0
  1024. scitex/scholar/.legacy/metadata/urls/zotero_translators/Engineering Village.js +139 -0
  1025. scitex/scholar/.legacy/metadata/urls/zotero_translators/Envidat.js +331 -0
  1026. scitex/scholar/.legacy/metadata/urls/zotero_translators/Epicurious.js +144 -0
  1027. scitex/scholar/.legacy/metadata/urls/zotero_translators/Erudit.js +272 -0
  1028. scitex/scholar/.legacy/metadata/urls/zotero_translators/Euclid.js +220 -0
  1029. scitex/scholar/.legacy/metadata/urls/zotero_translators/EurasiaNet.js +109 -0
  1030. scitex/scholar/.legacy/metadata/urls/zotero_translators/EurogamerUSgamer.js +380 -0
  1031. scitex/scholar/.legacy/metadata/urls/zotero_translators/Europe PMC.js +448 -0
  1032. scitex/scholar/.legacy/metadata/urls/zotero_translators/Evernote.js +104 -0
  1033. scitex/scholar/.legacy/metadata/urls/zotero_translators/F1000 Research.js +655 -0
  1034. scitex/scholar/.legacy/metadata/urls/zotero_translators/FAO Publications.js +1139 -0
  1035. scitex/scholar/.legacy/metadata/urls/zotero_translators/FAZ.NET.js +231 -0
  1036. scitex/scholar/.legacy/metadata/urls/zotero_translators/Fachportal Padagogik.js +839 -0
  1037. scitex/scholar/.legacy/metadata/urls/zotero_translators/Factiva.js +302 -0
  1038. scitex/scholar/.legacy/metadata/urls/zotero_translators/Failed Architecture.js +114 -0
  1039. scitex/scholar/.legacy/metadata/urls/zotero_translators/Fairfax Australia.js +200 -0
  1040. scitex/scholar/.legacy/metadata/urls/zotero_translators/Fatcat.js +425 -0
  1041. scitex/scholar/.legacy/metadata/urls/zotero_translators/Figshare.js +191 -0
  1042. scitex/scholar/.legacy/metadata/urls/zotero_translators/Financial Times.js +187 -0
  1043. scitex/scholar/.legacy/metadata/urls/zotero_translators/Finna.js +357 -0
  1044. scitex/scholar/.legacy/metadata/urls/zotero_translators/Flickr.js +318 -0
  1045. scitex/scholar/.legacy/metadata/urls/zotero_translators/Foreign Affairs.js +485 -0
  1046. scitex/scholar/.legacy/metadata/urls/zotero_translators/Foreign Policy.js +146 -0
  1047. scitex/scholar/.legacy/metadata/urls/zotero_translators/FreeCite.js +95 -0
  1048. scitex/scholar/.legacy/metadata/urls/zotero_translators/FreePatentsOnline.js +265 -0
  1049. scitex/scholar/.legacy/metadata/urls/zotero_translators/Frieze.js +243 -0
  1050. scitex/scholar/.legacy/metadata/urls/zotero_translators/Frontiers.js +667 -0
  1051. scitex/scholar/.legacy/metadata/urls/zotero_translators/GMS German Medical Science.js +319 -0
  1052. scitex/scholar/.legacy/metadata/urls/zotero_translators/GPO Access e-CFR.js +134 -0
  1053. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gale Databases.js +324 -0
  1054. scitex/scholar/.legacy/metadata/urls/zotero_translators/GaleGDC.js +189 -0
  1055. scitex/scholar/.legacy/metadata/urls/zotero_translators/Galegroup.js +327 -0
  1056. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gallica.js +194 -0
  1057. scitex/scholar/.legacy/metadata/urls/zotero_translators/Game Studies.js +155 -0
  1058. scitex/scholar/.legacy/metadata/urls/zotero_translators/GameSpot.js +199 -0
  1059. scitex/scholar/.legacy/metadata/urls/zotero_translators/GameStar GamePro.js +198 -0
  1060. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gasyrlar Awazy.js +156 -0
  1061. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gemeinsamer Bibliotheksverbund ISBN.js +23 -0
  1062. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gene Ontology.js +128 -0
  1063. scitex/scholar/.legacy/metadata/urls/zotero_translators/GitHub.js +501 -0
  1064. scitex/scholar/.legacy/metadata/urls/zotero_translators/Globes.js +243 -0
  1065. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gmail.js +64 -0
  1066. scitex/scholar/.legacy/metadata/urls/zotero_translators/Goodreads.js +219 -0
  1067. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Books.js +552 -0
  1068. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Patents.js +959 -0
  1069. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Play.js +186 -0
  1070. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Presentation.js +104 -0
  1071. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Research.js +221 -0
  1072. scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Scholar.js +1361 -0
  1073. scitex/scholar/.legacy/metadata/urls/zotero_translators/Gulag Many Days, Many Lives.js +179 -0
  1074. scitex/scholar/.legacy/metadata/urls/zotero_translators/HAL Archives Ouvertes.js +429 -0
  1075. scitex/scholar/.legacy/metadata/urls/zotero_translators/HCSP.js +312 -0
  1076. scitex/scholar/.legacy/metadata/urls/zotero_translators/HUDOC.js +650 -0
  1077. scitex/scholar/.legacy/metadata/urls/zotero_translators/Haaretz.js +562 -0
  1078. scitex/scholar/.legacy/metadata/urls/zotero_translators/Habr.js +232 -0
  1079. scitex/scholar/.legacy/metadata/urls/zotero_translators/Handelszeitung.js +273 -0
  1080. scitex/scholar/.legacy/metadata/urls/zotero_translators/Hanrei Watch.js +123 -0
  1081. scitex/scholar/.legacy/metadata/urls/zotero_translators/Harper's Magazine.js +365 -0
  1082. scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard Business Review.js +326 -0
  1083. scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard Caselaw Access Project.js +244 -0
  1084. scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard University Press Books.js +286 -0
  1085. scitex/scholar/.legacy/metadata/urls/zotero_translators/HathiTrust.js +311 -0
  1086. scitex/scholar/.legacy/metadata/urls/zotero_translators/HeinOnline.js +266 -0
  1087. scitex/scholar/.legacy/metadata/urls/zotero_translators/Heise.js +200 -0
  1088. scitex/scholar/.legacy/metadata/urls/zotero_translators/Herder.js +236 -0
  1089. scitex/scholar/.legacy/metadata/urls/zotero_translators/HighBeam.js +198 -0
  1090. scitex/scholar/.legacy/metadata/urls/zotero_translators/HighWire 2.0.js +1355 -0
  1091. scitex/scholar/.legacy/metadata/urls/zotero_translators/HighWire.js +209 -0
  1092. scitex/scholar/.legacy/metadata/urls/zotero_translators/Hindawi Publishers.js +177 -0
  1093. scitex/scholar/.legacy/metadata/urls/zotero_translators/Hispanic-American Periodical Index.js +236 -0
  1094. scitex/scholar/.legacy/metadata/urls/zotero_translators/Homeland Security Digital Library.js +426 -0
  1095. scitex/scholar/.legacy/metadata/urls/zotero_translators/Huff Post.js +223 -0
  1096. scitex/scholar/.legacy/metadata/urls/zotero_translators/Human Rights Watch.js +450 -0
  1097. scitex/scholar/.legacy/metadata/urls/zotero_translators/IBISWorld.js +171 -0
  1098. scitex/scholar/.legacy/metadata/urls/zotero_translators/IDEA ALM.js +536 -0
  1099. scitex/scholar/.legacy/metadata/urls/zotero_translators/IEEE Computer Society.js +429 -0
  1100. scitex/scholar/.legacy/metadata/urls/zotero_translators/IEEE Xplore.js +1000 -0
  1101. scitex/scholar/.legacy/metadata/urls/zotero_translators/IETF.js +451 -0
  1102. scitex/scholar/.legacy/metadata/urls/zotero_translators/IGN.js +136 -0
  1103. scitex/scholar/.legacy/metadata/urls/zotero_translators/IMDb.js +566 -0
  1104. scitex/scholar/.legacy/metadata/urls/zotero_translators/INSPIRE.js +247 -0
  1105. scitex/scholar/.legacy/metadata/urls/zotero_translators/IPCC.js +757 -0
  1106. scitex/scholar/.legacy/metadata/urls/zotero_translators/ISTC.js +181 -0
  1107. scitex/scholar/.legacy/metadata/urls/zotero_translators/Idref.js +179 -0
  1108. scitex/scholar/.legacy/metadata/urls/zotero_translators/In These Times.js +196 -0
  1109. scitex/scholar/.legacy/metadata/urls/zotero_translators/InfoTrac.js +279 -0
  1110. scitex/scholar/.legacy/metadata/urls/zotero_translators/Informationssystem Medienpaedagogik.js +305 -0
  1111. scitex/scholar/.legacy/metadata/urls/zotero_translators/IngentaConnect.js +312 -0
  1112. scitex/scholar/.legacy/metadata/urls/zotero_translators/Inside Higher Ed.js +167 -0
  1113. scitex/scholar/.legacy/metadata/urls/zotero_translators/Insignia OPAC.js +114 -0
  1114. scitex/scholar/.legacy/metadata/urls/zotero_translators/Institute of Contemporary Art.js +180 -0
  1115. scitex/scholar/.legacy/metadata/urls/zotero_translators/Institute of Physics.js +340 -0
  1116. scitex/scholar/.legacy/metadata/urls/zotero_translators/Integrum.js +173 -0
  1117. scitex/scholar/.legacy/metadata/urls/zotero_translators/Intellixir.js +264 -0
  1118. scitex/scholar/.legacy/metadata/urls/zotero_translators/Inter-Research Science Center.js +185 -0
  1119. scitex/scholar/.legacy/metadata/urls/zotero_translators/International Nuclear Information System.js +285 -0
  1120. scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive Scholar.js +106 -0
  1121. scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive Wayback Machine.js +152 -0
  1122. scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive.js +552 -0
  1123. scitex/scholar/.legacy/metadata/urls/zotero_translators/InvenioRDM.js +1260 -0
  1124. scitex/scholar/.legacy/metadata/urls/zotero_translators/Isidore.js +235 -0
  1125. scitex/scholar/.legacy/metadata/urls/zotero_translators/J-Stage.js +272 -0
  1126. scitex/scholar/.legacy/metadata/urls/zotero_translators/JETS.js +122 -0
  1127. scitex/scholar/.legacy/metadata/urls/zotero_translators/JISC Historical Texts.js +273 -0
  1128. scitex/scholar/.legacy/metadata/urls/zotero_translators/JRC Publications Repository.js +569 -0
  1129. scitex/scholar/.legacy/metadata/urls/zotero_translators/JSTOR.js +821 -0
  1130. scitex/scholar/.legacy/metadata/urls/zotero_translators/Jahrbuch.js +213 -0
  1131. scitex/scholar/.legacy/metadata/urls/zotero_translators/Japan Times Online.js +138 -0
  1132. scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Electronic Publishing.js +147 -0
  1133. scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Extension.js +288 -0
  1134. scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Machine Learning Research.js +441 -0
  1135. scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Religion and Society.js +174 -0
  1136. scitex/scholar/.legacy/metadata/urls/zotero_translators/JurPC.js +274 -0
  1137. scitex/scholar/.legacy/metadata/urls/zotero_translators/Juricaf.js +141 -0
  1138. scitex/scholar/.legacy/metadata/urls/zotero_translators/Juris.js +728 -0
  1139. scitex/scholar/.legacy/metadata/urls/zotero_translators/K10plus ISBN.js +386 -0
  1140. scitex/scholar/.legacy/metadata/urls/zotero_translators/KStudy.js +632 -0
  1141. scitex/scholar/.legacy/metadata/urls/zotero_translators/Kanopy.js +358 -0
  1142. scitex/scholar/.legacy/metadata/urls/zotero_translators/Khaama Press.js +249 -0
  1143. scitex/scholar/.legacy/metadata/urls/zotero_translators/KitapYurdu.com.js +376 -0
  1144. scitex/scholar/.legacy/metadata/urls/zotero_translators/Kommersant.js +174 -0
  1145. scitex/scholar/.legacy/metadata/urls/zotero_translators/Korean National Library.js +621 -0
  1146. scitex/scholar/.legacy/metadata/urls/zotero_translators/L'Annee Philologique.js +267 -0
  1147. scitex/scholar/.legacy/metadata/urls/zotero_translators/LA Times.js +239 -0
  1148. scitex/scholar/.legacy/metadata/urls/zotero_translators/LIBRIS ISBN.js +103 -0
  1149. scitex/scholar/.legacy/metadata/urls/zotero_translators/LIVIVO.js +260 -0
  1150. scitex/scholar/.legacy/metadata/urls/zotero_translators/LWN.net.js +315 -0
  1151. scitex/scholar/.legacy/metadata/urls/zotero_translators/La Croix.js +237 -0
  1152. scitex/scholar/.legacy/metadata/urls/zotero_translators/La Nacion (Argentina).js +231 -0
  1153. scitex/scholar/.legacy/metadata/urls/zotero_translators/La Presse.js +218 -0
  1154. scitex/scholar/.legacy/metadata/urls/zotero_translators/La Republica (Peru).js +174 -0
  1155. scitex/scholar/.legacy/metadata/urls/zotero_translators/Lagen.nu.js +214 -0
  1156. scitex/scholar/.legacy/metadata/urls/zotero_translators/Landesbibliographie Baden-Wurttemberg.js +324 -0
  1157. scitex/scholar/.legacy/metadata/urls/zotero_translators/Lapham's Quarterly.js +1062 -0
  1158. scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Devoir.js +167 -0
  1159. scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Figaro.js +225 -0
  1160. scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Maitron.js +484 -0
  1161. scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Monde.js +258 -0
  1162. scitex/scholar/.legacy/metadata/urls/zotero_translators/Le monde diplomatique.js +200 -0
  1163. scitex/scholar/.legacy/metadata/urls/zotero_translators/Legifrance.js +641 -0
  1164. scitex/scholar/.legacy/metadata/urls/zotero_translators/Legislative Insight.js +406 -0
  1165. scitex/scholar/.legacy/metadata/urls/zotero_translators/Lexis+.js +264 -0
  1166. scitex/scholar/.legacy/metadata/urls/zotero_translators/LexisNexis.js +505 -0
  1167. scitex/scholar/.legacy/metadata/urls/zotero_translators/Libraries Tasmania.js +778 -0
  1168. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Aleph).js +385 -0
  1169. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Amicus).js +254 -0
  1170. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Aquabrowser).js +253 -0
  1171. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (BiblioCommons).js +249 -0
  1172. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Blacklight).js +341 -0
  1173. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Capita Prism).js +162 -0
  1174. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (DRA).js +203 -0
  1175. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Dynix).js +315 -0
  1176. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Encore).js +211 -0
  1177. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (InnoPAC).js +305 -0
  1178. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Koha).js +225 -0
  1179. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Mango).js +285 -0
  1180. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (OPALS).js +200 -0
  1181. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (PICA).js +2120 -0
  1182. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (PICA2).js +331 -0
  1183. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Pika).js +488 -0
  1184. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Polaris).js +183 -0
  1185. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Quolto).js +320 -0
  1186. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (RERO ILS).js +754 -0
  1187. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SIRSI eLibrary).js +407 -0
  1188. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SIRSI).js +452 -0
  1189. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SLIMS).js +146 -0
  1190. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TIND ILS).js +773 -0
  1191. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TLCYouSeeMore).js +132 -0
  1192. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TinREAD).js +277 -0
  1193. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (VTLS).js +125 -0
  1194. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Visual Library 2021).js +765 -0
  1195. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Voyager 7).js +199 -0
  1196. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Voyager).js +212 -0
  1197. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Genesis.js +337 -0
  1198. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Hub Discover.js +359 -0
  1199. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library of Congress Digital Collections.js +869 -0
  1200. scitex/scholar/.legacy/metadata/urls/zotero_translators/Library of Congress ISBN.js +86 -0
  1201. scitex/scholar/.legacy/metadata/urls/zotero_translators/LingBuzz.js +359 -0
  1202. scitex/scholar/.legacy/metadata/urls/zotero_translators/Lippincott Williams and Wilkins.js +341 -0
  1203. scitex/scholar/.legacy/metadata/urls/zotero_translators/Literary Hub.js +950 -0
  1204. scitex/scholar/.legacy/metadata/urls/zotero_translators/Litres.js +236 -0
  1205. scitex/scholar/.legacy/metadata/urls/zotero_translators/LiveJournal.js +219 -0
  1206. scitex/scholar/.legacy/metadata/urls/zotero_translators/London Review of Books.js +291 -0
  1207. scitex/scholar/.legacy/metadata/urls/zotero_translators/LookUs.js +260 -0
  1208. scitex/scholar/.legacy/metadata/urls/zotero_translators/Lulu.js +264 -0
  1209. scitex/scholar/.legacy/metadata/urls/zotero_translators/MAB2.js +373 -0
  1210. scitex/scholar/.legacy/metadata/urls/zotero_translators/MARC.js +1080 -0
  1211. scitex/scholar/.legacy/metadata/urls/zotero_translators/MARCXML.js +489 -0
  1212. scitex/scholar/.legacy/metadata/urls/zotero_translators/MCV.js +258 -0
  1213. scitex/scholar/.legacy/metadata/urls/zotero_translators/MDPI Journals.js +356 -0
  1214. scitex/scholar/.legacy/metadata/urls/zotero_translators/MEDLINEnbib.js +1561 -0
  1215. scitex/scholar/.legacy/metadata/urls/zotero_translators/METS.js +384 -0
  1216. scitex/scholar/.legacy/metadata/urls/zotero_translators/MIDAS Journals.js +343 -0
  1217. scitex/scholar/.legacy/metadata/urls/zotero_translators/MIT Press Books.js +637 -0
  1218. scitex/scholar/.legacy/metadata/urls/zotero_translators/MODS.js +2545 -0
  1219. scitex/scholar/.legacy/metadata/urls/zotero_translators/MPG PuRe.js +541 -0
  1220. scitex/scholar/.legacy/metadata/urls/zotero_translators/Mailman.js +136 -0
  1221. scitex/scholar/.legacy/metadata/urls/zotero_translators/Mainichi Daily News.js +189 -0
  1222. scitex/scholar/.legacy/metadata/urls/zotero_translators/Mastodon.js +198 -0
  1223. scitex/scholar/.legacy/metadata/urls/zotero_translators/Matbugat.ru.js +110 -0
  1224. scitex/scholar/.legacy/metadata/urls/zotero_translators/Max Planck Institute for the History of Science Virtual Laboratory Library.js +136 -0
  1225. scitex/scholar/.legacy/metadata/urls/zotero_translators/Medium.js +208 -0
  1226. scitex/scholar/.legacy/metadata/urls/zotero_translators/MetaLib.js +126 -0
  1227. scitex/scholar/.legacy/metadata/urls/zotero_translators/Microbiology Society Journals.js +343 -0
  1228. scitex/scholar/.legacy/metadata/urls/zotero_translators/Microsoft Academic.js +424 -0
  1229. scitex/scholar/.legacy/metadata/urls/zotero_translators/Mikromarc.js +207 -0
  1230. scitex/scholar/.legacy/metadata/urls/zotero_translators/Milli Kutuphane.js +244 -0
  1231. scitex/scholar/.legacy/metadata/urls/zotero_translators/Musee du Louvre.js +265 -0
  1232. scitex/scholar/.legacy/metadata/urls/zotero_translators/NASA ADS.js +889 -0
  1233. scitex/scholar/.legacy/metadata/urls/zotero_translators/NASA NTRS.js +610 -0
  1234. scitex/scholar/.legacy/metadata/urls/zotero_translators/NCBI Nucleotide.js +227 -0
  1235. scitex/scholar/.legacy/metadata/urls/zotero_translators/NPR.js +341 -0
  1236. scitex/scholar/.legacy/metadata/urls/zotero_translators/NRC Research Press.js +181 -0
  1237. scitex/scholar/.legacy/metadata/urls/zotero_translators/NRC.nl.js +226 -0
  1238. scitex/scholar/.legacy/metadata/urls/zotero_translators/NTSB Accident Reports.js +226 -0
  1239. scitex/scholar/.legacy/metadata/urls/zotero_translators/NYPL Menus.js +275 -0
  1240. scitex/scholar/.legacy/metadata/urls/zotero_translators/NYPL Research Catalog.js +458 -0
  1241. scitex/scholar/.legacy/metadata/urls/zotero_translators/NYTimes.com.js +858 -0
  1242. scitex/scholar/.legacy/metadata/urls/zotero_translators/NZZ.ch.js +272 -0
  1243. scitex/scholar/.legacy/metadata/urls/zotero_translators/Nagoya University OPAC.js +336 -0
  1244. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Academies Press.js +243 -0
  1245. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Agriculture Library.js +524 -0
  1246. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Archives of Australia.js +522 -0
  1247. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Archives of South Africa.js +122 -0
  1248. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Bureau of Economic Research.js +363 -0
  1249. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Diet Library Catalogue.js +333 -0
  1250. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Gallery of Art - USA.js +149 -0
  1251. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Gallery of Australia.js +252 -0
  1252. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Australia (new catalog).js +223 -0
  1253. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Belarus.js +171 -0
  1254. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Norway.js +310 -0
  1255. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Poland ISBN.js +140 -0
  1256. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Post.js +186 -0
  1257. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Technical Reports Library.js +276 -0
  1258. scitex/scholar/.legacy/metadata/urls/zotero_translators/National Transportation Library ROSA P.js +562 -0
  1259. scitex/scholar/.legacy/metadata/urls/zotero_translators/Nature Publishing Group.js +3394 -0
  1260. scitex/scholar/.legacy/metadata/urls/zotero_translators/Neural Information Processing Systems.js +385 -0
  1261. scitex/scholar/.legacy/metadata/urls/zotero_translators/New Left Review.js +245 -0
  1262. scitex/scholar/.legacy/metadata/urls/zotero_translators/New Zealand Herald.js +282 -0
  1263. scitex/scholar/.legacy/metadata/urls/zotero_translators/Newlines Magazine.js +190 -0
  1264. scitex/scholar/.legacy/metadata/urls/zotero_translators/News Corp Australia.js +251 -0
  1265. scitex/scholar/.legacy/metadata/urls/zotero_translators/NewsBank.js +202 -0
  1266. scitex/scholar/.legacy/metadata/urls/zotero_translators/NewsnetTamedia.js +509 -0
  1267. scitex/scholar/.legacy/metadata/urls/zotero_translators/Noor Digital Library.js +267 -0
  1268. scitex/scholar/.legacy/metadata/urls/zotero_translators/Note HTML.js +206 -0
  1269. scitex/scholar/.legacy/metadata/urls/zotero_translators/Note Markdown.js +1638 -0
  1270. scitex/scholar/.legacy/metadata/urls/zotero_translators/Notre Dame Philosophical Reviews.js +201 -0
  1271. scitex/scholar/.legacy/metadata/urls/zotero_translators/OAPEN.js +331 -0
  1272. scitex/scholar/.legacy/metadata/urls/zotero_translators/OCLC WorldCat FirstSearch.js +213 -0
  1273. scitex/scholar/.legacy/metadata/urls/zotero_translators/OECD.js +216 -0
  1274. scitex/scholar/.legacy/metadata/urls/zotero_translators/ORCID.js +104 -0
  1275. scitex/scholar/.legacy/metadata/urls/zotero_translators/OSF Preprints.js +417 -0
  1276. scitex/scholar/.legacy/metadata/urls/zotero_translators/OSTI Energy Citations.js +202 -0
  1277. scitex/scholar/.legacy/metadata/urls/zotero_translators/OVID Tagged.js +1226 -0
  1278. scitex/scholar/.legacy/metadata/urls/zotero_translators/OZON.ru.js +465 -0
  1279. scitex/scholar/.legacy/metadata/urls/zotero_translators/OhioLINK.js +43 -0
  1280. scitex/scholar/.legacy/metadata/urls/zotero_translators/Old Bailey Online.js +315 -0
  1281. scitex/scholar/.legacy/metadata/urls/zotero_translators/Open Conf.js +172 -0
  1282. scitex/scholar/.legacy/metadata/urls/zotero_translators/Open Knowledge Repository.js +811 -0
  1283. scitex/scholar/.legacy/metadata/urls/zotero_translators/Open WorldCat.js +1401 -0
  1284. scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenAlex JSON.js +740 -0
  1285. scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenAlex.js +444 -0
  1286. scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenEdition Books.js +155 -0
  1287. scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenEdition Journals.js +432 -0
  1288. scitex/scholar/.legacy/metadata/urls/zotero_translators/Optical Society of America.js +562 -0
  1289. scitex/scholar/.legacy/metadata/urls/zotero_translators/Optimization Online.js +418 -0
  1290. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ovid.js +302 -0
  1291. scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Dictionaries Premium.js +194 -0
  1292. scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford English Dictionary.js +122 -0
  1293. scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Music and Art Online.js +120 -0
  1294. scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Reference.js +202 -0
  1295. scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford University Press.js +277 -0
  1296. scitex/scholar/.legacy/metadata/urls/zotero_translators/PC Gamer.js +302 -0
  1297. scitex/scholar/.legacy/metadata/urls/zotero_translators/PC Games.js +128 -0
  1298. scitex/scholar/.legacy/metadata/urls/zotero_translators/PEI Archival Information Network.js +242 -0
  1299. scitex/scholar/.legacy/metadata/urls/zotero_translators/PEP Web.js +165 -0
  1300. scitex/scholar/.legacy/metadata/urls/zotero_translators/PKP Catalog Systems.js +1455 -0
  1301. scitex/scholar/.legacy/metadata/urls/zotero_translators/PLoS Journals.js +284 -0
  1302. scitex/scholar/.legacy/metadata/urls/zotero_translators/PRC History Review.js +298 -0
  1303. scitex/scholar/.legacy/metadata/urls/zotero_translators/Pajhwok Afghan News.js +198 -0
  1304. scitex/scholar/.legacy/metadata/urls/zotero_translators/Papers Past.js +297 -0
  1305. scitex/scholar/.legacy/metadata/urls/zotero_translators/Paris Review.js +227 -0
  1306. scitex/scholar/.legacy/metadata/urls/zotero_translators/Pastebin.js +199 -0
  1307. scitex/scholar/.legacy/metadata/urls/zotero_translators/Patents - USPTO.js +210 -0
  1308. scitex/scholar/.legacy/metadata/urls/zotero_translators/Peeters.js +587 -0
  1309. scitex/scholar/.legacy/metadata/urls/zotero_translators/Perceiving Systems.js +350 -0
  1310. scitex/scholar/.legacy/metadata/urls/zotero_translators/Perlego.js +416 -0
  1311. scitex/scholar/.legacy/metadata/urls/zotero_translators/PhilPapers.js +249 -0
  1312. scitex/scholar/.legacy/metadata/urls/zotero_translators/Philosopher's Imprint.js +169 -0
  1313. scitex/scholar/.legacy/metadata/urls/zotero_translators/Pleade.js +329 -0
  1314. scitex/scholar/.legacy/metadata/urls/zotero_translators/Polygon.js +270 -0
  1315. scitex/scholar/.legacy/metadata/urls/zotero_translators/Potsdamer Neueste Nachrichten.js +188 -0
  1316. scitex/scholar/.legacy/metadata/urls/zotero_translators/Preprints.org.js +305 -0
  1317. scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo 2018.js +126 -0
  1318. scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo Normalized XML.js +987 -0
  1319. scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo.js +322 -0
  1320. scitex/scholar/.legacy/metadata/urls/zotero_translators/ProMED.js +66 -0
  1321. scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest Ebook Central.js +226 -0
  1322. scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest PolicyFile.js +115 -0
  1323. scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest.js +2210 -0
  1324. scitex/scholar/.legacy/metadata/urls/zotero_translators/Probing the Past.js +151 -0
  1325. scitex/scholar/.legacy/metadata/urls/zotero_translators/Project Gutenberg.js +191 -0
  1326. scitex/scholar/.legacy/metadata/urls/zotero_translators/Project MUSE.js +451 -0
  1327. scitex/scholar/.legacy/metadata/urls/zotero_translators/Protein Data Bank.js +445 -0
  1328. scitex/scholar/.legacy/metadata/urls/zotero_translators/PubFactory Journals.js +712 -0
  1329. scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed Central.js +577 -0
  1330. scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed XML.js +1139 -0
  1331. scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed.js +1317 -0
  1332. scitex/scholar/.legacy/metadata/urls/zotero_translators/PubPub.js +530 -0
  1333. scitex/scholar/.legacy/metadata/urls/zotero_translators/Public Record Office Victoria.js +252 -0
  1334. scitex/scholar/.legacy/metadata/urls/zotero_translators/Publications Office of the European Union.js +540 -0
  1335. scitex/scholar/.legacy/metadata/urls/zotero_translators/Publications du Quebec.js +225 -0
  1336. scitex/scholar/.legacy/metadata/urls/zotero_translators/PyPI.js +288 -0
  1337. scitex/scholar/.legacy/metadata/urls/zotero_translators/Qatar Digital Library.js +802 -0
  1338. scitex/scholar/.legacy/metadata/urls/zotero_translators/Queensland State Archives.js +303 -0
  1339. scitex/scholar/.legacy/metadata/urls/zotero_translators/R-Packages.js +410 -0
  1340. scitex/scholar/.legacy/metadata/urls/zotero_translators/RAND.js +283 -0
  1341. scitex/scholar/.legacy/metadata/urls/zotero_translators/RDF.js +1777 -0
  1342. scitex/scholar/.legacy/metadata/urls/zotero_translators/REDALYC.js +196 -0
  1343. scitex/scholar/.legacy/metadata/urls/zotero_translators/RIS.js +7265 -0
  1344. scitex/scholar/.legacy/metadata/urls/zotero_translators/RSC Publishing.js +250 -0
  1345. scitex/scholar/.legacy/metadata/urls/zotero_translators/Radio Free Europe Radio Liberty.js +706 -0
  1346. scitex/scholar/.legacy/metadata/urls/zotero_translators/RePEc - Econpapers.js +725 -0
  1347. scitex/scholar/.legacy/metadata/urls/zotero_translators/RePEc - IDEAS.js +337 -0
  1348. scitex/scholar/.legacy/metadata/urls/zotero_translators/Rechtspraak.nl.js +295 -0
  1349. scitex/scholar/.legacy/metadata/urls/zotero_translators/RefWorks Tagged.js +1185 -0
  1350. scitex/scholar/.legacy/metadata/urls/zotero_translators/ReferBibIX.js +463 -0
  1351. scitex/scholar/.legacy/metadata/urls/zotero_translators/Regeringskansliet.js +89 -0
  1352. scitex/scholar/.legacy/metadata/urls/zotero_translators/Research Square.js +335 -0
  1353. scitex/scholar/.legacy/metadata/urls/zotero_translators/ResearchGate.js +394 -0
  1354. scitex/scholar/.legacy/metadata/urls/zotero_translators/Retsinformation.js +348 -0
  1355. scitex/scholar/.legacy/metadata/urls/zotero_translators/Reuters.js +255 -0
  1356. scitex/scholar/.legacy/metadata/urls/zotero_translators/Rock, Paper, Shotgun.js +304 -0
  1357. scitex/scholar/.legacy/metadata/urls/zotero_translators/Roll Call.js +173 -0
  1358. scitex/scholar/.legacy/metadata/urls/zotero_translators/Russian State Library.js +1517 -0
  1359. scitex/scholar/.legacy/metadata/urls/zotero_translators/SAE Papers.js +241 -0
  1360. scitex/scholar/.legacy/metadata/urls/zotero_translators/SAGE Journals.js +427 -0
  1361. scitex/scholar/.legacy/metadata/urls/zotero_translators/SAGE Knowledge.js +505 -0
  1362. scitex/scholar/.legacy/metadata/urls/zotero_translators/SAILDART.js +364 -0
  1363. scitex/scholar/.legacy/metadata/urls/zotero_translators/SALT Research Archives.js +196 -0
  1364. scitex/scholar/.legacy/metadata/urls/zotero_translators/SFU IPinCH.js +946 -0
  1365. scitex/scholar/.legacy/metadata/urls/zotero_translators/SIPRI.js +256 -0
  1366. scitex/scholar/.legacy/metadata/urls/zotero_translators/SIRS Knowledge Source.js +546 -0
  1367. scitex/scholar/.legacy/metadata/urls/zotero_translators/SLUB Dresden.js +300 -0
  1368. scitex/scholar/.legacy/metadata/urls/zotero_translators/SORA.js +340 -0
  1369. scitex/scholar/.legacy/metadata/urls/zotero_translators/SSOAR.js +399 -0
  1370. scitex/scholar/.legacy/metadata/urls/zotero_translators/SSRN.js +235 -0
  1371. scitex/scholar/.legacy/metadata/urls/zotero_translators/SVT Nyheter.js +381 -0
  1372. scitex/scholar/.legacy/metadata/urls/zotero_translators/Sacramento Bee.js +274 -0
  1373. scitex/scholar/.legacy/metadata/urls/zotero_translators/Safari Books Online.js +391 -0
  1374. scitex/scholar/.legacy/metadata/urls/zotero_translators/Scholars Portal Journals.js +220 -0
  1375. scitex/scholar/.legacy/metadata/urls/zotero_translators/Scholia.js +189 -0
  1376. scitex/scholar/.legacy/metadata/urls/zotero_translators/Schweizer Radio und Fernsehen SRF.js +152 -0
  1377. scitex/scholar/.legacy/metadata/urls/zotero_translators/SciELO.js +440 -0
  1378. scitex/scholar/.legacy/metadata/urls/zotero_translators/ScienceDirect.js +1304 -0
  1379. scitex/scholar/.legacy/metadata/urls/zotero_translators/Scopus.js +418 -0
  1380. scitex/scholar/.legacy/metadata/urls/zotero_translators/Semantic Scholar.js +513 -0
  1381. scitex/scholar/.legacy/metadata/urls/zotero_translators/Silverchair.js +886 -0
  1382. scitex/scholar/.legacy/metadata/urls/zotero_translators/Slate.js +228 -0
  1383. scitex/scholar/.legacy/metadata/urls/zotero_translators/SlideShare.js +112 -0
  1384. scitex/scholar/.legacy/metadata/urls/zotero_translators/Springer Link.js +696 -0
  1385. scitex/scholar/.legacy/metadata/urls/zotero_translators/Stack Exchange.js +134 -0
  1386. scitex/scholar/.legacy/metadata/urls/zotero_translators/Standard Ebooks.js +198 -0
  1387. scitex/scholar/.legacy/metadata/urls/zotero_translators/Stanford Encyclopedia of Philosophy.js +285 -0
  1388. scitex/scholar/.legacy/metadata/urls/zotero_translators/Stanford University Press.js +343 -0
  1389. scitex/scholar/.legacy/metadata/urls/zotero_translators/State Records Office of Western Australia.js +439 -0
  1390. scitex/scholar/.legacy/metadata/urls/zotero_translators/Stitcher.js +141 -0
  1391. scitex/scholar/.legacy/metadata/urls/zotero_translators/Store norske leksikon.js +291 -0
  1392. scitex/scholar/.legacy/metadata/urls/zotero_translators/Stuff.co.nz.js +446 -0
  1393. scitex/scholar/.legacy/metadata/urls/zotero_translators/Substack.js +237 -0
  1394. scitex/scholar/.legacy/metadata/urls/zotero_translators/Sud Ouest.js +181 -0
  1395. scitex/scholar/.legacy/metadata/urls/zotero_translators/Sueddeutsche.de.js +205 -0
  1396. scitex/scholar/.legacy/metadata/urls/zotero_translators/Summon 2.js +117 -0
  1397. scitex/scholar/.legacy/metadata/urls/zotero_translators/Superlib.js +647 -0
  1398. scitex/scholar/.legacy/metadata/urls/zotero_translators/Svenska Dagbladet.js +274 -0
  1399. scitex/scholar/.legacy/metadata/urls/zotero_translators/Sveriges radio.js +416 -0
  1400. scitex/scholar/.legacy/metadata/urls/zotero_translators/TEI.js +648 -0
  1401. scitex/scholar/.legacy/metadata/urls/zotero_translators/TV by the Numbers.js +194 -0
  1402. scitex/scholar/.legacy/metadata/urls/zotero_translators/TVNZ.js +165 -0
  1403. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tagesspiegel.js +249 -0
  1404. scitex/scholar/.legacy/metadata/urls/zotero_translators/Talis Aspire.js +316 -0
  1405. scitex/scholar/.legacy/metadata/urls/zotero_translators/TalisPrism.js +445 -0
  1406. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tatknigafund.js +174 -0
  1407. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tatpressa.ru.js +121 -0
  1408. scitex/scholar/.legacy/metadata/urls/zotero_translators/Taylor & Francis eBooks.js +334 -0
  1409. scitex/scholar/.legacy/metadata/urls/zotero_translators/Taylor and Francis+NEJM.js +813 -0
  1410. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tesis Doctorals en Xarxa.js +233 -0
  1411. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Art Newspaper.js +268 -0
  1412. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Atlantic.js +535 -0
  1413. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Boston Globe.js +285 -0
  1414. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Chronicle of Higher Education.js +308 -0
  1415. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Daily Beast.js +183 -0
  1416. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Economic Times - The Times of India.js +305 -0
  1417. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Economist.js +207 -0
  1418. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Free Dictionary.js +58 -0
  1419. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Globe and Mail.js +241 -0
  1420. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Guardian.js +717 -0
  1421. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Hamilton Spectator.js +129 -0
  1422. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Hindu.js +318 -0
  1423. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Independent.js +184 -0
  1424. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Intercept.js +258 -0
  1425. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Met.js +300 -0
  1426. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Microfinance Gateway.js +174 -0
  1427. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Nation.js +188 -0
  1428. scitex/scholar/.legacy/metadata/urls/zotero_translators/The National Archives (UK).js +242 -0
  1429. scitex/scholar/.legacy/metadata/urls/zotero_translators/The New Republic.js +160 -0
  1430. scitex/scholar/.legacy/metadata/urls/zotero_translators/The New York Review of Books.js +467 -0
  1431. scitex/scholar/.legacy/metadata/urls/zotero_translators/The New Yorker.js +360 -0
  1432. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Open Library.js +220 -0
  1433. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Straits Times.js +528 -0
  1434. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Telegraph.js +337 -0
  1435. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Times and Sunday Times.js +180 -0
  1436. scitex/scholar/.legacy/metadata/urls/zotero_translators/The Times of Israel.js +151 -0
  1437. scitex/scholar/.legacy/metadata/urls/zotero_translators/TheMarker.js +108 -0
  1438. scitex/scholar/.legacy/metadata/urls/zotero_translators/Theory of Computing.js +488 -0
  1439. scitex/scholar/.legacy/metadata/urls/zotero_translators/ThesesFR.js +298 -0
  1440. scitex/scholar/.legacy/metadata/urls/zotero_translators/Thieme.js +326 -0
  1441. scitex/scholar/.legacy/metadata/urls/zotero_translators/Time.com.js +557 -0
  1442. scitex/scholar/.legacy/metadata/urls/zotero_translators/TimesMachine.js +222 -0
  1443. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tony Blair Institute for Global Change.js +195 -0
  1444. scitex/scholar/.legacy/metadata/urls/zotero_translators/Toronto Star.js +331 -0
  1445. scitex/scholar/.legacy/metadata/urls/zotero_translators/Transportation Research Board.js +253 -0
  1446. scitex/scholar/.legacy/metadata/urls/zotero_translators/Treesearch.js +535 -0
  1447. scitex/scholar/.legacy/metadata/urls/zotero_translators/Trove.js +616 -0
  1448. scitex/scholar/.legacy/metadata/urls/zotero_translators/Tumblr.js +179 -0
  1449. scitex/scholar/.legacy/metadata/urls/zotero_translators/Twitter.js +413 -0
  1450. scitex/scholar/.legacy/metadata/urls/zotero_translators/UChicago VuFind.js +907 -0
  1451. scitex/scholar/.legacy/metadata/urls/zotero_translators/UNZ Print Archive.js +276 -0
  1452. scitex/scholar/.legacy/metadata/urls/zotero_translators/UPCommons.js +227 -0
  1453. scitex/scholar/.legacy/metadata/urls/zotero_translators/US National Archives Research Catalog.js +275 -0
  1454. scitex/scholar/.legacy/metadata/urls/zotero_translators/USENIX.js +151 -0
  1455. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ubiquity Journals.js +228 -0
  1456. scitex/scholar/.legacy/metadata/urls/zotero_translators/University Press Scholarship.js +301 -0
  1457. scitex/scholar/.legacy/metadata/urls/zotero_translators/University of California Press Books.js +403 -0
  1458. scitex/scholar/.legacy/metadata/urls/zotero_translators/University of Chicago Press Books.js +378 -0
  1459. scitex/scholar/.legacy/metadata/urls/zotero_translators/University of Wisconsin-Madison Libraries Catalog.js +298 -0
  1460. scitex/scholar/.legacy/metadata/urls/zotero_translators/Unqualified Dublin Core RDF.js +153 -0
  1461. scitex/scholar/.legacy/metadata/urls/zotero_translators/UpToDate References.js +203 -0
  1462. scitex/scholar/.legacy/metadata/urls/zotero_translators/Vanity Fair.js +242 -0
  1463. scitex/scholar/.legacy/metadata/urls/zotero_translators/Verniana-Jules Verne Studies.js +190 -0
  1464. scitex/scholar/.legacy/metadata/urls/zotero_translators/Verso Books.js +311 -0
  1465. scitex/scholar/.legacy/metadata/urls/zotero_translators/Vice.js +445 -0
  1466. scitex/scholar/.legacy/metadata/urls/zotero_translators/Victoria & Albert Museum.js +277 -0
  1467. scitex/scholar/.legacy/metadata/urls/zotero_translators/Vimeo.js +188 -0
  1468. scitex/scholar/.legacy/metadata/urls/zotero_translators/VoxEU.js +151 -0
  1469. scitex/scholar/.legacy/metadata/urls/zotero_translators/WHO.js +458 -0
  1470. scitex/scholar/.legacy/metadata/urls/zotero_translators/WIPO.js +189 -0
  1471. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wall Street Journal.js +525 -0
  1472. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wanfang Data.js +310 -0
  1473. scitex/scholar/.legacy/metadata/urls/zotero_translators/Washington Monthly.js +195 -0
  1474. scitex/scholar/.legacy/metadata/urls/zotero_translators/Washington Post.js +447 -0
  1475. scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science Nextgen.js +715 -0
  1476. scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science Tagged.js +1242 -0
  1477. scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science.js +228 -0
  1478. scitex/scholar/.legacy/metadata/urls/zotero_translators/Welt Online.js +161 -0
  1479. scitex/scholar/.legacy/metadata/urls/zotero_translators/WestLaw UK.js +190 -0
  1480. scitex/scholar/.legacy/metadata/urls/zotero_translators/WikiLeaks PlusD.js +182 -0
  1481. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikidata QuickStatements.js +306 -0
  1482. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikidata.js +911 -0
  1483. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikimedia Commons.js +285 -0
  1484. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikipedia Citation Templates.js +432 -0
  1485. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikipedia.js +385 -0
  1486. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikisource.js +399 -0
  1487. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikiwand.js +122 -0
  1488. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wiktionary.js +141 -0
  1489. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wildlife Biology in Practice.js +172 -0
  1490. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wiley Online Library.js +1412 -0
  1491. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wilson Center Digital Archive.js +321 -0
  1492. scitex/scholar/.legacy/metadata/urls/zotero_translators/Winnipeg Free Press.js +204 -0
  1493. scitex/scholar/.legacy/metadata/urls/zotero_translators/Wired.js +249 -0
  1494. scitex/scholar/.legacy/metadata/urls/zotero_translators/Womennews.js +230 -0
  1495. scitex/scholar/.legacy/metadata/urls/zotero_translators/World Digital Library.js +403 -0
  1496. scitex/scholar/.legacy/metadata/urls/zotero_translators/World History Connected.js +185 -0
  1497. scitex/scholar/.legacy/metadata/urls/zotero_translators/World Shakespeare Bibliography Online.js +595 -0
  1498. scitex/scholar/.legacy/metadata/urls/zotero_translators/WorldCat Discovery Service.js +630 -0
  1499. scitex/scholar/.legacy/metadata/urls/zotero_translators/XML ContextObject.js +274 -0
  1500. scitex/scholar/.legacy/metadata/urls/zotero_translators/YPSF.js +224 -0
  1501. scitex/scholar/.legacy/metadata/urls/zotero_translators/Yandex Books.js +265 -0
  1502. scitex/scholar/.legacy/metadata/urls/zotero_translators/Ynet.js +171 -0
  1503. scitex/scholar/.legacy/metadata/urls/zotero_translators/YouTube.js +209 -0
  1504. scitex/scholar/.legacy/metadata/urls/zotero_translators/ZIPonline.js +267 -0
  1505. scitex/scholar/.legacy/metadata/urls/zotero_translators/ZOBODAT.js +341 -0
  1506. scitex/scholar/.legacy/metadata/urls/zotero_translators/Zotero RDF.js +583 -0
  1507. scitex/scholar/.legacy/metadata/urls/zotero_translators/ZoteroBib.js +94 -0
  1508. scitex/scholar/.legacy/metadata/urls/zotero_translators/arXiv.org.js +1099 -0
  1509. scitex/scholar/.legacy/metadata/urls/zotero_translators/artnet.js +207 -0
  1510. scitex/scholar/.legacy/metadata/urls/zotero_translators/beck-online.js +1339 -0
  1511. scitex/scholar/.legacy/metadata/urls/zotero_translators/clinicaltrials.gov.js +331 -0
  1512. scitex/scholar/.legacy/metadata/urls/zotero_translators/dLibra.js +367 -0
  1513. scitex/scholar/.legacy/metadata/urls/zotero_translators/dejure.org.js +242 -0
  1514. scitex/scholar/.legacy/metadata/urls/zotero_translators/deleted.txt +132 -0
  1515. scitex/scholar/.legacy/metadata/urls/zotero_translators/dhistory.js +103 -0
  1516. scitex/scholar/.legacy/metadata/urls/zotero_translators/digibib.net.js +245 -0
  1517. scitex/scholar/.legacy/metadata/urls/zotero_translators/eLibrary.ru.js +867 -0
  1518. scitex/scholar/.legacy/metadata/urls/zotero_translators/eLife.js +462 -0
  1519. scitex/scholar/.legacy/metadata/urls/zotero_translators/eMJA.js +246 -0
  1520. scitex/scholar/.legacy/metadata/urls/zotero_translators/eMedicine.js +123 -0
  1521. scitex/scholar/.legacy/metadata/urls/zotero_translators/ePrint IACR.js +608 -0
  1522. scitex/scholar/.legacy/metadata/urls/zotero_translators/ebrary.js +140 -0
  1523. scitex/scholar/.legacy/metadata/urls/zotero_translators/etatar.ru.js +104 -0
  1524. scitex/scholar/.legacy/metadata/urls/zotero_translators/feb-web.ru.js +167 -0
  1525. scitex/scholar/.legacy/metadata/urls/zotero_translators/fishpond.co.nz.js +224 -0
  1526. scitex/scholar/.legacy/metadata/urls/zotero_translators/fr-online.de.js +209 -0
  1527. scitex/scholar/.legacy/metadata/urls/zotero_translators/govinfo.js +189 -0
  1528. scitex/scholar/.legacy/metadata/urls/zotero_translators/index.d.ts +1646 -0
  1529. scitex/scholar/.legacy/metadata/urls/zotero_translators/informIT database.js +248 -0
  1530. scitex/scholar/.legacy/metadata/urls/zotero_translators/io-port.js +68 -0
  1531. scitex/scholar/.legacy/metadata/urls/zotero_translators/jsconfig.json +10 -0
  1532. scitex/scholar/.legacy/metadata/urls/zotero_translators/jurion.js +377 -0
  1533. scitex/scholar/.legacy/metadata/urls/zotero_translators/mEDRA.js +597 -0
  1534. scitex/scholar/.legacy/metadata/urls/zotero_translators/magazines.russ.ru.js +120 -0
  1535. scitex/scholar/.legacy/metadata/urls/zotero_translators/medes.js +284 -0
  1536. scitex/scholar/.legacy/metadata/urls/zotero_translators/newshub.co.nz.js +206 -0
  1537. scitex/scholar/.legacy/metadata/urls/zotero_translators/newspapers.com.js +335 -0
  1538. scitex/scholar/.legacy/metadata/urls/zotero_translators/openJur.js +161 -0
  1539. scitex/scholar/.legacy/metadata/urls/zotero_translators/package-lock.json +2345 -0
  1540. scitex/scholar/.legacy/metadata/urls/zotero_translators/package.json +24 -0
  1541. scitex/scholar/.legacy/metadata/urls/zotero_translators/reddit.js +275 -0
  1542. scitex/scholar/.legacy/metadata/urls/zotero_translators/sbn.it.js +186 -0
  1543. scitex/scholar/.legacy/metadata/urls/zotero_translators/scinapse.js +273 -0
  1544. scitex/scholar/.legacy/metadata/urls/zotero_translators/semantics Visual Library.js +643 -0
  1545. scitex/scholar/.legacy/metadata/urls/zotero_translators/taz.de.js +200 -0
  1546. scitex/scholar/.legacy/metadata/urls/zotero_translators/unAPI.js +481 -0
  1547. scitex/scholar/.legacy/metadata/urls/zotero_translators/wiso.js +314 -0
  1548. scitex/scholar/.legacy/metadata/urls/zotero_translators/zbMATH.js +278 -0
  1549. scitex/scholar/.legacy/metadata/urls/zotero_translators/zotero.org.js +311 -0
  1550. scitex/scholar/.legacy/search/README.md +205 -0
  1551. scitex/scholar/.legacy/search/_Embedder.py +324 -0
  1552. scitex/scholar/.legacy/search/_SemanticSearch.py +277 -0
  1553. scitex/scholar/.legacy/search/_SemanticSearchEngine.py +457 -0
  1554. scitex/scholar/.legacy/search/_UnifiedSearcher.py +1294 -0
  1555. scitex/scholar/.legacy/search/_VectorDatabase.py +424 -0
  1556. scitex/scholar/.legacy/search/__init__.py +24 -0
  1557. scitex/scholar/.legacy/storage/_EnhancedStorageManager.py +589 -0
  1558. scitex/scholar/.legacy/storage/__init__.py +18 -0
  1559. scitex/scholar/CLAUDE.md +257 -0
  1560. scitex/scholar/README.md +122 -0
  1561. scitex/scholar/TODO.md +174 -0
  1562. scitex/scholar/__init__.py +314 -0
  1563. scitex/scholar/__main__.py +319 -0
  1564. scitex/scholar/auth/README.md +83 -0
  1565. scitex/scholar/auth/ScholarAuthManager.py +308 -0
  1566. scitex/scholar/auth/__init__.py +12 -0
  1567. scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
  1568. scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
  1569. scitex/scholar/auth/core/StrategyResolver.py +309 -0
  1570. scitex/scholar/auth/core/__init__.py +16 -0
  1571. scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
  1572. scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
  1573. scitex/scholar/auth/gateway/__init__.py +38 -0
  1574. scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
  1575. scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
  1576. scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
  1577. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
  1578. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
  1579. scitex/scholar/auth/providers/__init__.py +18 -0
  1580. scitex/scholar/auth/session/AuthCacheManager.py +196 -0
  1581. scitex/scholar/auth/session/SessionManager.py +159 -0
  1582. scitex/scholar/auth/session/__init__.py +11 -0
  1583. scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
  1584. scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
  1585. scitex/scholar/auth/sso/README.md +204 -0
  1586. scitex/scholar/auth/sso/SSOAutomator.py +180 -0
  1587. scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
  1588. scitex/scholar/auth/sso/__init__.py +15 -0
  1589. scitex/scholar/browser/README.md +60 -0
  1590. scitex/scholar/browser/ScholarBrowserManager.py +705 -0
  1591. scitex/scholar/browser/__init__.py +38 -0
  1592. scitex/scholar/browser/utils/README.md +96 -0
  1593. scitex/scholar/browser/utils/__init__.py +13 -0
  1594. scitex/scholar/browser/utils/click_and_wait.py +205 -0
  1595. scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
  1596. scitex/scholar/browser/utils/wait_redirects.py +732 -0
  1597. scitex/scholar/cli/README.md +368 -0
  1598. scitex/scholar/cli/_CentralArgumentParser.py +137 -0
  1599. scitex/scholar/cli/_argument_groups.py +222 -0
  1600. scitex/scholar/cli/_doi_operations.py +56 -0
  1601. scitex/scholar/cli/_url_utils.py +219 -0
  1602. scitex/scholar/cli/chrome.py +99 -0
  1603. scitex/scholar/cli/download_pdf.py +237 -0
  1604. scitex/scholar/cli/handlers/__init__.py +23 -0
  1605. scitex/scholar/cli/handlers/bibtex_handler.py +173 -0
  1606. scitex/scholar/cli/handlers/doi_handler.py +65 -0
  1607. scitex/scholar/cli/handlers/project_handler.py +275 -0
  1608. scitex/scholar/cli/open_browser.py +295 -0
  1609. scitex/scholar/cli/open_browser_auto.py +376 -0
  1610. scitex/scholar/cli/open_browser_monitored.py +404 -0
  1611. scitex/scholar/config/PublisherRules.py +132 -0
  1612. scitex/scholar/config/README.md +31 -0
  1613. scitex/scholar/config/ScholarConfig.py +126 -0
  1614. scitex/scholar/config/__init__.py +17 -0
  1615. scitex/scholar/config/_categories/README.md +149 -0
  1616. scitex/scholar/config/_categories/api_keys.yaml +19 -0
  1617. scitex/scholar/config/_categories/auth_gateway.yaml +149 -0
  1618. scitex/scholar/config/_categories/authentication.yaml +24 -0
  1619. scitex/scholar/config/_categories/browser.yaml +24 -0
  1620. scitex/scholar/config/_categories/core.yaml +24 -0
  1621. scitex/scholar/config/_categories/doi_publishers.yaml +53 -0
  1622. scitex/scholar/config/_categories/notifications.yaml +11 -0
  1623. scitex/scholar/config/_categories/pdf_download.yaml +15 -0
  1624. scitex/scholar/config/_categories/publishers_pdf_rules.yaml +184 -0
  1625. scitex/scholar/config/_categories/search_engines.yaml +22 -0
  1626. scitex/scholar/config/_categories/url_finder_openurl.yaml +87 -0
  1627. scitex/scholar/config/_categories/url_finder_selectors.yaml +147 -0
  1628. scitex/scholar/config/core/_CascadeConfig.py +156 -0
  1629. scitex/scholar/config/core/_PathManager.py +501 -0
  1630. scitex/scholar/config/default.yaml +671 -0
  1631. scitex/scholar/core/Paper.py +627 -0
  1632. scitex/scholar/core/Papers.py +722 -0
  1633. scitex/scholar/core/README.md +109 -0
  1634. scitex/scholar/core/Scholar.py +1975 -0
  1635. scitex/scholar/core/__init__.py +9 -0
  1636. scitex/scholar/docs/DETAILS_FOR_DEVELOPERS.md +464 -0
  1637. scitex/scholar/docs/IMPACT_FACTOR_CITATION_INTEGRATION.md +295 -0
  1638. scitex/scholar/docs/PIPELINE_IMPLEMENTATION_COMPLETE.md +324 -0
  1639. scitex/scholar/docs/PIPELINE_IMPLEMENTATION_PLAN.md +425 -0
  1640. scitex/scholar/docs/PIPELINE_ORGANIZATION.md +251 -0
  1641. scitex/scholar/docs/STORAGE_ARCHITECTURE.md +118 -0
  1642. scitex/scholar/docs/SUMMARY.md +127 -0
  1643. scitex/scholar/docs/backup/papers-orig.bib +698 -0
  1644. scitex/scholar/docs/backup/papers.bib.zip +0 -0
  1645. scitex/scholar/docs/bibfile.bib +66 -0
  1646. scitex/scholar/docs/from_agents/OPENATHENS_SECURITY.md +101 -0
  1647. scitex/scholar/docs/from_agents/feature-requests/scholar-openathens-authentication.md +107 -0
  1648. scitex/scholar/docs/from_agents/scholar_enhancements_summary.md +66 -0
  1649. scitex/scholar/docs/from_user/crawl4ai.md +15 -0
  1650. scitex/scholar/docs/from_user/medium_article_on_logined_page_for_zenrows_1.md +363 -0
  1651. scitex/scholar/docs/from_user/medium_article_on_logined_page_for_zenrows_2.md +1496 -0
  1652. scitex/scholar/docs/from_user/papers.bib +698 -0
  1653. scitex/scholar/docs/from_user/renamed-async_functions.md +970 -0
  1654. scitex/scholar/docs/from_user/suggestions.md +97 -0
  1655. scitex/scholar/docs/sample_data/PAYWALLED.json +84 -0
  1656. scitex/scholar/docs/sample_data/openaccess.json +74 -0
  1657. scitex/scholar/docs/sample_data/papers-enriched.bib +675 -0
  1658. scitex/scholar/docs/sample_data/papers-partial-enriched.bib +601 -0
  1659. scitex/scholar/docs/sample_data/test_papers.bib +18 -0
  1660. scitex/scholar/docs/template.py +122 -0
  1661. scitex/scholar/docs/to_claude/bin/elisp/check_parens.sh +56 -0
  1662. scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/README.md +412 -0
  1663. scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/elisp-ci +622 -0
  1664. scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/elisp-ci-simple +105 -0
  1665. scitex/scholar/docs/to_claude/bin/elisp/find_incorrect_require_provide_statements.sh +113 -0
  1666. scitex/scholar/docs/to_claude/bin/elisp/run_tests_elisp.sh +532 -0
  1667. scitex/scholar/docs/to_claude/bin/elisp/run_tests_elisp_v02.sh +555 -0
  1668. scitex/scholar/docs/to_claude/bin/elisp/sync_elisp_tdd.sh +626 -0
  1669. scitex/scholar/docs/to_claude/bin/general/claude_emacs_server.sh +192 -0
  1670. scitex/scholar/docs/to_claude/bin/general/create_github_release.sh +36 -0
  1671. scitex/scholar/docs/to_claude/bin/general/find_errors.sh +75 -0
  1672. scitex/scholar/docs/to_claude/bin/general/rename.sh +145 -0
  1673. scitex/scholar/docs/to_claude/bin/general/render_mermaid.sh +116 -0
  1674. scitex/scholar/docs/to_claude/bin/general/safe_rm.sh +75 -0
  1675. scitex/scholar/docs/to_claude/bin/general/view_repo.sh +4 -0
  1676. scitex/scholar/docs/to_claude/bin/general/wsl2-buzzer.sh +73 -0
  1677. scitex/scholar/docs/to_claude/bin/python/black_all.sh +41 -0
  1678. scitex/scholar/docs/to_claude/bin/python/run_tests_python_pip_package.sh +291 -0
  1679. scitex/scholar/docs/to_claude/bin/safe_rm.sh +3 -0
  1680. scitex/scholar/docs/to_claude/bin/slurm/README.md +54 -0
  1681. scitex/scholar/docs/to_claude/bin/slurm/login.sh +23 -0
  1682. scitex/scholar/docs/to_claude/bin/slurm/request.sh +62 -0
  1683. scitex/scholar/docs/to_claude/bin/slurm/run.sh +73 -0
  1684. scitex/scholar/docs/to_claude/examples/README.md +9 -0
  1685. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/ELISP-TEST-REPORT-20250513-012234-48-PASSED-49-TOTAL-97-PERCENT.org +105 -0
  1686. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/LATEST-ELISP-REPORT.org +105 -0
  1687. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/README.md +11 -0
  1688. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/run_tests.sh +652 -0
  1689. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-core/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-4-TOTAL-0-PERCENT.org +25 -0
  1690. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-friends/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-34-TOTAL-0-PERCENT.org +66 -0
  1691. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-prep/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-5-TOTAL-0-PERCENT.org +26 -0
  1692. scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-utils/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-4-TOTAL-0-PERCENT.org +25 -0
  1693. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/.gitignore +626 -0
  1694. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/README.md +155 -0
  1695. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/config/MNIST.yaml +24 -0
  1696. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/config/PATH.yaml +30 -0
  1697. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/data/.gitkeep +0 -0
  1698. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/clf_svm.py +124 -0
  1699. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/download.py +165 -0
  1700. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/main.sh +26 -0
  1701. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_conf_mat.py +86 -0
  1702. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_digits.py +118 -0
  1703. scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_umap_space.py +110 -0
  1704. scitex/scholar/docs/to_claude/guidelines/.claude/mcp-config.json +0 -0
  1705. scitex/scholar/docs/to_claude/guidelines/.claude/settings.json +231 -0
  1706. scitex/scholar/docs/to_claude/guidelines/README.md +9 -0
  1707. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/01_DEVELOPMENT_CYCLE.md +47 -0
  1708. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/02_NAMING_CONVENSIONS.md +91 -0
  1709. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/03_ARCHITECTUAL_AGREEMENT_PROCESS.md +86 -0
  1710. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/04_ARCHITECTURE_PREDEFINED.md +77 -0
  1711. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/05_PRIORITY_CONFIG.md +22 -0
  1712. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/06_MULTIPLE_SPECIAL_AGENTS.md +35 -0
  1713. scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/07_DEBUGGING_TECHNIQUES.md +153 -0
  1714. scitex/scholar/docs/to_claude/guidelines/command/IMPORTANT-rm.md +69 -0
  1715. scitex/scholar/docs/to_claude/guidelines/command/IMPORTANT-tree.md +162 -0
  1716. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-01-basic.md +65 -0
  1717. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-02-project-structure.md +97 -0
  1718. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-03-file-template.md +70 -0
  1719. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-04-coding-style.md +42 -0
  1720. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-05-testing-guide.md +190 -0
  1721. scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-99-example-project.md +15 -0
  1722. scitex/scholar/docs/to_claude/guidelines/elisp/ci.md +650 -0
  1723. scitex/scholar/docs/to_claude/guidelines/elisp/testing-with-docker.md +243 -0
  1724. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +905 -0
  1725. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +99 -0
  1726. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +96 -0
  1727. scitex/scholar/docs/to_claude/guidelines/programming_common/EXAMPLE-README-MODULE-ROOT.md +32 -0
  1728. scitex/scholar/docs/to_claude/guidelines/programming_common/EXAMPLE-README-REPOSITORY-ROOT.md +60 -0
  1729. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-art-of-readable-code.md +1317 -0
  1730. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-art-of-testing.md +799 -0
  1731. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-cleanliness.md +18 -0
  1732. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-documentation-performance-claims.md +163 -0
  1733. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-general.md +156 -0
  1734. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-refactoring.md +32 -0
  1735. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-regression-prevention.md +14 -0
  1736. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-slurm.md +73 -0
  1737. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-start-from-small.md +30 -0
  1738. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-test-driven-workflow.md +80 -0
  1739. scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-version-control.md +47 -0
  1740. scitex/scholar/docs/to_claude/guidelines/programming_common/clean-code.md +305 -0
  1741. scitex/scholar/docs/to_claude/guidelines/programming_common/debugging-message.md +52 -0
  1742. scitex/scholar/docs/to_claude/guidelines/programming_common/do-not-repeat-yourself.md +27 -0
  1743. scitex/scholar/docs/to_claude/guidelines/programming_common/emacs-server.md +39 -0
  1744. scitex/scholar/docs/to_claude/guidelines/programming_common/keep-it-simple-stupid.md +19 -0
  1745. scitex/scholar/docs/to_claude/guidelines/programming_common/renaming-and-cleaning-workflow.md +311 -0
  1746. scitex/scholar/docs/to_claude/guidelines/programming_common/screen.md +32 -0
  1747. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-CLAUDE_ID.md +15 -0
  1748. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-beyond-control.md +14 -0
  1749. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-bug-report.md +43 -0
  1750. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-cleanliness.md +162 -0
  1751. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-communication.md +13 -0
  1752. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-do-not-create-any-new-file-nor-directory-in-project-root.md +9 -0
  1753. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-documentation.md +11 -0
  1754. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-feature-request.md +33 -0
  1755. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-general-multi-agent-coordination.md +311 -0
  1756. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-multi-agent-protocol.md +97 -0
  1757. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-bulletin-board.md +48 -0
  1758. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-markdown.md +156 -0
  1759. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-org.org +161 -0
  1760. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-tools.md +10 -0
  1761. scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-understand-message-in-filename.md +12 -0
  1762. scitex/scholar/docs/to_claude/guidelines/project/general.md +7 -0
  1763. scitex/scholar/docs/to_claude/guidelines/project/report.md +50 -0
  1764. scitex/scholar/docs/to_claude/guidelines/project/timeline-gantt-chart.md +49 -0
  1765. scitex/scholar/docs/to_claude/guidelines/python/CHECKLIST.md +51 -0
  1766. scitex/scholar/docs/to_claude/guidelines/python/HOW-TO-DEBUG-with-MULTIPLE_AGENTS.md +191 -0
  1767. scitex/scholar/docs/to_claude/guidelines/python/Machine-Learning.md +15 -0
  1768. scitex/scholar/docs/to_claude/guidelines/python/NOT-FULL-PYTEST-BUT-PARTIAL-PYTEST.md +21 -0
  1769. scitex/scholar/docs/to_claude/guidelines/python/django.md +217 -0
  1770. scitex/scholar/docs/to_claude/guidelines/python/env.md +10 -0
  1771. scitex/scholar/docs/to_claude/guidelines/python/general.md +55 -0
  1772. scitex/scholar/docs/to_claude/guidelines/python/official/cipdb-README.md +219 -0
  1773. scitex/scholar/docs/to_claude/guidelines/python/official/fastmcp-README.md +442 -0
  1774. scitex/scholar/docs/to_claude/guidelines/python/official/fastmcp-TESTING.md +146 -0
  1775. scitex/scholar/docs/to_claude/guidelines/python/official/icecream-README.md +433 -0
  1776. scitex/scholar/docs/to_claude/guidelines/python/official/priority_config-README.md +126 -0
  1777. scitex/scholar/docs/to_claude/guidelines/python/scitex/01-basic.md +42 -0
  1778. scitex/scholar/docs/to_claude/guidelines/python/scitex/02-file-template.md +132 -0
  1779. scitex/scholar/docs/to_claude/guidelines/python/scitex/03-configuration.md +53 -0
  1780. scitex/scholar/docs/to_claude/guidelines/python/scitex/04-coding-style.md +126 -0
  1781. scitex/scholar/docs/to_claude/guidelines/python/scitex/05-testing-guide.md +56 -0
  1782. scitex/scholar/docs/to_claude/guidelines/python/scitex/06-examples-guide.md +42 -0
  1783. scitex/scholar/docs/to_claude/guidelines/python/scitex/11-gen-module.md +15 -0
  1784. scitex/scholar/docs/to_claude/guidelines/python/scitex/11-session-module.md +24 -0
  1785. scitex/scholar/docs/to_claude/guidelines/python/scitex/12-io-module.md +112 -0
  1786. scitex/scholar/docs/to_claude/guidelines/python/scitex/13-plt-module.md +101 -0
  1787. scitex/scholar/docs/to_claude/guidelines/python/scitex/14-dsp-module.md +78 -0
  1788. scitex/scholar/docs/to_claude/guidelines/python/scitex/15-pd-module.md +24 -0
  1789. scitex/scholar/docs/to_claude/guidelines/python/scitex/16-stats-module.md +79 -0
  1790. scitex/scholar/docs/to_claude/guidelines/python/scitex/17-other-modules.md +23 -0
  1791. scitex/scholar/docs/to_claude/guidelines/python/scitex/17-str-module.md +24 -0
  1792. scitex/scholar/docs/to_claude/guidelines/python/scitex/18-directory-structure-for-scientific-work.md +48 -0
  1793. scitex/scholar/docs/to_claude/guidelines/python/scitex/19-directory-structure-for-pip-package.md +234 -0
  1794. scitex/scholar/docs/to_claude/guidelines/python/scitex/99-example-project.md +19 -0
  1795. scitex/scholar/docs/to_claude/guidelines/python/zen_of_python.md +82 -0
  1796. scitex/scholar/docs/to_claude/guidelines/science/IMPORTANT-general.md +16 -0
  1797. scitex/scholar/docs/to_claude/guidelines/science/IMPORTANT-scientific-attitude.md +25 -0
  1798. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-abstract.md +93 -0
  1799. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-discussion.md +116 -0
  1800. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-general-1.md +157 -0
  1801. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-general-2.md +83 -0
  1802. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-introduction.md +123 -0
  1803. scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-methods.md +88 -0
  1804. scitex/scholar/docs/to_claude/guidelines/shell/IMPORTANT-general.md +196 -0
  1805. scitex/scholar/docs/zenrows_official/FAQ.md +434 -0
  1806. scitex/scholar/docs/zenrows_official/captcha_integration.md +698 -0
  1807. scitex/scholar/docs/zenrows_official/final_url.md +204 -0
  1808. scitex/scholar/docs/zenrows_official/with_playwright.md +336 -0
  1809. scitex/scholar/examples/00_config.py +269 -0
  1810. scitex/scholar/examples/01_auth.py +162 -0
  1811. scitex/scholar/examples/02_browser.py +165 -0
  1812. scitex/scholar/examples/03_01-engine.py +483 -0
  1813. scitex/scholar/examples/03_02-engine-for-bibtex.py +165 -0
  1814. scitex/scholar/examples/04_01-url.py +218 -0
  1815. scitex/scholar/examples/04_02-url-for-bibtex.py +279 -0
  1816. scitex/scholar/examples/04_02-url-for-dois.py +315 -0
  1817. scitex/scholar/examples/05_download_pdf.py +219 -0
  1818. scitex/scholar/examples/06_find_and_download.py +217 -0
  1819. scitex/scholar/examples/06_parse_bibtex.py +256 -0
  1820. scitex/scholar/examples/07_storage_integration.py +256 -0
  1821. scitex/scholar/examples/99_fullpipeline-for-bibtex.py +350 -0
  1822. scitex/scholar/examples/99_fullpipeline-for-one-entry.py +285 -0
  1823. scitex/scholar/examples/99_maintenance.py +131 -0
  1824. scitex/scholar/examples/README.md +18 -0
  1825. scitex/scholar/examples/SUGGESTIONS.md +865 -0
  1826. scitex/scholar/examples/dev.py +39 -0
  1827. scitex/scholar/examples/zotero_integration.py +253 -0
  1828. scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
  1829. scitex/scholar/impact_factor/README.md +135 -0
  1830. scitex/scholar/impact_factor/__init__.py +20 -0
  1831. scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
  1832. scitex/scholar/impact_factor/estimation/README.md +351 -0
  1833. scitex/scholar/impact_factor/estimation/__init__.py +40 -0
  1834. scitex/scholar/impact_factor/estimation/build_database.py +0 -0
  1835. scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
  1836. scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
  1837. scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
  1838. scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
  1839. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +318 -0
  1840. scitex/scholar/impact_factor/jcr/README.md +84 -0
  1841. scitex/scholar/impact_factor/jcr/TODO.md +28 -0
  1842. scitex/scholar/impact_factor/jcr/build_database.py +267 -0
  1843. scitex/scholar/integration/MIGRATION.md +138 -0
  1844. scitex/scholar/integration/README.md +464 -0
  1845. scitex/scholar/integration/__init__.py +59 -0
  1846. scitex/scholar/integration/base.py +502 -0
  1847. scitex/scholar/integration/mendeley/__init__.py +22 -0
  1848. scitex/scholar/integration/mendeley/exporter.py +166 -0
  1849. scitex/scholar/integration/mendeley/importer.py +236 -0
  1850. scitex/scholar/integration/mendeley/linker.py +79 -0
  1851. scitex/scholar/integration/mendeley/mapper.py +212 -0
  1852. scitex/scholar/integration/zotero/README.md +336 -0
  1853. scitex/scholar/integration/zotero/__init__.py +27 -0
  1854. scitex/scholar/integration/zotero/__main__.py +264 -0
  1855. scitex/scholar/integration/zotero/exporter.py +351 -0
  1856. scitex/scholar/integration/zotero/importer.py +372 -0
  1857. scitex/scholar/integration/zotero/linker.py +415 -0
  1858. scitex/scholar/integration/zotero/mapper.py +286 -0
  1859. scitex/scholar/library/neurovista/info/bibtex/seizure_prediction_enriched.bib +1092 -0
  1860. scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSource.py +287 -0
  1861. scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py +217 -0
  1862. scitex/scholar/metadata_engines/README.md +42 -0
  1863. scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
  1864. scitex/scholar/metadata_engines/__init__.py +27 -0
  1865. scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
  1866. scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
  1867. scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
  1868. scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
  1869. scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
  1870. scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
  1871. scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
  1872. scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
  1873. scitex/scholar/metadata_engines/individual/__init__.py +7 -0
  1874. scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
  1875. scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
  1876. scitex/scholar/metadata_engines/utils/__init__.py +30 -0
  1877. scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
  1878. scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
  1879. scitex/scholar/pdf_download/README.md +51 -0
  1880. scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
  1881. scitex/scholar/pdf_download/__init__.py +5 -0
  1882. scitex/scholar/pdf_download/strategies/__init__.py +38 -0
  1883. scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
  1884. scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
  1885. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
  1886. scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
  1887. scitex/scholar/pdf_download/strategies/response_body.py +207 -0
  1888. scitex/scholar/pipelines/README.md +172 -0
  1889. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
  1890. scitex/scholar/pipelines/ScholarPipelineMetadataParallel.py +270 -0
  1891. scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py +269 -0
  1892. scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
  1893. scitex/scholar/pipelines/ScholarPipelineSearchParallel.py +778 -0
  1894. scitex/scholar/pipelines/ScholarPipelineSearchSingle.py +500 -0
  1895. scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
  1896. scitex/scholar/pipelines/SearchQueryParser.py +270 -0
  1897. scitex/scholar/pipelines/__init__.py +55 -0
  1898. scitex/scholar/search_engines/ScholarSearchEngine.py +269 -0
  1899. scitex/scholar/search_engines/_BaseSearchEngine.py +183 -0
  1900. scitex/scholar/search_engines/__init__.py +0 -0
  1901. scitex/scholar/search_engines/individual/ArXivSearchEngine.py +176 -0
  1902. scitex/scholar/search_engines/individual/CrossRefSearchEngine.py +152 -0
  1903. scitex/scholar/search_engines/individual/OpenAlexSearchEngine.py +172 -0
  1904. scitex/scholar/search_engines/individual/PubMedSearchEngine.py +188 -0
  1905. scitex/scholar/search_engines/individual/SemanticScholarSearchEngine.py +152 -0
  1906. scitex/scholar/search_engines/individual/__init__.py +0 -0
  1907. scitex/scholar/storage/BibTeXHandler.py +1018 -0
  1908. scitex/scholar/storage/PaperIO.py +468 -0
  1909. scitex/scholar/storage/ScholarLibrary.py +182 -0
  1910. scitex/scholar/storage/_DeduplicationManager.py +548 -0
  1911. scitex/scholar/storage/_LibraryCacheManager.py +724 -0
  1912. scitex/scholar/storage/_LibraryManager.py +1835 -0
  1913. scitex/scholar/storage/__init__.py +28 -0
  1914. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  1915. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  1916. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  1917. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  1918. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  1919. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  1920. scitex/scholar/url_finder/.tmp/open_url/legacy/_MultiInstitutionalResolver.py +397 -0
  1921. scitex/scholar/url_finder/.tmp/open_url/legacy/_OpenURLResolverWithZenRows.py +718 -0
  1922. scitex/scholar/url_finder/.tmp/open_url/legacy/_ResumableOpenURLResolver.py +298 -0
  1923. scitex/scholar/url_finder/.tmp/open_url/legacy/_UnimelbLibraryGoButtonSelector.py +466 -0
  1924. scitex/scholar/url_finder/.tmp/open_url/legacy/_ZenRowsOpenURLResolver.py +372 -0
  1925. scitex/scholar/url_finder/README.md +74 -0
  1926. scitex/scholar/url_finder/ScholarURLFinder.py +380 -0
  1927. scitex/scholar/url_finder/__init__.py +7 -0
  1928. scitex/scholar/url_finder/docs/CORE_URL_TYPES.md +187 -0
  1929. scitex/scholar/url_finder/docs/URL_SCHEMA.md +223 -0
  1930. scitex/scholar/url_finder/strategies/__init__.py +33 -0
  1931. scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
  1932. scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
  1933. scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
  1934. scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
  1935. scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
  1936. scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +164 -0
  1937. scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
  1938. scitex/scholar/url_finder/translators/__init__.py +31 -0
  1939. scitex/scholar/url_finder/translators/core/__init__.py +6 -0
  1940. scitex/scholar/url_finder/translators/core/base.py +50 -0
  1941. scitex/scholar/url_finder/translators/core/patterns.py +38 -0
  1942. scitex/scholar/url_finder/translators/core/registry.py +375 -0
  1943. scitex/scholar/url_finder/translators/individual/BOFiP_Impots.py +192 -0
  1944. scitex/scholar/url_finder/translators/individual/Baidu_Scholar.py +237 -0
  1945. scitex/scholar/url_finder/translators/individual/Bangkok_Post.py +158 -0
  1946. scitex/scholar/url_finder/translators/individual/Baruch_Foundation.py +201 -0
  1947. scitex/scholar/url_finder/translators/individual/Beobachter.py +197 -0
  1948. scitex/scholar/url_finder/translators/individual/Bezneng_Gajit.py +207 -0
  1949. scitex/scholar/url_finder/translators/individual/BibLaTeX.py +322 -0
  1950. scitex/scholar/url_finder/translators/individual/BibTeX.py +326 -0
  1951. scitex/scholar/url_finder/translators/individual/Biblio_com.py +225 -0
  1952. scitex/scholar/url_finder/translators/individual/Bibliontology_RDF.py +226 -0
  1953. scitex/scholar/url_finder/translators/individual/CLASE.py +23 -0
  1954. scitex/scholar/url_finder/translators/individual/COBISS.py +23 -0
  1955. scitex/scholar/url_finder/translators/individual/COinS.py +23 -0
  1956. scitex/scholar/url_finder/translators/individual/CQ_Press.py +23 -0
  1957. scitex/scholar/url_finder/translators/individual/CROSBI.py +23 -0
  1958. scitex/scholar/url_finder/translators/individual/CSL_JSON.py +23 -0
  1959. scitex/scholar/url_finder/translators/individual/CSV.py +23 -0
  1960. scitex/scholar/url_finder/translators/individual/CalMatters.py +23 -0
  1961. scitex/scholar/url_finder/translators/individual/Calisphere.py +23 -0
  1962. scitex/scholar/url_finder/translators/individual/Camara_Brasileira_do_Livro_ISBN.py +287 -0
  1963. scitex/scholar/url_finder/translators/individual/CanLII.py +145 -0
  1964. scitex/scholar/url_finder/translators/individual/Canada_com.py +131 -0
  1965. scitex/scholar/url_finder/translators/individual/Canadian_Letters_and_Images.py +152 -0
  1966. scitex/scholar/url_finder/translators/individual/Canadiana_ca.py +184 -0
  1967. scitex/scholar/url_finder/translators/individual/Cascadilla_Proceedings_Project.py +196 -0
  1968. scitex/scholar/url_finder/translators/individual/Central_and_Eastern_European_Online_Library_Journals.py +172 -0
  1969. scitex/scholar/url_finder/translators/individual/Champlain_Society_Collection.py +170 -0
  1970. scitex/scholar/url_finder/translators/individual/Chicago_Journal_of_Theoretical_Computer_Science.py +194 -0
  1971. scitex/scholar/url_finder/translators/individual/Christian_Science_Monitor.py +124 -0
  1972. scitex/scholar/url_finder/translators/individual/Columbia_University_Press.py +228 -0
  1973. scitex/scholar/url_finder/translators/individual/Common_Place.py +236 -0
  1974. scitex/scholar/url_finder/translators/individual/Cornell_LII.py +161 -0
  1975. scitex/scholar/url_finder/translators/individual/Cornell_University_Press.py +163 -0
  1976. scitex/scholar/url_finder/translators/individual/CourtListener.py +177 -0
  1977. scitex/scholar/url_finder/translators/individual/DAI_Zenon.py +161 -0
  1978. scitex/scholar/url_finder/translators/individual/FULL_DOWNLOAD_LOG.txt +2 -0
  1979. scitex/scholar/url_finder/translators/individual/FULL_DOWNLOAD_LOG_colored.txt +1 -0
  1980. scitex/scholar/url_finder/translators/individual/__init__.py +25 -0
  1981. scitex/scholar/url_finder/translators/individual/abc_news_australia.py +23 -0
  1982. scitex/scholar/url_finder/translators/individual/access_engineering.py +23 -0
  1983. scitex/scholar/url_finder/translators/individual/access_medicine.py +261 -0
  1984. scitex/scholar/url_finder/translators/individual/access_science.py +23 -0
  1985. scitex/scholar/url_finder/translators/individual/acls_humanities_ebook.py +23 -0
  1986. scitex/scholar/url_finder/translators/individual/aclweb.py +23 -0
  1987. scitex/scholar/url_finder/translators/individual/acm.py +11 -0
  1988. scitex/scholar/url_finder/translators/individual/acm_digital_library.py +325 -0
  1989. scitex/scholar/url_finder/translators/individual/acs.py +23 -0
  1990. scitex/scholar/url_finder/translators/individual/acs_publications.py +23 -0
  1991. scitex/scholar/url_finder/translators/individual/adam_matthew_digital.py +23 -0
  1992. scitex/scholar/url_finder/translators/individual/ads_bibcode.py +23 -0
  1993. scitex/scholar/url_finder/translators/individual/aea_web.py +23 -0
  1994. scitex/scholar/url_finder/translators/individual/agencia_del_isbn.py +23 -0
  1995. scitex/scholar/url_finder/translators/individual/agris.py +23 -0
  1996. scitex/scholar/url_finder/translators/individual/ahval_news.py +23 -0
  1997. scitex/scholar/url_finder/translators/individual/aip.py +23 -0
  1998. scitex/scholar/url_finder/translators/individual/air_university_journals.py +23 -0
  1999. scitex/scholar/url_finder/translators/individual/airiti.py +23 -0
  2000. scitex/scholar/url_finder/translators/individual/alexander_street_press.py +23 -0
  2001. scitex/scholar/url_finder/translators/individual/all_africa.py +23 -0
  2002. scitex/scholar/url_finder/translators/individual/allafrica.py +23 -0
  2003. scitex/scholar/url_finder/translators/individual/alsharekh.py +23 -0
  2004. scitex/scholar/url_finder/translators/individual/alternet.py +23 -0
  2005. scitex/scholar/url_finder/translators/individual/aluka.py +23 -0
  2006. scitex/scholar/url_finder/translators/individual/amazon.py +23 -0
  2007. scitex/scholar/url_finder/translators/individual/american_archive_public_broadcasting.py +23 -0
  2008. scitex/scholar/url_finder/translators/individual/american_institute_aeronautics_astronautics.py +23 -0
  2009. scitex/scholar/url_finder/translators/individual/american_prospect.py +23 -0
  2010. scitex/scholar/url_finder/translators/individual/ams_journals.py +23 -0
  2011. scitex/scholar/url_finder/translators/individual/ams_mathscinet.py +23 -0
  2012. scitex/scholar/url_finder/translators/individual/ams_mathscinet_legacy.py +23 -0
  2013. scitex/scholar/url_finder/translators/individual/ancestry_com_us_federal_census.py +23 -0
  2014. scitex/scholar/url_finder/translators/individual/ancestry_us_federal_census.py +23 -0
  2015. scitex/scholar/url_finder/translators/individual/annual_reviews.py +23 -0
  2016. scitex/scholar/url_finder/translators/individual/antikvarium_hu.py +23 -0
  2017. scitex/scholar/url_finder/translators/individual/aosic.py +23 -0
  2018. scitex/scholar/url_finder/translators/individual/apa_psycnet.py +23 -0
  2019. scitex/scholar/url_finder/translators/individual/apn_ru.py +23 -0
  2020. scitex/scholar/url_finder/translators/individual/aps.py +23 -0
  2021. scitex/scholar/url_finder/translators/individual/aps_physics.py +115 -0
  2022. scitex/scholar/url_finder/translators/individual/aquadocs.py +23 -0
  2023. scitex/scholar/url_finder/translators/individual/archeion.py +23 -0
  2024. scitex/scholar/url_finder/translators/individual/archiv_fuer_sozialgeschichte.py +23 -0
  2025. scitex/scholar/url_finder/translators/individual/archive_ouverte_aosic.py +23 -0
  2026. scitex/scholar/url_finder/translators/individual/archive_ouverte_en_sciences_de_l_information_et_de_la_communication___aosic_.py +23 -0
  2027. scitex/scholar/url_finder/translators/individual/archives_canada.py +23 -0
  2028. scitex/scholar/url_finder/translators/individual/ariana_news.py +23 -0
  2029. scitex/scholar/url_finder/translators/individual/art_institute_of_chicago.py +23 -0
  2030. scitex/scholar/url_finder/translators/individual/artefacts_canada.py +23 -0
  2031. scitex/scholar/url_finder/translators/individual/artfl_encyclopedie.py +23 -0
  2032. scitex/scholar/url_finder/translators/individual/artforum.py +144 -0
  2033. scitex/scholar/url_finder/translators/individual/artnet.py +23 -0
  2034. scitex/scholar/url_finder/translators/individual/artnews.py +23 -0
  2035. scitex/scholar/url_finder/translators/individual/artstor.py +23 -0
  2036. scitex/scholar/url_finder/translators/individual/arxiv.py +39 -0
  2037. scitex/scholar/url_finder/translators/individual/arxiv_org.py +118 -0
  2038. scitex/scholar/url_finder/translators/individual/asce.py +23 -0
  2039. scitex/scholar/url_finder/translators/individual/asco_meeting_library.py +23 -0
  2040. scitex/scholar/url_finder/translators/individual/astis.py +23 -0
  2041. scitex/scholar/url_finder/translators/individual/atlanta_journal_constitution.py +141 -0
  2042. scitex/scholar/url_finder/translators/individual/ats_international_journal.py +23 -0
  2043. scitex/scholar/url_finder/translators/individual/atypon.py +23 -0
  2044. scitex/scholar/url_finder/translators/individual/atypon_journals.py +245 -0
  2045. scitex/scholar/url_finder/translators/individual/austlii_and_nzlii.py +247 -0
  2046. scitex/scholar/url_finder/translators/individual/australian_dictionary_of_biography.py +120 -0
  2047. scitex/scholar/url_finder/translators/individual/bailii.py +119 -0
  2048. scitex/scholar/url_finder/translators/individual/bbc.py +225 -0
  2049. scitex/scholar/url_finder/translators/individual/bbc_genome.py +168 -0
  2050. scitex/scholar/url_finder/translators/individual/beck_online.py +23 -0
  2051. scitex/scholar/url_finder/translators/individual/biblioteca_nacional_de_maestros.py +140 -0
  2052. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationale_quebec_pistard.py +135 -0
  2053. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationales_quebec.py +181 -0
  2054. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationale_du_quebec__pistard_.py +23 -0
  2055. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationales_du_quebec.py +23 -0
  2056. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_de_france.py +23 -0
  2057. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_france.py +161 -0
  2058. scitex/scholar/url_finder/translators/individual/bibsys.py +158 -0
  2059. scitex/scholar/url_finder/translators/individual/bioconductor.py +178 -0
  2060. scitex/scholar/url_finder/translators/individual/biomed_central.py +143 -0
  2061. scitex/scholar/url_finder/translators/individual/bioone.py +23 -0
  2062. scitex/scholar/url_finder/translators/individual/biorxiv.py +133 -0
  2063. scitex/scholar/url_finder/translators/individual/blaetter.py +23 -0
  2064. scitex/scholar/url_finder/translators/individual/blogger.py +152 -0
  2065. scitex/scholar/url_finder/translators/individual/bloomberg.py +172 -0
  2066. scitex/scholar/url_finder/translators/individual/bloomsbury_food_library.py +135 -0
  2067. scitex/scholar/url_finder/translators/individual/bluesky.py +127 -0
  2068. scitex/scholar/url_finder/translators/individual/bnf_isbn.py +118 -0
  2069. scitex/scholar/url_finder/translators/individual/bocc.py +241 -0
  2070. scitex/scholar/url_finder/translators/individual/boe.py +196 -0
  2071. scitex/scholar/url_finder/translators/individual/bookmarks.py +23 -0
  2072. scitex/scholar/url_finder/translators/individual/bookshop_org.py +23 -0
  2073. scitex/scholar/url_finder/translators/individual/boston_review.py +23 -0
  2074. scitex/scholar/url_finder/translators/individual/bosworth_toller_anglo_saxon_dictionary.py +23 -0
  2075. scitex/scholar/url_finder/translators/individual/bosworth_toller_s_anglo_saxon_dictionary_online.py +23 -0
  2076. scitex/scholar/url_finder/translators/individual/bracero_history_archive.py +23 -0
  2077. scitex/scholar/url_finder/translators/individual/brill.py +23 -0
  2078. scitex/scholar/url_finder/translators/individual/brukerhandboken.py +23 -0
  2079. scitex/scholar/url_finder/translators/individual/bryn_mawr_classical_review.py +23 -0
  2080. scitex/scholar/url_finder/translators/individual/bundesgesetzblatt.py +23 -0
  2081. scitex/scholar/url_finder/translators/individual/business_standard.py +180 -0
  2082. scitex/scholar/url_finder/translators/individual/cabi___cab_abstracts.py +23 -0
  2083. scitex/scholar/url_finder/translators/individual/cabi_cab_abstracts.py +178 -0
  2084. scitex/scholar/url_finder/translators/individual/cairn.py +23 -0
  2085. scitex/scholar/url_finder/translators/individual/cairn_info.py +23 -0
  2086. scitex/scholar/url_finder/translators/individual/cambridge.py +23 -0
  2087. scitex/scholar/url_finder/translators/individual/cambridge_core.py +172 -0
  2088. scitex/scholar/url_finder/translators/individual/cambridge_engage_preprints.py +23 -0
  2089. scitex/scholar/url_finder/translators/individual/caod.py +220 -0
  2090. scitex/scholar/url_finder/translators/individual/cbc.py +257 -0
  2091. scitex/scholar/url_finder/translators/individual/ccfr__bnf_.py +23 -0
  2092. scitex/scholar/url_finder/translators/individual/ccfr_bnf.py +227 -0
  2093. scitex/scholar/url_finder/translators/individual/cell_press.py +23 -0
  2094. scitex/scholar/url_finder/translators/individual/cern_document_server.py +23 -0
  2095. scitex/scholar/url_finder/translators/individual/ceur_workshop_proceedings.py +23 -0
  2096. scitex/scholar/url_finder/translators/individual/cff.py +23 -0
  2097. scitex/scholar/url_finder/translators/individual/cff_references.py +23 -0
  2098. scitex/scholar/url_finder/translators/individual/champlain_society___collection.py +23 -0
  2099. scitex/scholar/url_finder/translators/individual/chronicling_america.py +23 -0
  2100. scitex/scholar/url_finder/translators/individual/cia_world_factbook.py +153 -0
  2101. scitex/scholar/url_finder/translators/individual/cinii_research.py +23 -0
  2102. scitex/scholar/url_finder/translators/individual/citavi_5_xml.py +23 -0
  2103. scitex/scholar/url_finder/translators/individual/citeseer.py +23 -0
  2104. scitex/scholar/url_finder/translators/individual/citizen_lab.py +23 -0
  2105. scitex/scholar/url_finder/translators/individual/civilization_ca.py +23 -0
  2106. scitex/scholar/url_finder/translators/individual/clacso.py +23 -0
  2107. scitex/scholar/url_finder/translators/individual/climate_change_and_human_health_literature_portal.py +23 -0
  2108. scitex/scholar/url_finder/translators/individual/climate_change_human_health.py +23 -0
  2109. scitex/scholar/url_finder/translators/individual/clinical_key.py +23 -0
  2110. scitex/scholar/url_finder/translators/individual/clinicaltrials_gov.py +23 -0
  2111. scitex/scholar/url_finder/translators/individual/cnki.py +23 -0
  2112. scitex/scholar/url_finder/translators/individual/code4lib_journal.py +23 -0
  2113. scitex/scholar/url_finder/translators/individual/colorado_state_legislature.py +23 -0
  2114. scitex/scholar/url_finder/translators/individual/computer_history_museum_archive.py +23 -0
  2115. scitex/scholar/url_finder/translators/individual/copernicus.py +23 -0
  2116. scitex/scholar/url_finder/translators/individual/crossref_rest.py +584 -0
  2117. scitex/scholar/url_finder/translators/individual/crossref_unixref_xml.py +23 -0
  2118. scitex/scholar/url_finder/translators/individual/csiro_publishing.py +23 -0
  2119. scitex/scholar/url_finder/translators/individual/csiro_publishing_dup.py +23 -0
  2120. scitex/scholar/url_finder/translators/individual/current_affairs.py +118 -0
  2121. scitex/scholar/url_finder/translators/individual/dabi.py +201 -0
  2122. scitex/scholar/url_finder/translators/individual/dagens_nyheter.py +23 -0
  2123. scitex/scholar/url_finder/translators/individual/dagstuhl.py +152 -0
  2124. scitex/scholar/url_finder/translators/individual/dagstuhl_research_online_publication_server.py +23 -0
  2125. scitex/scholar/url_finder/translators/individual/dar_almandumah.py +156 -0
  2126. scitex/scholar/url_finder/translators/individual/dart_europe.py +175 -0
  2127. scitex/scholar/url_finder/translators/individual/data_gov.py +145 -0
  2128. scitex/scholar/url_finder/translators/individual/databrary.py +145 -0
  2129. scitex/scholar/url_finder/translators/individual/datacite_json.py +263 -0
  2130. scitex/scholar/url_finder/translators/individual/dataverse.py +186 -0
  2131. scitex/scholar/url_finder/translators/individual/daum_news.py +133 -0
  2132. scitex/scholar/url_finder/translators/individual/dblp.py +155 -0
  2133. scitex/scholar/url_finder/translators/individual/dblp_computer_science_bibliography.py +99 -0
  2134. scitex/scholar/url_finder/translators/individual/dbpia.py +100 -0
  2135. scitex/scholar/url_finder/translators/individual/de_gruyter_brill.py +23 -0
  2136. scitex/scholar/url_finder/translators/individual/defense_technical_information_center.py +112 -0
  2137. scitex/scholar/url_finder/translators/individual/dejure_org.py +23 -0
  2138. scitex/scholar/url_finder/translators/individual/delpher.py +201 -0
  2139. scitex/scholar/url_finder/translators/individual/demographic_research.py +156 -0
  2140. scitex/scholar/url_finder/translators/individual/denik_cz.py +151 -0
  2141. scitex/scholar/url_finder/translators/individual/depatisnet.py +148 -0
  2142. scitex/scholar/url_finder/translators/individual/der_freitag.py +199 -0
  2143. scitex/scholar/url_finder/translators/individual/der_spiegel.py +187 -0
  2144. scitex/scholar/url_finder/translators/individual/desiring_god.py +23 -0
  2145. scitex/scholar/url_finder/translators/individual/deutsche_fotothek.py +23 -0
  2146. scitex/scholar/url_finder/translators/individual/deutsche_nationalbibliothek.py +23 -0
  2147. scitex/scholar/url_finder/translators/individual/dhistory.py +23 -0
  2148. scitex/scholar/url_finder/translators/individual/dialnet.py +23 -0
  2149. scitex/scholar/url_finder/translators/individual/die_zeit.py +23 -0
  2150. scitex/scholar/url_finder/translators/individual/digibib_net.py +23 -0
  2151. scitex/scholar/url_finder/translators/individual/digital_humanities_quarterly.py +23 -0
  2152. scitex/scholar/url_finder/translators/individual/digital_spy.py +23 -0
  2153. scitex/scholar/url_finder/translators/individual/digizeitschriften.py +23 -0
  2154. scitex/scholar/url_finder/translators/individual/dimensions.py +23 -0
  2155. scitex/scholar/url_finder/translators/individual/dlibra.py +23 -0
  2156. scitex/scholar/url_finder/translators/individual/doaj.py +23 -0
  2157. scitex/scholar/url_finder/translators/individual/doi.py +23 -0
  2158. scitex/scholar/url_finder/translators/individual/doi_content_negotiation.py +23 -0
  2159. scitex/scholar/url_finder/translators/individual/douban.py +23 -0
  2160. scitex/scholar/url_finder/translators/individual/dpla.py +201 -0
  2161. scitex/scholar/url_finder/translators/individual/dreier_neuerscheinungsdienst.py +23 -0
  2162. scitex/scholar/url_finder/translators/individual/drugbank_ca.py +23 -0
  2163. scitex/scholar/url_finder/translators/individual/dryad.py +23 -0
  2164. scitex/scholar/url_finder/translators/individual/dryad_digital_repository.py +23 -0
  2165. scitex/scholar/url_finder/translators/individual/dspace.py +109 -0
  2166. scitex/scholar/url_finder/translators/individual/dspace_intermediate_metadata.py +23 -0
  2167. scitex/scholar/url_finder/translators/individual/duke_university_press_books.py +23 -0
  2168. scitex/scholar/url_finder/translators/individual/e_periodica_switzerland.py +23 -0
  2169. scitex/scholar/url_finder/translators/individual/eastview.py +23 -0
  2170. scitex/scholar/url_finder/translators/individual/ebrary.py +23 -0
  2171. scitex/scholar/url_finder/translators/individual/ebsco_discovery_layer.py +23 -0
  2172. scitex/scholar/url_finder/translators/individual/ebscohost.py +23 -0
  2173. scitex/scholar/url_finder/translators/individual/edinburgh_university_press_journals.py +23 -0
  2174. scitex/scholar/url_finder/translators/individual/education_week.py +23 -0
  2175. scitex/scholar/url_finder/translators/individual/eidr.py +23 -0
  2176. scitex/scholar/url_finder/translators/individual/el_comercio__peru_.py +23 -0
  2177. scitex/scholar/url_finder/translators/individual/el_pais.py +23 -0
  2178. scitex/scholar/url_finder/translators/individual/electronic_colloquium_on_computational_complexity.py +23 -0
  2179. scitex/scholar/url_finder/translators/individual/elibrary_ru.py +23 -0
  2180. scitex/scholar/url_finder/translators/individual/elicit.py +23 -0
  2181. scitex/scholar/url_finder/translators/individual/elife.py +23 -0
  2182. scitex/scholar/url_finder/translators/individual/elsevier_health.py +23 -0
  2183. scitex/scholar/url_finder/translators/individual/elsevier_health_journals.py +23 -0
  2184. scitex/scholar/url_finder/translators/individual/elsevier_pure.py +23 -0
  2185. scitex/scholar/url_finder/translators/individual/embedded_metadata.py +23 -0
  2186. scitex/scholar/url_finder/translators/individual/emedicine.py +23 -0
  2187. scitex/scholar/url_finder/translators/individual/emerald.py +23 -0
  2188. scitex/scholar/url_finder/translators/individual/emerald_insight.py +23 -0
  2189. scitex/scholar/url_finder/translators/individual/emja.py +23 -0
  2190. scitex/scholar/url_finder/translators/individual/encyclopedia_of_chicago.py +23 -0
  2191. scitex/scholar/url_finder/translators/individual/encyclopedia_of_korean_culture.py +23 -0
  2192. scitex/scholar/url_finder/translators/individual/endnote_xml.py +23 -0
  2193. scitex/scholar/url_finder/translators/individual/engineering_village.py +23 -0
  2194. scitex/scholar/url_finder/translators/individual/envidat.py +23 -0
  2195. scitex/scholar/url_finder/translators/individual/epa_national_library_catalog.py +23 -0
  2196. scitex/scholar/url_finder/translators/individual/epicurious.py +23 -0
  2197. scitex/scholar/url_finder/translators/individual/eprint_iacr.py +23 -0
  2198. scitex/scholar/url_finder/translators/individual/eric.py +23 -0
  2199. scitex/scholar/url_finder/translators/individual/erudit.py +23 -0
  2200. scitex/scholar/url_finder/translators/individual/espacenet.py +23 -0
  2201. scitex/scholar/url_finder/translators/individual/etatar_ru.py +23 -0
  2202. scitex/scholar/url_finder/translators/individual/euclid.py +23 -0
  2203. scitex/scholar/url_finder/translators/individual/eur_lex.py +23 -0
  2204. scitex/scholar/url_finder/translators/individual/eurasianet.py +23 -0
  2205. scitex/scholar/url_finder/translators/individual/eurogamerusgamer.py +23 -0
  2206. scitex/scholar/url_finder/translators/individual/europe_pmc.py +23 -0
  2207. scitex/scholar/url_finder/translators/individual/evernote.py +23 -0
  2208. scitex/scholar/url_finder/translators/individual/f1000_research.py +23 -0
  2209. scitex/scholar/url_finder/translators/individual/fachportal_padagogik.py +23 -0
  2210. scitex/scholar/url_finder/translators/individual/factiva.py +23 -0
  2211. scitex/scholar/url_finder/translators/individual/failed_architecture.py +23 -0
  2212. scitex/scholar/url_finder/translators/individual/fairfax_australia.py +23 -0
  2213. scitex/scholar/url_finder/translators/individual/fao_publications.py +23 -0
  2214. scitex/scholar/url_finder/translators/individual/fatcat.py +23 -0
  2215. scitex/scholar/url_finder/translators/individual/faz_net.py +23 -0
  2216. scitex/scholar/url_finder/translators/individual/feb_web_ru.py +23 -0
  2217. scitex/scholar/url_finder/translators/individual/figshare.py +23 -0
  2218. scitex/scholar/url_finder/translators/individual/financial_times.py +23 -0
  2219. scitex/scholar/url_finder/translators/individual/finna.py +23 -0
  2220. scitex/scholar/url_finder/translators/individual/fishpond_co_nz.py +23 -0
  2221. scitex/scholar/url_finder/translators/individual/flickr.py +23 -0
  2222. scitex/scholar/url_finder/translators/individual/foreign_affairs.py +23 -0
  2223. scitex/scholar/url_finder/translators/individual/foreign_policy.py +23 -0
  2224. scitex/scholar/url_finder/translators/individual/fr_online_de.py +23 -0
  2225. scitex/scholar/url_finder/translators/individual/freecite.py +23 -0
  2226. scitex/scholar/url_finder/translators/individual/freepatentsonline.py +23 -0
  2227. scitex/scholar/url_finder/translators/individual/frieze.py +23 -0
  2228. scitex/scholar/url_finder/translators/individual/frontiers.py +84 -0
  2229. scitex/scholar/url_finder/translators/individual/gale_databases.py +23 -0
  2230. scitex/scholar/url_finder/translators/individual/galegdc.py +23 -0
  2231. scitex/scholar/url_finder/translators/individual/galegroup.py +23 -0
  2232. scitex/scholar/url_finder/translators/individual/gallica.py +23 -0
  2233. scitex/scholar/url_finder/translators/individual/game_studies.py +23 -0
  2234. scitex/scholar/url_finder/translators/individual/gamespot.py +23 -0
  2235. scitex/scholar/url_finder/translators/individual/gamestar_gamepro.py +23 -0
  2236. scitex/scholar/url_finder/translators/individual/gasyrlar_awazy.py +23 -0
  2237. scitex/scholar/url_finder/translators/individual/gemeinsamer_bibliotheksverbund_isbn.py +23 -0
  2238. scitex/scholar/url_finder/translators/individual/gene_ontology.py +23 -0
  2239. scitex/scholar/url_finder/translators/individual/github.py +23 -0
  2240. scitex/scholar/url_finder/translators/individual/globes.py +23 -0
  2241. scitex/scholar/url_finder/translators/individual/gmail.py +23 -0
  2242. scitex/scholar/url_finder/translators/individual/gms_german_medical_science.py +107 -0
  2243. scitex/scholar/url_finder/translators/individual/goodreads.py +23 -0
  2244. scitex/scholar/url_finder/translators/individual/google_books.py +23 -0
  2245. scitex/scholar/url_finder/translators/individual/google_patents.py +23 -0
  2246. scitex/scholar/url_finder/translators/individual/google_play.py +23 -0
  2247. scitex/scholar/url_finder/translators/individual/google_presentation.py +23 -0
  2248. scitex/scholar/url_finder/translators/individual/google_research.py +23 -0
  2249. scitex/scholar/url_finder/translators/individual/google_scholar.py +23 -0
  2250. scitex/scholar/url_finder/translators/individual/govinfo.py +23 -0
  2251. scitex/scholar/url_finder/translators/individual/gpo_access_e_cfr.py +23 -0
  2252. scitex/scholar/url_finder/translators/individual/gulag_many_days__many_lives.py +23 -0
  2253. scitex/scholar/url_finder/translators/individual/haaretz.py +23 -0
  2254. scitex/scholar/url_finder/translators/individual/habr.py +23 -0
  2255. scitex/scholar/url_finder/translators/individual/hal.py +23 -0
  2256. scitex/scholar/url_finder/translators/individual/hal_archives_ouvertes.py +23 -0
  2257. scitex/scholar/url_finder/translators/individual/handelszeitung.py +23 -0
  2258. scitex/scholar/url_finder/translators/individual/hanrei_watch.py +23 -0
  2259. scitex/scholar/url_finder/translators/individual/harper_s_magazine.py +23 -0
  2260. scitex/scholar/url_finder/translators/individual/harvard_business_review.py +23 -0
  2261. scitex/scholar/url_finder/translators/individual/harvard_caselaw_access_project.py +23 -0
  2262. scitex/scholar/url_finder/translators/individual/harvard_university_press_books.py +23 -0
  2263. scitex/scholar/url_finder/translators/individual/hathitrust.py +23 -0
  2264. scitex/scholar/url_finder/translators/individual/hcsp.py +23 -0
  2265. scitex/scholar/url_finder/translators/individual/heinonline.py +23 -0
  2266. scitex/scholar/url_finder/translators/individual/heise.py +23 -0
  2267. scitex/scholar/url_finder/translators/individual/herder.py +23 -0
  2268. scitex/scholar/url_finder/translators/individual/highbeam.py +23 -0
  2269. scitex/scholar/url_finder/translators/individual/highwire.py +23 -0
  2270. scitex/scholar/url_finder/translators/individual/highwire2.py +23 -0
  2271. scitex/scholar/url_finder/translators/individual/highwire_2_0.py +23 -0
  2272. scitex/scholar/url_finder/translators/individual/hindawi.py +23 -0
  2273. scitex/scholar/url_finder/translators/individual/hindawi_publishers.py +23 -0
  2274. scitex/scholar/url_finder/translators/individual/hispanic_american_periodical_index.py +23 -0
  2275. scitex/scholar/url_finder/translators/individual/homeland_security_digital_library.py +23 -0
  2276. scitex/scholar/url_finder/translators/individual/hudoc.py +23 -0
  2277. scitex/scholar/url_finder/translators/individual/huff_post.py +23 -0
  2278. scitex/scholar/url_finder/translators/individual/human_rights_watch.py +23 -0
  2279. scitex/scholar/url_finder/translators/individual/ibisworld.py +23 -0
  2280. scitex/scholar/url_finder/translators/individual/idea_alm.py +23 -0
  2281. scitex/scholar/url_finder/translators/individual/idref.py +23 -0
  2282. scitex/scholar/url_finder/translators/individual/ieee_computer_society.py +114 -0
  2283. scitex/scholar/url_finder/translators/individual/ieee_xplore.py +259 -0
  2284. scitex/scholar/url_finder/translators/individual/ietf.py +23 -0
  2285. scitex/scholar/url_finder/translators/individual/ign.py +23 -0
  2286. scitex/scholar/url_finder/translators/individual/imdb.py +23 -0
  2287. scitex/scholar/url_finder/translators/individual/imf.py +23 -0
  2288. scitex/scholar/url_finder/translators/individual/in_these_times.py +23 -0
  2289. scitex/scholar/url_finder/translators/individual/informationssystem_medienpaedagogik.py +23 -0
  2290. scitex/scholar/url_finder/translators/individual/informit_database.py +23 -0
  2291. scitex/scholar/url_finder/translators/individual/infotrac.py +23 -0
  2292. scitex/scholar/url_finder/translators/individual/ingenta_connect.py +23 -0
  2293. scitex/scholar/url_finder/translators/individual/ingentaconnect.py +23 -0
  2294. scitex/scholar/url_finder/translators/individual/inside_higher_ed.py +23 -0
  2295. scitex/scholar/url_finder/translators/individual/insignia_opac.py +23 -0
  2296. scitex/scholar/url_finder/translators/individual/inspire.py +23 -0
  2297. scitex/scholar/url_finder/translators/individual/institute_of_contemporary_art.py +23 -0
  2298. scitex/scholar/url_finder/translators/individual/institute_of_physics.py +23 -0
  2299. scitex/scholar/url_finder/translators/individual/integrum.py +23 -0
  2300. scitex/scholar/url_finder/translators/individual/intellixir.py +23 -0
  2301. scitex/scholar/url_finder/translators/individual/inter_research_science_center.py +112 -0
  2302. scitex/scholar/url_finder/translators/individual/international_nuclear_information_system.py +23 -0
  2303. scitex/scholar/url_finder/translators/individual/internet_archive.py +23 -0
  2304. scitex/scholar/url_finder/translators/individual/internet_archive_scholar.py +23 -0
  2305. scitex/scholar/url_finder/translators/individual/internet_archive_wayback.py +23 -0
  2306. scitex/scholar/url_finder/translators/individual/internet_archive_wayback_machine.py +23 -0
  2307. scitex/scholar/url_finder/translators/individual/invenio_rdm.py +23 -0
  2308. scitex/scholar/url_finder/translators/individual/inveniordm.py +23 -0
  2309. scitex/scholar/url_finder/translators/individual/io_port.py +23 -0
  2310. scitex/scholar/url_finder/translators/individual/iop.py +23 -0
  2311. scitex/scholar/url_finder/translators/individual/ipcc.py +23 -0
  2312. scitex/scholar/url_finder/translators/individual/isidore.py +23 -0
  2313. scitex/scholar/url_finder/translators/individual/istc.py +23 -0
  2314. scitex/scholar/url_finder/translators/individual/j_stage.py +23 -0
  2315. scitex/scholar/url_finder/translators/individual/jahrbuch.py +23 -0
  2316. scitex/scholar/url_finder/translators/individual/japan_times_online.py +23 -0
  2317. scitex/scholar/url_finder/translators/individual/jets.py +23 -0
  2318. scitex/scholar/url_finder/translators/individual/jisc_historical_texts.py +23 -0
  2319. scitex/scholar/url_finder/translators/individual/journal_of_electronic_publishing.py +23 -0
  2320. scitex/scholar/url_finder/translators/individual/journal_of_extension.py +23 -0
  2321. scitex/scholar/url_finder/translators/individual/journal_of_machine_learning_research.py +23 -0
  2322. scitex/scholar/url_finder/translators/individual/journal_of_religion_and_society.py +23 -0
  2323. scitex/scholar/url_finder/translators/individual/jrc_publications_repository.py +23 -0
  2324. scitex/scholar/url_finder/translators/individual/jstage.py +23 -0
  2325. scitex/scholar/url_finder/translators/individual/jstor.py +209 -0
  2326. scitex/scholar/url_finder/translators/individual/juricaf.py +23 -0
  2327. scitex/scholar/url_finder/translators/individual/jurion.py +23 -0
  2328. scitex/scholar/url_finder/translators/individual/juris.py +23 -0
  2329. scitex/scholar/url_finder/translators/individual/jurpc.py +23 -0
  2330. scitex/scholar/url_finder/translators/individual/k10plus_isbn.py +23 -0
  2331. scitex/scholar/url_finder/translators/individual/kanopy.py +23 -0
  2332. scitex/scholar/url_finder/translators/individual/karger.py +23 -0
  2333. scitex/scholar/url_finder/translators/individual/khaama_press.py +23 -0
  2334. scitex/scholar/url_finder/translators/individual/kitapyurdu_com.py +23 -0
  2335. scitex/scholar/url_finder/translators/individual/kommersant.py +23 -0
  2336. scitex/scholar/url_finder/translators/individual/korean_national_library.py +23 -0
  2337. scitex/scholar/url_finder/translators/individual/kstudy.py +23 -0
  2338. scitex/scholar/url_finder/translators/individual/l_annee_philologique.py +23 -0
  2339. scitex/scholar/url_finder/translators/individual/la_croix.py +23 -0
  2340. scitex/scholar/url_finder/translators/individual/la_nacion__argentina_.py +23 -0
  2341. scitex/scholar/url_finder/translators/individual/la_presse.py +23 -0
  2342. scitex/scholar/url_finder/translators/individual/la_republica__peru_.py +23 -0
  2343. scitex/scholar/url_finder/translators/individual/la_times.py +23 -0
  2344. scitex/scholar/url_finder/translators/individual/lagen_nu.py +23 -0
  2345. scitex/scholar/url_finder/translators/individual/landesbibliographie_baden_wurttemberg.py +23 -0
  2346. scitex/scholar/url_finder/translators/individual/lapham_s_quarterly.py +23 -0
  2347. scitex/scholar/url_finder/translators/individual/le_devoir.py +23 -0
  2348. scitex/scholar/url_finder/translators/individual/le_figaro.py +23 -0
  2349. scitex/scholar/url_finder/translators/individual/le_maitron.py +23 -0
  2350. scitex/scholar/url_finder/translators/individual/le_monde.py +23 -0
  2351. scitex/scholar/url_finder/translators/individual/le_monde_diplomatique.py +23 -0
  2352. scitex/scholar/url_finder/translators/individual/legifrance.py +23 -0
  2353. scitex/scholar/url_finder/translators/individual/legislative_insight.py +23 -0
  2354. scitex/scholar/url_finder/translators/individual/lexis_.py +23 -0
  2355. scitex/scholar/url_finder/translators/individual/lexisnexis.py +23 -0
  2356. scitex/scholar/url_finder/translators/individual/libraries_tasmania.py +23 -0
  2357. scitex/scholar/url_finder/translators/individual/library_catalog__aleph_.py +23 -0
  2358. scitex/scholar/url_finder/translators/individual/library_catalog__amicus_.py +23 -0
  2359. scitex/scholar/url_finder/translators/individual/library_catalog__aquabrowser_.py +23 -0
  2360. scitex/scholar/url_finder/translators/individual/library_catalog__bibliocommons_.py +23 -0
  2361. scitex/scholar/url_finder/translators/individual/library_catalog__blacklight_.py +23 -0
  2362. scitex/scholar/url_finder/translators/individual/library_catalog__capita_prism_.py +23 -0
  2363. scitex/scholar/url_finder/translators/individual/library_catalog__dra_.py +23 -0
  2364. scitex/scholar/url_finder/translators/individual/library_catalog__dynix_.py +23 -0
  2365. scitex/scholar/url_finder/translators/individual/library_catalog__encore_.py +23 -0
  2366. scitex/scholar/url_finder/translators/individual/library_catalog__innopac_.py +23 -0
  2367. scitex/scholar/url_finder/translators/individual/library_catalog__koha_.py +23 -0
  2368. scitex/scholar/url_finder/translators/individual/library_catalog__mango_.py +23 -0
  2369. scitex/scholar/url_finder/translators/individual/library_catalog__opals_.py +23 -0
  2370. scitex/scholar/url_finder/translators/individual/library_catalog__pica2_.py +23 -0
  2371. scitex/scholar/url_finder/translators/individual/library_catalog__pica_.py +23 -0
  2372. scitex/scholar/url_finder/translators/individual/library_catalog__pika_.py +23 -0
  2373. scitex/scholar/url_finder/translators/individual/library_catalog__polaris_.py +23 -0
  2374. scitex/scholar/url_finder/translators/individual/library_catalog__quolto_.py +23 -0
  2375. scitex/scholar/url_finder/translators/individual/library_catalog__rero_ils_.py +23 -0
  2376. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_.py +23 -0
  2377. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_elibrary_.py +23 -0
  2378. scitex/scholar/url_finder/translators/individual/library_catalog__slims_.py +23 -0
  2379. scitex/scholar/url_finder/translators/individual/library_catalog__tind_ils_.py +23 -0
  2380. scitex/scholar/url_finder/translators/individual/library_catalog__tinread_.py +23 -0
  2381. scitex/scholar/url_finder/translators/individual/library_catalog__tlcyouseemore_.py +23 -0
  2382. scitex/scholar/url_finder/translators/individual/library_catalog__visual_library_2021_.py +23 -0
  2383. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_.py +23 -0
  2384. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_7_.py +23 -0
  2385. scitex/scholar/url_finder/translators/individual/library_catalog__vtls_.py +23 -0
  2386. scitex/scholar/url_finder/translators/individual/library_genesis.py +23 -0
  2387. scitex/scholar/url_finder/translators/individual/library_hub_discover.py +23 -0
  2388. scitex/scholar/url_finder/translators/individual/library_of_congress_digital_collections.py +23 -0
  2389. scitex/scholar/url_finder/translators/individual/library_of_congress_isbn.py +23 -0
  2390. scitex/scholar/url_finder/translators/individual/libris_isbn.py +23 -0
  2391. scitex/scholar/url_finder/translators/individual/lingbuzz.py +180 -0
  2392. scitex/scholar/url_finder/translators/individual/lippincott_williams_and_wilkins.py +23 -0
  2393. scitex/scholar/url_finder/translators/individual/literary_hub.py +23 -0
  2394. scitex/scholar/url_finder/translators/individual/litres.py +23 -0
  2395. scitex/scholar/url_finder/translators/individual/livejournal.py +23 -0
  2396. scitex/scholar/url_finder/translators/individual/livivo.py +23 -0
  2397. scitex/scholar/url_finder/translators/individual/london_review_of_books.py +23 -0
  2398. scitex/scholar/url_finder/translators/individual/lookus.py +23 -0
  2399. scitex/scholar/url_finder/translators/individual/lulu.py +23 -0
  2400. scitex/scholar/url_finder/translators/individual/lwn_net.py +23 -0
  2401. scitex/scholar/url_finder/translators/individual/lww.py +23 -0
  2402. scitex/scholar/url_finder/translators/individual/mab2.py +23 -0
  2403. scitex/scholar/url_finder/translators/individual/magazines_russ_ru.py +23 -0
  2404. scitex/scholar/url_finder/translators/individual/mailman.py +23 -0
  2405. scitex/scholar/url_finder/translators/individual/mainichi_daily_news.py +23 -0
  2406. scitex/scholar/url_finder/translators/individual/marc.py +23 -0
  2407. scitex/scholar/url_finder/translators/individual/marcxml.py +23 -0
  2408. scitex/scholar/url_finder/translators/individual/mastodon.py +23 -0
  2409. scitex/scholar/url_finder/translators/individual/matbugat_ru.py +23 -0
  2410. scitex/scholar/url_finder/translators/individual/max_planck_institute_for_the_history_of_science_virtual_laboratory_library.py +23 -0
  2411. scitex/scholar/url_finder/translators/individual/mcv.py +23 -0
  2412. scitex/scholar/url_finder/translators/individual/mdpi.py +70 -0
  2413. scitex/scholar/url_finder/translators/individual/mdpi_journals.py +23 -0
  2414. scitex/scholar/url_finder/translators/individual/medes.py +23 -0
  2415. scitex/scholar/url_finder/translators/individual/medium.py +23 -0
  2416. scitex/scholar/url_finder/translators/individual/medline_nbib.py +23 -0
  2417. scitex/scholar/url_finder/translators/individual/medlinenbib.py +23 -0
  2418. scitex/scholar/url_finder/translators/individual/medra.py +23 -0
  2419. scitex/scholar/url_finder/translators/individual/metalib.py +23 -0
  2420. scitex/scholar/url_finder/translators/individual/mets.py +23 -0
  2421. scitex/scholar/url_finder/translators/individual/microbiology_society_journals.py +23 -0
  2422. scitex/scholar/url_finder/translators/individual/microsoft_academic.py +23 -0
  2423. scitex/scholar/url_finder/translators/individual/midas_journals.py +23 -0
  2424. scitex/scholar/url_finder/translators/individual/mikromarc.py +23 -0
  2425. scitex/scholar/url_finder/translators/individual/milli_kutuphane.py +23 -0
  2426. scitex/scholar/url_finder/translators/individual/mit_press_books.py +23 -0
  2427. scitex/scholar/url_finder/translators/individual/mods.py +23 -0
  2428. scitex/scholar/url_finder/translators/individual/mpg_pure.py +23 -0
  2429. scitex/scholar/url_finder/translators/individual/musee_du_louvre.py +23 -0
  2430. scitex/scholar/url_finder/translators/individual/nagoya_university_opac.py +23 -0
  2431. scitex/scholar/url_finder/translators/individual/nasa_ads.py +23 -0
  2432. scitex/scholar/url_finder/translators/individual/nasa_ntrs.py +23 -0
  2433. scitex/scholar/url_finder/translators/individual/national_academies_press.py +23 -0
  2434. scitex/scholar/url_finder/translators/individual/national_agriculture_library.py +23 -0
  2435. scitex/scholar/url_finder/translators/individual/national_archives_of_australia.py +23 -0
  2436. scitex/scholar/url_finder/translators/individual/national_archives_of_south_africa.py +23 -0
  2437. scitex/scholar/url_finder/translators/individual/national_bureau_of_economic_research.py +23 -0
  2438. scitex/scholar/url_finder/translators/individual/national_diet_library_catalogue.py +23 -0
  2439. scitex/scholar/url_finder/translators/individual/national_gallery_of_art___usa.py +23 -0
  2440. scitex/scholar/url_finder/translators/individual/national_gallery_of_australia.py +23 -0
  2441. scitex/scholar/url_finder/translators/individual/national_library_of_australia__new_catalog_.py +23 -0
  2442. scitex/scholar/url_finder/translators/individual/national_library_of_belarus.py +23 -0
  2443. scitex/scholar/url_finder/translators/individual/national_library_of_norway.py +23 -0
  2444. scitex/scholar/url_finder/translators/individual/national_library_of_poland_isbn.py +23 -0
  2445. scitex/scholar/url_finder/translators/individual/national_post.py +23 -0
  2446. scitex/scholar/url_finder/translators/individual/national_technical_reports_library.py +23 -0
  2447. scitex/scholar/url_finder/translators/individual/national_transportation_library_rosa_p.py +23 -0
  2448. scitex/scholar/url_finder/translators/individual/nature.py +23 -0
  2449. scitex/scholar/url_finder/translators/individual/nature_publishing_group.py +180 -0
  2450. scitex/scholar/url_finder/translators/individual/nber.py +23 -0
  2451. scitex/scholar/url_finder/translators/individual/ncbi_nucleotide.py +23 -0
  2452. scitex/scholar/url_finder/translators/individual/neural_information_processing_systems.py +23 -0
  2453. scitex/scholar/url_finder/translators/individual/new_left_review.py +23 -0
  2454. scitex/scholar/url_finder/translators/individual/new_zealand_herald.py +23 -0
  2455. scitex/scholar/url_finder/translators/individual/newlines_magazine.py +23 -0
  2456. scitex/scholar/url_finder/translators/individual/news_corp_australia.py +23 -0
  2457. scitex/scholar/url_finder/translators/individual/newsbank.py +23 -0
  2458. scitex/scholar/url_finder/translators/individual/newshub_co_nz.py +23 -0
  2459. scitex/scholar/url_finder/translators/individual/newsnettamedia.py +23 -0
  2460. scitex/scholar/url_finder/translators/individual/newspapers_com.py +23 -0
  2461. scitex/scholar/url_finder/translators/individual/noor_digital_library.py +23 -0
  2462. scitex/scholar/url_finder/translators/individual/note_html.py +23 -0
  2463. scitex/scholar/url_finder/translators/individual/note_markdown.py +23 -0
  2464. scitex/scholar/url_finder/translators/individual/notre_dame_philosophical_reviews.py +23 -0
  2465. scitex/scholar/url_finder/translators/individual/npr.py +23 -0
  2466. scitex/scholar/url_finder/translators/individual/nrc_nl.py +23 -0
  2467. scitex/scholar/url_finder/translators/individual/nrc_research_press.py +23 -0
  2468. scitex/scholar/url_finder/translators/individual/ntsb_accident_reports.py +23 -0
  2469. scitex/scholar/url_finder/translators/individual/nypl_menus.py +23 -0
  2470. scitex/scholar/url_finder/translators/individual/nypl_research_catalog.py +23 -0
  2471. scitex/scholar/url_finder/translators/individual/nytimes_com.py +23 -0
  2472. scitex/scholar/url_finder/translators/individual/nzz_ch.py +23 -0
  2473. scitex/scholar/url_finder/translators/individual/oapen.py +23 -0
  2474. scitex/scholar/url_finder/translators/individual/oclc_worldcat_firstsearch.py +23 -0
  2475. scitex/scholar/url_finder/translators/individual/oecd.py +23 -0
  2476. scitex/scholar/url_finder/translators/individual/oecd_ilibrary.py +23 -0
  2477. scitex/scholar/url_finder/translators/individual/ohiolink.py +23 -0
  2478. scitex/scholar/url_finder/translators/individual/open_conf.py +23 -0
  2479. scitex/scholar/url_finder/translators/individual/open_knowledge_repository.py +23 -0
  2480. scitex/scholar/url_finder/translators/individual/open_worldcat.py +23 -0
  2481. scitex/scholar/url_finder/translators/individual/openalex.py +23 -0
  2482. scitex/scholar/url_finder/translators/individual/openalex_json.py +23 -0
  2483. scitex/scholar/url_finder/translators/individual/openedition_books.py +23 -0
  2484. scitex/scholar/url_finder/translators/individual/openedition_journals.py +157 -0
  2485. scitex/scholar/url_finder/translators/individual/openjur.py +23 -0
  2486. scitex/scholar/url_finder/translators/individual/optical_society_of_america.py +23 -0
  2487. scitex/scholar/url_finder/translators/individual/optimization_online.py +23 -0
  2488. scitex/scholar/url_finder/translators/individual/orcid.py +285 -0
  2489. scitex/scholar/url_finder/translators/individual/osa.py +23 -0
  2490. scitex/scholar/url_finder/translators/individual/osf_preprints.py +23 -0
  2491. scitex/scholar/url_finder/translators/individual/osti_energy_citations.py +23 -0
  2492. scitex/scholar/url_finder/translators/individual/ovid.py +23 -0
  2493. scitex/scholar/url_finder/translators/individual/ovid_tagged.py +23 -0
  2494. scitex/scholar/url_finder/translators/individual/oxford.py +142 -0
  2495. scitex/scholar/url_finder/translators/individual/oxford_dictionaries_premium.py +23 -0
  2496. scitex/scholar/url_finder/translators/individual/oxford_english_dictionary.py +23 -0
  2497. scitex/scholar/url_finder/translators/individual/oxford_music_and_art_online.py +23 -0
  2498. scitex/scholar/url_finder/translators/individual/oxford_reference.py +23 -0
  2499. scitex/scholar/url_finder/translators/individual/oxford_university_press.py +23 -0
  2500. scitex/scholar/url_finder/translators/individual/ozon_ru.py +23 -0
  2501. scitex/scholar/url_finder/translators/individual/pajhwok_afghan_news.py +23 -0
  2502. scitex/scholar/url_finder/translators/individual/papers_past.py +23 -0
  2503. scitex/scholar/url_finder/translators/individual/paris_review.py +23 -0
  2504. scitex/scholar/url_finder/translators/individual/pastebin.py +23 -0
  2505. scitex/scholar/url_finder/translators/individual/patents___uspto.py +23 -0
  2506. scitex/scholar/url_finder/translators/individual/pc_gamer.py +23 -0
  2507. scitex/scholar/url_finder/translators/individual/pc_games.py +23 -0
  2508. scitex/scholar/url_finder/translators/individual/peeters.py +23 -0
  2509. scitex/scholar/url_finder/translators/individual/pei_archival_information_network.py +23 -0
  2510. scitex/scholar/url_finder/translators/individual/pep_web.py +23 -0
  2511. scitex/scholar/url_finder/translators/individual/perceiving_systems.py +23 -0
  2512. scitex/scholar/url_finder/translators/individual/perlego.py +23 -0
  2513. scitex/scholar/url_finder/translators/individual/philosopher_s_imprint.py +23 -0
  2514. scitex/scholar/url_finder/translators/individual/philpapers.py +23 -0
  2515. scitex/scholar/url_finder/translators/individual/pkp_catalog_systems.py +23 -0
  2516. scitex/scholar/url_finder/translators/individual/pleade.py +23 -0
  2517. scitex/scholar/url_finder/translators/individual/plos.py +114 -0
  2518. scitex/scholar/url_finder/translators/individual/plos_journals.py +23 -0
  2519. scitex/scholar/url_finder/translators/individual/pnas.py +23 -0
  2520. scitex/scholar/url_finder/translators/individual/polygon.py +23 -0
  2521. scitex/scholar/url_finder/translators/individual/potsdamer_neueste_nachrichten.py +23 -0
  2522. scitex/scholar/url_finder/translators/individual/prc_history_review.py +23 -0
  2523. scitex/scholar/url_finder/translators/individual/preprints_org.py +23 -0
  2524. scitex/scholar/url_finder/translators/individual/primo.py +23 -0
  2525. scitex/scholar/url_finder/translators/individual/primo_2018.py +23 -0
  2526. scitex/scholar/url_finder/translators/individual/primo_normalized_xml.py +23 -0
  2527. scitex/scholar/url_finder/translators/individual/probing_the_past.py +23 -0
  2528. scitex/scholar/url_finder/translators/individual/project_gutenberg.py +23 -0
  2529. scitex/scholar/url_finder/translators/individual/project_muse.py +23 -0
  2530. scitex/scholar/url_finder/translators/individual/promed.py +23 -0
  2531. scitex/scholar/url_finder/translators/individual/proquest.py +23 -0
  2532. scitex/scholar/url_finder/translators/individual/proquest_ebook_central.py +23 -0
  2533. scitex/scholar/url_finder/translators/individual/proquest_policyfile.py +23 -0
  2534. scitex/scholar/url_finder/translators/individual/protein_data_bank.py +23 -0
  2535. scitex/scholar/url_finder/translators/individual/pubfactory_journals.py +23 -0
  2536. scitex/scholar/url_finder/translators/individual/public_record_office_victoria.py +23 -0
  2537. scitex/scholar/url_finder/translators/individual/publications_du_quebec.py +23 -0
  2538. scitex/scholar/url_finder/translators/individual/publications_office_of_the_european_union.py +23 -0
  2539. scitex/scholar/url_finder/translators/individual/pubmed.py +324 -0
  2540. scitex/scholar/url_finder/translators/individual/pubmed_central.py +69 -0
  2541. scitex/scholar/url_finder/translators/individual/pubmed_xml.py +23 -0
  2542. scitex/scholar/url_finder/translators/individual/pubpub.py +23 -0
  2543. scitex/scholar/url_finder/translators/individual/pypi.py +23 -0
  2544. scitex/scholar/url_finder/translators/individual/qatar_digital_library.py +23 -0
  2545. scitex/scholar/url_finder/translators/individual/queensland_state_archives.py +23 -0
  2546. scitex/scholar/url_finder/translators/individual/r_packages.py +23 -0
  2547. scitex/scholar/url_finder/translators/individual/radio_free_europe__radio_liberty.py +23 -0
  2548. scitex/scholar/url_finder/translators/individual/rand.py +23 -0
  2549. scitex/scholar/url_finder/translators/individual/rdf.py +23 -0
  2550. scitex/scholar/url_finder/translators/individual/rechtspraak_nl.py +23 -0
  2551. scitex/scholar/url_finder/translators/individual/redalyc.py +23 -0
  2552. scitex/scholar/url_finder/translators/individual/reddit.py +23 -0
  2553. scitex/scholar/url_finder/translators/individual/referbibix.py +23 -0
  2554. scitex/scholar/url_finder/translators/individual/refworks_tagged.py +23 -0
  2555. scitex/scholar/url_finder/translators/individual/regeringskansliet.py +23 -0
  2556. scitex/scholar/url_finder/translators/individual/repec___econpapers.py +23 -0
  2557. scitex/scholar/url_finder/translators/individual/repec___ideas.py +23 -0
  2558. scitex/scholar/url_finder/translators/individual/repec_ideas.py +23 -0
  2559. scitex/scholar/url_finder/translators/individual/research_square.py +23 -0
  2560. scitex/scholar/url_finder/translators/individual/researchgate.py +23 -0
  2561. scitex/scholar/url_finder/translators/individual/retsinformation.py +23 -0
  2562. scitex/scholar/url_finder/translators/individual/reuters.py +23 -0
  2563. scitex/scholar/url_finder/translators/individual/ris.py +23 -0
  2564. scitex/scholar/url_finder/translators/individual/rock__paper__shotgun.py +23 -0
  2565. scitex/scholar/url_finder/translators/individual/roll_call.py +23 -0
  2566. scitex/scholar/url_finder/translators/individual/rsc.py +23 -0
  2567. scitex/scholar/url_finder/translators/individual/rsc_publishing.py +23 -0
  2568. scitex/scholar/url_finder/translators/individual/russian_state_library.py +23 -0
  2569. scitex/scholar/url_finder/translators/individual/sacramento_bee.py +23 -0
  2570. scitex/scholar/url_finder/translators/individual/sae_papers.py +23 -0
  2571. scitex/scholar/url_finder/translators/individual/safari_books_online.py +23 -0
  2572. scitex/scholar/url_finder/translators/individual/sage.py +23 -0
  2573. scitex/scholar/url_finder/translators/individual/sage_journals.py +175 -0
  2574. scitex/scholar/url_finder/translators/individual/sage_knowledge.py +23 -0
  2575. scitex/scholar/url_finder/translators/individual/saildart.py +23 -0
  2576. scitex/scholar/url_finder/translators/individual/salt_research_archives.py +23 -0
  2577. scitex/scholar/url_finder/translators/individual/sbn_it.py +23 -0
  2578. scitex/scholar/url_finder/translators/individual/scholars_portal_journals.py +23 -0
  2579. scitex/scholar/url_finder/translators/individual/scholia.py +23 -0
  2580. scitex/scholar/url_finder/translators/individual/schweizer_radio_und_fernsehen_srf.py +23 -0
  2581. scitex/scholar/url_finder/translators/individual/scielo.py +23 -0
  2582. scitex/scholar/url_finder/translators/individual/sciencedirect.py +113 -0
  2583. scitex/scholar/url_finder/translators/individual/scinapse.py +110 -0
  2584. scitex/scholar/url_finder/translators/individual/scopus.py +23 -0
  2585. scitex/scholar/url_finder/translators/individual/semantic_scholar.py +23 -0
  2586. scitex/scholar/url_finder/translators/individual/semantics_visual_library.py +23 -0
  2587. scitex/scholar/url_finder/translators/individual/sfu_ipinch.py +23 -0
  2588. scitex/scholar/url_finder/translators/individual/silverchair.py +283 -0
  2589. scitex/scholar/url_finder/translators/individual/sipri.py +23 -0
  2590. scitex/scholar/url_finder/translators/individual/sirs_knowledge_source.py +23 -0
  2591. scitex/scholar/url_finder/translators/individual/slate.py +23 -0
  2592. scitex/scholar/url_finder/translators/individual/slideshare.py +23 -0
  2593. scitex/scholar/url_finder/translators/individual/slub_dresden.py +23 -0
  2594. scitex/scholar/url_finder/translators/individual/sora.py +23 -0
  2595. scitex/scholar/url_finder/translators/individual/springer.py +117 -0
  2596. scitex/scholar/url_finder/translators/individual/springer_link.py +23 -0
  2597. scitex/scholar/url_finder/translators/individual/ssoar.py +23 -0
  2598. scitex/scholar/url_finder/translators/individual/ssrn.py +63 -0
  2599. scitex/scholar/url_finder/translators/individual/stack_exchange.py +23 -0
  2600. scitex/scholar/url_finder/translators/individual/standard_ebooks.py +23 -0
  2601. scitex/scholar/url_finder/translators/individual/stanford_encyclopedia_of_philosophy.py +23 -0
  2602. scitex/scholar/url_finder/translators/individual/stanford_university_press.py +23 -0
  2603. scitex/scholar/url_finder/translators/individual/state_records_office_of_western_australia.py +23 -0
  2604. scitex/scholar/url_finder/translators/individual/state_records_office_wa.py +23 -0
  2605. scitex/scholar/url_finder/translators/individual/stitcher.py +23 -0
  2606. scitex/scholar/url_finder/translators/individual/store_norske_leksikon.py +23 -0
  2607. scitex/scholar/url_finder/translators/individual/stuff_co_nz.py +23 -0
  2608. scitex/scholar/url_finder/translators/individual/substack.py +23 -0
  2609. scitex/scholar/url_finder/translators/individual/sud_ouest.py +23 -0
  2610. scitex/scholar/url_finder/translators/individual/sueddeutsche_de.py +23 -0
  2611. scitex/scholar/url_finder/translators/individual/summon_2.py +23 -0
  2612. scitex/scholar/url_finder/translators/individual/superlib.py +23 -0
  2613. scitex/scholar/url_finder/translators/individual/svenska_dagbladet.py +23 -0
  2614. scitex/scholar/url_finder/translators/individual/sveriges_radio.py +23 -0
  2615. scitex/scholar/url_finder/translators/individual/svt_nyheter.py +23 -0
  2616. scitex/scholar/url_finder/translators/individual/tagesspiegel.py +23 -0
  2617. scitex/scholar/url_finder/translators/individual/talis_aspire.py +23 -0
  2618. scitex/scholar/url_finder/translators/individual/talisprism.py +23 -0
  2619. scitex/scholar/url_finder/translators/individual/tatknigafund.py +23 -0
  2620. scitex/scholar/url_finder/translators/individual/tatpressa_ru.py +23 -0
  2621. scitex/scholar/url_finder/translators/individual/taylor___francis_ebooks.py +23 -0
  2622. scitex/scholar/url_finder/translators/individual/taylor_and_francis_nejm.py +23 -0
  2623. scitex/scholar/url_finder/translators/individual/taylor_francis.py +23 -0
  2624. scitex/scholar/url_finder/translators/individual/taylor_francis_nejm.py +23 -0
  2625. scitex/scholar/url_finder/translators/individual/taz_de.py +23 -0
  2626. scitex/scholar/url_finder/translators/individual/tei.py +23 -0
  2627. scitex/scholar/url_finder/translators/individual/tesis_doctorals_en_xarxa.py +23 -0
  2628. scitex/scholar/url_finder/translators/individual/the_art_newspaper.py +23 -0
  2629. scitex/scholar/url_finder/translators/individual/the_atlantic.py +23 -0
  2630. scitex/scholar/url_finder/translators/individual/the_boston_globe.py +23 -0
  2631. scitex/scholar/url_finder/translators/individual/the_chronicle_of_higher_education.py +23 -0
  2632. scitex/scholar/url_finder/translators/individual/the_daily_beast.py +23 -0
  2633. scitex/scholar/url_finder/translators/individual/the_economic_times___the_times_of_india.py +23 -0
  2634. scitex/scholar/url_finder/translators/individual/the_economist.py +23 -0
  2635. scitex/scholar/url_finder/translators/individual/the_free_dictionary.py +23 -0
  2636. scitex/scholar/url_finder/translators/individual/the_globe_and_mail.py +23 -0
  2637. scitex/scholar/url_finder/translators/individual/the_guardian.py +23 -0
  2638. scitex/scholar/url_finder/translators/individual/the_hamilton_spectator.py +23 -0
  2639. scitex/scholar/url_finder/translators/individual/the_hindu.py +23 -0
  2640. scitex/scholar/url_finder/translators/individual/the_independent.py +23 -0
  2641. scitex/scholar/url_finder/translators/individual/the_intercept.py +23 -0
  2642. scitex/scholar/url_finder/translators/individual/the_met.py +23 -0
  2643. scitex/scholar/url_finder/translators/individual/the_microfinance_gateway.py +23 -0
  2644. scitex/scholar/url_finder/translators/individual/the_nation.py +23 -0
  2645. scitex/scholar/url_finder/translators/individual/the_national_archives__uk_.py +23 -0
  2646. scitex/scholar/url_finder/translators/individual/the_new_republic.py +23 -0
  2647. scitex/scholar/url_finder/translators/individual/the_new_york_review_of_books.py +23 -0
  2648. scitex/scholar/url_finder/translators/individual/the_new_yorker.py +23 -0
  2649. scitex/scholar/url_finder/translators/individual/the_open_library.py +23 -0
  2650. scitex/scholar/url_finder/translators/individual/the_straits_times.py +23 -0
  2651. scitex/scholar/url_finder/translators/individual/the_telegraph.py +23 -0
  2652. scitex/scholar/url_finder/translators/individual/the_times_and_sunday_times.py +23 -0
  2653. scitex/scholar/url_finder/translators/individual/the_times_of_israel.py +23 -0
  2654. scitex/scholar/url_finder/translators/individual/themarker.py +23 -0
  2655. scitex/scholar/url_finder/translators/individual/theory_of_computing.py +23 -0
  2656. scitex/scholar/url_finder/translators/individual/thesesfr.py +23 -0
  2657. scitex/scholar/url_finder/translators/individual/thieme.py +23 -0
  2658. scitex/scholar/url_finder/translators/individual/time_com.py +23 -0
  2659. scitex/scholar/url_finder/translators/individual/timesmachine.py +23 -0
  2660. scitex/scholar/url_finder/translators/individual/tony_blair_institute.py +23 -0
  2661. scitex/scholar/url_finder/translators/individual/tony_blair_institute_for_global_change.py +23 -0
  2662. scitex/scholar/url_finder/translators/individual/toronto_star.py +23 -0
  2663. scitex/scholar/url_finder/translators/individual/transportation_research_board.py +23 -0
  2664. scitex/scholar/url_finder/translators/individual/treesearch.py +23 -0
  2665. scitex/scholar/url_finder/translators/individual/trove.py +23 -0
  2666. scitex/scholar/url_finder/translators/individual/tumblr.py +23 -0
  2667. scitex/scholar/url_finder/translators/individual/tv_by_the_numbers.py +23 -0
  2668. scitex/scholar/url_finder/translators/individual/tvnz.py +23 -0
  2669. scitex/scholar/url_finder/translators/individual/twitter.py +23 -0
  2670. scitex/scholar/url_finder/translators/individual/ubiquity_journals.py +23 -0
  2671. scitex/scholar/url_finder/translators/individual/uchicago_vufind.py +23 -0
  2672. scitex/scholar/url_finder/translators/individual/unapi.py +23 -0
  2673. scitex/scholar/url_finder/translators/individual/unesco.py +23 -0
  2674. scitex/scholar/url_finder/translators/individual/university_of_california_press_books.py +23 -0
  2675. scitex/scholar/url_finder/translators/individual/university_of_chicago_press_books.py +23 -0
  2676. scitex/scholar/url_finder/translators/individual/university_of_wisconsin_madison_libraries_catalog.py +23 -0
  2677. scitex/scholar/url_finder/translators/individual/university_press_scholarship.py +23 -0
  2678. scitex/scholar/url_finder/translators/individual/unqualified_dublin_core_rdf.py +23 -0
  2679. scitex/scholar/url_finder/translators/individual/unz_print_archive.py +23 -0
  2680. scitex/scholar/url_finder/translators/individual/upcommons.py +23 -0
  2681. scitex/scholar/url_finder/translators/individual/uptodate_references.py +23 -0
  2682. scitex/scholar/url_finder/translators/individual/us_national_archives_research_catalog.py +23 -0
  2683. scitex/scholar/url_finder/translators/individual/usenix.py +23 -0
  2684. scitex/scholar/url_finder/translators/individual/vanity_fair.py +23 -0
  2685. scitex/scholar/url_finder/translators/individual/verniana.py +23 -0
  2686. scitex/scholar/url_finder/translators/individual/verniana_jules_verne_studies.py +23 -0
  2687. scitex/scholar/url_finder/translators/individual/verso_books.py +23 -0
  2688. scitex/scholar/url_finder/translators/individual/vice.py +23 -0
  2689. scitex/scholar/url_finder/translators/individual/victoria___albert_museum.py +23 -0
  2690. scitex/scholar/url_finder/translators/individual/vimeo.py +23 -0
  2691. scitex/scholar/url_finder/translators/individual/vlex.py +23 -0
  2692. scitex/scholar/url_finder/translators/individual/voxeu.py +23 -0
  2693. scitex/scholar/url_finder/translators/individual/wall_street_journal.py +23 -0
  2694. scitex/scholar/url_finder/translators/individual/wanfang_data.py +23 -0
  2695. scitex/scholar/url_finder/translators/individual/washington_monthly.py +23 -0
  2696. scitex/scholar/url_finder/translators/individual/washington_post.py +23 -0
  2697. scitex/scholar/url_finder/translators/individual/web_of_science.py +23 -0
  2698. scitex/scholar/url_finder/translators/individual/web_of_science_nextgen.py +23 -0
  2699. scitex/scholar/url_finder/translators/individual/web_of_science_tagged.py +23 -0
  2700. scitex/scholar/url_finder/translators/individual/welt_online.py +23 -0
  2701. scitex/scholar/url_finder/translators/individual/westlaw_uk.py +23 -0
  2702. scitex/scholar/url_finder/translators/individual/who.py +23 -0
  2703. scitex/scholar/url_finder/translators/individual/wikidata.py +23 -0
  2704. scitex/scholar/url_finder/translators/individual/wikidata_quickstatements.py +23 -0
  2705. scitex/scholar/url_finder/translators/individual/wikileaks_plusd.py +23 -0
  2706. scitex/scholar/url_finder/translators/individual/wikimedia_commons.py +23 -0
  2707. scitex/scholar/url_finder/translators/individual/wikipedia.py +23 -0
  2708. scitex/scholar/url_finder/translators/individual/wikipedia_citation_templates.py +23 -0
  2709. scitex/scholar/url_finder/translators/individual/wikisource.py +23 -0
  2710. scitex/scholar/url_finder/translators/individual/wikiwand.py +23 -0
  2711. scitex/scholar/url_finder/translators/individual/wiktionary.py +23 -0
  2712. scitex/scholar/url_finder/translators/individual/wildlife_biology_in_practice.py +23 -0
  2713. scitex/scholar/url_finder/translators/individual/wiley.py +181 -0
  2714. scitex/scholar/url_finder/translators/individual/wiley_online_library.py +23 -0
  2715. scitex/scholar/url_finder/translators/individual/wilson_center_digital_archive.py +23 -0
  2716. scitex/scholar/url_finder/translators/individual/winnipeg_free_press.py +23 -0
  2717. scitex/scholar/url_finder/translators/individual/wipo.py +23 -0
  2718. scitex/scholar/url_finder/translators/individual/wired.py +23 -0
  2719. scitex/scholar/url_finder/translators/individual/wiso.py +23 -0
  2720. scitex/scholar/url_finder/translators/individual/womennews.py +23 -0
  2721. scitex/scholar/url_finder/translators/individual/world_bank.py +23 -0
  2722. scitex/scholar/url_finder/translators/individual/world_digital_library.py +23 -0
  2723. scitex/scholar/url_finder/translators/individual/world_history_connected.py +23 -0
  2724. scitex/scholar/url_finder/translators/individual/world_shakespeare_bibliography_online.py +23 -0
  2725. scitex/scholar/url_finder/translators/individual/worldcat_discovery_service.py +23 -0
  2726. scitex/scholar/url_finder/translators/individual/xml_contextobject.py +23 -0
  2727. scitex/scholar/url_finder/translators/individual/yandex_books.py +23 -0
  2728. scitex/scholar/url_finder/translators/individual/ynet.py +23 -0
  2729. scitex/scholar/url_finder/translators/individual/youtube.py +23 -0
  2730. scitex/scholar/url_finder/translators/individual/ypfs.py +23 -0
  2731. scitex/scholar/url_finder/translators/individual/ypsf.py +23 -0
  2732. scitex/scholar/url_finder/translators/individual/zbmath.py +102 -0
  2733. scitex/scholar/url_finder/translators/individual/zenodo.py +23 -0
  2734. scitex/scholar/url_finder/translators/individual/ziponline.py +23 -0
  2735. scitex/scholar/url_finder/translators/individual/zobodat.py +23 -0
  2736. scitex/scholar/url_finder/translators/individual/zotero_org.py +23 -0
  2737. scitex/scholar/url_finder/translators/individual/zotero_rdf.py +23 -0
  2738. scitex/scholar/url_finder/translators/individual/zoterobib.py +23 -0
  2739. scitex/scholar/utils/__init__.py +22 -0
  2740. scitex/scholar/utils/bibtex/__init__.py +9 -0
  2741. scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
  2742. scitex/scholar/utils/cleanup/__init__.py +8 -0
  2743. scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
  2744. scitex/scholar/utils/create_demo_movie.sh +49 -0
  2745. scitex/scholar/utils/text/_TextNormalizer.py +407 -0
  2746. scitex/scholar/utils/text/__init__.py +9 -0
  2747. scitex/scholar/zotero/__init__.py +38 -0
  2748. scitex/session/README.md +187 -0
  2749. scitex/session/__init__.py +51 -0
  2750. scitex/session/_lifecycle.py +736 -0
  2751. scitex/session/_manager.py +102 -0
  2752. scitex/session/template.py +122 -0
  2753. scitex/sh/README.md +58 -0
  2754. scitex/sh/__init__.py +92 -0
  2755. scitex/sh/_execute.py +221 -0
  2756. scitex/sh/_security.py +67 -0
  2757. scitex/sh/_types.py +29 -0
  2758. scitex/stats/QUICKSTART.md +260 -0
  2759. scitex/stats/README.md +1085 -0
  2760. scitex/stats/TODO.md +19 -0
  2761. scitex/stats/__init__.py +35 -0
  2762. scitex/stats/correct/__init__.py +21 -0
  2763. scitex/stats/correct/_correct_bonferroni.py +551 -0
  2764. scitex/stats/correct/_correct_fdr.py +634 -0
  2765. scitex/stats/correct/_correct_holm.py +548 -0
  2766. scitex/stats/correct/_correct_sidak.py +499 -0
  2767. scitex/stats/descriptive/__init__.py +85 -0
  2768. scitex/stats/descriptive/_circular.py +540 -0
  2769. scitex/stats/descriptive/_describe.py +219 -0
  2770. scitex/stats/descriptive/_nan.py +518 -0
  2771. scitex/stats/descriptive/_real.py +189 -0
  2772. scitex/stats/docs/API.md +165 -0
  2773. scitex/stats/docs/ARCHITECTURE.md +732 -0
  2774. scitex/stats/docs/MIGRATION_GUIDE.md +253 -0
  2775. scitex/stats/docs/PROGRESS.md +635 -0
  2776. scitex/stats/docs/SUMMARY.md +241 -0
  2777. scitex/stats/docs/TODO.md +181 -0
  2778. scitex/stats/docs/ax_parameter_migration.md +125 -0
  2779. scitex/stats/effect_sizes/__init__.py +41 -0
  2780. scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
  2781. scitex/stats/effect_sizes/_cohens_d.py +342 -0
  2782. scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
  2783. scitex/stats/effect_sizes/_eta_squared.py +302 -0
  2784. scitex/stats/effect_sizes/_prob_superiority.py +296 -0
  2785. scitex/stats/posthoc/__init__.py +19 -0
  2786. scitex/stats/posthoc/_dunnett.py +463 -0
  2787. scitex/stats/posthoc/_games_howell.py +383 -0
  2788. scitex/stats/posthoc/_tukey_hsd.py +367 -0
  2789. scitex/stats/power/__init__.py +19 -0
  2790. scitex/stats/power/_power.py +433 -0
  2791. scitex/stats/run_all.sh +46 -0
  2792. scitex/stats/template.py +119 -0
  2793. scitex/stats/tests/categorical/__init__.py +20 -0
  2794. scitex/stats/tests/categorical/_test_chi2.py +708 -0
  2795. scitex/stats/tests/categorical/_test_cochran_q.py +609 -0
  2796. scitex/stats/tests/categorical/_test_fisher.py +585 -0
  2797. scitex/stats/tests/categorical/_test_mcnemar.py +567 -0
  2798. scitex/stats/tests/correlation/__init__.py +32 -0
  2799. scitex/stats/tests/correlation/_test_kendall.py +508 -0
  2800. scitex/stats/tests/correlation/_test_pearson.py +588 -0
  2801. scitex/stats/tests/correlation/_test_spearman.py +485 -0
  2802. scitex/stats/tests/correlation/_test_theilsen.py +193 -0
  2803. scitex/stats/tests/nonparametric/__init__.py +23 -0
  2804. scitex/stats/tests/nonparametric/_test_brunner_munzel.py +559 -0
  2805. scitex/stats/tests/nonparametric/_test_friedman.py +595 -0
  2806. scitex/stats/tests/nonparametric/_test_kruskal.py +557 -0
  2807. scitex/stats/tests/nonparametric/_test_mannwhitneyu.py +518 -0
  2808. scitex/stats/tests/nonparametric/_test_wilcoxon.py +505 -0
  2809. scitex/stats/tests/normality/__init__.py +17 -0
  2810. scitex/stats/tests/normality/_test_ks.py +702 -0
  2811. scitex/stats/tests/normality/_test_shapiro.py +498 -0
  2812. scitex/stats/tests/parametric/__init__.py +27 -0
  2813. scitex/stats/tests/parametric/_test_anova.py +625 -0
  2814. scitex/stats/tests/parametric/_test_anova_2way.py +665 -0
  2815. scitex/stats/tests/parametric/_test_anova_rm.py +717 -0
  2816. scitex/stats/tests/parametric/_test_ttest.py +835 -0
  2817. scitex/stats/utils/__init__.py +62 -0
  2818. scitex/stats/utils/_effect_size.py +985 -0
  2819. scitex/stats/utils/_formatters.py +270 -0
  2820. scitex/stats/utils/_normalizers.py +927 -0
  2821. scitex/stats/utils/_power.py +433 -0
  2822. scitex/str/__init__.py +111 -0
  2823. scitex/str/_clean_path.py +79 -0
  2824. scitex/str/_color_text.py +52 -0
  2825. scitex/str/_decapitalize.py +58 -0
  2826. scitex/str/_factor_out_digits.py +281 -0
  2827. scitex/str/_format_plot_text.py +498 -0
  2828. scitex/str/_grep.py +48 -0
  2829. scitex/str/_latex.py +155 -0
  2830. scitex/str/_latex_fallback.py +578 -0
  2831. scitex/str/_mask_api.py +39 -0
  2832. scitex/str/_mask_api_key.py +8 -0
  2833. scitex/str/_parse.py +166 -0
  2834. scitex/str/_print_block.py +47 -0
  2835. scitex/str/_print_debug.py +68 -0
  2836. scitex/str/_printc.py +60 -0
  2837. scitex/str/_readable_bytes.py +38 -0
  2838. scitex/str/_remove_ansi.py +23 -0
  2839. scitex/str/_replace.py +134 -0
  2840. scitex/str/_search.py +127 -0
  2841. scitex/str/_squeeze_space.py +36 -0
  2842. scitex/template/.legacy/_clone_project.py +271 -0
  2843. scitex/template/ANALYSIS.md +202 -0
  2844. scitex/template/README.md +154 -0
  2845. scitex/template/__init__.py +107 -0
  2846. scitex/template/_clone_project.py +145 -0
  2847. scitex/template/_copy.py +97 -0
  2848. scitex/template/_customize.py +114 -0
  2849. scitex/template/_git_strategy.py +123 -0
  2850. scitex/template/_rename.py +64 -0
  2851. scitex/template/clone_pip_project.py +100 -0
  2852. scitex/template/clone_research.py +104 -0
  2853. scitex/template/clone_singularity.py +104 -0
  2854. scitex/template/clone_writer_directory.py +100 -0
  2855. scitex/tex/__init__.py +10 -0
  2856. scitex/tex/_preview.py +103 -0
  2857. scitex/tex/_to_vec.py +116 -0
  2858. scitex/torch/__init__.py +18 -0
  2859. scitex/torch/_apply_to.py +34 -0
  2860. scitex/torch/_nan_funcs.py +77 -0
  2861. scitex/types/_ArrayLike.py +64 -0
  2862. scitex/types/_ColorLike.py +21 -0
  2863. scitex/types/__init__.py +14 -0
  2864. scitex/types/_is_listed_X.py +70 -0
  2865. scitex/units.py +291 -0
  2866. scitex/utils/__init__.py +22 -0
  2867. scitex/utils/_compress_hdf5.py +127 -0
  2868. scitex/utils/_email.py +139 -0
  2869. scitex/utils/_grid.py +150 -0
  2870. scitex/utils/_notify.py +250 -0
  2871. scitex/utils/_search.py +121 -0
  2872. scitex/utils/_verify_scitex_format.py +589 -0
  2873. scitex/utils/_verify_scitex_format_v01.py +370 -0
  2874. scitex/utils/template.py +122 -0
  2875. scitex/web/__init__.py +38 -0
  2876. scitex/web/_search_pubmed.py +484 -0
  2877. scitex/web/_summarize_url.py +158 -0
  2878. scitex/writer/.legacy/Writer_v01-refactored.py +189 -0
  2879. scitex/writer/.legacy/_compile.py +352 -0
  2880. scitex/writer/README.md +426 -0
  2881. scitex/writer/Writer.py +441 -0
  2882. scitex/writer/__init__.py +68 -0
  2883. scitex/writer/_clone_writer_project.py +151 -0
  2884. scitex/writer/_compile/__init__.py +97 -0
  2885. scitex/writer/_compile/_parser.py +62 -0
  2886. scitex/writer/_compile/_runner.py +239 -0
  2887. scitex/writer/_compile/_validator.py +45 -0
  2888. scitex/writer/_compile_async.py +133 -0
  2889. scitex/writer/_project/__init__.py +28 -0
  2890. scitex/writer/_project/_create.py +106 -0
  2891. scitex/writer/_project/_trees.py +68 -0
  2892. scitex/writer/_project/_validate.py +62 -0
  2893. scitex/writer/_validate_tree_structures.py +208 -0
  2894. scitex/writer/dataclasses/__init__.py +46 -0
  2895. scitex/writer/dataclasses/config/_CONSTANTS.py +47 -0
  2896. scitex/writer/dataclasses/config/_WriterConfig.py +180 -0
  2897. scitex/writer/dataclasses/config/__init__.py +9 -0
  2898. scitex/writer/dataclasses/contents/_ManuscriptContents.py +246 -0
  2899. scitex/writer/dataclasses/contents/_RevisionContents.py +127 -0
  2900. scitex/writer/dataclasses/contents/_SupplementaryContents.py +114 -0
  2901. scitex/writer/dataclasses/contents/__init__.py +9 -0
  2902. scitex/writer/dataclasses/core/_Document.py +147 -0
  2903. scitex/writer/dataclasses/core/_DocumentSection.py +561 -0
  2904. scitex/writer/dataclasses/core/__init__.py +7 -0
  2905. scitex/writer/dataclasses/results/_CompilationResult.py +166 -0
  2906. scitex/writer/dataclasses/results/_LaTeXIssue.py +105 -0
  2907. scitex/writer/dataclasses/results/__init__.py +7 -0
  2908. scitex/writer/dataclasses/tree/MINIMUM_FILES.md +121 -0
  2909. scitex/writer/dataclasses/tree/_ConfigTree.py +82 -0
  2910. scitex/writer/dataclasses/tree/_ManuscriptTree.py +85 -0
  2911. scitex/writer/dataclasses/tree/_RevisionTree.py +95 -0
  2912. scitex/writer/dataclasses/tree/_ScriptsTree.py +111 -0
  2913. scitex/writer/dataclasses/tree/_SharedTree.py +102 -0
  2914. scitex/writer/dataclasses/tree/_SupplementaryTree.py +97 -0
  2915. scitex/writer/dataclasses/tree/__init__.py +23 -0
  2916. scitex/writer/tests/__init__.py +3 -0
  2917. scitex/writer/utils/.legacy_git_retry.py +167 -0
  2918. scitex/writer/utils/__init__.py +7 -0
  2919. scitex/writer/utils/_parse_latex_logs.py +139 -0
  2920. scitex/writer/utils/_parse_script_args.py +159 -0
  2921. scitex/writer/utils/_watch.py +96 -0
  2922. scitex-2.1.1.dist-info/METADATA +744 -0
  2923. scitex-2.1.1.dist-info/RECORD +2926 -0
  2924. scitex-2.1.1.dist-info/WHEEL +4 -0
  2925. scitex-2.1.1.dist-info/entry_points.txt +2 -0
  2926. scitex-2.1.1.dist-info/licenses/LICENSE +21 -0
scitex/ai/viewed-ai.md ADDED
@@ -0,0 +1,4984 @@
1
+ 4,982 lines & 13,608 words
2
+
3
+ # Repository View
4
+ #### Repository: `/data/gpfs/projects/punim2354/ywatanabe/SciTeX-Code/src/scitex/ai`
5
+ #### Output: `/data/gpfs/projects/punim2354/ywatanabe/SciTeX-Code/src/scitex/ai/viewed-ai.md`
6
+
7
+ ## Configurations
8
+ ##### Tree:
9
+ - Maximum depth: 3
10
+ - .gitignore respected
11
+ - Blacklist expresssions:
12
+ ```plaintext
13
+ node_modules,.*,*.py[cod],__pycache__,*.elc,env,env-[0-9]*.[0-9]*,[1-2][0-9][0-9
14
+ ][0-9]Y-*,htmlcov,*.sif,*.img,*.image,*.sandbox,*.log,logs,build,dist,*_back,*_b
15
+ ackup,*old*,.old,RUNNING,FINISHED
16
+ ```
17
+
18
+ #### File content:
19
+ - Number of head: 50
20
+ - Whitelist extensions:
21
+ ```plaintext
22
+ .txt,.md,.org,.el,.sh,.py,.yaml,.yml,.json,.def
23
+ ```
24
+ - Blacklist expressions:
25
+ ```plaintext
26
+ *.mat,*.npy,*.npz,*.csv,*.pkl,*.jpg,*.jpeg,*.mp4,*.pth,*.db*,*.out,*.err,*.cbm,*
27
+ .pt,*.egg-info,*.aux,*.pdf,*.png,*.tiff,*.wav
28
+ ```
29
+
30
+
31
+ ## Tree contents
32
+ .
33
+ ├── activation
34
+ │   ├── _define.py
35
+ │   └── __init__.py
36
+ ├── classification
37
+ │   ├── Classifier.py
38
+ │   ├── CrossValidationExperiment.py
39
+ │   ├── examples
40
+ │   │   └── timeseries_cv_demo.py
41
+ │   ├── __init__.py
42
+ │   ├── README.md
43
+ │   ├── reporters
44
+ │   │   ├── _BaseClassificationReporter.py
45
+ │   │   ├── _ClassificationReporter.py
46
+ │   │   ├── __init__.py
47
+ │   │   ├── _MultiClassificationReporter.py
48
+ │   │   └── _SingleClassificationReporter.py
49
+ │   └── timeseries
50
+ │   ├── __init__.py
51
+ │   ├── _normalize_timestamp.py
52
+ │   ├── README.md
53
+ │   ├── run_all.sh
54
+ │   ├── _TimeSeriesBlockingSplit.py
55
+ │   ├── _TimeSeriesCalendarSplit.py
56
+ │   ├── _TimeSeriesMetadata.py
57
+ │   ├── _TimeSeriesSlidingWindowSplit.py
58
+ │   ├── _TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py
59
+ │   ├── _TimeSeriesStrategy.py
60
+ │   └── _TimeSeriesStratifiedSplit.py
61
+ ├── clustering
62
+ │   ├── __init__.py
63
+ │   ├── _pca.py
64
+ │   └── _umap.py
65
+ ├── feature_extraction
66
+ │   ├── __init__.py
67
+ │   └── vit.py
68
+ ├── _gen_ai
69
+ │   ├── _Anthropic.py
70
+ │   ├── _BaseGenAI.py
71
+ │   ├── _calc_cost.py
72
+ │   ├── _DeepSeek.py
73
+ │   ├── _format_output_func.py
74
+ │   ├── _genai_factory.py
75
+ │   ├── _Google.py
76
+ │   ├── _Groq.py
77
+ │   ├── __init__.py
78
+ │   ├── _Llama.py
79
+ │   ├── _OpenAI.py
80
+ │   ├── _PARAMS.py
81
+ │   └── _Perplexity.py
82
+ ├── __init__.py
83
+ ├── loss
84
+ │   ├── __init__.py
85
+ │   ├── _L1L2Losses.py
86
+ │   └── multi_task_loss.py
87
+ ├── metrics
88
+ │   ├── _calc_bacc_from_conf_mat.py
89
+ │   ├── _calc_bacc.py
90
+ │   ├── _calc_clf_report.py
91
+ │   ├── _calc_conf_mat.py
92
+ │   ├── _calc_feature_importance.py
93
+ │   ├── _calc_mcc.py
94
+ │   ├── _calc_pre_rec_auc.py
95
+ │   ├── _calc_roc_auc.py
96
+ │   ├── _calc_seizure_prediction_metrics.py
97
+ │   ├── _calc_silhouette_score.py
98
+ │   ├── __init__.py
99
+ │   └── _normalize_labels.py
100
+ ├── optim
101
+ │   ├── _get_set.py
102
+ │   ├── __init__.py
103
+ │   ├── MIGRATION.md
104
+ │   ├── _optimizers.py
105
+ │   └── Ranger_Deep_Learning_Optimizer
106
+ │   ├── __init__.py
107
+ │   ├── LICENSE
108
+ │   ├── ranger-init.jpg
109
+ │   ├── ranger-with-gc-options.jpg
110
+ │   ├── README.md
111
+ │   └── setup.py
112
+ ├── plt
113
+ │   ├── __init__.py
114
+ │   ├── _plot_conf_mat.py
115
+ │   ├── _plot_feature_importance.py
116
+ │   ├── _plot_learning_curve.py
117
+ │   ├── _plot_optuna_study.py
118
+ │   ├── _plot_pre_rec_curve.py
119
+ │   └── _plot_roc_curve.py
120
+ ├── README.md
121
+ ├── sampling
122
+ │   └── undersample.py
123
+ ├── sk
124
+ │   ├── _clf.py
125
+ │   ├── __init__.py
126
+ │   └── _to_sktime.py
127
+ ├── sklearn
128
+ │   ├── clf.py
129
+ │   ├── __init__.py
130
+ │   └── to_sktime.py
131
+ ├── training
132
+ │   ├── _EarlyStopping.py
133
+ │   ├── __init__.py
134
+ │   ├── _LearningCurveLogger.py
135
+ │   └── legacy
136
+ │   ├── early_stopping.py
137
+ │   └── learning_curve_logger.py
138
+ ├── utils
139
+ │   ├── _check_params.py
140
+ │   ├── _default_dataset.py
141
+ │   ├── _format_samples_for_sktime.py
142
+ │   ├── grid_search.py
143
+ │   ├── __init__.py
144
+ │   ├── _label_encoder.py
145
+ │   ├── _merge_labels.py
146
+ │   ├── _sliding_window_data_augmentation.py
147
+ │   ├── _under_sample.py
148
+ │   └── _verify_n_gpus.py
149
+ └── viewed-ai.md
150
+
151
+
152
+ ## File contents
153
+
154
+ ### `./activation/_define.py`
155
+
156
+ ```python
157
+ import torch.nn as nn
158
+
159
+
160
+ def define(act_str):
161
+ acts_dict = {
162
+ "relu": nn.ReLU(),
163
+ "swish": nn.SiLU(),
164
+ "mish": nn.Mish(),
165
+ "lrelu": nn.LeakyReLU(0.1),
166
+ }
167
+ return acts_dict[act_str]
168
+
169
+ ...
170
+ ```
171
+
172
+
173
+ ### `./activation/__init__.py`
174
+
175
+ ```python
176
+ #!/usr/bin/env python3
177
+ """Scitex act module."""
178
+
179
+ from ._define import define
180
+
181
+ __all__ = [
182
+ "define",
183
+ ]
184
+
185
+ ...
186
+ ```
187
+
188
+
189
+ ### `./classification/Classifier.py`
190
+
191
+ ```python
192
+ #!/usr/bin/env python3
193
+ # -*- coding: utf-8 -*-
194
+ # Time-stamp: "2024-12-12 06:49:15 (ywatanabe)"
195
+ # File: ./scitex_repo/src/scitex/ai/Classifier.py
196
+
197
+ THIS_FILE = (
198
+ "/data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/ai/Classifier.py"
199
+ )
200
+
201
+ """
202
+ Functionality:
203
+ * Provides a unified interface for initializing various scikit-learn classifiers
204
+ * Supports optional preprocessing with StandardScaler
205
+
206
+ Input:
207
+ * Classifier name as string
208
+ * Optional class weights for imbalanced datasets
209
+ * Optional scaler for feature preprocessing
210
+
211
+ Output:
212
+ * Initialized classifier or pipeline with scaler
213
+
214
+ Prerequisites:
215
+ * scikit-learn
216
+ * Optional: CatBoost for CatBoostClassifier
217
+ """
218
+
219
+ from typing import Dict, List, Optional, Union
220
+
221
+ from sklearn.base import BaseEstimator as _BaseEstimator
222
+ from sklearn.discriminant_analysis import (
223
+ QuadraticDiscriminantAnalysis as _QuadraticDiscriminantAnalysis,
224
+ )
225
+ from sklearn.ensemble import AdaBoostClassifier as _AdaBoostClassifier
226
+ from sklearn.gaussian_process import (
227
+ GaussianProcessClassifier as _GaussianProcessClassifier,
228
+ )
229
+ from sklearn.linear_model import LogisticRegression as _LogisticRegression
230
+ from sklearn.linear_model import (
231
+ PassiveAggressiveClassifier as _PassiveAggressiveClassifier,
232
+ )
233
+ from sklearn.linear_model import Perceptron as _Perceptron
234
+ from sklearn.linear_model import RidgeClassifier as _RidgeClassifier
235
+ from sklearn.linear_model import SGDClassifier as _SGDClassifier
236
+ from sklearn.neighbors import KNeighborsClassifier as _KNeighborsClassifier
237
+ from sklearn.pipeline import Pipeline as _Pipeline
238
+ from sklearn.pipeline import make_pipeline as _make_pipeline
239
+ from sklearn.preprocessing import StandardScaler as _StandardScaler
240
+ from sklearn.svm import SVC as _SVC
241
+ from sklearn.svm import LinearSVC as _LinearSVC
242
+
243
+ ...
244
+ ```
245
+
246
+
247
+ ### `./classification/CrossValidationExperiment.py`
248
+
249
+ ```python
250
+ #!/usr/bin/env python3
251
+ # -*- coding: utf-8 -*-
252
+ # Timestamp: "2025-09-22 00:54:37 (ywatanabe)"
253
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/cross_validation.py
254
+ # ----------------------------------------
255
+ from __future__ import annotations
256
+ import os
257
+ __FILE__ = __file__
258
+ __DIR__ = os.path.dirname(__FILE__)
259
+ # ----------------------------------------
260
+
261
+ """
262
+ Cross-validation helper for streamlined machine learning experiments.
263
+
264
+ Provides a high-level interface for running cross-validation with
265
+ automatic metric tracking, validation, and report generation.
266
+ """
267
+
268
+ import time
269
+ from datetime import datetime
270
+ from pathlib import Path
271
+ from typing import Any, Callable, Dict, List, Optional, Union
272
+
273
+ import numpy as np
274
+ import pandas as pd
275
+ from sklearn.model_selection import BaseCrossValidator, StratifiedKFold
276
+
277
+ from .reporters import ClassificationReporter
278
+
279
+
280
+ class CrossValidationExperiment:
281
+ """
282
+ Streamlined cross-validation experiment runner.
283
+
284
+ This class handles:
285
+ - Cross-validation splitting
286
+ - Model training and evaluation
287
+ - Automatic metric calculation
288
+ - Hyperparameter tracking
289
+ - Progress monitoring
290
+ - Report generation
291
+
292
+ Parameters
293
+ ----------
294
+ name : str
295
+ Experiment name
296
+ model_fn : Callable
297
+ Function that returns a model instance
298
+ cv : BaseCrossValidator, optional
299
+ Cross-validation splitter (default: 5-fold stratified)
300
+
301
+ ...
302
+ ```
303
+
304
+
305
+ ### `./classification/examples/timeseries_cv_demo.py`
306
+
307
+ ```python
308
+ #!/usr/bin/env python3
309
+ # -*- coding: utf-8 -*-
310
+ # Timestamp: "2025-09-21 20:20:00 (ywatanabe)"
311
+ # File: timeseries_cv_demo.py
312
+
313
+ """
314
+ Examples demonstrating the time series cross-validation modules.
315
+
316
+ This script shows how to use:
317
+ 1. Individual time series CV splitters
318
+ 2. The intelligent TimeSeriesCVCoordinator
319
+ 3. Integration with classification reporters
320
+ """
321
+
322
+ import numpy as np
323
+ import pandas as pd
324
+ from sklearn.linear_model import LogisticRegression
325
+ from sklearn.ensemble import RandomForestClassifier
326
+ from sklearn.metrics import balanced_accuracy_score
327
+ import matplotlib.pyplot as plt
328
+ from typing import List, Tuple
329
+
330
+
331
+ def generate_synthetic_timeseries(
332
+ n_samples: int = 1000,
333
+ n_features: int = 10,
334
+ n_groups: int = None,
335
+ noise_level: float = 0.1,
336
+ imbalance_ratio: float = 0.5,
337
+ ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
338
+ """
339
+ Generate synthetic time series data for demonstration.
340
+
341
+ Returns
342
+ -------
343
+ X : Features
344
+ y : Labels (binary)
345
+ timestamps : Time points
346
+ groups : Group labels (if n_groups specified)
347
+ """
348
+ np.random.seed(42)
349
+
350
+ # Generate features with temporal correlation
351
+ X = np.zeros((n_samples, n_features))
352
+ for i in range(n_features):
353
+ # AR(1) process with different parameters
354
+ phi = 0.3 + i * 0.05 # Autocorrelation
355
+ X[:, i] = np.random.randn(n_samples)
356
+ for t in range(1, n_samples):
357
+ X[t, i] = phi * X[t-1, i] + np.sqrt(1 - phi**2) * np.random.randn()
358
+
359
+ ...
360
+ ```
361
+
362
+
363
+ ### `./classification/__init__.py`
364
+
365
+ ```python
366
+ #!/usr/bin/env python3
367
+ """Classification utilities with unified API."""
368
+
369
+ # Import reporters
370
+ from .reporters import ClassificationReporter, SingleTaskClassificationReporter
371
+
372
+ # Import other existing modules
373
+ from .Classifier import Classifier
374
+ from .CrossValidationExperiment import CrossValidationExperiment, quick_experiment
375
+
376
+ # Import time series module
377
+ from . import timeseries
378
+
379
+ # Import time series CV utilities from submodule
380
+ from .timeseries import (
381
+ TimeSeriesStratifiedSplit,
382
+ TimeSeriesBlockingSplit,
383
+ TimeSeriesSlidingWindowSplit,
384
+ TimeSeriesCalendarSplit,
385
+ TimeSeriesStrategy,
386
+ TimeSeriesMetadata,
387
+ )
388
+
389
+ # Backward compatibility alias
390
+ CVExperiment = CrossValidationExperiment
391
+
392
+ __all__ = [
393
+ # Reporters
394
+ "ClassificationReporter",
395
+ "SingleTaskClassificationReporter",
396
+ # Classifier management
397
+ "Classifier",
398
+ # Cross-validation
399
+ "CrossValidationExperiment",
400
+ "CVExperiment", # Alias
401
+ "quick_experiment",
402
+ # Time series module
403
+ "timeseries",
404
+ # Time series CV splitters (re-exported from timeseries module)
405
+ "TimeSeriesStratifiedSplit",
406
+ "TimeSeriesBlockingSplit",
407
+ "TimeSeriesSlidingWindowSplit",
408
+ "TimeSeriesCalendarSplit",
409
+ "TimeSeriesStrategy",
410
+ "TimeSeriesMetadata",
411
+ ]
412
+
413
+ ...
414
+ ```
415
+
416
+
417
+ ### `./classification/README.md`
418
+
419
+ ```markdown
420
+ # SciTeX Classification Module
421
+
422
+ A comprehensive classification module for scientific machine learning experiments with standardized reporting, validation, and publication-ready outputs.
423
+
424
+ ## Overview
425
+
426
+ The classification module provides:
427
+ - **Modular reporter utilities** for metric calculation and storage
428
+ - **Single and multi-task classification reporters** with automatic file organization
429
+ - **Validation utilities** to ensure completeness and scientific rigor
430
+ - **Publication-ready exports** in multiple formats (CSV, LaTeX, Markdown)
431
+ - **Decoupled architecture** without hard dependencies on scitex.io
432
+
433
+ ## Directory Structure
434
+
435
+ ```
436
+ src/scitex/ai/classification/
437
+ ├── __init__.py
438
+ ├── README.md (this file)
439
+ ├── _Classifiers.py # Classifier implementations
440
+ ├── Classifier.py # Server for classifier services
441
+ ├── _ClassificationReporter.py # Base reporter class
442
+ ├── _SingleClassificationReporter.py # Single-task reporter
443
+ ├── _MultiClassificationReporter.py # Multi-task reporter
444
+ └── reporter_utils/ # Modular utilities
445
+ ├── __init__.py
446
+ ├── metrics.py # Pure metric calculations
447
+ ├── storage.py # Standalone storage (no scitex.io dependency)
448
+ ├── data_models.py # Type-safe data models
449
+ ├── validation.py # Validation and completeness checks
450
+ ├── aggregation.py # Cross-fold aggregation
451
+ └── reporting.py # Report generation utilities
452
+ ```
453
+
454
+ ## Quick Start
455
+
456
+ ### Basic Usage
457
+
458
+ ```python
459
+ from scitex.ai.classification.reporter_utils import (
460
+ calc_bacc,
461
+ calc_mcc,
462
+ MetricStorage,
463
+ create_summary_table,
464
+ generate_markdown_report
465
+ )
466
+
467
+ # Calculate metrics
468
+ ba = calc_bacc(y_true, y_pred, fold=0)
469
+ mcc = calc_mcc(y_true, y_pred, fold=0)
470
+ ```
471
+
472
+ ...
473
+ ```
474
+
475
+
476
+ ### `./classification/reporters/_BaseClassificationReporter.py`
477
+
478
+ ```python
479
+ #!/usr/bin/env python3
480
+ # -*- coding: utf-8 -*-
481
+ # Timestamp: "2025-09-22 15:00:10 (ywatanabe)"
482
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/reporters/_BaseClassificationReporter.py
483
+ # ----------------------------------------
484
+ from __future__ import annotations
485
+ import os
486
+ __FILE__ = __file__
487
+ __DIR__ = os.path.dirname(__FILE__)
488
+ # ----------------------------------------
489
+
490
+ """
491
+ Base Classification Reporter - Unified API Interface.
492
+
493
+ This module provides the base class and interface for all classification reporters,
494
+ ensuring consistent APIs and behavior across single-task and multi-task scenarios.
495
+ """
496
+
497
+ from abc import ABC, abstractmethod
498
+ from pathlib import Path
499
+ from typing import Any, Dict, List, Optional, Union
500
+
501
+ import numpy as np
502
+ from scitex import logging
503
+
504
+ logger = logging.getLogger(__name__)
505
+
506
+
507
+ class BaseClassificationReporter(ABC):
508
+ """
509
+ Abstract base class for all classification reporters.
510
+
511
+ This class defines the unified API that all classification reporters must implement,
512
+ ensuring consistent parameter names, method signatures, and behavior.
513
+
514
+ Parameters
515
+ ----------
516
+ output_dir : Union[str, Path]
517
+ Base directory for outputs. If None, creates timestamped directory.
518
+ precision : int, default 3
519
+ Number of decimal places for numerical outputs
520
+ """
521
+
522
+ def __init__(
523
+ self,
524
+ output_dir: Union[str, Path],
525
+ precision: int = 3,
526
+ verbose=True,
527
+ ):
528
+ self.precision = precision
529
+
530
+ ...
531
+ ```
532
+
533
+
534
+ ### `./classification/reporters/_ClassificationReporter.py`
535
+
536
+ ```python
537
+ #!/usr/bin/env python3
538
+ # -*- coding: utf-8 -*-
539
+ # Timestamp: "2025-10-02 06:38:58 (ywatanabe)"
540
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/reporters/_ClassificationReporter.py
541
+ # ----------------------------------------
542
+ from __future__ import annotations
543
+ import os
544
+ __FILE__ = __file__
545
+ __DIR__ = os.path.dirname(__FILE__)
546
+ # ----------------------------------------
547
+
548
+ """
549
+ Unified Classification Reporter.
550
+
551
+ A single, unified reporter that handles both single-task and multi-task
552
+ classification scenarios seamlessly.
553
+ """
554
+
555
+ from pathlib import Path
556
+ from typing import Any, Dict, List, Optional, Union
557
+
558
+ import numpy as np
559
+
560
+ # Import base class and single reporter for internal use
561
+ from ._BaseClassificationReporter import (BaseClassificationReporter,
562
+ ReporterConfig)
563
+ from ._SingleClassificationReporter import SingleTaskClassificationReporter
564
+ from .reporter_utils.storage import MetricStorage
565
+
566
+
567
+ class ClassificationReporter(BaseClassificationReporter):
568
+ """
569
+ Unified classification reporter for single and multi-task scenarios.
570
+
571
+ This reporter automatically adapts to your use case:
572
+ - Single task: Just use it without specifying tasks
573
+ - Multiple tasks: Specify tasks upfront or create them dynamically
574
+ - Seamless switching between single and multi-task workflows
575
+
576
+ Features:
577
+ - Comprehensive metrics calculation (balanced accuracy, MCC, ROC-AUC, PR-AUC, etc.)
578
+ - Automated visualization generation:
579
+ * Confusion matrices
580
+ * ROC and Precision-Recall curves
581
+ * Feature importance plots (via plotter)
582
+ * CV aggregation plots with faded fold lines
583
+ * Comprehensive metrics dashboard
584
+ - Multi-format report generation (Org, Markdown, LaTeX, HTML, DOCX, PDF)
585
+ - Cross-validation support with automatic fold aggregation
586
+ - Multi-task classification tracking
587
+
588
+ ...
589
+ ```
590
+
591
+
592
+ ### `./classification/reporters/__init__.py`
593
+
594
+ ```python
595
+ #!/usr/bin/env python3
596
+ """Reporter implementations for classification."""
597
+
598
+ # Export the unified reporter and single-task reporter
599
+ from ._ClassificationReporter import ClassificationReporter
600
+ from ._SingleClassificationReporter import SingleTaskClassificationReporter
601
+
602
+ __all__ = [
603
+ "ClassificationReporter",
604
+ "SingleTaskClassificationReporter",
605
+ ]
606
+ ...
607
+ ```
608
+
609
+
610
+ ### `./classification/reporters/_MultiClassificationReporter.py`
611
+
612
+ ```python
613
+ #!/usr/bin/env python3
614
+ # -*- coding: utf-8 -*-
615
+ # Timestamp: "2025-09-22 15:00:55 (ywatanabe)"
616
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/reporters/_MultiClassificationReporter.py
617
+ # ----------------------------------------
618
+ from __future__ import annotations
619
+ import os
620
+ __FILE__ = __file__
621
+ __DIR__ = os.path.dirname(__FILE__)
622
+ # ----------------------------------------
623
+
624
+ """
625
+ Improved Multiple Tasks Classification Reporter with unified API.
626
+
627
+ Enhanced version that addresses all identified issues:
628
+ - Unified API interface matching SingleTaskClassificationReporter
629
+ - Lazy directory creation
630
+ - Numerical precision control
631
+ - Graceful plotting with error handling
632
+ - Consistent parameter names
633
+ """
634
+
635
+ from pathlib import Path
636
+ from typing import Any, Dict, List, Optional, Union
637
+
638
+ import numpy as np
639
+
640
+ # Import base class and improved single reporter
641
+ from ._BaseClassificationReporter import (BaseClassificationReporter,
642
+ ReporterConfig)
643
+ from ._SingleClassificationReporter import SingleTaskClassificationReporter
644
+ from .reporter_utils.storage import MetricStorage
645
+
646
+
647
+ class MultipleTasksClassificationReporter(BaseClassificationReporter):
648
+ """
649
+ Improved multi-task classification reporter with unified API.
650
+
651
+ This reporter manages multiple SingleTaskClassificationReporter instances,
652
+ one for each target/task, providing a unified interface for multi-task scenarios.
653
+
654
+ Key improvements:
655
+ - Same API as SingleTaskClassificationReporter (calculate_metrics method)
656
+ - Lazy directory creation (no empty folders)
657
+ - Numerical precision control
658
+ - Graceful plotting with proper error handling
659
+ - Consistent parameter names across all methods
660
+
661
+ Parameters
662
+ ----------
663
+
664
+ ...
665
+ ```
666
+
667
+
668
+ ### `./classification/reporters/_SingleClassificationReporter.py`
669
+
670
+ ```python
671
+ #!/usr/bin/env python3
672
+ # -*- coding: utf-8 -*-
673
+ # Timestamp: "2025-10-03 01:21:52 (ywatanabe)"
674
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/reporters/_SingleClassificationReporter.py
675
+ # ----------------------------------------
676
+ from __future__ import annotations
677
+ import os
678
+ __FILE__ = (
679
+ "./src/scitex/ml/classification/reporters/_SingleClassificationReporter.py"
680
+ )
681
+ __DIR__ = os.path.dirname(__FILE__)
682
+ # ----------------------------------------
683
+
684
+ __FILE__ = __file__
685
+
686
+ from pprint import pprint
687
+
688
+ """
689
+ Improved Single Classification Reporter with unified API.
690
+
691
+ Enhanced version that addresses all identified issues:
692
+ - Unified API interface
693
+ - Lazy directory creation
694
+ - Numerical precision control
695
+ - Graceful plotting with error handling
696
+ - Consistent parameter names
697
+ """
698
+
699
+ from pathlib import Path
700
+ from typing import Any, Dict, List, Optional, Union
701
+
702
+ import numpy as np
703
+ import pandas as pd
704
+ from scitex.logging import getLogger
705
+
706
+ # Import base class and utilities
707
+ from ._BaseClassificationReporter import (BaseClassificationReporter,
708
+ ReporterConfig)
709
+ # Import original metric calculation functions (these are good)
710
+ from .reporter_utils import (calc_bacc, calc_clf_report, calc_conf_mat,
711
+ calc_mcc, calc_pre_rec_auc, calc_roc_auc)
712
+ from .reporter_utils._Plotter import Plotter
713
+ from .reporter_utils.reporting import (create_summary_statistics,
714
+ generate_latex_report,
715
+ generate_markdown_report,
716
+ generate_org_report)
717
+ from .reporter_utils.storage import MetricStorage, save_metric
718
+
719
+ logger = getLogger(__name__)
720
+
721
+
722
+ ...
723
+ ```
724
+
725
+
726
+ ### `./classification/timeseries/__init__.py`
727
+
728
+ ```python
729
+ #!/usr/bin/env python3
730
+ # -*- coding: utf-8 -*-
731
+ # Timestamp: "2025-09-21 20:45:00 (ywatanabe)"
732
+ # File: timeseries/__init__.py
733
+
734
+ """
735
+ Time series cross-validation utilities for classification.
736
+
737
+ This module provides specialized cross-validation strategies for time series data,
738
+ ensuring proper temporal ordering and preventing data leakage.
739
+ """
740
+
741
+ # Import splitters
742
+ from ._TimeSeriesStratifiedSplit import TimeSeriesStratifiedSplit
743
+ from ._TimeSeriesBlockingSplit import TimeSeriesBlockingSplit
744
+ from ._TimeSeriesSlidingWindowSplit import TimeSeriesSlidingWindowSplit
745
+ from ._TimeSeriesCalendarSplit import TimeSeriesCalendarSplit
746
+
747
+ # Import metadata and strategy
748
+ from ._TimeSeriesStrategy import TimeSeriesStrategy
749
+ from ._TimeSeriesMetadata import TimeSeriesMetadata
750
+
751
+ # Import timestamp normalizer
752
+ from ._normalize_timestamp import normalize_timestamp
753
+
754
+ __all__ = [
755
+ # Main time series CV splitters
756
+ "TimeSeriesStratifiedSplit",
757
+ "TimeSeriesBlockingSplit",
758
+ "TimeSeriesSlidingWindowSplit",
759
+ "TimeSeriesCalendarSplit",
760
+
761
+ # Support classes
762
+ "TimeSeriesStrategy",
763
+ "TimeSeriesMetadata",
764
+
765
+ # Timestamp normalizer
766
+ "normalize_timestamp",
767
+ ]
768
+ ...
769
+ ```
770
+
771
+
772
+ ### `./classification/timeseries/_normalize_timestamp.py`
773
+
774
+ ```python
775
+ #!/usr/bin/env python3
776
+ # -*- coding: utf-8 -*-
777
+ # Timestamp: "2025-09-22 15:21:06 (ywatanabe)"
778
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/timeseries/_normalize_timestamp.py
779
+ # ----------------------------------------
780
+ from __future__ import annotations
781
+ import os
782
+ __FILE__ = __file__
783
+ __DIR__ = os.path.dirname(__FILE__)
784
+ # ----------------------------------------
785
+
786
+ """
787
+ Timestamp Standardization Utilities
788
+
789
+ Functionality:
790
+ - Standardizes timestamps to consistent format defined in CONFIG.FORMATS.TIMESTAMP
791
+ - Handles various input formats (datetime objects, strings, timestamps)
792
+ - Provides UTC normalization
793
+ - Ensures consistent timestamp formatting across the codebase
794
+
795
+ Input formats supported:
796
+ - datetime objects (with or without timezone)
797
+ - Unix timestamps (int/float)
798
+ - Various string formats
799
+
800
+ Output:
801
+ - Standardized timestamp strings in format: "%Y-%m-%d %H:%M:%S.%f"
802
+ - UTC normalized timestamps
803
+ - Validation utilities
804
+
805
+ Prerequisites:
806
+ - CONFIG.FORMATS.TIMESTAMP for standard format
807
+ """
808
+
809
+ """Imports"""
810
+ import argparse
811
+ from datetime import datetime, timezone
812
+ from typing import Union
813
+
814
+ import scitex as stx
815
+
816
+ """Parameters"""
817
+ # Default standard format if CONFIG not available
818
+ try:
819
+ CONFIG = stx.io.load_configs()
820
+ STANDARD_FORMAT = CONFIG.FORMATS.TIMESTAMP
821
+ except (AttributeError, ImportError):
822
+ # Fallback to a sensible default
823
+ STANDARD_FORMAT = "%Y-%m-%d %H:%M:%S.%f"
824
+
825
+
826
+ ...
827
+ ```
828
+
829
+
830
+ ### `./classification/timeseries/README.md`
831
+
832
+ ```markdown
833
+ # Time Series Cross-Validation Module
834
+
835
+ Production-ready time series cross-validation utilities with temporal integrity guarantees and enhanced visualizations.
836
+
837
+ ## 🎯 Overview
838
+
839
+ This module provides specialized cross-validation strategies for time series data, ensuring:
840
+ - **Temporal order preservation** (no future data leakage)
841
+ - **Visual verification** with scatter plot overlays
842
+ - **SciTeX framework integration** for standalone testing
843
+ - **Support for multiple time series scenarios**
844
+ - **Calendar-aware splitting** with business logic
845
+ - **Robust timestamp handling** across formats
846
+
847
+ ## 📊 Visual Comparison of Splitters
848
+
849
+ ### TimeSeriesStratifiedSplit
850
+ ```
851
+ Maintains class balance while preserving temporal order
852
+ Supports optional validation set between train and test
853
+
854
+ Without validation: With validation (val_ratio=0.15):
855
+ Fold 0: [TTTTTTTTTT] [SSS] Fold 0: [TTTTTTTT] [VV] [SSS]
856
+ Fold 1: [TTTTTTTTTTTT] [SSS] Fold 1: [TTTTTTTTTT][VV] [SSS]
857
+ Fold 2: [TTTTTTTTTTTTTT][SSS] Fold 2: [TTTTTTTTTTTT][VV][SSS]
858
+ └─ Expanding ─┘ Test └─Expanding─┘ Val Test
859
+
860
+ Legend: T=Train, V=Validation, S=teSt
861
+ ```
862
+
863
+ ### TimeSeriesSlidingWindowSplit
864
+ ```
865
+ Fixed-size windows sliding through time
866
+ Optional validation carved from training window
867
+
868
+ Without validation: With validation (val_ratio=0.2):
869
+ Fold 0: [TTTT] [SS] Fold 0: [TTT][V] [SS]
870
+ Fold 1: [TTTT] [SS] Fold 1: [TTT][V] [SS]
871
+ Fold 2: [TTTT] [SS] Fold 2: [TTT][V] [SS]
872
+ └─Win─┘ Gap └Test┘ └Train┘Val Gap└Test┘
873
+
874
+ Legend: T=Train, V=Validation, S=teSt, Gap=temporal separation
875
+ ```
876
+
877
+ ### TimeSeriesBlockingSplit
878
+ ```
879
+ Multiple subjects with temporal separation per subject
880
+ Each subject gets its own train/val/test split
881
+
882
+ Without validation: With validation (val_ratio=0.15):
883
+ ```
884
+
885
+ ...
886
+ ```
887
+
888
+
889
+ ### `./classification/timeseries/run_all.sh`
890
+
891
+ ```bash
892
+ #!/bin/bash
893
+ # -*- coding: utf-8 -*-
894
+ # Timestamp: "2025-09-22 17:50:10 (ywatanabe)"
895
+ # File: ./src/scitex/ml/classification/timeseries/run_all.sh
896
+
897
+ THIS_DIR="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)"
898
+ LOG_PATH="$THIS_DIR/.$(basename $0).log"
899
+ echo > "$LOG_PATH"
900
+
901
+ BLACK='\033[0;30m'
902
+ LIGHT_GRAY='\033[0;37m'
903
+ GREEN='\033[0;32m'
904
+ YELLOW='\033[0;33m'
905
+ RED='\033[0;31m'
906
+ NC='\033[0m' # No Color
907
+
908
+ echo_info() { echo -e "${LIGHT_GRAY}$1${NC}"; }
909
+ echo_success() { echo -e "${GREEN}$1${NC}"; }
910
+ echo_warning() { echo -e "${YELLOW}$1${NC}"; }
911
+ echo_error() { echo -e "${RED}$1${NC}"; }
912
+ # ---------------------------------------
913
+
914
+ python -m scitex.ml.classification.timeseries._TimeSeriesBlockingSplit
915
+ python -m scitex.ml.classification.timeseries._TimeSeriesCalendarSplit
916
+ python -m scitex.ml.classification.timeseries._TimeSeriesMetadata
917
+ python -m scitex.ml.classification.timeseries._TimeSeriesSlidingWindowSplit
918
+ python -m scitex.ml.classification.timeseries._TimeSeriesStrategy
919
+ python -m scitex.ml.classification.timeseries._TimeSeriesStratifiedSplit
920
+
921
+ # EOF
922
+ ...
923
+ ```
924
+
925
+
926
+ ### `./classification/timeseries/_TimeSeriesBlockingSplit.py`
927
+
928
+ ```python
929
+ #!/usr/bin/env python3
930
+ # -*- coding: utf-8 -*-
931
+ # Timestamp: "2025-09-22 17:10:00 (ywatanabe)"
932
+ # File: _TimeSeriesBlockingSplit.py
933
+
934
+ __FILE__ = "_TimeSeriesBlockingSplit.py"
935
+
936
+ """
937
+ Functionalities:
938
+ - Implements time series split with blocking for multiple subjects/groups
939
+ - Ensures temporal integrity within each subject's timeline
940
+ - Allows cross-subject generalization while preventing data leakage
941
+ - Provides visualization with scatter plots and subject color coding
942
+ - Validates that no data mixing occurs between subjects
943
+ - Supports expanding window approach for more training data in later folds
944
+
945
+ Dependencies:
946
+ - packages:
947
+ - numpy
948
+ - sklearn
949
+ - matplotlib
950
+ - scitex
951
+
952
+ IO:
953
+ - input-files:
954
+ - None (generates synthetic multi-subject data for demonstration)
955
+ - output-files:
956
+ - ./blocking_splits_demo.png (visualization with scatter plots)
957
+ """
958
+
959
+ """Imports"""
960
+ import os
961
+ import sys
962
+ import argparse
963
+ import numpy as np
964
+ from typing import Iterator, Optional, Tuple
965
+ from sklearn.model_selection import BaseCrossValidator
966
+ import matplotlib.pyplot as plt
967
+ import matplotlib.patches as patches
968
+ import scitex as stx
969
+ from scitex import logging
970
+
971
+ logger = logging.getLogger(__name__)
972
+
973
+
974
+ class TimeSeriesBlockingSplit(BaseCrossValidator):
975
+ """
976
+ Time series split with blocking to handle multiple subjects/groups.
977
+
978
+ This splitter ensures temporal integrity within each subject while allowing
979
+
980
+ ...
981
+ ```
982
+
983
+
984
+ ### `./classification/timeseries/_TimeSeriesCalendarSplit.py`
985
+
986
+ ```python
987
+ #!/usr/bin/env python3
988
+ # -*- coding: utf-8 -*-
989
+ # Timestamp: "2025-09-22 17:15:00 (ywatanabe)"
990
+ # File: _TimeSeriesCalendarSplit.py
991
+
992
+ __FILE__ = "_TimeSeriesCalendarSplit.py"
993
+
994
+ """
995
+ Functionalities:
996
+ - Implements calendar-based time series cross-validation
997
+ - Splits data based on calendar intervals (monthly, weekly, daily)
998
+ - Ensures temporal order preservation with no data leakage
999
+ - Supports flexible interval definitions (D, W, M, Q, Y)
1000
+ - Provides visualization with scatter plots showing actual data points
1001
+ - Useful for financial data, sales forecasting, seasonal patterns
1002
+
1003
+ Dependencies:
1004
+ - packages:
1005
+ - numpy
1006
+ - pandas
1007
+ - sklearn
1008
+ - matplotlib
1009
+ - scitex
1010
+
1011
+ IO:
1012
+ - input-files:
1013
+ - None (generates synthetic calendar-based data for demonstration)
1014
+ - output-files:
1015
+ - ./calendar_splits_demo.png (visualization with scatter plots)
1016
+ """
1017
+
1018
+ """Imports"""
1019
+ import os
1020
+ import sys
1021
+ import argparse
1022
+ import numpy as np
1023
+ import pandas as pd
1024
+ from typing import Iterator, Optional, Tuple, Union, Literal
1025
+ from sklearn.model_selection import BaseCrossValidator
1026
+ from sklearn.utils.validation import _num_samples
1027
+ import matplotlib.pyplot as plt
1028
+ import matplotlib.patches as patches
1029
+ import scitex as stx
1030
+ from scitex import logging
1031
+
1032
+ # Import timestamp normalizer (internally uses to_datetime helper)
1033
+ from ._normalize_timestamp import normalize_timestamp, to_datetime
1034
+
1035
+ logger = logging.getLogger(__name__)
1036
+
1037
+
1038
+ ...
1039
+ ```
1040
+
1041
+
1042
+ ### `./classification/timeseries/_TimeSeriesMetadata.py`
1043
+
1044
+ ```python
1045
+ #!/usr/bin/env python3
1046
+ # -*- coding: utf-8 -*-
1047
+ # Timestamp: "2025-09-21 20:48:00 (ywatanabe)"
1048
+ # File: _TimeSeriesMetadata.py
1049
+
1050
+ """
1051
+ Time series metadata dataclass.
1052
+
1053
+ Stores comprehensive metadata about time series datasets for informed
1054
+ cross-validation strategy selection.
1055
+ """
1056
+
1057
+ from dataclasses import dataclass
1058
+ from typing import Optional, Dict, Tuple, Any
1059
+
1060
+
1061
+ @dataclass
1062
+ class TimeSeriesMetadata:
1063
+ """
1064
+ Metadata about the time series data.
1065
+
1066
+ This dataclass captures essential characteristics of time series data
1067
+ that inform the selection of appropriate cross-validation strategies.
1068
+
1069
+ Attributes
1070
+ ----------
1071
+ n_samples : int
1072
+ Total number of samples in the dataset
1073
+ n_features : int
1074
+ Number of features per sample
1075
+ n_classes : Optional[int]
1076
+ Number of unique classes (None for regression)
1077
+ has_groups : bool
1078
+ Whether data contains group/subject identifiers
1079
+ group_sizes : Optional[Dict[Any, int]]
1080
+ Mapping of group IDs to their sample counts
1081
+ time_range : Optional[Tuple[float, float]]
1082
+ Minimum and maximum timestamp values
1083
+ sampling_rate : Optional[float]
1084
+ Samples per time unit (e.g., Hz for sensor data)
1085
+ has_gaps : bool
1086
+ Whether the time series has temporal gaps
1087
+ max_gap_size : Optional[float]
1088
+ Maximum gap between consecutive timestamps
1089
+ is_balanced : bool
1090
+ Whether classes are balanced (for classification)
1091
+ class_distribution : Optional[Dict[Any, float]]
1092
+ Mapping of class labels to their proportions
1093
+
1094
+ Examples
1095
+
1096
+ ...
1097
+ ```
1098
+
1099
+
1100
+ ### `./classification/timeseries/_TimeSeriesSlidingWindowSplit.py`
1101
+
1102
+ ```python
1103
+ #!/usr/bin/env python3
1104
+ # -*- coding: utf-8 -*-
1105
+ # Timestamp: "2025-10-03 03:22:45 (ywatanabe)"
1106
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py
1107
+ # ----------------------------------------
1108
+ from __future__ import annotations
1109
+ import os
1110
+ __FILE__ = (
1111
+ "./src/scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py"
1112
+ )
1113
+ __DIR__ = os.path.dirname(__FILE__)
1114
+ # ----------------------------------------
1115
+
1116
+ """
1117
+ Functionalities:
1118
+ - Implements sliding window cross-validation for time series
1119
+ - Creates overlapping train/test windows that slide through time
1120
+ - Supports temporal gaps between train and test sets
1121
+ - Provides visualization with scatter plots showing actual data points
1122
+ - Validates temporal order in all windows
1123
+ - Ensures no data leakage between train and test sets
1124
+
1125
+ Dependencies:
1126
+ - packages:
1127
+ - numpy
1128
+ - sklearn
1129
+ - matplotlib
1130
+ - scitex
1131
+
1132
+ IO:
1133
+ - input-files:
1134
+ - None (generates synthetic data for demonstration)
1135
+ - output-files:
1136
+ - ./sliding_window_demo.png (visualization with scatter plots)
1137
+ """
1138
+
1139
+ """Imports"""
1140
+ import argparse
1141
+ from typing import Iterator, Optional, Tuple
1142
+
1143
+ import matplotlib.patches as patches
1144
+ import matplotlib.pyplot as plt
1145
+ import numpy as np
1146
+ import scitex as stx
1147
+ from scitex import logging
1148
+ from sklearn.model_selection import BaseCrossValidator
1149
+ from sklearn.utils.validation import _num_samples
1150
+
1151
+ logger = logging.getLogger(__name__)
1152
+
1153
+
1154
+ ...
1155
+ ```
1156
+
1157
+
1158
+ ### `./classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py`
1159
+
1160
+ ```python
1161
+ #!/usr/bin/env python3
1162
+ # -*- coding: utf-8 -*-
1163
+ # Timestamp: "2025-10-03 03:22:45 (ywatanabe)"
1164
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py
1165
+ # ----------------------------------------
1166
+ from __future__ import annotations
1167
+ import os
1168
+ __FILE__ = (
1169
+ "./src/scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py"
1170
+ )
1171
+ __DIR__ = os.path.dirname(__FILE__)
1172
+ # ----------------------------------------
1173
+
1174
+ """
1175
+ Functionalities:
1176
+ - Implements sliding window cross-validation for time series
1177
+ - Creates overlapping train/test windows that slide through time
1178
+ - Supports temporal gaps between train and test sets
1179
+ - Provides visualization with scatter plots showing actual data points
1180
+ - Validates temporal order in all windows
1181
+ - Ensures no data leakage between train and test sets
1182
+
1183
+ Dependencies:
1184
+ - packages:
1185
+ - numpy
1186
+ - sklearn
1187
+ - matplotlib
1188
+ - scitex
1189
+
1190
+ IO:
1191
+ - input-files:
1192
+ - None (generates synthetic data for demonstration)
1193
+ - output-files:
1194
+ - ./sliding_window_demo.png (visualization with scatter plots)
1195
+ """
1196
+
1197
+ """Imports"""
1198
+ import argparse
1199
+ from typing import Iterator, Optional, Tuple
1200
+
1201
+ import matplotlib.patches as patches
1202
+ import matplotlib.pyplot as plt
1203
+ import numpy as np
1204
+ import scitex as stx
1205
+ from scitex import logging
1206
+ from sklearn.model_selection import BaseCrossValidator
1207
+ from sklearn.utils.validation import _num_samples
1208
+
1209
+ logger = logging.getLogger(__name__)
1210
+
1211
+
1212
+ ...
1213
+ ```
1214
+
1215
+
1216
+ ### `./classification/timeseries/_TimeSeriesStrategy.py`
1217
+
1218
+ ```python
1219
+ #!/usr/bin/env python3
1220
+ # -*- coding: utf-8 -*-
1221
+ # Timestamp: "2025-09-21 20:45:00 (ywatanabe)"
1222
+ # File: _TimeSeriesStrategy.py
1223
+
1224
+ """
1225
+ Time series cross-validation strategy enumeration.
1226
+
1227
+ Defines available strategies for time series CV.
1228
+ """
1229
+
1230
+ from enum import Enum
1231
+
1232
+
1233
+ class TimeSeriesStrategy(Enum):
1234
+ """
1235
+ Available time series CV strategies.
1236
+
1237
+ Attributes
1238
+ ----------
1239
+ STRATIFIED : str
1240
+ Single time series with class balance preservation
1241
+ BLOCKING : str
1242
+ Multiple independent time series (e.g., different patients)
1243
+ SLIDING : str
1244
+ Sliding window approach with fixed-size windows
1245
+ EXPANDING : str
1246
+ Expanding window where training set grows over time
1247
+ FIXED : str
1248
+ Fixed train/test split at specific time point
1249
+ """
1250
+
1251
+ STRATIFIED = "stratified" # Single time series with class balance
1252
+ BLOCKING = "blocking" # Multiple time series (e.g., patients)
1253
+ SLIDING = "sliding" # Sliding window approach
1254
+ EXPANDING = "expanding" # Expanding window (train grows)
1255
+ FIXED = "fixed" # Fixed train/test split
1256
+
1257
+ @classmethod
1258
+ def from_string(cls, value: str) -> 'TimeSeriesStrategy':
1259
+ """
1260
+ Create strategy from string value.
1261
+
1262
+ Parameters
1263
+ ----------
1264
+ value : str
1265
+ String representation of strategy
1266
+
1267
+ Returns
1268
+ -------
1269
+
1270
+ ...
1271
+ ```
1272
+
1273
+
1274
+ ### `./classification/timeseries/_TimeSeriesStratifiedSplit.py`
1275
+
1276
+ ```python
1277
+ #!/usr/bin/env python3
1278
+ # -*- coding: utf-8 -*-
1279
+ # Timestamp: "2025-09-22 16:50:00 (ywatanabe)"
1280
+ # File: _TimeSeriesStratifiedSplit.py
1281
+
1282
+ __FILE__ = "_TimeSeriesStratifiedSplit.py"
1283
+
1284
+ """
1285
+ Functionalities:
1286
+ - Implements time series cross-validation with stratification support
1287
+ - Ensures chronological order (test data always after training data)
1288
+ - Supports optional validation set between train and test
1289
+ - Maintains temporal gaps to prevent data leakage
1290
+ - Provides visualization with scatter plots for verification
1291
+ - Validates temporal integrity in all splits
1292
+
1293
+ Dependencies:
1294
+ - packages:
1295
+ - numpy
1296
+ - sklearn
1297
+ - matplotlib
1298
+
1299
+ IO:
1300
+ - input-files:
1301
+ - None (generates synthetic data for demonstration)
1302
+ - output-files:
1303
+ - ./stratified_splits_demo.png (visualization)
1304
+ """
1305
+
1306
+ """Imports"""
1307
+ import os
1308
+ import sys
1309
+ import argparse
1310
+ import numpy as np
1311
+ from typing import Iterator, Optional, Tuple
1312
+ from sklearn.model_selection import BaseCrossValidator
1313
+ from sklearn.utils.validation import _num_samples
1314
+ import matplotlib.pyplot as plt
1315
+ import matplotlib.patches as patches
1316
+ import scitex as stx
1317
+ from scitex import logging
1318
+
1319
+ logger = logging.getLogger(__name__)
1320
+
1321
+
1322
+ class TimeSeriesStratifiedSplit(BaseCrossValidator):
1323
+ """
1324
+ Time series cross-validation with stratification support.
1325
+
1326
+ This splitter ensures:
1327
+
1328
+ ...
1329
+ ```
1330
+
1331
+
1332
+ ### `./clustering/__init__.py`
1333
+
1334
+ ```python
1335
+ #!/usr/bin/env python3
1336
+ """Scitex clustering module."""
1337
+
1338
+ from ._pca import pca
1339
+ from ._umap import main, umap
1340
+
1341
+ __all__ = [
1342
+ "main",
1343
+ "pca",
1344
+ "umap",
1345
+ ]
1346
+
1347
+ ...
1348
+ ```
1349
+
1350
+
1351
+ ### `./clustering/_pca.py`
1352
+
1353
+ ```python
1354
+ #!/usr/bin/env python3
1355
+ # -*- coding: utf-8 -*-
1356
+ # Time-stamp: "2024-05-14 00:58:26 (ywatanabe)"
1357
+
1358
+ import matplotlib.pyplot as plt
1359
+ import scitex
1360
+ import numpy as np
1361
+ import seaborn as sns
1362
+ from natsort import natsorted
1363
+ from sklearn.decomposition import PCA
1364
+ from sklearn.preprocessing import LabelEncoder
1365
+
1366
+
1367
+ def pca(
1368
+ data_all,
1369
+ labels_all,
1370
+ axes_titles=None,
1371
+ title="PCA Clustering",
1372
+ alpha=0.1,
1373
+ s=3,
1374
+ use_independent_legend=False,
1375
+ add_super_imposed=False,
1376
+ palette="viridis",
1377
+ ):
1378
+
1379
+ assert len(data_all) == len(labels_all)
1380
+
1381
+ if isinstance(data_all, list):
1382
+ data_all = list(data_all)
1383
+ labels_all = list(labels_all)
1384
+
1385
+ le = LabelEncoder()
1386
+ # le.fit(np.hstack(labels_all))
1387
+ le.fit(natsorted(np.hstack(labels_all)))
1388
+ labels_all = [le.transform(labels) for labels in labels_all]
1389
+
1390
+ pca_model = PCA(n_components=2)
1391
+
1392
+ ncols = len(data_all) + 1 if add_super_imposed else len(data_all)
1393
+ share = True if ncols > 1 else False
1394
+ fig, axes = plt.subplots(ncols=ncols, sharex=share, sharey=share)
1395
+
1396
+ fig.suptitle(title)
1397
+ fig.supxlabel("PCA 1")
1398
+ fig.supylabel("PCA 2")
1399
+
1400
+ for ii, (data, labels) in enumerate(zip(data_all, labels_all)):
1401
+ if ii == 0:
1402
+ _pca = pca_model.fit(data)
1403
+ embedding = _pca.transform(data)
1404
+
1405
+ ...
1406
+ ```
1407
+
1408
+
1409
+ ### `./clustering/_umap.py`
1410
+
1411
+ ```python
1412
+ #!./env/bin/python3
1413
+ # -*- coding: utf-8 -*-
1414
+ # Time-stamp: "2024-09-12 05:37:55 (ywatanabe)"
1415
+ # _umap_dev.py
1416
+
1417
+
1418
+ """
1419
+ This script does XYZ.
1420
+ """
1421
+
1422
+
1423
+ """
1424
+ Imports
1425
+ """
1426
+ import sys
1427
+
1428
+ import matplotlib.pyplot as plt
1429
+ import scitex
1430
+ import numpy as np
1431
+ import umap.umap_ as umap_orig
1432
+ from natsort import natsorted
1433
+ from sklearn.preprocessing import LabelEncoder
1434
+
1435
+ # sys.path = ["."] + sys.path
1436
+ # from scripts import utils, load
1437
+
1438
+ """
1439
+ Warnings
1440
+ """
1441
+ # warnings.simplefilter("ignore", UserWarning)
1442
+
1443
+
1444
+ """
1445
+ Config
1446
+ """
1447
+ # CONFIG = scitex.gen.load_configs()
1448
+
1449
+
1450
+ """
1451
+ Functions & Classes
1452
+ """
1453
+
1454
+
1455
+ def umap(
1456
+ data,
1457
+ labels,
1458
+ hues=None,
1459
+ hues_colors=None,
1460
+ axes=None,
1461
+ axes_titles=None,
1462
+
1463
+ ...
1464
+ ```
1465
+
1466
+
1467
+ ### `./feature_extraction/__init__.py`
1468
+
1469
+ ```python
1470
+ #!/usr/bin/env python3
1471
+ # -*- coding: utf-8 -*-
1472
+ # Time-stamp: "2024-11-20 10:53:22 (ywatanabe)"
1473
+ # File: ./scitex_repo/src/scitex/ai/feature_extraction/__init__.py
1474
+
1475
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/feature_extraction/__init__.py"
1476
+
1477
+ #!/usr/bin/env python3
1478
+ # -*- coding: utf-8 -*-
1479
+ # Time-stamp: "2024-10-22 19:51:47 (ywatanabe)"
1480
+ # File: __init__.py
1481
+
1482
+ import os as __os
1483
+ import importlib as __importlib
1484
+ import inspect as __inspect
1485
+ import warnings as __warnings
1486
+
1487
+ # Get the current directory
1488
+ current_dir = __os.path.dirname(__file__)
1489
+
1490
+ # Iterate through all Python files in the current directory
1491
+ for filename in __os.listdir(current_dir):
1492
+ if filename.endswith(".py") and not filename.startswith("__"):
1493
+ module_name = filename[:-3] # Remove .py extension
1494
+ try:
1495
+ module = __importlib.import_module(f".{module_name}", package=__name__)
1496
+
1497
+ # Import only functions and classes from the module
1498
+ for name, obj in __inspect.getmembers(module):
1499
+ if __inspect.isfunction(obj) or __inspect.isclass(obj):
1500
+ if not name.startswith("_"):
1501
+ globals()[name] = obj
1502
+ except ImportError as e:
1503
+ # Warn about modules that couldn't be imported due to missing dependencies
1504
+ __warnings.warn(
1505
+ f"Could not import {module_name} from scitex.ai.feature_extraction: {str(e)}. "
1506
+ f"Some functionality may be unavailable. "
1507
+ f"Consider installing missing dependencies if you need this module.",
1508
+ ImportWarning,
1509
+ stacklevel=2
1510
+ )
1511
+
1512
+ # Clean up temporary variables
1513
+ del __os, __importlib, __inspect, __warnings, current_dir
1514
+ if 'filename' in locals():
1515
+ del filename
1516
+ if 'module_name' in locals():
1517
+ del module_name
1518
+ if 'module' in locals():
1519
+ del module
1520
+
1521
+ ...
1522
+ ```
1523
+
1524
+
1525
+ ### `./feature_extraction/vit.py`
1526
+
1527
+ ```python
1528
+ #!/usr/bin/env python3
1529
+ # -*- coding: utf-8 -*-
1530
+ # Time-stamp: "2024-11-27 21:36:51 (ywatanabe)"
1531
+ # File: ./scitex_repo/src/scitex/ai/feature_extraction/vit.py
1532
+
1533
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/feature_extraction/vit.py"
1534
+
1535
+ """
1536
+ Functionality:
1537
+ Extracts features from images using Vision Transformer (ViT) models
1538
+ Input:
1539
+ Image arrays of arbitrary dimensions
1540
+ Output:
1541
+ Feature vectors (1000-dimensional embeddings)
1542
+ Prerequisites:
1543
+ torch, PIL, torchvision
1544
+ """
1545
+
1546
+ import os as _os
1547
+ from typing import Tuple, Union
1548
+
1549
+ import torch
1550
+ import torch as _torch
1551
+ import numpy as np
1552
+ from pytorch_pretrained_vit import ViT
1553
+ from torchvision import transforms as _transforms
1554
+
1555
+ # from ...decorators import batch_torch_fn
1556
+
1557
+
1558
+ def _setup_device(device: Union[str, None]) -> str:
1559
+ if device is None:
1560
+ device = "cuda" if _torch.cuda.is_available() else "cpu"
1561
+ return device
1562
+
1563
+
1564
+ class VitFeatureExtractor:
1565
+ def __init__(
1566
+ self,
1567
+ model_name="B_16",
1568
+ torch_home="./models",
1569
+ device=None,
1570
+ ):
1571
+ self.valid_models = [
1572
+ "B_16",
1573
+ "B_32",
1574
+ "L_16",
1575
+ "L_32",
1576
+ "B_16_imagenet1k",
1577
+ "B_32_imagenet1k",
1578
+
1579
+ ...
1580
+ ```
1581
+
1582
+
1583
+ ### `./_gen_ai/_Anthropic.py`
1584
+
1585
+ ```python
1586
+ #!/usr/bin/env python3
1587
+ # -*- coding: utf-8 -*-
1588
+ # Timestamp: "2025-06-24 19:20:24 (ywatanabe)"
1589
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_Anthropic.py
1590
+ # ----------------------------------------
1591
+ import os
1592
+ __FILE__ = __file__
1593
+ __DIR__ = os.path.dirname(__FILE__)
1594
+ # ----------------------------------------
1595
+
1596
+ """
1597
+ Functionality:
1598
+ - Implements Anthropic AI (Claude) interface
1599
+ - Handles both streaming and static text generation
1600
+ Input:
1601
+ - User prompts and chat history
1602
+ - Model configurations and API credentials
1603
+ Output:
1604
+ - Generated text responses from Claude models
1605
+ - Token usage statistics
1606
+ Prerequisites:
1607
+ - Anthropic API key (ANTHROPIC_API_KEY environment variable)
1608
+ - anthropic package
1609
+ """
1610
+
1611
+ """Imports"""
1612
+ import sys
1613
+ from typing import Dict, Generator, List, Optional
1614
+
1615
+ import anthropic
1616
+ import matplotlib.pyplot as plt
1617
+
1618
+ from ._BaseGenAI import BaseGenAI
1619
+
1620
+ """Functions & Classes"""
1621
+ class Anthropic(BaseGenAI):
1622
+ def __init__(
1623
+ self,
1624
+ system_setting: str = "",
1625
+ api_key: Optional[str] = os.getenv("ANTHROPIC_API_KEY"),
1626
+ model: str = "claude-3-opus-20240229",
1627
+ stream: bool = False,
1628
+ seed: Optional[int] = None,
1629
+ n_keep: int = 1,
1630
+ temperature: float = 1.0,
1631
+ chat_history: Optional[List[Dict[str, str]]] = None,
1632
+ max_tokens: int = 100_000,
1633
+ ) -> None:
1634
+
1635
+ if model == "claude-3-7-sonnet-2025-0219":
1636
+
1637
+ ...
1638
+ ```
1639
+
1640
+
1641
+ ### `./_gen_ai/_BaseGenAI.py`
1642
+
1643
+ ```python
1644
+ #!/usr/bin/env python3
1645
+ # -*- coding: utf-8 -*-
1646
+ # Timestamp: "2025-05-03 11:55:54 (ywatanabe)"
1647
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_BaseGenAI.py
1648
+ # ----------------------------------------
1649
+ import os
1650
+
1651
+ __FILE__ = "./src/scitex/ai/_gen_ai/_BaseGenAI.py"
1652
+ __DIR__ = os.path.dirname(__FILE__)
1653
+ # ----------------------------------------
1654
+
1655
+ import base64
1656
+ import sys
1657
+ from abc import ABC, abstractmethod
1658
+ from typing import Any, Dict, Generator, List, Optional, Union
1659
+
1660
+ import matplotlib.pyplot as plt
1661
+ import numpy as np
1662
+
1663
+ from ...io._load import load
1664
+ from ._calc_cost import calc_cost
1665
+ from ._format_output_func import format_output_func
1666
+ from ._PARAMS import MODELS
1667
+
1668
+
1669
+ class BaseGenAI(ABC):
1670
+ def __init__(
1671
+ self,
1672
+ system_setting: str = "",
1673
+ model: str = "",
1674
+ api_key: str = "",
1675
+ stream: bool = False,
1676
+ seed: Optional[int] = None,
1677
+ n_keep: int = 1,
1678
+ temperature: float = 1.0,
1679
+ provider: str = "",
1680
+ chat_history: Optional[List[Dict[str, str]]] = None,
1681
+ max_tokens: int = 4_096,
1682
+ ) -> None:
1683
+ self.provider = provider
1684
+ self.system_setting = system_setting
1685
+ self.model = model
1686
+ self.api_key = api_key
1687
+ self.stream = stream
1688
+ self.seed = seed
1689
+ self.n_keep = n_keep
1690
+ self.temperature = temperature
1691
+ self.max_tokens = max_tokens
1692
+ self.input_tokens = 0
1693
+ self.output_tokens = 0
1694
+
1695
+ ...
1696
+ ```
1697
+
1698
+
1699
+ ### `./_gen_ai/_calc_cost.py`
1700
+
1701
+ ```python
1702
+ #!/usr/bin/env python3
1703
+ # -*- coding: utf-8 -*-
1704
+ # Time-stamp: "2024-11-04 01:37:36 (ywatanabe)"
1705
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_calc_cost.py
1706
+
1707
+ """
1708
+ Functionality:
1709
+ - Calculates usage costs for AI model API calls
1710
+ - Handles token-based pricing for different models
1711
+ Input:
1712
+ - Model name
1713
+ - Number of input and output tokens used
1714
+ Output:
1715
+ - Total cost in USD based on token usage
1716
+ Prerequisites:
1717
+ - MODELS parameter dictionary with pricing information
1718
+ - pandas package
1719
+ """
1720
+
1721
+ from typing import Union, Any
1722
+ import pandas as pd
1723
+
1724
+ from ._PARAMS import MODELS
1725
+
1726
+
1727
+ def calc_cost(model: str, input_tokens: int, output_tokens: int) -> float:
1728
+ """Calculates API usage cost based on token count.
1729
+
1730
+ Example
1731
+ -------
1732
+ >>> cost = calc_cost("gpt-4", 100, 50)
1733
+ >>> print(f"${cost:.4f}")
1734
+ $0.0030
1735
+
1736
+ Parameters
1737
+ ----------
1738
+ model : str
1739
+ Name of the AI model
1740
+ input_tokens : int
1741
+ Number of input tokens used
1742
+ output_tokens : int
1743
+ Number of output tokens used
1744
+
1745
+ Returns
1746
+ -------
1747
+ float
1748
+ Total cost in USD
1749
+
1750
+ Raises
1751
+ ------
1752
+
1753
+ ...
1754
+ ```
1755
+
1756
+
1757
+ ### `./_gen_ai/_DeepSeek.py`
1758
+
1759
+ ```python
1760
+ #!/usr/bin/env python3
1761
+ # -*- coding: utf-8 -*-
1762
+ # Time-stamp: "2024-11-08 20:33:49 (ywatanabe)"
1763
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_DeepSeek.py
1764
+
1765
+ """
1766
+ 1. Functionality:
1767
+ - Implements DeepSeek Code LLM API interface
1768
+ 2. Input:
1769
+ - Text prompts for code generation
1770
+ 3. Output:
1771
+ - Generated code responses (streaming or static)
1772
+ 4. Prerequisites:
1773
+ - DEEPSEEK_API_KEY environment variable
1774
+ - requests library
1775
+ """
1776
+
1777
+ """Imports"""
1778
+ import json
1779
+ import os
1780
+ import sys
1781
+ from typing import Dict, Generator, List, Optional
1782
+
1783
+ import scitex
1784
+ import requests
1785
+
1786
+ from ._BaseGenAI import BaseGenAI
1787
+
1788
+ """Warnings"""
1789
+ # scitex.pd.ignore_SettingWithCopyWarning()
1790
+ # warnings.simplefilter("ignore", UserWarning)
1791
+ # with warnings.catch_warnings():
1792
+ # warnings.simplefilter("ignore", UserWarning)
1793
+
1794
+ """Parameters"""
1795
+ # from scitex.io import load_configs
1796
+ # CONFIG = load_configs()
1797
+
1798
+ """Functions & Classes"""
1799
+ from openai import OpenAI as _OpenAI
1800
+
1801
+ """Functions & Classes"""
1802
+
1803
+
1804
+ class DeepSeek(BaseGenAI):
1805
+ def __init__(
1806
+ self,
1807
+ system_setting="",
1808
+ model="deepseek-chat",
1809
+ api_key="",
1810
+
1811
+ ...
1812
+ ```
1813
+
1814
+
1815
+ ### `./_gen_ai/_format_output_func.py`
1816
+
1817
+ ```python
1818
+ #!/usr/bin/env python3
1819
+ # -*- coding: utf-8 -*-
1820
+ # Time-stamp: "2024-11-04 01:39:25 (ywatanabe)"
1821
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_format_output_func.py
1822
+
1823
+ """
1824
+ Functionality:
1825
+ - Formats AI model output text
1826
+ - Wraps URLs in HTML anchor tags
1827
+ - Converts markdown to HTML
1828
+ - Handles DOI links specially
1829
+ Input:
1830
+ - Raw text output from AI models
1831
+ - Optional API key for masking
1832
+ Output:
1833
+ - Formatted HTML text with proper link handling
1834
+ Prerequisites:
1835
+ - markdown2 package
1836
+ - Regular expressions support
1837
+ """
1838
+
1839
+ """Imports"""
1840
+ import re
1841
+ import sys
1842
+ from typing import List, Optional
1843
+
1844
+ import markdown2
1845
+ import matplotlib.pyplot as plt
1846
+ import scitex
1847
+
1848
+ """Functions & Classes"""
1849
+
1850
+
1851
+ def format_output_func(out_text: str) -> str:
1852
+ """Formats AI output text with proper link handling and markdown conversion.
1853
+
1854
+ Example
1855
+ -------
1856
+ >>> text = "Check https://example.com or doi:10.1234/abc"
1857
+ >>> print(format_output_func(text))
1858
+ Check <a href="https://example.com">https://example.com</a> or <a href="https://doi.org/10.1234/abc">https://doi.org/10.1234/abc</a>
1859
+
1860
+ Parameters
1861
+ ----------
1862
+ out_text : str
1863
+ Raw text output from AI model
1864
+
1865
+ Returns
1866
+ -------
1867
+ str
1868
+
1869
+ ...
1870
+ ```
1871
+
1872
+
1873
+ ### `./_gen_ai/_genai_factory.py`
1874
+
1875
+ ```python
1876
+ #!/usr/bin/env python3
1877
+ # -*- coding: utf-8 -*-
1878
+ # Timestamp: "2025-05-03 11:57:10 (ywatanabe)"
1879
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_genai_factory.py
1880
+ # ----------------------------------------
1881
+ import os
1882
+
1883
+ __FILE__ = "./src/scitex/ai/_gen_ai/_genai_factory.py"
1884
+ __DIR__ = os.path.dirname(__FILE__)
1885
+ # ----------------------------------------
1886
+
1887
+ import random
1888
+
1889
+ from ._Anthropic import Anthropic
1890
+ from ._DeepSeek import DeepSeek
1891
+ from ._Google import Google
1892
+ from ._Groq import Groq
1893
+ from ._Llama import Llama
1894
+ from ._OpenAI import OpenAI
1895
+ from ._PARAMS import MODELS
1896
+ from ._Perplexity import Perplexity
1897
+
1898
+
1899
+ def genai_factory(
1900
+ model="gpt-3.5-turbo",
1901
+ stream=False,
1902
+ api_key=None,
1903
+ seed=None,
1904
+ temperature=1.0,
1905
+ n_keep=1,
1906
+ chat_history=None,
1907
+ max_tokens=4096,
1908
+ ):
1909
+ """Factory function to create an instance of an AI model handler."""
1910
+ AVAILABLE_MODELS = MODELS.name.tolist()
1911
+
1912
+ if model not in AVAILABLE_MODELS:
1913
+ raise ValueError(
1914
+ f'Model "{model}" is not available. Please choose from:{MODELS.name.tolist()}'
1915
+ )
1916
+
1917
+ provider = MODELS[MODELS.name == model].provider.iloc[0]
1918
+
1919
+ # model_class = globals()[provider]
1920
+ model_class = {
1921
+ "OpenAI": OpenAI,
1922
+ "Anthropic": Anthropic,
1923
+ "Google": Google,
1924
+ "Llama": Llama,
1925
+ "Perplexity": Perplexity,
1926
+
1927
+ ...
1928
+ ```
1929
+
1930
+
1931
+ ### `./_gen_ai/_Google.py`
1932
+
1933
+ ```python
1934
+ #!/usr/bin/env python3
1935
+ # -*- coding: utf-8 -*-
1936
+ # Timestamp: "2025-02-06 13:47:23 (ywatanabe)"
1937
+ # File: _Google.py
1938
+
1939
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_Google.py"
1940
+
1941
+
1942
+ """
1943
+ Functionality:
1944
+ - Implements Google's Generative AI (Gemini) interface
1945
+ - Handles both streaming and static text generation
1946
+ Input:
1947
+ - User prompts and chat history
1948
+ - Model configurations and API credentials
1949
+ Output:
1950
+ - Generated text responses from Gemini models
1951
+ - Token usage statistics
1952
+ Prerequisites:
1953
+ - Google API key (GOOGLE_API_KEY environment variable)
1954
+ - google.generativeai package
1955
+ """
1956
+
1957
+ """Imports"""
1958
+ import os
1959
+ import sys
1960
+ from pprint import pprint
1961
+ from typing import Any, Dict, Generator, List, Optional
1962
+
1963
+ import matplotlib.pyplot as plt
1964
+ import scitex
1965
+
1966
+ try:
1967
+ from google import genai
1968
+ except ImportError:
1969
+ genai = None
1970
+
1971
+ from ._BaseGenAI import BaseGenAI
1972
+
1973
+ """Functions & Classes"""
1974
+
1975
+
1976
+ class Google(BaseGenAI):
1977
+ def __init__(
1978
+ self,
1979
+ system_setting: str = "",
1980
+ api_key: Optional[str] = os.getenv("GOOGLE_API_KEY"),
1981
+ model: str = "gemini-1.5-pro-latest",
1982
+ stream: bool = False,
1983
+ seed: Optional[int] = None,
1984
+
1985
+ ...
1986
+ ```
1987
+
1988
+
1989
+ ### `./_gen_ai/_Groq.py`
1990
+
1991
+ ```python
1992
+ #!/usr/bin/env python3
1993
+ # -*- coding: utf-8 -*-
1994
+ # Time-stamp: "2024-11-28 02:47:54 (ywatanabe)"
1995
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_Groq.py
1996
+
1997
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_Groq.py"
1998
+
1999
+ """
2000
+ Functionality:
2001
+ - Implements GLOQ AI interface
2002
+ - Handles both streaming and static text generation
2003
+ Input:
2004
+ - User prompts and chat history
2005
+ - Model configurations and API credentials
2006
+ Output:
2007
+ - Generated text responses
2008
+ - Token usage statistics
2009
+ Prerequisites:
2010
+ - GLOQ API key (GLOQ_API_KEY environment variable)
2011
+ - gloq package
2012
+ """
2013
+
2014
+ """Imports"""
2015
+ import os
2016
+ import sys
2017
+ from typing import Any, Dict, Generator, List, Optional, Union
2018
+
2019
+ from groq import Groq as _Groq
2020
+ import matplotlib.pyplot as plt
2021
+
2022
+ from ._BaseGenAI import BaseGenAI
2023
+
2024
+ """Functions & Classes"""
2025
+
2026
+
2027
+ class Groq(BaseGenAI):
2028
+ def __init__(
2029
+ self,
2030
+ system_setting: str = "",
2031
+ api_key: Optional[str] = os.getenv("GROQ_API_KEY"),
2032
+ model: str = "llama3-8b-8192",
2033
+ stream: bool = False,
2034
+ seed: Optional[int] = None,
2035
+ n_keep: int = 1,
2036
+ temperature: float = 0.5,
2037
+ chat_history: Optional[List[Dict[str, str]]] = None,
2038
+ max_tokens: int = 8000,
2039
+ ) -> None:
2040
+ max_tokens = min(max_tokens, 8000)
2041
+ if not api_key:
2042
+
2043
+ ...
2044
+ ```
2045
+
2046
+
2047
+ ### `./_gen_ai/__init__.py`
2048
+
2049
+ ```python
2050
+ #!/usr/bin/env python3
2051
+ # -*- coding: utf-8 -*-
2052
+ # Timestamp: "2025-07-14 13:51:57 (ywatanabe)"
2053
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/__init__.py
2054
+ # ----------------------------------------
2055
+ import os
2056
+ __FILE__ = __file__
2057
+ __DIR__ = os.path.dirname(__FILE__)
2058
+ # ----------------------------------------
2059
+ #!./env/bin/python3
2060
+ # Time-stamp: "2024-07-29 14:55:00 (ywatanabe)"
2061
+ # /home/ywatanabe/proj/scitex/src/scitex/ml/_gen_ai/__init__.py
2062
+
2063
+ from ._PARAMS import MODELS
2064
+ from ._BaseGenAI import BaseGenAI
2065
+ from ._Anthropic import Anthropic
2066
+ from ._DeepSeek import DeepSeek
2067
+ from ._Google import Google
2068
+ from ._Groq import Groq
2069
+ from ._Llama import Llama
2070
+ from ._OpenAI import OpenAI
2071
+ from ._Perplexity import Perplexity
2072
+ from ._calc_cost import calc_cost
2073
+ from ._format_output_func import format_output_func
2074
+ from ._genai_factory import genai_factory as GenAI
2075
+
2076
+ __all__ = [
2077
+ "GenAI"
2078
+ # "MODELS",
2079
+ # "BaseGenAI",
2080
+ # "Anthropic",
2081
+ # "DeepSeek",
2082
+ # "Google",
2083
+ # "Groq",
2084
+ # "Llama",
2085
+ # "OpenAI",
2086
+ # "Perplexity",
2087
+ # "calc_cost",
2088
+ # "format_output_func",
2089
+ # "genai_factory",
2090
+ ]
2091
+
2092
+ # EOF
2093
+
2094
+ ...
2095
+ ```
2096
+
2097
+
2098
+ ### `./_gen_ai/_Llama.py`
2099
+
2100
+ ```python
2101
+ #!/usr/bin/env python3
2102
+ # -*- coding: utf-8 -*-
2103
+ # Time-stamp: "2024-11-05 21:11:08 (ywatanabe)"
2104
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_Llama.py
2105
+
2106
+ """Imports"""
2107
+ import os
2108
+ import sys
2109
+ from typing import List, Optional
2110
+
2111
+ import matplotlib.pyplot as plt
2112
+ import scitex
2113
+
2114
+ try:
2115
+ from llama import Dialog
2116
+ from llama import Llama as _Llama
2117
+ except:
2118
+ pass
2119
+
2120
+ from ._BaseGenAI import BaseGenAI
2121
+
2122
+ """Functions & Classes"""
2123
+
2124
+
2125
+ def print_envs():
2126
+ settings = {
2127
+ "MASTER_ADDR": os.getenv("MASTER_ADDR", "localhost"),
2128
+ "MASTER_PORT": os.getenv("MASTER_PORT", "12355"),
2129
+ "WORLD_SIZE": os.getenv("WORLD_SIZE", "1"),
2130
+ "RANK": os.getenv("RANK", "0"),
2131
+ }
2132
+
2133
+ print("Environment Variable Settings:")
2134
+ for key, value in settings.items():
2135
+ print(f"{key}: {value}")
2136
+ print()
2137
+
2138
+
2139
+ class Llama(BaseGenAI):
2140
+ def __init__(
2141
+ self,
2142
+ ckpt_dir: str = "",
2143
+ tokenizer_path: str = "",
2144
+ system_setting: str = "",
2145
+ model: str = "Meta-Llama-3-8B",
2146
+ max_seq_len: int = 32_768,
2147
+ max_batch_size: int = 4,
2148
+ max_gen_len: Optional[int] = None,
2149
+ stream: bool = False,
2150
+ seed: Optional[int] = None,
2151
+
2152
+ ...
2153
+ ```
2154
+
2155
+
2156
+ ### `./_gen_ai/_OpenAI.py`
2157
+
2158
+ ```python
2159
+ #!/usr/bin/env python3
2160
+ # -*- coding: utf-8 -*-
2161
+ # Timestamp: "2025-01-22 01:21:11 (ywatanabe)"
2162
+ # File: _OpenAI.py
2163
+
2164
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_OpenAI.py"
2165
+
2166
+
2167
+ """Imports"""
2168
+ import os
2169
+ from openai import OpenAI as _OpenAI
2170
+ from ._BaseGenAI import BaseGenAI
2171
+
2172
+ """Functions & Classes"""
2173
+
2174
+
2175
+ class OpenAI(BaseGenAI):
2176
+ def __init__(
2177
+ self,
2178
+ system_setting="",
2179
+ model="",
2180
+ api_key=os.getenv("OPENAI_API_KEY"),
2181
+ stream=False,
2182
+ seed=None,
2183
+ n_keep=1,
2184
+ temperature=1.0,
2185
+ chat_history=None,
2186
+ max_tokens=None,
2187
+ ):
2188
+ self.passed_model = model
2189
+
2190
+ # import scitex
2191
+ # scitex.str.print_debug()
2192
+ # scitex.gen.printc(model)
2193
+
2194
+ if model.startswith("o"):
2195
+ for reasoning_effort in ["low", "midium", "high"]:
2196
+ model = model.replace(f"-{reasoning_effort}", "")
2197
+
2198
+ # Set max_tokens based on model
2199
+ if max_tokens is None:
2200
+ if "gpt-4-turbo" in model:
2201
+ max_tokens = 128_000
2202
+ elif "gpt-4" in model:
2203
+ max_tokens = 8_192
2204
+ elif "gpt-3.5-turbo-16k" in model:
2205
+ max_tokens = 16_384
2206
+ elif "gpt-3.5" in model:
2207
+ max_tokens = 4_096
2208
+ else:
2209
+
2210
+ ...
2211
+ ```
2212
+
2213
+
2214
+ ### `./_gen_ai/_PARAMS.py`
2215
+
2216
+ ```python
2217
+ #!/usr/bin/env python3
2218
+ # -*- coding: utf-8 -*-
2219
+ # Timestamp: "2025-09-30 06:38:18 (ywatanabe)"
2220
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_PARAMS.py
2221
+ # ----------------------------------------
2222
+ from __future__ import annotations
2223
+ import os
2224
+ __FILE__ = __file__
2225
+ __DIR__ = os.path.dirname(__FILE__)
2226
+ # ----------------------------------------
2227
+
2228
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/PARAMS.py"
2229
+
2230
+ import pandas as pd
2231
+
2232
+ # https://api-docs.deepseek.com/quick_start/pricing
2233
+ DEEPSEEK_MODELS = [
2234
+ {
2235
+ "name": "deepseek-reasoner",
2236
+ "input_cost": 0.14,
2237
+ "output_cost": 2.19,
2238
+ "api_key_env": "DEEPSEEK_API_KEY",
2239
+ "provider": "DeepSeek",
2240
+ },
2241
+ {
2242
+ "name": "deepseek-chat",
2243
+ "input_cost": 0.014,
2244
+ "output_cost": 0.28,
2245
+ "api_key_env": "DEEPSEEK_API_KEY",
2246
+ "provider": "DeepSeek",
2247
+ },
2248
+ {
2249
+ "name": "deepseek-coder",
2250
+ "input_cost": 0.014,
2251
+ "output_cost": 0.28,
2252
+ "api_key_env": "DEEPSEEK_API_KEY",
2253
+ "provider": "DeepSeek",
2254
+ },
2255
+ ]
2256
+
2257
+ # https://openai.com/api/pricing/
2258
+ OPENAI_MODELS = [
2259
+ # o3
2260
+ {
2261
+ "name": "o3",
2262
+ "input_cost": 10.00,
2263
+ "output_cost": 40.00,
2264
+ "api_key_env": "OPENAI_API_KEY",
2265
+ "provider": "OpenAI",
2266
+ },
2267
+
2268
+ ...
2269
+ ```
2270
+
2271
+
2272
+ ### `./_gen_ai/_Perplexity.py`
2273
+
2274
+ ```python
2275
+ #!/usr/bin/env python3
2276
+ # -*- coding: utf-8 -*-
2277
+ # Time-stamp: "2024-11-11 04:11:10 (ywatanabe)"
2278
+ # File: ./scitex_repo/src/scitex/ai/_gen_ai/_Perplexity.py
2279
+
2280
+ """
2281
+ Functionality:
2282
+ - Implements Perplexity AI interface using OpenAI-compatible API
2283
+ - Provides access to Llama and Mixtral models
2284
+ Input:
2285
+ - User prompts and chat history
2286
+ - Model configurations and API credentials
2287
+ Output:
2288
+ - Generated text responses from Perplexity models
2289
+ - Token usage statistics
2290
+ Prerequisites:
2291
+ - Perplexity API key
2292
+ - openai package
2293
+ """
2294
+
2295
+ """Imports"""
2296
+ import os
2297
+ import sys
2298
+ from pprint import pprint
2299
+ from typing import Dict, Generator, List, Optional
2300
+
2301
+ import matplotlib.pyplot as plt
2302
+ from openai import OpenAI
2303
+
2304
+ from ._BaseGenAI import BaseGenAI
2305
+
2306
+ """Functions & Classes"""
2307
+
2308
+
2309
+ class Perplexity(BaseGenAI):
2310
+ def __init__(
2311
+ self,
2312
+ system_setting: str = "",
2313
+ model: str = "",
2314
+ api_key: str = "",
2315
+ stream: bool = False,
2316
+ seed: Optional[int] = None,
2317
+ n_keep: int = 1,
2318
+ temperature: float = 1.0,
2319
+ chat_history: Optional[List[Dict[str, str]]] = None,
2320
+ max_tokens: Optional[int] = None, # Added parameter
2321
+ ) -> None:
2322
+ # Set max_tokens based on model if not provided
2323
+ if max_tokens is None:
2324
+ max_tokens = 128_000 if "128k" in model else 32_000
2325
+
2326
+ ...
2327
+ ```
2328
+
2329
+
2330
+ ### `./__init__.py`
2331
+
2332
+ ```python
2333
+ #!/usr/bin/env python3
2334
+ # -*- coding: utf-8 -*-
2335
+ # Timestamp: "2025-07-19 10:50:54 (ywatanabe)"
2336
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/__init__.py
2337
+ # ----------------------------------------
2338
+ import os
2339
+ __FILE__ = __file__
2340
+ __DIR__ = os.path.dirname(__FILE__)
2341
+ # ----------------------------------------
2342
+ """Scitex AI module for machine learning and artificial intelligence utilities."""
2343
+
2344
+ # Lazy imports to avoid loading heavy dependencies eagerly
2345
+ from .classification import ClassificationReporter
2346
+ from .training._LearningCurveLogger import LearningCurveLogger
2347
+ from .training._EarlyStopping import EarlyStopping
2348
+ from .loss import MultiTaskLoss
2349
+ from .classification import Classifier
2350
+ from .optim import get_optimizer, set_optimizer
2351
+
2352
+ # Import submodules to make them accessible
2353
+ from . import activation
2354
+ from . import classification
2355
+ from . import clustering
2356
+ from . import feature_extraction
2357
+ # from . import layer
2358
+ from . import loss
2359
+ from . import metrics
2360
+ from . import optim
2361
+ from . import plt
2362
+ from . import sampling
2363
+ from . import sklearn
2364
+ from . import training
2365
+ from . import utils
2366
+
2367
+ # Lazy import for GenAI (heavy anthropic dependency)
2368
+ def __getattr__(name):
2369
+ if name == "GenAI":
2370
+ from ._gen_ai import GenAI
2371
+ return GenAI
2372
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
2373
+
2374
+ __all__ = [
2375
+ # "Classifiers", # Moved to .old directory
2376
+ "LearningCurveLogger",
2377
+ "ClassificationReporter",
2378
+ "EarlyStopping",
2379
+ "MultiTaskLoss",
2380
+ "GenAI", # Lazy loaded
2381
+ "Classifier",
2382
+ "get_optimizer",
2383
+
2384
+ ...
2385
+ ```
2386
+
2387
+
2388
+ ### `./loss/__init__.py`
2389
+
2390
+ ```python
2391
+ #!/usr/bin/env python3
2392
+ """Scitex loss module."""
2393
+
2394
+ from ._L1L2Losses import elastic, l1, l2
2395
+ from .multi_task_loss import MultiTaskLoss
2396
+
2397
+ __all__ = [
2398
+ "elastic",
2399
+ "l1",
2400
+ "l2",
2401
+ "MultiTaskLoss",
2402
+ ]
2403
+
2404
+ ...
2405
+ ```
2406
+
2407
+
2408
+ ### `./loss/_L1L2Losses.py`
2409
+
2410
+ ```python
2411
+ #!/usr/bin/env python3
2412
+ # -*- coding: utf-8 -*-
2413
+ # Time-stamp: "2024-11-07 18:53:03 (ywatanabe)"
2414
+ # File: ./scitex_repo/src/scitex/ai/loss/_L1L2Losses.py
2415
+
2416
+ import torch
2417
+
2418
+
2419
+ def l1(model, lambda_l1=0.01):
2420
+ lambda_l1 = torch.tensor(lambda_l1)
2421
+ l1 = torch.tensor(0.0).cuda()
2422
+ for param in model.parameters(): # fixme; is this OK?
2423
+ l1 += torch.abs(param).sum()
2424
+ return l1
2425
+
2426
+
2427
+ def l2(model, lambda_l2=0.01):
2428
+ lambda_l2 = torch.tensor(lambda_l2)
2429
+ l2 = torch.tensor(0.0).cuda()
2430
+ for param in model.parameters(): # fixme; is this OK?
2431
+ l2 += torch.norm(param).sum()
2432
+ return l2
2433
+
2434
+
2435
+ def elastic(model, alpha=1.0, l1_ratio=0.5):
2436
+ assert 0 <= l1_ratio <= 1
2437
+
2438
+ L1 = l1(model)
2439
+ L2 = l2(model)
2440
+
2441
+ return alpha * (l1_ratio * L1 + (1 - l1_ratio) * L2)
2442
+
2443
+
2444
+ # EOF
2445
+
2446
+ ...
2447
+ ```
2448
+
2449
+
2450
+ ### `./loss/multi_task_loss.py`
2451
+
2452
+ ```python
2453
+ #!/usr/bin/env python3
2454
+ # -*- coding: utf-8 -*-
2455
+ # Time-stamp: "2024-11-07 19:07:29 (ywatanabe)"
2456
+ # File: ./scitex_repo/src/scitex/ai/loss/MultiTaskLoss.py
2457
+
2458
+ import numpy as np
2459
+ import torch
2460
+ import torch.nn as nn
2461
+
2462
+ from ...repro import fix_seeds
2463
+
2464
+
2465
+ class MultiTaskLoss(nn.Module):
2466
+ """
2467
+ # https://openaccess.thecvf.com/content_cvpr_2018/papers/Kendall_Multi-Task_Learning_Using_CVPR_2018_paper.pdf
2468
+
2469
+ Example:
2470
+ are_regression = [False, False]
2471
+ mtl = MultiTaskLoss(are_regression)
2472
+ losses = [torch.rand(1, requires_grad=True) for _ in range(len(are_regression))]
2473
+ loss = mtl(losses)
2474
+ print(loss)
2475
+ # [tensor([0.4215], grad_fn=<AddBackward0>), tensor([0.6190], grad_fn=<AddBackward0>)]
2476
+ """
2477
+
2478
+ def __init__(self, are_regression=[False, False], reduction="none"):
2479
+ super().__init__()
2480
+ fix_seeds(np=np, torch=torch, show=False)
2481
+ n_tasks = len(are_regression)
2482
+
2483
+ self.register_buffer("are_regression", torch.tensor(are_regression))
2484
+
2485
+ # for the numercal stability, log(variables) are learned.
2486
+ self.log_vars = torch.nn.Parameter(torch.zeros(n_tasks))
2487
+ self.reduction = reduction
2488
+
2489
+ def forward(self, losses):
2490
+ vars = torch.exp(self.log_vars).type_as(losses[0])
2491
+ stds = vars ** (1 / 2)
2492
+ coeffs = 1 / ((self.are_regression + 1) * vars)
2493
+ scaled_losses = [
2494
+ coeffs[i] * losses[i] + torch.log(stds[i]) for i in range(len(losses))
2495
+ ]
2496
+ return scaled_losses
2497
+
2498
+
2499
+ # EOF
2500
+
2501
+ ...
2502
+ ```
2503
+
2504
+
2505
+ ### `./metrics/_calc_bacc_from_conf_mat.py`
2506
+
2507
+ ```python
2508
+ #!/usr/bin/env python3
2509
+ # -*- coding: utf-8 -*-
2510
+ # Timestamp: "2025-10-02 (ywatanabe)"
2511
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_bacc_from_conf_mat.py
2512
+
2513
+ """Calculate balanced accuracy from confusion matrix."""
2514
+
2515
+ __FILE__ = __file__
2516
+
2517
+ import numpy as np
2518
+
2519
+
2520
+ def calc_bacc_from_conf_mat(cm: np.ndarray) -> float:
2521
+ """
2522
+ Calculate balanced accuracy from confusion matrix.
2523
+
2524
+ Parameters
2525
+ ----------
2526
+ cm : np.ndarray
2527
+ Confusion matrix
2528
+
2529
+ Returns
2530
+ -------
2531
+ float
2532
+ Balanced accuracy
2533
+ """
2534
+ try:
2535
+ per_class = np.diag(cm) / np.sum(cm, axis=1)
2536
+ return float(np.nanmean(per_class))
2537
+ except:
2538
+ return np.nan
2539
+
2540
+
2541
+ # Convenience aliases
2542
+ bACC_from_conf_mat = calc_bacc_from_conf_mat
2543
+ balanced_accuracy_from_conf_mat = calc_bacc_from_conf_mat
2544
+
2545
+ # EOF
2546
+
2547
+ ...
2548
+ ```
2549
+
2550
+
2551
+ ### `./metrics/_calc_bacc.py`
2552
+
2553
+ ```python
2554
+ #!/usr/bin/env python3
2555
+ # -*- coding: utf-8 -*-
2556
+ # Timestamp: "2025-10-02 (ywatanabe)"
2557
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_bacc.py
2558
+
2559
+ """Calculate balanced accuracy metric."""
2560
+
2561
+ __FILE__ = __file__
2562
+
2563
+ from typing import Any, Dict, List, Optional
2564
+ import numpy as np
2565
+ from sklearn.metrics import balanced_accuracy_score
2566
+ from ._normalize_labels import normalize_labels
2567
+
2568
+
2569
+ def calc_bacc(
2570
+ y_true: np.ndarray,
2571
+ y_pred: np.ndarray,
2572
+ labels: Optional[List] = None,
2573
+ fold: Optional[int] = None,
2574
+ ) -> Dict[str, Any]:
2575
+ """
2576
+ Calculate balanced accuracy with robust label handling.
2577
+
2578
+ Parameters
2579
+ ----------
2580
+ y_true : np.ndarray
2581
+ True labels (can be str or int)
2582
+ y_pred : np.ndarray
2583
+ Predicted labels (can be str or int)
2584
+ labels : List, optional
2585
+ Expected label list
2586
+ fold : int, optional
2587
+ Fold number for tracking
2588
+
2589
+ Returns
2590
+ -------
2591
+ Dict[str, Any]
2592
+ {'metric': 'balanced_accuracy', 'value': float, 'fold': int}
2593
+ """
2594
+ try:
2595
+ y_true_norm, y_pred_norm, label_names, _ = normalize_labels(
2596
+ y_true, y_pred, labels
2597
+ )
2598
+ value = balanced_accuracy_score(y_true_norm, y_pred_norm)
2599
+ return {
2600
+ "metric": "balanced_accuracy",
2601
+ "value": float(value),
2602
+ "fold": fold,
2603
+ "labels": label_names,
2604
+
2605
+ ...
2606
+ ```
2607
+
2608
+
2609
+ ### `./metrics/_calc_clf_report.py`
2610
+
2611
+ ```python
2612
+ #!/usr/bin/env python3
2613
+ # -*- coding: utf-8 -*-
2614
+ # Timestamp: "2025-10-02 (ywatanabe)"
2615
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_clf_report.py
2616
+
2617
+ """Generate classification report."""
2618
+
2619
+ __FILE__ = __file__
2620
+
2621
+ from typing import Any, Dict, List, Optional
2622
+ import pandas as pd
2623
+ from sklearn.metrics import classification_report
2624
+ from ._normalize_labels import normalize_labels
2625
+
2626
+
2627
+ def calc_clf_report(
2628
+ y_true,
2629
+ y_pred,
2630
+ labels: Optional[List] = None,
2631
+ fold: Optional[int] = None,
2632
+ ) -> Dict[str, Any]:
2633
+ """
2634
+ Generate classification report with robust label handling.
2635
+
2636
+ Parameters
2637
+ ----------
2638
+ y_true : np.ndarray
2639
+ True labels (can be str or int)
2640
+ y_pred : np.ndarray
2641
+ Predicted labels (can be str or int)
2642
+ labels : List, optional
2643
+ Expected label list
2644
+ fold : int, optional
2645
+ Fold number for tracking
2646
+
2647
+ Returns
2648
+ -------
2649
+ Dict[str, Any]
2650
+ {
2651
+ 'metric': 'classification_report',
2652
+ 'value': pd.DataFrame,
2653
+ 'fold': int,
2654
+ 'labels': list
2655
+ }
2656
+ """
2657
+ try:
2658
+ y_true_norm, y_pred_norm, label_names, _ = normalize_labels(
2659
+ y_true, y_pred, labels
2660
+ )
2661
+
2662
+
2663
+ ...
2664
+ ```
2665
+
2666
+
2667
+ ### `./metrics/_calc_conf_mat.py`
2668
+
2669
+ ```python
2670
+ #!/usr/bin/env python3
2671
+ # -*- coding: utf-8 -*-
2672
+ # Timestamp: "2025-10-02 (ywatanabe)"
2673
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_conf_mat.py
2674
+
2675
+ """Calculate confusion matrix."""
2676
+
2677
+ __FILE__ = __file__
2678
+
2679
+ from typing import Any, Dict, List, Optional
2680
+ import numpy as np
2681
+ import pandas as pd
2682
+ from sklearn.metrics import confusion_matrix as sklearn_confusion_matrix
2683
+ from ._normalize_labels import normalize_labels
2684
+
2685
+
2686
+ def calc_conf_mat(
2687
+ y_true: np.ndarray,
2688
+ y_pred: np.ndarray,
2689
+ labels: Optional[List] = None,
2690
+ fold: Optional[int] = None,
2691
+ normalize: Optional[str] = None,
2692
+ ) -> Dict[str, Any]:
2693
+ """
2694
+ Calculate confusion matrix with robust label handling.
2695
+
2696
+ Parameters
2697
+ ----------
2698
+ y_true : np.ndarray
2699
+ True labels (can be str or int)
2700
+ y_pred : np.ndarray
2701
+ Predicted labels (can be str or int)
2702
+ labels : List, optional
2703
+ Expected label list
2704
+ fold : int, optional
2705
+ Fold number for tracking
2706
+ normalize : str, optional
2707
+ 'true', 'pred', 'all', or None
2708
+
2709
+ Returns
2710
+ -------
2711
+ Dict[str, Any]
2712
+ {
2713
+ 'metric': 'confusion_matrix',
2714
+ 'value': pd.DataFrame,
2715
+ 'fold': int,
2716
+ 'labels': list
2717
+ }
2718
+ """
2719
+ try:
2720
+
2721
+ ...
2722
+ ```
2723
+
2724
+
2725
+ ### `./metrics/_calc_feature_importance.py`
2726
+
2727
+ ```python
2728
+ #!/usr/bin/env python3
2729
+ # -*- coding: utf-8 -*-
2730
+ # Timestamp: "2025-10-03 04:00:00 (ywatanabe)"
2731
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_feature_importance.py
2732
+
2733
+ """
2734
+ Calculate feature importance from trained models.
2735
+
2736
+ This module provides a unified interface for extracting feature importance
2737
+ from various model types (tree-based, linear models, etc.).
2738
+ """
2739
+
2740
+ from typing import Dict, List, Optional, Tuple
2741
+ import numpy as np
2742
+
2743
+
2744
+ def calc_feature_importance(
2745
+ model,
2746
+ feature_names: Optional[List[str]] = None,
2747
+ top_n: Optional[int] = None,
2748
+ ) -> Tuple[Dict[str, float], np.ndarray]:
2749
+ """
2750
+ Calculate feature importance from a trained model.
2751
+
2752
+ Parameters
2753
+ ----------
2754
+ model : object
2755
+ Trained model with feature importance attributes
2756
+ Supports:
2757
+ - Tree-based: feature_importances_ (RandomForest, XGBoost, etc.)
2758
+ - Linear: coef_ (LogisticRegression, LinearSVC, etc.)
2759
+ feature_names : List[str], optional
2760
+ Names of features. If None, uses feature_0, feature_1, ...
2761
+ top_n : int, optional
2762
+ Return only top N most important features
2763
+
2764
+ Returns
2765
+ -------
2766
+ importance_dict : Dict[str, float]
2767
+ Dictionary mapping feature names to importance scores
2768
+ importance_array : np.ndarray
2769
+ Array of importance scores (same order as feature_names)
2770
+
2771
+ Raises
2772
+ ------
2773
+ ValueError
2774
+ If model doesn't support feature importance extraction
2775
+
2776
+ Examples
2777
+ --------
2778
+
2779
+ ...
2780
+ ```
2781
+
2782
+
2783
+ ### `./metrics/_calc_mcc.py`
2784
+
2785
+ ```python
2786
+ #!/usr/bin/env python3
2787
+ # -*- coding: utf-8 -*-
2788
+ # Timestamp: "2025-10-02 (ywatanabe)"
2789
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_mcc.py
2790
+
2791
+ """Calculate Matthews Correlation Coefficient."""
2792
+
2793
+ __FILE__ = __file__
2794
+
2795
+ from typing import Any, Dict, List, Optional
2796
+ import numpy as np
2797
+ from sklearn.metrics import matthews_corrcoef
2798
+ from ._normalize_labels import normalize_labels
2799
+
2800
+
2801
+ def calc_mcc(
2802
+ y_true: np.ndarray,
2803
+ y_pred: np.ndarray,
2804
+ labels: Optional[List] = None,
2805
+ fold: Optional[int] = None,
2806
+ ) -> Dict[str, Any]:
2807
+ """
2808
+ Calculate Matthews Correlation Coefficient with robust label handling.
2809
+
2810
+ Parameters
2811
+ ----------
2812
+ y_true : np.ndarray
2813
+ True labels (can be str or int)
2814
+ y_pred : np.ndarray
2815
+ Predicted labels (can be str or int)
2816
+ labels : List, optional
2817
+ Expected label list
2818
+ fold : int, optional
2819
+ Fold number for tracking
2820
+
2821
+ Returns
2822
+ -------
2823
+ Dict[str, Any]
2824
+ {'metric': 'mcc', 'value': float, 'fold': int}
2825
+ """
2826
+ try:
2827
+ y_true_norm, y_pred_norm, label_names, _ = normalize_labels(
2828
+ y_true, y_pred, labels
2829
+ )
2830
+ value = matthews_corrcoef(y_true_norm, y_pred_norm)
2831
+ return {
2832
+ "metric": "mcc",
2833
+ "value": float(value),
2834
+ "fold": fold,
2835
+ "labels": label_names,
2836
+
2837
+ ...
2838
+ ```
2839
+
2840
+
2841
+ ### `./metrics/_calc_pre_rec_auc.py`
2842
+
2843
+ ```python
2844
+ #!/usr/bin/env python3
2845
+ # -*- coding: utf-8 -*-
2846
+ # Timestamp: "2025-10-02 (ywatanabe)"
2847
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_pre_rec_auc.py
2848
+
2849
+ """Calculate Precision-Recall AUC."""
2850
+
2851
+ __FILE__ = __file__
2852
+
2853
+ from typing import Any, Dict, List, Optional
2854
+ import numpy as np
2855
+ from sklearn.metrics import average_precision_score, precision_recall_curve
2856
+
2857
+
2858
+ def calc_pre_rec_auc(
2859
+ y_true: np.ndarray,
2860
+ y_proba: np.ndarray,
2861
+ labels: Optional[List] = None,
2862
+ fold: Optional[int] = None,
2863
+ return_curve: bool = False,
2864
+ ) -> Dict[str, Any]:
2865
+ """
2866
+ Calculate Precision-Recall AUC with robust handling.
2867
+
2868
+ Parameters
2869
+ ----------
2870
+ y_true : np.ndarray
2871
+ True labels (can be str or int)
2872
+ y_proba : np.ndarray
2873
+ Predicted probabilities
2874
+ labels : List, optional
2875
+ Expected label list
2876
+ fold : int, optional
2877
+ Fold number for tracking
2878
+ return_curve : bool
2879
+ Whether to return PR curve data
2880
+
2881
+ Returns
2882
+ -------
2883
+ Dict[str, Any]
2884
+ {'metric': 'pr_auc', 'value': float, 'fold': int}
2885
+ """
2886
+ try:
2887
+ # Normalize labels
2888
+ if labels is not None:
2889
+ unique_labels = np.unique(y_true)
2890
+ label_names = labels
2891
+ # If data contains integers, assume they map to label indices
2892
+ if isinstance(unique_labels[0], (int, np.integer)):
2893
+ y_true_norm = y_true.astype(int)
2894
+
2895
+ ...
2896
+ ```
2897
+
2898
+
2899
+ ### `./metrics/_calc_roc_auc.py`
2900
+
2901
+ ```python
2902
+ #!/usr/bin/env python3
2903
+ # -*- coding: utf-8 -*-
2904
+ # Timestamp: "2025-10-02 (ywatanabe)"
2905
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_roc_auc.py
2906
+
2907
+ """Calculate ROC AUC score."""
2908
+
2909
+ __FILE__ = __file__
2910
+
2911
+ from typing import Any, Dict, List, Optional
2912
+ import numpy as np
2913
+ from sklearn.metrics import roc_auc_score, roc_curve
2914
+
2915
+
2916
+ def calc_roc_auc(
2917
+ y_true: np.ndarray,
2918
+ y_proba: np.ndarray,
2919
+ labels: Optional[List] = None,
2920
+ fold: Optional[int] = None,
2921
+ return_curve: bool = False,
2922
+ ) -> Dict[str, Any]:
2923
+ """
2924
+ Calculate ROC AUC score with robust handling.
2925
+
2926
+ Parameters
2927
+ ----------
2928
+ y_true : np.ndarray
2929
+ True labels (can be str or int)
2930
+ y_proba : np.ndarray
2931
+ Predicted probabilities
2932
+ labels : List, optional
2933
+ Expected label list
2934
+ fold : int, optional
2935
+ Fold number for tracking
2936
+ return_curve : bool
2937
+ Whether to return ROC curve data
2938
+
2939
+ Returns
2940
+ -------
2941
+ Dict[str, Any]
2942
+ {'metric': 'roc_auc', 'value': float, 'fold': int}
2943
+ """
2944
+ try:
2945
+ # Normalize labels
2946
+ if labels is not None:
2947
+ unique_labels = np.unique(y_true)
2948
+ label_names = labels
2949
+ # If data contains integers, assume they map to label indices
2950
+ if isinstance(unique_labels[0], (int, np.integer)):
2951
+ y_true_norm = y_true.astype(int)
2952
+
2953
+ ...
2954
+ ```
2955
+
2956
+
2957
+ ### `./metrics/_calc_seizure_prediction_metrics.py`
2958
+
2959
+ ```python
2960
+ #!/usr/bin/env python3
2961
+ # -*- coding: utf-8 -*-
2962
+ # Timestamp: "2025-10-03 01:56:15 (ywatanabe)"
2963
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_calc_seizure_prediction_metrics.py
2964
+ """Calculate clinical seizure prediction metrics.
2965
+
2966
+ This module provides both window-based and event-based seizure prediction metrics
2967
+ following FDA/clinical guidelines.
2968
+
2969
+ Two Approaches:
2970
+ 1. Window-based: Measures % of seizure time windows detected
2971
+ 2. Event-based: Measures % of seizure events detected (≥1 alarm per event)
2972
+
2973
+ Key Metrics:
2974
+ - seizure_sensitivity: % detected (interpretation depends on window vs event-based)
2975
+ - fp_per_hour: False positives per hour during interictal periods
2976
+ - time_in_warning: % of total time in alarm state
2977
+
2978
+ Clinical Targets (FDA guidelines):
2979
+ - Sensitivity ≥ 90%
2980
+ - FP/h ≤ 0.2
2981
+ - Time in warning ≤ 20%
2982
+ """
2983
+ from __future__ import annotations
2984
+ from typing import Dict
2985
+ import numpy as np
2986
+ import pandas as pd
2987
+
2988
+
2989
+ def calc_seizure_window_prediction_metrics(
2990
+ y_true: np.ndarray,
2991
+ y_pred: np.ndarray,
2992
+ metadata: pd.DataFrame,
2993
+ window_duration_min: float = 1.0,
2994
+ ) -> Dict[str, float]:
2995
+ """Calculate clinical seizure prediction metrics (window-based).
2996
+
2997
+ This function calculates window-based sensitivity, meaning it measures
2998
+ the percentage of seizure time windows that were correctly identified.
2999
+ This is NOT event-based sensitivity (which would measure % of seizure
3000
+ events detected regardless of how many windows within each event).
3001
+
3002
+ Parameters
3003
+ ----------
3004
+ y_true : np.ndarray
3005
+ True labels (string: 'seizure' or 'interictal_control')
3006
+ y_pred : np.ndarray
3007
+ Predicted labels (string: 'seizure' or 'interictal_control')
3008
+ metadata : pd.DataFrame
3009
+ Metadata with 'seizure_type' column indicating seizure/interictal periods
3010
+
3011
+ ...
3012
+ ```
3013
+
3014
+
3015
+ ### `./metrics/_calc_silhouette_score.py`
3016
+
3017
+ ```python
3018
+ #!/usr/bin/env python3
3019
+ # -*- coding: utf-8 -*-
3020
+ # Time-stamp: "2024-11-20 00:22:25 (ywatanabe)"
3021
+ # File: ./scitex_repo/src/scitex/ai/silhoute_score_block.py
3022
+
3023
+ THIS_FILE = "/data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/ai/silhoute_score_block.py"
3024
+
3025
+ #!/usr/bin/env python3
3026
+ # -*- coding: utf-8 -*-
3027
+ # Time-stamp: "2024-11-03 03:03:13 (ywatanabe)"
3028
+ # File: ./scitex_repo/src/scitex/ai/silhoute_score_block.py
3029
+
3030
+ # https://gist.github.com/AlexandreAbraham/5544803
3031
+
3032
+ """ Unsupervised evaluation metrics. """
3033
+
3034
+ # License: BSD Style.
3035
+
3036
+ from itertools import combinations as _combinations
3037
+
3038
+ import numpy as _np
3039
+
3040
+ # from sklearn.externals.joblib import Parallel, delayed
3041
+ from joblib import Parallel as _Parallel
3042
+ from joblib import delayed as _delayed
3043
+ from sklearn.metrics.pairwise import distance_metrics as _distance_metrics
3044
+ from sklearn.metrics.pairwise import pairwise_distances as _pairwise_distances
3045
+ from sklearn.utils import check_random_state as _check_random_state
3046
+
3047
+
3048
+ def calc_silhouette_score_slow(
3049
+ X, labels, metric="euclidean", sample_size=None, random_state=None, **kwds
3050
+ ):
3051
+ """Compute the mean Silhouette Coefficient of all samples.
3052
+
3053
+ This method is computationally expensive compared to the reference one.
3054
+
3055
+ The Silhouette Coefficient is calculated using the mean intra-cluster
3056
+ distance (a) and the mean nearest-cluster distance (b) for each sample.
3057
+ The Silhouette Coefficient for a sample is ``(b - a) / max(a, b)``.
3058
+ To clarrify, b is the distance between a sample and the nearest cluster
3059
+ that b is not a part of.
3060
+
3061
+ This function returns the mean Silhoeutte Coefficient over all samples.
3062
+ To obtain the values for each sample, use silhouette_samples
3063
+
3064
+ The best value is 1 and the worst value is -1. Values near 0 indicate
3065
+ overlapping clusters. Negative values genly indicate that a sample has
3066
+ been assigned to the wrong cluster, as a different cluster is more similar.
3067
+
3068
+
3069
+ ...
3070
+ ```
3071
+
3072
+
3073
+ ### `./metrics/__init__.py`
3074
+
3075
+ ```python
3076
+ #!/usr/bin/env python3
3077
+ """Scitex metrics module.
3078
+
3079
+ Standardized naming convention:
3080
+ - calc_* functions: Modern standardized metric calculations
3081
+ - Legacy names (bACC, balanced_accuracy, etc.): For backward compatibility
3082
+ """
3083
+
3084
+ # Modern standardized calc_* functions
3085
+ from ._normalize_labels import normalize_labels as _normalize_labels
3086
+ from ._calc_bacc import calc_bacc
3087
+ from ._calc_mcc import calc_mcc
3088
+ from ._calc_conf_mat import calc_conf_mat
3089
+ from ._calc_clf_report import calc_clf_report
3090
+ from ._calc_roc_auc import calc_roc_auc
3091
+ from ._calc_pre_rec_auc import calc_pre_rec_auc
3092
+ from ._calc_bacc_from_conf_mat import calc_bacc_from_conf_mat
3093
+ from ._calc_seizure_prediction_metrics import (
3094
+ calc_seizure_window_prediction_metrics,
3095
+ calc_seizure_event_prediction_metrics,
3096
+ calc_seizure_prediction_metrics, # backward compat alias
3097
+ )
3098
+ from ._calc_silhouette_score import (
3099
+ calc_silhouette_score_slow,
3100
+ calc_silhouette_samples_slow,
3101
+ calc_silhouette_score_block,
3102
+ calc_silhouette_samples_block,
3103
+ )
3104
+ from ._calc_feature_importance import (
3105
+ calc_feature_importance,
3106
+ calc_permutation_importance,
3107
+ )
3108
+
3109
+ __all__ = [
3110
+ "calc_bacc",
3111
+ "calc_mcc",
3112
+ "calc_conf_mat",
3113
+ "calc_clf_report",
3114
+ "calc_roc_auc",
3115
+ "calc_pre_rec_auc",
3116
+ "calc_bacc_from_conf_mat",
3117
+ "calc_seizure_window_prediction_metrics",
3118
+ "calc_seizure_event_prediction_metrics",
3119
+ "calc_seizure_prediction_metrics", # backward compat alias
3120
+ "calc_silhouette_score_slow",
3121
+ "calc_silhouette_samples_slow",
3122
+ "calc_silhouette_score_block",
3123
+ "calc_silhouette_samples_block",
3124
+ "calc_feature_importance",
3125
+ "calc_permutation_importance",
3126
+
3127
+ ...
3128
+ ```
3129
+
3130
+
3131
+ ### `./metrics/_normalize_labels.py`
3132
+
3133
+ ```python
3134
+ #!/usr/bin/env python3
3135
+ # -*- coding: utf-8 -*-
3136
+ # Timestamp: "2025-10-02 (ywatanabe)"
3137
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/metrics/_normalize_labels.py
3138
+
3139
+ """Label normalization utility for classification metrics."""
3140
+
3141
+ __FILE__ = __file__
3142
+
3143
+ from typing import List, Optional, Tuple
3144
+ import numpy as np
3145
+ from sklearn.preprocessing import LabelEncoder
3146
+
3147
+
3148
+ def normalize_labels(
3149
+ y_true: np.ndarray,
3150
+ y_pred: np.ndarray,
3151
+ labels: Optional[List] = None,
3152
+ ) -> Tuple[np.ndarray, np.ndarray, List, LabelEncoder]:
3153
+ """
3154
+ Normalize labels using sklearn.preprocessing.LabelEncoder.
3155
+
3156
+ Parameters
3157
+ ----------
3158
+ y_true : np.ndarray
3159
+ True labels (can be str or int)
3160
+ y_pred : np.ndarray
3161
+ Predicted labels (can be str or int)
3162
+ labels : List, optional
3163
+ Expected label list. If provided, will be used as display names.
3164
+
3165
+ Returns
3166
+ -------
3167
+ y_true_norm : np.ndarray
3168
+ Normalized true labels (integers 0, 1, 2, ...)
3169
+ y_pred_norm : np.ndarray
3170
+ Normalized predicted labels (integers 0, 1, 2, ...)
3171
+ label_names : List
3172
+ List of label names in order
3173
+ encoder : LabelEncoder
3174
+ Fitted encoder for inverse transform
3175
+
3176
+ Notes
3177
+ -----
3178
+ Uses sklearn.preprocessing.LabelEncoder for robust label handling.
3179
+ Handles the edge case where data contains integers but labels are strings
3180
+ (e.g., y_true=[0,1,0,1] with labels=['Negative', 'Positive']).
3181
+ """
3182
+ # Get unique values from data
3183
+ all_data_labels = np.unique(np.concatenate([y_true, y_pred]))
3184
+
3185
+ ...
3186
+ ```
3187
+
3188
+
3189
+ ### `./optim/_get_set.py`
3190
+
3191
+ ```python
3192
+ #!/usr/bin/env python3
3193
+ """Optimizer utilities - legacy interface maintained for compatibility."""
3194
+
3195
+ import warnings
3196
+ from ._optimizers import get_optimizer, set_optimizer
3197
+
3198
+
3199
+ def set(models, optim_str, lr):
3200
+ """Sets an optimizer to models.
3201
+
3202
+ DEPRECATED: Use set_optimizer instead.
3203
+ """
3204
+ warnings.warn(
3205
+ "scitex.ai.optim.set is deprecated. Use scitex.ai.optim.set_optimizer instead.",
3206
+ DeprecationWarning,
3207
+ stacklevel=2,
3208
+ )
3209
+ return set_optimizer(models, optim_str, lr)
3210
+
3211
+
3212
+ def get(optim_str):
3213
+ """Get optimizer class by name.
3214
+
3215
+ DEPRECATED: Use get_optimizer instead.
3216
+ """
3217
+ warnings.warn(
3218
+ "scitex.ai.optim.get is deprecated. Use scitex.ai.optim.get_optimizer instead.",
3219
+ DeprecationWarning,
3220
+ stacklevel=2,
3221
+ )
3222
+ return get_optimizer(optim_str)
3223
+
3224
+ ...
3225
+ ```
3226
+
3227
+
3228
+ ### `./optim/__init__.py`
3229
+
3230
+ ```python
3231
+ #!/usr/bin/env python3
3232
+ """Scitex optim module."""
3233
+
3234
+ from ._get_set import get, set
3235
+ from ._optimizers import get_optimizer, set_optimizer, RANGER_AVAILABLE
3236
+
3237
+ __all__ = [
3238
+ "get",
3239
+ "get_optimizer",
3240
+ "set",
3241
+ "set_optimizer",
3242
+ "RANGER_AVAILABLE",
3243
+ ]
3244
+
3245
+ ...
3246
+ ```
3247
+
3248
+
3249
+ ### `./optim/MIGRATION.md`
3250
+
3251
+ ```markdown
3252
+ # Ranger Optimizer Migration Guide
3253
+
3254
+ ## Overview
3255
+ The Ranger optimizer has been migrated from a vendored implementation to use the external `pytorch-optimizer` package.
3256
+
3257
+ ## Changes
3258
+
3259
+ ### Before
3260
+ ```python
3261
+ from scitex.ai.optim.Ranger_Deep_Learning_Optimizer.ranger.ranger2020 import Ranger
3262
+ ```
3263
+
3264
+ ### After
3265
+ ```python
3266
+ from pytorch_optimizer import Ranger21 as Ranger
3267
+ ```
3268
+
3269
+ ## Installation
3270
+ ```bash
3271
+ pip install pytorch-optimizer
3272
+ ```
3273
+
3274
+ ## Backward Compatibility
3275
+ - The old API (`scitex.ai.optim.get` and `scitex.ai.optim.set`) still works but shows deprecation warnings
3276
+ - The vendored Ranger code is used as fallback if pytorch-optimizer is not installed
3277
+ - New code should use `get_optimizer` and `set_optimizer`
3278
+
3279
+ ## Example Usage
3280
+
3281
+ ### Old API (deprecated)
3282
+ ```python
3283
+ optimizer = scitex.ai.optim.set(model, 'ranger', lr=0.001)
3284
+ ```
3285
+
3286
+ ### New API
3287
+ ```python
3288
+ optimizer = scitex.ai.optim.set_optimizer(model, 'ranger', lr=0.001)
3289
+ ```
3290
+
3291
+ ## Removal Timeline
3292
+ - Version 1.12.0: Deprecation warnings added
3293
+ - Version 2.0.0: Vendored Ranger code will be removed
3294
+ - Users must install pytorch-optimizer for Ranger support
3295
+
3296
+ ...
3297
+ ```
3298
+
3299
+
3300
+ ### `./optim/_optimizers.py`
3301
+
3302
+ ```python
3303
+ #!/usr/bin/env python3
3304
+ """Optimizer utilities using external packages."""
3305
+
3306
+ import torch.optim as optim
3307
+
3308
+ # Use pytorch-optimizer package for Ranger when available
3309
+ try:
3310
+ from pytorch_optimizer import Ranger21 as Ranger
3311
+
3312
+ RANGER_AVAILABLE = True
3313
+ except ImportError:
3314
+ # Fallback to vendored version temporarily
3315
+ try:
3316
+ from .Ranger_Deep_Learning_Optimizer.ranger.ranger2020 import Ranger
3317
+
3318
+ RANGER_AVAILABLE = True
3319
+ except ImportError:
3320
+ RANGER_AVAILABLE = False
3321
+ Ranger = None
3322
+
3323
+
3324
+ def get_optimizer(name: str):
3325
+ """Get optimizer class by name.
3326
+
3327
+ Args:
3328
+ name: Optimizer name (adam, ranger, rmsprop, sgd)
3329
+
3330
+ Returns:
3331
+ Optimizer class
3332
+
3333
+ Raises:
3334
+ ValueError: If optimizer name is not supported
3335
+ """
3336
+ optimizers = {"adam": optim.Adam, "rmsprop": optim.RMSprop, "sgd": optim.SGD}
3337
+
3338
+ if name == "ranger":
3339
+ if not RANGER_AVAILABLE:
3340
+ raise ImportError(
3341
+ "Ranger optimizer not available. "
3342
+ "Please install pytorch-optimizer: pip install pytorch-optimizer"
3343
+ )
3344
+ optimizers["ranger"] = Ranger
3345
+
3346
+ if name not in optimizers:
3347
+ raise ValueError(
3348
+ f"Unknown optimizer: {name}. " f"Available: {list(optimizers.keys())}"
3349
+ )
3350
+
3351
+ return optimizers[name]
3352
+
3353
+
3354
+ ...
3355
+ ```
3356
+
3357
+
3358
+ ### `./optim/Ranger_Deep_Learning_Optimizer/__init__.py`
3359
+
3360
+ ```python
3361
+
3362
+ ...
3363
+ ```
3364
+
3365
+
3366
+ ### `./optim/Ranger_Deep_Learning_Optimizer/LICENSE`
3367
+
3368
+ ```plaintext
3369
+ Apache License
3370
+ Version 2.0, January 2004
3371
+ http://www.apache.org/licenses/
3372
+
3373
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
3374
+
3375
+ 1. Definitions.
3376
+
3377
+ "License" shall mean the terms and conditions for use, reproduction,
3378
+ and distribution as defined by Sections 1 through 9 of this document.
3379
+
3380
+ "Licensor" shall mean the copyright owner or entity authorized by
3381
+ the copyright owner that is granting the License.
3382
+
3383
+ "Legal Entity" shall mean the union of the acting entity and all
3384
+ other entities that control, are controlled by, or are under common
3385
+ control with that entity. For the purposes of this definition,
3386
+ "control" means (i) the power, direct or indirect, to cause the
3387
+ direction or management of such entity, whether by contract or
3388
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
3389
+ outstanding shares, or (iii) beneficial ownership of such entity.
3390
+
3391
+ "You" (or "Your") shall mean an individual or Legal Entity
3392
+ exercising permissions granted by this License.
3393
+
3394
+ "Source" form shall mean the preferred form for making modifications,
3395
+ including but not limited to software source code, documentation
3396
+ source, and configuration files.
3397
+
3398
+ "Object" form shall mean any form resulting from mechanical
3399
+ transformation or translation of a Source form, including but
3400
+ not limited to compiled object code, generated documentation,
3401
+ and conversions to other media types.
3402
+
3403
+ "Work" shall mean the work of authorship, whether in Source or
3404
+ Object form, made available under the License, as indicated by a
3405
+ copyright notice that is included in or attached to the work
3406
+ (an example is provided in the Appendix below).
3407
+
3408
+ "Derivative Works" shall mean any work, whether in Source or Object
3409
+ form, that is based on (or derived from) the Work and for which the
3410
+ editorial revisions, annotations, elaborations, or other modifications
3411
+ represent, as a whole, an original work of authorship. For the purposes
3412
+ of this License, Derivative Works shall not include works that remain
3413
+ separable from, or merely link (or bind by name) to the interfaces of,
3414
+ the Work and Derivative Works thereof.
3415
+
3416
+ "Contribution" shall mean any work of authorship, including
3417
+ the original version of the Work and any modifications or additions
3418
+ to that Work or Derivative Works thereof, that is intentionally
3419
+
3420
+ ...
3421
+ ```
3422
+
3423
+
3424
+ ### `./optim/Ranger_Deep_Learning_Optimizer/README.md`
3425
+
3426
+ ```markdown
3427
+ # Ranger-Deep-Learning-Optimizer
3428
+ </br>
3429
+ Ranger - a synergistic optimizer combining RAdam (Rectified Adam) and LookAhead, and now GC (gradient centralization) in one optimizer.
3430
+ </br>
3431
+
3432
+ #### quick note - Ranger21 is now in beta and is Ranger with a host of new improvements.
3433
+ Recommend you compare results with Ranger21: https://github.com/lessw2020/Ranger21
3434
+
3435
+ ### Latest version 20.9.4 - updates Gradient Centralization to GC2 (thanks to GC developer) and removes addcmul_ deprecation warnings in PyTorch 1.60.
3436
+ </br> </br>
3437
+ *Latest version is in ranger2020.py - looking at a few other additions before integrating into the main ranger.py.
3438
+
3439
+ What is Gradient Centralization? = "GC can be viewed as a projected gradient descent method with a constrained loss function. The Lipschitzness of the constrained loss function and its gradient is better so that the training process becomes more efficient and stable." Source paper: https://arxiv.org/abs/2004.01461v2
3440
+ </br>
3441
+ Ranger now uses Gradient Centralization by default, and applies it to all conv and fc layers by default. However, everything is customizable so you can test with and without on your own datasets. (Turn on off via "use_gc" flag at init).
3442
+ </br>
3443
+ ### Best training results - use a 75% flat lr, then step down and run lower lr for 25%, or cosine descend last 25%.
3444
+
3445
+ </br> Per extensive testing - It's important to note that simply running one learning rate the entire time will not produce optimal results.
3446
+ Effectively Ranger will end up 'hovering' around the optimal zone, but can't descend into it unless it has some additional run time at a lower rate to drop down into the optimal valley.
3447
+
3448
+ ### Full customization at init:
3449
+ <div align="center"><img src="ranger-with-gc-options.jpg" height="80%" width="80%" alt=""/></div>
3450
+ </br>
3451
+ Ranger will now print out id and gc settings at init so you can confirm the optimizer settings at train time:
3452
+ <div align="center"><img src="ranger-init.jpg" height="80%" width="80%" alt=""/></div>
3453
+
3454
+ /////////////////////
3455
+
3456
+ Medium article with more info:
3457
+ https://medium.com/@lessw/new-deep-learning-optimizer-ranger-synergistic-combination-of-radam-lookahead-for-the-best-of-2dc83f79a48d
3458
+
3459
+ Multiple updates:
3460
+ 1 - Ranger is the optimizer we used to beat the high scores for 12 different categories on the FastAI leaderboards! (Previous records all held with AdamW optimizer).
3461
+
3462
+ 2 - Highly recommend combining Ranger with: Mish activation function, and flat+ cosine anneal training curve.
3463
+
3464
+ 3 - Based on that, also found .95 is better than .90 for beta1 (momentum) param (ala betas=(0.95, 0.999)).
3465
+
3466
+ Fixes:
3467
+ 1 - Differential Group learning rates now supported. This was fix in RAdam and ported here thanks to @sholderbach.
3468
+ 2 - save and then load may leave first run weights stranded in memory, slowing down future runs = fixed.
3469
+
3470
+ ### Installation
3471
+ Clone the repo, cd into it and install it in editable mode (`-e` option).
3472
+ That way, these is no more need to re-install the package after modification.
3473
+ ```bash
3474
+ git clone https://github.com/lessw2020/Ranger-Deep-Learning-Optimizer
3475
+ cd Ranger-Deep-Learning-Optimizer
3476
+ pip install -e .
3477
+ ```
3478
+
3479
+ ...
3480
+ ```
3481
+
3482
+
3483
+ ### `./optim/Ranger_Deep_Learning_Optimizer/setup.py`
3484
+
3485
+ ```python
3486
+ #!/usr/bin/env python
3487
+
3488
+ import os
3489
+ from setuptools import find_packages, setup
3490
+
3491
+
3492
+ def read(fname):
3493
+ with open(os.path.join(os.path.dirname(__file__), fname)) as f:
3494
+ return f.read()
3495
+
3496
+
3497
+ setup(
3498
+ name="ranger",
3499
+ version="0.1.dev0",
3500
+ packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]),
3501
+ package_dir={"ranger": os.path.join(".", "ranger")},
3502
+ description="Ranger - a synergistic optimizer using RAdam "
3503
+ "(Rectified Adam) and LookAhead in one codebase ",
3504
+ long_description=read("README.md"),
3505
+ long_description_content_type="text/markdown",
3506
+ author="Less Wright",
3507
+ license="Apache",
3508
+ install_requires=["torch"],
3509
+ )
3510
+
3511
+ ...
3512
+ ```
3513
+
3514
+
3515
+ ### `./plt/__init__.py`
3516
+
3517
+ ```python
3518
+ #!/usr/bin/env python3
3519
+ """Scitex centralized plotting module.
3520
+
3521
+ Note: Metric calculation functions (calc_*) are imported from scitex.ml.metrics
3522
+ but re-exported here for backward compatibility. New code should import directly
3523
+ from scitex.ml.metrics instead.
3524
+ """
3525
+
3526
+ from ._plot_conf_mat import calc_bACC_from_conf_mat, calc_bacc_from_conf_mat, plot_conf_mat, conf_mat
3527
+ from ._plot_learning_curve import (
3528
+ plot_learning_curve,
3529
+ _prepare_metrics_df,
3530
+ _configure_accuracy_axis,
3531
+ _plot_training_data,
3532
+ _plot_validation_data,
3533
+ _plot_test_data,
3534
+ _add_epoch_vlines,
3535
+ _select_epoch_ticks,
3536
+ )
3537
+ from ._plot_optuna_study import optuna_study, plot_optuna_study
3538
+ from ._plot_roc_curve import plot_roc_curve
3539
+ from ._plot_pre_rec_curve import plot_pre_rec_curve
3540
+ from ._plot_feature_importance import (
3541
+ plot_feature_importance,
3542
+ plot_feature_importance_cv_summary,
3543
+ )
3544
+
3545
+ # Backward compatibility aliases
3546
+ learning_curve = plot_learning_curve
3547
+ plot_tra = _plot_training_data
3548
+ process_i_global = _prepare_metrics_df
3549
+ scatter_tes = _plot_test_data
3550
+ scatter_val = _plot_validation_data
3551
+ select_ticks = _select_epoch_ticks
3552
+ set_yaxis_for_acc = _configure_accuracy_axis
3553
+ vline_at_epochs = _add_epoch_vlines
3554
+
3555
+ __all__ = [
3556
+ # Plotting functions
3557
+ "plot_conf_mat",
3558
+ "conf_mat", # backward compat
3559
+ "plot_learning_curve",
3560
+ "learning_curve", # backward compat
3561
+ "optuna_study",
3562
+ "plot_optuna_study",
3563
+ "plot_roc_curve",
3564
+ "plot_pre_rec_curve",
3565
+ "plot_feature_importance",
3566
+ "plot_feature_importance_cv_summary",
3567
+ "plot_tra",
3568
+
3569
+ ...
3570
+ ```
3571
+
3572
+
3573
+ ### `./plt/_plot_conf_mat.py`
3574
+
3575
+ ```python
3576
+ #!/usr/bin/env python3
3577
+ # -*- coding: utf-8 -*-
3578
+ # Timestamp: "2025-10-02 07:15:10 (ywatanabe)"
3579
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_conf_mat.py
3580
+ # ----------------------------------------
3581
+ from __future__ import annotations
3582
+ import os
3583
+ __FILE__ = __file__
3584
+ __DIR__ = os.path.dirname(__FILE__)
3585
+ # ----------------------------------------
3586
+
3587
+ import argparse
3588
+
3589
+ import matplotlib
3590
+ import numpy as np
3591
+ import pandas as pd
3592
+ import scitex
3593
+ import seaborn as sns
3594
+ from matplotlib import ticker
3595
+ from mpl_toolkits.axes_grid1 import make_axes_locatable
3596
+ from sklearn.metrics import balanced_accuracy_score
3597
+ from sklearn.metrics import confusion_matrix as sklearn_confusion_matrix
3598
+
3599
+ # Import metric calculation from centralized location (SoC: metrics in scitex.ml.metrics)
3600
+ from scitex.ml.metrics import calc_bacc_from_conf_mat
3601
+
3602
+ # Aliases for backward compatibility
3603
+ calc_bACC_from_conf_mat = calc_bacc_from_conf_mat
3604
+
3605
+
3606
+ def plot_conf_mat(
3607
+ cm=None,
3608
+ y_true=None,
3609
+ y_pred=None,
3610
+ y_pred_proba=None,
3611
+ labels=None,
3612
+ sorted_labels=None,
3613
+ pred_labels=None,
3614
+ sorted_pred_labels=None,
3615
+ true_labels=None,
3616
+ sorted_true_labels=None,
3617
+ label_rotation_xy=(15, 15),
3618
+ title="Confusion Matrix",
3619
+ colorbar=True,
3620
+ x_extend_ratio=1.0,
3621
+ y_extend_ratio=1.0,
3622
+ ax=None,
3623
+ spath=None,
3624
+ ):
3625
+ """
3626
+
3627
+ ...
3628
+ ```
3629
+
3630
+
3631
+ ### `./plt/_plot_feature_importance.py`
3632
+
3633
+ ```python
3634
+ #!/usr/bin/env python3
3635
+ # -*- coding: utf-8 -*-
3636
+ # Timestamp: "2025-10-03 04:10:00 (ywatanabe)"
3637
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_feature_importance.py
3638
+
3639
+ """
3640
+ Plot feature importance from trained models.
3641
+
3642
+ This module provides visualization functions for feature importance,
3643
+ supporting both single-fold and cross-validation summary plots.
3644
+ """
3645
+
3646
+ from pathlib import Path
3647
+ from typing import Dict, List, Optional, Union
3648
+ import numpy as np
3649
+ import matplotlib.pyplot as plt
3650
+ import scitex as stx
3651
+
3652
+
3653
+ def plot_feature_importance(
3654
+ importance: Union[np.ndarray, Dict[str, float]],
3655
+ feature_names: Optional[List[str]] = None,
3656
+ top_n: int = 20,
3657
+ title: str = "Feature Importance",
3658
+ xlabel: str = "Importance",
3659
+ figsize: tuple = (10, 8),
3660
+ spath: Optional[Union[str, Path]] = None,
3661
+ ) -> plt.Figure:
3662
+ """
3663
+ Plot feature importance as a horizontal bar chart.
3664
+
3665
+ Parameters
3666
+ ----------
3667
+ importance : np.ndarray or Dict[str, float]
3668
+ Feature importance values. If array, must match feature_names length.
3669
+ If dict, keys are feature names and values are importances.
3670
+ feature_names : List[str], optional
3671
+ Names of features (required if importance is array)
3672
+ top_n : int, default 20
3673
+ Number of top features to display
3674
+ title : str, default "Feature Importance"
3675
+ Plot title
3676
+ xlabel : str, default "Importance"
3677
+ X-axis label
3678
+ figsize : tuple, default (10, 8)
3679
+ Figure size
3680
+ spath : Union[str, Path], optional
3681
+ Path to save the figure
3682
+
3683
+ Returns
3684
+
3685
+ ...
3686
+ ```
3687
+
3688
+
3689
+ ### `./plt/_plot_learning_curve.py`
3690
+
3691
+ ```python
3692
+ #!/usr/bin/env python3
3693
+ # -*- coding: utf-8 -*-
3694
+ # Timestamp: "2025-10-02 19:50:54 (ywatanabe)"
3695
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_learning_curve.py
3696
+ # ----------------------------------------
3697
+ from __future__ import annotations
3698
+ import os
3699
+ __FILE__ = __file__
3700
+ __DIR__ = os.path.dirname(__FILE__)
3701
+ # ----------------------------------------
3702
+ # Time-stamp: "2024-03-12 19:52:48 (ywatanabe)"
3703
+
3704
+ import argparse
3705
+ import re
3706
+
3707
+ import numpy as np
3708
+ import pandas as pd
3709
+ import scitex
3710
+ from scitex.plt.color import str2hex
3711
+
3712
+
3713
+ def _prepare_metrics_df(metrics_df):
3714
+ """Prepare metrics DataFrame with i_global as index."""
3715
+ if metrics_df.index.name != "i_global":
3716
+ try:
3717
+ metrics_df = metrics_df.set_index("i_global")
3718
+ except KeyError:
3719
+ print(
3720
+ "Error: The DataFrame does not contain a column named 'i_global'. "
3721
+ "Please check the column names."
3722
+ )
3723
+ except Exception as e:
3724
+ print(f"An unexpected error occurred: {e}")
3725
+ metrics_df["i_global"] = metrics_df.index # alias
3726
+ return metrics_df
3727
+
3728
+
3729
+ def _configure_accuracy_axis(ax, metric_key):
3730
+ """Configure y-axis for accuracy metrics."""
3731
+ if re.search("[aA][cC][cC]", metric_key):
3732
+ ax.set_ylim(0, 1)
3733
+ ax.set_yticks([0, 0.5, 1.0])
3734
+ return ax
3735
+
3736
+
3737
+ def _plot_training_data(ax, metrics_df, metric_key, linewidth=1, color=None):
3738
+ """Plot training phase data as line."""
3739
+ if color is None:
3740
+ color = str2hex("blue")
3741
+
3742
+
3743
+ ...
3744
+ ```
3745
+
3746
+
3747
+ ### `./plt/_plot_optuna_study.py`
3748
+
3749
+ ```python
3750
+ #!/usr/bin/env python3
3751
+ # -*- coding: utf-8 -*-
3752
+ # Timestamp: "2025-10-02 18:46:00 (ywatanabe)"
3753
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_optuna_study.py
3754
+ # ----------------------------------------
3755
+ from __future__ import annotations
3756
+ import os
3757
+ __FILE__ = __file__
3758
+ __DIR__ = os.path.dirname(__FILE__)
3759
+ # ----------------------------------------
3760
+
3761
+ """
3762
+ Functionalities:
3763
+ - Loads Optuna study and generates various visualizations
3764
+ - Creates optimization history, parameter importances, slice plots
3765
+ - Saves study history and visualization results
3766
+
3767
+ Dependencies:
3768
+ - packages:
3769
+ - optuna
3770
+ - pandas
3771
+ - scitex
3772
+
3773
+ IO:
3774
+ - input-files:
3775
+ - Optuna study database (.db file)
3776
+ - output-files:
3777
+ - study_history.csv
3778
+ - optimization_history.png/html
3779
+ - param_importances.png/html
3780
+ - slice.png/html
3781
+ - contour.png/html
3782
+ - parallel_coordinate.png/html
3783
+ """
3784
+
3785
+ """Imports"""
3786
+ import argparse
3787
+
3788
+ import scitex as stx
3789
+ from scitex import logging
3790
+
3791
+ logger = logging.getLogger(__name__)
3792
+
3793
+
3794
+ def plot_optuna_study(lpath, value_str, sort=False):
3795
+ """
3796
+ Loads an Optuna study and generates various visualizations for each target metric.
3797
+
3798
+ Parameters:
3799
+ - lpath (str): Path to the Optuna study database.
3800
+
3801
+ ...
3802
+ ```
3803
+
3804
+
3805
+ ### `./plt/_plot_pre_rec_curve.py`
3806
+
3807
+ ```python
3808
+ #!/usr/bin/env python3
3809
+ # -*- coding: utf-8 -*-
3810
+ # Timestamp: "2025-10-02 19:44:06 (ywatanabe)"
3811
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_pre_rec_curve.py
3812
+ # ----------------------------------------
3813
+ from __future__ import annotations
3814
+ import os
3815
+ __FILE__ = __file__
3816
+ __DIR__ = os.path.dirname(__FILE__)
3817
+ # ----------------------------------------
3818
+
3819
+ import argparse
3820
+
3821
+ import numpy as np
3822
+ from scitex.plt.color import get_colors_from_conf_matap
3823
+ from sklearn.metrics import average_precision_score, precision_recall_curve
3824
+
3825
+
3826
+ def _solve_intersection(f1, a, b):
3827
+ """Determine intersection of line (y = ax + b) and iso-f1 curve."""
3828
+ _a = 2 * a
3829
+ _b = -a * f1 + 2 * b - f1
3830
+ _c = -b * f1
3831
+
3832
+ x_f = (-_b + np.sqrt(_b**2 - 4 * _a * _c)) / (2 * _a)
3833
+ y_f = a * x_f + b
3834
+
3835
+ return (x_f, y_f)
3836
+
3837
+
3838
+ def _to_onehot(class_indices, n_classes):
3839
+ """Convert class indices to one-hot encoding."""
3840
+ eye = np.eye(n_classes, dtype=int)
3841
+ return eye[class_indices]
3842
+
3843
+
3844
+ def plot_pre_rec_curve(true_class, pred_proba, labels, ax=None, spath=None):
3845
+ """
3846
+ Plot precision-recall curve.
3847
+
3848
+ Parameters
3849
+ ----------
3850
+ true_class : array-like
3851
+ True class labels
3852
+ pred_proba : array-like
3853
+ Predicted probabilities
3854
+ labels : list
3855
+ Class labels
3856
+ ax : matplotlib axis, optional
3857
+ Axis to plot on. If None, creates new figure
3858
+
3859
+ ...
3860
+ ```
3861
+
3862
+
3863
+ ### `./plt/_plot_roc_curve.py`
3864
+
3865
+ ```python
3866
+ #!/usr/bin/env python3
3867
+ # -*- coding: utf-8 -*-
3868
+ # Timestamp: "2025-10-02 19:44:13 (ywatanabe)"
3869
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_roc_curve.py
3870
+ # ----------------------------------------
3871
+ from __future__ import annotations
3872
+ import os
3873
+ __FILE__ = __file__
3874
+ __DIR__ = os.path.dirname(__FILE__)
3875
+ # ----------------------------------------
3876
+
3877
+ import argparse
3878
+
3879
+ import numpy as np
3880
+ import scitex
3881
+ from scitex.plt.color import get_colors_from_conf_matap
3882
+ from sklearn.metrics import roc_auc_score, roc_curve
3883
+
3884
+
3885
+ def _to_onehot(class_indices, n_classes):
3886
+ """Convert class indices to one-hot encoding."""
3887
+ eye = np.eye(n_classes, dtype=int)
3888
+ return eye[class_indices]
3889
+
3890
+
3891
+ def plot_roc_curve(true_class, pred_proba, labels, ax=None, spath=None):
3892
+ """
3893
+ Plot ROC-AUC curve.
3894
+
3895
+ Parameters
3896
+ ----------
3897
+ true_class : array-like
3898
+ True class labels
3899
+ pred_proba : array-like
3900
+ Predicted probabilities
3901
+ labels : list
3902
+ Class labels
3903
+ ax : matplotlib axis, optional
3904
+ Axis to plot on. If None, creates new figure
3905
+ spath : str, optional
3906
+ Path to save figure
3907
+
3908
+ Returns
3909
+ -------
3910
+ fig : matplotlib.figure.Figure
3911
+ Figure object
3912
+ metrics : dict
3913
+ ROC metrics
3914
+ """
3915
+ import scitex as stx
3916
+
3917
+ ...
3918
+ ```
3919
+
3920
+
3921
+ ### `./README.md`
3922
+
3923
+ ```markdown
3924
+ # SciTeX AI Module
3925
+
3926
+ The AI module provides machine learning and artificial intelligence utilities for the SciTeX framework.
3927
+
3928
+ ## Overview
3929
+
3930
+ The AI module is organized into several submodules:
3931
+
3932
+ ### Core Components
3933
+
3934
+ - **`genai`** - Generative AI integration with multiple providers (OpenAI, Anthropic, Google, etc.)
3935
+ - **`training`** - Training utilities (EarlyStopping, LearningCurveLogger)
3936
+ - **`classification`** - Classification tools (ClassificationReporter, Classifier)
3937
+
3938
+ ### Neural Network Components
3939
+
3940
+ - **`layer`** - Custom neural network layers
3941
+ - **`loss`** - Loss functions for training
3942
+ - **`act`** - Activation functions
3943
+ - **`optim`** - Optimizers and optimization utilities
3944
+
3945
+ ### Analysis & Visualization
3946
+
3947
+ - **`plt`** - AI-specific plotting utilities
3948
+ - **`metrics`** - Performance metrics
3949
+ - **`clustering`** - Clustering algorithms (UMAP, PCA)
3950
+ - **`feature_extraction`** - Feature extraction methods
3951
+
3952
+ ### Utilities
3953
+
3954
+ - **`utils`** - General AI/ML utilities
3955
+ - **`sampling`** - Data sampling methods
3956
+ - **`sklearn`** - Scikit-learn integration
3957
+
3958
+ ## Installation
3959
+
3960
+ ```bash
3961
+ pip install scitex
3962
+ ```
3963
+
3964
+ ## Quick Start
3965
+
3966
+ ### Generative AI (GenAI)
3967
+
3968
+ The GenAI module provides a unified interface for multiple AI providers:
3969
+
3970
+ ```python
3971
+ from scitex.ai.genai import GenAI
3972
+
3973
+ # Basic usage
3974
+ ```
3975
+
3976
+ ...
3977
+ ```
3978
+
3979
+
3980
+ ### `./sampling/undersample.py`
3981
+
3982
+ ```python
3983
+ #!/usr/bin/env python3
3984
+ # -*- coding: utf-8 -*-
3985
+ # Time-stamp: "2024-11-24 10:13:17 (ywatanabe)"
3986
+ # File: ./scitex_repo/src/scitex/ai/sampling/undersample.py
3987
+
3988
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/sampling/undersample.py"
3989
+
3990
+ from typing import Tuple
3991
+ from ...types import ArrayLike
3992
+
3993
+ try:
3994
+ from imblearn.under_sampling import RandomUnderSampler
3995
+ IMBLEARN_AVAILABLE = True
3996
+ except ImportError:
3997
+ IMBLEARN_AVAILABLE = False
3998
+
3999
+
4000
+ def undersample(
4001
+ X: ArrayLike, y: ArrayLike, random_state: int = 42
4002
+ ) -> Tuple[ArrayLike, ArrayLike]:
4003
+ """Undersample data preserving input type.
4004
+
4005
+ Args:
4006
+ X: Features array-like of shape (n_samples, n_features)
4007
+ y: Labels array-like of shape (n_samples,)
4008
+ Returns:
4009
+ Resampled X, y of same type as input
4010
+
4011
+ Raises:
4012
+ ImportError: If imblearn is not installed
4013
+ """
4014
+ if not IMBLEARN_AVAILABLE:
4015
+ raise ImportError(
4016
+ "The undersample function requires the imbalanced-learn package. "
4017
+ "Install it with: pip install imbalanced-learn"
4018
+ )
4019
+
4020
+ rus = RandomUnderSampler(random_state=random_state)
4021
+ X_resampled, y_resampled = rus.fit_resample(X, y)
4022
+ return X_resampled, y_resampled
4023
+
4024
+
4025
+ # EOF
4026
+
4027
+ ...
4028
+ ```
4029
+
4030
+
4031
+ ### `./sk/_clf.py`
4032
+
4033
+ ```python
4034
+ #!/usr/bin/env python3
4035
+ # -*- coding: utf-8 -*-
4036
+ # Time-stamp: "2024-03-23 17:36:05 (ywatanabe)"
4037
+
4038
+ import numpy as np
4039
+ from sklearn.decomposition import PCA
4040
+ from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
4041
+ from sklearn.feature_selection import SelectKBest, f_classif
4042
+ from sklearn.linear_model import LogisticRegression, RidgeClassifierCV
4043
+ from sklearn.pipeline import make_pipeline
4044
+ from sklearn.svm import SVC, LinearSVC
4045
+ from sktime.classification.deep_learning.cnn import CNNClassifier
4046
+ from sktime.classification.deep_learning.inceptiontime import (
4047
+ InceptionTimeClassifier,
4048
+ )
4049
+ from sktime.classification.deep_learning.lstmfcn import LSTMFCNClassifier
4050
+ from sktime.classification.dummy import DummyClassifier
4051
+ from sktime.classification.feature_based import TSFreshClassifier
4052
+ from sktime.classification.hybrid import HIVECOTEV2
4053
+ from sktime.classification.interval_based import TimeSeriesForestClassifier
4054
+ from sktime.classification.kernel_based import RocketClassifier, TimeSeriesSVC
4055
+ from sktime.transformations.panel.reduce import Tabularizer
4056
+ from sktime.transformations.panel.rocket import Rocket
4057
+
4058
+ # _rocket_pipeline = make_pipeline(
4059
+ # Rocket(n_jobs=-1),
4060
+ # RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
4061
+ # )
4062
+
4063
+
4064
+ # def rocket_pipeline(*args, **kwargs):
4065
+ # return _rocket_pipeline
4066
+
4067
+
4068
+ def rocket_pipeline(*args, **kwargs):
4069
+ return make_pipeline(
4070
+ Rocket(*args, **kwargs),
4071
+ LogisticRegression(
4072
+ max_iter=1000
4073
+ ), # Increase max_iter if needed for convergence
4074
+ # RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
4075
+ # SVC(probability=True, kernel="linear"),
4076
+ )
4077
+
4078
+
4079
+ # def rocket_pipeline(*args, **kwargs):
4080
+ # return make_pipeline(
4081
+ # Rocket(*args, **kwargs),
4082
+ # SelectKBest(f_classif, k=500),
4083
+ # PCA(n_components=100),
4084
+
4085
+ ...
4086
+ ```
4087
+
4088
+
4089
+ ### `./sk/__init__.py`
4090
+
4091
+ ```python
4092
+ #!/usr/bin/env python3
4093
+ """Scitex sk module."""
4094
+
4095
+ from ._clf import GB_pipeline, rocket_pipeline
4096
+ from ._to_sktime import to_sktime_df
4097
+
4098
+ __all__ = [
4099
+ "GB_pipeline",
4100
+ "rocket_pipeline",
4101
+ "to_sktime_df",
4102
+ ]
4103
+
4104
+ ...
4105
+ ```
4106
+
4107
+
4108
+ ### `./sk/_to_sktime.py`
4109
+
4110
+ ```python
4111
+ #!/usr/bin/env python3
4112
+ # -*- coding: utf-8 -*-
4113
+ # Time-stamp: "2024-03-05 13:17:04 (ywatanabe)"
4114
+
4115
+ # import warnings
4116
+
4117
+ import numpy as np
4118
+ import pandas as pd
4119
+ import torch
4120
+
4121
+
4122
+ def to_sktime_df(X):
4123
+ """
4124
+ Converts a dataset to a format compatible with sktime, encapsulating each sample as a pandas DataFrame.
4125
+
4126
+ Arguments:
4127
+ - X (numpy.ndarray or torch.Tensor or pandas.DataFrame): The input dataset with shape (n_samples, n_chs, seq_len).
4128
+ It should be a 3D array-like structure containing the time series data.
4129
+
4130
+ Return:
4131
+ - sktime_df (pandas.DataFrame): A DataFrame where each element is a pandas Series representing a univariate time series.
4132
+
4133
+ Data Types and Shapes:
4134
+ - If X is a numpy.ndarray, it should have the shape (n_samples, n_chs, seq_len).
4135
+ - If X is a torch.Tensor, it should have the shape (n_samples, n_chs, seq_len) and will be converted to a numpy array.
4136
+ - If X is a pandas.DataFrame, it is assumed to already be in the correct format and will be returned as is.
4137
+
4138
+ References:
4139
+ - sktime: https://github.com/alan-turing-institute/sktime
4140
+
4141
+ Examples:
4142
+ --------
4143
+ >>> X_np = np.random.rand(64, 160, 1024)
4144
+ >>> sktime_df = to_sktime_df(X_np)
4145
+ >>> type(sktime_df)
4146
+ <class 'pandas.core.frame.DataFrame'>
4147
+ """
4148
+ if isinstance(X, pd.DataFrame):
4149
+ return X
4150
+ elif torch.is_tensor(X):
4151
+ X = X.numpy()
4152
+ elif not isinstance(X, np.ndarray):
4153
+ raise ValueError(
4154
+ "Input X must be a numpy.ndarray, torch.Tensor, or pandas.DataFrame"
4155
+ )
4156
+
4157
+ X = X.astype(np.float64)
4158
+
4159
+ def _format_a_sample_for_sktime(x):
4160
+ """
4161
+
4162
+ ...
4163
+ ```
4164
+
4165
+
4166
+ ### `./sklearn/clf.py`
4167
+
4168
+ ```python
4169
+ #!/usr/bin/env python3
4170
+ # -*- coding: utf-8 -*-
4171
+ # Time-stamp: "2024-03-23 17:36:05 (ywatanabe)"
4172
+
4173
+ import numpy as np
4174
+ from sklearn.decomposition import PCA
4175
+ from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
4176
+ from sklearn.feature_selection import SelectKBest, f_classif
4177
+ from sklearn.linear_model import LogisticRegression, RidgeClassifierCV
4178
+ from sklearn.pipeline import make_pipeline
4179
+ from sklearn.svm import SVC, LinearSVC
4180
+ from sktime.classification.deep_learning.cnn import CNNClassifier
4181
+ from sktime.classification.deep_learning.inceptiontime import (
4182
+ InceptionTimeClassifier,
4183
+ )
4184
+ from sktime.classification.deep_learning.lstmfcn import LSTMFCNClassifier
4185
+ from sktime.classification.dummy import DummyClassifier
4186
+ from sktime.classification.feature_based import TSFreshClassifier
4187
+ from sktime.classification.hybrid import HIVECOTEV2
4188
+ from sktime.classification.interval_based import TimeSeriesForestClassifier
4189
+ from sktime.classification.kernel_based import RocketClassifier, TimeSeriesSVC
4190
+ from sktime.transformations.panel.reduce import Tabularizer
4191
+ from sktime.transformations.panel.rocket import Rocket
4192
+
4193
+ # _rocket_pipeline = make_pipeline(
4194
+ # Rocket(n_jobs=-1),
4195
+ # RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
4196
+ # )
4197
+
4198
+
4199
+ # def rocket_pipeline(*args, **kwargs):
4200
+ # return _rocket_pipeline
4201
+
4202
+
4203
+ def rocket_pipeline(*args, **kwargs):
4204
+ return make_pipeline(
4205
+ Rocket(*args, **kwargs),
4206
+ LogisticRegression(
4207
+ max_iter=1000
4208
+ ), # Increase max_iter if needed for convergence
4209
+ # RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
4210
+ # SVC(probability=True, kernel="linear"),
4211
+ )
4212
+
4213
+
4214
+ # def rocket_pipeline(*args, **kwargs):
4215
+ # return make_pipeline(
4216
+ # Rocket(*args, **kwargs),
4217
+ # SelectKBest(f_classif, k=500),
4218
+ # PCA(n_components=100),
4219
+
4220
+ ...
4221
+ ```
4222
+
4223
+
4224
+ ### `./sklearn/__init__.py`
4225
+
4226
+ ```python
4227
+ #!/usr/bin/env python3
4228
+ """Sklearn wrappers and utilities."""
4229
+
4230
+ import warnings
4231
+
4232
+ try:
4233
+ from .clf import *
4234
+ except ImportError as e:
4235
+ warnings.warn(
4236
+ f"Could not import clf from scitex.ai.sklearn: {str(e)}. "
4237
+ f"Some functionality may be unavailable. "
4238
+ f"Consider installing missing dependencies if you need this module.",
4239
+ ImportWarning,
4240
+ stacklevel=2
4241
+ )
4242
+
4243
+ try:
4244
+ from .to_sktime import *
4245
+ except ImportError as e:
4246
+ warnings.warn(
4247
+ f"Could not import to_sktime from scitex.ai.sklearn: {str(e)}. "
4248
+ f"Some functionality may be unavailable. "
4249
+ f"Consider installing missing dependencies if you need this module.",
4250
+ ImportWarning,
4251
+ stacklevel=2
4252
+ )
4253
+
4254
+ ...
4255
+ ```
4256
+
4257
+
4258
+ ### `./sklearn/to_sktime.py`
4259
+
4260
+ ```python
4261
+ #!/usr/bin/env python3
4262
+ # -*- coding: utf-8 -*-
4263
+ # Time-stamp: "2024-03-05 13:17:04 (ywatanabe)"
4264
+
4265
+ # import warnings
4266
+
4267
+ import numpy as np
4268
+ import pandas as pd
4269
+ import torch
4270
+
4271
+
4272
+ def to_sktime_df(X):
4273
+ """
4274
+ Converts a dataset to a format compatible with sktime, encapsulating each sample as a pandas DataFrame.
4275
+
4276
+ Arguments:
4277
+ - X (numpy.ndarray or torch.Tensor or pandas.DataFrame): The input dataset with shape (n_samples, n_chs, seq_len).
4278
+ It should be a 3D array-like structure containing the time series data.
4279
+
4280
+ Return:
4281
+ - sktime_df (pandas.DataFrame): A DataFrame where each element is a pandas Series representing a univariate time series.
4282
+
4283
+ Data Types and Shapes:
4284
+ - If X is a numpy.ndarray, it should have the shape (n_samples, n_chs, seq_len).
4285
+ - If X is a torch.Tensor, it should have the shape (n_samples, n_chs, seq_len) and will be converted to a numpy array.
4286
+ - If X is a pandas.DataFrame, it is assumed to already be in the correct format and will be returned as is.
4287
+
4288
+ References:
4289
+ - sktime: https://github.com/alan-turing-institute/sktime
4290
+
4291
+ Examples:
4292
+ --------
4293
+ >>> X_np = np.random.rand(64, 160, 1024)
4294
+ >>> sktime_df = to_sktime_df(X_np)
4295
+ >>> type(sktime_df)
4296
+ <class 'pandas.core.frame.DataFrame'>
4297
+ """
4298
+ if isinstance(X, pd.DataFrame):
4299
+ return X
4300
+ elif torch.is_tensor(X):
4301
+ X = X.detach().numpy()
4302
+ elif not isinstance(X, np.ndarray):
4303
+ raise ValueError(
4304
+ "Input X must be a numpy.ndarray, torch.Tensor, or pandas.DataFrame"
4305
+ )
4306
+
4307
+ X = X.astype(np.float64)
4308
+
4309
+ def _format_a_sample_for_sktime(x):
4310
+ """
4311
+
4312
+ ...
4313
+ ```
4314
+
4315
+
4316
+ ### `./training/_EarlyStopping.py`
4317
+
4318
+ ```python
4319
+ #!/usr/bin/env python3
4320
+ # Time-stamp: "2024-09-07 01:09:38 (ywatanabe)"
4321
+
4322
+ import os
4323
+
4324
+ import scitex
4325
+ import numpy as np
4326
+
4327
+
4328
+ class EarlyStopping:
4329
+ """
4330
+ Early stops the training if the validation score doesn't improve after a given patience period.
4331
+
4332
+ """
4333
+
4334
+ def __init__(self, patience=7, verbose=False, delta=1e-5, direction="minimize"):
4335
+ """
4336
+ Args:
4337
+ patience (int): How long to wait after last time validation score improved.
4338
+ Default: 7
4339
+ verbose (bool): If True, prints a message for each validation score improvement.
4340
+ Default: False
4341
+ delta (float): Minimum change in the monitored quantity to qualify as an improvement.
4342
+ Default: 0
4343
+ """
4344
+ self.patience = patience
4345
+ self.verbose = verbose
4346
+ self.direction = direction
4347
+
4348
+ self.delta = delta
4349
+
4350
+ # default
4351
+ self.counter = 0
4352
+ self.best_score = np.inf if direction == "minimize" else -np.inf
4353
+ self.best_i_global = None
4354
+ self.models_spaths_dict = {}
4355
+
4356
+ def is_best(self, val_score):
4357
+ is_smaller = val_score < self.best_score - abs(self.delta)
4358
+ is_larger = self.best_score + abs(self.delta) < val_score
4359
+ return is_smaller if self.direction == "minimize" else is_larger
4360
+
4361
+ def __call__(self, current_score, models_spaths_dict, i_global):
4362
+ # The 1st call
4363
+ if self.best_score is None:
4364
+ self.save(current_score, models_spaths_dict, i_global)
4365
+ return False
4366
+
4367
+ # After the 2nd call
4368
+ if self.is_best(current_score):
4369
+
4370
+ ...
4371
+ ```
4372
+
4373
+
4374
+ ### `./training/__init__.py`
4375
+
4376
+ ```python
4377
+ #!/usr/bin/env python3
4378
+ """Training utilities."""
4379
+
4380
+ from ._EarlyStopping import EarlyStopping
4381
+ from ._LearningCurveLogger import LearningCurveLogger
4382
+
4383
+ __all__ = ["EarlyStopping", "LearningCurveLogger"]
4384
+
4385
+ ...
4386
+ ```
4387
+
4388
+
4389
+ ### `./training/_LearningCurveLogger.py`
4390
+
4391
+ ```python
4392
+ #!/usr/bin/env python3
4393
+ # -*- coding: utf-8 -*-
4394
+ # Timestamp: "2024-11-20 08:49:50 (ywatanabe)"
4395
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/ml/training/_LearningCurveLogger.py
4396
+ # ----------------------------------------
4397
+ from __future__ import annotations
4398
+ import os
4399
+ __FILE__ = __file__
4400
+ __DIR__ = os.path.dirname(__FILE__)
4401
+ # ----------------------------------------
4402
+
4403
+ """
4404
+ Functionality:
4405
+ - Records and visualizes learning curves during model training
4406
+ - Supports tracking of multiple metrics across training/validation/test phases
4407
+ - Generates plots showing training progress over iterations and epochs
4408
+ - Delegates plotting to scitex.ml.plt.plot_learning_curve for consistency
4409
+
4410
+ Input:
4411
+ - Training metrics dictionary containing loss, accuracy, predictions etc.
4412
+ - Step information (Training/Validation/Test)
4413
+
4414
+ Output:
4415
+ - Learning curve plots via scitex.ml.plt.plot_learning_curve
4416
+ - DataFrames with recorded metrics
4417
+ - Training progress prints
4418
+
4419
+ Prerequisites:
4420
+ - PyTorch
4421
+ - scikit-learn
4422
+ - matplotlib
4423
+ - pandas
4424
+ - numpy
4425
+ - scitex
4426
+ """
4427
+
4428
+ import re
4429
+ import warnings
4430
+ from collections import defaultdict
4431
+ from pprint import pprint
4432
+ from typing import Any, Dict, List, Optional, Union
4433
+
4434
+ import matplotlib
4435
+ import matplotlib.pyplot as plt
4436
+ import numpy as np
4437
+ import pandas as pd
4438
+
4439
+
4440
+ class LearningCurveLogger:
4441
+ """Records and visualizes learning metrics during model training.
4442
+
4443
+ ...
4444
+ ```
4445
+
4446
+
4447
+ ### `./training/legacy/early_stopping.py`
4448
+
4449
+ ```python
4450
+ #!/usr/bin/env python3
4451
+ # Time-stamp: "2024-09-07 01:09:38 (ywatanabe)"
4452
+
4453
+ import os
4454
+
4455
+ import scitex
4456
+ import numpy as np
4457
+
4458
+
4459
+ class EarlyStopping:
4460
+ """
4461
+ Early stops the training if the validation score doesn't improve after a given patience period.
4462
+
4463
+ """
4464
+
4465
+ def __init__(self, patience=7, verbose=False, delta=1e-5, direction="minimize"):
4466
+ """
4467
+ Args:
4468
+ patience (int): How long to wait after last time validation score improved.
4469
+ Default: 7
4470
+ verbose (bool): If True, prints a message for each validation score improvement.
4471
+ Default: False
4472
+ delta (float): Minimum change in the monitored quantity to qualify as an improvement.
4473
+ Default: 0
4474
+ """
4475
+ self.patience = patience
4476
+ self.verbose = verbose
4477
+ self.direction = direction
4478
+
4479
+ self.delta = delta
4480
+
4481
+ # default
4482
+ self.counter = 0
4483
+ self.best_score = np.inf if direction == "minimize" else -np.inf
4484
+ self.best_i_global = None
4485
+ self.models_spaths_dict = {}
4486
+
4487
+ def is_best(self, val_score):
4488
+ is_smaller = val_score < self.best_score - abs(self.delta)
4489
+ is_larger = self.best_score + abs(self.delta) < val_score
4490
+ return is_smaller if self.direction == "minimize" else is_larger
4491
+
4492
+ def __call__(self, current_score, models_spaths_dict, i_global):
4493
+ # The 1st call
4494
+ if self.best_score is None:
4495
+ self.save(current_score, models_spaths_dict, i_global)
4496
+ return False
4497
+
4498
+ # After the 2nd call
4499
+ if self.is_best(current_score):
4500
+
4501
+ ...
4502
+ ```
4503
+
4504
+
4505
+ ### `./training/legacy/learning_curve_logger.py`
4506
+
4507
+ ```python
4508
+ #!/usr/bin/env python3
4509
+ # -*- coding: utf-8 -*-
4510
+ # Time-stamp: "2024-11-20 08:49:50 (ywatanabe)"
4511
+ # File: ./scitex_repo/src/scitex/ai/_LearningCurveLogger.py
4512
+
4513
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_LearningCurveLogger.py"
4514
+
4515
+ """
4516
+ Functionality:
4517
+ - Records and visualizes learning curves during model training
4518
+ - Supports tracking of multiple metrics across training/validation/test phases
4519
+ - Generates plots showing training progress over iterations and epochs
4520
+
4521
+ Input:
4522
+ - Training metrics dictionary containing loss, accuracy, predictions etc.
4523
+ - Step information (Training/Validation/Test)
4524
+
4525
+ Output:
4526
+ - Learning curve plots
4527
+ - Dataframes with recorded metrics
4528
+ - Training progress prints
4529
+
4530
+ Prerequisites:
4531
+ - PyTorch
4532
+ - scikit-learn
4533
+ - matplotlib
4534
+ - pandas
4535
+ - numpy
4536
+ """
4537
+
4538
+ import re as _re
4539
+ from collections import defaultdict as _defaultdict
4540
+ from pprint import pprint as _pprint
4541
+ from typing import Dict as _Dict
4542
+ from typing import List as _List
4543
+ from typing import Union as _Union
4544
+ from typing import Optional as _Optional
4545
+ from typing import Any as _Any
4546
+
4547
+ import matplotlib as _matplotlib
4548
+ import matplotlib.figure
4549
+ import pandas as _pd
4550
+ import numpy as _np
4551
+ import warnings as _warnings
4552
+ import torch as _torch
4553
+
4554
+
4555
+ class LearningCurveLogger:
4556
+ """Records and visualizes learning metrics during model training.
4557
+
4558
+
4559
+ ...
4560
+ ```
4561
+
4562
+
4563
+ ### `./utils/_check_params.py`
4564
+
4565
+ ```python
4566
+ #!/usr/bin/env python3
4567
+ # Time-stamp: "2024-02-17 12:38:40 (ywatanabe)"
4568
+
4569
+ from pprint import pprint as _pprint
4570
+ from time import sleep
4571
+
4572
+ # def get_params(model, tgt_name=None, sleep_sec=2, show=False):
4573
+
4574
+ # name_shape_dict = {}
4575
+ # for name, param in model.named_parameters():
4576
+ # learnable = "Learnable" if param.requires_grad else "Freezed"
4577
+
4578
+ # if (tgt_name is not None) & (name == tgt_name):
4579
+ # return param
4580
+ # if tgt_name is None:
4581
+ # # print(f"\n{param}\n{param.shape}\nname: {name}\n")
4582
+ # if show is True:
4583
+ # print(
4584
+ # f"\n{param}: {param.shape}\nname: {name}\nStatus: {learnable}\n"
4585
+ # )
4586
+ # sleep(sleep_sec)
4587
+ # name_shape_dict[name] = list(param.shape)
4588
+
4589
+ # if tgt_name is None:
4590
+ # print()
4591
+ # _pprint(name_shape_dict)
4592
+ # print()
4593
+
4594
+
4595
+ def check_params(model, tgt_name=None, show=False):
4596
+
4597
+ out_dict = {}
4598
+
4599
+ for name, param in model.named_parameters():
4600
+ learnable = "Learnable" if param.requires_grad else "Freezed"
4601
+
4602
+ if tgt_name is None:
4603
+ out_dict[name] = (param.shape, learnable)
4604
+
4605
+ elif (tgt_name is not None) & (name == tgt_name):
4606
+ out_dict[name] = (param.shape, learnable)
4607
+
4608
+ elif (tgt_name is not None) & (name != tgt_name):
4609
+ continue
4610
+
4611
+ if show:
4612
+ for k, v in out_dict.items():
4613
+ print(f"\n{k}\n{v}")
4614
+
4615
+ return out_dict
4616
+
4617
+ ...
4618
+ ```
4619
+
4620
+
4621
+ ### `./utils/_default_dataset.py`
4622
+
4623
+ ```python
4624
+ #!/usr/bin/env python3
4625
+
4626
+ from torch.utils.data import Dataset
4627
+ import numpy as np
4628
+
4629
+
4630
+ class DefaultDataset(Dataset):
4631
+ """
4632
+ Apply transform for the first element of arrs_list
4633
+
4634
+ Example:
4635
+ n = 1024
4636
+ n_chs = 19
4637
+ X = np.random.rand(n, n_chs, 1000)
4638
+ T = np.random.randint(0, 4, size=(n, 1))
4639
+ S = np.random.randint(0, 999, size=(n, 1))
4640
+ Sr = np.random.randint(0, 4, size=(n, 1))
4641
+
4642
+ arrs_list = [X, T, S, Sr]
4643
+ transform = None
4644
+ ds = _DefaultDataset(arrs_list, transform=transform)
4645
+ len(ds) # 1024
4646
+ """
4647
+
4648
+ def __init__(self, arrs_list, transform=None):
4649
+ self.arrs_list = arrs_list
4650
+ self.arrs = arrs_list # alias
4651
+
4652
+ assert np.all([len(arr) for arr in arrs_list])
4653
+
4654
+ self.length = len(arrs_list[0])
4655
+ self.transform = transform
4656
+
4657
+ def __len__(self):
4658
+ return self.length
4659
+
4660
+ def __getitem__(self, idx):
4661
+ arrs_list_idx = [arr[idx] for arr in self.arrs_list]
4662
+
4663
+ # Here, you might want to transform, or apply DA on X as a numpy array
4664
+ if self.transform:
4665
+ dtype_orig = arrs_list_idx[0].dtype
4666
+ arrs_list_idx[0] = self.transform(
4667
+ arrs_list_idx[0].astype(np.float64)
4668
+ ).astype(dtype_orig)
4669
+ return arrs_list_idx
4670
+
4671
+ ...
4672
+ ```
4673
+
4674
+
4675
+ ### `./utils/_format_samples_for_sktime.py`
4676
+
4677
+ ```python
4678
+ import pandas as pd
4679
+ import torch
4680
+ import numpy as np
4681
+
4682
+
4683
+ def _format_a_sample_for_sktime(x):
4684
+ """
4685
+ x.shape: (n_chs, seq_len)
4686
+ """
4687
+ dims = pd.Series(
4688
+ [pd.Series(x[d], name=f"dim_{d}") for d in range(len(x))],
4689
+ index=[f"dim_{i}" for i in np.arange(len(x))],
4690
+ )
4691
+ return dims
4692
+
4693
+
4694
+ def format_samples_for_sktime(X):
4695
+ """
4696
+ X.shape: (n_samples, n_chs, seq_len)
4697
+ """
4698
+ if torch.is_tensor(X):
4699
+ X = X.numpy() # (64, 160, 1024)
4700
+
4701
+ X = X.astype(np.float64)
4702
+
4703
+ return pd.DataFrame([_format_a_sample_for_sktime(X[i]) for i in range(len(X))])
4704
+
4705
+ ...
4706
+ ```
4707
+
4708
+
4709
+ ### `./utils/grid_search.py`
4710
+
4711
+ ```python
4712
+ #!./env/bin/python3
4713
+ # -*- coding: utf-8 -*-
4714
+ # Time-stamp: "2024-04-22 23:54:02"
4715
+ # Author: Yusuke Watanabe (ywata1989@gmail.com)
4716
+
4717
+ """
4718
+ This script defines scitex.ml.utils.grid_search
4719
+ """
4720
+
4721
+ # Imports
4722
+ import itertools as _itertools
4723
+ import random as _random
4724
+ import sys as _sys
4725
+
4726
+ import matplotlib.pyplot as _plt
4727
+ import scitex as _scitex
4728
+
4729
+
4730
+ # Functions
4731
+ def yield_grids(params_grid: dict, random=False):
4732
+ """
4733
+ Generator function that yields combinations of parameters from a grid.
4734
+
4735
+ Args:
4736
+ params_grid (dict): A dictionary where keys are parameter names and values are lists of parameter values.
4737
+ random (bool): If True, yields the parameter combinations in random order.
4738
+
4739
+ Yields:
4740
+ dict: A dictionary of parameters for one set of conditions from the grid.
4741
+
4742
+ Example:
4743
+ # Parameters
4744
+ params_grid = {
4745
+ "batch_size": [2**i for i in range(7)],
4746
+ "n_chs": [2**i for i in range(7)],
4747
+ "seq_len": [2**i for i in range(15)],
4748
+ "fs": [2**i for i in range(8, 11)],
4749
+ "n_segments": [2**i for i in range(6)],
4750
+ "n_bands_pha": [2**i for i in range(7)],
4751
+ "n_bands_amp": [2**i for i in range(7)],
4752
+ "precision": ['fp16', 'fp32'],
4753
+ "device": ['cpu', 'cuda'],
4754
+ "package": ['tensorpac', 'scitex'],
4755
+ }
4756
+
4757
+ # Example of using the generator
4758
+ for param_dict in yield_grids(params_grid, random=True):
4759
+ print(param_dict)
4760
+ """
4761
+ combinations = list(_itertools.product(*params_grid.values()))
4762
+
4763
+ ...
4764
+ ```
4765
+
4766
+
4767
+ ### `./utils/__init__.py`
4768
+
4769
+ ```python
4770
+ #!/usr/bin/env python3
4771
+ """Scitex utils module."""
4772
+
4773
+ from ._check_params import check_params
4774
+ from ._default_dataset import DefaultDataset
4775
+ from ._format_samples_for_sktime import format_samples_for_sktime
4776
+ from ._label_encoder import LabelEncoder
4777
+ from ._merge_labels import merge_labels
4778
+ from ._sliding_window_data_augmentation import sliding_window_data_augmentation
4779
+ from ._under_sample import under_sample
4780
+ from ._verify_n_gpus import verify_n_gpus
4781
+
4782
+ __all__ = [
4783
+ "DefaultDataset",
4784
+ "LabelEncoder",
4785
+ "check_params",
4786
+ "format_samples_for_sktime",
4787
+ "merge_labels",
4788
+ "sliding_window_data_augmentation",
4789
+ "under_sample",
4790
+ "verify_n_gpus",
4791
+ ]
4792
+
4793
+ ...
4794
+ ```
4795
+
4796
+
4797
+ ### `./utils/_label_encoder.py`
4798
+
4799
+ ```python
4800
+ #!/usr/bin/env python3
4801
+ # -*- coding: utf-8 -*-
4802
+ # Time-stamp: "2024-03-02 09:52:28 (ywatanabe)"
4803
+
4804
+ from warnings import warn
4805
+
4806
+ import numpy as np
4807
+ import pandas as pd
4808
+ import torch
4809
+ from sklearn.preprocessing import LabelEncoder as SklearnLabelEncoder
4810
+
4811
+
4812
+ class LabelEncoder(SklearnLabelEncoder):
4813
+ """
4814
+ An extension of the sklearn.preprocessing.LabelEncoder that supports incremental learning.
4815
+ This means it can handle new classes without forgetting the old ones.
4816
+
4817
+ Attributes:
4818
+ classes_ (np.ndarray): Holds the label for each class.
4819
+
4820
+ Example usage:
4821
+ encoder = IncrementalLabelEncoder()
4822
+ encoder.fit(np.array(["apple", "banana"]))
4823
+ encoded_labels = encoder.transform(["apple", "banana"]) # This will give you the encoded labels
4824
+
4825
+ encoder.fit(["cherry"]) # Incrementally add "cherry"
4826
+ encoder.transform(["apple", "banana", "cherry"]) # Now it works, including "cherry"
4827
+
4828
+ # Now you can use inverse_transform with the encoded labels
4829
+ print(encoder.classes_)
4830
+ original_labels = encoder.inverse_transform(encoded_labels)
4831
+ print(original_labels) # This should print ['apple', 'banana']
4832
+ """
4833
+
4834
+ def __init__(self):
4835
+ super().__init__()
4836
+ self.classes_ = np.array([])
4837
+
4838
+ def _check_input(self, y):
4839
+ """
4840
+ Check and convert the input to a NumPy array if it is a list, tuple, pandas.Series, pandas.DataFrame, or torch.Tensor.
4841
+
4842
+ Arguments:
4843
+ y (list, tuple, pd.Series, pd.DataFrame, torch.Tensor): The input labels.
4844
+
4845
+ Returns:
4846
+ np.ndarray: The input labels converted to a NumPy array.
4847
+ """
4848
+ if isinstance(y, (list, tuple)):
4849
+ y = np.array(y)
4850
+
4851
+ ...
4852
+ ```
4853
+
4854
+
4855
+ ### `./utils/_merge_labels.py`
4856
+
4857
+ ```python
4858
+ #!/usr/bin/env python3
4859
+
4860
+ import scitex
4861
+ import numpy as np
4862
+
4863
+ # y1, y2 = T_tra, M_tra
4864
+ # def merge_labels(y1, y2):
4865
+ # y = [str(z1) + "-" + str(z2) for z1, z2 in zip(y1, y2)]
4866
+ # conv_d = {z: i for i, z in enumerate(np.unique(y))}
4867
+ # y = [conv_d[z] for z in y]
4868
+ # return y
4869
+
4870
+
4871
+ def merge_labels(*ys, to_int=False):
4872
+ if not len(ys) > 1: # Check if more than two arguments are passed
4873
+ return ys[0]
4874
+ else:
4875
+ y = [scitex.gen.connect_nums(zs) for zs in zip(*ys)]
4876
+ if to_int:
4877
+ conv_d = {z: i for i, z in enumerate(np.unique(y))}
4878
+ y = [conv_d[z] for z in y]
4879
+ return np.array(y)
4880
+
4881
+ ...
4882
+ ```
4883
+
4884
+
4885
+ ### `./utils/_sliding_window_data_augmentation.py`
4886
+
4887
+ ```python
4888
+ #!/usr/bin/env python3
4889
+ # -*- coding: utf-8 -*-
4890
+ # Time-stamp: "2024-01-24 13:56:36 (ywatanabe)"
4891
+
4892
+ import random
4893
+
4894
+
4895
+ def sliding_window_data_augmentation(x, window_size_pts):
4896
+ start = random.randint(0, x.shape[-1] - window_size_pts)
4897
+ end = start + window_size_pts
4898
+ return x[..., start:end]
4899
+
4900
+ ...
4901
+ ```
4902
+
4903
+
4904
+ ### `./utils/_under_sample.py`
4905
+
4906
+ ```python
4907
+ #!/usr/bin/env python3
4908
+
4909
+
4910
+ from collections import Counter
4911
+
4912
+ import numpy as np
4913
+
4914
+
4915
+ def under_sample(y, replace=False):
4916
+ """
4917
+ Input:
4918
+ Labels
4919
+ Return:
4920
+ Indices
4921
+
4922
+ Example:
4923
+ t = ['a', 'b', 'c', 'b', 'c', 'a', 'c']
4924
+ print(under_sample(t))
4925
+ # [5 0 1 3 4 6]
4926
+ print(under_sample(t))
4927
+ # [5 0 1 3 6 2]
4928
+ """
4929
+
4930
+ # find the minority and majority classes
4931
+ class_counts = Counter(y)
4932
+ # majority_class = max(class_counts, key=class_counts.get)
4933
+ minority_class = min(class_counts, key=class_counts.get)
4934
+
4935
+ # compute the number of sample to draw from the majority class using
4936
+ # a negative binomial distribution
4937
+ n_minority_class = class_counts[minority_class]
4938
+ n_majority_resampled = n_minority_class
4939
+
4940
+ # draw randomly with or without replacement
4941
+ indices = np.hstack(
4942
+ [
4943
+ np.random.choice(
4944
+ np.flatnonzero(y == k),
4945
+ size=n_majority_resampled,
4946
+ replace=replace,
4947
+ )
4948
+ for k in class_counts.keys()
4949
+ ]
4950
+ )
4951
+
4952
+ return indices
4953
+
4954
+
4955
+ if __name__ == "__main__":
4956
+ t = np.array(["a", "b", "c", "b", "c", "a", "c"])
4957
+
4958
+ ...
4959
+ ```
4960
+
4961
+
4962
+ ### `./utils/_verify_n_gpus.py`
4963
+
4964
+ ```python
4965
+ import torch
4966
+ import warnings
4967
+
4968
+
4969
+ def verify_n_gpus(n_gpus):
4970
+ if torch.cuda.device_count() < n_gpus:
4971
+ warnings.warn(
4972
+ f"N_GPUS ({n_gpus}) is larger "
4973
+ f"than n_gpus torch can acesses (= {torch.cuda.device_count()})"
4974
+ f"Please check $CUDA_VISIBLE_DEVICES and your setting in this script.",
4975
+ UserWarning,
4976
+ )
4977
+ return torch.cuda.device_count()
4978
+
4979
+ else:
4980
+ return n_gpus
4981
+
4982
+ ...
4983
+ ```
4984
+