scitex 2.0.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. scitex/__init__.py +73 -0
  2. scitex/__main__.py +89 -0
  3. scitex/__version__.py +14 -0
  4. scitex/_sh.py +59 -0
  5. scitex/ai/_LearningCurveLogger.py +583 -0
  6. scitex/ai/__Classifiers.py +101 -0
  7. scitex/ai/__init__.py +55 -0
  8. scitex/ai/_gen_ai/_Anthropic.py +173 -0
  9. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  10. scitex/ai/_gen_ai/_DeepSeek.py +175 -0
  11. scitex/ai/_gen_ai/_Google.py +161 -0
  12. scitex/ai/_gen_ai/_Groq.py +97 -0
  13. scitex/ai/_gen_ai/_Llama.py +142 -0
  14. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  15. scitex/ai/_gen_ai/_PARAMS.py +565 -0
  16. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  17. scitex/ai/_gen_ai/__init__.py +32 -0
  18. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  19. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  20. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  21. scitex/ai/act/__init__.py +8 -0
  22. scitex/ai/act/_define.py +11 -0
  23. scitex/ai/classification/__init__.py +7 -0
  24. scitex/ai/classification/classification_reporter.py +1137 -0
  25. scitex/ai/classification/classifier_server.py +131 -0
  26. scitex/ai/classification/classifiers.py +101 -0
  27. scitex/ai/classification_reporter.py +1161 -0
  28. scitex/ai/classifier_server.py +131 -0
  29. scitex/ai/clustering/__init__.py +11 -0
  30. scitex/ai/clustering/_pca.py +115 -0
  31. scitex/ai/clustering/_umap.py +376 -0
  32. scitex/ai/early_stopping.py +149 -0
  33. scitex/ai/feature_extraction/__init__.py +56 -0
  34. scitex/ai/feature_extraction/vit.py +148 -0
  35. scitex/ai/genai/__init__.py +277 -0
  36. scitex/ai/genai/anthropic.py +177 -0
  37. scitex/ai/genai/anthropic_provider.py +320 -0
  38. scitex/ai/genai/anthropic_refactored.py +109 -0
  39. scitex/ai/genai/auth_manager.py +200 -0
  40. scitex/ai/genai/base_genai.py +336 -0
  41. scitex/ai/genai/base_provider.py +291 -0
  42. scitex/ai/genai/calc_cost.py +78 -0
  43. scitex/ai/genai/chat_history.py +307 -0
  44. scitex/ai/genai/cost_tracker.py +276 -0
  45. scitex/ai/genai/deepseek.py +188 -0
  46. scitex/ai/genai/deepseek_provider.py +251 -0
  47. scitex/ai/genai/format_output_func.py +183 -0
  48. scitex/ai/genai/genai_factory.py +71 -0
  49. scitex/ai/genai/google.py +169 -0
  50. scitex/ai/genai/google_provider.py +228 -0
  51. scitex/ai/genai/groq.py +104 -0
  52. scitex/ai/genai/groq_provider.py +248 -0
  53. scitex/ai/genai/image_processor.py +250 -0
  54. scitex/ai/genai/llama.py +155 -0
  55. scitex/ai/genai/llama_provider.py +214 -0
  56. scitex/ai/genai/mock_provider.py +127 -0
  57. scitex/ai/genai/model_registry.py +304 -0
  58. scitex/ai/genai/openai.py +230 -0
  59. scitex/ai/genai/openai_provider.py +293 -0
  60. scitex/ai/genai/params.py +565 -0
  61. scitex/ai/genai/perplexity.py +202 -0
  62. scitex/ai/genai/perplexity_provider.py +205 -0
  63. scitex/ai/genai/provider_base.py +302 -0
  64. scitex/ai/genai/provider_factory.py +370 -0
  65. scitex/ai/genai/response_handler.py +235 -0
  66. scitex/ai/layer/_Pass.py +21 -0
  67. scitex/ai/layer/__init__.py +10 -0
  68. scitex/ai/layer/_switch.py +8 -0
  69. scitex/ai/loss/_L1L2Losses.py +34 -0
  70. scitex/ai/loss/__init__.py +12 -0
  71. scitex/ai/loss/multi_task_loss.py +47 -0
  72. scitex/ai/metrics/__init__.py +9 -0
  73. scitex/ai/metrics/_bACC.py +51 -0
  74. scitex/ai/metrics/silhoute_score_block.py +496 -0
  75. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  76. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  77. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  78. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  79. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  80. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  81. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  82. scitex/ai/optim/__init__.py +13 -0
  83. scitex/ai/optim/_get_set.py +31 -0
  84. scitex/ai/optim/_optimizers.py +71 -0
  85. scitex/ai/plt/__init__.py +21 -0
  86. scitex/ai/plt/_conf_mat.py +592 -0
  87. scitex/ai/plt/_learning_curve.py +194 -0
  88. scitex/ai/plt/_optuna_study.py +111 -0
  89. scitex/ai/plt/aucs/__init__.py +2 -0
  90. scitex/ai/plt/aucs/example.py +60 -0
  91. scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
  92. scitex/ai/plt/aucs/roc_auc.py +246 -0
  93. scitex/ai/sampling/undersample.py +29 -0
  94. scitex/ai/sk/__init__.py +11 -0
  95. scitex/ai/sk/_clf.py +58 -0
  96. scitex/ai/sk/_to_sktime.py +100 -0
  97. scitex/ai/sklearn/__init__.py +26 -0
  98. scitex/ai/sklearn/clf.py +58 -0
  99. scitex/ai/sklearn/to_sktime.py +100 -0
  100. scitex/ai/training/__init__.py +7 -0
  101. scitex/ai/training/early_stopping.py +150 -0
  102. scitex/ai/training/learning_curve_logger.py +555 -0
  103. scitex/ai/utils/__init__.py +22 -0
  104. scitex/ai/utils/_check_params.py +50 -0
  105. scitex/ai/utils/_default_dataset.py +46 -0
  106. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  107. scitex/ai/utils/_label_encoder.py +134 -0
  108. scitex/ai/utils/_merge_labels.py +22 -0
  109. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  110. scitex/ai/utils/_under_sample.py +51 -0
  111. scitex/ai/utils/_verify_n_gpus.py +16 -0
  112. scitex/ai/utils/grid_search.py +148 -0
  113. scitex/context/__init__.py +9 -0
  114. scitex/context/_suppress_output.py +38 -0
  115. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  116. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  117. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  118. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  119. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  120. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  121. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  122. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  123. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  124. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  125. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  126. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  127. scitex/db/_BaseMixins/__init__.py +30 -0
  128. scitex/db/_PostgreSQL.py +126 -0
  129. scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
  130. scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
  131. scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
  132. scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  133. scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  134. scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
  135. scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  136. scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
  137. scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
  138. scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  139. scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
  140. scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  141. scitex/db/_PostgreSQLMixins/__init__.py +34 -0
  142. scitex/db/_SQLite3.py +2136 -0
  143. scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
  144. scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
  145. scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
  146. scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  147. scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
  148. scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
  149. scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
  150. scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
  151. scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
  152. scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
  153. scitex/db/_SQLite3Mixins/__init__.py +30 -0
  154. scitex/db/__init__.py +14 -0
  155. scitex/db/_delete_duplicates.py +397 -0
  156. scitex/db/_inspect.py +163 -0
  157. scitex/decorators/__init__.py +54 -0
  158. scitex/decorators/_auto_order.py +172 -0
  159. scitex/decorators/_batch_fn.py +127 -0
  160. scitex/decorators/_cache_disk.py +32 -0
  161. scitex/decorators/_cache_mem.py +12 -0
  162. scitex/decorators/_combined.py +98 -0
  163. scitex/decorators/_converters.py +282 -0
  164. scitex/decorators/_deprecated.py +26 -0
  165. scitex/decorators/_not_implemented.py +30 -0
  166. scitex/decorators/_numpy_fn.py +86 -0
  167. scitex/decorators/_pandas_fn.py +121 -0
  168. scitex/decorators/_preserve_doc.py +19 -0
  169. scitex/decorators/_signal_fn.py +95 -0
  170. scitex/decorators/_timeout.py +55 -0
  171. scitex/decorators/_torch_fn.py +136 -0
  172. scitex/decorators/_wrap.py +39 -0
  173. scitex/decorators/_xarray_fn.py +88 -0
  174. scitex/dev/__init__.py +15 -0
  175. scitex/dev/_analyze_code_flow.py +284 -0
  176. scitex/dev/_reload.py +59 -0
  177. scitex/dict/_DotDict.py +442 -0
  178. scitex/dict/__init__.py +18 -0
  179. scitex/dict/_listed_dict.py +42 -0
  180. scitex/dict/_pop_keys.py +36 -0
  181. scitex/dict/_replace.py +13 -0
  182. scitex/dict/_safe_merge.py +62 -0
  183. scitex/dict/_to_str.py +32 -0
  184. scitex/dsp/__init__.py +72 -0
  185. scitex/dsp/_crop.py +122 -0
  186. scitex/dsp/_demo_sig.py +331 -0
  187. scitex/dsp/_detect_ripples.py +212 -0
  188. scitex/dsp/_ensure_3d.py +18 -0
  189. scitex/dsp/_hilbert.py +78 -0
  190. scitex/dsp/_listen.py +702 -0
  191. scitex/dsp/_misc.py +30 -0
  192. scitex/dsp/_mne.py +32 -0
  193. scitex/dsp/_modulation_index.py +79 -0
  194. scitex/dsp/_pac.py +319 -0
  195. scitex/dsp/_psd.py +102 -0
  196. scitex/dsp/_resample.py +65 -0
  197. scitex/dsp/_time.py +36 -0
  198. scitex/dsp/_transform.py +68 -0
  199. scitex/dsp/_wavelet.py +212 -0
  200. scitex/dsp/add_noise.py +111 -0
  201. scitex/dsp/example.py +253 -0
  202. scitex/dsp/filt.py +155 -0
  203. scitex/dsp/norm.py +18 -0
  204. scitex/dsp/params.py +51 -0
  205. scitex/dsp/reference.py +43 -0
  206. scitex/dsp/template.py +25 -0
  207. scitex/dsp/utils/__init__.py +15 -0
  208. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  209. scitex/dsp/utils/_ensure_3d.py +18 -0
  210. scitex/dsp/utils/_ensure_even_len.py +10 -0
  211. scitex/dsp/utils/_zero_pad.py +48 -0
  212. scitex/dsp/utils/filter.py +408 -0
  213. scitex/dsp/utils/pac.py +177 -0
  214. scitex/dt/__init__.py +8 -0
  215. scitex/dt/_linspace.py +130 -0
  216. scitex/etc/__init__.py +15 -0
  217. scitex/etc/wait_key.py +34 -0
  218. scitex/gen/_DimHandler.py +196 -0
  219. scitex/gen/_TimeStamper.py +244 -0
  220. scitex/gen/__init__.py +95 -0
  221. scitex/gen/_alternate_kwarg.py +13 -0
  222. scitex/gen/_cache.py +11 -0
  223. scitex/gen/_check_host.py +34 -0
  224. scitex/gen/_ci.py +12 -0
  225. scitex/gen/_close.py +222 -0
  226. scitex/gen/_embed.py +78 -0
  227. scitex/gen/_inspect_module.py +257 -0
  228. scitex/gen/_is_ipython.py +12 -0
  229. scitex/gen/_less.py +48 -0
  230. scitex/gen/_list_packages.py +139 -0
  231. scitex/gen/_mat2py.py +88 -0
  232. scitex/gen/_norm.py +170 -0
  233. scitex/gen/_paste.py +18 -0
  234. scitex/gen/_print_config.py +84 -0
  235. scitex/gen/_shell.py +48 -0
  236. scitex/gen/_src.py +111 -0
  237. scitex/gen/_start.py +451 -0
  238. scitex/gen/_symlink.py +55 -0
  239. scitex/gen/_symlog.py +27 -0
  240. scitex/gen/_tee.py +238 -0
  241. scitex/gen/_title2path.py +60 -0
  242. scitex/gen/_title_case.py +88 -0
  243. scitex/gen/_to_even.py +84 -0
  244. scitex/gen/_to_odd.py +34 -0
  245. scitex/gen/_to_rank.py +39 -0
  246. scitex/gen/_transpose.py +37 -0
  247. scitex/gen/_type.py +78 -0
  248. scitex/gen/_var_info.py +73 -0
  249. scitex/gen/_wrap.py +17 -0
  250. scitex/gen/_xml2dict.py +76 -0
  251. scitex/gen/misc.py +730 -0
  252. scitex/gen/path.py +0 -0
  253. scitex/general/__init__.py +5 -0
  254. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  255. scitex/gists/_SigMacro_toBlue.py +172 -0
  256. scitex/gists/__init__.py +12 -0
  257. scitex/io/_H5Explorer.py +292 -0
  258. scitex/io/__init__.py +82 -0
  259. scitex/io/_cache.py +101 -0
  260. scitex/io/_flush.py +24 -0
  261. scitex/io/_glob.py +103 -0
  262. scitex/io/_json2md.py +113 -0
  263. scitex/io/_load.py +168 -0
  264. scitex/io/_load_configs.py +146 -0
  265. scitex/io/_load_modules/__init__.py +38 -0
  266. scitex/io/_load_modules/_catboost.py +66 -0
  267. scitex/io/_load_modules/_con.py +20 -0
  268. scitex/io/_load_modules/_db.py +24 -0
  269. scitex/io/_load_modules/_docx.py +42 -0
  270. scitex/io/_load_modules/_eeg.py +110 -0
  271. scitex/io/_load_modules/_hdf5.py +196 -0
  272. scitex/io/_load_modules/_image.py +19 -0
  273. scitex/io/_load_modules/_joblib.py +19 -0
  274. scitex/io/_load_modules/_json.py +18 -0
  275. scitex/io/_load_modules/_markdown.py +103 -0
  276. scitex/io/_load_modules/_matlab.py +37 -0
  277. scitex/io/_load_modules/_numpy.py +39 -0
  278. scitex/io/_load_modules/_optuna.py +155 -0
  279. scitex/io/_load_modules/_pandas.py +69 -0
  280. scitex/io/_load_modules/_pdf.py +31 -0
  281. scitex/io/_load_modules/_pickle.py +24 -0
  282. scitex/io/_load_modules/_torch.py +16 -0
  283. scitex/io/_load_modules/_txt.py +126 -0
  284. scitex/io/_load_modules/_xml.py +49 -0
  285. scitex/io/_load_modules/_yaml.py +23 -0
  286. scitex/io/_mv_to_tmp.py +19 -0
  287. scitex/io/_path.py +286 -0
  288. scitex/io/_reload.py +78 -0
  289. scitex/io/_save.py +539 -0
  290. scitex/io/_save_modules/__init__.py +66 -0
  291. scitex/io/_save_modules/_catboost.py +22 -0
  292. scitex/io/_save_modules/_csv.py +89 -0
  293. scitex/io/_save_modules/_excel.py +49 -0
  294. scitex/io/_save_modules/_hdf5.py +249 -0
  295. scitex/io/_save_modules/_html.py +48 -0
  296. scitex/io/_save_modules/_image.py +140 -0
  297. scitex/io/_save_modules/_joblib.py +25 -0
  298. scitex/io/_save_modules/_json.py +25 -0
  299. scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
  300. scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
  301. scitex/io/_save_modules/_matlab.py +24 -0
  302. scitex/io/_save_modules/_mp4.py +29 -0
  303. scitex/io/_save_modules/_numpy.py +57 -0
  304. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  305. scitex/io/_save_modules/_pickle.py +45 -0
  306. scitex/io/_save_modules/_plotly.py +27 -0
  307. scitex/io/_save_modules/_text.py +23 -0
  308. scitex/io/_save_modules/_torch.py +26 -0
  309. scitex/io/_save_modules/_yaml.py +29 -0
  310. scitex/life/__init__.py +10 -0
  311. scitex/life/_monitor_rain.py +49 -0
  312. scitex/linalg/__init__.py +17 -0
  313. scitex/linalg/_distance.py +63 -0
  314. scitex/linalg/_geometric_median.py +64 -0
  315. scitex/linalg/_misc.py +73 -0
  316. scitex/nn/_AxiswiseDropout.py +27 -0
  317. scitex/nn/_BNet.py +126 -0
  318. scitex/nn/_BNet_Res.py +164 -0
  319. scitex/nn/_ChannelGainChanger.py +44 -0
  320. scitex/nn/_DropoutChannels.py +50 -0
  321. scitex/nn/_Filters.py +489 -0
  322. scitex/nn/_FreqGainChanger.py +110 -0
  323. scitex/nn/_GaussianFilter.py +48 -0
  324. scitex/nn/_Hilbert.py +111 -0
  325. scitex/nn/_MNet_1000.py +157 -0
  326. scitex/nn/_ModulationIndex.py +221 -0
  327. scitex/nn/_PAC.py +414 -0
  328. scitex/nn/_PSD.py +40 -0
  329. scitex/nn/_ResNet1D.py +120 -0
  330. scitex/nn/_SpatialAttention.py +25 -0
  331. scitex/nn/_Spectrogram.py +161 -0
  332. scitex/nn/_SwapChannels.py +50 -0
  333. scitex/nn/_TransposeLayer.py +19 -0
  334. scitex/nn/_Wavelet.py +183 -0
  335. scitex/nn/__init__.py +63 -0
  336. scitex/os/__init__.py +8 -0
  337. scitex/os/_mv.py +50 -0
  338. scitex/parallel/__init__.py +8 -0
  339. scitex/parallel/_run.py +151 -0
  340. scitex/path/__init__.py +33 -0
  341. scitex/path/_clean.py +52 -0
  342. scitex/path/_find.py +108 -0
  343. scitex/path/_get_module_path.py +51 -0
  344. scitex/path/_get_spath.py +35 -0
  345. scitex/path/_getsize.py +18 -0
  346. scitex/path/_increment_version.py +87 -0
  347. scitex/path/_mk_spath.py +51 -0
  348. scitex/path/_path.py +19 -0
  349. scitex/path/_split.py +23 -0
  350. scitex/path/_this_path.py +19 -0
  351. scitex/path/_version.py +101 -0
  352. scitex/pd/__init__.py +41 -0
  353. scitex/pd/_find_indi.py +126 -0
  354. scitex/pd/_find_pval.py +113 -0
  355. scitex/pd/_force_df.py +154 -0
  356. scitex/pd/_from_xyz.py +71 -0
  357. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  358. scitex/pd/_melt_cols.py +81 -0
  359. scitex/pd/_merge_columns.py +221 -0
  360. scitex/pd/_mv.py +63 -0
  361. scitex/pd/_replace.py +62 -0
  362. scitex/pd/_round.py +93 -0
  363. scitex/pd/_slice.py +63 -0
  364. scitex/pd/_sort.py +91 -0
  365. scitex/pd/_to_numeric.py +53 -0
  366. scitex/pd/_to_xy.py +59 -0
  367. scitex/pd/_to_xyz.py +110 -0
  368. scitex/plt/__init__.py +36 -0
  369. scitex/plt/_subplots/_AxesWrapper.py +182 -0
  370. scitex/plt/_subplots/_AxisWrapper.py +249 -0
  371. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
  372. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
  373. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
  374. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  375. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
  376. scitex/plt/_subplots/_FigWrapper.py +226 -0
  377. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  378. scitex/plt/_subplots/__init__.py +111 -0
  379. scitex/plt/_subplots/_export_as_csv.py +232 -0
  380. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
  407. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
  408. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
  409. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
  410. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
  411. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
  412. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
  413. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
  414. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
  415. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
  416. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
  417. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
  418. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
  419. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
  420. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
  421. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
  422. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
  423. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
  424. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
  425. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
  426. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  427. scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
  428. scitex/plt/_tpl.py +28 -0
  429. scitex/plt/ax/__init__.py +114 -0
  430. scitex/plt/ax/_plot/__init__.py +53 -0
  431. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  432. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  433. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  434. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  435. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  436. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  437. scitex/plt/ax/_plot/_plot_image.py +94 -0
  438. scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
  439. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  440. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  441. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  442. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  443. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  444. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  445. scitex/plt/ax/_style/__init__.py +38 -0
  446. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  447. scitex/plt/ax/_style/_add_panel.py +92 -0
  448. scitex/plt/ax/_style/_extend.py +64 -0
  449. scitex/plt/ax/_style/_force_aspect.py +37 -0
  450. scitex/plt/ax/_style/_format_label.py +23 -0
  451. scitex/plt/ax/_style/_hide_spines.py +84 -0
  452. scitex/plt/ax/_style/_map_ticks.py +182 -0
  453. scitex/plt/ax/_style/_rotate_labels.py +215 -0
  454. scitex/plt/ax/_style/_sci_note.py +279 -0
  455. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  456. scitex/plt/ax/_style/_set_meta.py +261 -0
  457. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  458. scitex/plt/ax/_style/_set_size.py +16 -0
  459. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  460. scitex/plt/ax/_style/_set_ticks.py +276 -0
  461. scitex/plt/ax/_style/_set_xyt.py +121 -0
  462. scitex/plt/ax/_style/_share_axes.py +264 -0
  463. scitex/plt/ax/_style/_shift.py +139 -0
  464. scitex/plt/ax/_style/_show_spines.py +333 -0
  465. scitex/plt/color/_PARAMS.py +70 -0
  466. scitex/plt/color/__init__.py +52 -0
  467. scitex/plt/color/_add_hue_col.py +41 -0
  468. scitex/plt/color/_colors.py +205 -0
  469. scitex/plt/color/_get_colors_from_cmap.py +134 -0
  470. scitex/plt/color/_interpolate.py +29 -0
  471. scitex/plt/color/_vizualize_colors.py +54 -0
  472. scitex/plt/utils/__init__.py +44 -0
  473. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  474. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  475. scitex/plt/utils/_close.py +68 -0
  476. scitex/plt/utils/_colorbar.py +96 -0
  477. scitex/plt/utils/_configure_mpl.py +295 -0
  478. scitex/plt/utils/_histogram_utils.py +132 -0
  479. scitex/plt/utils/_im2grid.py +70 -0
  480. scitex/plt/utils/_is_valid_axis.py +78 -0
  481. scitex/plt/utils/_mk_colorbar.py +65 -0
  482. scitex/plt/utils/_mk_patches.py +26 -0
  483. scitex/plt/utils/_scientific_captions.py +638 -0
  484. scitex/plt/utils/_scitex_config.py +223 -0
  485. scitex/reproduce/__init__.py +14 -0
  486. scitex/reproduce/_fix_seeds.py +45 -0
  487. scitex/reproduce/_gen_ID.py +55 -0
  488. scitex/reproduce/_gen_timestamp.py +35 -0
  489. scitex/res/__init__.py +5 -0
  490. scitex/resource/__init__.py +13 -0
  491. scitex/resource/_get_processor_usages.py +281 -0
  492. scitex/resource/_get_specs.py +280 -0
  493. scitex/resource/_log_processor_usages.py +190 -0
  494. scitex/resource/_utils/__init__.py +31 -0
  495. scitex/resource/_utils/_get_env_info.py +481 -0
  496. scitex/resource/limit_ram.py +33 -0
  497. scitex/scholar/__init__.py +24 -0
  498. scitex/scholar/_local_search.py +454 -0
  499. scitex/scholar/_paper.py +244 -0
  500. scitex/scholar/_pdf_downloader.py +325 -0
  501. scitex/scholar/_search.py +393 -0
  502. scitex/scholar/_vector_search.py +370 -0
  503. scitex/scholar/_web_sources.py +457 -0
  504. scitex/stats/__init__.py +31 -0
  505. scitex/stats/_calc_partial_corr.py +17 -0
  506. scitex/stats/_corr_test_multi.py +94 -0
  507. scitex/stats/_corr_test_wrapper.py +115 -0
  508. scitex/stats/_describe_wrapper.py +90 -0
  509. scitex/stats/_multiple_corrections.py +63 -0
  510. scitex/stats/_nan_stats.py +93 -0
  511. scitex/stats/_p2stars.py +116 -0
  512. scitex/stats/_p2stars_wrapper.py +56 -0
  513. scitex/stats/_statistical_tests.py +73 -0
  514. scitex/stats/desc/__init__.py +40 -0
  515. scitex/stats/desc/_describe.py +189 -0
  516. scitex/stats/desc/_nan.py +289 -0
  517. scitex/stats/desc/_real.py +94 -0
  518. scitex/stats/multiple/__init__.py +14 -0
  519. scitex/stats/multiple/_bonferroni_correction.py +72 -0
  520. scitex/stats/multiple/_fdr_correction.py +400 -0
  521. scitex/stats/multiple/_multicompair.py +28 -0
  522. scitex/stats/tests/__corr_test.py +277 -0
  523. scitex/stats/tests/__corr_test_multi.py +343 -0
  524. scitex/stats/tests/__corr_test_single.py +277 -0
  525. scitex/stats/tests/__init__.py +22 -0
  526. scitex/stats/tests/_brunner_munzel_test.py +192 -0
  527. scitex/stats/tests/_nocorrelation_test.py +28 -0
  528. scitex/stats/tests/_smirnov_grubbs.py +98 -0
  529. scitex/str/__init__.py +113 -0
  530. scitex/str/_clean_path.py +75 -0
  531. scitex/str/_color_text.py +52 -0
  532. scitex/str/_decapitalize.py +58 -0
  533. scitex/str/_factor_out_digits.py +281 -0
  534. scitex/str/_format_plot_text.py +498 -0
  535. scitex/str/_grep.py +48 -0
  536. scitex/str/_latex.py +155 -0
  537. scitex/str/_latex_fallback.py +471 -0
  538. scitex/str/_mask_api.py +39 -0
  539. scitex/str/_mask_api_key.py +8 -0
  540. scitex/str/_parse.py +158 -0
  541. scitex/str/_print_block.py +47 -0
  542. scitex/str/_print_debug.py +68 -0
  543. scitex/str/_printc.py +62 -0
  544. scitex/str/_readable_bytes.py +38 -0
  545. scitex/str/_remove_ansi.py +23 -0
  546. scitex/str/_replace.py +134 -0
  547. scitex/str/_search.py +125 -0
  548. scitex/str/_squeeze_space.py +36 -0
  549. scitex/tex/__init__.py +10 -0
  550. scitex/tex/_preview.py +103 -0
  551. scitex/tex/_to_vec.py +116 -0
  552. scitex/torch/__init__.py +18 -0
  553. scitex/torch/_apply_to.py +34 -0
  554. scitex/torch/_nan_funcs.py +77 -0
  555. scitex/types/_ArrayLike.py +44 -0
  556. scitex/types/_ColorLike.py +21 -0
  557. scitex/types/__init__.py +14 -0
  558. scitex/types/_is_listed_X.py +70 -0
  559. scitex/utils/__init__.py +22 -0
  560. scitex/utils/_compress_hdf5.py +116 -0
  561. scitex/utils/_email.py +120 -0
  562. scitex/utils/_grid.py +148 -0
  563. scitex/utils/_notify.py +247 -0
  564. scitex/utils/_search.py +121 -0
  565. scitex/web/__init__.py +38 -0
  566. scitex/web/_search_pubmed.py +438 -0
  567. scitex/web/_summarize_url.py +158 -0
  568. scitex-2.0.0.dist-info/METADATA +307 -0
  569. scitex-2.0.0.dist-info/RECORD +572 -0
  570. scitex-2.0.0.dist-info/WHEEL +6 -0
  571. scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
  572. scitex-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,498 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2025-06-04 11:08:00 (ywatanabe)"
