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,408 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-03 07:24:43 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/dsp/utils/filter.py
5
+
6
+ import matplotlib.pyplot as plt
7
+ import numpy as np
8
+ from scipy.signal import firwin, freqz
9
+
10
+ from ...decorators import numpy_fn
11
+ from ...gen._to_even import to_even
12
+
13
+
14
+ @numpy_fn
15
+ def design_filter(sig_len, fs, low_hz=None, high_hz=None, cycle=3, is_bandstop=False):
16
+ """
17
+ Designs a Finite Impulse Response (FIR) filter based on the specified parameters.
18
+
19
+ Arguments:
20
+ - sig_len (int): Length of the signal for which the filter is being designed.
21
+ - fs (int): Sampling frequency of the signal.
22
+ - low_hz (float, optional): Low cutoff frequency for the filter. Required for lowpass and bandpass filters.
23
+ - high_hz (float, optional): High cutoff frequency for the filter. Required for highpass and bandpass filters.
24
+ - cycle (int, optional): Number of cycles to use in determining the filter order. Defaults to 3.
25
+ - is_bandstop (bool, optional): Specifies if the filter should be a bandstop filter. Defaults to False.
26
+
27
+ Returns:
28
+ - The coefficients of the designed FIR filter.
29
+
30
+ Raises:
31
+ - FilterParameterError: If the provided parameters are invalid.
32
+ """
33
+
34
+ class FilterParameterError(Exception):
35
+ """Custom exception for invalid filter parameters."""
36
+
37
+ pass
38
+
39
+ def estimate_filter_type(low_hz=None, high_hz=None, is_bandstop=False):
40
+ """
41
+ Estimates the filter type based on the provided low and high cutoff frequencies,
42
+ and whether a bandstop filter is desired. Raises an exception for invalid configurations.
43
+ """
44
+ if low_hz is not None and low_hz < 0:
45
+ raise FilterParameterError("low_hz must be non-negative.")
46
+ if high_hz is not None and high_hz < 0:
47
+ raise FilterParameterError("high_hz must be non-negative.")
48
+ if low_hz is not None and high_hz is not None and low_hz >= high_hz:
49
+ raise FilterParameterError(
50
+ "low_hz must be less than high_hz for valid configurations."
51
+ )
52
+
53
+ if low_hz is not None and high_hz is not None:
54
+ return "bandstop" if is_bandstop else "bandpass"
55
+ elif low_hz is not None:
56
+ return "lowpass"
57
+ elif high_hz is not None:
58
+ return "highpass"
59
+ else:
60
+ raise FilterParameterError(
61
+ "At least one of low_hz or high_hz must be provided."
62
+ )
63
+
64
+ def determine_cutoff_frequencies(filter_mode, low_hz, high_hz):
65
+ if filter_mode in ["lowpass", "highpass"]:
66
+ cutoff = low_hz if filter_mode == "lowpass" else high_hz
67
+ else: # 'bandpass' or 'bandstop'
68
+ cutoff = [low_hz, high_hz]
69
+ return cutoff
70
+
71
+ def determine_low_freq(filter_mode, low_hz, high_hz):
72
+ if filter_mode in ["lowpass", "bandstop"]:
73
+ low_freq = low_hz
74
+ else: # 'highpass' or 'bandpass'
75
+ low_freq = high_hz if filter_mode == "highpass" else min(low_hz, high_hz)
76
+ return low_freq
77
+
78
+ def determine_order(filter_mode, fs, low_freq, sig_len, cycle):
79
+ order = cycle * int((fs // low_freq))
80
+ if 3 * order < sig_len:
81
+ order = (sig_len - 1) // 3
82
+ order = to_even(order)
83
+ return order
84
+
85
+ fs = int(fs)
86
+ low_hz = float(low_hz) if low_hz is not None else low_hz
87
+ high_hz = float(high_hz) if high_hz is not None else high_hz
88
+ filter_mode = estimate_filter_type(low_hz, high_hz, is_bandstop)
89
+ cutoff = determine_cutoff_frequencies(filter_mode, low_hz, high_hz)
90
+ low_freq = determine_low_freq(filter_mode, low_hz, high_hz)
91
+ order = determine_order(filter_mode, fs, low_freq, sig_len, cycle)
92
+ numtaps = order + 1
93
+
94
+ try:
95
+ h = firwin(
96
+ numtaps=numtaps,
97
+ cutoff=cutoff,
98
+ pass_zero=(filter_mode in ["highpass", "bandstop"]),
99
+ window="hamming",
100
+ fs=fs,
101
+ scale=True,
102
+ )
103
+ except Exception as e:
104
+ print(e)
105
+ import ipdb
106
+
107
+ ipdb.set_trace()
108
+
109
+ return h
110
+
111
+
112
+ @numpy_fn
113
+ def plot_filter_responses(filter, fs, worN=8000, title=None):
114
+ """
115
+ Plots the impulse and frequency response of an FIR filter using numpy arrays.
116
+
117
+ Parameters:
118
+ - filter_coeffs (numpy.ndarray): The filter coefficients as a numpy array.
119
+ - fs (int): The sampling frequency in Hz.
120
+ - title (str, optional): The title of the plot. Defaults to None.
121
+
122
+ Returns:
123
+ - matplotlib.figure.Figure: The figure object containing the impulse and frequency response plots.
124
+ """
125
+ import scitex
126
+
127
+ ww, hh = freqz(filter, worN=worN, fs=fs)
128
+
129
+ fig, axes = scitex.plt.subplots(ncols=2)
130
+ fig.suptitle(title)
131
+
132
+ # Impulse Responses of FIR Filter
133
+ ax = axes[0]
134
+ ax.plot(filter)
135
+ ax.set_title("Impulse Responses of FIR Filter")
136
+ ax.set_xlabel("Tap Number")
137
+ ax.set_ylabel("Amplitude")
138
+
139
+ # Frequency Response of FIR Filter
140
+ ax = axes[1]
141
+ ax.plot(ww, 20 * np.log10(abs(hh) + 1e-5))
142
+ ax.set_title("Frequency Response of FIR Filter")
143
+ ax.set_xlabel("Frequency [Hz]")
144
+ ax.set_ylabel("Gain [dB]")
145
+
146
+ return fig
147
+
148
+
149
+ if __name__ == "__main__":
150
+ import scitex
151
+
152
+ # Example usage
153
+ xx, tt, fs = scitex.dsp.demo_sig()
154
+ batch_size, n_chs, seq_len = xx.shape
155
+
156
+ lp_filter = design_filter(seq_len, fs, low_hz=30, high_hz=None)
157
+ hp_filter = design_filter(seq_len, fs, low_hz=None, high_hz=70)
158
+ bp_filter = design_filter(seq_len, fs, low_hz=30, high_hz=70)
159
+ bs_filter = design_filter(seq_len, fs, low_hz=30, high_hz=70, is_bandstop=True)
160
+
161
+ fig = plot_filter_responses(lp_filter, fs, title="Lowpass Filter")
162
+ fig = plot_filter_responses(hp_filter, fs, title="Highpass Filter")
163
+ fig = plot_filter_responses(bp_filter, fs, title="Bandpass Filter")
164
+ fig = plot_filter_responses(bs_filter, fs, title="Bandstop Filter")
165
+
166
+ # Figure
167
+ fig, axes = plt.subplots(nrows=4, ncols=2)
168
+
169
+ # Time domain expressions??
170
+ axes[0, 0].plot(lp_filter, label="Lowpass Filter")
171
+ axes[1, 0].plot(hp_filter, label="Highpass Filter")
172
+ axes[2, 0].plot(bp_filter, label="Bandpass Filter")
173
+ axes[3, 0].plot(bs_filter, label="Bandstop Filter")
174
+ # fig.suptitle("Impulse Responses of FIR Filter")
175
+ # fig.supxlabel("Tap Number")
176
+ # fig.supylabel("Amplitude")
177
+ # fig.show()
178
+
179
+ # Frequency response of the filters
180
+ w, h_lp = freqz(lp_filter, worN=8000, fs=fs)
181
+ w, h_hp = freqz(hp_filter, worN=8000, fs=fs)
182
+ w, h_bp = freqz(bp_filter, worN=8000, fs=fs)
183
+ w, h_bs = freqz(bs_filter, worN=8000, fs=fs)
184
+
185
+ # Plotting the frequency response
186
+ axes[0, 1].plot(w, 20 * np.log10(abs(h_lp)), label="Lowpass Filter")
187
+ axes[1, 1].plot(w, 20 * np.log10(abs(h_hp)), label="Highpass Filter")
188
+ axes[2, 1].plot(w, 20 * np.log10(abs(h_bp)), label="Bandpass Filter")
189
+ axes[3, 1].plot(w, 20 * np.log10(abs(h_bs)), label="Bandstop Filter")
190
+ # plt.title("Frequency Response of FIR Filters")
191
+ # plt.xlabel("Frequency (Hz)")
192
+ # plt.ylabel("Gain (dB)")
193
+ # plt.grid(True)
194
+ # plt.legend(loc="best")
195
+ # plt.show()
196
+ fig.tight_layout()
197
+ plt.show()
198
+
199
+ # @torch_fn
200
+ # def bandpass(x, filt):
201
+ # assert x.ndim == 3
202
+ # xf = F.conv1d(
203
+ # x.reshape(-1, x.shape[-1]).unsqueeze(1),
204
+ # filt.unsqueeze(0).unsqueeze(0),
205
+ # padding="same",
206
+ # ).reshape(*x.shape)
207
+ # assert x.shape == xf.shape
208
+ # return xf
209
+
210
+ # def define_bandpass_filters(seq_len, fs, freq_bands, cycle=3):
211
+ # """
212
+ # Defines Finite Impulse Response (FIR) filters.
213
+ # b: The filter coefficients (or taps) of the FIR filters
214
+ # a: The denominator coefficients of the filter's transfer function. However, FIR filters have a transfer function with a denominator equal to 1 (since they are all-zero filters with no poles).
215
+ # """
216
+ # # Parameters
217
+ # n_freqs = len(freq_bands)
218
+ # nyq = fs / 2.0
219
+
220
+ # bs = []
221
+ # for ll, hh in freq_bands:
222
+ # wn = np.array([ll, hh]) / nyq
223
+ # order = define_fir_order(fs, seq_len, ll, cycle=cycle)
224
+ # bs.append(fir1(order, wn)[0])
225
+ # return bs
226
+
227
+ # def define_fir_order(fs, sizevec, flow, cycle=3):
228
+ # """
229
+ # Calculate filter order.
230
+ # """
231
+ # if cycle is None:
232
+ # filtorder = 3 * np.fix(fs / flow)
233
+ # else:
234
+ # filtorder = cycle * (fs // flow)
235
+
236
+ # if sizevec < 3 * filtorder:
237
+ # filtorder = (sizevec - 1) // 3
238
+
239
+ # return int(filtorder)
240
+
241
+ # def n_odd_fcn(f, o, w, l):
242
+ # """Odd case."""
243
+ # # Variables :
244
+ # b0 = 0
245
+ # m = np.array(range(int(l + 1)))
246
+ # k = m[1 : len(m)]
247
+ # b = np.zeros(k.shape)
248
+
249
+ # # Run Loop :
250
+ # for s in range(0, len(f), 2):
251
+ # m = (o[s + 1] - o[s]) / (f[s + 1] - f[s])
252
+ # b1 = o[s] - m * f[s]
253
+ # b0 = b0 + (
254
+ # b1 * (f[s + 1] - f[s])
255
+ # + m / 2 * (f[s + 1] * f[s + 1] - f[s] * f[s])
256
+ # ) * abs(np.square(w[round((s + 1) / 2)]))
257
+ # b = b + (
258
+ # m
259
+ # / (4 * np.pi * np.pi)
260
+ # * (
261
+ # np.cos(2 * np.pi * k * f[s + 1])
262
+ # - np.cos(2 * np.pi * k * f[s])
263
+ # )
264
+ # / (k * k)
265
+ # ) * abs(np.square(w[round((s + 1) / 2)]))
266
+ # b = b + (
267
+ # f[s + 1] * (m * f[s + 1] + b1) * np.sinc(2 * k * f[s + 1])
268
+ # - f[s] * (m * f[s] + b1) * np.sinc(2 * k * f[s])
269
+ # ) * abs(np.square(w[round((s + 1) / 2)]))
270
+
271
+ # b = np.insert(b, 0, b0)
272
+ # a = (np.square(w[0])) * 4 * b
273
+ # a[0] = a[0] / 2
274
+ # aud = np.flipud(a[1 : len(a)]) / 2
275
+ # a2 = np.insert(aud, len(aud), a[0])
276
+ # h = np.concatenate((a2, a[1:] / 2))
277
+
278
+ # return h
279
+
280
+ # def n_even_fcn(f, o, w, l):
281
+ # """Even case."""
282
+ # # Variables :
283
+ # k = np.array(range(0, int(l) + 1, 1)) + 0.5
284
+ # b = np.zeros(k.shape)
285
+
286
+ # # # Run Loop :
287
+ # for s in range(0, len(f), 2):
288
+ # m = (o[s + 1] - o[s]) / (f[s + 1] - f[s])
289
+ # b1 = o[s] - m * f[s]
290
+ # b = b + (
291
+ # m
292
+ # / (4 * np.pi * np.pi)
293
+ # * (
294
+ # np.cos(2 * np.pi * k * f[s + 1])
295
+ # - np.cos(2 * np.pi * k * f[s])
296
+ # )
297
+ # / (k * k)
298
+ # ) * abs(np.square(w[round((s + 1) / 2)]))
299
+ # b = b + (
300
+ # f[s + 1] * (m * f[s + 1] + b1) * np.sinc(2 * k * f[s + 1])
301
+ # - f[s] * (m * f[s] + b1) * np.sinc(2 * k * f[s])
302
+ # ) * abs(np.square(w[round((s + 1) / 2)]))
303
+
304
+ # a = (np.square(w[0])) * 4 * b
305
+ # h = 0.5 * np.concatenate((np.flipud(a), a))
306
+
307
+ # return h
308
+
309
+ # def firls(n, f, o):
310
+ # # Variables definition :
311
+ # w = np.ones(round(len(f) / 2))
312
+ # n += 1
313
+ # f /= 2
314
+ # lo = (n - 1) / 2
315
+
316
+ # nodd = bool(n % 2)
317
+
318
+ # if nodd: # Odd case
319
+ # h = n_odd_fcn(f, o, w, lo)
320
+ # else: # Even case
321
+ # h = n_even_fcn(f, o, w, lo)
322
+
323
+ # return h
324
+
325
+ # def fir1(n, wn):
326
+ # # Variables definition :
327
+ # nbands = len(wn) + 1
328
+ # ff = np.array((0, wn[0], wn[0], wn[1], wn[1], 1))
329
+
330
+ # f0 = np.mean(ff[2:4])
331
+ # lo = n + 1
332
+
333
+ # mags = np.array(range(nbands)).reshape(1, -1) % 2
334
+ # aa = np.ravel(np.tile(mags, (2, 1)), order="F")
335
+
336
+ # # Get filter coefficients :
337
+ # h = firls(lo - 1, ff, aa)
338
+
339
+ # # Apply a window to coefficients :
340
+ # wind = np.hamming(lo)
341
+ # b = h * wind
342
+ # c = np.exp(-1j * 2 * np.pi * (f0 / 2) * np.array(range(lo)))
343
+ # b /= abs(c @ b)
344
+
345
+ # return b, 1
346
+
347
+ # def apply_filters(x, filts):
348
+ # """
349
+ # x: (batch_size, n_chs, seq_len)
350
+ # filts: (n_filts, seq_len_filt)
351
+ # """
352
+ # assert x.ndims == 3
353
+ # assert filts.ndims == 2
354
+ # batch_size, n_chs, n_time = x.shape
355
+ # x = x.reshape(-1, x.shape[-1]).unsqueeze(1)
356
+ # filts = filts.unsqueeze(1)
357
+ # n_filts = len(filts)
358
+ # return F.conv1d(x, filts, padding="same").reshape(
359
+ # batch_size, n_chs, n_filts, n_time
360
+ # )
361
+
362
+ # if __name__ == "__main__":
363
+ # import torch
364
+ # import torch.nn.functional as F
365
+
366
+ # plt, CC = scitex.plt.configure_mpl(plt)
367
+
368
+ # # Demo Signal
369
+ # freqs_hz = [10, 30, 100]
370
+ # xx, tt, fs = scitex.dsp.demo_sig(freqs_hz=freqs_hz, sig_type="periodic")
371
+ # x = xx
372
+
373
+ # seq_len = x.shape[-1]
374
+ # freq_bands = np.array([[20, 70], [3.0, 4.0]])
375
+
376
+ # # Plots the figure
377
+ # fig, ax = scitex.plt.subplots()
378
+ # # ax.plot(b, label="bandpass filter")
379
+
380
+ # # Bandpass Filtering
381
+ # filters = define_bandpass_filters(seq_len, fs, freq_bands, cycle=3)
382
+ # i_filt = 0
383
+ # # xf = bandpass(xx, filters[i_filt])
384
+
385
+ # # Plots the signals
386
+ # fig, axes = scitex.plt.subplots(nrows=2, sharex=True, sharey=True)
387
+ # axes[0].plot(tt, xx[0, 0], label="orig")
388
+ # axes[1].plot(tt, xf[0, 0], label="orig")
389
+ # [ax.legend(loc="upper left") for ax in axes]
390
+
391
+ # # Plots PSDs
392
+ # psd_xx, ff_xx = scitex.dsp.psd(xx.numpy(), fs)
393
+ # psd_xf, ff_xf = scitex.dsp.psd(xf.numpy(), fs)
394
+
395
+ # fig, axes = scitex.plt.subplots(nrows=2, sharex=True, sharey=True)
396
+ # axes[0].plot(ff_xx, psd_xx[0, 0], label="orig")
397
+ # axes[1].plot(ff_xf, psd_xf[0, 0], label="filted")
398
+ # [ax.legend(loc="upper left") for ax in axes]
399
+ # plt.show()
400
+
401
+ # # Multiple Filters in a parallel computation
402
+ # x = torch.randn(33, 32, 30)
403
+ # filters = torch.randn(20, 5)
404
+
405
+ # y = apply_filters(x, filters)
406
+ # print(y.shape) # (33, 32, 20, 30)
407
+
408
+ # EOF
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-26 06:26:29 (ywatanabe)"
4
+ # File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/dsp/utils/pac.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/dsp/utils/pac.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ #! ./env/bin/python3
13
+ # Time-stamp: "2024-04-16 17:07:27"
14
+
15
+
16
+ """
17
+ This script does XYZ.
18
+ """
19
+
20
+ # Imports
21
+ import sys
22
+
23
+ import matplotlib.pyplot as plt
24
+ import scitex
25
+ import numpy as np
26
+ import tensorpac
27
+
28
+
29
+ # Functions
30
+ def calc_pac_with_tensorpac(xx, fs, t_sec, i_batch=0, i_ch=0):
31
+ # Morlet's Wavelet Transfrmation
32
+ p = tensorpac.Pac(f_pha="hres", f_amp="mres", dcomplex="wavelet")
33
+
34
+ # Bandpass Filtering and Hilbert Transformation
35
+ phases = p.filter(fs, xx[i_batch, i_ch], ftype="phase", n_jobs=1) # (50, 20, 2048)
36
+ amplitudes = p.filter(
37
+ fs, xx[i_batch, i_ch], ftype="amplitude", n_jobs=1
38
+ ) # (50, 20, 2048)
39
+
40
+ # Calculates xpac
41
+ k = 2
42
+ p.idpac = (k, 0, 0)
43
+ xpac = p.fit(phases, amplitudes) # (50, 50, 20)
44
+ pac = xpac.mean(axis=-1) # (50, 50)
45
+
46
+ freqs_amp = p.f_amp.mean(axis=-1)
47
+ freqs_pha = p.f_pha.mean(axis=-1)
48
+
49
+ pac = pac.T # (amp, pha) -> (pha, amp)
50
+
51
+ return phases, amplitudes, freqs_pha, freqs_amp, pac
52
+
53
+
54
+ def plot_PAC_scitex_vs_tensorpac(pac_scitex, pac_tp, freqs_pha, freqs_amp):
55
+ assert pac_scitex.shape == pac_tp.shape
56
+
57
+ # Plots
58
+ fig, axes = scitex.plt.subplots(ncols=3) # , sharex=True, sharey=True
59
+
60
+ # To align scalebars
61
+ vmin = min(np.min(pac_scitex), np.min(pac_tp), np.min(pac_scitex - pac_tp))
62
+ vmax = max(np.max(pac_scitex), np.max(pac_tp), np.max(pac_scitex - pac_tp))
63
+
64
+ # scitex version
65
+ ax = axes[0]
66
+ ax.imshow2d(
67
+ pac_scitex,
68
+ cbar=False,
69
+ vmin=vmin,
70
+ vmax=vmax,
71
+ )
72
+ ax.set_title("scitex")
73
+
74
+ # Tensorpac
75
+ ax = axes[1]
76
+ ax.imshow2d(
77
+ pac_tp,
78
+ cbar=False,
79
+ vmin=vmin,
80
+ vmax=vmax,
81
+ )
82
+ ax.set_title("Tensorpac")
83
+
84
+ # Diff.
85
+ ax = axes[2]
86
+ ax.imshow2d(
87
+ pac_scitex - pac_tp,
88
+ cbar_label="PAC values",
89
+ cbar_shrink=0.5,
90
+ vmin=vmin,
91
+ vmax=vmax,
92
+ )
93
+ ax.set_title(f"Difference\n(scitex - Tensorpac)")
94
+
95
+ # for ax in axes:
96
+ # ax.set_ticks(
97
+ # x_vals=freqs_pha,
98
+ # # y_vals=freqs_amp,
99
+ # )
100
+ # # ax.set_n_ticks()
101
+
102
+ fig.suptitle("PAC (MI) values")
103
+ fig.supxlabel("Frequency for phase [Hz]")
104
+ fig.supylabel("Frequency for amplitude [Hz]")
105
+
106
+ return fig
107
+
108
+
109
+ # Snake_case alias for consistency
110
+ def plot_pac_scitex_vs_tensorpac(pac_scitex, pac_tp, freqs_pha, freqs_amp):
111
+ """
112
+ Plot comparison between SciTeX and Tensorpac phase-amplitude coupling results.
113
+
114
+ This is an alias for plot_PAC_scitex_vs_tensorpac with snake_case naming.
115
+
116
+ Parameters
117
+ ----------
118
+ pac_scitex : array-like
119
+ PAC values from SciTeX
120
+ pac_tp : array-like
121
+ PAC values from Tensorpac
122
+ freqs_pha : array-like
123
+ Phase frequencies
124
+ freqs_amp : array-like
125
+ Amplitude frequencies
126
+
127
+ Returns
128
+ -------
129
+ fig : matplotlib.figure.Figure
130
+ The generated figure
131
+ """
132
+ return plot_PAC_scitex_vs_tensorpac(pac_scitex, pac_tp, freqs_pha, freqs_amp)
133
+
134
+
135
+ if __name__ == "__main__":
136
+ import torch
137
+
138
+ # Start
139
+ CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt)
140
+
141
+ # Parameters
142
+ FS = 512
143
+ T_SEC = 4
144
+
145
+ xx, tt, fs = scitex.dsp.demo_sig(
146
+ batch_size=2,
147
+ n_chs=2,
148
+ n_segments=2,
149
+ fs=FS,
150
+ t_sec=T_SEC,
151
+ sig_type="tensorpac",
152
+ )
153
+
154
+ # scitex
155
+ pac_scitex, freqs_pha, freqs_amp = scitex.dsp.pac(
156
+ xx, fs, batch_size=2, pha_n_bands=50, amp_n_bands=30
157
+ )
158
+ i_batch, i_epoch = 0, 0
159
+ pac_scitex = pac_scitex[i_batch, i_epoch]
160
+
161
+ # Tensorpac
162
+ phases, amplitudes, freqs_pha, freqs_amp, pac_tp = calc_pac_with_tensorpac(
163
+ xx, fs, T_SEC, i_batch=0, i_ch=0
164
+ )
165
+
166
+ # Plots
167
+ fig = plot_PAC_scitex_vs_tensorpac(pac_scitex, pac_tp, freqs_pha, freqs_amp)
168
+ plt.show()
169
+
170
+ # Close
171
+ scitex.gen.close(CONFIG)
172
+
173
+ """
174
+ /home/ywatanabe/proj/entrance/scitex/dsp/utils/pac.py
175
+ """
176
+
177
+ # EOF
scitex/dt/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env python3
2
+ """Scitex dt module."""
3
+
4
+ from ._linspace import linspace
5
+
6
+ __all__ = [
7
+ "linspace",
8
+ ]