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,172 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-01 10:30:00 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_auto_order.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Auto-ordering decorator system that enforces predefined order regardless of
|
|
8
|
+
how decorators are written in code.
|
|
9
|
+
|
|
10
|
+
The enforced order is:
|
|
11
|
+
1. Type conversion (innermost): torch_fn, numpy_fn, pandas_fn
|
|
12
|
+
2. Batch processing (outermost): batch_fn
|
|
13
|
+
|
|
14
|
+
This uses a delayed application approach where decorators are collected
|
|
15
|
+
and then applied in the correct order when the function is first called.
|
|
16
|
+
|
|
17
|
+
Example
|
|
18
|
+
-------
|
|
19
|
+
>>> from scitex.decorators import enable_auto_order
|
|
20
|
+
>>> enable_auto_order()
|
|
21
|
+
>>>
|
|
22
|
+
>>> # These will all work identically:
|
|
23
|
+
>>> @batch_fn
|
|
24
|
+
>>> @torch_fn
|
|
25
|
+
>>> def func1(x):
|
|
26
|
+
... return x.mean()
|
|
27
|
+
>>>
|
|
28
|
+
>>> @torch_fn
|
|
29
|
+
>>> @batch_fn # Order doesn't matter!
|
|
30
|
+
>>> def func2(x):
|
|
31
|
+
... return x.mean()
|
|
32
|
+
|
|
33
|
+
The auto-ordering system eliminates decorator ordering complexity and
|
|
34
|
+
prevents common errors from incorrect decorator stacking.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
from functools import wraps
|
|
38
|
+
from typing import Callable, List, Tuple, Any
|
|
39
|
+
|
|
40
|
+
# Import original decorators
|
|
41
|
+
from ._torch_fn import torch_fn as _orig_torch_fn
|
|
42
|
+
from ._numpy_fn import numpy_fn as _orig_numpy_fn
|
|
43
|
+
from ._pandas_fn import pandas_fn as _orig_pandas_fn
|
|
44
|
+
from ._batch_fn import batch_fn as _orig_batch_fn
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Decorator priority (higher = inner/applied first)
|
|
48
|
+
DECORATOR_PRIORITY = {
|
|
49
|
+
'torch_fn': 100,
|
|
50
|
+
'numpy_fn': 100,
|
|
51
|
+
'pandas_fn': 100,
|
|
52
|
+
'batch_fn': 10,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Original decorator mapping
|
|
56
|
+
ORIGINAL_DECORATORS = {
|
|
57
|
+
'torch_fn': _orig_torch_fn,
|
|
58
|
+
'numpy_fn': _orig_numpy_fn,
|
|
59
|
+
'pandas_fn': _orig_pandas_fn,
|
|
60
|
+
'batch_fn': _orig_batch_fn,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class AutoOrderDecorator:
|
|
65
|
+
"""Decorator that collects and applies decorators in predefined order."""
|
|
66
|
+
|
|
67
|
+
def __init__(self, name: str):
|
|
68
|
+
self.name = name
|
|
69
|
+
self.priority = DECORATOR_PRIORITY[name]
|
|
70
|
+
self.original = ORIGINAL_DECORATORS[name]
|
|
71
|
+
|
|
72
|
+
def __call__(self, func: Callable) -> Callable:
|
|
73
|
+
# Initialize or get pending decorators list
|
|
74
|
+
if not hasattr(func, '_pending_decorators'):
|
|
75
|
+
# First decorator - create the wrapper
|
|
76
|
+
original_func = func
|
|
77
|
+
|
|
78
|
+
@wraps(func)
|
|
79
|
+
def auto_ordered_wrapper(*args, **kwargs):
|
|
80
|
+
# On first call, apply decorators in correct order
|
|
81
|
+
if hasattr(auto_ordered_wrapper, '_pending_decorators'):
|
|
82
|
+
# Sort by priority (descending = innermost first)
|
|
83
|
+
decorators = sorted(
|
|
84
|
+
auto_ordered_wrapper._pending_decorators,
|
|
85
|
+
key=lambda x: x[1],
|
|
86
|
+
reverse=True
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# Apply decorators in order
|
|
90
|
+
final_func = original_func
|
|
91
|
+
for dec_name, _, dec_func in decorators:
|
|
92
|
+
final_func = dec_func(final_func)
|
|
93
|
+
|
|
94
|
+
# Replace this wrapper with the final decorated function
|
|
95
|
+
auto_ordered_wrapper._final_func = final_func
|
|
96
|
+
delattr(auto_ordered_wrapper, '_pending_decorators')
|
|
97
|
+
|
|
98
|
+
# Call the final decorated function
|
|
99
|
+
if hasattr(auto_ordered_wrapper, '_final_func'):
|
|
100
|
+
return auto_ordered_wrapper._final_func(*args, **kwargs)
|
|
101
|
+
else:
|
|
102
|
+
return original_func(*args, **kwargs)
|
|
103
|
+
|
|
104
|
+
auto_ordered_wrapper._pending_decorators = []
|
|
105
|
+
func = auto_ordered_wrapper
|
|
106
|
+
|
|
107
|
+
# Add this decorator to pending list
|
|
108
|
+
func._pending_decorators.append((self.name, self.priority, self.original))
|
|
109
|
+
|
|
110
|
+
return func
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# Create auto-ordering versions
|
|
114
|
+
torch_fn = AutoOrderDecorator('torch_fn')
|
|
115
|
+
numpy_fn = AutoOrderDecorator('numpy_fn')
|
|
116
|
+
pandas_fn = AutoOrderDecorator('pandas_fn')
|
|
117
|
+
batch_fn = AutoOrderDecorator('batch_fn')
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# Enable auto-ordering globally
|
|
121
|
+
def enable_auto_order():
|
|
122
|
+
"""
|
|
123
|
+
Enable auto-ordering for all decorators in the scitex.decorators module.
|
|
124
|
+
|
|
125
|
+
This replaces the standard decorators with auto-ordering versions.
|
|
126
|
+
|
|
127
|
+
Example
|
|
128
|
+
-------
|
|
129
|
+
>>> import scitex
|
|
130
|
+
>>> scitex.decorators.enable_auto_order()
|
|
131
|
+
>>>
|
|
132
|
+
>>> # Now decorators will auto-order regardless of how they're written
|
|
133
|
+
>>> @scitex.decorators.batch_fn
|
|
134
|
+
>>> @scitex.decorators.torch_fn
|
|
135
|
+
>>> def my_func(x):
|
|
136
|
+
... return x.mean()
|
|
137
|
+
"""
|
|
138
|
+
import scitex.decorators as decorators_module
|
|
139
|
+
|
|
140
|
+
# Replace with auto-ordering versions
|
|
141
|
+
decorators_module.torch_fn = torch_fn
|
|
142
|
+
decorators_module.numpy_fn = numpy_fn
|
|
143
|
+
decorators_module.pandas_fn = pandas_fn
|
|
144
|
+
decorators_module.batch_fn = batch_fn
|
|
145
|
+
|
|
146
|
+
print("Auto-ordering enabled for scitex decorators!")
|
|
147
|
+
print("Decorators will now apply in predefined order:")
|
|
148
|
+
print(" 1. Type conversion (torch_fn, numpy_fn, pandas_fn)")
|
|
149
|
+
print(" 2. Batch processing (batch_fn)")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def disable_auto_order():
|
|
153
|
+
"""Disable auto-ordering and restore original decorators."""
|
|
154
|
+
import scitex.decorators as decorators_module
|
|
155
|
+
|
|
156
|
+
# Restore original decorators
|
|
157
|
+
decorators_module.torch_fn = _orig_torch_fn
|
|
158
|
+
decorators_module.numpy_fn = _orig_numpy_fn
|
|
159
|
+
decorators_module.pandas_fn = _orig_pandas_fn
|
|
160
|
+
decorators_module.batch_fn = _orig_batch_fn
|
|
161
|
+
|
|
162
|
+
print("Auto-ordering disabled. Using original decorators.")
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
__all__ = [
|
|
166
|
+
'torch_fn',
|
|
167
|
+
'numpy_fn',
|
|
168
|
+
'pandas_fn',
|
|
169
|
+
'batch_fn',
|
|
170
|
+
'enable_auto_order',
|
|
171
|
+
'disable_auto_order',
|
|
172
|
+
]
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 09:18:26 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_batch_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_batch_fn.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
from typing import Any as _Any
|
|
12
|
+
|
|
13
|
+
from functools import wraps
|
|
14
|
+
from typing import Callable
|
|
15
|
+
|
|
16
|
+
import numpy as np
|
|
17
|
+
import torch
|
|
18
|
+
from tqdm import tqdm as _tqdm
|
|
19
|
+
|
|
20
|
+
from ._converters import is_nested_decorator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def batch_fn(func: Callable) -> Callable:
|
|
24
|
+
@wraps(func)
|
|
25
|
+
def wrapper(x: _Any, *args: _Any, **kwargs: _Any) -> _Any:
|
|
26
|
+
# Skip batching if in a nested decorator context and batch_size is already set
|
|
27
|
+
if is_nested_decorator() and "batch_size" in kwargs:
|
|
28
|
+
return func(x, *args, **kwargs)
|
|
29
|
+
|
|
30
|
+
# Set the current decorator context
|
|
31
|
+
wrapper._current_decorator = "batch_fn"
|
|
32
|
+
|
|
33
|
+
# Mark that batch_fn has been applied
|
|
34
|
+
if not hasattr(wrapper, '_decorator_order'):
|
|
35
|
+
wrapper._decorator_order = []
|
|
36
|
+
wrapper._decorator_order.append('batch_fn')
|
|
37
|
+
|
|
38
|
+
batch_size = int(kwargs.pop("batch_size", 4))
|
|
39
|
+
if len(x) <= batch_size:
|
|
40
|
+
# Only pass batch_size if the function accepts it
|
|
41
|
+
import inspect
|
|
42
|
+
try:
|
|
43
|
+
sig = inspect.signature(func)
|
|
44
|
+
if 'batch_size' in sig.parameters:
|
|
45
|
+
return func(x, *args, **kwargs, batch_size=batch_size)
|
|
46
|
+
else:
|
|
47
|
+
return func(x, *args, **kwargs)
|
|
48
|
+
except:
|
|
49
|
+
# Fallback for wrapped functions
|
|
50
|
+
return func(x, *args, **kwargs)
|
|
51
|
+
|
|
52
|
+
n_batches = (len(x) + batch_size - 1) // batch_size
|
|
53
|
+
results = []
|
|
54
|
+
|
|
55
|
+
for i_batch in _tqdm(range(n_batches)):
|
|
56
|
+
start = i_batch * batch_size
|
|
57
|
+
end = min((i_batch + 1) * batch_size, len(x))
|
|
58
|
+
|
|
59
|
+
# Only pass batch_size if the function accepts it
|
|
60
|
+
import inspect
|
|
61
|
+
try:
|
|
62
|
+
sig = inspect.signature(func)
|
|
63
|
+
if 'batch_size' in sig.parameters:
|
|
64
|
+
batch_result = func(x[start:end], *args, **kwargs, batch_size=batch_size)
|
|
65
|
+
else:
|
|
66
|
+
batch_result = func(x[start:end], *args, **kwargs)
|
|
67
|
+
except:
|
|
68
|
+
# Fallback for wrapped functions
|
|
69
|
+
batch_result = func(x[start:end], *args, **kwargs)
|
|
70
|
+
|
|
71
|
+
if isinstance(batch_result, torch.Tensor):
|
|
72
|
+
batch_result = batch_result.cpu()
|
|
73
|
+
elif isinstance(batch_result, tuple):
|
|
74
|
+
batch_result = tuple(
|
|
75
|
+
val.cpu() if isinstance(val, torch.Tensor) else val
|
|
76
|
+
for val in batch_result
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
results.append(batch_result)
|
|
80
|
+
|
|
81
|
+
if isinstance(results[0], tuple):
|
|
82
|
+
n_vars = len(results[0])
|
|
83
|
+
combined_results = []
|
|
84
|
+
for i_var in range(n_vars):
|
|
85
|
+
# Check if this element is stackable (tensor/array) or should be kept as-is
|
|
86
|
+
first_elem = results[0][i_var]
|
|
87
|
+
if isinstance(first_elem, (torch.Tensor, np.ndarray)):
|
|
88
|
+
# Stack tensors/arrays
|
|
89
|
+
if isinstance(first_elem, torch.Tensor):
|
|
90
|
+
if first_elem.ndim == 0:
|
|
91
|
+
combined = torch.stack([res[i_var] for res in results])
|
|
92
|
+
else:
|
|
93
|
+
combined = torch.vstack([res[i_var] for res in results])
|
|
94
|
+
else:
|
|
95
|
+
combined = np.vstack([res[i_var] for res in results])
|
|
96
|
+
combined_results.append(combined)
|
|
97
|
+
else:
|
|
98
|
+
# For non-tensor elements (like lists), just take the first one
|
|
99
|
+
# (assuming they're all the same across batches)
|
|
100
|
+
combined_results.append(first_elem)
|
|
101
|
+
return tuple(combined_results)
|
|
102
|
+
elif isinstance(results[0], torch.Tensor):
|
|
103
|
+
# Check if results are 0-D tensors (scalars)
|
|
104
|
+
if results[0].ndim == 0:
|
|
105
|
+
return torch.stack(results)
|
|
106
|
+
else:
|
|
107
|
+
return torch.vstack(results)
|
|
108
|
+
elif isinstance(results[0], np.ndarray):
|
|
109
|
+
# Handle numpy arrays
|
|
110
|
+
if results[0].ndim == 0:
|
|
111
|
+
return np.array(results)
|
|
112
|
+
else:
|
|
113
|
+
return np.vstack(results)
|
|
114
|
+
elif isinstance(results[0], (int, float)):
|
|
115
|
+
# Handle scalar results
|
|
116
|
+
return np.array(results) if len(results) > 1 else results[0]
|
|
117
|
+
else:
|
|
118
|
+
# For lists and other types
|
|
119
|
+
return sum(results, [])
|
|
120
|
+
|
|
121
|
+
# Mark as a wrapper for detection
|
|
122
|
+
wrapper._is_wrapper = True
|
|
123
|
+
wrapper._decorator_type = "batch_fn"
|
|
124
|
+
return wrapper
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# EOF
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-07 06:08:45 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_cache_disk.py
|
|
5
|
+
|
|
6
|
+
import functools
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from joblib import Memory as _Memory
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def cache_disk(func):
|
|
13
|
+
"""Disk caching decorator that uses joblib.Memory.
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
@cache_disk
|
|
17
|
+
def expensive_function(x):
|
|
18
|
+
return x ** 2
|
|
19
|
+
"""
|
|
20
|
+
scitex_dir = os.getenv("SciTeX_DIR", "~/.cache/scitex/")
|
|
21
|
+
cache_dir = scitex_dir + "cache/"
|
|
22
|
+
memory = _Memory(cache_dir, verbose=0)
|
|
23
|
+
|
|
24
|
+
@functools.wraps(func)
|
|
25
|
+
def wrapper(*args, **kwargs):
|
|
26
|
+
cached_func = memory.cache(func)
|
|
27
|
+
return cached_func(*args, **kwargs)
|
|
28
|
+
|
|
29
|
+
return wrapper
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# EOF
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-07 05:52:33 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_cache_mem.py
|
|
5
|
+
|
|
6
|
+
from functools import lru_cache as _lru_cache
|
|
7
|
+
|
|
8
|
+
# Memory cache
|
|
9
|
+
cache_mem = _lru_cache(maxsize=None)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# EOF
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-01 10:20:00 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_combined.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Combined decorators with predefined application order to reduce complexity.
|
|
8
|
+
|
|
9
|
+
The order is always: type conversion → batch processing
|
|
10
|
+
This ensures consistent behavior and reduces unexpected interactions.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from functools import wraps
|
|
14
|
+
from typing import Callable
|
|
15
|
+
|
|
16
|
+
from ._batch_fn import batch_fn
|
|
17
|
+
from ._torch_fn import torch_fn
|
|
18
|
+
from ._numpy_fn import numpy_fn
|
|
19
|
+
from ._pandas_fn import pandas_fn
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def torch_batch_fn(func: Callable) -> Callable:
|
|
23
|
+
"""
|
|
24
|
+
Combined decorator: torch_fn → batch_fn.
|
|
25
|
+
|
|
26
|
+
Converts inputs to torch tensors, then processes in batches.
|
|
27
|
+
This is the recommended order for PyTorch operations.
|
|
28
|
+
|
|
29
|
+
Example
|
|
30
|
+
-------
|
|
31
|
+
>>> @torch_batch_fn
|
|
32
|
+
... def process_data(x, dim=None):
|
|
33
|
+
... return x.mean(dim=dim)
|
|
34
|
+
"""
|
|
35
|
+
@wraps(func)
|
|
36
|
+
@torch_fn
|
|
37
|
+
@batch_fn
|
|
38
|
+
def wrapper(*args, **kwargs):
|
|
39
|
+
return func(*args, **kwargs)
|
|
40
|
+
return wrapper
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def numpy_batch_fn(func: Callable) -> Callable:
|
|
44
|
+
"""
|
|
45
|
+
Combined decorator: numpy_fn → batch_fn.
|
|
46
|
+
|
|
47
|
+
Converts inputs to numpy arrays, then processes in batches.
|
|
48
|
+
This is the recommended order for NumPy operations.
|
|
49
|
+
|
|
50
|
+
Example
|
|
51
|
+
-------
|
|
52
|
+
>>> @numpy_batch_fn
|
|
53
|
+
... def process_data(x, axis=None):
|
|
54
|
+
... return np.mean(x, axis=axis)
|
|
55
|
+
"""
|
|
56
|
+
@wraps(func)
|
|
57
|
+
@numpy_fn
|
|
58
|
+
@batch_fn
|
|
59
|
+
def wrapper(*args, **kwargs):
|
|
60
|
+
return func(*args, **kwargs)
|
|
61
|
+
return wrapper
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def pandas_batch_fn(func: Callable) -> Callable:
|
|
65
|
+
"""
|
|
66
|
+
Combined decorator: pandas_fn → batch_fn.
|
|
67
|
+
|
|
68
|
+
Converts inputs to pandas DataFrames, then processes in batches.
|
|
69
|
+
This is the recommended order for Pandas operations.
|
|
70
|
+
|
|
71
|
+
Example
|
|
72
|
+
-------
|
|
73
|
+
>>> @pandas_batch_fn
|
|
74
|
+
... def process_data(df):
|
|
75
|
+
... return df.describe()
|
|
76
|
+
"""
|
|
77
|
+
@wraps(func)
|
|
78
|
+
@pandas_fn
|
|
79
|
+
@batch_fn
|
|
80
|
+
def wrapper(*args, **kwargs):
|
|
81
|
+
return func(*args, **kwargs)
|
|
82
|
+
return wrapper
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# Aliases for common use cases
|
|
86
|
+
batch_torch_fn = torch_batch_fn # Alternative name
|
|
87
|
+
batch_numpy_fn = numpy_batch_fn # Alternative name
|
|
88
|
+
batch_pandas_fn = pandas_batch_fn # Alternative name
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
__all__ = [
|
|
92
|
+
'torch_batch_fn',
|
|
93
|
+
'numpy_batch_fn',
|
|
94
|
+
'pandas_batch_fn',
|
|
95
|
+
'batch_torch_fn',
|
|
96
|
+
'batch_numpy_fn',
|
|
97
|
+
'batch_pandas_fn',
|
|
98
|
+
]
|