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,498 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-04 11:08:00 (ywatanabe)"
|
|
4
|
+
# File: ./src/scitex/str/_format_plot_text.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Functionality:
|
|
8
|
+
Format text for scientific plots with proper capitalization and unit handling
|
|
9
|
+
Includes LaTeX fallback mechanisms for robust rendering
|
|
10
|
+
Input:
|
|
11
|
+
Text strings with optional units
|
|
12
|
+
Output:
|
|
13
|
+
Properly formatted strings for scientific plots with LaTeX fallback
|
|
14
|
+
Prerequisites:
|
|
15
|
+
matplotlib, _latex_fallback module (for LaTeX fallback)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import re
|
|
19
|
+
from typing import Union, Tuple, Optional
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
from ._latex_fallback import safe_latex_render, latex_fallback_decorator
|
|
23
|
+
FALLBACK_AVAILABLE = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
FALLBACK_AVAILABLE = False
|
|
26
|
+
# Define dummy decorator if fallback not available
|
|
27
|
+
def latex_fallback_decorator(fallback_strategy="auto", preserve_math=True):
|
|
28
|
+
def decorator(func):
|
|
29
|
+
return func
|
|
30
|
+
return decorator
|
|
31
|
+
|
|
32
|
+
def safe_latex_render(text, fallback_strategy="auto", preserve_math=True):
|
|
33
|
+
return text
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
37
|
+
def format_plot_text(
|
|
38
|
+
text: str,
|
|
39
|
+
capitalize: bool = True,
|
|
40
|
+
unit_style: str = "parentheses",
|
|
41
|
+
latex_math: bool = True,
|
|
42
|
+
scientific_notation: bool = True,
|
|
43
|
+
enable_fallback: bool = True,
|
|
44
|
+
replace_underscores: bool = True
|
|
45
|
+
) -> str:
|
|
46
|
+
"""
|
|
47
|
+
Format text for scientific plots with proper conventions and LaTeX fallback.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
text : str
|
|
52
|
+
Input text to format
|
|
53
|
+
capitalize : bool, optional
|
|
54
|
+
Whether to capitalize the first letter, by default True
|
|
55
|
+
unit_style : str, optional
|
|
56
|
+
Unit bracket style: "parentheses" (), "brackets" [], or "auto", by default "parentheses"
|
|
57
|
+
latex_math : bool, optional
|
|
58
|
+
Whether to enable LaTeX math formatting, by default True
|
|
59
|
+
scientific_notation : bool, optional
|
|
60
|
+
Whether to format scientific notation properly, by default True
|
|
61
|
+
enable_fallback : bool, optional
|
|
62
|
+
Whether to enable LaTeX fallback mechanisms, by default True
|
|
63
|
+
replace_underscores : bool, optional
|
|
64
|
+
Whether to replace underscores with spaces, by default True
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
str
|
|
69
|
+
Formatted text ready for matplotlib with automatic LaTeX fallback
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> format_plot_text("time (s)")
|
|
74
|
+
'Time (s)'
|
|
75
|
+
|
|
76
|
+
>>> format_plot_text("voltage [V]", unit_style="brackets")
|
|
77
|
+
'Voltage [V]'
|
|
78
|
+
|
|
79
|
+
>>> format_plot_text("frequency in Hz", unit_style="auto")
|
|
80
|
+
'Frequency (Hz)'
|
|
81
|
+
|
|
82
|
+
>>> format_plot_text("signal_power_db")
|
|
83
|
+
'Signal Power Db'
|
|
84
|
+
|
|
85
|
+
>>> format_plot_text(r"$\alpha$ decay") # Falls back if LaTeX fails
|
|
86
|
+
'α decay'
|
|
87
|
+
|
|
88
|
+
Notes
|
|
89
|
+
-----
|
|
90
|
+
If LaTeX rendering fails, this function automatically falls back to
|
|
91
|
+
mathtext or unicode alternatives while preserving scientific formatting.
|
|
92
|
+
"""
|
|
93
|
+
if not text or not isinstance(text, str):
|
|
94
|
+
return text
|
|
95
|
+
|
|
96
|
+
# Handle LaTeX math sections (preserve them)
|
|
97
|
+
latex_sections = []
|
|
98
|
+
text_working = text
|
|
99
|
+
|
|
100
|
+
if latex_math:
|
|
101
|
+
# Extract and preserve LaTeX math
|
|
102
|
+
latex_pattern = r'\$[^$]+\$'
|
|
103
|
+
latex_matches = re.findall(latex_pattern, text)
|
|
104
|
+
for i, match in enumerate(latex_matches):
|
|
105
|
+
placeholder = f"__LATEX_{i}__"
|
|
106
|
+
latex_sections.append(match)
|
|
107
|
+
text_working = text_working.replace(match, placeholder, 1)
|
|
108
|
+
|
|
109
|
+
# Replace underscores with spaces (before unit formatting)
|
|
110
|
+
if replace_underscores:
|
|
111
|
+
text_working = _replace_underscores(text_working)
|
|
112
|
+
|
|
113
|
+
# Format units
|
|
114
|
+
text_working = _format_units(text_working, unit_style)
|
|
115
|
+
|
|
116
|
+
# Capitalize first letter (excluding LaTeX)
|
|
117
|
+
if capitalize:
|
|
118
|
+
text_working = _capitalize_text(text_working)
|
|
119
|
+
|
|
120
|
+
# Handle scientific notation
|
|
121
|
+
if scientific_notation:
|
|
122
|
+
text_working = _format_scientific_notation(text_working)
|
|
123
|
+
|
|
124
|
+
# Restore LaTeX sections with fallback handling
|
|
125
|
+
for i, latex_section in enumerate(latex_sections):
|
|
126
|
+
placeholder = f"__LATEX_{i}__"
|
|
127
|
+
if enable_fallback and FALLBACK_AVAILABLE:
|
|
128
|
+
# Apply fallback to LaTeX sections
|
|
129
|
+
safe_latex = safe_latex_render(latex_section, preserve_math=True)
|
|
130
|
+
text_working = text_working.replace(placeholder, safe_latex)
|
|
131
|
+
else:
|
|
132
|
+
text_working = text_working.replace(placeholder, latex_section)
|
|
133
|
+
|
|
134
|
+
return text_working
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
138
|
+
def format_axis_label(
|
|
139
|
+
label: str,
|
|
140
|
+
unit: Optional[str] = None,
|
|
141
|
+
unit_style: str = "parentheses",
|
|
142
|
+
capitalize: bool = True,
|
|
143
|
+
latex_math: bool = True,
|
|
144
|
+
enable_fallback: bool = True,
|
|
145
|
+
replace_underscores: bool = True
|
|
146
|
+
) -> str:
|
|
147
|
+
"""
|
|
148
|
+
Format axis labels with proper unit handling.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
label : str
|
|
153
|
+
The variable name or description
|
|
154
|
+
unit : Optional[str], optional
|
|
155
|
+
The unit string, by default None
|
|
156
|
+
unit_style : str, optional
|
|
157
|
+
Unit bracket style, by default "parentheses"
|
|
158
|
+
capitalize : bool, optional
|
|
159
|
+
Whether to capitalize, by default True
|
|
160
|
+
latex_math : bool, optional
|
|
161
|
+
Whether to enable LaTeX math, by default True
|
|
162
|
+
enable_fallback : bool, optional
|
|
163
|
+
Whether to enable LaTeX fallback mechanisms, by default True
|
|
164
|
+
replace_underscores : bool, optional
|
|
165
|
+
Whether to replace underscores with spaces, by default True
|
|
166
|
+
|
|
167
|
+
Returns
|
|
168
|
+
-------
|
|
169
|
+
str
|
|
170
|
+
Formatted axis label with automatic LaTeX fallback
|
|
171
|
+
|
|
172
|
+
Examples
|
|
173
|
+
--------
|
|
174
|
+
>>> format_axis_label("time", "s")
|
|
175
|
+
'Time (s)'
|
|
176
|
+
|
|
177
|
+
>>> format_axis_label("voltage", "V", unit_style="brackets")
|
|
178
|
+
'Voltage [V]'
|
|
179
|
+
|
|
180
|
+
>>> format_axis_label("temperature", "°C")
|
|
181
|
+
'Temperature (°C)'
|
|
182
|
+
|
|
183
|
+
>>> format_axis_label("signal_power", "dB")
|
|
184
|
+
'Signal Power (dB)'
|
|
185
|
+
"""
|
|
186
|
+
if unit:
|
|
187
|
+
if unit_style == "brackets":
|
|
188
|
+
full_text = f"{label} [{unit}]"
|
|
189
|
+
else: # parentheses
|
|
190
|
+
full_text = f"{label} ({unit})"
|
|
191
|
+
else:
|
|
192
|
+
full_text = label
|
|
193
|
+
|
|
194
|
+
return format_plot_text(full_text, capitalize, unit_style, latex_math, scientific_notation=True, enable_fallback=enable_fallback, replace_underscores=replace_underscores)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
198
|
+
def format_title(
|
|
199
|
+
title: str,
|
|
200
|
+
subtitle: Optional[str] = None,
|
|
201
|
+
capitalize: bool = True,
|
|
202
|
+
latex_math: bool = True,
|
|
203
|
+
enable_fallback: bool = True,
|
|
204
|
+
replace_underscores: bool = True
|
|
205
|
+
) -> str:
|
|
206
|
+
"""
|
|
207
|
+
Format plot titles with proper conventions.
|
|
208
|
+
|
|
209
|
+
Parameters
|
|
210
|
+
----------
|
|
211
|
+
title : str
|
|
212
|
+
Main title text
|
|
213
|
+
subtitle : Optional[str], optional
|
|
214
|
+
Subtitle text, by default None
|
|
215
|
+
capitalize : bool, optional
|
|
216
|
+
Whether to capitalize, by default True
|
|
217
|
+
latex_math : bool, optional
|
|
218
|
+
Whether to enable LaTeX math, by default True
|
|
219
|
+
enable_fallback : bool, optional
|
|
220
|
+
Whether to enable LaTeX fallback mechanisms, by default True
|
|
221
|
+
replace_underscores : bool, optional
|
|
222
|
+
Whether to replace underscores with spaces, by default True
|
|
223
|
+
|
|
224
|
+
Returns
|
|
225
|
+
-------
|
|
226
|
+
str
|
|
227
|
+
Formatted title with automatic LaTeX fallback
|
|
228
|
+
|
|
229
|
+
Examples
|
|
230
|
+
--------
|
|
231
|
+
>>> format_title("neural spike analysis")
|
|
232
|
+
'Neural Spike Analysis'
|
|
233
|
+
|
|
234
|
+
>>> format_title("data analysis", "preliminary results")
|
|
235
|
+
'Data Analysis\\nPreliminary Results'
|
|
236
|
+
|
|
237
|
+
>>> format_title("signal_processing_results")
|
|
238
|
+
'Signal Processing Results'
|
|
239
|
+
"""
|
|
240
|
+
formatted_title = format_plot_text(title, capitalize, latex_math=latex_math,
|
|
241
|
+
enable_fallback=enable_fallback,
|
|
242
|
+
replace_underscores=replace_underscores)
|
|
243
|
+
|
|
244
|
+
if subtitle:
|
|
245
|
+
formatted_subtitle = format_plot_text(subtitle, capitalize, latex_math=latex_math,
|
|
246
|
+
enable_fallback=enable_fallback,
|
|
247
|
+
replace_underscores=replace_underscores)
|
|
248
|
+
return f"{formatted_title}\\n{formatted_subtitle}"
|
|
249
|
+
|
|
250
|
+
return formatted_title
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def check_unit_consistency(
|
|
254
|
+
x_unit: Optional[str] = None,
|
|
255
|
+
y_unit: Optional[str] = None,
|
|
256
|
+
operation: str = "none"
|
|
257
|
+
) -> Tuple[bool, str]:
|
|
258
|
+
"""
|
|
259
|
+
Check unit consistency for mathematical operations.
|
|
260
|
+
|
|
261
|
+
Parameters
|
|
262
|
+
----------
|
|
263
|
+
x_unit : Optional[str], optional
|
|
264
|
+
X-axis unit, by default None
|
|
265
|
+
y_unit : Optional[str], optional
|
|
266
|
+
Y-axis unit, by default None
|
|
267
|
+
operation : str, optional
|
|
268
|
+
Mathematical operation: "add", "subtract", "multiply", "divide", "none", by default "none"
|
|
269
|
+
|
|
270
|
+
Returns
|
|
271
|
+
-------
|
|
272
|
+
Tuple[bool, str]
|
|
273
|
+
(is_consistent, expected_result_unit)
|
|
274
|
+
|
|
275
|
+
Examples
|
|
276
|
+
--------
|
|
277
|
+
>>> check_unit_consistency("m", "s", "divide")
|
|
278
|
+
(True, 'm/s')
|
|
279
|
+
|
|
280
|
+
>>> check_unit_consistency("m", "m", "add")
|
|
281
|
+
(True, 'm')
|
|
282
|
+
|
|
283
|
+
>>> check_unit_consistency("m", "kg", "add")
|
|
284
|
+
(False, 'Units incompatible for addition')
|
|
285
|
+
"""
|
|
286
|
+
if not x_unit or not y_unit:
|
|
287
|
+
return True, x_unit or y_unit or ""
|
|
288
|
+
|
|
289
|
+
# Normalize units
|
|
290
|
+
x_norm = _normalize_unit(x_unit)
|
|
291
|
+
y_norm = _normalize_unit(y_unit)
|
|
292
|
+
|
|
293
|
+
if operation in ["add", "subtract"]:
|
|
294
|
+
if x_norm == y_norm:
|
|
295
|
+
return True, x_unit
|
|
296
|
+
else:
|
|
297
|
+
return False, f"Units incompatible for {operation}"
|
|
298
|
+
|
|
299
|
+
elif operation == "multiply":
|
|
300
|
+
if x_norm == "1" or y_norm == "1": # dimensionless
|
|
301
|
+
return True, x_unit if x_norm != "1" else y_unit
|
|
302
|
+
else:
|
|
303
|
+
return True, f"{x_unit}·{y_unit}"
|
|
304
|
+
|
|
305
|
+
elif operation == "divide":
|
|
306
|
+
if y_norm == "1": # dividing by dimensionless
|
|
307
|
+
return True, x_unit
|
|
308
|
+
elif x_norm == y_norm:
|
|
309
|
+
return True, "1" # dimensionless
|
|
310
|
+
else:
|
|
311
|
+
return True, f"{x_unit}/{y_unit}"
|
|
312
|
+
|
|
313
|
+
return True, ""
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _format_units(text: str, unit_style: str) -> str:
|
|
317
|
+
"""Format units in text according to specified style."""
|
|
318
|
+
if unit_style == "auto":
|
|
319
|
+
# Auto-detect and standardize to parentheses
|
|
320
|
+
# Look for common unit patterns
|
|
321
|
+
unit_patterns = [
|
|
322
|
+
r'\s+in\s+([A-Za-z°µ²³⁻⁺]+)', # "in Hz", "in μV", etc.
|
|
323
|
+
r'\s+\[([^\]]+)\]', # [unit]
|
|
324
|
+
r'\s+\(([^)]+)\)', # (unit)
|
|
325
|
+
]
|
|
326
|
+
|
|
327
|
+
for pattern in unit_patterns:
|
|
328
|
+
match = re.search(pattern, text)
|
|
329
|
+
if match:
|
|
330
|
+
unit = match.group(1)
|
|
331
|
+
# Replace with standardized format
|
|
332
|
+
text = re.sub(pattern, f' ({unit})', text)
|
|
333
|
+
break
|
|
334
|
+
|
|
335
|
+
elif unit_style == "brackets":
|
|
336
|
+
# Convert parentheses to brackets
|
|
337
|
+
text = re.sub(r'\s*\(([^)]+)\)', r' [\1]', text)
|
|
338
|
+
|
|
339
|
+
# Clean up multiple spaces
|
|
340
|
+
text = re.sub(r'\s+', ' ', text).strip()
|
|
341
|
+
|
|
342
|
+
return text
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _capitalize_text(text: str) -> str:
|
|
346
|
+
"""Capitalize the first letter of text, preserving units in parentheses/brackets."""
|
|
347
|
+
if not text:
|
|
348
|
+
return text
|
|
349
|
+
|
|
350
|
+
# Preserve content in parentheses and brackets
|
|
351
|
+
preserved_sections = []
|
|
352
|
+
|
|
353
|
+
# Find and preserve parentheses content
|
|
354
|
+
paren_pattern = r'(\([^)]+\))'
|
|
355
|
+
paren_matches = re.findall(paren_pattern, text)
|
|
356
|
+
for i, match in enumerate(paren_matches):
|
|
357
|
+
placeholder = f"__PAREN_{i}__"
|
|
358
|
+
preserved_sections.append((placeholder, match))
|
|
359
|
+
text = text.replace(match, placeholder, 1)
|
|
360
|
+
|
|
361
|
+
# Find and preserve bracket content
|
|
362
|
+
bracket_pattern = r'(\[[^\]]+\])'
|
|
363
|
+
bracket_matches = re.findall(bracket_pattern, text)
|
|
364
|
+
for i, match in enumerate(bracket_matches):
|
|
365
|
+
placeholder = f"__BRACKET_{i}__"
|
|
366
|
+
preserved_sections.append((placeholder, match))
|
|
367
|
+
text = text.replace(match, placeholder, 1)
|
|
368
|
+
|
|
369
|
+
# Capitalize the first alphabetic character
|
|
370
|
+
capitalized = False
|
|
371
|
+
result = []
|
|
372
|
+
for char in text:
|
|
373
|
+
if not capitalized and char.isalpha():
|
|
374
|
+
result.append(char.upper())
|
|
375
|
+
capitalized = True
|
|
376
|
+
else:
|
|
377
|
+
result.append(char)
|
|
378
|
+
|
|
379
|
+
text = ''.join(result)
|
|
380
|
+
|
|
381
|
+
# Restore preserved sections
|
|
382
|
+
for placeholder, original in preserved_sections:
|
|
383
|
+
text = text.replace(placeholder, original)
|
|
384
|
+
|
|
385
|
+
return text
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def _format_scientific_notation(text: str) -> str:
|
|
389
|
+
"""Format scientific notation in text."""
|
|
390
|
+
# Convert patterns like "1e-3" to "1×10⁻³" or LaTeX equivalent
|
|
391
|
+
sci_pattern = r'(\d+\.?\d*)[eE]([-+]?\d+)'
|
|
392
|
+
|
|
393
|
+
def replace_sci(match):
|
|
394
|
+
base = match.group(1)
|
|
395
|
+
exp = match.group(2)
|
|
396
|
+
# Use LaTeX format
|
|
397
|
+
return f"{base}×10^{{{exp}}}"
|
|
398
|
+
|
|
399
|
+
return re.sub(sci_pattern, replace_sci, text)
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def _replace_underscores(text: str) -> str:
|
|
403
|
+
"""Replace underscores with spaces and apply proper word capitalization."""
|
|
404
|
+
# First, preserve content in parentheses and brackets
|
|
405
|
+
preserved_sections = []
|
|
406
|
+
|
|
407
|
+
# Preserve parentheses content
|
|
408
|
+
paren_pattern = r'(\([^)]+\))'
|
|
409
|
+
paren_matches = re.findall(paren_pattern, text)
|
|
410
|
+
for i, match in enumerate(paren_matches):
|
|
411
|
+
placeholder = f"|||PAREN{i}|||"
|
|
412
|
+
preserved_sections.append((placeholder, match))
|
|
413
|
+
text = text.replace(match, placeholder, 1)
|
|
414
|
+
|
|
415
|
+
# Preserve bracket content
|
|
416
|
+
bracket_pattern = r'(\[[^\]]+\])'
|
|
417
|
+
bracket_matches = re.findall(bracket_pattern, text)
|
|
418
|
+
for i, match in enumerate(bracket_matches):
|
|
419
|
+
placeholder = f"|||BRACKET{i}|||"
|
|
420
|
+
preserved_sections.append((placeholder, match))
|
|
421
|
+
text = text.replace(match, placeholder, 1)
|
|
422
|
+
|
|
423
|
+
# Replace underscores with spaces
|
|
424
|
+
text_with_spaces = text.replace('_', ' ')
|
|
425
|
+
|
|
426
|
+
# Split by spaces for word processing
|
|
427
|
+
words = text_with_spaces.split(' ')
|
|
428
|
+
|
|
429
|
+
# Common units that should preserve their case
|
|
430
|
+
common_units = {'Hz', 'kHz', 'MHz', 'GHz', 'V', 'mV', 'uV', 'μV', 'A', 'mA',
|
|
431
|
+
'μA', 'W', 'mW', 'dB', 'dBm', 's', 'ms', 'μs', 'ns', 'ps',
|
|
432
|
+
'K', 'C', 'F', 'rad', 'deg', 'm', 'cm', 'mm', 'μm', 'nm',
|
|
433
|
+
'kg', 'g', 'mg', 'μg', 'N', 'Pa', 'bar', 'psi', 'mol', 'M'}
|
|
434
|
+
|
|
435
|
+
# Process each word
|
|
436
|
+
formatted_words = []
|
|
437
|
+
for word in words:
|
|
438
|
+
if not word: # Preserve empty strings (from consecutive underscores)
|
|
439
|
+
formatted_words.append('')
|
|
440
|
+
# Skip placeholders
|
|
441
|
+
elif '|||' in word:
|
|
442
|
+
formatted_words.append(word)
|
|
443
|
+
# Check if word is a known unit
|
|
444
|
+
elif word in common_units:
|
|
445
|
+
formatted_words.append(word)
|
|
446
|
+
# Preserve special cases (e.g., all caps like "DB", "ID", etc.)
|
|
447
|
+
elif word.isupper() and len(word) > 1:
|
|
448
|
+
formatted_words.append(word)
|
|
449
|
+
# Capitalize first letter of each word
|
|
450
|
+
else:
|
|
451
|
+
formatted_words.append(word[0].upper() + word[1:].lower() if len(word) > 1 else word.upper())
|
|
452
|
+
|
|
453
|
+
# Join with spaces
|
|
454
|
+
result = ' '.join(formatted_words)
|
|
455
|
+
|
|
456
|
+
# Restore preserved sections
|
|
457
|
+
for placeholder, original in preserved_sections:
|
|
458
|
+
result = result.replace(placeholder, original)
|
|
459
|
+
|
|
460
|
+
return result
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def _normalize_unit(unit: str) -> str:
|
|
464
|
+
"""Normalize unit string for comparison."""
|
|
465
|
+
# Remove brackets/parentheses and normalize
|
|
466
|
+
normalized = re.sub(r'[\[\]()]', '', unit).strip().lower()
|
|
467
|
+
|
|
468
|
+
# Handle common equivalent units
|
|
469
|
+
equivalents = {
|
|
470
|
+
'sec': 's', 'second': 's', 'seconds': 's',
|
|
471
|
+
'volt': 'V', 'volts': 'V',
|
|
472
|
+
'amp': 'A', 'ampere': 'A', 'amps': 'A',
|
|
473
|
+
'meter': 'm', 'meters': 'm', 'metre': 'm', 'metres': 'm',
|
|
474
|
+
'gram': 'g', 'grams': 'g',
|
|
475
|
+
'hertz': 'Hz', 'hz': 'Hz',
|
|
476
|
+
'dimensionless': '1', 'unitless': '1', '': '1',
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
return equivalents.get(normalized, normalized)
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
# Convenient aliases and shortcuts
|
|
483
|
+
def axis_label(label: str, unit: str = None, **kwargs) -> str:
|
|
484
|
+
"""Convenient alias for format_axis_label."""
|
|
485
|
+
return format_axis_label(label, unit, **kwargs)
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def title(text: str, **kwargs) -> str:
|
|
489
|
+
"""Convenient alias for format_title."""
|
|
490
|
+
return format_title(text, **kwargs)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def scientific_text(text: str, **kwargs) -> str:
|
|
494
|
+
"""Convenient alias for format_plot_text with scientific defaults."""
|
|
495
|
+
return format_plot_text(text, **kwargs)
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
# EOF
|
scitex/str/_grep.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-02 04:05:41 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/str/_grep.py
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def grep(str_list, search_key):
|
|
10
|
+
"""Search for a key in a list of strings and return matching items.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
str_list : list of str
|
|
15
|
+
The list of strings to search through.
|
|
16
|
+
search_key : str
|
|
17
|
+
The key to search for in the strings.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
list
|
|
22
|
+
A list of strings from str_list that contain the search_key.
|
|
23
|
+
|
|
24
|
+
Example
|
|
25
|
+
-------
|
|
26
|
+
>>> grep(['apple', 'banana', 'cherry'], 'a')
|
|
27
|
+
['apple', 'banana']
|
|
28
|
+
>>> grep(['cat', 'dog', 'elephant'], 'e')
|
|
29
|
+
['elephant']
|
|
30
|
+
"""
|
|
31
|
+
"""
|
|
32
|
+
Example:
|
|
33
|
+
str_list = ['apple', 'orange', 'apple', 'apple_juice', 'banana', 'orange_juice']
|
|
34
|
+
search_key = 'orange'
|
|
35
|
+
print(grep(str_list, search_key))
|
|
36
|
+
# ([1, 5], ['orange', 'orange_juice'])
|
|
37
|
+
"""
|
|
38
|
+
matched_keys = []
|
|
39
|
+
indi = []
|
|
40
|
+
for ii, string in enumerate(str_list):
|
|
41
|
+
m = re.search(search_key, string)
|
|
42
|
+
if m is not None:
|
|
43
|
+
matched_keys.append(string)
|
|
44
|
+
indi.append(ii)
|
|
45
|
+
return indi, matched_keys
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# EOF
|
scitex/str/_latex.py
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
|
|
4
|
+
# File: ./src/scitex/str/_latex.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
LaTeX formatting functions with fallback mechanisms.
|
|
8
|
+
|
|
9
|
+
Functionality:
|
|
10
|
+
- LaTeX text formatting with automatic fallback
|
|
11
|
+
- Safe handling of LaTeX rendering failures
|
|
12
|
+
Input:
|
|
13
|
+
Strings or numbers to format
|
|
14
|
+
Output:
|
|
15
|
+
LaTeX-formatted strings with fallback support
|
|
16
|
+
Prerequisites:
|
|
17
|
+
matplotlib, _latex_fallback module
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from ._latex_fallback import safe_latex_render, latex_fallback_decorator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
24
|
+
def to_latex_style(str_or_num):
|
|
25
|
+
"""
|
|
26
|
+
Convert string or number to LaTeX math mode format with fallback.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
str_or_num : str or numeric
|
|
31
|
+
Input to format in LaTeX style
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
str
|
|
36
|
+
LaTeX-formatted string with automatic fallback
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> to_latex_style('aaa')
|
|
41
|
+
'$aaa$'
|
|
42
|
+
|
|
43
|
+
>>> to_latex_style('alpha') # Falls back to unicode if LaTeX fails
|
|
44
|
+
'α'
|
|
45
|
+
|
|
46
|
+
Notes
|
|
47
|
+
-----
|
|
48
|
+
If LaTeX rendering fails (e.g., due to missing fonts or Node.js conflicts),
|
|
49
|
+
this function automatically falls back to mathtext or unicode alternatives.
|
|
50
|
+
"""
|
|
51
|
+
if not str_or_num and str_or_num != 0: # Handle empty string case
|
|
52
|
+
return ""
|
|
53
|
+
|
|
54
|
+
string = str(str_or_num)
|
|
55
|
+
|
|
56
|
+
# Avoid double-wrapping
|
|
57
|
+
if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
|
|
58
|
+
return safe_latex_render(string)
|
|
59
|
+
else:
|
|
60
|
+
latex_string = "${}$".format(string)
|
|
61
|
+
return safe_latex_render(latex_string)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
65
|
+
def add_hat_in_latex_style(str_or_num):
|
|
66
|
+
"""
|
|
67
|
+
Add LaTeX hat notation to string with fallback.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
str_or_num : str or numeric
|
|
72
|
+
Input to format with hat notation
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
str
|
|
77
|
+
LaTeX-formatted string with hat notation and automatic fallback
|
|
78
|
+
|
|
79
|
+
Examples
|
|
80
|
+
--------
|
|
81
|
+
>>> add_hat_in_latex_style('aaa')
|
|
82
|
+
'$\\hat{aaa}$'
|
|
83
|
+
|
|
84
|
+
>>> add_hat_in_latex_style('x') # Falls back to unicode if LaTeX fails
|
|
85
|
+
'x̂'
|
|
86
|
+
|
|
87
|
+
Notes
|
|
88
|
+
-----
|
|
89
|
+
If LaTeX rendering fails, this function falls back to unicode hat
|
|
90
|
+
notation or plain text alternatives.
|
|
91
|
+
"""
|
|
92
|
+
if not str_or_num and str_or_num != 0: # Handle empty string case
|
|
93
|
+
return ""
|
|
94
|
+
|
|
95
|
+
hat_latex = r"\hat{%s}" % str_or_num
|
|
96
|
+
latex_string = to_latex_style(hat_latex)
|
|
97
|
+
return safe_latex_render(latex_string)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def safe_to_latex_style(str_or_num, fallback_strategy="auto"):
|
|
101
|
+
"""
|
|
102
|
+
Safe version of to_latex_style with explicit fallback control.
|
|
103
|
+
|
|
104
|
+
Parameters
|
|
105
|
+
----------
|
|
106
|
+
str_or_num : str or numeric
|
|
107
|
+
Input to format in LaTeX style
|
|
108
|
+
fallback_strategy : str, optional
|
|
109
|
+
Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
|
|
110
|
+
|
|
111
|
+
Returns
|
|
112
|
+
-------
|
|
113
|
+
str
|
|
114
|
+
Formatted string with specified fallback behavior
|
|
115
|
+
"""
|
|
116
|
+
if not str_or_num and str_or_num != 0:
|
|
117
|
+
return ""
|
|
118
|
+
|
|
119
|
+
string = str(str_or_num)
|
|
120
|
+
if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
|
|
121
|
+
return safe_latex_render(string, fallback_strategy)
|
|
122
|
+
else:
|
|
123
|
+
latex_string = "${}$".format(string)
|
|
124
|
+
return safe_latex_render(latex_string, fallback_strategy)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def safe_add_hat_in_latex_style(str_or_num, fallback_strategy="auto"):
|
|
128
|
+
"""
|
|
129
|
+
Safe version of add_hat_in_latex_style with explicit fallback control.
|
|
130
|
+
|
|
131
|
+
Parameters
|
|
132
|
+
----------
|
|
133
|
+
str_or_num : str or numeric
|
|
134
|
+
Input to format with hat notation
|
|
135
|
+
fallback_strategy : str, optional
|
|
136
|
+
Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
|
|
137
|
+
|
|
138
|
+
Returns
|
|
139
|
+
-------
|
|
140
|
+
str
|
|
141
|
+
Formatted string with hat notation and specified fallback behavior
|
|
142
|
+
"""
|
|
143
|
+
if not str_or_num and str_or_num != 0:
|
|
144
|
+
return ""
|
|
145
|
+
|
|
146
|
+
hat_latex = r"\hat{%s}" % str_or_num
|
|
147
|
+
latex_string = safe_to_latex_style(hat_latex, fallback_strategy)
|
|
148
|
+
return latex_string
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# Backward compatibility aliases
|
|
152
|
+
latex_style = to_latex_style
|
|
153
|
+
hat_latex_style = add_hat_in_latex_style
|
|
154
|
+
|
|
155
|
+
# EOF
|