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,55 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-07 05:58:41 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/decorators/_timeout.py
|
|
5
|
+
|
|
6
|
+
#!./env/bin/python3
|
|
7
|
+
# -*- coding: utf-8 -*-
|
|
8
|
+
# Time-stamp: "2024-04-23 19:11:33"
|
|
9
|
+
# Author: Yusuke Watanabe (ywata1989@gmail.com)
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
This script does XYZ.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
"""
|
|
16
|
+
Imports
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
"""
|
|
21
|
+
Config
|
|
22
|
+
"""
|
|
23
|
+
# CONFIG = scitex.gen.load_configs()
|
|
24
|
+
|
|
25
|
+
"""
|
|
26
|
+
Functions & Classes
|
|
27
|
+
"""
|
|
28
|
+
from multiprocessing import Process, Queue
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def timeout(seconds=10, error_message="Timeout"):
|
|
32
|
+
def decorator(func):
|
|
33
|
+
def wrapper(*args, **kwargs):
|
|
34
|
+
def queue_wrapper(queue, args, kwargs):
|
|
35
|
+
result = func(*args, **kwargs)
|
|
36
|
+
queue.put(result)
|
|
37
|
+
|
|
38
|
+
queue = Queue()
|
|
39
|
+
args_for_process = (queue, args, kwargs)
|
|
40
|
+
process = Process(target=queue_wrapper, args=args_for_process)
|
|
41
|
+
process.start()
|
|
42
|
+
process.join(timeout=seconds)
|
|
43
|
+
|
|
44
|
+
if process.is_alive():
|
|
45
|
+
process.terminate()
|
|
46
|
+
raise TimeoutError(error_message)
|
|
47
|
+
else:
|
|
48
|
+
return queue.get()
|
|
49
|
+
|
|
50
|
+
return wrapper
|
|
51
|
+
|
|
52
|
+
return decorator
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# EOF
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 15:40:43 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_torch_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_torch_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 torch_fn(func: Callable) -> Callable:
|
|
25
|
+
"""Decorator for PyTorch function compatibility.
|
|
26
|
+
|
|
27
|
+
Automatically converts inputs to PyTorch tensors and handles various data types
|
|
28
|
+
gracefully. Preserves the original input type in the output.
|
|
29
|
+
|
|
30
|
+
Features
|
|
31
|
+
--------
|
|
32
|
+
- Converts inputs to PyTorch tensors
|
|
33
|
+
- Preserves scalar parameters (int, float, bool, str)
|
|
34
|
+
- Preserves dimension tuples like dim=(0, 1)
|
|
35
|
+
- Handles nested lists/tuples gracefully
|
|
36
|
+
- Automatically converts axis to dim for torch functions
|
|
37
|
+
- Applies device="cuda" if available
|
|
38
|
+
- Returns output in same type as input (numpy->numpy, pandas->pandas, etc.)
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
func : Callable
|
|
43
|
+
The function to decorate
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
Callable
|
|
48
|
+
The decorated function
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> @torch_fn
|
|
53
|
+
... def mean_squared(x, dim=None):
|
|
54
|
+
... return (x ** 2).mean(dim=dim)
|
|
55
|
+
>>>
|
|
56
|
+
>>> # Works with numpy arrays
|
|
57
|
+
>>> result = mean_squared(np.array([1, 2, 3]))
|
|
58
|
+
>>>
|
|
59
|
+
>>> # Works with nested lists
|
|
60
|
+
>>> result = mean_squared([[1, 2], [3, 4]])
|
|
61
|
+
>>>
|
|
62
|
+
>>> # Preserves dimension tuples
|
|
63
|
+
>>> result = mean_squared(data, dim=(0, 1))
|
|
64
|
+
|
|
65
|
+
Notes
|
|
66
|
+
-----
|
|
67
|
+
For optimal performance with batch processing, apply torch_fn before batch_fn:
|
|
68
|
+
@batch_fn
|
|
69
|
+
@torch_fn
|
|
70
|
+
def my_function(x): ...
|
|
71
|
+
|
|
72
|
+
Or use auto-ordering to handle this automatically.
|
|
73
|
+
"""
|
|
74
|
+
@wraps(func)
|
|
75
|
+
def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
|
|
76
|
+
# Skip conversion if already in a nested decorator context
|
|
77
|
+
if is_nested_decorator():
|
|
78
|
+
results = func(*args, **kwargs)
|
|
79
|
+
return results
|
|
80
|
+
|
|
81
|
+
# Set the current decorator context
|
|
82
|
+
wrapper._current_decorator = "torch_fn"
|
|
83
|
+
|
|
84
|
+
# Store original object for type preservation
|
|
85
|
+
original_object = args[0] if args else None
|
|
86
|
+
|
|
87
|
+
converted_args, converted_kwargs = to_torch(
|
|
88
|
+
*args, return_fn=_return_always, **kwargs
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Skip strict assertion for certain types that may not convert to tensors
|
|
92
|
+
# Instead, convert what we can and pass through what we can't
|
|
93
|
+
validated_args = []
|
|
94
|
+
for arg_index, arg in enumerate(converted_args):
|
|
95
|
+
if isinstance(arg, torch.Tensor):
|
|
96
|
+
validated_args.append(arg)
|
|
97
|
+
elif isinstance(arg, (int, float, str, type(None))):
|
|
98
|
+
# Pass through scalars and strings unchanged
|
|
99
|
+
validated_args.append(arg)
|
|
100
|
+
elif isinstance(arg, list) and all(isinstance(item, torch.Tensor) for item in arg):
|
|
101
|
+
# List of tensors - pass through as is
|
|
102
|
+
validated_args.append(arg)
|
|
103
|
+
else:
|
|
104
|
+
# Try one more conversion attempt
|
|
105
|
+
try:
|
|
106
|
+
validated_args.append(torch.tensor(arg).float())
|
|
107
|
+
except:
|
|
108
|
+
# If all else fails, pass through unchanged
|
|
109
|
+
validated_args.append(arg)
|
|
110
|
+
|
|
111
|
+
results = func(*validated_args, **converted_kwargs)
|
|
112
|
+
|
|
113
|
+
# Convert results back to original input types
|
|
114
|
+
if isinstance(results, torch.Tensor):
|
|
115
|
+
if original_object is not None:
|
|
116
|
+
if isinstance(original_object, list):
|
|
117
|
+
return results.detach().cpu().numpy().tolist()
|
|
118
|
+
elif isinstance(original_object, np.ndarray):
|
|
119
|
+
return results.detach().cpu().numpy()
|
|
120
|
+
elif isinstance(original_object, pd.DataFrame):
|
|
121
|
+
return pd.DataFrame(results.detach().cpu().numpy())
|
|
122
|
+
elif isinstance(original_object, pd.Series):
|
|
123
|
+
return pd.Series(results.detach().cpu().numpy().flatten())
|
|
124
|
+
elif isinstance(original_object, xr.DataArray):
|
|
125
|
+
return xr.DataArray(results.detach().cpu().numpy())
|
|
126
|
+
return results
|
|
127
|
+
|
|
128
|
+
return results
|
|
129
|
+
|
|
130
|
+
# Mark as a wrapper for detection
|
|
131
|
+
wrapper._is_wrapper = True
|
|
132
|
+
wrapper._decorator_type = "torch_fn"
|
|
133
|
+
return wrapper
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# EOF
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 09:16:13 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_wrap.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_wrap.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def wrap(func):
|
|
14
|
+
"""Basic function wrapper that preserves function metadata.
|
|
15
|
+
Usage:
|
|
16
|
+
@wrap
|
|
17
|
+
def my_function(x):
|
|
18
|
+
return x + 1
|
|
19
|
+
# Or manually:
|
|
20
|
+
def my_function(x):
|
|
21
|
+
return x + 1
|
|
22
|
+
wrapped_func = wrap(my_function)
|
|
23
|
+
This wrapper is useful as a template for creating more complex decorators
|
|
24
|
+
or when you want to ensure function metadata is preserved.
|
|
25
|
+
"""
|
|
26
|
+
import functools
|
|
27
|
+
|
|
28
|
+
@functools.wraps(func)
|
|
29
|
+
def wrapper(*args, **kwargs):
|
|
30
|
+
return func(*args, **kwargs)
|
|
31
|
+
|
|
32
|
+
# Store reference to original function
|
|
33
|
+
wrapper._original_func = func
|
|
34
|
+
# Mark as a wrapper for detection
|
|
35
|
+
wrapper._is_wrapper = True
|
|
36
|
+
return wrapper
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# EOF
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 15:41:19 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/decorators/_xarray_fn.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/decorators/_xarray_fn.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
from functools import wraps
|
|
12
|
+
from typing import Any as _Any
|
|
13
|
+
from typing import Callable
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
import pandas as pd
|
|
17
|
+
import torch
|
|
18
|
+
import xarray as xr
|
|
19
|
+
|
|
20
|
+
from ._converters import is_nested_decorator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def xarray_fn(func: Callable) -> Callable:
|
|
24
|
+
@wraps(func)
|
|
25
|
+
def wrapper(*args: _Any, **kwargs: _Any) -> _Any:
|
|
26
|
+
# Skip conversion if already in a nested decorator context
|
|
27
|
+
if is_nested_decorator():
|
|
28
|
+
results = func(*args, **kwargs)
|
|
29
|
+
return results
|
|
30
|
+
|
|
31
|
+
# Set the current decorator context
|
|
32
|
+
wrapper._current_decorator = "xarray_fn"
|
|
33
|
+
|
|
34
|
+
# Store original object for type preservation
|
|
35
|
+
original_object = args[0] if args else None
|
|
36
|
+
|
|
37
|
+
# Convert args to xarray DataArrays
|
|
38
|
+
def to_xarray(data):
|
|
39
|
+
if isinstance(data, xr.DataArray):
|
|
40
|
+
return data
|
|
41
|
+
elif isinstance(data, np.ndarray):
|
|
42
|
+
return xr.DataArray(data)
|
|
43
|
+
elif isinstance(data, list):
|
|
44
|
+
return xr.DataArray(data)
|
|
45
|
+
elif isinstance(data, torch.Tensor):
|
|
46
|
+
return xr.DataArray(data.detach().cpu().numpy())
|
|
47
|
+
elif isinstance(data, pd.DataFrame):
|
|
48
|
+
return xr.DataArray(data.values)
|
|
49
|
+
elif isinstance(data, pd.Series):
|
|
50
|
+
return xr.DataArray(data.values)
|
|
51
|
+
else:
|
|
52
|
+
return xr.DataArray([data])
|
|
53
|
+
|
|
54
|
+
converted_args = [to_xarray(arg) for arg in args]
|
|
55
|
+
converted_kwargs = {k: to_xarray(v) for k, v in kwargs.items()}
|
|
56
|
+
|
|
57
|
+
# Assertion to ensure all args are converted to xarray DataArrays
|
|
58
|
+
for arg_index, arg in enumerate(converted_args):
|
|
59
|
+
assert isinstance(
|
|
60
|
+
arg, xr.DataArray
|
|
61
|
+
), f"Argument {arg_index} not converted to DataArray: {type(arg)}"
|
|
62
|
+
|
|
63
|
+
results = func(*converted_args, **converted_kwargs)
|
|
64
|
+
|
|
65
|
+
# Convert results back to original input types
|
|
66
|
+
if isinstance(results, xr.DataArray):
|
|
67
|
+
if original_object is not None:
|
|
68
|
+
if isinstance(original_object, list):
|
|
69
|
+
return results.values.tolist()
|
|
70
|
+
elif isinstance(original_object, np.ndarray):
|
|
71
|
+
return results.values
|
|
72
|
+
elif isinstance(original_object, torch.Tensor):
|
|
73
|
+
return torch.tensor(results.values)
|
|
74
|
+
elif isinstance(original_object, pd.DataFrame):
|
|
75
|
+
return pd.DataFrame(results.values)
|
|
76
|
+
elif isinstance(original_object, pd.Series):
|
|
77
|
+
return pd.Series(results.values.flatten())
|
|
78
|
+
return results
|
|
79
|
+
|
|
80
|
+
return results
|
|
81
|
+
|
|
82
|
+
# Mark as a wrapper for detection
|
|
83
|
+
wrapper._is_wrapper = True
|
|
84
|
+
wrapper._decorator_type = "xarray_fn"
|
|
85
|
+
return wrapper
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# EOF
|
scitex/dev/__init__.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex dev module."""
|
|
3
|
+
|
|
4
|
+
from ._analyze_code_flow import CodeFlowAnalyzer, analyze_code_flow, main, parse_args
|
|
5
|
+
from ._reload import reload, reload_auto, reload_stop
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"CodeFlowAnalyzer",
|
|
9
|
+
"analyze_code_flow",
|
|
10
|
+
"main",
|
|
11
|
+
"parse_args",
|
|
12
|
+
"reload",
|
|
13
|
+
"reload_auto",
|
|
14
|
+
"reload_stop",
|
|
15
|
+
]
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-20 10:27:28 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/dev/_analyze_code_flow.py
|
|
5
|
+
|
|
6
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/dev/_analyze_code_flow.py"
|
|
7
|
+
|
|
8
|
+
import ast
|
|
9
|
+
|
|
10
|
+
import matplotlib.pyplot as plt
|
|
11
|
+
import scitex
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CodeFlowAnalyzer:
|
|
15
|
+
def __init__(self, file_path: str):
|
|
16
|
+
self.file_path = file_path
|
|
17
|
+
self.execution_flow = []
|
|
18
|
+
self.sequence = 1
|
|
19
|
+
self.skip_functions = {
|
|
20
|
+
"__init__",
|
|
21
|
+
"__main__",
|
|
22
|
+
# Python built-ins
|
|
23
|
+
"len",
|
|
24
|
+
"min",
|
|
25
|
+
"max",
|
|
26
|
+
"sum",
|
|
27
|
+
"enumerate",
|
|
28
|
+
"eval",
|
|
29
|
+
"print",
|
|
30
|
+
"str",
|
|
31
|
+
"int",
|
|
32
|
+
"float",
|
|
33
|
+
"list",
|
|
34
|
+
"dict",
|
|
35
|
+
"set",
|
|
36
|
+
"tuple",
|
|
37
|
+
"any",
|
|
38
|
+
"all",
|
|
39
|
+
"map",
|
|
40
|
+
"filter",
|
|
41
|
+
"zip",
|
|
42
|
+
# Common DataFrame operations
|
|
43
|
+
"apply",
|
|
44
|
+
"unique",
|
|
45
|
+
"tolist",
|
|
46
|
+
"to_list",
|
|
47
|
+
"rename",
|
|
48
|
+
"merge",
|
|
49
|
+
"set_index",
|
|
50
|
+
"reset_index",
|
|
51
|
+
"groupby",
|
|
52
|
+
"sort_values",
|
|
53
|
+
"iloc",
|
|
54
|
+
"loc",
|
|
55
|
+
"where",
|
|
56
|
+
# NumPy operations
|
|
57
|
+
"reshape",
|
|
58
|
+
"squeeze",
|
|
59
|
+
"stack",
|
|
60
|
+
"concatenate",
|
|
61
|
+
"array",
|
|
62
|
+
"zeros",
|
|
63
|
+
"ones",
|
|
64
|
+
"full",
|
|
65
|
+
"empty",
|
|
66
|
+
"frombuffer",
|
|
67
|
+
# Common attributes/methods
|
|
68
|
+
"shape",
|
|
69
|
+
"dtype",
|
|
70
|
+
"size",
|
|
71
|
+
"index",
|
|
72
|
+
"columns",
|
|
73
|
+
"values",
|
|
74
|
+
"name",
|
|
75
|
+
"names",
|
|
76
|
+
# File operations
|
|
77
|
+
"open",
|
|
78
|
+
"read",
|
|
79
|
+
"write",
|
|
80
|
+
"close",
|
|
81
|
+
# String operations
|
|
82
|
+
"join",
|
|
83
|
+
"split",
|
|
84
|
+
"strip",
|
|
85
|
+
"replace",
|
|
86
|
+
# Custom
|
|
87
|
+
"scitex.str.printc",
|
|
88
|
+
"printc",
|
|
89
|
+
"scitex.io.load_configs",
|
|
90
|
+
"parse_args",
|
|
91
|
+
"run_main",
|
|
92
|
+
"load_configs",
|
|
93
|
+
}
|
|
94
|
+
# self.seen_calls = set() # Track unique function calls
|
|
95
|
+
|
|
96
|
+
def _trace_calls(self, node, depth=0):
|
|
97
|
+
sequence_orig = self.sequence
|
|
98
|
+
|
|
99
|
+
if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
|
|
100
|
+
|
|
101
|
+
if node.name not in self.skip_functions:
|
|
102
|
+
# Track all function definitions
|
|
103
|
+
self.execution_flow.append((depth, node.name, self.sequence))
|
|
104
|
+
self.sequence += 1
|
|
105
|
+
|
|
106
|
+
if isinstance(node, ast.Call):
|
|
107
|
+
if isinstance(node.func, ast.Name):
|
|
108
|
+
func_name = node.func.id
|
|
109
|
+
|
|
110
|
+
if func_name not in self.skip_functions:
|
|
111
|
+
self.execution_flow.append((depth, func_name, self.sequence))
|
|
112
|
+
self.sequence += 1
|
|
113
|
+
|
|
114
|
+
elif isinstance(node.func, ast.Attribute):
|
|
115
|
+
parts = []
|
|
116
|
+
current = node.func
|
|
117
|
+
while isinstance(current, ast.Attribute):
|
|
118
|
+
parts.insert(0, current.attr)
|
|
119
|
+
current = current.value
|
|
120
|
+
if isinstance(current, ast.Name):
|
|
121
|
+
parts.insert(0, current.id)
|
|
122
|
+
func_name = ".".join(parts)
|
|
123
|
+
|
|
124
|
+
if not any(skip in func_name for skip in self.skip_functions):
|
|
125
|
+
self.execution_flow.append((depth, func_name, self.sequence))
|
|
126
|
+
self.sequence += 1
|
|
127
|
+
|
|
128
|
+
if self.sequence == 1:
|
|
129
|
+
depth = 0
|
|
130
|
+
|
|
131
|
+
for child in ast.iter_child_nodes(node):
|
|
132
|
+
self._trace_calls(child, depth + 1)
|
|
133
|
+
|
|
134
|
+
def _get_func_name(self, node):
|
|
135
|
+
if isinstance(node.func, ast.Name):
|
|
136
|
+
return node.func.id
|
|
137
|
+
elif isinstance(node.func, ast.Attribute):
|
|
138
|
+
parts = []
|
|
139
|
+
current = node.func
|
|
140
|
+
while isinstance(current, ast.Attribute):
|
|
141
|
+
parts.insert(0, current.attr)
|
|
142
|
+
current = current.value
|
|
143
|
+
if isinstance(current, ast.Name):
|
|
144
|
+
parts.insert(0, current.id)
|
|
145
|
+
func_name = ".".join(parts)
|
|
146
|
+
return (
|
|
147
|
+
func_name
|
|
148
|
+
if not any(skip in func_name for skip in self.skip_functions)
|
|
149
|
+
else None
|
|
150
|
+
)
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
def _format_output(self):
|
|
154
|
+
output = ["Execution Flow:"]
|
|
155
|
+
last_depth = 1
|
|
156
|
+
skip_until_depth = None
|
|
157
|
+
|
|
158
|
+
filtered_flow = []
|
|
159
|
+
|
|
160
|
+
for depth, call, seq in self.execution_flow:
|
|
161
|
+
|
|
162
|
+
# Start skipping when encountering private method
|
|
163
|
+
if call.startswith(("_", "self._")):
|
|
164
|
+
skip_until_depth = depth
|
|
165
|
+
continue
|
|
166
|
+
|
|
167
|
+
# Skip all nested calls within private methods
|
|
168
|
+
if skip_until_depth is not None and depth > skip_until_depth:
|
|
169
|
+
continue
|
|
170
|
+
else:
|
|
171
|
+
skip_until_depth = None
|
|
172
|
+
|
|
173
|
+
filtered_flow.append((depth, call, seq))
|
|
174
|
+
last_depth = depth
|
|
175
|
+
|
|
176
|
+
# Reset seq on depth == 1
|
|
177
|
+
seq_prev = 0
|
|
178
|
+
for ii, flow in enumerate(filtered_flow):
|
|
179
|
+
depth, call, seq = flow
|
|
180
|
+
if depth == 1:
|
|
181
|
+
seq_current = 1
|
|
182
|
+
seq_prev = 1
|
|
183
|
+
else:
|
|
184
|
+
if depth > 1:
|
|
185
|
+
seq_current = seq_prev + 1
|
|
186
|
+
seq_prev = seq_current
|
|
187
|
+
else:
|
|
188
|
+
seq_current = 0
|
|
189
|
+
seq_prev = 0
|
|
190
|
+
|
|
191
|
+
filtered_flow[ii] = (depth, call, seq_current)
|
|
192
|
+
|
|
193
|
+
for depth, call, seq in filtered_flow:
|
|
194
|
+
prefix = " " * depth
|
|
195
|
+
if depth == 1:
|
|
196
|
+
line = f"\n{prefix}[{int(seq) if isinstance(seq, float) else seq:02d}] {call}"
|
|
197
|
+
else:
|
|
198
|
+
line = f"{prefix}[{int(seq) if isinstance(seq, float) else seq:02d}] └── {call}"
|
|
199
|
+
output.append(line)
|
|
200
|
+
|
|
201
|
+
return "\n".join(output)
|
|
202
|
+
|
|
203
|
+
def analyze(self):
|
|
204
|
+
if self.file_path:
|
|
205
|
+
try:
|
|
206
|
+
with open(self.file_path, "r") as file:
|
|
207
|
+
content = file.read()
|
|
208
|
+
|
|
209
|
+
# Find main guard position and truncate content
|
|
210
|
+
if "if __name__" in content:
|
|
211
|
+
main_guard_pos = content.find("if __name__")
|
|
212
|
+
content = content[:main_guard_pos].strip()
|
|
213
|
+
|
|
214
|
+
tree = ast.parse(content)
|
|
215
|
+
self._trace_calls(tree)
|
|
216
|
+
return self._format_output()
|
|
217
|
+
except Exception as e:
|
|
218
|
+
print(e)
|
|
219
|
+
return str(e)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def analyze_code_flow(lpath):
|
|
223
|
+
return CodeFlowAnalyzer(lpath).analyze()
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def main(args):
|
|
227
|
+
diagram = analyze_code_flow(__file__)
|
|
228
|
+
print(diagram)
|
|
229
|
+
return 0
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def parse_args():
|
|
233
|
+
import argparse
|
|
234
|
+
|
|
235
|
+
import scitex
|
|
236
|
+
|
|
237
|
+
is_script = scitex.gen.is_script()
|
|
238
|
+
|
|
239
|
+
parser = argparse.ArgumentParser(description="")
|
|
240
|
+
parser.add_argument(
|
|
241
|
+
"--var",
|
|
242
|
+
"-v",
|
|
243
|
+
type=int,
|
|
244
|
+
choices=None,
|
|
245
|
+
default=1,
|
|
246
|
+
help="(default: %%(default)s)",
|
|
247
|
+
)
|
|
248
|
+
parser.add_argument(
|
|
249
|
+
"--flag",
|
|
250
|
+
"-f",
|
|
251
|
+
action="store_true",
|
|
252
|
+
default=False,
|
|
253
|
+
help="(default: %%(default)s)",
|
|
254
|
+
)
|
|
255
|
+
args = parser.parse_args()
|
|
256
|
+
scitex.str.printc(args, c="yellow")
|
|
257
|
+
|
|
258
|
+
return args
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
if __name__ == "__main__":
|
|
262
|
+
import sys
|
|
263
|
+
|
|
264
|
+
import matplotlib.pyplot as plt
|
|
265
|
+
|
|
266
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
|
|
267
|
+
sys,
|
|
268
|
+
plt,
|
|
269
|
+
verbose=False,
|
|
270
|
+
agg=True,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
exit_status = main(parse_args())
|
|
274
|
+
|
|
275
|
+
scitex.gen.close(
|
|
276
|
+
CONFIG,
|
|
277
|
+
verbose=False,
|
|
278
|
+
notify=False,
|
|
279
|
+
message="",
|
|
280
|
+
exit_status=exit_status,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
# EOF
|
scitex/dev/_reload.py
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-07 17:17:06 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/dev/_reload.py
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
import importlib
|
|
8
|
+
import sys
|
|
9
|
+
import threading
|
|
10
|
+
import time
|
|
11
|
+
from typing import Any, Optional
|
|
12
|
+
|
|
13
|
+
_reload_thread: Optional[threading.Thread] = None
|
|
14
|
+
_running: bool = False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def reload() -> Any: # Changed return type hint to Any
|
|
18
|
+
"""Reloads scitex package and its submodules."""
|
|
19
|
+
import scitex
|
|
20
|
+
|
|
21
|
+
scitex_modules = [mod for mod in sys.modules if mod.startswith("scitex")]
|
|
22
|
+
for module in scitex_modules:
|
|
23
|
+
try:
|
|
24
|
+
importlib.reload(sys.modules[module])
|
|
25
|
+
except Exception:
|
|
26
|
+
pass
|
|
27
|
+
return importlib.reload(scitex)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def reload_auto(interval: int = 10) -> None:
|
|
31
|
+
"""Start auto-reload in background thread."""
|
|
32
|
+
global _reload_thread, _running
|
|
33
|
+
|
|
34
|
+
if _reload_thread and _reload_thread.is_alive():
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
_running = True
|
|
38
|
+
_reload_thread = threading.Thread(
|
|
39
|
+
target=_auto_reload_loop, args=(interval,), daemon=True
|
|
40
|
+
)
|
|
41
|
+
_reload_thread.start()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def reload_stop() -> None:
|
|
45
|
+
"""Stop auto-reload."""
|
|
46
|
+
global _running
|
|
47
|
+
_running = False
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _auto_reload_loop(interval: int) -> None:
|
|
51
|
+
while _running:
|
|
52
|
+
try:
|
|
53
|
+
reload()
|
|
54
|
+
except Exception as e:
|
|
55
|
+
print(f"Reload failed: {e}")
|
|
56
|
+
time.sleep(interval)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# EOF
|