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
scitex/tex/_to_vec.py
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
|
|
4
|
+
# File: ./src/scitex/tex/_to_vec.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
LaTeX vector notation with fallback mechanisms.
|
|
8
|
+
|
|
9
|
+
Functionality:
|
|
10
|
+
- Convert strings to LaTeX vector notation with automatic fallback
|
|
11
|
+
- Handle LaTeX rendering failures gracefully
|
|
12
|
+
Input:
|
|
13
|
+
String representation of vector
|
|
14
|
+
Output:
|
|
15
|
+
LaTeX vector notation with fallback support
|
|
16
|
+
Prerequisites:
|
|
17
|
+
scitex.str._latex_fallback
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from ..str._latex_fallback import safe_latex_render, latex_fallback_decorator
|
|
22
|
+
FALLBACK_AVAILABLE = True
|
|
23
|
+
except ImportError:
|
|
24
|
+
FALLBACK_AVAILABLE = False
|
|
25
|
+
def latex_fallback_decorator(fallback_strategy="auto", preserve_math=True):
|
|
26
|
+
def decorator(func):
|
|
27
|
+
return func
|
|
28
|
+
return decorator
|
|
29
|
+
|
|
30
|
+
def safe_latex_render(text, fallback_strategy="auto", preserve_math=True):
|
|
31
|
+
return text
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
35
|
+
def to_vec(v_str, enable_fallback=True, fallback_strategy="auto"):
|
|
36
|
+
r"""
|
|
37
|
+
Convert a string to LaTeX vector notation with automatic fallback.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
v_str : str
|
|
42
|
+
String representation of the vector
|
|
43
|
+
enable_fallback : bool, optional
|
|
44
|
+
Whether to enable LaTeX fallback mechanisms, by default True
|
|
45
|
+
fallback_strategy : str, optional
|
|
46
|
+
Fallback strategy: "auto", "mathtext", "unicode", "plain", by default "auto"
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
str
|
|
51
|
+
LaTeX representation of the vector with automatic fallback
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> vector = to_vec("AB")
|
|
56
|
+
>>> print(vector) # LaTeX: \overrightarrow{\mathrm{AB}}
|
|
57
|
+
|
|
58
|
+
>>> vector = to_vec("AB") # Falls back to unicode if LaTeX fails
|
|
59
|
+
>>> print(vector) # Unicode: A⃗B or AB⃗
|
|
60
|
+
|
|
61
|
+
Notes
|
|
62
|
+
-----
|
|
63
|
+
If LaTeX rendering fails, this function automatically falls back to:
|
|
64
|
+
- mathtext: Uses matplotlib's built-in math rendering
|
|
65
|
+
- unicode: Uses Unicode vector symbols (⃗)
|
|
66
|
+
- plain: Returns plain text with "vec()" notation
|
|
67
|
+
"""
|
|
68
|
+
if not v_str:
|
|
69
|
+
return ""
|
|
70
|
+
|
|
71
|
+
# Create LaTeX vector notation
|
|
72
|
+
latex_vector = f"\\overrightarrow{{\\mathrm{{{v_str}}}}}"
|
|
73
|
+
|
|
74
|
+
if enable_fallback and FALLBACK_AVAILABLE:
|
|
75
|
+
# Custom fallback handling for vectors
|
|
76
|
+
if fallback_strategy == "auto":
|
|
77
|
+
# Try mathtext first, then unicode
|
|
78
|
+
try:
|
|
79
|
+
mathtext_result = safe_latex_render(f"${latex_vector}$", "mathtext")
|
|
80
|
+
return mathtext_result
|
|
81
|
+
except Exception:
|
|
82
|
+
# Fall back to unicode vector notation
|
|
83
|
+
return f"{v_str}⃗" # Unicode combining right arrow above
|
|
84
|
+
elif fallback_strategy == "unicode":
|
|
85
|
+
return f"{v_str}⃗" # Unicode combining right arrow above
|
|
86
|
+
elif fallback_strategy == "plain":
|
|
87
|
+
return f"vec({v_str})"
|
|
88
|
+
else:
|
|
89
|
+
return safe_latex_render(f"${latex_vector}$", fallback_strategy)
|
|
90
|
+
else:
|
|
91
|
+
return latex_vector
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def safe_to_vec(v_str, fallback_strategy="auto"):
|
|
95
|
+
"""
|
|
96
|
+
Safe version of to_vec with explicit fallback control.
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
v_str : str
|
|
101
|
+
String representation of the vector
|
|
102
|
+
fallback_strategy : str, optional
|
|
103
|
+
Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
|
|
104
|
+
|
|
105
|
+
Returns
|
|
106
|
+
-------
|
|
107
|
+
str
|
|
108
|
+
Vector notation with specified fallback behavior
|
|
109
|
+
"""
|
|
110
|
+
return to_vec(v_str, enable_fallback=True, fallback_strategy=fallback_strategy)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# Backward compatibility
|
|
114
|
+
vector_notation = to_vec
|
|
115
|
+
|
|
116
|
+
# EOF
|
scitex/torch/__init__.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex torch module."""
|
|
3
|
+
|
|
4
|
+
from ._apply_to import apply_to
|
|
5
|
+
from ._nan_funcs import nanargmax, nanargmin, nancumprod, nancumsum, nanmax, nanmin, nanprod, nanstd, nanvar
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"apply_to",
|
|
9
|
+
"nanargmax",
|
|
10
|
+
"nanargmin",
|
|
11
|
+
"nancumprod",
|
|
12
|
+
"nancumsum",
|
|
13
|
+
"nanmax",
|
|
14
|
+
"nanmin",
|
|
15
|
+
"nanprod",
|
|
16
|
+
"nanstd",
|
|
17
|
+
"nanvar",
|
|
18
|
+
]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-31 08:11:45 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
import torch
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def apply_to(fn, x, dim):
|
|
9
|
+
"""
|
|
10
|
+
Example:
|
|
11
|
+
x = torch.randn(2, 3, 4)
|
|
12
|
+
fn = sum
|
|
13
|
+
apply_to(fn, x, 1).shape # (2, 1, 4)
|
|
14
|
+
"""
|
|
15
|
+
if dim != -1:
|
|
16
|
+
dims = list(range(x.dim()))
|
|
17
|
+
dims[-1], dims[dim] = dims[dim], dims[-1]
|
|
18
|
+
x = x.permute(*dims)
|
|
19
|
+
|
|
20
|
+
# Flatten the tensor along the time dimension
|
|
21
|
+
shape = x.shape
|
|
22
|
+
x = x.reshape(-1, shape[-1])
|
|
23
|
+
|
|
24
|
+
# Apply the function to each slice along the time dimension
|
|
25
|
+
applied = torch.stack([fn(x_i) for x_i in torch.unbind(x, dim=0)], dim=0)
|
|
26
|
+
|
|
27
|
+
# Reshape the tensor to its original shape (with the time dimension at the end)
|
|
28
|
+
applied = applied.reshape(*shape[:-1], -1)
|
|
29
|
+
|
|
30
|
+
# Permute back to the original dimension order if necessary
|
|
31
|
+
if dim != -1:
|
|
32
|
+
applied = applied.permute(*dims)
|
|
33
|
+
|
|
34
|
+
return applied
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-10-28 19:38:19 (ywatanabe)"
|
|
4
|
+
# /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/torch/_nan_funcs.py
|
|
5
|
+
|
|
6
|
+
import torch as _torch
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# https://github.com/pytorch/pytorch/issues/61474
|
|
10
|
+
def nanmax(tensor, dim=None, keepdim=False):
|
|
11
|
+
min_value = _torch.finfo(tensor.dtype).min
|
|
12
|
+
if dim is None:
|
|
13
|
+
output = tensor.nan_to_num(min_value).max()
|
|
14
|
+
else:
|
|
15
|
+
output = tensor.nan_to_num(min_value).max(dim=dim, keepdim=keepdim)
|
|
16
|
+
return output
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def nanmin(tensor, dim=None, keepdim=False):
|
|
20
|
+
max_value = _torch.finfo(tensor.dtype).max
|
|
21
|
+
if dim is None:
|
|
22
|
+
output = tensor.nan_to_num(max_value).min()
|
|
23
|
+
else:
|
|
24
|
+
output = tensor.nan_to_num(max_value).min(dim=dim, keepdim=keepdim)
|
|
25
|
+
return output
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def nanvar(tensor, dim=None, keepdim=False):
|
|
29
|
+
tensor_mean = tensor.nanmean(dim=dim, keepdim=True)
|
|
30
|
+
output = (tensor - tensor_mean).square().nanmean(dim=dim, keepdim=keepdim)
|
|
31
|
+
return output
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def nanstd(tensor, dim=None, keepdim=False):
|
|
35
|
+
output = nanvar(tensor, dim=dim, keepdim=keepdim)
|
|
36
|
+
output = output.sqrt()
|
|
37
|
+
return output
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def nanprod(tensor, dim=None, keepdim=False):
|
|
41
|
+
if dim is None:
|
|
42
|
+
output = tensor.nan_to_num(1).prod()
|
|
43
|
+
else:
|
|
44
|
+
output = tensor.nan_to_num(1).prod(dim=dim, keepdim=keepdim)
|
|
45
|
+
return output
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def nancumprod(tensor, dim=None, keepdim=False):
|
|
49
|
+
if dim is None:
|
|
50
|
+
dim = 0 # Default to first dimension for cumulative operations
|
|
51
|
+
output = tensor.nan_to_num(1).cumprod(dim=dim)
|
|
52
|
+
return output
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def nancumsum(tensor, dim=None, keepdim=False):
|
|
56
|
+
if dim is None:
|
|
57
|
+
dim = 0 # Default to first dimension for cumulative operations
|
|
58
|
+
output = tensor.nan_to_num(0).cumsum(dim=dim)
|
|
59
|
+
return output
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def nanargmin(tensor, dim=None, keepdim=False):
|
|
63
|
+
max_value = _torch.finfo(tensor.dtype).max
|
|
64
|
+
if dim is None:
|
|
65
|
+
output = tensor.nan_to_num(max_value).argmin()
|
|
66
|
+
else:
|
|
67
|
+
output = tensor.nan_to_num(max_value).argmin(dim=dim, keepdim=keepdim)
|
|
68
|
+
return output
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def nanargmax(tensor, dim=None, keepdim=False):
|
|
72
|
+
min_value = _torch.finfo(tensor.dtype).min
|
|
73
|
+
if dim is None:
|
|
74
|
+
output = tensor.nan_to_num(min_value).argmax()
|
|
75
|
+
else:
|
|
76
|
+
output = tensor.nan_to_num(min_value).argmax(dim=dim, keepdim=keepdim)
|
|
77
|
+
return output
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 09:21:23 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_ArrayLike.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/types/_ArrayLike.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from typing import List as _List
|
|
13
|
+
from typing import Tuple as _Tuple
|
|
14
|
+
from typing import Union as _Union
|
|
15
|
+
|
|
16
|
+
import numpy as _np
|
|
17
|
+
import pandas as _pd
|
|
18
|
+
import torch as _torch
|
|
19
|
+
import xarray as _xr
|
|
20
|
+
|
|
21
|
+
ArrayLike = _Union[
|
|
22
|
+
_List,
|
|
23
|
+
_Tuple,
|
|
24
|
+
_np.ndarray,
|
|
25
|
+
_pd.Series,
|
|
26
|
+
_pd.DataFrame,
|
|
27
|
+
_xr.DataArray,
|
|
28
|
+
_torch.tensor,
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def is_array_like(obj) -> bool:
|
|
33
|
+
"""Check if object is array-like.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
bool: True if object is array-like, False otherwise.
|
|
37
|
+
"""
|
|
38
|
+
return isinstance(
|
|
39
|
+
obj,
|
|
40
|
+
(_List, _Tuple, _np.ndarray, _pd.Series, _pd.DataFrame, _xr.DataArray),
|
|
41
|
+
) or _torch.is_tensor(obj)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# EOF
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 17:09:16 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_ColorLike.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/types/_ColorLike.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
from typing import List, Tuple, Union
|
|
12
|
+
|
|
13
|
+
# Define ColorLike type
|
|
14
|
+
ColorLike = Union[
|
|
15
|
+
str,
|
|
16
|
+
Tuple[float, float, float],
|
|
17
|
+
Tuple[float, float, float, float],
|
|
18
|
+
List[float],
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
# EOF
|
scitex/types/__init__.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex types module."""
|
|
3
|
+
|
|
4
|
+
from ._ArrayLike import ArrayLike, is_array_like
|
|
5
|
+
from ._ColorLike import ColorLike
|
|
6
|
+
from ._is_listed_X import is_list_of_type, is_listed_X
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"ArrayLike",
|
|
10
|
+
"ColorLike",
|
|
11
|
+
"is_array_like",
|
|
12
|
+
"is_list_of_type",
|
|
13
|
+
"is_listed_X",
|
|
14
|
+
]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 17:10:53 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/types/_is_listed_X.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/types/_is_listed_X.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def is_listed_X(obj, types):
|
|
14
|
+
"""
|
|
15
|
+
Check if obj is a list where all elements are of one of the specified types.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
obj: Object to check
|
|
19
|
+
types: Type or list of types to check against
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
obj = [3, 2, 1, 5]
|
|
23
|
+
is_listed_X(obj, int) # Returns True
|
|
24
|
+
is_listed_X(obj, (int, float)) # Returns True
|
|
25
|
+
is_listed_X(obj, str) # Returns False
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
bool: True if obj is a list and all elements are of one of the specified types
|
|
29
|
+
"""
|
|
30
|
+
import numpy as np
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
condition_list = isinstance(obj, list)
|
|
34
|
+
|
|
35
|
+
if not (isinstance(types, list) or isinstance(types, tuple)):
|
|
36
|
+
types = [types]
|
|
37
|
+
|
|
38
|
+
_conditions_susp = []
|
|
39
|
+
for typ in types:
|
|
40
|
+
_conditions_susp.append(
|
|
41
|
+
(np.array([isinstance(o, typ) for o in obj]) == True).all()
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
condition_susp = np.any(_conditions_susp)
|
|
45
|
+
|
|
46
|
+
_is_listed_X = np.all([condition_list, condition_susp])
|
|
47
|
+
return _is_listed_X
|
|
48
|
+
|
|
49
|
+
except:
|
|
50
|
+
return False
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# More conventional alias
|
|
54
|
+
def is_list_of_type(obj, types):
|
|
55
|
+
"""
|
|
56
|
+
Check if obj is a list where all elements are of one of the specified types.
|
|
57
|
+
|
|
58
|
+
This is an alias for is_listed_X with a more conventional name.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
obj: Object to check
|
|
62
|
+
types: Type or list of types to check against
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
bool: True if obj is a list and all elements are of one of the specified types
|
|
66
|
+
"""
|
|
67
|
+
return is_listed_X(obj, types)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# EOF
|
scitex/utils/__init__.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex utils module."""
|
|
3
|
+
|
|
4
|
+
from ._compress_hdf5 import compress_hdf5
|
|
5
|
+
from ._email import ansi_escape, send_gmail
|
|
6
|
+
from ._grid import count_grids, yield_grids
|
|
7
|
+
from ._notify import gen_footer, get_git_branch, get_hostname, get_username, notify
|
|
8
|
+
from ._search import search
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ansi_escape",
|
|
12
|
+
"compress_hdf5",
|
|
13
|
+
"count_grids",
|
|
14
|
+
"gen_footer",
|
|
15
|
+
"get_git_branch",
|
|
16
|
+
"get_hostname",
|
|
17
|
+
"get_username",
|
|
18
|
+
"notify",
|
|
19
|
+
"search",
|
|
20
|
+
"send_gmail",
|
|
21
|
+
"yield_grids",
|
|
22
|
+
]
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-10 08:26:28 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/utils/_compress_hdf5.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "/ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/utils/_compress_hdf5.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
import h5py
|
|
12
|
+
import numpy as np
|
|
13
|
+
from tqdm import tqdm
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def compress_hdf5(input_file, output_file=None, compression_level=4):
|
|
17
|
+
"""
|
|
18
|
+
Compress an existing HDF5 file by reading all datasets and rewriting them with compression.
|
|
19
|
+
|
|
20
|
+
Parameters:
|
|
21
|
+
-----------
|
|
22
|
+
input_file : str
|
|
23
|
+
Path to the input HDF5 file
|
|
24
|
+
output_file : str, optional
|
|
25
|
+
Path to the output compressed HDF5 file. If None, will use input_file + '.compressed.h5'
|
|
26
|
+
compression_level : int, optional
|
|
27
|
+
Compression level (1-9), higher means more compression but slower processing
|
|
28
|
+
"""
|
|
29
|
+
if output_file is None:
|
|
30
|
+
base, ext = os.path.splitext(input_file)
|
|
31
|
+
output_file = f"{base}.compressed{ext}"
|
|
32
|
+
|
|
33
|
+
print(f"Compressing {input_file} to {output_file}")
|
|
34
|
+
|
|
35
|
+
with h5py.File(input_file, "r") as src, h5py.File(output_file, "w") as dst:
|
|
36
|
+
# Copy file attributes
|
|
37
|
+
for key, value in src.attrs.items():
|
|
38
|
+
dst.attrs[key] = value
|
|
39
|
+
|
|
40
|
+
def copy_dataset(name, obj):
|
|
41
|
+
if isinstance(obj, h5py.Dataset):
|
|
42
|
+
# Print progress for large datasets
|
|
43
|
+
if len(obj.shape) > 0 and obj.shape[0] > 1000000:
|
|
44
|
+
print(f"Processing large dataset {name} with shape {obj.shape}")
|
|
45
|
+
|
|
46
|
+
# Get original dataset attributes
|
|
47
|
+
chunks = True # Let h5py choose chunking
|
|
48
|
+
if obj.chunks is not None:
|
|
49
|
+
chunks = obj.chunks
|
|
50
|
+
|
|
51
|
+
# Create the compressed dataset
|
|
52
|
+
compressed_data = dst.create_dataset(
|
|
53
|
+
name,
|
|
54
|
+
shape=obj.shape,
|
|
55
|
+
dtype=obj.dtype,
|
|
56
|
+
compression="gzip",
|
|
57
|
+
compression_opts=compression_level,
|
|
58
|
+
chunks=chunks,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Copy data and attributes
|
|
62
|
+
if len(obj.shape) > 0 and obj.shape[0] > 10000000:
|
|
63
|
+
# Process large datasets in chunks to avoid memory issues
|
|
64
|
+
chunk_size = 5000000 # Adjust based on your available RAM
|
|
65
|
+
for i in tqdm(
|
|
66
|
+
range(0, obj.shape[0], chunk_size), desc=f"Copying {name}"
|
|
67
|
+
):
|
|
68
|
+
end = min(i + chunk_size, obj.shape[0])
|
|
69
|
+
if len(obj.shape) == 1:
|
|
70
|
+
compressed_data[i:end] = obj[i:end]
|
|
71
|
+
else:
|
|
72
|
+
compressed_data[i:end, ...] = obj[i:end, ...]
|
|
73
|
+
else:
|
|
74
|
+
# Small enough to copy at once
|
|
75
|
+
compressed_data[()] = obj[()]
|
|
76
|
+
|
|
77
|
+
# Copy dataset attributes
|
|
78
|
+
for key, value in obj.attrs.items():
|
|
79
|
+
compressed_data.attrs[key] = value
|
|
80
|
+
|
|
81
|
+
elif isinstance(obj, h5py.Group):
|
|
82
|
+
# Create group in destination file
|
|
83
|
+
group = dst.create_group(name)
|
|
84
|
+
# Copy group attributes
|
|
85
|
+
for key, value in obj.attrs.items():
|
|
86
|
+
group.attrs[key] = value
|
|
87
|
+
|
|
88
|
+
# Process all objects in the file
|
|
89
|
+
src.visititems(copy_dataset)
|
|
90
|
+
|
|
91
|
+
print(
|
|
92
|
+
f"Compression complete. Original size: {os.path.getsize(input_file)/1e9:.2f} GB, "
|
|
93
|
+
f"New size: {os.path.getsize(output_file)/1e9:.2f} GB"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return output_file
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import argparse
|
|
101
|
+
|
|
102
|
+
parser = argparse.ArgumentParser(
|
|
103
|
+
description="Compress existing HDF5 files with gzip compression"
|
|
104
|
+
)
|
|
105
|
+
parser.add_argument("input_file", help="Path to the input HDF5 file")
|
|
106
|
+
parser.add_argument(
|
|
107
|
+
"--output_file", help="Path to the output compressed HDF5 file", default=None
|
|
108
|
+
)
|
|
109
|
+
parser.add_argument(
|
|
110
|
+
"--compression", type=int, help="Compression level (1-9)", default=4
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
args = parser.parse_args()
|
|
114
|
+
compress_existing_h5(args.input_file, args.output_file, args.compression)
|
|
115
|
+
|
|
116
|
+
# EOF
|
scitex/utils/_email.py
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-03 06:33:08 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/utils/_email.py
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import smtplib
|
|
8
|
+
from email import encoders
|
|
9
|
+
from email.mime.base import MIMEBase as _MIMEBase
|
|
10
|
+
from email.mime.multipart import MIMEMultipart as _MIMEMultipart
|
|
11
|
+
from email.mime.text import MIMEText as _MIMEText
|
|
12
|
+
import mimetypes
|
|
13
|
+
|
|
14
|
+
from ..reproduce._gen_ID import gen_ID
|
|
15
|
+
|
|
16
|
+
import re
|
|
17
|
+
|
|
18
|
+
ansi_escape = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def send_gmail(
|
|
22
|
+
sender_gmail,
|
|
23
|
+
sender_password,
|
|
24
|
+
recipient_email,
|
|
25
|
+
subject,
|
|
26
|
+
message,
|
|
27
|
+
sender_name=None,
|
|
28
|
+
cc=None,
|
|
29
|
+
ID=None,
|
|
30
|
+
attachment_paths=None,
|
|
31
|
+
verbose=True,
|
|
32
|
+
):
|
|
33
|
+
if ID == "auto":
|
|
34
|
+
ID = gen_ID()
|
|
35
|
+
|
|
36
|
+
if ID:
|
|
37
|
+
if subject:
|
|
38
|
+
subject = f"{subject} (ID: {ID})"
|
|
39
|
+
else:
|
|
40
|
+
subject = f"ID: {ID}"
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
server = smtplib.SMTP("smtp.gmail.com", 587)
|
|
44
|
+
server.starttls()
|
|
45
|
+
server.login(sender_gmail, sender_password)
|
|
46
|
+
|
|
47
|
+
gmail = _MIMEMultipart()
|
|
48
|
+
gmail["Subject"] = subject
|
|
49
|
+
gmail["To"] = recipient_email
|
|
50
|
+
if cc:
|
|
51
|
+
if isinstance(cc, str):
|
|
52
|
+
gmail["Cc"] = cc
|
|
53
|
+
elif isinstance(cc, list):
|
|
54
|
+
gmail["Cc"] = ", ".join(cc)
|
|
55
|
+
if sender_name:
|
|
56
|
+
gmail["From"] = f"{sender_name} <{sender_gmail}>"
|
|
57
|
+
else:
|
|
58
|
+
gmail["From"] = sender_gmail
|
|
59
|
+
gmail_body = _MIMEText(message, "plain")
|
|
60
|
+
gmail.attach(gmail_body)
|
|
61
|
+
|
|
62
|
+
# Attachment files
|
|
63
|
+
if attachment_paths:
|
|
64
|
+
for path in attachment_paths:
|
|
65
|
+
_, ext = os.path.splitext(path)
|
|
66
|
+
if ext.lower() == ".log":
|
|
67
|
+
with open(path, "r", encoding="utf-8") as file:
|
|
68
|
+
content = file.read()
|
|
69
|
+
cleaned_content = ansi_escape.sub("", content)
|
|
70
|
+
part = _MIMEText(cleaned_content, "plain")
|
|
71
|
+
|
|
72
|
+
# part = _MIMEText(file.read(), 'plain')
|
|
73
|
+
else:
|
|
74
|
+
mime_type, _ = mimetypes.guess_type(path)
|
|
75
|
+
if mime_type is None:
|
|
76
|
+
mime_type = "text/plain"
|
|
77
|
+
main_type, sub_type = mime_type.split("/", 1)
|
|
78
|
+
with open(path, "rb") as file:
|
|
79
|
+
part = _MIMEBase(main_type, sub_type)
|
|
80
|
+
part.set_payload(file.read())
|
|
81
|
+
encoders.encode_base64(part)
|
|
82
|
+
|
|
83
|
+
part.add_header(
|
|
84
|
+
"Content-Disposition",
|
|
85
|
+
f"attachment; filename={os.path.basename(path)}",
|
|
86
|
+
)
|
|
87
|
+
gmail.attach(part)
|
|
88
|
+
|
|
89
|
+
recipients = [recipient_email]
|
|
90
|
+
if cc:
|
|
91
|
+
if isinstance(cc, str):
|
|
92
|
+
recipients.append(cc)
|
|
93
|
+
elif isinstance(cc, list):
|
|
94
|
+
recipients.extend(cc)
|
|
95
|
+
server.send_message(gmail, to_addrs=recipients)
|
|
96
|
+
|
|
97
|
+
server.quit()
|
|
98
|
+
|
|
99
|
+
if verbose:
|
|
100
|
+
cc_info = f" (CC: {cc})" if cc else ""
|
|
101
|
+
message = f"Email was sent:\n"
|
|
102
|
+
message += f" {sender_gmail} -> {recipient_email}{cc_info}\n"
|
|
103
|
+
message += f" (ID: {ID})\n"
|
|
104
|
+
if attachment_paths:
|
|
105
|
+
message += f" Attached:\n"
|
|
106
|
+
for ap in attachment_paths:
|
|
107
|
+
message += f" {ap}\n"
|
|
108
|
+
print(message)
|
|
109
|
+
|
|
110
|
+
# message = f"\nEmail was sent:\n\t{sender_gmail} -> {recipient_email}{cc_info}\n\t(ID: {ID})"
|
|
111
|
+
# if attachment_paths:
|
|
112
|
+
# attachment_paths_str = '\n\t\t'.join(attachment_paths)
|
|
113
|
+
# message += f"\n\tAttached:\n\t{attachment_paths_str}"
|
|
114
|
+
# print(message)
|
|
115
|
+
|
|
116
|
+
except Exception as e:
|
|
117
|
+
print(f"Email was not sent: {e}")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# EOF
|