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/io/_save.py ADDED
@@ -0,0 +1,539 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 16:49:44 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/io/_save.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/io/_save.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import warnings
13
+
14
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/io/_save.py"
15
+
16
+ """
17
+ 1. Functionality:
18
+ - Provides utilities for saving various data types to different file formats.
19
+ 2. Input:
20
+ - Objects to be saved (e.g., NumPy arrays, PyTorch tensors, Pandas DataFrames, etc.)
21
+ - File path or name where the object should be saved
22
+ 3. Output:
23
+ - Saved files in various formats (e.g., CSV, NPY, PKL, JOBLIB, PNG, HTML, TIFF, MP4, YAML, JSON, HDF5, PTH, MAT, CBM)
24
+ 4. Prerequisites:
25
+ - Python 3.x
26
+ - Required libraries: numpy, pandas, torch, matplotlib, plotly, h5py, joblib, PIL, ruamel.yaml
27
+ """
28
+
29
+ """Imports"""
30
+ import inspect
31
+ import logging
32
+ import os as _os
33
+ from typing import Any
34
+
35
+ from .._sh import sh
36
+ from ..path._clean import clean
37
+ from ..path._getsize import getsize
38
+ from ..str._clean_path import clean_path
39
+ from ..str._color_text import color_text
40
+ from ..str._readable_bytes import readable_bytes
41
+
42
+ # Import save functions from the new modular structure
43
+ from ._save_modules import (
44
+ save_csv,
45
+ save_excel,
46
+ save_npy,
47
+ save_npz,
48
+ save_pickle,
49
+ save_pickle_compressed,
50
+ save_joblib,
51
+ save_torch,
52
+ save_json,
53
+ save_yaml,
54
+ save_hdf5,
55
+ save_matlab,
56
+ save_catboost,
57
+ save_text,
58
+ save_html,
59
+ save_image,
60
+ save_mp4,
61
+ save_listed_dfs_as_csv,
62
+ save_listed_scalars_as_csv,
63
+ save_optuna_study_as_csv_and_pngs,
64
+ )
65
+
66
+
67
+ def _get_figure_with_data(obj):
68
+ """
69
+ Extract figure or axes object that may contain plotting data for CSV export.
70
+
71
+ Parameters
72
+ ----------
73
+ obj : various matplotlib objects
74
+ Could be Figure, Axes, FigWrapper, AxisWrapper, or other matplotlib objects
75
+
76
+ Returns
77
+ -------
78
+ object or None
79
+ Figure or axes object that has export_as_csv methods, or None if not found
80
+ """
81
+ import matplotlib.pyplot as plt
82
+ import matplotlib.figure
83
+ import matplotlib.axes
84
+
85
+ # Check if object already has export methods (SciTeX wrapped objects)
86
+ if hasattr(obj, 'export_as_csv'):
87
+ return obj
88
+
89
+ # Handle matplotlib Figure objects
90
+ if isinstance(obj, matplotlib.figure.Figure):
91
+ # Get the current axes that might be wrapped with SciTeX functionality
92
+ current_ax = plt.gca()
93
+ if hasattr(current_ax, 'export_as_csv'):
94
+ return current_ax
95
+
96
+ # Check all axes in the figure
97
+ for ax in obj.axes:
98
+ if hasattr(ax, 'export_as_csv'):
99
+ return ax
100
+
101
+ return None
102
+
103
+ # Handle matplotlib Axes objects
104
+ if isinstance(obj, matplotlib.axes.Axes):
105
+ if hasattr(obj, 'export_as_csv'):
106
+ return obj
107
+ return None
108
+
109
+ # Handle FigWrapper or similar SciTeX objects
110
+ if hasattr(obj, 'figure') and hasattr(obj.figure, 'axes'):
111
+ # Check if the wrapper itself has export methods
112
+ if hasattr(obj, 'export_as_csv'):
113
+ return obj
114
+
115
+ # Check the underlying figure's axes
116
+ for ax in obj.figure.axes:
117
+ if hasattr(ax, 'export_as_csv'):
118
+ return ax
119
+
120
+ return None
121
+
122
+ # Handle AxisWrapper or similar SciTeX objects
123
+ if hasattr(obj, '_axis_mpl') or hasattr(obj, '_ax'):
124
+ if hasattr(obj, 'export_as_csv'):
125
+ return obj
126
+ return None
127
+
128
+ # Try to get the current figure and its axes as fallback
129
+ try:
130
+ current_fig = plt.gcf()
131
+ current_ax = plt.gca()
132
+
133
+ if hasattr(current_ax, 'export_as_csv'):
134
+ return current_ax
135
+ elif hasattr(current_fig, 'export_as_csv'):
136
+ return current_fig
137
+
138
+ # Check all axes in current figure
139
+ for ax in current_fig.axes:
140
+ if hasattr(ax, 'export_as_csv'):
141
+ return ax
142
+
143
+ except:
144
+ pass
145
+
146
+ return None
147
+
148
+
149
+ def save(
150
+ obj: Any,
151
+ specified_path: str,
152
+ makedirs: bool = True,
153
+ verbose: bool = True,
154
+ symlink_from_cwd: bool = False,
155
+ dry_run: bool = False,
156
+ no_csv: bool = False,
157
+ **kwargs,
158
+ ) -> None:
159
+ """
160
+ Save an object to a file with the specified format.
161
+
162
+ Parameters
163
+ ----------
164
+ obj : Any
165
+ The object to be saved. Can be a NumPy array, PyTorch tensor, Pandas DataFrame, or any serializable object.
166
+ specified_path : str
167
+ The file name or path where the object should be saved. The file extension determines the format.
168
+ makedirs : bool, optional
169
+ If True, create the directory path if it does not exist. Default is True.
170
+ verbose : bool, optional
171
+ If True, print a message upon successful saving. Default is True.
172
+ symlink_from_cwd : bool, optional
173
+ If True, create a _symlink from the current working directory. Default is False.
174
+ dry_run : bool, optional
175
+ If True, simulate the saving process without actually writing files. Default is False.
176
+ **kwargs
177
+ Additional keyword arguments to pass to the underlying save function of the specific format.
178
+
179
+ Returns
180
+ -------
181
+ None
182
+
183
+ Notes
184
+ -----
185
+ Supported formats include CSV, NPY, PKL, JOBLIB, PNG, HTML, TIFF, MP4, YAML, JSON, HDF5, PTH, MAT, and CBM.
186
+ The function dynamically selects the appropriate saving mechanism based on the file extension.
187
+
188
+ Examples
189
+ --------
190
+ >>> import scitex
191
+ >>> import numpy as np
192
+ >>> import pandas as pd
193
+ >>> import torch
194
+ >>> import matplotlib.pyplot as plt
195
+
196
+ >>> # Save NumPy array
197
+ >>> arr = np.array([1, 2, 3])
198
+ >>> scitex.io.save(arr, "data.npy")
199
+
200
+ >>> # Save Pandas DataFrame
201
+ >>> df = pd.DataFrame({"col1": [1, 2], "col2": [3, 4]})
202
+ >>> scitex.io.save(df, "data.csv")
203
+
204
+ >>> # Save PyTorch tensor
205
+ >>> tensor = torch.tensor([1, 2, 3])
206
+ >>> scitex.io.save(tensor, "model.pth")
207
+
208
+ >>> # Save dictionary
209
+ >>> data_dict = {"a": 1, "b": 2, "c": [3, 4, 5]}
210
+ >>> scitex.io.save(data_dict, "data.pkl")
211
+
212
+ >>> # Save matplotlib figure
213
+ >>> plt.figure()
214
+ >>> plt.plot(np.array([1, 2, 3]))
215
+ >>> scitex.io.save(plt, "plot.png")
216
+
217
+ >>> # Save as YAML
218
+ >>> scitex.io.save(data_dict, "config.yaml")
219
+
220
+ >>> # Save as JSON
221
+ >>> scitex.io.save(data_dict, "data.json")
222
+ """
223
+ try:
224
+ ########################################
225
+ # DO NOT MODIFY THIS SECTION
226
+ ########################################
227
+ #
228
+ # Determine saving directory from the script.
229
+ #
230
+ # When called in /path/to/script.py,
231
+ # data will be saved under `/path/to/script.py_out/`
232
+ #
233
+ # On the other hand, when called in ipython environment,
234
+ # data will be saved under `/tmp/{_os.getenv("USER")/`
235
+ #
236
+ ########################################
237
+ spath, sfname = None, None
238
+
239
+ # f-expression handling - safely parse f-strings
240
+ if specified_path.startswith('f"') or specified_path.startswith("f'"):
241
+ # Remove the f prefix and quotes
242
+ path_content = specified_path[2:-1]
243
+
244
+ # Get the caller's frame to access their local variables
245
+ frame = inspect.currentframe().f_back
246
+ try:
247
+ # Use string formatting with the caller's locals and globals
248
+ # This is much safer than eval() as it only does string substitution
249
+ import re
250
+ # Find all {variable} patterns
251
+ variables = re.findall(r'\{([^}]+)\}', path_content)
252
+ format_dict = {}
253
+ for var in variables:
254
+ # Only allow simple variable names, not arbitrary expressions
255
+ if re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', var):
256
+ if var in frame.f_locals:
257
+ format_dict[var] = frame.f_locals[var]
258
+ elif var in frame.f_globals:
259
+ format_dict[var] = frame.f_globals[var]
260
+ else:
261
+ raise ValueError(f"Invalid variable name in f-string: {var}")
262
+
263
+ # Use str.format() which is safe
264
+ specified_path = path_content.format(**format_dict)
265
+ finally:
266
+ del frame # Avoid reference cycles
267
+
268
+ # When full path
269
+ if specified_path.startswith("/"):
270
+ spath = specified_path
271
+
272
+ # When relative path
273
+ else:
274
+ script_path = inspect.stack()[1].filename
275
+
276
+ # Fake path if in ipython
277
+ if ("ipython" in script_path) or ("<stdin>" in script_path):
278
+ script_path = f'/tmp/{_os.getenv("USER")}'
279
+
280
+ sdir = clean_path(_os.path.splitext(script_path)[0] + "_out")
281
+ spath = _os.path.join(sdir, specified_path)
282
+
283
+ # Sanitization
284
+ spath_final = clean(spath)
285
+ ########################################
286
+
287
+ # Potential path to _symlink
288
+ spath_cwd = _os.getcwd() + "/" + specified_path
289
+ spath_cwd = clean(spath_cwd)
290
+
291
+ # Removes spath and spath_cwd to prevent potential circular links
292
+ # Skip deletion for CSV files to allow caching to work
293
+ # Also skip deletion for HDF5 files when a key is specified
294
+ should_skip_deletion = (
295
+ spath_final.endswith('.csv') or
296
+ ((spath_final.endswith('.hdf5') or spath_final.endswith('.h5')) and 'key' in kwargs)
297
+ )
298
+
299
+ if not should_skip_deletion:
300
+ for path in [spath_final, spath_cwd]:
301
+ sh(f"rm -f {path}", verbose=False)
302
+
303
+ if dry_run:
304
+ print(color_text(f"\n(dry run) Saved to: {spath_final}", c="yellow"))
305
+ return
306
+
307
+ # Ensure directory exists
308
+ if makedirs:
309
+ _os.makedirs(_os.path.dirname(spath_final), exist_ok=True)
310
+
311
+ # Main
312
+ _save(
313
+ obj,
314
+ spath_final,
315
+ verbose=verbose,
316
+ symlink_from_cwd=symlink_from_cwd,
317
+ dry_run=dry_run,
318
+ no_csv=no_csv,
319
+ **kwargs,
320
+ )
321
+
322
+ # Symbolic link
323
+ _symlink(spath, spath_cwd, symlink_from_cwd, verbose)
324
+
325
+ except Exception as e:
326
+ logging.error(
327
+ f"Error occurred while saving: {str(e)}"
328
+ f"Debug: Initial script_path = {inspect.stack()[1].filename}"
329
+ f"Debug: Final spath = {spath}"
330
+ )
331
+
332
+
333
+ def _symlink(spath, spath_cwd, symlink_from_cwd, verbose):
334
+ """Create a symbolic link from the current working directory."""
335
+ if symlink_from_cwd and (spath != spath_cwd):
336
+ _os.makedirs(_os.path.dirname(spath_cwd), exist_ok=True)
337
+ sh(f"rm -f {spath_cwd}", verbose=False)
338
+ sh(f"ln -sfr {spath} {spath_cwd}", verbose=False)
339
+ if verbose:
340
+ print(color_text(f"\n(Symlinked to: {spath_cwd})", "yellow"))
341
+
342
+
343
+ def _save(
344
+ obj,
345
+ spath,
346
+ verbose=True,
347
+ symlink_from_cwd=False,
348
+ dry_run=False,
349
+ no_csv=False,
350
+ **kwargs,
351
+ ):
352
+ # Get file extension
353
+ ext = _os.path.splitext(spath)[1].lower()
354
+
355
+ # Try dispatch dictionary first for O(1) lookup
356
+ if ext in _FILE_HANDLERS:
357
+ # Check if handler needs special parameters
358
+ if ext in ['.png', '.jpg', '.jpeg', '.gif', '.tiff', '.tif', '.svc']:
359
+ _FILE_HANDLERS[ext](obj, spath, no_csv=no_csv, symlink_from_cwd=symlink_from_cwd, dry_run=dry_run, **kwargs)
360
+ elif ext in ['.hdf5', '.h5']:
361
+ # HDF5 files may need special 'key' parameter
362
+ _FILE_HANDLERS[ext](obj, spath, **kwargs)
363
+ else:
364
+ _FILE_HANDLERS[ext](obj, spath, **kwargs)
365
+ # csv - special case as it doesn't have a dot prefix in dispatch
366
+ elif spath.endswith(".csv"):
367
+ save_csv(obj, spath, **kwargs)
368
+ # Check for special extension cases not in dispatch
369
+ elif spath.endswith(".pkl.gz"):
370
+ save_pickle_compressed(obj, spath, **kwargs)
371
+ else:
372
+ warnings.warn(f"Unsupported file format. {spath} was not saved.")
373
+
374
+ if verbose:
375
+ if _os.path.exists(spath):
376
+ file_size = getsize(spath)
377
+ file_size = readable_bytes(file_size)
378
+ print(color_text(f"\nSaved to: {spath} ({file_size})", c="yellow"))
379
+
380
+
381
+ def _save_separate_legends(obj, spath, symlink_from_cwd=False, dry_run=False, **kwargs):
382
+ """Save separate legend files if ax.legend('separate') was used."""
383
+ import matplotlib.pyplot as plt
384
+ import matplotlib.figure
385
+
386
+ # Get the matplotlib figure object
387
+ fig = None
388
+ if isinstance(obj, matplotlib.figure.Figure):
389
+ fig = obj
390
+ elif hasattr(obj, '_fig_mpl'):
391
+ fig = obj._fig_mpl
392
+ elif hasattr(obj, 'figure'):
393
+ if isinstance(obj.figure, matplotlib.figure.Figure):
394
+ fig = obj.figure
395
+ elif hasattr(obj.figure, '_fig_mpl'):
396
+ fig = obj.figure._fig_mpl
397
+
398
+ if fig is None:
399
+ return
400
+
401
+ # Check if there are separate legend parameters stored
402
+ if not hasattr(fig, '_separate_legend_params'):
403
+ return
404
+
405
+ # Save each legend as a separate file
406
+ base_path = _os.path.splitext(spath)[0]
407
+ ext = _os.path.splitext(spath)[1]
408
+
409
+ for legend_params in fig._separate_legend_params:
410
+ # Create a new figure for the legend
411
+ legend_fig = plt.figure(figsize=legend_params['figsize'])
412
+ legend_ax = legend_fig.add_subplot(111)
413
+
414
+ # Create the legend
415
+ legend = legend_ax.legend(
416
+ legend_params['handles'],
417
+ legend_params['labels'],
418
+ loc='center',
419
+ frameon=legend_params['frameon'],
420
+ fancybox=legend_params['fancybox'],
421
+ shadow=legend_params['shadow'],
422
+ **legend_params['kwargs']
423
+ )
424
+
425
+ # Remove axes
426
+ legend_ax.axis('off')
427
+
428
+ # Adjust layout to fit the legend
429
+ legend_fig.tight_layout()
430
+
431
+ # Save the legend figure
432
+ legend_filename = f"{base_path}_{legend_params['axis_id']}_legend{ext}"
433
+ save_image(legend_fig, legend_filename, **kwargs)
434
+
435
+ # Close the legend figure to free memory
436
+ plt.close(legend_fig)
437
+
438
+ if not dry_run and _os.path.exists(legend_filename):
439
+ file_size = getsize(legend_filename)
440
+ file_size = readable_bytes(file_size)
441
+ print(color_text(f"\nSaved legend to: {legend_filename} ({file_size})", c="yellow"))
442
+
443
+
444
+ def _handle_image_with_csv(obj, spath, no_csv=False, symlink_from_cwd=False, dry_run=False, **kwargs):
445
+ """Handle image file saving with optional CSV export."""
446
+ save_image(obj, spath, **kwargs)
447
+
448
+ # Handle separate legend saving
449
+ _save_separate_legends(obj, spath, symlink_from_cwd=symlink_from_cwd, dry_run=dry_run, **kwargs)
450
+
451
+ if not no_csv:
452
+ ext = _os.path.splitext(spath)[1].lower()
453
+ ext_wo_dot = ext.replace(".", "")
454
+
455
+ try:
456
+ # Get the figure object that may contain plot data
457
+ fig_obj = _get_figure_with_data(obj)
458
+
459
+ if fig_obj is not None:
460
+ # Save regular CSV if export method exists
461
+ if hasattr(fig_obj, 'export_as_csv'):
462
+ csv_data = fig_obj.export_as_csv()
463
+ if csv_data is not None and not csv_data.empty:
464
+ save(
465
+ csv_data,
466
+ spath.replace(ext_wo_dot, "csv"),
467
+ symlink_from_cwd=symlink_from_cwd,
468
+ dry_run=dry_run,
469
+ no_csv=True,
470
+ **kwargs,
471
+ )
472
+
473
+ # Save SigmaPlot CSV if method exists
474
+ if hasattr(fig_obj, 'export_as_csv_for_sigmaplot'):
475
+ sigmaplot_data = fig_obj.export_as_csv_for_sigmaplot()
476
+ if sigmaplot_data is not None and not sigmaplot_data.empty:
477
+ save(
478
+ sigmaplot_data,
479
+ spath.replace(ext_wo_dot, "csv").replace(".csv", "_for_sigmaplot.csv"),
480
+ symlink_from_cwd=symlink_from_cwd,
481
+ dry_run=dry_run,
482
+ no_csv=True,
483
+ **kwargs,
484
+ )
485
+ except Exception:
486
+ pass
487
+
488
+
489
+ # Dispatch dictionary for O(1) file format lookup
490
+ _FILE_HANDLERS = {
491
+ # Excel formats
492
+ '.xlsx': save_excel,
493
+ '.xls': save_excel,
494
+
495
+ # NumPy formats
496
+ '.npy': save_npy,
497
+ '.npz': save_npz,
498
+
499
+ # Pickle formats
500
+ '.pkl': save_pickle,
501
+ '.pickle': save_pickle,
502
+ '.pkl.gz': save_pickle_compressed,
503
+
504
+ # Other binary formats
505
+ '.joblib': save_joblib,
506
+ '.pth': save_torch,
507
+ '.pt': save_torch,
508
+ '.mat': save_matlab,
509
+ '.cbm': save_catboost,
510
+
511
+ # Text formats
512
+ '.json': save_json,
513
+ '.yaml': save_yaml,
514
+ '.yml': save_yaml,
515
+ '.txt': save_text,
516
+ '.md': save_text,
517
+ '.py': save_text,
518
+ '.css': save_text,
519
+ '.js': save_text,
520
+
521
+ # Data formats
522
+ '.html': save_html,
523
+ '.hdf5': save_hdf5,
524
+ '.h5': save_hdf5,
525
+
526
+ # Media formats
527
+ '.mp4': save_mp4,
528
+ '.png': _handle_image_with_csv,
529
+ '.jpg': _handle_image_with_csv,
530
+ '.jpeg': _handle_image_with_csv,
531
+ '.gif': _handle_image_with_csv,
532
+ '.tiff': _handle_image_with_csv,
533
+ '.tif': _handle_image_with_csv,
534
+ '.svg': _handle_image_with_csv,
535
+ '.pdf': _handle_image_with_csv,
536
+ }
537
+
538
+
539
+ # EOF
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-06-12 13:05:00 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/io/_save_modules/__init__.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/io/_save_modules/__init__.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ """
13
+ Save modules for scitex.io.save functionality
14
+
15
+ This package contains format-specific save handlers for various file types.
16
+ Each module provides a save_<format> function that handles saving objects
17
+ to that specific format.
18
+ """
19
+
20
+ # Import save functions from individual modules
21
+ from ._csv import _save_csv as save_csv
22
+ from ._excel import save_excel
23
+ from ._numpy import _save_npy as save_npy, _save_npz as save_npz
24
+ from ._pickle import _save_pickle as save_pickle, _save_pickle_gz as save_pickle_compressed
25
+ from ._joblib import _save_joblib as save_joblib
26
+ from ._torch import _save_torch as save_torch
27
+ from ._json import _save_json as save_json
28
+ from ._yaml import _save_yaml as save_yaml
29
+ from ._hdf5 import _save_hdf5 as save_hdf5
30
+ from ._matlab import _save_matlab as save_matlab
31
+ from ._catboost import _save_catboost as save_catboost
32
+ from ._text import _save_text as save_text
33
+ from ._html import save_html
34
+ from ._image import save_image
35
+ from ._mp4 import _mk_mp4 as save_mp4
36
+
37
+ # Import additional save utilities
38
+ from ._listed_dfs_as_csv import _save_listed_dfs_as_csv as save_listed_dfs_as_csv
39
+ from ._listed_scalars_as_csv import _save_listed_scalars_as_csv as save_listed_scalars_as_csv
40
+ from ._optuna_study_as_csv_and_pngs import save_optuna_study_as_csv_and_pngs
41
+
42
+ # Define what gets imported with "from scitex.io._save_modules import *"
43
+ __all__ = [
44
+ "save_csv",
45
+ "save_excel",
46
+ "save_npy",
47
+ "save_npz",
48
+ "save_pickle",
49
+ "save_pickle_compressed",
50
+ "save_joblib",
51
+ "save_torch",
52
+ "save_json",
53
+ "save_yaml",
54
+ "save_hdf5",
55
+ "save_matlab",
56
+ "save_catboost",
57
+ "save_text",
58
+ "save_html",
59
+ "save_image",
60
+ "save_mp4",
61
+ "save_listed_dfs_as_csv",
62
+ "save_listed_scalars_as_csv",
63
+ "save_optuna_study_as_csv_and_pngs",
64
+ ]
65
+
66
+ # EOF
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-16 12:29:11 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/io/_save_modules/_catboost.py
5
+
6
+
7
+ def _save_catboost(obj, spath):
8
+ """
9
+ Save a CatBoost model.
10
+
11
+ Parameters
12
+ ----------
13
+ obj : catboost.CatBoost
14
+ The CatBoost model to save.
15
+ spath : str
16
+ Path where the CatBoost model file will be saved.
17
+
18
+ Returns
19
+ -------
20
+ None
21
+ """
22
+ obj.save_model(spath)