4
+ # File: ./src/scitex/str/_format_plot_text.py
5
+
6
+ """
7
+ Functionality:
8
+ Format text for scientific plots with proper capitalization and unit handling
9
+ Includes LaTeX fallback mechanisms for robust rendering
10
+ Input:
11
+ Text strings with optional units
12
+ Output:
13
+ Properly formatted strings for scientific plots with LaTeX fallback
14
+ Prerequisites:
15
+ matplotlib, _latex_fallback module (for LaTeX fallback)
16
+ """
17
+
18
+ import re
19
+ from typing import Union, Tuple, Optional
20
+
21
+ try:
22
+ from ._latex_fallback import safe_latex_render, latex_fallback_decorator
23
+ FALLBACK_AVAILABLE = True
24
+ except ImportError:
25
+ FALLBACK_AVAILABLE = False
26
+ # Define dummy decorator if fallback not available
27
+ def latex_fallback_decorator(fallback_strategy="auto", preserve_math=True):
28
+ def decorator(func):
29
+ return func
30
+ return decorator
31
+
32
+ def safe_latex_render(text, fallback_strategy="auto", preserve_math=True):
33
+ return text
34
+
35
+
36
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
37
+ def format_plot_text(
38
+ text: str,
39
+ capitalize: bool = True,
40
+ unit_style: str = "parentheses",
41
+ latex_math: bool = True,
42
+ scientific_notation: bool = True,
43
+ enable_fallback: bool = True,
44
+ replace_underscores: bool = True
45
+ ) -> str:
46
+ """
47
+ Format text for scientific plots with proper conventions and LaTeX fallback.
48
+
49
+ Parameters
50
+ ----------
51
+ text : str
52
+ Input text to format
53
+ capitalize : bool, optional
54
+ Whether to capitalize the first letter, by default True
55
+ unit_style : str, optional
56
+ Unit bracket style: "parentheses" (), "brackets" [], or "auto", by default "parentheses"
57
+ latex_math : bool, optional
58
+ Whether to enable LaTeX math formatting, by default True
59
+ scientific_notation : bool, optional
60
+ Whether to format scientific notation properly, by default True
61
+ enable_fallback : bool, optional
62
+ Whether to enable LaTeX fallback mechanisms, by default True
63
+ replace_underscores : bool, optional
64
+ Whether to replace underscores with spaces, by default True
65
+
66
+ Returns
67
+ -------
68
+ str
69
+ Formatted text ready for matplotlib with automatic LaTeX fallback
70
+
71
+ Examples
72
+ --------
73
+ >>> format_plot_text("time (s)")
74
+ 'Time (s)'
75
+
76
+ >>> format_plot_text("voltage [V]", unit_style="brackets")
77
+ 'Voltage [V]'
78
+
79
+ >>> format_plot_text("frequency in Hz", unit_style="auto")
80
+ 'Frequency (Hz)'
81
+
82
+ >>> format_plot_text("signal_power_db")
83
+ 'Signal Power Db'
84
+
85
+ >>> format_plot_text(r"$\alpha$ decay") # Falls back if LaTeX fails
86
+ 'α decay'
87
+
88
+ Notes
89
+ -----
90
+ If LaTeX rendering fails, this function automatically falls back to
91
+ mathtext or unicode alternatives while preserving scientific formatting.
92
+ """
93
+ if not text or not isinstance(text, str):
94
+ return text
95
+
96
+ # Handle LaTeX math sections (preserve them)
97
+ latex_sections = []
98
+ text_working = text
99
+
100
+ if latex_math:
101
+ # Extract and preserve LaTeX math
102
+ latex_pattern = r'\$[^$]+\$'
103
+ latex_matches = re.findall(latex_pattern, text)
104
+ for i, match in enumerate(latex_matches):
105
+ placeholder = f"__LATEX_{i}__"
106
+ latex_sections.append(match)
107
+ text_working = text_working.replace(match, placeholder, 1)
108
+
109
+ # Replace underscores with spaces (before unit formatting)
110
+ if replace_underscores:
111
+ text_working = _replace_underscores(text_working)
112
+
113
+ # Format units
114
+ text_working = _format_units(text_working, unit_style)
115
+
116
+ # Capitalize first letter (excluding LaTeX)
117
+ if capitalize:
118
+ text_working = _capitalize_text(text_working)
119
+
120
+ # Handle scientific notation
121
+ if scientific_notation:
122
+ text_working = _format_scientific_notation(text_working)
123
+
124
+ # Restore LaTeX sections with fallback handling
125
+ for i, latex_section in enumerate(latex_sections):
126
+ placeholder = f"__LATEX_{i}__"
127
+ if enable_fallback and FALLBACK_AVAILABLE:
128
+ # Apply fallback to LaTeX sections
129
+ safe_latex = safe_latex_render(latex_section, preserve_math=True)
130
+ text_working = text_working.replace(placeholder, safe_latex)
131
+ else:
132
+ text_working = text_working.replace(placeholder, latex_section)
133
+
134
+ return text_working
135
+
136
+
137
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
138
+ def format_axis_label(
139
+ label: str,
140
+ unit: Optional[str] = None,
141
+ unit_style: str = "parentheses",
142
+ capitalize: bool = True,
143
+ latex_math: bool = True,
144
+ enable_fallback: bool = True,
145
+ replace_underscores: bool = True
146
+ ) -> str:
147
+ """
148
+ Format axis labels with proper unit handling.
149
+
150
+ Parameters
151
+ ----------
152
+ label : str
153
+ The variable name or description
154
+ unit : Optional[str], optional
155
+ The unit string, by default None
156
+ unit_style : str, optional
157
+ Unit bracket style, by default "parentheses"
158
+ capitalize : bool, optional
159
+ Whether to capitalize, by default True
160
+ latex_math : bool, optional
161
+ Whether to enable LaTeX math, by default True
162
+ enable_fallback : bool, optional
163
+ Whether to enable LaTeX fallback mechanisms, by default True
164
+ replace_underscores : bool, optional
165
+ Whether to replace underscores with spaces, by default True
166
+
167
+ Returns
168
+ -------
169
+ str
170
+ Formatted axis label with automatic LaTeX fallback
171
+
172
+ Examples
173
+ --------
174
+ >>> format_axis_label("time", "s")
175
+ 'Time (s)'
176
+
177
+ >>> format_axis_label("voltage", "V", unit_style="brackets")
178
+ 'Voltage [V]'
179
+
180
+ >>> format_axis_label("temperature", "°C")
181
+ 'Temperature (°C)'
182
+
183
+ >>> format_axis_label("signal_power", "dB")
184
+ 'Signal Power (dB)'
185
+ """
186
+ if unit:
187
+ if unit_style == "brackets":
188
+ full_text = f"{label} [{unit}]"
189
+ else: # parentheses
190
+ full_text = f"{label} ({unit})"
191
+ else:
192
+ full_text = label
193
+
194
+ return format_plot_text(full_text, capitalize, unit_style, latex_math, scientific_notation=True, enable_fallback=enable_fallback, replace_underscores=replace_underscores)
195
+
196
+
197
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
198
+ def format_title(
199
+ title: str,
200
+ subtitle: Optional[str] = None,
201
+ capitalize: bool = True,
202
+ latex_math: bool = True,
203
+ enable_fallback: bool = True,
204
+ replace_underscores: bool = True
205
+ ) -> str:
206
+ """
207
+ Format plot titles with proper conventions.
208
+
209
+ Parameters
210
+ ----------
211
+ title : str
212
+ Main title text
213
+ subtitle : Optional[str], optional
214
+ Subtitle text, by default None
215
+ capitalize : bool, optional
216
+ Whether to capitalize, by default True
217
+ latex_math : bool, optional
218
+ Whether to enable LaTeX math, by default True
219
+ enable_fallback : bool, optional
220
+ Whether to enable LaTeX fallback mechanisms, by default True
221
+ replace_underscores : bool, optional
222
+ Whether to replace underscores with spaces, by default True
223
+
224
+ Returns
225
+ -------
226
+ str
227
+ Formatted title with automatic LaTeX fallback
228
+
229
+ Examples
230
+ --------
231
+ >>> format_title("neural spike analysis")
232
+ 'Neural Spike Analysis'
233
+
234
+ >>> format_title("data analysis", "preliminary results")
235
+ 'Data Analysis\\nPreliminary Results'
236
+
237
+ >>> format_title("signal_processing_results")
238
+ 'Signal Processing Results'
239
+ """
240
+ formatted_title = format_plot_text(title, capitalize, latex_math=latex_math,
241
+ enable_fallback=enable_fallback,
242
+ replace_underscores=replace_underscores)
243
+
244
+ if subtitle:
245
+ formatted_subtitle = format_plot_text(subtitle, capitalize, latex_math=latex_math,
246
+ enable_fallback=enable_fallback,
247
+ replace_underscores=replace_underscores)
248
+ return f"{formatted_title}\\n{formatted_subtitle}"
249
+
250
+ return formatted_title
251
+
252
+
253
+ def check_unit_consistency(
254
+ x_unit: Optional[str] = None,
255
+ y_unit: Optional[str] = None,
256
+ operation: str = "none"
257
+ ) -> Tuple[bool, str]:
258
+ """
259
+ Check unit consistency for mathematical operations.
260
+
261
+ Parameters
262
+ ----------
263
+ x_unit : Optional[str], optional
264
+ X-axis unit, by default None
265
+ y_unit : Optional[str], optional
266
+ Y-axis unit, by default None
267
+ operation : str, optional
268
+ Mathematical operation: "add", "subtract", "multiply", "divide", "none", by default "none"
269
+
270
+ Returns
271
+ -------
272
+ Tuple[bool, str]
273
+ (is_consistent, expected_result_unit)
274
+
275
+ Examples
276
+ --------
277
+ >>> check_unit_consistency("m", "s", "divide")
278
+ (True, 'm/s')
279
+
280
+ >>> check_unit_consistency("m", "m", "add")
281
+ (True, 'm')
282
+
283
+ >>> check_unit_consistency("m", "kg", "add")
284
+ (False, 'Units incompatible for addition')
285
+ """
286
+ if not x_unit or not y_unit:
287
+ return True, x_unit or y_unit or ""
288
+
289
+ # Normalize units
290
+ x_norm = _normalize_unit(x_unit)
291
+ y_norm = _normalize_unit(y_unit)
292
+
293
+ if operation in ["add", "subtract"]:
294
+ if x_norm == y_norm:
295
+ return True, x_unit
296
+ else:
297
+ return False, f"Units incompatible for {operation}"
298
+
299
+ elif operation == "multiply":
300
+ if x_norm == "1" or y_norm == "1": # dimensionless
301
+ return True, x_unit if x_norm != "1" else y_unit
302
+ else:
303
+ return True, f"{x_unit}·{y_unit}"
304
+
305
+ elif operation == "divide":
306
+ if y_norm == "1": # dividing by dimensionless
307
+ return True, x_unit
308
+ elif x_norm == y_norm:
309
+ return True, "1" # dimensionless
310
+ else:
311
+ return True, f"{x_unit}/{y_unit}"
312
+
313
+ return True, ""
314
+
315
+
316
+ def _format_units(text: str, unit_style: str) -> str:
317
+ """Format units in text according to specified style."""
318
+ if unit_style == "auto":
319
+ # Auto-detect and standardize to parentheses
320
+ # Look for common unit patterns
321
+ unit_patterns = [
322
+ r'\s+in\s+([A-Za-z°µ²³⁻⁺]+)', # "in Hz", "in μV", etc.
323
+ r'\s+\[([^\]]+)\]', # [unit]
324
+ r'\s+\(([^)]+)\)', # (unit)
325
+ ]
326
+
327
+ for pattern in unit_patterns:
328
+ match = re.search(pattern, text)
329
+ if match:
330
+ unit = match.group(1)
331
+ # Replace with standardized format
332
+ text = re.sub(pattern, f' ({unit})', text)
333
+ break
334
+
335
+ elif unit_style == "brackets":
336
+ # Convert parentheses to brackets
337
+ text = re.sub(r'\s*\(([^)]+)\)', r' [\1]', text)
338
+
339
+ # Clean up multiple spaces
340
+ text = re.sub(r'\s+', ' ', text).strip()
341
+
342
+ return text
343
+
344
+
345
+ def _capitalize_text(text: str) -> str:
346
+ """Capitalize the first letter of text, preserving units in parentheses/brackets."""
347
+ if not text:
348
+ return text
349
+
350
+ # Preserve content in parentheses and brackets
351
+ preserved_sections = []
352
+
353
+ # Find and preserve parentheses content
354
+ paren_pattern = r'(\([^)]+\))'
355
+ paren_matches = re.findall(paren_pattern, text)
356
+ for i, match in enumerate(paren_matches):
357
+ placeholder = f"__PAREN_{i}__"
358
+ preserved_sections.append((placeholder, match))
359
+ text = text.replace(match, placeholder, 1)
360
+
361
+ # Find and preserve bracket content
362
+ bracket_pattern = r'(\[[^\]]+\])'
363
+ bracket_matches = re.findall(bracket_pattern, text)
364
+ for i, match in enumerate(bracket_matches):
365
+ placeholder = f"__BRACKET_{i}__"
366
+ preserved_sections.append((placeholder, match))
367
+ text = text.replace(match, placeholder, 1)
368
+
369
+ # Capitalize the first alphabetic character
370
+ capitalized = False
371
+ result = []
372
+ for char in text:
373
+ if not capitalized and char.isalpha():
374
+ result.append(char.upper())
375
+ capitalized = True
376
+ else:
377
+ result.append(char)
378
+
379
+ text = ''.join(result)
380
+
381
+ # Restore preserved sections
382
+ for placeholder, original in preserved_sections:
383
+ text = text.replace(placeholder, original)
384
+
385
+ return text
386
+
387
+
388
+ def _format_scientific_notation(text: str) -> str:
389
+ """Format scientific notation in text."""
390
+ # Convert patterns like "1e-3" to "1×10⁻³" or LaTeX equivalent
391
+ sci_pattern = r'(\d+\.?\d*)[eE]([-+]?\d+)'
392
+
393
+ def replace_sci(match):
394
+ base = match.group(1)
395
+ exp = match.group(2)
396
+ # Use LaTeX format
397
+ return f"{base}×10^{{{exp}}}"
398
+
399
+ return re.sub(sci_pattern, replace_sci, text)
400
+
401
+
402
+ def _replace_underscores(text: str) -> str:
403
+ """Replace underscores with spaces and apply proper word capitalization."""
404
+ # First, preserve content in parentheses and brackets
405
+ preserved_sections = []
406
+
407
+ # Preserve parentheses content
408
+ paren_pattern = r'(\([^)]+\))'
409
+ paren_matches = re.findall(paren_pattern, text)
410
+ for i, match in enumerate(paren_matches):
411
+ placeholder = f"|||PAREN{i}|||"
412
+ preserved_sections.append((placeholder, match))
413
+ text = text.replace(match, placeholder, 1)
414
+
415
+ # Preserve bracket content
416
+ bracket_pattern = r'(\[[^\]]+\])'
417
+ bracket_matches = re.findall(bracket_pattern, text)
418
+ for i, match in enumerate(bracket_matches):
419
+ placeholder = f"|||BRACKET{i}|||"
420
+ preserved_sections.append((placeholder, match))
421
+ text = text.replace(match, placeholder, 1)
422
+
423
+ # Replace underscores with spaces
424
+ text_with_spaces = text.replace('_', ' ')
425
+
426
+ # Split by spaces for word processing
427
+ words = text_with_spaces.split(' ')
428
+
429
+ # Common units that should preserve their case
430
+ common_units = {'Hz', 'kHz', 'MHz', 'GHz', 'V', 'mV', 'uV', 'μV', 'A', 'mA',
431
+ 'μA', 'W', 'mW', 'dB', 'dBm', 's', 'ms', 'μs', 'ns', 'ps',
432
+ 'K', 'C', 'F', 'rad', 'deg', 'm', 'cm', 'mm', 'μm', 'nm',
433
+ 'kg', 'g', 'mg', 'μg', 'N', 'Pa', 'bar', 'psi', 'mol', 'M'}
434
+
435
+ # Process each word
436
+ formatted_words = []
437
+ for word in words:
438
+ if not word: # Preserve empty strings (from consecutive underscores)
439
+ formatted_words.append('')
440
+ # Skip placeholders
441
+ elif '|||' in word:
442
+ formatted_words.append(word)
443
+ # Check if word is a known unit
444
+ elif word in common_units:
445
+ formatted_words.append(word)
446
+ # Preserve special cases (e.g., all caps like "DB", "ID", etc.)
447
+ elif word.isupper() and len(word) > 1:
448
+ formatted_words.append(word)
449
+ # Capitalize first letter of each word
450
+ else:
451
+ formatted_words.append(word[0].upper() + word[1:].lower() if len(word) > 1 else word.upper())
452
+
453
+ # Join with spaces
454
+ result = ' '.join(formatted_words)
455
+
456
+ # Restore preserved sections
457
+ for placeholder, original in preserved_sections:
458
+ result = result.replace(placeholder, original)
459
+
460
+ return result
461
+
462
+
463
+ def _normalize_unit(unit: str) -> str:
464
+ """Normalize unit string for comparison."""
465
+ # Remove brackets/parentheses and normalize
466
+ normalized = re.sub(r'[\[\]()]', '', unit).strip().lower()
467
+
468
+ # Handle common equivalent units
469
+ equivalents = {
470
+ 'sec': 's', 'second': 's', 'seconds': 's',
471
+ 'volt': 'V', 'volts': 'V',
472
+ 'amp': 'A', 'ampere': 'A', 'amps': 'A',
473
+ 'meter': 'm', 'meters': 'm', 'metre': 'm', 'metres': 'm',
474
+ 'gram': 'g', 'grams': 'g',
475
+ 'hertz': 'Hz', 'hz': 'Hz',
476
+ 'dimensionless': '1', 'unitless': '1', '': '1',
477
+ }
478
+
479
+ return equivalents.get(normalized, normalized)
480
+
481
+
482
+ # Convenient aliases and shortcuts
483
+ def axis_label(label: str, unit: str = None, **kwargs) -> str:
484
+ """Convenient alias for format_axis_label."""
485
+ return format_axis_label(label, unit, **kwargs)
486
+
487
+
488
+ def title(text: str, **kwargs) -> str:
489
+ """Convenient alias for format_title."""
490
+ return format_title(text, **kwargs)
491
+
492
+
493
+ def scientific_text(text: str, **kwargs) -> str:
494
+ """Convenient alias for format_plot_text with scientific defaults."""
495
+ return format_plot_text(text, **kwargs)
496
+
497
+
498
+ # EOF
scitex/str/_grep.py ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-02 04:05:41 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/str/_grep.py
5
+
6
+ import re
7
+
8
+
9
+ def grep(str_list, search_key):
10
+ """Search for a key in a list of strings and return matching items.
11
+
12
+ Parameters
13
+ ----------
14
+ str_list : list of str
15
+ The list of strings to search through.
16
+ search_key : str
17
+ The key to search for in the strings.
18
+
19
+ Returns
20
+ -------
21
+ list
22
+ A list of strings from str_list that contain the search_key.
23
+
24
+ Example
25
+ -------
26
+ >>> grep(['apple', 'banana', 'cherry'], 'a')
27
+ ['apple', 'banana']
28
+ >>> grep(['cat', 'dog', 'elephant'], 'e')
29
+ ['elephant']
30
+ """
31
+ """
32
+ Example:
33
+ str_list = ['apple', 'orange', 'apple', 'apple_juice', 'banana', 'orange_juice']
34
+ search_key = 'orange'
35
+ print(grep(str_list, search_key))
36
+ # ([1, 5], ['orange', 'orange_juice'])
37
+ """
38
+ matched_keys = []
39
+ indi = []
40
+ for ii, string in enumerate(str_list):
41
+ m = re.search(search_key, string)
42
+ if m is not None:
43
+ matched_keys.append(string)
44
+ indi.append(ii)
45
+ return indi, matched_keys
46
+
47
+
48
+ # EOF
scitex/str/_latex.py ADDED
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
4
+ # File: ./src/scitex/str/_latex.py
5
+
6
+ """
7
+ LaTeX formatting functions with fallback mechanisms.
8
+
9
+ Functionality:
10
+ - LaTeX text formatting with automatic fallback
11
+ - Safe handling of LaTeX rendering failures
12
+ Input:
13
+ Strings or numbers to format
14
+ Output:
15
+ LaTeX-formatted strings with fallback support
16
+ Prerequisites:
17
+ matplotlib, _latex_fallback module
18
+ """
19
+
20
+ from ._latex_fallback import safe_latex_render, latex_fallback_decorator
21
+
22
+
23
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
24
+ def to_latex_style(str_or_num):
25
+ """
26
+ Convert string or number to LaTeX math mode format with fallback.
27
+
28
+ Parameters
29
+ ----------
30
+ str_or_num : str or numeric
31
+ Input to format in LaTeX style
32
+
33
+ Returns
34
+ -------
35
+ str
36
+ LaTeX-formatted string with automatic fallback
37
+
38
+ Examples
39
+ --------
40
+ >>> to_latex_style('aaa')
41
+ '$aaa$'
42
+
43
+ >>> to_latex_style('alpha') # Falls back to unicode if LaTeX fails
44
+ 'α'
45
+
46
+ Notes
47
+ -----
48
+ If LaTeX rendering fails (e.g., due to missing fonts or Node.js conflicts),
49
+ this function automatically falls back to mathtext or unicode alternatives.
50
+ """
51
+ if not str_or_num and str_or_num != 0: # Handle empty string case
52
+ return ""
53
+
54
+ string = str(str_or_num)
55
+
56
+ # Avoid double-wrapping
57
+ if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
58
+ return safe_latex_render(string)
59
+ else:
60
+ latex_string = "${}$".format(string)
61
+ return safe_latex_render(latex_string)
62
+
63
+
64
+ @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
65
+ def add_hat_in_latex_style(str_or_num):
66
+ """
67
+ Add LaTeX hat notation to string with fallback.
68
+
69
+ Parameters
70
+ ----------
71
+ str_or_num : str or numeric
72
+ Input to format with hat notation
73
+
74
+ Returns
75
+ -------
76
+ str
77
+ LaTeX-formatted string with hat notation and automatic fallback
78
+
79
+ Examples
80
+ --------
81
+ >>> add_hat_in_latex_style('aaa')
82
+ '$\\hat{aaa}$'
83
+
84
+ >>> add_hat_in_latex_style('x') # Falls back to unicode if LaTeX fails
85
+ 'x̂'
86
+
87
+ Notes
88
+ -----
89
+ If LaTeX rendering fails, this function falls back to unicode hat
90
+ notation or plain text alternatives.
91
+ """
92
+ if not str_or_num and str_or_num != 0: # Handle empty string case
93
+ return ""
94
+
95
+ hat_latex = r"\hat{%s}" % str_or_num
96
+ latex_string = to_latex_style(hat_latex)
97
+ return safe_latex_render(latex_string)
98
+
99
+
100
+ def safe_to_latex_style(str_or_num, fallback_strategy="auto"):
101
+ """
102
+ Safe version of to_latex_style with explicit fallback control.
103
+
104
+ Parameters
105
+ ----------
106
+ str_or_num : str or numeric
107
+ Input to format in LaTeX style
108
+ fallback_strategy : str, optional
109
+ Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
110
+
111
+ Returns
112
+ -------
113
+ str
114
+ Formatted string with specified fallback behavior
115
+ """
116
+ if not str_or_num and str_or_num != 0:
117
+ return ""
118
+
119
+ string = str(str_or_num)
120
+ if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
121
+ return safe_latex_render(string, fallback_strategy)
122
+ else:
123
+ latex_string = "${}$".format(string)
124
+ return safe_latex_render(latex_string, fallback_strategy)
125
+
126
+
127
+ def safe_add_hat_in_latex_style(str_or_num, fallback_strategy="auto"):
128
+ """
129
+ Safe version of add_hat_in_latex_style with explicit fallback control.
130
+
131
+ Parameters
132
+ ----------
133
+ str_or_num : str or numeric
134
+ Input to format with hat notation
135
+ fallback_strategy : str, optional
136
+ Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
137
+
138
+ Returns
139
+ -------
140
+ str
141
+ Formatted string with hat notation and specified fallback behavior
142
+ """
143
+ if not str_or_num and str_or_num != 0:
144
+ return ""
145
+
146
+ hat_latex = r"\hat{%s}" % str_or_num
147
+ latex_string = safe_to_latex_style(hat_latex, fallback_strategy)
148
+ return latex_string
149
+
150
+
151
+ # Backward compatibility aliases
152
+ latex_style = to_latex_style
153
+ hat_latex_style = add_hat_in_latex_style
154
+
155
+ # EOF