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.
- scitex/__init__.py +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 14:58:43 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_converters.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_converters.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import functools
|
|
13
|
+
import warnings
|
|
14
|
+
from typing import Any as _Any
|
|
15
|
+
from typing import Callable, Dict, Tuple, Union
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import pandas as pd
|
|
19
|
+
import torch
|
|
20
|
+
import xarray
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
Core conversion utilities for handling data type transformations.
|
|
24
|
+
Provides consistent conversion between NumPy, PyTorch, Pandas, and other formats.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ConversionWarning(UserWarning):
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Configure warnings
|
|
33
|
+
warnings.simplefilter("always", ConversionWarning)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@functools.lru_cache(maxsize=None)
|
|
37
|
+
def _cached_warning(message: str) -> None:
|
|
38
|
+
"""Cache warnings to avoid repetition."""
|
|
39
|
+
warnings.warn(message, category=ConversionWarning)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _conversion_warning(old: _Any, new: torch.Tensor) -> None:
|
|
43
|
+
"""Generate standardized type conversion warning."""
|
|
44
|
+
message = (
|
|
45
|
+
f"Converted from {type(old).__name__} to {type(new).__name__} ({new.device}). "
|
|
46
|
+
f"Consider using {type(new).__name__} ({new.device}) as input for faster computation."
|
|
47
|
+
)
|
|
48
|
+
_cached_warning(message)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _try_device(tensor: torch.Tensor, device: str) -> torch.Tensor:
|
|
52
|
+
"""Try to move tensor to specified device with graceful fallback."""
|
|
53
|
+
if not isinstance(tensor, torch.Tensor):
|
|
54
|
+
return tensor
|
|
55
|
+
|
|
56
|
+
if tensor.device.type == device:
|
|
57
|
+
return tensor
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
return tensor.to(device)
|
|
61
|
+
except RuntimeError as error:
|
|
62
|
+
if "cuda" in str(error).lower() and device == "cuda":
|
|
63
|
+
warnings.warn("CUDA memory insufficient, falling back to CPU.", UserWarning)
|
|
64
|
+
return tensor.cpu()
|
|
65
|
+
raise error
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def is_torch(*args: _Any, **kwargs: _Any) -> bool:
|
|
69
|
+
"""Check if any input is a PyTorch tensor."""
|
|
70
|
+
return any(isinstance(arg, torch.Tensor) for arg in args) or any(
|
|
71
|
+
isinstance(val, torch.Tensor) for val in kwargs.values()
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def is_cuda(*args: _Any, **kwargs: _Any) -> bool:
|
|
76
|
+
"""Check if any input is a CUDA tensor."""
|
|
77
|
+
return any((isinstance(arg, torch.Tensor) and arg.is_cuda) for arg in args) or any(
|
|
78
|
+
(isinstance(val, torch.Tensor) and val.is_cuda) for val in kwargs.values()
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _return_always(*args: _Any, **kwargs: _Any) -> Tuple[Tuple, Dict]:
|
|
83
|
+
"""Always return args and kwargs as a tuple of (args, kwargs)."""
|
|
84
|
+
return args, kwargs
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _return_if(*args: _Any, **kwargs: _Any) -> Union[Tuple, Dict, None]:
|
|
88
|
+
"""Return args and/or kwargs depending on what's provided."""
|
|
89
|
+
if args and kwargs:
|
|
90
|
+
return args, kwargs
|
|
91
|
+
elif args:
|
|
92
|
+
return args
|
|
93
|
+
elif kwargs:
|
|
94
|
+
return kwargs
|
|
95
|
+
else:
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def to_torch(
|
|
100
|
+
*args: _Any,
|
|
101
|
+
return_fn: Callable = _return_if,
|
|
102
|
+
device: str = None,
|
|
103
|
+
**kwargs: _Any,
|
|
104
|
+
) -> _Any:
|
|
105
|
+
"""Convert various data types to PyTorch tensors."""
|
|
106
|
+
if device is None:
|
|
107
|
+
device = kwargs.get("device", "cuda" if torch.cuda.is_available() else "cpu")
|
|
108
|
+
|
|
109
|
+
def _to_torch(data: _Any) -> _Any:
|
|
110
|
+
"""Internal conversion function for various data types."""
|
|
111
|
+
# Check for None
|
|
112
|
+
if data is None:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
# Don't convert scalars (int, float, bool, str) - they should remain as is
|
|
116
|
+
if isinstance(data, (int, float, bool, str)):
|
|
117
|
+
return data
|
|
118
|
+
|
|
119
|
+
# Handle collections
|
|
120
|
+
if isinstance(data, (tuple, list)):
|
|
121
|
+
# Check if it's a tuple/list of integers (like dimensions)
|
|
122
|
+
if all(isinstance(item, int) for item in data):
|
|
123
|
+
return data # Keep as is for dimension tuples
|
|
124
|
+
|
|
125
|
+
# Check if it's a numeric array-like structure
|
|
126
|
+
try:
|
|
127
|
+
# Try to convert to tensor directly
|
|
128
|
+
new_data = torch.tensor(data).float()
|
|
129
|
+
new_data = _try_device(new_data, device)
|
|
130
|
+
if device == "cuda":
|
|
131
|
+
_conversion_warning(data, new_data)
|
|
132
|
+
return new_data
|
|
133
|
+
except:
|
|
134
|
+
# If conversion fails, process items individually and return as tensor if possible
|
|
135
|
+
converted_items = [_to_torch(item) for item in data if item is not None]
|
|
136
|
+
# Try to stack if all items are tensors
|
|
137
|
+
if converted_items and all(isinstance(item, torch.Tensor) for item in converted_items):
|
|
138
|
+
try:
|
|
139
|
+
# Stack tensors along a new dimension
|
|
140
|
+
return torch.stack(converted_items)
|
|
141
|
+
except:
|
|
142
|
+
# Return as list if stacking fails
|
|
143
|
+
return converted_items
|
|
144
|
+
return converted_items
|
|
145
|
+
|
|
146
|
+
# Handle pandas types
|
|
147
|
+
if isinstance(data, (pd.Series, pd.DataFrame)):
|
|
148
|
+
new_data = torch.tensor(data.to_numpy()).squeeze().float()
|
|
149
|
+
new_data = _try_device(new_data, device)
|
|
150
|
+
if device == "cuda":
|
|
151
|
+
_conversion_warning(data, new_data)
|
|
152
|
+
return new_data
|
|
153
|
+
|
|
154
|
+
# Handle arrays
|
|
155
|
+
if isinstance(data, np.ndarray):
|
|
156
|
+
new_data = torch.tensor(data).float()
|
|
157
|
+
new_data = _try_device(new_data, device)
|
|
158
|
+
if device == "cuda":
|
|
159
|
+
_conversion_warning(data, new_data)
|
|
160
|
+
return new_data
|
|
161
|
+
|
|
162
|
+
# Handle xarray
|
|
163
|
+
if isinstance(data, xarray.core.dataarray.DataArray):
|
|
164
|
+
new_data = torch.tensor(np.array(data)).float()
|
|
165
|
+
new_data = _try_device(new_data, device)
|
|
166
|
+
if device == "cuda":
|
|
167
|
+
_conversion_warning(data, new_data)
|
|
168
|
+
return new_data
|
|
169
|
+
|
|
170
|
+
# Return as is for other types
|
|
171
|
+
return data
|
|
172
|
+
|
|
173
|
+
# Process args and kwargs
|
|
174
|
+
converted_args = [_to_torch(arg) for arg in args if arg is not None]
|
|
175
|
+
converted_kwargs = {
|
|
176
|
+
key: _to_torch(val) for key, val in kwargs.items() if val is not None
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
# Handle axis/dim parameter conversion
|
|
180
|
+
# Only convert axis to dim if dim is not already present
|
|
181
|
+
if "axis" in converted_kwargs and "dim" not in converted_kwargs:
|
|
182
|
+
converted_kwargs["dim"] = converted_kwargs.pop("axis")
|
|
183
|
+
|
|
184
|
+
# Return in the specified format
|
|
185
|
+
return return_fn(*converted_args, **converted_kwargs)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def to_numpy(*args: _Any, return_fn: Callable = _return_if, **kwargs: _Any) -> _Any:
|
|
189
|
+
"""Convert various data types to NumPy arrays."""
|
|
190
|
+
|
|
191
|
+
def _to_numpy(data: _Any) -> _Any:
|
|
192
|
+
"""Internal conversion function for various data types."""
|
|
193
|
+
# Check for None
|
|
194
|
+
if data is None:
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
# Don't convert scalars (int, float, bool, str) - they should remain as is
|
|
198
|
+
if isinstance(data, (int, float, bool, str)):
|
|
199
|
+
return data
|
|
200
|
+
|
|
201
|
+
# Handle pandas types
|
|
202
|
+
if isinstance(data, (pd.Series, pd.DataFrame)):
|
|
203
|
+
return data.to_numpy().squeeze()
|
|
204
|
+
|
|
205
|
+
# Handle torch tensors
|
|
206
|
+
if isinstance(data, torch.Tensor):
|
|
207
|
+
return data.detach().cpu().numpy()
|
|
208
|
+
|
|
209
|
+
# Handle lists and tuples
|
|
210
|
+
if isinstance(data, (list, tuple)):
|
|
211
|
+
# Check if it's a tuple/list of integers (like dimensions)
|
|
212
|
+
if all(isinstance(item, int) for item in data):
|
|
213
|
+
return data # Keep as is for dimension tuples
|
|
214
|
+
|
|
215
|
+
# Check if it's a numeric array-like structure
|
|
216
|
+
try:
|
|
217
|
+
# Try to convert to numpy array directly
|
|
218
|
+
return np.array(data)
|
|
219
|
+
except:
|
|
220
|
+
# If conversion fails, process items individually
|
|
221
|
+
converted_items = [_to_numpy(item) for item in data if item is not None]
|
|
222
|
+
# Try to stack if all items are numpy arrays
|
|
223
|
+
if converted_items and all(isinstance(item, np.ndarray) for item in converted_items):
|
|
224
|
+
try:
|
|
225
|
+
# Stack arrays along a new dimension
|
|
226
|
+
return np.stack(converted_items)
|
|
227
|
+
except:
|
|
228
|
+
# Return as list if stacking fails
|
|
229
|
+
return converted_items
|
|
230
|
+
return converted_items
|
|
231
|
+
|
|
232
|
+
# Return as is for other types
|
|
233
|
+
return data
|
|
234
|
+
|
|
235
|
+
# Process args and kwargs
|
|
236
|
+
converted_args = [_to_numpy(arg) for arg in args if arg is not None]
|
|
237
|
+
converted_kwargs = {
|
|
238
|
+
key: _to_numpy(val) for key, val in kwargs.items() if val is not None
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
# Handle dim/axis parameter conversion
|
|
242
|
+
# Only convert dim to axis if axis is not already present
|
|
243
|
+
if "dim" in converted_kwargs and "axis" not in converted_kwargs:
|
|
244
|
+
converted_kwargs["axis"] = converted_kwargs.pop("dim")
|
|
245
|
+
|
|
246
|
+
# Return in the specified format
|
|
247
|
+
return return_fn(*converted_args, **converted_kwargs)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def is_nested_decorator():
|
|
251
|
+
"""Check if we're in a nested decorator context."""
|
|
252
|
+
import inspect
|
|
253
|
+
|
|
254
|
+
frame = inspect.currentframe()
|
|
255
|
+
current_decorator = None
|
|
256
|
+
decorator_chain = []
|
|
257
|
+
|
|
258
|
+
# Walk up the call stack
|
|
259
|
+
while frame:
|
|
260
|
+
if frame.f_code.co_name == "wrapper":
|
|
261
|
+
# Check if this frame has local variables
|
|
262
|
+
if frame.f_locals:
|
|
263
|
+
# Try to get the self reference if it's a method
|
|
264
|
+
if "self" in frame.f_locals:
|
|
265
|
+
decorator_chain.append(frame.f_locals["self"])
|
|
266
|
+
|
|
267
|
+
# Check if the wrapper has marked itself with decorator info
|
|
268
|
+
if "_current_decorator" in frame.f_locals:
|
|
269
|
+
decorator_type = frame.f_locals["_current_decorator"]
|
|
270
|
+
if current_decorator is None:
|
|
271
|
+
current_decorator = decorator_type
|
|
272
|
+
elif current_decorator != decorator_type:
|
|
273
|
+
# Found a different decorator in the chain
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
frame = frame.f_back
|
|
277
|
+
|
|
278
|
+
# If we found more than one decorator in the chain
|
|
279
|
+
return len(decorator_chain) > 1
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
# EOF
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def deprecated(reason=None):
|
|
6
|
+
"""
|
|
7
|
+
A decorator to mark functions as deprecated. It will result in a warning being emitted
|
|
8
|
+
when the function is used.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
reason (str): A human-readable string explaining why this function was deprecated.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def decorator(func):
|
|
15
|
+
@functools.wraps(func)
|
|
16
|
+
def new_func(*args, **kwargs):
|
|
17
|
+
warnings.warn(
|
|
18
|
+
f"{func.__name__} is deprecated: {reason}",
|
|
19
|
+
DeprecationWarning,
|
|
20
|
+
stacklevel=2,
|
|
21
|
+
)
|
|
22
|
+
return func(*args, **kwargs)
|
|
23
|
+
|
|
24
|
+
return new_func
|
|
25
|
+
|
|
26
|
+
return decorator
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-06-07 22:16:25 (ywatanabe)"
|
|
4
|
+
# /home/ywatanabe/proj/scitex/src/scitex/gen/_not_implemented.py
|
|
5
|
+
|
|
6
|
+
import warnings
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def not_implemented(func):
|
|
10
|
+
"""
|
|
11
|
+
Decorator to mark methods as not implemented, issue a warning, and prevent their execution.
|
|
12
|
+
|
|
13
|
+
Arguments:
|
|
14
|
+
func (callable): The function or method to decorate.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
callable: A wrapper function that issues a warning and raises NotImplementedError when called.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def wrapper(*args, **kwargs):
|
|
21
|
+
# Issue a warning before raising the error
|
|
22
|
+
warnings.warn(
|
|
23
|
+
f"Attempt to use unimplemented method: '{func.__name__}'. This method is not yet available.",
|
|
24
|
+
category=FutureWarning,
|
|
25
|
+
stacklevel=2,
|
|
26
|
+
)
|
|
27
|
+
# # Raise the NotImplementedError
|
|
28
|
+
# raise NotImplementedError(f"The method '{func.__name__}' is not implemented yet.")
|
|
29
|
+
|
|
30
|
+
return wrapper
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 15:29:53 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_numpy_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_numpy_fn.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import torch
|
|
15
|
+
|
|
16
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_numpy_fn.py"
|
|
17
|
+
|
|
18
|
+
from functools import wraps
|
|
19
|
+
from typing import Any as _Any
|
|
20
|
+
from typing import Callable
|
|
21
|
+
|
|
22
|
+
from ._converters import _return_always, is_nested_decorator, to_numpy
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def numpy_fn(func: Callable) -> Callable:
|
|
26
|
+
@wraps(func)
|
|
27
|
+
def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
|
|
28
|
+
# Skip conversion if already in a nested decorator context
|
|
29
|
+
if is_nested_decorator():
|
|
30
|
+
results = func(*args, **kwargs)
|
|
31
|
+
return results
|
|
32
|
+
|
|
33
|
+
# Set the current decorator context
|
|
34
|
+
wrapper._current_decorator = "numpy_fn"
|
|
35
|
+
|
|
36
|
+
# Store original object for type preservation
|
|
37
|
+
original_object = args[0] if args else None
|
|
38
|
+
|
|
39
|
+
converted_args, converted_kwargs = to_numpy(
|
|
40
|
+
*args, return_fn=_return_always, **kwargs
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Skip strict assertion for certain types that may not convert to arrays
|
|
44
|
+
# Instead, convert what we can and pass through what we can't
|
|
45
|
+
validated_args = []
|
|
46
|
+
for arg_index, arg in enumerate(converted_args):
|
|
47
|
+
if isinstance(arg, np.ndarray):
|
|
48
|
+
validated_args.append(arg)
|
|
49
|
+
elif isinstance(arg, (int, float, str, type(None))):
|
|
50
|
+
# Pass through scalars and strings unchanged
|
|
51
|
+
validated_args.append(arg)
|
|
52
|
+
elif isinstance(arg, list) and all(isinstance(item, np.ndarray) for item in arg):
|
|
53
|
+
# List of arrays - pass through as is
|
|
54
|
+
validated_args.append(arg)
|
|
55
|
+
else:
|
|
56
|
+
# Try one more conversion attempt
|
|
57
|
+
try:
|
|
58
|
+
validated_args.append(np.array(arg))
|
|
59
|
+
except:
|
|
60
|
+
# If all else fails, pass through unchanged
|
|
61
|
+
validated_args.append(arg)
|
|
62
|
+
|
|
63
|
+
results = func(*validated_args, **converted_kwargs)
|
|
64
|
+
|
|
65
|
+
# Convert results back to original input types
|
|
66
|
+
if isinstance(results, np.ndarray):
|
|
67
|
+
if original_object is not None:
|
|
68
|
+
if isinstance(original_object, list):
|
|
69
|
+
return results.tolist()
|
|
70
|
+
elif isinstance(original_object, torch.Tensor):
|
|
71
|
+
return torch.tensor(results)
|
|
72
|
+
elif isinstance(original_object, pd.DataFrame):
|
|
73
|
+
return pd.DataFrame(results)
|
|
74
|
+
elif isinstance(original_object, pd.Series):
|
|
75
|
+
return pd.Series(results)
|
|
76
|
+
return results
|
|
77
|
+
|
|
78
|
+
return results
|
|
79
|
+
|
|
80
|
+
# Mark as a wrapper for detection
|
|
81
|
+
wrapper._is_wrapper = True
|
|
82
|
+
wrapper._decorator_type = "numpy_fn"
|
|
83
|
+
return wrapper
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# EOF
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 15:44:00 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_pandas_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_pandas_fn.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_pandas_fn.py"
|
|
13
|
+
|
|
14
|
+
from functools import wraps
|
|
15
|
+
from typing import Any as _Any
|
|
16
|
+
from typing import Callable
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
import pandas as pd
|
|
20
|
+
import torch
|
|
21
|
+
import xarray as xr
|
|
22
|
+
|
|
23
|
+
from ._converters import is_nested_decorator
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def pandas_fn(func: Callable) -> Callable:
|
|
27
|
+
@wraps(func)
|
|
28
|
+
def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
|
|
29
|
+
# Skip conversion if already in a nested decorator context
|
|
30
|
+
if is_nested_decorator():
|
|
31
|
+
results = func(*args, **kwargs)
|
|
32
|
+
return results
|
|
33
|
+
|
|
34
|
+
# Set the current decorator context
|
|
35
|
+
wrapper._current_decorator = "pandas_fn"
|
|
36
|
+
|
|
37
|
+
# Store original object for type preservation
|
|
38
|
+
original_object = args[0] if args else None
|
|
39
|
+
|
|
40
|
+
# Convert args to pandas DataFrames
|
|
41
|
+
def to_pandas(data):
|
|
42
|
+
if data is None:
|
|
43
|
+
return None
|
|
44
|
+
elif isinstance(data, pd.DataFrame):
|
|
45
|
+
return data
|
|
46
|
+
elif isinstance(data, pd.Series):
|
|
47
|
+
return pd.DataFrame(data)
|
|
48
|
+
elif isinstance(data, np.ndarray):
|
|
49
|
+
return pd.DataFrame(data)
|
|
50
|
+
elif isinstance(data, list):
|
|
51
|
+
try:
|
|
52
|
+
return pd.DataFrame(data)
|
|
53
|
+
except:
|
|
54
|
+
# If list can't be converted to DataFrame, return as is
|
|
55
|
+
return data
|
|
56
|
+
elif isinstance(data, torch.Tensor):
|
|
57
|
+
return pd.DataFrame(data.detach().cpu().numpy())
|
|
58
|
+
elif isinstance(data, xr.DataArray):
|
|
59
|
+
return pd.DataFrame(data.values)
|
|
60
|
+
elif isinstance(data, (int, float, str)):
|
|
61
|
+
# Don't convert scalars to DataFrames
|
|
62
|
+
return data
|
|
63
|
+
else:
|
|
64
|
+
try:
|
|
65
|
+
return pd.DataFrame([data])
|
|
66
|
+
except:
|
|
67
|
+
# If conversion fails, return as is
|
|
68
|
+
return data
|
|
69
|
+
|
|
70
|
+
converted_args = [to_pandas(arg) for arg in args]
|
|
71
|
+
converted_kwargs = {k: to_pandas(v) for k, v in kwargs.items()}
|
|
72
|
+
|
|
73
|
+
# Skip strict assertion for certain types
|
|
74
|
+
validated_args = []
|
|
75
|
+
for arg_index, arg in enumerate(converted_args):
|
|
76
|
+
if isinstance(arg, pd.DataFrame):
|
|
77
|
+
validated_args.append(arg)
|
|
78
|
+
elif isinstance(arg, (int, float, str, type(None), pd.Series)):
|
|
79
|
+
# Pass through scalars, strings, Series, and None unchanged
|
|
80
|
+
validated_args.append(arg)
|
|
81
|
+
elif isinstance(arg, list) and all(isinstance(item, pd.DataFrame) for item in arg):
|
|
82
|
+
# List of DataFrames - pass through as is
|
|
83
|
+
validated_args.append(arg)
|
|
84
|
+
else:
|
|
85
|
+
# Try one more conversion attempt
|
|
86
|
+
try:
|
|
87
|
+
validated_args.append(pd.DataFrame(arg))
|
|
88
|
+
except:
|
|
89
|
+
# If all else fails, pass through unchanged
|
|
90
|
+
validated_args.append(arg)
|
|
91
|
+
|
|
92
|
+
results = func(*validated_args, **converted_kwargs)
|
|
93
|
+
|
|
94
|
+
# Convert results back to original input types
|
|
95
|
+
if isinstance(results, pd.DataFrame):
|
|
96
|
+
if original_object is not None:
|
|
97
|
+
if isinstance(original_object, list):
|
|
98
|
+
return results.values.tolist()
|
|
99
|
+
elif isinstance(original_object, np.ndarray):
|
|
100
|
+
return results.values
|
|
101
|
+
elif isinstance(original_object, torch.Tensor):
|
|
102
|
+
return torch.tensor(results.values)
|
|
103
|
+
elif isinstance(original_object, pd.Series):
|
|
104
|
+
return (
|
|
105
|
+
pd.Series(results.iloc[:, 0])
|
|
106
|
+
if results.shape[1] > 0
|
|
107
|
+
else pd.Series()
|
|
108
|
+
)
|
|
109
|
+
elif isinstance(original_object, xr.DataArray):
|
|
110
|
+
return xr.DataArray(results.values)
|
|
111
|
+
return results
|
|
112
|
+
|
|
113
|
+
return results
|
|
114
|
+
|
|
115
|
+
# Mark as a wrapper for detection
|
|
116
|
+
wrapper._is_wrapper = True
|
|
117
|
+
wrapper._decorator_type = "pandas_fn"
|
|
118
|
+
return wrapper
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# EOF
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-14 07:44:00 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_preserve_doc.py
|
|
5
|
+
|
|
6
|
+
from functools import wraps
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def preserve_doc(loader_func):
|
|
10
|
+
"""Wrap the loader functions to preserve their docstrings"""
|
|
11
|
+
|
|
12
|
+
@wraps(loader_func)
|
|
13
|
+
def wrapper(*args, **kwargs):
|
|
14
|
+
return loader_func(*args, **kwargs)
|
|
15
|
+
|
|
16
|
+
return wrapper
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# EOF
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-31 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_signal_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_signal_fn.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from functools import wraps
|
|
13
|
+
from typing import Any as _Any
|
|
14
|
+
from typing import Callable
|
|
15
|
+
|
|
16
|
+
import numpy as np
|
|
17
|
+
import pandas as pd
|
|
18
|
+
import torch
|
|
19
|
+
import xarray as xr
|
|
20
|
+
|
|
21
|
+
from ._converters import _return_always, is_nested_decorator, to_torch
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def signal_fn(func: Callable) -> Callable:
|
|
25
|
+
"""Decorator for signal processing functions that converts only the first argument (signal) to torch tensor.
|
|
26
|
+
|
|
27
|
+
This decorator is designed for DSP functions where:
|
|
28
|
+
- The first argument is the signal data that should be converted to torch tensor
|
|
29
|
+
- Other arguments (like sampling frequency, bands, etc.) should remain as-is
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
@wraps(func)
|
|
33
|
+
def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
|
|
34
|
+
# Skip conversion if already in a nested decorator context
|
|
35
|
+
if is_nested_decorator():
|
|
36
|
+
results = func(*args, **kwargs)
|
|
37
|
+
return results
|
|
38
|
+
|
|
39
|
+
# Set the current decorator context
|
|
40
|
+
wrapper._current_decorator = "signal_fn"
|
|
41
|
+
|
|
42
|
+
# Store original object for type preservation
|
|
43
|
+
original_object = args[0] if args else None
|
|
44
|
+
|
|
45
|
+
# Convert only the first argument (signal) to torch tensor
|
|
46
|
+
if args:
|
|
47
|
+
# Convert first argument to torch
|
|
48
|
+
converted_first_arg = to_torch(args[0], return_fn=_return_always)[0][0]
|
|
49
|
+
|
|
50
|
+
# Keep other arguments as-is
|
|
51
|
+
converted_args = (converted_first_arg,) + args[1:]
|
|
52
|
+
else:
|
|
53
|
+
converted_args = args
|
|
54
|
+
|
|
55
|
+
results = func(*converted_args, **kwargs)
|
|
56
|
+
|
|
57
|
+
# Convert results back to original input types
|
|
58
|
+
if isinstance(results, torch.Tensor):
|
|
59
|
+
if original_object is not None:
|
|
60
|
+
if isinstance(original_object, list):
|
|
61
|
+
return results.detach().cpu().numpy().tolist()
|
|
62
|
+
elif isinstance(original_object, np.ndarray):
|
|
63
|
+
return results.detach().cpu().numpy()
|
|
64
|
+
elif isinstance(original_object, pd.DataFrame):
|
|
65
|
+
return pd.DataFrame(results.detach().cpu().numpy())
|
|
66
|
+
elif isinstance(original_object, pd.Series):
|
|
67
|
+
return pd.Series(results.detach().cpu().numpy().flatten())
|
|
68
|
+
elif isinstance(original_object, xr.DataArray):
|
|
69
|
+
return xr.DataArray(results.detach().cpu().numpy())
|
|
70
|
+
return results
|
|
71
|
+
|
|
72
|
+
# Handle tuple returns (e.g., (signal, frequencies))
|
|
73
|
+
elif isinstance(results, tuple):
|
|
74
|
+
converted_results = []
|
|
75
|
+
for r in results:
|
|
76
|
+
if isinstance(r, torch.Tensor):
|
|
77
|
+
if original_object is not None and isinstance(
|
|
78
|
+
original_object, np.ndarray
|
|
79
|
+
):
|
|
80
|
+
converted_results.append(r.detach().cpu().numpy())
|
|
81
|
+
else:
|
|
82
|
+
converted_results.append(r)
|
|
83
|
+
else:
|
|
84
|
+
converted_results.append(r)
|
|
85
|
+
return tuple(converted_results)
|
|
86
|
+
|
|
87
|
+
return results
|
|
88
|
+
|
|
89
|
+
# Mark as a wrapper for detection
|
|
90
|
+
wrapper._is_wrapper = True
|
|
91
|
+
wrapper._decorator_type = "signal_fn"
|
|
92
|
+
return wrapper
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# EOF
|