scitex 2.0.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. scitex/__init__.py +73 -0
  2. scitex/__main__.py +89 -0
  3. scitex/__version__.py +14 -0
  4. scitex/_sh.py +59 -0
  5. scitex/ai/_LearningCurveLogger.py +583 -0
  6. scitex/ai/__Classifiers.py +101 -0
  7. scitex/ai/__init__.py +55 -0
  8. scitex/ai/_gen_ai/_Anthropic.py +173 -0
  9. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  10. scitex/ai/_gen_ai/_DeepSeek.py +175 -0
  11. scitex/ai/_gen_ai/_Google.py +161 -0
  12. scitex/ai/_gen_ai/_Groq.py +97 -0
  13. scitex/ai/_gen_ai/_Llama.py +142 -0
  14. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  15. scitex/ai/_gen_ai/_PARAMS.py +565 -0
  16. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  17. scitex/ai/_gen_ai/__init__.py +32 -0
  18. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  19. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  20. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  21. scitex/ai/act/__init__.py +8 -0
  22. scitex/ai/act/_define.py +11 -0
  23. scitex/ai/classification/__init__.py +7 -0
  24. scitex/ai/classification/classification_reporter.py +1137 -0
  25. scitex/ai/classification/classifier_server.py +131 -0
  26. scitex/ai/classification/classifiers.py +101 -0
  27. scitex/ai/classification_reporter.py +1161 -0
  28. scitex/ai/classifier_server.py +131 -0
  29. scitex/ai/clustering/__init__.py +11 -0
  30. scitex/ai/clustering/_pca.py +115 -0
  31. scitex/ai/clustering/_umap.py +376 -0
  32. scitex/ai/early_stopping.py +149 -0
  33. scitex/ai/feature_extraction/__init__.py +56 -0
  34. scitex/ai/feature_extraction/vit.py +148 -0
  35. scitex/ai/genai/__init__.py +277 -0
  36. scitex/ai/genai/anthropic.py +177 -0
  37. scitex/ai/genai/anthropic_provider.py +320 -0
  38. scitex/ai/genai/anthropic_refactored.py +109 -0
  39. scitex/ai/genai/auth_manager.py +200 -0
  40. scitex/ai/genai/base_genai.py +336 -0
  41. scitex/ai/genai/base_provider.py +291 -0
  42. scitex/ai/genai/calc_cost.py +78 -0
  43. scitex/ai/genai/chat_history.py +307 -0
  44. scitex/ai/genai/cost_tracker.py +276 -0
  45. scitex/ai/genai/deepseek.py +188 -0
  46. scitex/ai/genai/deepseek_provider.py +251 -0
  47. scitex/ai/genai/format_output_func.py +183 -0
  48. scitex/ai/genai/genai_factory.py +71 -0
  49. scitex/ai/genai/google.py +169 -0
  50. scitex/ai/genai/google_provider.py +228 -0
  51. scitex/ai/genai/groq.py +104 -0
  52. scitex/ai/genai/groq_provider.py +248 -0
  53. scitex/ai/genai/image_processor.py +250 -0
  54. scitex/ai/genai/llama.py +155 -0
  55. scitex/ai/genai/llama_provider.py +214 -0
  56. scitex/ai/genai/mock_provider.py +127 -0
  57. scitex/ai/genai/model_registry.py +304 -0
  58. scitex/ai/genai/openai.py +230 -0
  59. scitex/ai/genai/openai_provider.py +293 -0
  60. scitex/ai/genai/params.py +565 -0
  61. scitex/ai/genai/perplexity.py +202 -0
  62. scitex/ai/genai/perplexity_provider.py +205 -0
  63. scitex/ai/genai/provider_base.py +302 -0
  64. scitex/ai/genai/provider_factory.py +370 -0
  65. scitex/ai/genai/response_handler.py +235 -0
  66. scitex/ai/layer/_Pass.py +21 -0
  67. scitex/ai/layer/__init__.py +10 -0
  68. scitex/ai/layer/_switch.py +8 -0
  69. scitex/ai/loss/_L1L2Losses.py +34 -0
  70. scitex/ai/loss/__init__.py +12 -0
  71. scitex/ai/loss/multi_task_loss.py +47 -0
  72. scitex/ai/metrics/__init__.py +9 -0
  73. scitex/ai/metrics/_bACC.py +51 -0
  74. scitex/ai/metrics/silhoute_score_block.py +496 -0
  75. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  76. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  77. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  78. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  79. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  80. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  81. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  82. scitex/ai/optim/__init__.py +13 -0
  83. scitex/ai/optim/_get_set.py +31 -0
  84. scitex/ai/optim/_optimizers.py +71 -0
  85. scitex/ai/plt/__init__.py +21 -0
  86. scitex/ai/plt/_conf_mat.py +592 -0
  87. scitex/ai/plt/_learning_curve.py +194 -0
  88. scitex/ai/plt/_optuna_study.py +111 -0
  89. scitex/ai/plt/aucs/__init__.py +2 -0
  90. scitex/ai/plt/aucs/example.py +60 -0
  91. scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
  92. scitex/ai/plt/aucs/roc_auc.py +246 -0
  93. scitex/ai/sampling/undersample.py +29 -0
  94. scitex/ai/sk/__init__.py +11 -0
  95. scitex/ai/sk/_clf.py +58 -0
  96. scitex/ai/sk/_to_sktime.py +100 -0
  97. scitex/ai/sklearn/__init__.py +26 -0
  98. scitex/ai/sklearn/clf.py +58 -0
  99. scitex/ai/sklearn/to_sktime.py +100 -0
  100. scitex/ai/training/__init__.py +7 -0
  101. scitex/ai/training/early_stopping.py +150 -0
  102. scitex/ai/training/learning_curve_logger.py +555 -0
  103. scitex/ai/utils/__init__.py +22 -0
  104. scitex/ai/utils/_check_params.py +50 -0
  105. scitex/ai/utils/_default_dataset.py +46 -0
  106. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  107. scitex/ai/utils/_label_encoder.py +134 -0
  108. scitex/ai/utils/_merge_labels.py +22 -0
  109. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  110. scitex/ai/utils/_under_sample.py +51 -0
  111. scitex/ai/utils/_verify_n_gpus.py +16 -0
  112. scitex/ai/utils/grid_search.py +148 -0
  113. scitex/context/__init__.py +9 -0
  114. scitex/context/_suppress_output.py +38 -0
  115. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  116. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  117. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  118. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  119. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  120. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  121. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  122. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  123. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  124. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  125. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  126. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  127. scitex/db/_BaseMixins/__init__.py +30 -0
  128. scitex/db/_PostgreSQL.py +126 -0
  129. scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
  130. scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
  131. scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
  132. scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  133. scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  134. scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
  135. scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  136. scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
  137. scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
  138. scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  139. scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
  140. scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  141. scitex/db/_PostgreSQLMixins/__init__.py +34 -0
  142. scitex/db/_SQLite3.py +2136 -0
  143. scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
  144. scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
  145. scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
  146. scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  147. scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
  148. scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
  149. scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
  150. scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
  151. scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
  152. scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
  153. scitex/db/_SQLite3Mixins/__init__.py +30 -0
  154. scitex/db/__init__.py +14 -0
  155. scitex/db/_delete_duplicates.py +397 -0
  156. scitex/db/_inspect.py +163 -0
  157. scitex/decorators/__init__.py +54 -0
  158. scitex/decorators/_auto_order.py +172 -0
  159. scitex/decorators/_batch_fn.py +127 -0
  160. scitex/decorators/_cache_disk.py +32 -0
  161. scitex/decorators/_cache_mem.py +12 -0
  162. scitex/decorators/_combined.py +98 -0
  163. scitex/decorators/_converters.py +282 -0
  164. scitex/decorators/_deprecated.py +26 -0
  165. scitex/decorators/_not_implemented.py +30 -0
  166. scitex/decorators/_numpy_fn.py +86 -0
  167. scitex/decorators/_pandas_fn.py +121 -0
  168. scitex/decorators/_preserve_doc.py +19 -0
  169. scitex/decorators/_signal_fn.py +95 -0
  170. scitex/decorators/_timeout.py +55 -0
  171. scitex/decorators/_torch_fn.py +136 -0
  172. scitex/decorators/_wrap.py +39 -0
  173. scitex/decorators/_xarray_fn.py +88 -0
  174. scitex/dev/__init__.py +15 -0
  175. scitex/dev/_analyze_code_flow.py +284 -0
  176. scitex/dev/_reload.py +59 -0
  177. scitex/dict/_DotDict.py +442 -0
  178. scitex/dict/__init__.py +18 -0
  179. scitex/dict/_listed_dict.py +42 -0
  180. scitex/dict/_pop_keys.py +36 -0
  181. scitex/dict/_replace.py +13 -0
  182. scitex/dict/_safe_merge.py +62 -0
  183. scitex/dict/_to_str.py +32 -0
  184. scitex/dsp/__init__.py +72 -0
  185. scitex/dsp/_crop.py +122 -0
  186. scitex/dsp/_demo_sig.py +331 -0
  187. scitex/dsp/_detect_ripples.py +212 -0
  188. scitex/dsp/_ensure_3d.py +18 -0
  189. scitex/dsp/_hilbert.py +78 -0
  190. scitex/dsp/_listen.py +702 -0
  191. scitex/dsp/_misc.py +30 -0
  192. scitex/dsp/_mne.py +32 -0
  193. scitex/dsp/_modulation_index.py +79 -0
  194. scitex/dsp/_pac.py +319 -0
  195. scitex/dsp/_psd.py +102 -0
  196. scitex/dsp/_resample.py +65 -0
  197. scitex/dsp/_time.py +36 -0
  198. scitex/dsp/_transform.py +68 -0
  199. scitex/dsp/_wavelet.py +212 -0
  200. scitex/dsp/add_noise.py +111 -0
  201. scitex/dsp/example.py +253 -0
  202. scitex/dsp/filt.py +155 -0
  203. scitex/dsp/norm.py +18 -0
  204. scitex/dsp/params.py +51 -0
  205. scitex/dsp/reference.py +43 -0
  206. scitex/dsp/template.py +25 -0
  207. scitex/dsp/utils/__init__.py +15 -0
  208. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  209. scitex/dsp/utils/_ensure_3d.py +18 -0
  210. scitex/dsp/utils/_ensure_even_len.py +10 -0
  211. scitex/dsp/utils/_zero_pad.py +48 -0
  212. scitex/dsp/utils/filter.py +408 -0
  213. scitex/dsp/utils/pac.py +177 -0
  214. scitex/dt/__init__.py +8 -0
  215. scitex/dt/_linspace.py +130 -0
  216. scitex/etc/__init__.py +15 -0
  217. scitex/etc/wait_key.py +34 -0
  218. scitex/gen/_DimHandler.py +196 -0
  219. scitex/gen/_TimeStamper.py +244 -0
  220. scitex/gen/__init__.py +95 -0
  221. scitex/gen/_alternate_kwarg.py +13 -0
  222. scitex/gen/_cache.py +11 -0
  223. scitex/gen/_check_host.py +34 -0
  224. scitex/gen/_ci.py +12 -0
  225. scitex/gen/_close.py +222 -0
  226. scitex/gen/_embed.py +78 -0
  227. scitex/gen/_inspect_module.py +257 -0
  228. scitex/gen/_is_ipython.py +12 -0
  229. scitex/gen/_less.py +48 -0
  230. scitex/gen/_list_packages.py +139 -0
  231. scitex/gen/_mat2py.py +88 -0
  232. scitex/gen/_norm.py +170 -0
  233. scitex/gen/_paste.py +18 -0
  234. scitex/gen/_print_config.py +84 -0
  235. scitex/gen/_shell.py +48 -0
  236. scitex/gen/_src.py +111 -0
  237. scitex/gen/_start.py +451 -0
  238. scitex/gen/_symlink.py +55 -0
  239. scitex/gen/_symlog.py +27 -0
  240. scitex/gen/_tee.py +238 -0
  241. scitex/gen/_title2path.py +60 -0
  242. scitex/gen/_title_case.py +88 -0
  243. scitex/gen/_to_even.py +84 -0
  244. scitex/gen/_to_odd.py +34 -0
  245. scitex/gen/_to_rank.py +39 -0
  246. scitex/gen/_transpose.py +37 -0
  247. scitex/gen/_type.py +78 -0
  248. scitex/gen/_var_info.py +73 -0
  249. scitex/gen/_wrap.py +17 -0
  250. scitex/gen/_xml2dict.py +76 -0
  251. scitex/gen/misc.py +730 -0
  252. scitex/gen/path.py +0 -0
  253. scitex/general/__init__.py +5 -0
  254. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  255. scitex/gists/_SigMacro_toBlue.py +172 -0
  256. scitex/gists/__init__.py +12 -0
  257. scitex/io/_H5Explorer.py +292 -0
  258. scitex/io/__init__.py +82 -0
  259. scitex/io/_cache.py +101 -0
  260. scitex/io/_flush.py +24 -0
  261. scitex/io/_glob.py +103 -0
  262. scitex/io/_json2md.py +113 -0
  263. scitex/io/_load.py +168 -0
  264. scitex/io/_load_configs.py +146 -0
  265. scitex/io/_load_modules/__init__.py +38 -0
  266. scitex/io/_load_modules/_catboost.py +66 -0
  267. scitex/io/_load_modules/_con.py +20 -0
  268. scitex/io/_load_modules/_db.py +24 -0
  269. scitex/io/_load_modules/_docx.py +42 -0
  270. scitex/io/_load_modules/_eeg.py +110 -0
  271. scitex/io/_load_modules/_hdf5.py +196 -0
  272. scitex/io/_load_modules/_image.py +19 -0
  273. scitex/io/_load_modules/_joblib.py +19 -0
  274. scitex/io/_load_modules/_json.py +18 -0
  275. scitex/io/_load_modules/_markdown.py +103 -0
  276. scitex/io/_load_modules/_matlab.py +37 -0
  277. scitex/io/_load_modules/_numpy.py +39 -0
  278. scitex/io/_load_modules/_optuna.py +155 -0
  279. scitex/io/_load_modules/_pandas.py +69 -0
  280. scitex/io/_load_modules/_pdf.py +31 -0
  281. scitex/io/_load_modules/_pickle.py +24 -0
  282. scitex/io/_load_modules/_torch.py +16 -0
  283. scitex/io/_load_modules/_txt.py +126 -0
  284. scitex/io/_load_modules/_xml.py +49 -0
  285. scitex/io/_load_modules/_yaml.py +23 -0
  286. scitex/io/_mv_to_tmp.py +19 -0
  287. scitex/io/_path.py +286 -0
  288. scitex/io/_reload.py +78 -0
  289. scitex/io/_save.py +539 -0
  290. scitex/io/_save_modules/__init__.py +66 -0
  291. scitex/io/_save_modules/_catboost.py +22 -0
  292. scitex/io/_save_modules/_csv.py +89 -0
  293. scitex/io/_save_modules/_excel.py +49 -0
  294. scitex/io/_save_modules/_hdf5.py +249 -0
  295. scitex/io/_save_modules/_html.py +48 -0
  296. scitex/io/_save_modules/_image.py +140 -0
  297. scitex/io/_save_modules/_joblib.py +25 -0
  298. scitex/io/_save_modules/_json.py +25 -0
  299. scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
  300. scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
  301. scitex/io/_save_modules/_matlab.py +24 -0
  302. scitex/io/_save_modules/_mp4.py +29 -0
  303. scitex/io/_save_modules/_numpy.py +57 -0
  304. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  305. scitex/io/_save_modules/_pickle.py +45 -0
  306. scitex/io/_save_modules/_plotly.py +27 -0
  307. scitex/io/_save_modules/_text.py +23 -0
  308. scitex/io/_save_modules/_torch.py +26 -0
  309. scitex/io/_save_modules/_yaml.py +29 -0
  310. scitex/life/__init__.py +10 -0
  311. scitex/life/_monitor_rain.py +49 -0
  312. scitex/linalg/__init__.py +17 -0
  313. scitex/linalg/_distance.py +63 -0
  314. scitex/linalg/_geometric_median.py +64 -0
  315. scitex/linalg/_misc.py +73 -0
  316. scitex/nn/_AxiswiseDropout.py +27 -0
  317. scitex/nn/_BNet.py +126 -0
  318. scitex/nn/_BNet_Res.py +164 -0
  319. scitex/nn/_ChannelGainChanger.py +44 -0
  320. scitex/nn/_DropoutChannels.py +50 -0
  321. scitex/nn/_Filters.py +489 -0
  322. scitex/nn/_FreqGainChanger.py +110 -0
  323. scitex/nn/_GaussianFilter.py +48 -0
  324. scitex/nn/_Hilbert.py +111 -0
  325. scitex/nn/_MNet_1000.py +157 -0
  326. scitex/nn/_ModulationIndex.py +221 -0
  327. scitex/nn/_PAC.py +414 -0
  328. scitex/nn/_PSD.py +40 -0
  329. scitex/nn/_ResNet1D.py +120 -0
  330. scitex/nn/_SpatialAttention.py +25 -0
  331. scitex/nn/_Spectrogram.py +161 -0
  332. scitex/nn/_SwapChannels.py +50 -0
  333. scitex/nn/_TransposeLayer.py +19 -0
  334. scitex/nn/_Wavelet.py +183 -0
  335. scitex/nn/__init__.py +63 -0
  336. scitex/os/__init__.py +8 -0
  337. scitex/os/_mv.py +50 -0
  338. scitex/parallel/__init__.py +8 -0
  339. scitex/parallel/_run.py +151 -0
  340. scitex/path/__init__.py +33 -0
  341. scitex/path/_clean.py +52 -0
  342. scitex/path/_find.py +108 -0
  343. scitex/path/_get_module_path.py +51 -0
  344. scitex/path/_get_spath.py +35 -0
  345. scitex/path/_getsize.py +18 -0
  346. scitex/path/_increment_version.py +87 -0
  347. scitex/path/_mk_spath.py +51 -0
  348. scitex/path/_path.py +19 -0
  349. scitex/path/_split.py +23 -0
  350. scitex/path/_this_path.py +19 -0
  351. scitex/path/_version.py +101 -0
  352. scitex/pd/__init__.py +41 -0
  353. scitex/pd/_find_indi.py +126 -0
  354. scitex/pd/_find_pval.py +113 -0
  355. scitex/pd/_force_df.py +154 -0
  356. scitex/pd/_from_xyz.py +71 -0
  357. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  358. scitex/pd/_melt_cols.py +81 -0
  359. scitex/pd/_merge_columns.py +221 -0
  360. scitex/pd/_mv.py +63 -0
  361. scitex/pd/_replace.py +62 -0
  362. scitex/pd/_round.py +93 -0
  363. scitex/pd/_slice.py +63 -0
  364. scitex/pd/_sort.py +91 -0
  365. scitex/pd/_to_numeric.py +53 -0
  366. scitex/pd/_to_xy.py +59 -0
  367. scitex/pd/_to_xyz.py +110 -0
  368. scitex/plt/__init__.py +36 -0
  369. scitex/plt/_subplots/_AxesWrapper.py +182 -0
  370. scitex/plt/_subplots/_AxisWrapper.py +249 -0
  371. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
  372. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
  373. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
  374. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  375. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
  376. scitex/plt/_subplots/_FigWrapper.py +226 -0
  377. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  378. scitex/plt/_subplots/__init__.py +111 -0
  379. scitex/plt/_subplots/_export_as_csv.py +232 -0
  380. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
  407. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
  408. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
  409. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
  410. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
  411. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
  412. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
  413. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
  414. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
  415. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
  416. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
  417. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
  418. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
  419. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
  420. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
  421. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
  422. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
  423. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
  424. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
  425. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
  426. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  427. scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
  428. scitex/plt/_tpl.py +28 -0
  429. scitex/plt/ax/__init__.py +114 -0
  430. scitex/plt/ax/_plot/__init__.py +53 -0
  431. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  432. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  433. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  434. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  435. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  436. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  437. scitex/plt/ax/_plot/_plot_image.py +94 -0
  438. scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
  439. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  440. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  441. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  442. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  443. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  444. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  445. scitex/plt/ax/_style/__init__.py +38 -0
  446. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  447. scitex/plt/ax/_style/_add_panel.py +92 -0
  448. scitex/plt/ax/_style/_extend.py +64 -0
  449. scitex/plt/ax/_style/_force_aspect.py +37 -0
  450. scitex/plt/ax/_style/_format_label.py +23 -0
  451. scitex/plt/ax/_style/_hide_spines.py +84 -0
  452. scitex/plt/ax/_style/_map_ticks.py +182 -0
  453. scitex/plt/ax/_style/_rotate_labels.py +215 -0
  454. scitex/plt/ax/_style/_sci_note.py +279 -0
  455. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  456. scitex/plt/ax/_style/_set_meta.py +261 -0
  457. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  458. scitex/plt/ax/_style/_set_size.py +16 -0
  459. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  460. scitex/plt/ax/_style/_set_ticks.py +276 -0
  461. scitex/plt/ax/_style/_set_xyt.py +121 -0
  462. scitex/plt/ax/_style/_share_axes.py +264 -0
  463. scitex/plt/ax/_style/_shift.py +139 -0
  464. scitex/plt/ax/_style/_show_spines.py +333 -0
  465. scitex/plt/color/_PARAMS.py +70 -0
  466. scitex/plt/color/__init__.py +52 -0
  467. scitex/plt/color/_add_hue_col.py +41 -0
  468. scitex/plt/color/_colors.py +205 -0
  469. scitex/plt/color/_get_colors_from_cmap.py +134 -0
  470. scitex/plt/color/_interpolate.py +29 -0
  471. scitex/plt/color/_vizualize_colors.py +54 -0
  472. scitex/plt/utils/__init__.py +44 -0
  473. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  474. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  475. scitex/plt/utils/_close.py +68 -0
  476. scitex/plt/utils/_colorbar.py +96 -0
  477. scitex/plt/utils/_configure_mpl.py +295 -0
  478. scitex/plt/utils/_histogram_utils.py +132 -0
  479. scitex/plt/utils/_im2grid.py +70 -0
  480. scitex/plt/utils/_is_valid_axis.py +78 -0
  481. scitex/plt/utils/_mk_colorbar.py +65 -0
  482. scitex/plt/utils/_mk_patches.py +26 -0
  483. scitex/plt/utils/_scientific_captions.py +638 -0
  484. scitex/plt/utils/_scitex_config.py +223 -0
  485. scitex/reproduce/__init__.py +14 -0
  486. scitex/reproduce/_fix_seeds.py +45 -0
  487. scitex/reproduce/_gen_ID.py +55 -0
  488. scitex/reproduce/_gen_timestamp.py +35 -0
  489. scitex/res/__init__.py +5 -0
  490. scitex/resource/__init__.py +13 -0
  491. scitex/resource/_get_processor_usages.py +281 -0
  492. scitex/resource/_get_specs.py +280 -0
  493. scitex/resource/_log_processor_usages.py +190 -0
  494. scitex/resource/_utils/__init__.py +31 -0
  495. scitex/resource/_utils/_get_env_info.py +481 -0
  496. scitex/resource/limit_ram.py +33 -0
  497. scitex/scholar/__init__.py +24 -0
  498. scitex/scholar/_local_search.py +454 -0
  499. scitex/scholar/_paper.py +244 -0
  500. scitex/scholar/_pdf_downloader.py +325 -0
  501. scitex/scholar/_search.py +393 -0
  502. scitex/scholar/_vector_search.py +370 -0
  503. scitex/scholar/_web_sources.py +457 -0
  504. scitex/stats/__init__.py +31 -0
  505. scitex/stats/_calc_partial_corr.py +17 -0
  506. scitex/stats/_corr_test_multi.py +94 -0
  507. scitex/stats/_corr_test_wrapper.py +115 -0
  508. scitex/stats/_describe_wrapper.py +90 -0
  509. scitex/stats/_multiple_corrections.py +63 -0
  510. scitex/stats/_nan_stats.py +93 -0
  511. scitex/stats/_p2stars.py +116 -0
  512. scitex/stats/_p2stars_wrapper.py +56 -0
  513. scitex/stats/_statistical_tests.py +73 -0
  514. scitex/stats/desc/__init__.py +40 -0
  515. scitex/stats/desc/_describe.py +189 -0
  516. scitex/stats/desc/_nan.py +289 -0
  517. scitex/stats/desc/_real.py +94 -0
  518. scitex/stats/multiple/__init__.py +14 -0
  519. scitex/stats/multiple/_bonferroni_correction.py +72 -0
  520. scitex/stats/multiple/_fdr_correction.py +400 -0
  521. scitex/stats/multiple/_multicompair.py +28 -0
  522. scitex/stats/tests/__corr_test.py +277 -0
  523. scitex/stats/tests/__corr_test_multi.py +343 -0
  524. scitex/stats/tests/__corr_test_single.py +277 -0
  525. scitex/stats/tests/__init__.py +22 -0
  526. scitex/stats/tests/_brunner_munzel_test.py +192 -0
  527. scitex/stats/tests/_nocorrelation_test.py +28 -0
  528. scitex/stats/tests/_smirnov_grubbs.py +98 -0
  529. scitex/str/__init__.py +113 -0
  530. scitex/str/_clean_path.py +75 -0
  531. scitex/str/_color_text.py +52 -0
  532. scitex/str/_decapitalize.py +58 -0
  533. scitex/str/_factor_out_digits.py +281 -0
  534. scitex/str/_format_plot_text.py +498 -0
  535. scitex/str/_grep.py +48 -0
  536. scitex/str/_latex.py +155 -0
  537. scitex/str/_latex_fallback.py +471 -0
  538. scitex/str/_mask_api.py +39 -0
  539. scitex/str/_mask_api_key.py +8 -0
  540. scitex/str/_parse.py +158 -0
  541. scitex/str/_print_block.py +47 -0
  542. scitex/str/_print_debug.py +68 -0
  543. scitex/str/_printc.py +62 -0
  544. scitex/str/_readable_bytes.py +38 -0
  545. scitex/str/_remove_ansi.py +23 -0
  546. scitex/str/_replace.py +134 -0
  547. scitex/str/_search.py +125 -0
  548. scitex/str/_squeeze_space.py +36 -0
  549. scitex/tex/__init__.py +10 -0
  550. scitex/tex/_preview.py +103 -0
  551. scitex/tex/_to_vec.py +116 -0
  552. scitex/torch/__init__.py +18 -0
  553. scitex/torch/_apply_to.py +34 -0
  554. scitex/torch/_nan_funcs.py +77 -0
  555. scitex/types/_ArrayLike.py +44 -0
  556. scitex/types/_ColorLike.py +21 -0
  557. scitex/types/__init__.py +14 -0
  558. scitex/types/_is_listed_X.py +70 -0
  559. scitex/utils/__init__.py +22 -0
  560. scitex/utils/_compress_hdf5.py +116 -0
  561. scitex/utils/_email.py +120 -0
  562. scitex/utils/_grid.py +148 -0
  563. scitex/utils/_notify.py +247 -0
  564. scitex/utils/_search.py +121 -0
  565. scitex/web/__init__.py +38 -0
  566. scitex/web/_search_pubmed.py +438 -0
  567. scitex/web/_summarize_url.py +158 -0
  568. scitex-2.0.0.dist-info/METADATA +307 -0
  569. scitex-2.0.0.dist-info/RECORD +572 -0
  570. scitex-2.0.0.dist-info/WHEEL +6 -0
  571. scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
  572. scitex-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-07 05:58:41 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/decorators/_timeout.py
