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
scitex/tex/_to_vec.py ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
4
+ # File: ./src/scitex/tex/_to_vec.py
5
+
6
+ """
7
+ LaTeX vector notation with fallback mechanisms.
8
+
9
+ Functionality:
10
+ - Convert strings to LaTeX vector notation with automatic fallback
11
+ - Handle LaTeX rendering failures gracefully
12
+ Input:
13
+ String representation of vector
14
+ Output:
15
+ LaTeX vector notation with fallback support
16
+ Prerequisites:
17
+ scitex.str._latex_fallback
18
+ """
19
+
20
+ try:
21
+ from ..str._latex_fallback import safe_latex_render, latex_fallback_decorator
22
+ FALLBACK_AVAILABLE = True
23
+ except ImportError:
24
+ FALLBACK_AVAILABLE = False
25
+ def latex_fallback_decorator(fallback_strategy="auto", preserve_math=True):
26
+ def decorator(func):
27
+ return func
28
+ return decorator
29
+
30
+ def safe_latex_render(text, fallback_strategy="auto", preserve_math=True):
31
+ return text
32
+
33
+
34
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
35
+ def to_vec(v_str, enable_fallback=True, fallback_strategy="auto"):
36
+ r"""
37
+ Convert a string to LaTeX vector notation with automatic fallback.
38
+
39
+ Parameters
40
+ ----------
41
+ v_str : str
42
+ String representation of the vector
43
+ enable_fallback : bool, optional
44
+ Whether to enable LaTeX fallback mechanisms, by default True
45
+ fallback_strategy : str, optional
46
+ Fallback strategy: "auto", "mathtext", "unicode", "plain", by default "auto"
47
+
48
+ Returns
49
+ -------
50
+ str
51
+ LaTeX representation of the vector with automatic fallback
52
+
53
+ Examples
54
+ --------
55
+ >>> vector = to_vec("AB")
56
+ >>> print(vector) # LaTeX: \overrightarrow{\mathrm{AB}}
57
+
58
+ >>> vector = to_vec("AB") # Falls back to unicode if LaTeX fails
59
+ >>> print(vector) # Unicode: A⃗B or AB⃗
60
+
61
+ Notes
62
+ -----
63
+ If LaTeX rendering fails, this function automatically falls back to:
64
+ - mathtext: Uses matplotlib's built-in math rendering
65
+ - unicode: Uses Unicode vector symbols (⃗)
66
+ - plain: Returns plain text with "vec()" notation
67
+ """
68
+ if not v_str:
69
+ return ""
70
+
71
+ # Create LaTeX vector notation
72
+ latex_vector = f"\\overrightarrow{{\\mathrm{{{v_str}}}}}"
73
+
74
+ if enable_fallback and FALLBACK_AVAILABLE:
75
+ # Custom fallback handling for vectors
76
+ if fallback_strategy == "auto":
77
+ # Try mathtext first, then unicode
78
+ try:
79
+ mathtext_result = safe_latex_render(f"${latex_vector}$", "mathtext")
80
+ return mathtext_result
81
+ except Exception:
82
+ # Fall back to unicode vector notation
83
+ return f"{v_str}⃗" # Unicode combining right arrow above
84
+ elif fallback_strategy == "unicode":
85
+ return f"{v_str}⃗" # Unicode combining right arrow above
86
+ elif fallback_strategy == "plain":
87
+ return f"vec({v_str})"
88
+ else:
89
+ return safe_latex_render(f"${latex_vector}$", fallback_strategy)
90
+ else:
91
+ return latex_vector
92
+
93
+
94
+ def safe_to_vec(v_str, fallback_strategy="auto"):
95
+ """
96
+ Safe version of to_vec with explicit fallback control.
97
+
98
+ Parameters
99
+ ----------
100
+ v_str : str
101
+ String representation of the vector
102
+ fallback_strategy : str, optional
103
+ Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
104
+
105
+ Returns
106
+ -------
107
+ str
108
+ Vector notation with specified fallback behavior
109
+ """
110
+ return to_vec(v_str, enable_fallback=True, fallback_strategy=fallback_strategy)
111
+
112
+
113
+ # Backward compatibility
114
+ vector_notation = to_vec
115
+
116
+ # EOF
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex torch module."""
3
+
4
+ from ._apply_to import apply_to
5
+ from ._nan_funcs import nanargmax, nanargmin, nancumprod, nancumsum, nanmax, nanmin, nanprod, nanstd, nanvar
6
+
7
+ __all__ = [
8
+ "apply_to",
9
+ "nanargmax",
10
+ "nanargmin",
11
+ "nancumprod",
12
+ "nancumsum",
13
+ "nanmax",
14
+ "nanmin",
15
+ "nanprod",
16
+ "nanstd",
17
+ "nanvar",
18
+ ]
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-03-31 08:11:45 (ywatanabe)"
4
+
5
+ import torch
6
+
7
+
8
+ def apply_to(fn, x, dim):
9
+ """
10
+ Example:
11
+ x = torch.randn(2, 3, 4)
12
+ fn = sum
13
+ apply_to(fn, x, 1).shape # (2, 1, 4)
14
+ """
15
+ if dim != -1:
16
+ dims = list(range(x.dim()))
17
+ dims[-1], dims[dim] = dims[dim], dims[-1]
18
+ x = x.permute(*dims)
19
+
20
+ # Flatten the tensor along the time dimension
21
+ shape = x.shape
22
+ x = x.reshape(-1, shape[-1])
23
+
24
+ # Apply the function to each slice along the time dimension
25
+ applied = torch.stack([fn(x_i) for x_i in torch.unbind(x, dim=0)], dim=0)
26
+
27
+ # Reshape the tensor to its original shape (with the time dimension at the end)
28
+ applied = applied.reshape(*shape[:-1], -1)
29
+
30
+ # Permute back to the original dimension order if necessary
31
+ if dim != -1:
32
+ applied = applied.permute(*dims)
33
+
34
+ return applied
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-10-28 19:38:19 (ywatanabe)"
4
+ # /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/torch/_nan_funcs.py
5
+
6
+ import torch as _torch
7
+
8
+
9
+ # https://github.com/pytorch/pytorch/issues/61474
10
+ def nanmax(tensor, dim=None, keepdim=False):
11
+ min_value = _torch.finfo(tensor.dtype).min
12
+ if dim is None:
13
+ output = tensor.nan_to_num(min_value).max()
14
+ else:
15
+ output = tensor.nan_to_num(min_value).max(dim=dim, keepdim=keepdim)
16
+ return output
17
+
18
+
19
+ def nanmin(tensor, dim=None, keepdim=False):
20
+ max_value = _torch.finfo(tensor.dtype).max
21
+ if dim is None:
22
+ output = tensor.nan_to_num(max_value).min()
23
+ else:
24
+ output = tensor.nan_to_num(max_value).min(dim=dim, keepdim=keepdim)
25
+ return output
26
+
27
+
28
+ def nanvar(tensor, dim=None, keepdim=False):
29
+ tensor_mean = tensor.nanmean(dim=dim, keepdim=True)
30
+ output = (tensor - tensor_mean).square().nanmean(dim=dim, keepdim=keepdim)
31
+ return output
32
+
33
+
34
+ def nanstd(tensor, dim=None, keepdim=False):
35
+ output = nanvar(tensor, dim=dim, keepdim=keepdim)
36
+ output = output.sqrt()
37
+ return output
38
+
39
+
40
+ def nanprod(tensor, dim=None, keepdim=False):
41
+ if dim is None:
42
+ output = tensor.nan_to_num(1).prod()
43
+ else:
44
+ output = tensor.nan_to_num(1).prod(dim=dim, keepdim=keepdim)
45
+ return output
46
+
47
+
48
+ def nancumprod(tensor, dim=None, keepdim=False):
49
+ if dim is None:
50
+ dim = 0 # Default to first dimension for cumulative operations
51
+ output = tensor.nan_to_num(1).cumprod(dim=dim)
52
+ return output
53
+
54
+
55
+ def nancumsum(tensor, dim=None, keepdim=False):
56
+ if dim is None:
57
+ dim = 0 # Default to first dimension for cumulative operations
58
+ output = tensor.nan_to_num(0).cumsum(dim=dim)
59
+ return output
60
+
61
+
62
+ def nanargmin(tensor, dim=None, keepdim=False):
63
+ max_value = _torch.finfo(tensor.dtype).max
64
+ if dim is None:
65
+ output = tensor.nan_to_num(max_value).argmin()
66
+ else:
67
+ output = tensor.nan_to_num(max_value).argmin(dim=dim, keepdim=keepdim)
68
+ return output
69
+
70
+
71
+ def nanargmax(tensor, dim=None, keepdim=False):
72
+ min_value = _torch.finfo(tensor.dtype).min
73
+ if dim is None:
74
+ output = tensor.nan_to_num(min_value).argmax()
75
+ else:
76
+ output = tensor.nan_to_num(min_value).argmax(dim=dim, keepdim=keepdim)
77
+ return output
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 09:21:23 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_ArrayLike.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/types/_ArrayLike.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from typing import List as _List
13
+ from typing import Tuple as _Tuple
14
+ from typing import Union as _Union
15
+
16
+ import numpy as _np
17
+ import pandas as _pd
18
+ import torch as _torch
19
+ import xarray as _xr
20
+
21
+ ArrayLike = _Union[
22
+ _List,
23
+ _Tuple,
24
+ _np.ndarray,
25
+ _pd.Series,
26
+ _pd.DataFrame,
27
+ _xr.DataArray,
28
+ _torch.tensor,
29
+ ]
30
+
31
+
32
+ def is_array_like(obj) -> bool:
33
+ """Check if object is array-like.
34
+
35
+ Returns:
36
+ bool: True if object is array-like, False otherwise.
37
+ """
38
+ return isinstance(
39
+ obj,
40
+ (_List, _Tuple, _np.ndarray, _pd.Series, _pd.DataFrame, _xr.DataArray),
41
+ ) or _torch.is_tensor(obj)
42
+
43
+
44
+ # EOF
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 17:09:16 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_ColorLike.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/types/_ColorLike.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+ from typing import List, Tuple, Union
12
+
13
+ # Define ColorLike type
14
+ ColorLike = Union[
15
+ str,
16
+ Tuple[float, float, float],
17
+ Tuple[float, float, float, float],
18
+ List[float],
19
+ ]
20
+
21
+ # EOF
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex types module."""
3
+
4
+ from ._ArrayLike import ArrayLike, is_array_like
5
+ from ._ColorLike import ColorLike
6
+ from ._is_listed_X import is_list_of_type, is_listed_X
7
+
8
+ __all__ = [
9
+ "ArrayLike",
10
+ "ColorLike",
11
+ "is_array_like",
12
+ "is_list_of_type",
13
+ "is_listed_X",
14
+ ]
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 17:10:53 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_is_listed_X.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/types/_is_listed_X.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+
13
+ def is_listed_X(obj, types):
14
+ """
15
+ Check if obj is a list where all elements are of one of the specified types.
16
+
17
+ Args:
18
+ obj: Object to check
19
+ types: Type or list of types to check against
20
+
21
+ Example:
22
+ obj = [3, 2, 1, 5]
23
+ is_listed_X(obj, int) # Returns True
24
+ is_listed_X(obj, (int, float)) # Returns True
25
+ is_listed_X(obj, str) # Returns False
26
+
27
+ Returns:
28
+ bool: True if obj is a list and all elements are of one of the specified types
29
+ """
30
+ import numpy as np
31
+
32
+ try:
33
+ condition_list = isinstance(obj, list)
34
+
35
+ if not (isinstance(types, list) or isinstance(types, tuple)):
36
+ types = [types]
37
+
38
+ _conditions_susp = []
39
+ for typ in types:
40
+ _conditions_susp.append(
41
+ (np.array([isinstance(o, typ) for o in obj]) == True).all()
42
+ )
43
+
44
+ condition_susp = np.any(_conditions_susp)
45
+
46
+ _is_listed_X = np.all([condition_list, condition_susp])
47
+ return _is_listed_X
48
+
49
+ except:
50
+ return False
51
+
52
+
53
+ # More conventional alias
54
+ def is_list_of_type(obj, types):
55
+ """
56
+ Check if obj is a list where all elements are of one of the specified types.
57
+
58
+ This is an alias for is_listed_X with a more conventional name.
59
+
60
+ Args:
61
+ obj: Object to check
62
+ types: Type or list of types to check against
63
+
64
+ Returns:
65
+ bool: True if obj is a list and all elements are of one of the specified types
66
+ """
67
+ return is_listed_X(obj, types)
68
+
69
+
70
+ # EOF
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex utils module."""
3
+
4
+ from ._compress_hdf5 import compress_hdf5
5
+ from ._email import ansi_escape, send_gmail
6
+ from ._grid import count_grids, yield_grids
7
+ from ._notify import gen_footer, get_git_branch, get_hostname, get_username, notify
8
+ from ._search import search
9
+
10
+ __all__ = [
11
+ "ansi_escape",
12
+ "compress_hdf5",
13
+ "count_grids",
14
+ "gen_footer",
15
+ "get_git_branch",
16
+ "get_hostname",
17
+ "get_username",
18
+ "notify",
19
+ "search",
20
+ "send_gmail",
21
+ "yield_grids",
22
+ ]
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-10 08:26:28 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/utils/_compress_hdf5.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "/ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/utils/_compress_hdf5.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+ import h5py
12
+ import numpy as np
13
+ from tqdm import tqdm
14
+
15
+
16
+ def compress_hdf5(input_file, output_file=None, compression_level=4):
17
+ """
18
+ Compress an existing HDF5 file by reading all datasets and rewriting them with compression.
19
+
20
+ Parameters:
21
+ -----------
22
+ input_file : str
23
+ Path to the input HDF5 file
24
+ output_file : str, optional
25
+ Path to the output compressed HDF5 file. If None, will use input_file + '.compressed.h5'
26
+ compression_level : int, optional
27
+ Compression level (1-9), higher means more compression but slower processing
28
+ """
29
+ if output_file is None:
30
+ base, ext = os.path.splitext(input_file)
31
+ output_file = f"{base}.compressed{ext}"
32
+
33
+ print(f"Compressing {input_file} to {output_file}")
34
+
35
+ with h5py.File(input_file, "r") as src, h5py.File(output_file, "w") as dst:
36
+ # Copy file attributes
37
+ for key, value in src.attrs.items():
38
+ dst.attrs[key] = value
39
+
40
+ def copy_dataset(name, obj):
41
+ if isinstance(obj, h5py.Dataset):
42
+ # Print progress for large datasets
43
+ if len(obj.shape) > 0 and obj.shape[0] > 1000000:
44
+ print(f"Processing large dataset {name} with shape {obj.shape}")
45
+
46
+ # Get original dataset attributes
47
+ chunks = True # Let h5py choose chunking
48
+ if obj.chunks is not None:
49
+ chunks = obj.chunks
50
+
51
+ # Create the compressed dataset
52
+ compressed_data = dst.create_dataset(
53
+ name,
54
+ shape=obj.shape,
55
+ dtype=obj.dtype,
56
+ compression="gzip",
57
+ compression_opts=compression_level,
58
+ chunks=chunks,
59
+ )
60
+
61
+ # Copy data and attributes
62
+ if len(obj.shape) > 0 and obj.shape[0] > 10000000:
63
+ # Process large datasets in chunks to avoid memory issues
64
+ chunk_size = 5000000 # Adjust based on your available RAM
65
+ for i in tqdm(
66
+ range(0, obj.shape[0], chunk_size), desc=f"Copying {name}"
67
+ ):
68
+ end = min(i + chunk_size, obj.shape[0])
69
+ if len(obj.shape) == 1:
70
+ compressed_data[i:end] = obj[i:end]
71
+ else:
72
+ compressed_data[i:end, ...] = obj[i:end, ...]
73
+ else:
74
+ # Small enough to copy at once
75
+ compressed_data[()] = obj[()]
76
+
77
+ # Copy dataset attributes
78
+ for key, value in obj.attrs.items():
79
+ compressed_data.attrs[key] = value
80
+
81
+ elif isinstance(obj, h5py.Group):
82
+ # Create group in destination file
83
+ group = dst.create_group(name)
84
+ # Copy group attributes
85
+ for key, value in obj.attrs.items():
86
+ group.attrs[key] = value
87
+
88
+ # Process all objects in the file
89
+ src.visititems(copy_dataset)
90
+
91
+ print(
92
+ f"Compression complete. Original size: {os.path.getsize(input_file)/1e9:.2f} GB, "
93
+ f"New size: {os.path.getsize(output_file)/1e9:.2f} GB"
94
+ )
95
+
96
+ return output_file
97
+
98
+
99
+ if __name__ == "__main__":
100
+ import argparse
101
+
102
+ parser = argparse.ArgumentParser(
103
+ description="Compress existing HDF5 files with gzip compression"
104
+ )
105
+ parser.add_argument("input_file", help="Path to the input HDF5 file")
106
+ parser.add_argument(
107
+ "--output_file", help="Path to the output compressed HDF5 file", default=None
108
+ )
109
+ parser.add_argument(
110
+ "--compression", type=int, help="Compression level (1-9)", default=4
111
+ )
112
+
113
+ args = parser.parse_args()
114
+ compress_existing_h5(args.input_file, args.output_file, args.compression)
115
+
116
+ # EOF
scitex/utils/_email.py ADDED
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-03 06:33:08 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/utils/_email.py
5
+
6
+ import os
7
+ import smtplib
8
+ from email import encoders
9
+ from email.mime.base import MIMEBase as _MIMEBase
10
+ from email.mime.multipart import MIMEMultipart as _MIMEMultipart
11
+ from email.mime.text import MIMEText as _MIMEText
12
+ import mimetypes
13
+
14
+ from ..reproduce._gen_ID import gen_ID
15
+
16
+ import re
17
+
18
+ ansi_escape = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
19
+
20
+
21
+ def send_gmail(
22
+ sender_gmail,
23
+ sender_password,
24
+ recipient_email,
25
+ subject,
26
+ message,
27
+ sender_name=None,
28
+ cc=None,
29
+ ID=None,
30
+ attachment_paths=None,
31
+ verbose=True,
32
+ ):
33
+ if ID == "auto":
34
+ ID = gen_ID()
35
+
36
+ if ID:
37
+ if subject:
38
+ subject = f"{subject} (ID: {ID})"
39
+ else:
40
+ subject = f"ID: {ID}"
41
+
42
+ try:
43
+ server = smtplib.SMTP("smtp.gmail.com", 587)
44
+ server.starttls()
45
+ server.login(sender_gmail, sender_password)
46
+
47
+ gmail = _MIMEMultipart()
48
+ gmail["Subject"] = subject
49
+ gmail["To"] = recipient_email
50
+ if cc:
51
+ if isinstance(cc, str):
52
+ gmail["Cc"] = cc
53
+ elif isinstance(cc, list):
54
+ gmail["Cc"] = ", ".join(cc)
55
+ if sender_name:
56
+ gmail["From"] = f"{sender_name} <{sender_gmail}>"
57
+ else:
58
+ gmail["From"] = sender_gmail
59
+ gmail_body = _MIMEText(message, "plain")
60
+ gmail.attach(gmail_body)
61
+
62
+ # Attachment files
63
+ if attachment_paths:
64
+ for path in attachment_paths:
65
+ _, ext = os.path.splitext(path)
66
+ if ext.lower() == ".log":
67
+ with open(path, "r", encoding="utf-8") as file:
68
+ content = file.read()
69
+ cleaned_content = ansi_escape.sub("", content)
70
+ part = _MIMEText(cleaned_content, "plain")
71
+
72
+ # part = _MIMEText(file.read(), 'plain')
73
+ else:
74
+ mime_type, _ = mimetypes.guess_type(path)
75
+ if mime_type is None:
76
+ mime_type = "text/plain"
77
+ main_type, sub_type = mime_type.split("/", 1)
78
+ with open(path, "rb") as file:
79
+ part = _MIMEBase(main_type, sub_type)
80
+ part.set_payload(file.read())
81
+ encoders.encode_base64(part)
82
+
83
+ part.add_header(
84
+ "Content-Disposition",
85
+ f"attachment; filename={os.path.basename(path)}",
86
+ )
87
+ gmail.attach(part)
88
+
89
+ recipients = [recipient_email]
90
+ if cc:
91
+ if isinstance(cc, str):
92
+ recipients.append(cc)
93
+ elif isinstance(cc, list):
94
+ recipients.extend(cc)
95
+ server.send_message(gmail, to_addrs=recipients)
96
+
97
+ server.quit()
98
+
99
+ if verbose:
100
+ cc_info = f" (CC: {cc})" if cc else ""
101
+ message = f"Email was sent:\n"
102
+ message += f" {sender_gmail} -> {recipient_email}{cc_info}\n"
103
+ message += f" (ID: {ID})\n"
104
+ if attachment_paths:
105
+ message += f" Attached:\n"
106
+ for ap in attachment_paths:
107
+ message += f" {ap}\n"
108
+ print(message)
109
+
110
+ # message = f"\nEmail was sent:\n\t{sender_gmail} -> {recipient_email}{cc_info}\n\t(ID: {ID})"
111
+ # if attachment_paths:
112
+ # attachment_paths_str = '\n\t\t'.join(attachment_paths)
113
+ # message += f"\n\tAttached:\n\t{attachment_paths_str}"
114
+ # print(message)
115
+
116
+ except Exception as e:
117
+ print(f"Email was not sent: {e}")
118
+
119
+
120
+ # EOF