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,282 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 14:58:43 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_converters.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_converters.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import functools
13
+ import warnings
14
+ from typing import Any as _Any
15
+ from typing import Callable, Dict, Tuple, Union
16
+
17
+ import numpy as np
18
+ import pandas as pd
19
+ import torch
20
+ import xarray
21
+
22
+ """
23
+ Core conversion utilities for handling data type transformations.
24
+ Provides consistent conversion between NumPy, PyTorch, Pandas, and other formats.
25
+ """
26
+
27
+
28
+ class ConversionWarning(UserWarning):
29
+ pass
30
+
31
+
32
+ # Configure warnings
33
+ warnings.simplefilter("always", ConversionWarning)
34
+
35
+
36
+ @functools.lru_cache(maxsize=None)
37
+ def _cached_warning(message: str) -> None:
38
+ """Cache warnings to avoid repetition."""
39
+ warnings.warn(message, category=ConversionWarning)
40
+
41
+
42
+ def _conversion_warning(old: _Any, new: torch.Tensor) -> None:
43
+ """Generate standardized type conversion warning."""
44
+ message = (
45
+ f"Converted from {type(old).__name__} to {type(new).__name__} ({new.device}). "
46
+ f"Consider using {type(new).__name__} ({new.device}) as input for faster computation."
47
+ )
48
+ _cached_warning(message)
49
+
50
+
51
+ def _try_device(tensor: torch.Tensor, device: str) -> torch.Tensor:
52
+ """Try to move tensor to specified device with graceful fallback."""
53
+ if not isinstance(tensor, torch.Tensor):
54
+ return tensor
55
+
56
+ if tensor.device.type == device:
57
+ return tensor
58
+
59
+ try:
60
+ return tensor.to(device)
61
+ except RuntimeError as error:
62
+ if "cuda" in str(error).lower() and device == "cuda":
63
+ warnings.warn("CUDA memory insufficient, falling back to CPU.", UserWarning)
64
+ return tensor.cpu()
65
+ raise error
66
+
67
+
68
+ def is_torch(*args: _Any, **kwargs: _Any) -> bool:
69
+ """Check if any input is a PyTorch tensor."""
70
+ return any(isinstance(arg, torch.Tensor) for arg in args) or any(
71
+ isinstance(val, torch.Tensor) for val in kwargs.values()
72
+ )
73
+
74
+
75
+ def is_cuda(*args: _Any, **kwargs: _Any) -> bool:
76
+ """Check if any input is a CUDA tensor."""
77
+ return any((isinstance(arg, torch.Tensor) and arg.is_cuda) for arg in args) or any(
78
+ (isinstance(val, torch.Tensor) and val.is_cuda) for val in kwargs.values()
79
+ )
80
+
81
+
82
+ def _return_always(*args: _Any, **kwargs: _Any) -> Tuple[Tuple, Dict]:
83
+ """Always return args and kwargs as a tuple of (args, kwargs)."""
84
+ return args, kwargs
85
+
86
+
87
+ def _return_if(*args: _Any, **kwargs: _Any) -> Union[Tuple, Dict, None]:
88
+ """Return args and/or kwargs depending on what's provided."""
89
+ if args and kwargs:
90
+ return args, kwargs
91
+ elif args:
92
+ return args
93
+ elif kwargs:
94
+ return kwargs
95
+ else:
96
+ return None
97
+
98
+
99
+ def to_torch(
100
+ *args: _Any,
101
+ return_fn: Callable = _return_if,
102
+ device: str = None,
103
+ **kwargs: _Any,
104
+ ) -> _Any:
105
+ """Convert various data types to PyTorch tensors."""
106
+ if device is None:
107
+ device = kwargs.get("device", "cuda" if torch.cuda.is_available() else "cpu")
108
+
109
+ def _to_torch(data: _Any) -> _Any:
110
+ """Internal conversion function for various data types."""
111
+ # Check for None
112
+ if data is None:
113
+ return None
114
+
115
+ # Don't convert scalars (int, float, bool, str) - they should remain as is
116
+ if isinstance(data, (int, float, bool, str)):
117
+ return data
118
+
119
+ # Handle collections
120
+ if isinstance(data, (tuple, list)):
121
+ # Check if it's a tuple/list of integers (like dimensions)
122
+ if all(isinstance(item, int) for item in data):
123
+ return data # Keep as is for dimension tuples
124
+
125
+ # Check if it's a numeric array-like structure
126
+ try:
127
+ # Try to convert to tensor directly
128
+ new_data = torch.tensor(data).float()
129
+ new_data = _try_device(new_data, device)
130
+ if device == "cuda":
131
+ _conversion_warning(data, new_data)
132
+ return new_data
133
+ except:
134
+ # If conversion fails, process items individually and return as tensor if possible
135
+ converted_items = [_to_torch(item) for item in data if item is not None]
136
+ # Try to stack if all items are tensors
137
+ if converted_items and all(isinstance(item, torch.Tensor) for item in converted_items):
138
+ try:
139
+ # Stack tensors along a new dimension
140
+ return torch.stack(converted_items)
141
+ except:
142
+ # Return as list if stacking fails
143
+ return converted_items
144
+ return converted_items
145
+
146
+ # Handle pandas types
147
+ if isinstance(data, (pd.Series, pd.DataFrame)):
148
+ new_data = torch.tensor(data.to_numpy()).squeeze().float()
149
+ new_data = _try_device(new_data, device)
150
+ if device == "cuda":
151
+ _conversion_warning(data, new_data)
152
+ return new_data
153
+
154
+ # Handle arrays
155
+ if isinstance(data, np.ndarray):
156
+ new_data = torch.tensor(data).float()
157
+ new_data = _try_device(new_data, device)
158
+ if device == "cuda":
159
+ _conversion_warning(data, new_data)
160
+ return new_data
161
+
162
+ # Handle xarray
163
+ if isinstance(data, xarray.core.dataarray.DataArray):
164
+ new_data = torch.tensor(np.array(data)).float()
165
+ new_data = _try_device(new_data, device)
166
+ if device == "cuda":
167
+ _conversion_warning(data, new_data)
168
+ return new_data
169
+
170
+ # Return as is for other types
171
+ return data
172
+
173
+ # Process args and kwargs
174
+ converted_args = [_to_torch(arg) for arg in args if arg is not None]
175
+ converted_kwargs = {
176
+ key: _to_torch(val) for key, val in kwargs.items() if val is not None
177
+ }
178
+
179
+ # Handle axis/dim parameter conversion
180
+ # Only convert axis to dim if dim is not already present
181
+ if "axis" in converted_kwargs and "dim" not in converted_kwargs:
182
+ converted_kwargs["dim"] = converted_kwargs.pop("axis")
183
+
184
+ # Return in the specified format
185
+ return return_fn(*converted_args, **converted_kwargs)
186
+
187
+
188
+ def to_numpy(*args: _Any, return_fn: Callable = _return_if, **kwargs: _Any) -> _Any:
189
+ """Convert various data types to NumPy arrays."""
190
+
191
+ def _to_numpy(data: _Any) -> _Any:
192
+ """Internal conversion function for various data types."""
193
+ # Check for None
194
+ if data is None:
195
+ return None
196
+
197
+ # Don't convert scalars (int, float, bool, str) - they should remain as is
198
+ if isinstance(data, (int, float, bool, str)):
199
+ return data
200
+
201
+ # Handle pandas types
202
+ if isinstance(data, (pd.Series, pd.DataFrame)):
203
+ return data.to_numpy().squeeze()
204
+
205
+ # Handle torch tensors
206
+ if isinstance(data, torch.Tensor):
207
+ return data.detach().cpu().numpy()
208
+
209
+ # Handle lists and tuples
210
+ if isinstance(data, (list, tuple)):
211
+ # Check if it's a tuple/list of integers (like dimensions)
212
+ if all(isinstance(item, int) for item in data):
213
+ return data # Keep as is for dimension tuples
214
+
215
+ # Check if it's a numeric array-like structure
216
+ try:
217
+ # Try to convert to numpy array directly
218
+ return np.array(data)
219
+ except:
220
+ # If conversion fails, process items individually
221
+ converted_items = [_to_numpy(item) for item in data if item is not None]
222
+ # Try to stack if all items are numpy arrays
223
+ if converted_items and all(isinstance(item, np.ndarray) for item in converted_items):
224
+ try:
225
+ # Stack arrays along a new dimension
226
+ return np.stack(converted_items)
227
+ except:
228
+ # Return as list if stacking fails
229
+ return converted_items
230
+ return converted_items
231
+
232
+ # Return as is for other types
233
+ return data
234
+
235
+ # Process args and kwargs
236
+ converted_args = [_to_numpy(arg) for arg in args if arg is not None]
237
+ converted_kwargs = {
238
+ key: _to_numpy(val) for key, val in kwargs.items() if val is not None
239
+ }
240
+
241
+ # Handle dim/axis parameter conversion
242
+ # Only convert dim to axis if axis is not already present
243
+ if "dim" in converted_kwargs and "axis" not in converted_kwargs:
244
+ converted_kwargs["axis"] = converted_kwargs.pop("dim")
245
+
246
+ # Return in the specified format
247
+ return return_fn(*converted_args, **converted_kwargs)
248
+
249
+
250
+ def is_nested_decorator():
251
+ """Check if we're in a nested decorator context."""
252
+ import inspect
253
+
254
+ frame = inspect.currentframe()
255
+ current_decorator = None
256
+ decorator_chain = []
257
+
258
+ # Walk up the call stack
259
+ while frame:
260
+ if frame.f_code.co_name == "wrapper":
261
+ # Check if this frame has local variables
262
+ if frame.f_locals:
263
+ # Try to get the self reference if it's a method
264
+ if "self" in frame.f_locals:
265
+ decorator_chain.append(frame.f_locals["self"])
266
+
267
+ # Check if the wrapper has marked itself with decorator info
268
+ if "_current_decorator" in frame.f_locals:
269
+ decorator_type = frame.f_locals["_current_decorator"]
270
+ if current_decorator is None:
271
+ current_decorator = decorator_type
272
+ elif current_decorator != decorator_type:
273
+ # Found a different decorator in the chain
274
+ return True
275
+
276
+ frame = frame.f_back
277
+
278
+ # If we found more than one decorator in the chain
279
+ return len(decorator_chain) > 1
280
+
281
+
282
+ # EOF
@@ -0,0 +1,26 @@
1
+ import functools
2
+ import warnings
3
+
4
+
5
+ def deprecated(reason=None):
6
+ """
7
+ A decorator to mark functions as deprecated. It will result in a warning being emitted
8
+ when the function is used.
9
+
10
+ Args:
11
+ reason (str): A human-readable string explaining why this function was deprecated.
12
+ """
13
+
14
+ def decorator(func):
15
+ @functools.wraps(func)
16
+ def new_func(*args, **kwargs):
17
+ warnings.warn(
18
+ f"{func.__name__} is deprecated: {reason}",
19
+ DeprecationWarning,
20
+ stacklevel=2,
21
+ )
22
+ return func(*args, **kwargs)
23
+
24
+ return new_func
25
+
26
+ return decorator
@@ -0,0 +1,30 @@
1
+ #!./env/bin/python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-06-07 22:16:25 (ywatanabe)"
4
+ # /home/ywatanabe/proj/scitex/src/scitex/gen/_not_implemented.py
5
+
6
+ import warnings
7
+
8
+
9
+ def not_implemented(func):
10
+ """
11
+ Decorator to mark methods as not implemented, issue a warning, and prevent their execution.
12
+
13
+ Arguments:
14
+ func (callable): The function or method to decorate.
15
+
16
+ Returns:
17
+ callable: A wrapper function that issues a warning and raises NotImplementedError when called.
18
+ """
19
+
20
+ def wrapper(*args, **kwargs):
21
+ # Issue a warning before raising the error
22
+ warnings.warn(
23
+ f"Attempt to use unimplemented method: '{func.__name__}'. This method is not yet available.",
24
+ category=FutureWarning,
25
+ stacklevel=2,
26
+ )
27
+ # # Raise the NotImplementedError
28
+ # raise NotImplementedError(f"The method '{func.__name__}' is not implemented yet.")
29
+
30
+ return wrapper
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 15:29:53 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_numpy_fn.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_numpy_fn.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import numpy as np
13
+ import pandas as pd
14
+ import torch
15
+
16
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_numpy_fn.py"
17
+
18
+ from functools import wraps
19
+ from typing import Any as _Any
20
+ from typing import Callable
21
+
22
+ from ._converters import _return_always, is_nested_decorator, to_numpy
23
+
24
+
25
+ def numpy_fn(func: Callable) -> Callable:
26
+ @wraps(func)
27
+ def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
28
+ # Skip conversion if already in a nested decorator context
29
+ if is_nested_decorator():
30
+ results = func(*args, **kwargs)
31
+ return results
32
+
33
+ # Set the current decorator context
34
+ wrapper._current_decorator = "numpy_fn"
35
+
36
+ # Store original object for type preservation
37
+ original_object = args[0] if args else None
38
+
39
+ converted_args, converted_kwargs = to_numpy(
40
+ *args, return_fn=_return_always, **kwargs
41
+ )
42
+
43
+ # Skip strict assertion for certain types that may not convert to arrays
44
+ # Instead, convert what we can and pass through what we can't
45
+ validated_args = []
46
+ for arg_index, arg in enumerate(converted_args):
47
+ if isinstance(arg, np.ndarray):
48
+ validated_args.append(arg)
49
+ elif isinstance(arg, (int, float, str, type(None))):
50
+ # Pass through scalars and strings unchanged
51
+ validated_args.append(arg)
52
+ elif isinstance(arg, list) and all(isinstance(item, np.ndarray) for item in arg):
53
+ # List of arrays - pass through as is
54
+ validated_args.append(arg)
55
+ else:
56
+ # Try one more conversion attempt
57
+ try:
58
+ validated_args.append(np.array(arg))
59
+ except:
60
+ # If all else fails, pass through unchanged
61
+ validated_args.append(arg)
62
+
63
+ results = func(*validated_args, **converted_kwargs)
64
+
65
+ # Convert results back to original input types
66
+ if isinstance(results, np.ndarray):
67
+ if original_object is not None:
68
+ if isinstance(original_object, list):
69
+ return results.tolist()
70
+ elif isinstance(original_object, torch.Tensor):
71
+ return torch.tensor(results)
72
+ elif isinstance(original_object, pd.DataFrame):
73
+ return pd.DataFrame(results)
74
+ elif isinstance(original_object, pd.Series):
75
+ return pd.Series(results)
76
+ return results
77
+
78
+ return results
79
+
80
+ # Mark as a wrapper for detection
81
+ wrapper._is_wrapper = True
82
+ wrapper._decorator_type = "numpy_fn"
83
+ return wrapper
84
+
85
+
86
+ # EOF
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 15:44:00 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_pandas_fn.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_pandas_fn.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_pandas_fn.py"
13
+
14
+ from functools import wraps
15
+ from typing import Any as _Any
16
+ from typing import Callable
17
+
18
+ import numpy as np
19
+ import pandas as pd
20
+ import torch
21
+ import xarray as xr
22
+
23
+ from ._converters import is_nested_decorator
24
+
25
+
26
+ def pandas_fn(func: Callable) -> Callable:
27
+ @wraps(func)
28
+ def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
29
+ # Skip conversion if already in a nested decorator context
30
+ if is_nested_decorator():
31
+ results = func(*args, **kwargs)
32
+ return results
33
+
34
+ # Set the current decorator context
35
+ wrapper._current_decorator = "pandas_fn"
36
+
37
+ # Store original object for type preservation
38
+ original_object = args[0] if args else None
39
+
40
+ # Convert args to pandas DataFrames
41
+ def to_pandas(data):
42
+ if data is None:
43
+ return None
44
+ elif isinstance(data, pd.DataFrame):
45
+ return data
46
+ elif isinstance(data, pd.Series):
47
+ return pd.DataFrame(data)
48
+ elif isinstance(data, np.ndarray):
49
+ return pd.DataFrame(data)
50
+ elif isinstance(data, list):
51
+ try:
52
+ return pd.DataFrame(data)
53
+ except:
54
+ # If list can't be converted to DataFrame, return as is
55
+ return data
56
+ elif isinstance(data, torch.Tensor):
57
+ return pd.DataFrame(data.detach().cpu().numpy())
58
+ elif isinstance(data, xr.DataArray):
59
+ return pd.DataFrame(data.values)
60
+ elif isinstance(data, (int, float, str)):
61
+ # Don't convert scalars to DataFrames
62
+ return data
63
+ else:
64
+ try:
65
+ return pd.DataFrame([data])
66
+ except:
67
+ # If conversion fails, return as is
68
+ return data
69
+
70
+ converted_args = [to_pandas(arg) for arg in args]
71
+ converted_kwargs = {k: to_pandas(v) for k, v in kwargs.items()}
72
+
73
+ # Skip strict assertion for certain types
74
+ validated_args = []
75
+ for arg_index, arg in enumerate(converted_args):
76
+ if isinstance(arg, pd.DataFrame):
77
+ validated_args.append(arg)
78
+ elif isinstance(arg, (int, float, str, type(None), pd.Series)):
79
+ # Pass through scalars, strings, Series, and None unchanged
80
+ validated_args.append(arg)
81
+ elif isinstance(arg, list) and all(isinstance(item, pd.DataFrame) for item in arg):
82
+ # List of DataFrames - pass through as is
83
+ validated_args.append(arg)
84
+ else:
85
+ # Try one more conversion attempt
86
+ try:
87
+ validated_args.append(pd.DataFrame(arg))
88
+ except:
89
+ # If all else fails, pass through unchanged
90
+ validated_args.append(arg)
91
+
92
+ results = func(*validated_args, **converted_kwargs)
93
+
94
+ # Convert results back to original input types
95
+ if isinstance(results, pd.DataFrame):
96
+ if original_object is not None:
97
+ if isinstance(original_object, list):
98
+ return results.values.tolist()
99
+ elif isinstance(original_object, np.ndarray):
100
+ return results.values
101
+ elif isinstance(original_object, torch.Tensor):
102
+ return torch.tensor(results.values)
103
+ elif isinstance(original_object, pd.Series):
104
+ return (
105
+ pd.Series(results.iloc[:, 0])
106
+ if results.shape[1] > 0
107
+ else pd.Series()
108
+ )
109
+ elif isinstance(original_object, xr.DataArray):
110
+ return xr.DataArray(results.values)
111
+ return results
112
+
113
+ return results
114
+
115
+ # Mark as a wrapper for detection
116
+ wrapper._is_wrapper = True
117
+ wrapper._decorator_type = "pandas_fn"
118
+ return wrapper
119
+
120
+
121
+ # EOF
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-14 07:44:00 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/decorators/_preserve_doc.py
5
+
6
+ from functools import wraps
7
+
8
+
9
+ def preserve_doc(loader_func):
10
+ """Wrap the loader functions to preserve their docstrings"""
11
+
12
+ @wraps(loader_func)
13
+ def wrapper(*args, **kwargs):
14
+ return loader_func(*args, **kwargs)
15
+
16
+ return wrapper
17
+
18
+
19
+ # EOF
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-31 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_signal_fn.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/decorators/_signal_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 signal_fn(func: Callable) -> Callable:
25
+ """Decorator for signal processing functions that converts only the first argument (signal) to torch tensor.
26
+
27
+ This decorator is designed for DSP functions where:
28
+ - The first argument is the signal data that should be converted to torch tensor
29
+ - Other arguments (like sampling frequency, bands, etc.) should remain as-is
30
+ """
31
+
32
+ @wraps(func)
33
+ def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
34
+ # Skip conversion if already in a nested decorator context
35
+ if is_nested_decorator():
36
+ results = func(*args, **kwargs)
37
+ return results
38
+
39
+ # Set the current decorator context
40
+ wrapper._current_decorator = "signal_fn"
41
+
42
+ # Store original object for type preservation
43
+ original_object = args[0] if args else None
44
+
45
+ # Convert only the first argument (signal) to torch tensor
46
+ if args:
47
+ # Convert first argument to torch
48
+ converted_first_arg = to_torch(args[0], return_fn=_return_always)[0][0]
49
+
50
+ # Keep other arguments as-is
51
+ converted_args = (converted_first_arg,) + args[1:]
52
+ else:
53
+ converted_args = args
54
+
55
+ results = func(*converted_args, **kwargs)
56
+
57
+ # Convert results back to original input types
58
+ if isinstance(results, torch.Tensor):
59
+ if original_object is not None:
60
+ if isinstance(original_object, list):
61
+ return results.detach().cpu().numpy().tolist()
62
+ elif isinstance(original_object, np.ndarray):
63
+ return results.detach().cpu().numpy()
64
+ elif isinstance(original_object, pd.DataFrame):
65
+ return pd.DataFrame(results.detach().cpu().numpy())
66
+ elif isinstance(original_object, pd.Series):
67
+ return pd.Series(results.detach().cpu().numpy().flatten())
68
+ elif isinstance(original_object, xr.DataArray):
69
+ return xr.DataArray(results.detach().cpu().numpy())
70
+ return results
71
+
72
+ # Handle tuple returns (e.g., (signal, frequencies))
73
+ elif isinstance(results, tuple):
74
+ converted_results = []
75
+ for r in results:
76
+ if isinstance(r, torch.Tensor):
77
+ if original_object is not None and isinstance(
78
+ original_object, np.ndarray
79
+ ):
80
+ converted_results.append(r.detach().cpu().numpy())
81
+ else:
82
+ converted_results.append(r)
83
+ else:
84
+ converted_results.append(r)
85
+ return tuple(converted_results)
86
+
87
+ return results
88
+
89
+ # Mark as a wrapper for detection
90
+ wrapper._is_wrapper = True
91
+ wrapper._decorator_type = "signal_fn"
92
+ return wrapper
93
+
94
+
95
+ # EOF