5
+
6
+ #!./env/bin/python3
7
+ # -*- coding: utf-8 -*-
8
+ # Time-stamp: "2024-04-23 19:11:33"
9
+ # Author: Yusuke Watanabe (ywata1989@gmail.com)
10
+
11
+ """
12
+ This script does XYZ.
13
+ """
14
+
15
+ """
16
+ Imports
17
+ """
18
+
19
+
20
+ """
21
+ Config
22
+ """
23
+ # CONFIG = scitex.gen.load_configs()
24
+
25
+ """
26
+ Functions & Classes
27
+ """
28
+ from multiprocessing import Process, Queue
29
+
30
+
31
+ def timeout(seconds=10, error_message="Timeout"):
32
+ def decorator(func):
33
+ def wrapper(*args, **kwargs):
34
+ def queue_wrapper(queue, args, kwargs):
35
+ result = func(*args, **kwargs)
36
+ queue.put(result)
37
+
38
+ queue = Queue()
39
+ args_for_process = (queue, args, kwargs)
40
+ process = Process(target=queue_wrapper, args=args_for_process)
41
+ process.start()
42
+ process.join(timeout=seconds)
43
+
44
+ if process.is_alive():
45
+ process.terminate()
46
+ raise TimeoutError(error_message)
47
+ else:
48
+ return queue.get()
49
+
50
+ return wrapper
51
+
52
+ return decorator
53
+
54
+
55
+ # EOF
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 15:40:43 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_torch_fn.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_torch_fn.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from functools import wraps
13
+ from typing import Any as _Any
14
+ from typing import Callable
15
+
16
+ import numpy as np
17
+ import pandas as pd
18
+ import torch
19
+ import xarray as xr
20
+
21
+ from ._converters import _return_always, is_nested_decorator, to_torch
22
+
23
+
24
+ def torch_fn(func: Callable) -> Callable:
25
+ """Decorator for PyTorch function compatibility.
26
+
27
+ Automatically converts inputs to PyTorch tensors and handles various data types
28
+ gracefully. Preserves the original input type in the output.
29
+
30
+ Features
31
+ --------
32
+ - Converts inputs to PyTorch tensors
33
+ - Preserves scalar parameters (int, float, bool, str)
34
+ - Preserves dimension tuples like dim=(0, 1)
35
+ - Handles nested lists/tuples gracefully
36
+ - Automatically converts axis to dim for torch functions
37
+ - Applies device="cuda" if available
38
+ - Returns output in same type as input (numpy->numpy, pandas->pandas, etc.)
39
+
40
+ Parameters
41
+ ----------
42
+ func : Callable
43
+ The function to decorate
44
+
45
+ Returns
46
+ -------
47
+ Callable
48
+ The decorated function
49
+
50
+ Examples
51
+ --------
52
+ >>> @torch_fn
53
+ ... def mean_squared(x, dim=None):
54
+ ... return (x ** 2).mean(dim=dim)
55
+ >>>
56
+ >>> # Works with numpy arrays
57
+ >>> result = mean_squared(np.array([1, 2, 3]))
58
+ >>>
59
+ >>> # Works with nested lists
60
+ >>> result = mean_squared([[1, 2], [3, 4]])
61
+ >>>
62
+ >>> # Preserves dimension tuples
63
+ >>> result = mean_squared(data, dim=(0, 1))
64
+
65
+ Notes
66
+ -----
67
+ For optimal performance with batch processing, apply torch_fn before batch_fn:
68
+ @batch_fn
69
+ @torch_fn
70
+ def my_function(x): ...
71
+
72
+ Or use auto-ordering to handle this automatically.
73
+ """
74
+ @wraps(func)
75
+ def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
76
+ # Skip conversion if already in a nested decorator context
77
+ if is_nested_decorator():
78
+ results = func(*args, **kwargs)
79
+ return results
80
+
81
+ # Set the current decorator context
82
+ wrapper._current_decorator = "torch_fn"
83
+
84
+ # Store original object for type preservation
85
+ original_object = args[0] if args else None
86
+
87
+ converted_args, converted_kwargs = to_torch(
88
+ *args, return_fn=_return_always, **kwargs
89
+ )
90
+
91
+ # Skip strict assertion for certain types that may not convert to tensors
92
+ # Instead, convert what we can and pass through what we can't
93
+ validated_args = []
94
+ for arg_index, arg in enumerate(converted_args):
95
+ if isinstance(arg, torch.Tensor):
96
+ validated_args.append(arg)
97
+ elif isinstance(arg, (int, float, str, type(None))):
98
+ # Pass through scalars and strings unchanged
99
+ validated_args.append(arg)
100
+ elif isinstance(arg, list) and all(isinstance(item, torch.Tensor) for item in arg):
101
+ # List of tensors - pass through as is
102
+ validated_args.append(arg)
103
+ else:
104
+ # Try one more conversion attempt
105
+ try:
106
+ validated_args.append(torch.tensor(arg).float())
107
+ except:
108
+ # If all else fails, pass through unchanged
109
+ validated_args.append(arg)
110
+
111
+ results = func(*validated_args, **converted_kwargs)
112
+
113
+ # Convert results back to original input types
114
+ if isinstance(results, torch.Tensor):
115
+ if original_object is not None:
116
+ if isinstance(original_object, list):
117
+ return results.detach().cpu().numpy().tolist()
118
+ elif isinstance(original_object, np.ndarray):
119
+ return results.detach().cpu().numpy()
120
+ elif isinstance(original_object, pd.DataFrame):
121
+ return pd.DataFrame(results.detach().cpu().numpy())
122
+ elif isinstance(original_object, pd.Series):
123
+ return pd.Series(results.detach().cpu().numpy().flatten())
124
+ elif isinstance(original_object, xr.DataArray):
125
+ return xr.DataArray(results.detach().cpu().numpy())
126
+ return results
127
+
128
+ return results
129
+
130
+ # Mark as a wrapper for detection
131
+ wrapper._is_wrapper = True
132
+ wrapper._decorator_type = "torch_fn"
133
+ return wrapper
134
+
135
+
136
+ # EOF
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 09:16:13 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_wrap.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_wrap.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+
13
+ def wrap(func):
14
+ """Basic function wrapper that preserves function metadata.
15
+ Usage:
16
+ @wrap
17
+ def my_function(x):
18
+ return x + 1
19
+ # Or manually:
20
+ def my_function(x):
21
+ return x + 1
22
+ wrapped_func = wrap(my_function)
23
+ This wrapper is useful as a template for creating more complex decorators
24
+ or when you want to ensure function metadata is preserved.
25
+ """
26
+ import functools
27
+
28
+ @functools.wraps(func)
29
+ def wrapper(*args, **kwargs):
30
+ return func(*args, **kwargs)
31
+
32
+ # Store reference to original function
33
+ wrapper._original_func = func
34
+ # Mark as a wrapper for detection
35
+ wrapper._is_wrapper = True
36
+ return wrapper
37
+
38
+
39
+ # EOF
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 15:41:19 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_xarray_fn.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_xarray_fn.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+ from functools import wraps
12
+ from typing import Any as _Any
13
+ from typing import Callable
14
+
15
+ import numpy as np
16
+ import pandas as pd
17
+ import torch
18
+ import xarray as xr
19
+
20
+ from ._converters import is_nested_decorator
21
+
22
+
23
+ def xarray_fn(func: Callable) -> Callable:
24
+ @wraps(func)
25
+ def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
26
+ # Skip conversion if already in a nested decorator context
27
+ if is_nested_decorator():
28
+ results = func(*args, **kwargs)
29
+ return results
30
+
31
+ # Set the current decorator context
32
+ wrapper._current_decorator = "xarray_fn"
33
+
34
+ # Store original object for type preservation
35
+ original_object = args[0] if args else None
36
+
37
+ # Convert args to xarray DataArrays
38
+ def to_xarray(data):
39
+ if isinstance(data, xr.DataArray):
40
+ return data
41
+ elif isinstance(data, np.ndarray):
42
+ return xr.DataArray(data)
43
+ elif isinstance(data, list):
44
+ return xr.DataArray(data)
45
+ elif isinstance(data, torch.Tensor):
46
+ return xr.DataArray(data.detach().cpu().numpy())
47
+ elif isinstance(data, pd.DataFrame):
48
+ return xr.DataArray(data.values)
49
+ elif isinstance(data, pd.Series):
50
+ return xr.DataArray(data.values)
51
+ else:
52
+ return xr.DataArray([data])
53
+
54
+ converted_args = [to_xarray(arg) for arg in args]
55
+ converted_kwargs = {k: to_xarray(v) for k, v in kwargs.items()}
56
+
57
+ # Assertion to ensure all args are converted to xarray DataArrays
58
+ for arg_index, arg in enumerate(converted_args):
59
+ assert isinstance(
60
+ arg, xr.DataArray
61
+ ), f"Argument {arg_index} not converted to DataArray: {type(arg)}"
62
+
63
+ results = func(*converted_args, **converted_kwargs)
64
+
65
+ # Convert results back to original input types
66
+ if isinstance(results, xr.DataArray):
67
+ if original_object is not None:
68
+ if isinstance(original_object, list):
69
+ return results.values.tolist()
70
+ elif isinstance(original_object, np.ndarray):
71
+ return results.values
72
+ elif isinstance(original_object, torch.Tensor):
73
+ return torch.tensor(results.values)
74
+ elif isinstance(original_object, pd.DataFrame):
75
+ return pd.DataFrame(results.values)
76
+ elif isinstance(original_object, pd.Series):
77
+ return pd.Series(results.values.flatten())
78
+ return results
79
+
80
+ return results
81
+
82
+ # Mark as a wrapper for detection
83
+ wrapper._is_wrapper = True
84
+ wrapper._decorator_type = "xarray_fn"
85
+ return wrapper
86
+
87
+
88
+ # EOF
scitex/dev/__init__.py ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex dev module."""
3
+
4
+ from ._analyze_code_flow import CodeFlowAnalyzer, analyze_code_flow, main, parse_args
5
+ from ._reload import reload, reload_auto, reload_stop
6
+
7
+ __all__ = [
8
+ "CodeFlowAnalyzer",
9
+ "analyze_code_flow",
10
+ "main",
11
+ "parse_args",
12
+ "reload",
13
+ "reload_auto",
14
+ "reload_stop",
15
+ ]
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-20 10:27:28 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/dev/_analyze_code_flow.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/dev/_analyze_code_flow.py"
7
+
8
+ import ast
9
+
10
+ import matplotlib.pyplot as plt
11
+ import scitex
12
+
13
+
14
+ class CodeFlowAnalyzer:
15
+ def __init__(self, file_path: str):
16
+ self.file_path = file_path
17
+ self.execution_flow = []
18
+ self.sequence = 1
19
+ self.skip_functions = {
20
+ "__init__",
21
+ "__main__",
22
+ # Python built-ins
23
+ "len",
24
+ "min",
25
+ "max",
26
+ "sum",
27
+ "enumerate",
28
+ "eval",
29
+ "print",
30
+ "str",
31
+ "int",
32
+ "float",
33
+ "list",
34
+ "dict",
35
+ "set",
36
+ "tuple",
37
+ "any",
38
+ "all",
39
+ "map",
40
+ "filter",
41
+ "zip",
42
+ # Common DataFrame operations
43
+ "apply",
44
+ "unique",
45
+ "tolist",
46
+ "to_list",
47
+ "rename",
48
+ "merge",
49
+ "set_index",
50
+ "reset_index",
51
+ "groupby",
52
+ "sort_values",
53
+ "iloc",
54
+ "loc",
55
+ "where",
56
+ # NumPy operations
57
+ "reshape",
58
+ "squeeze",
59
+ "stack",
60
+ "concatenate",
61
+ "array",
62
+ "zeros",
63
+ "ones",
64
+ "full",
65
+ "empty",
66
+ "frombuffer",
67
+ # Common attributes/methods
68
+ "shape",
69
+ "dtype",
70
+ "size",
71
+ "index",
72
+ "columns",
73
+ "values",
74
+ "name",
75
+ "names",
76
+ # File operations
77
+ "open",
78
+ "read",
79
+ "write",
80
+ "close",
81
+ # String operations
82
+ "join",
83
+ "split",
84
+ "strip",
85
+ "replace",
86
+ # Custom
87
+ "scitex.str.printc",
88
+ "printc",
89
+ "scitex.io.load_configs",
90
+ "parse_args",
91
+ "run_main",
92
+ "load_configs",
93
+ }
94
+ # self.seen_calls = set() # Track unique function calls
95
+
96
+ def _trace_calls(self, node, depth=0):
97
+ sequence_orig = self.sequence
98
+
99
+ if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
100
+
101
+ if node.name not in self.skip_functions:
102
+ # Track all function definitions
103
+ self.execution_flow.append((depth, node.name, self.sequence))
104
+ self.sequence += 1
105
+
106
+ if isinstance(node, ast.Call):
107
+ if isinstance(node.func, ast.Name):
108
+ func_name = node.func.id
109
+
110
+ if func_name not in self.skip_functions:
111
+ self.execution_flow.append((depth, func_name, self.sequence))
112
+ self.sequence += 1
113
+
114
+ elif isinstance(node.func, ast.Attribute):
115
+ parts = []
116
+ current = node.func
117
+ while isinstance(current, ast.Attribute):
118
+ parts.insert(0, current.attr)
119
+ current = current.value
120
+ if isinstance(current, ast.Name):
121
+ parts.insert(0, current.id)
122
+ func_name = ".".join(parts)
123
+
124
+ if not any(skip in func_name for skip in self.skip_functions):
125
+ self.execution_flow.append((depth, func_name, self.sequence))
126
+ self.sequence += 1
127
+
128
+ if self.sequence == 1:
129
+ depth = 0
130
+
131
+ for child in ast.iter_child_nodes(node):
132
+ self._trace_calls(child, depth + 1)
133
+
134
+ def _get_func_name(self, node):
135
+ if isinstance(node.func, ast.Name):
136
+ return node.func.id
137
+ elif isinstance(node.func, ast.Attribute):
138
+ parts = []
139
+ current = node.func
140
+ while isinstance(current, ast.Attribute):
141
+ parts.insert(0, current.attr)
142
+ current = current.value
143
+ if isinstance(current, ast.Name):
144
+ parts.insert(0, current.id)
145
+ func_name = ".".join(parts)
146
+ return (
147
+ func_name
148
+ if not any(skip in func_name for skip in self.skip_functions)
149
+ else None
150
+ )
151
+ return None
152
+
153
+ def _format_output(self):
154
+ output = ["Execution Flow:"]
155
+ last_depth = 1
156
+ skip_until_depth = None
157
+
158
+ filtered_flow = []
159
+
160
+ for depth, call, seq in self.execution_flow:
161
+
162
+ # Start skipping when encountering private method
163
+ if call.startswith(("_", "self._")):
164
+ skip_until_depth = depth
165
+ continue
166
+
167
+ # Skip all nested calls within private methods
168
+ if skip_until_depth is not None and depth > skip_until_depth:
169
+ continue
170
+ else:
171
+ skip_until_depth = None
172
+
173
+ filtered_flow.append((depth, call, seq))
174
+ last_depth = depth
175
+
176
+ # Reset seq on depth == 1
177
+ seq_prev = 0
178
+ for ii, flow in enumerate(filtered_flow):
179
+ depth, call, seq = flow
180
+ if depth == 1:
181
+ seq_current = 1
182
+ seq_prev = 1
183
+ else:
184
+ if depth > 1:
185
+ seq_current = seq_prev + 1
186
+ seq_prev = seq_current
187
+ else:
188
+ seq_current = 0
189
+ seq_prev = 0
190
+
191
+ filtered_flow[ii] = (depth, call, seq_current)
192
+
193
+ for depth, call, seq in filtered_flow:
194
+ prefix = " " * depth
195
+ if depth == 1:
196
+ line = f"\n{prefix}[{int(seq) if isinstance(seq, float) else seq:02d}] {call}"
197
+ else:
198
+ line = f"{prefix}[{int(seq) if isinstance(seq, float) else seq:02d}] └── {call}"
199
+ output.append(line)
200
+
201
+ return "\n".join(output)
202
+
203
+ def analyze(self):
204
+ if self.file_path:
205
+ try:
206
+ with open(self.file_path, "r") as file:
207
+ content = file.read()
208
+
209
+ # Find main guard position and truncate content
210
+ if "if __name__" in content:
211
+ main_guard_pos = content.find("if __name__")
212
+ content = content[:main_guard_pos].strip()
213
+
214
+ tree = ast.parse(content)
215
+ self._trace_calls(tree)
216
+ return self._format_output()
217
+ except Exception as e:
218
+ print(e)
219
+ return str(e)
220
+
221
+
222
+ def analyze_code_flow(lpath):
223
+ return CodeFlowAnalyzer(lpath).analyze()
224
+
225
+
226
+ def main(args):
227
+ diagram = analyze_code_flow(__file__)
228
+ print(diagram)
229
+ return 0
230
+
231
+
232
+ def parse_args():
233
+ import argparse
234
+
235
+ import scitex
236
+
237
+ is_script = scitex.gen.is_script()
238
+
239
+ parser = argparse.ArgumentParser(description="")
240
+ parser.add_argument(
241
+ "--var",
242
+ "-v",
243
+ type=int,
244
+ choices=None,
245
+ default=1,
246
+ help="(default: %%(default)s)",
247
+ )
248
+ parser.add_argument(
249
+ "--flag",
250
+ "-f",
251
+ action="store_true",
252
+ default=False,
253
+ help="(default: %%(default)s)",
254
+ )
255
+ args = parser.parse_args()
256
+ scitex.str.printc(args, c="yellow")
257
+
258
+ return args
259
+
260
+
261
+ if __name__ == "__main__":
262
+ import sys
263
+
264
+ import matplotlib.pyplot as plt
265
+
266
+ CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
267
+ sys,
268
+ plt,
269
+ verbose=False,
270
+ agg=True,
271
+ )
272
+
273
+ exit_status = main(parse_args())
274
+
275
+ scitex.gen.close(
276
+ CONFIG,
277
+ verbose=False,
278
+ notify=False,
279
+ message="",
280
+ exit_status=exit_status,
281
+ )
282
+
283
+
284
+ # EOF
scitex/dev/_reload.py ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-07 17:17:06 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/dev/_reload.py
5
+
6
+
7
+ import importlib
8
+ import sys
9
+ import threading
10
+ import time
11
+ from typing import Any, Optional
12
+
13
+ _reload_thread: Optional[threading.Thread] = None
14
+ _running: bool = False
15
+
16
+
17
+ def reload() -> Any: # Changed return type hint to Any
18
+ """Reloads scitex package and its submodules."""
19
+ import scitex
20
+
21
+ scitex_modules = [mod for mod in sys.modules if mod.startswith("scitex")]
22
+ for module in scitex_modules:
23
+ try:
24
+ importlib.reload(sys.modules[module])
25
+ except Exception:
26
+ pass
27
+ return importlib.reload(scitex)
28
+
29
+
30
+ def reload_auto(interval: int = 10) -> None:
31
+ """Start auto-reload in background thread."""
32
+ global _reload_thread, _running
33
+
34
+ if _reload_thread and _reload_thread.is_alive():
35
+ return
36
+
37
+ _running = True
38
+ _reload_thread = threading.Thread(
39
+ target=_auto_reload_loop, args=(interval,), daemon=True
40
+ )
41
+ _reload_thread.start()
42
+
43
+
44
+ def reload_stop() -> None:
45
+ """Stop auto-reload."""
46
+ global _running
47
+ _running = False
48
+
49
+
50
+ def _auto_reload_loop(interval: int) -> None:
51
+ while _running:
52
+ try:
53
+ reload()
54
+ except Exception as e:
55
+ print(f"Reload failed: {e}")
56
+ time.sleep(interval)
57
+
58
+
59
+ # EOF