scitex 2.7.3__py3-none-any.whl → 2.10.0__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 +15 -7
- scitex/__version__.py +1 -2
- scitex/_install_guide.py +250 -0
- scitex/_optional_deps.py +206 -39
- scitex/ai/_gen_ai/_Groq.py +2 -4
- scitex/ai/_gen_ai/_OpenAI.py +5 -2
- scitex/ai/_gen_ai/_Perplexity.py +20 -6
- scitex/audio/__init__.py +24 -15
- scitex/audio/_cross_process_lock.py +139 -0
- scitex/audio/_mcp_handlers.py +256 -0
- scitex/audio/_mcp_tool_schemas.py +203 -0
- scitex/audio/engines/elevenlabs_engine.py +5 -2
- scitex/audio/mcp_server.py +98 -457
- scitex/bridge/__init__.py +30 -19
- scitex/bridge/_figrecipe.py +245 -0
- scitex/bridge/_helpers.py +2 -1
- scitex/bridge/_plt_vis.py +23 -10
- scitex/bridge/_stats_plt.py +18 -5
- scitex/bridge/_stats_vis.py +16 -2
- scitex/browser/__init__.py +84 -44
- scitex/browser/automation/__init__.py +5 -1
- scitex/browser/core/BrowserMixin.py +17 -4
- scitex/browser/core/__init__.py +11 -2
- scitex/browser/remote/CaptchaHandler.py +1 -1
- scitex/browser/remote/ZenRowsAPIClient.py +1 -1
- scitex/capture/grid.py +487 -0
- scitex/capture/mcp_handlers.py +401 -0
- scitex/capture/mcp_tool_defs.py +192 -0
- scitex/capture/mcp_tools.py +241 -0
- scitex/capture/mcp_utils.py +30 -0
- scitex/cli/convert.py +421 -0
- scitex/cli/main.py +6 -4
- scitex/datetime/__init__.py +46 -0
- scitex/datetime/_linspace.py +100 -0
- scitex/datetime/_normalize_timestamp.py +306 -0
- scitex/db/_delete_duplicates.py +4 -4
- scitex/db/_sqlite3/_delete_duplicates.py +11 -2
- scitex/dev/plt/__init__.py +61 -62
- scitex/dev/plt/demo_plotters/__init__.py +0 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axhline.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axvline.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axvspan.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_bar.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_barh.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_boxplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_contour.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_contourf.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_errorbar.py +30 -0
- scitex/dev/plt/demo_plotters/plot_mpl_eventplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_fill.py +30 -0
- scitex/dev/plt/demo_plotters/plot_mpl_fill_between.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hexbin.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hist.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hist2d.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_imshow.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_pcolormesh.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_pie.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_plot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_quiver.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_scatter.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_stackplot.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_stem.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_step.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_violinplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_sns_barplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_boxplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_heatmap.py +28 -0
- scitex/dev/plt/demo_plotters/plot_sns_histplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_kdeplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_lineplot.py +31 -0
- scitex/dev/plt/demo_plotters/plot_sns_scatterplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_stripplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_swarmplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_violinplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_bar.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_barh.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_box.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_boxplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_conf_mat.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_contour.py +31 -0
- scitex/dev/plt/demo_plotters/plot_stx_ecdf.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_errorbar.py +30 -0
- scitex/dev/plt/demo_plotters/plot_stx_fill_between.py +31 -0
- scitex/dev/plt/demo_plotters/plot_stx_fillv.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_heatmap.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_image.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_imshow.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_joyplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_kde.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_line.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_mean_ci.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_mean_std.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_median_iqr.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_raster.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_rectangle.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_scatter.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_shaded_line.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_violin.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_violinplot.py +28 -0
- scitex/dev/plt/mpl/get_dir_ax.py +46 -0
- scitex/dev/plt/mpl/get_signatures.py +176 -0
- scitex/dev/plt/mpl/get_signatures_details.py +522 -0
- scitex/dev/plt/plot_mpl_axhline.py +0 -0
- scitex/dev/plt/plot_mpl_axhspan.py +0 -0
- scitex/dev/plt/plot_mpl_axvline.py +0 -0
- scitex/dev/plt/plot_mpl_axvspan.py +0 -0
- scitex/dev/plt/plot_mpl_bar.py +0 -0
- scitex/dev/plt/plot_mpl_barh.py +0 -0
- scitex/dev/plt/plot_mpl_boxplot.py +0 -0
- scitex/dev/plt/plot_mpl_contour.py +0 -0
- scitex/dev/plt/plot_mpl_contourf.py +0 -0
- scitex/dev/plt/plot_mpl_errorbar.py +0 -0
- scitex/dev/plt/plot_mpl_eventplot.py +0 -0
- scitex/dev/plt/plot_mpl_fill.py +0 -0
- scitex/dev/plt/plot_mpl_fill_between.py +0 -0
- scitex/dev/plt/plot_mpl_hexbin.py +0 -0
- scitex/dev/plt/plot_mpl_hist.py +0 -0
- scitex/dev/plt/plot_mpl_hist2d.py +0 -0
- scitex/dev/plt/plot_mpl_imshow.py +0 -0
- scitex/dev/plt/plot_mpl_pcolormesh.py +0 -0
- scitex/dev/plt/plot_mpl_pie.py +0 -0
- scitex/dev/plt/plot_mpl_plot.py +0 -0
- scitex/dev/plt/plot_mpl_quiver.py +0 -0
- scitex/dev/plt/plot_mpl_scatter.py +0 -0
- scitex/dev/plt/plot_mpl_stackplot.py +0 -0
- scitex/dev/plt/plot_mpl_stem.py +0 -0
- scitex/dev/plt/plot_mpl_step.py +0 -0
- scitex/dev/plt/plot_mpl_violinplot.py +0 -0
- scitex/dev/plt/plot_sns_barplot.py +0 -0
- scitex/dev/plt/plot_sns_boxplot.py +0 -0
- scitex/dev/plt/plot_sns_heatmap.py +0 -0
- scitex/dev/plt/plot_sns_histplot.py +0 -0
- scitex/dev/plt/plot_sns_kdeplot.py +0 -0
- scitex/dev/plt/plot_sns_lineplot.py +0 -0
- scitex/dev/plt/plot_sns_scatterplot.py +0 -0
- scitex/dev/plt/plot_sns_stripplot.py +0 -0
- scitex/dev/plt/plot_sns_swarmplot.py +0 -0
- scitex/dev/plt/plot_sns_violinplot.py +0 -0
- scitex/dev/plt/plot_stx_bar.py +0 -0
- scitex/dev/plt/plot_stx_barh.py +0 -0
- scitex/dev/plt/plot_stx_box.py +0 -0
- scitex/dev/plt/plot_stx_boxplot.py +0 -0
- scitex/dev/plt/plot_stx_conf_mat.py +0 -0
- scitex/dev/plt/plot_stx_contour.py +0 -0
- scitex/dev/plt/plot_stx_ecdf.py +0 -0
- scitex/dev/plt/plot_stx_errorbar.py +0 -0
- scitex/dev/plt/plot_stx_fill_between.py +0 -0
- scitex/dev/plt/plot_stx_fillv.py +0 -0
- scitex/dev/plt/plot_stx_heatmap.py +0 -0
- scitex/dev/plt/plot_stx_image.py +0 -0
- scitex/dev/plt/plot_stx_imshow.py +0 -0
- scitex/dev/plt/plot_stx_joyplot.py +0 -0
- scitex/dev/plt/plot_stx_kde.py +0 -0
- scitex/dev/plt/plot_stx_line.py +0 -0
- scitex/dev/plt/plot_stx_mean_ci.py +0 -0
- scitex/dev/plt/plot_stx_mean_std.py +0 -0
- scitex/dev/plt/plot_stx_median_iqr.py +0 -0
- scitex/dev/plt/plot_stx_raster.py +0 -0
- scitex/dev/plt/plot_stx_rectangle.py +0 -0
- scitex/dev/plt/plot_stx_scatter.py +0 -0
- scitex/dev/plt/plot_stx_shaded_line.py +0 -0
- scitex/dev/plt/plot_stx_violin.py +0 -0
- scitex/dev/plt/plot_stx_violinplot.py +0 -0
- scitex/diagram/README.md +197 -0
- scitex/diagram/__init__.py +48 -0
- scitex/diagram/_compile.py +312 -0
- scitex/diagram/_diagram.py +355 -0
- scitex/diagram/_presets.py +173 -0
- scitex/diagram/_schema.py +182 -0
- scitex/diagram/_split.py +278 -0
- scitex/dict/_pop_keys.py +1 -7
- scitex/dsp/__init__.py +15 -10
- scitex/dsp/add_noise.py +5 -2
- scitex/dsp/example.py +35 -22
- scitex/dsp/filt.py +8 -3
- scitex/dsp/reference.py +3 -2
- scitex/dsp/utils/__init__.py +2 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +14 -4
- scitex/dt/__init__.py +39 -2
- scitex/errors.py +82 -521
- scitex/fig/__init__.py +4 -4
- scitex/fig/editor/__init__.py +5 -2
- scitex/fig/editor/_dearpygui_editor.py +1 -1
- scitex/fig/editor/_mpl_editor.py +1 -1
- scitex/fig/editor/_qt_editor.py +1 -1
- scitex/fig/editor/_tkinter_editor.py +1 -1
- scitex/fig/editor/edit/__init__.py +50 -0
- scitex/fig/editor/edit/backend_detector.py +109 -0
- scitex/fig/editor/edit/bundle_resolver.py +240 -0
- scitex/fig/editor/edit/editor_launcher.py +239 -0
- scitex/fig/editor/edit/manual_handler.py +53 -0
- scitex/fig/editor/edit/panel_loader.py +232 -0
- scitex/fig/editor/edit/path_resolver.py +67 -0
- scitex/fig/editor/flask_editor/_bbox.py +23 -0
- scitex/fig/editor/flask_editor/_core.py +908 -103
- scitex/fig/editor/flask_editor/_renderer.py +74 -0
- scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
- scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
- scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
- scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
- scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
- scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
- scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
- scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
- scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
- scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
- scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
- scitex/fig/editor/flask_editor/static/css/index.css +31 -0
- scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
- scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
- scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
- scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
- scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
- scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
- scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
- scitex/fig/editor/flask_editor/static/js/main.js +426 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
- scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
- scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
- scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
- scitex/fig/editor/flask_editor/templates/__init__.py +95 -5
- scitex/fig/editor/flask_editor/templates/_html.py +27 -9
- scitex/fig/editor/flask_editor/templates/_scripts.py +1928 -131
- scitex/fig/editor/flask_editor/templates/_styles.py +363 -51
- scitex/fig/io/_bundle.py +104 -19
- scitex/fts/README.md +262 -0
- scitex/fts/TODO.md +66 -0
- scitex/fts/__init__.py +90 -0
- scitex/fts/_bundle/README_IN_BUNDLE.md +102 -0
- scitex/fts/_bundle/_FTS.py +657 -0
- scitex/fts/_bundle/__init__.py +38 -0
- scitex/fts/_bundle/_children.py +216 -0
- scitex/fts/_bundle/_conversion/__init__.py +15 -0
- scitex/fts/_bundle/_conversion/_bundle2dict.py +44 -0
- scitex/fts/_bundle/_conversion/_dict2bundle.py +50 -0
- scitex/fts/_bundle/_dataclasses/_Axes.py +57 -0
- scitex/fts/_bundle/_dataclasses/_BBox.py +54 -0
- scitex/fts/_bundle/_dataclasses/_ColumnDef.py +72 -0
- scitex/fts/_bundle/_dataclasses/_DataFormat.py +40 -0
- scitex/fts/_bundle/_dataclasses/_DataInfo.py +135 -0
- scitex/fts/_bundle/_dataclasses/_DataSource.py +44 -0
- scitex/fts/_bundle/_dataclasses/_Node.py +319 -0
- scitex/fts/_bundle/_dataclasses/_NodeRefs.py +45 -0
- scitex/fts/_bundle/_dataclasses/_SizeMM.py +38 -0
- scitex/fts/_bundle/_dataclasses/__init__.py +35 -0
- scitex/fts/_bundle/_extractors/__init__.py +32 -0
- scitex/fts/_bundle/_extractors/_extract_bar.py +131 -0
- scitex/fts/_bundle/_extractors/_extract_line.py +71 -0
- scitex/fts/_bundle/_extractors/_extract_scatter.py +79 -0
- scitex/fts/_bundle/_loader.py +134 -0
- scitex/fts/_bundle/_mpl_helpers.py +389 -0
- scitex/fts/_bundle/_saver.py +269 -0
- scitex/fts/_bundle/_storage.py +200 -0
- scitex/fts/_bundle/_utils/__init__.py +55 -0
- scitex/fts/_bundle/_utils/_const.py +26 -0
- scitex/fts/_bundle/_utils/_errors.py +73 -0
- scitex/fts/_bundle/_utils/_generate.py +21 -0
- scitex/fts/_bundle/_utils/_types.py +76 -0
- scitex/fts/_bundle/_validation.py +434 -0
- scitex/fts/_bundle/_zipbundle.py +165 -0
- scitex/fts/_fig/__init__.py +22 -0
- scitex/fts/_fig/_backend/__init__.py +53 -0
- scitex/fts/_fig/_backend/_export.py +165 -0
- scitex/fts/_fig/_backend/_parser.py +188 -0
- scitex/fts/_fig/_backend/_render.py +538 -0
- scitex/fts/_fig/_composite.py +345 -0
- scitex/fts/_fig/_dataclasses/_ChannelEncoding.py +46 -0
- scitex/fts/_fig/_dataclasses/_Encoding.py +82 -0
- scitex/fts/_fig/_dataclasses/_Theme.py +441 -0
- scitex/fts/_fig/_dataclasses/_TraceEncoding.py +52 -0
- scitex/fts/_fig/_dataclasses/__init__.py +47 -0
- scitex/fts/_fig/_editor/__init__.py +14 -0
- scitex/fts/_fig/_editor/_cui/__init__.py +33 -0
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +39 -0
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +366 -0
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +175 -0
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +52 -0
- scitex/fts/_fig/_editor/_cui/_panel_loader.py +246 -0
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +66 -0
- scitex/fts/_fig/_editor/_defaults.py +300 -0
- scitex/fts/_fig/_editor/_gui/__init__.py +11 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +20 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_bbox.py +1339 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_core.py +1688 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +664 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_renderer.py +853 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +79 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +41 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +16 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +85 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +217 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +112 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +59 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +212 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/canvas.css +176 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +59 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +45 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +101 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +138 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +31 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +7 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +56 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +78 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +288 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +143 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +245 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +293 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +426 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +184 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +57 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +100 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +34 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +124 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +851 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +4932 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +1657 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +36 -0
- scitex/fts/_fig/_models/_Annotations.py +115 -0
- scitex/fts/_fig/_models/_Axes.py +152 -0
- scitex/fts/_fig/_models/_Figure.py +138 -0
- scitex/fts/_fig/_models/_Guides.py +104 -0
- scitex/fts/_fig/_models/_Plot.py +123 -0
- scitex/fts/_fig/_models/_Styles.py +245 -0
- scitex/fts/_fig/_models/__init__.py +80 -0
- scitex/fts/_fig/_models/_plot_types/__init__.py +156 -0
- scitex/fts/_fig/_models/_plot_types/_bar.py +43 -0
- scitex/fts/_fig/_models/_plot_types/_box.py +38 -0
- scitex/fts/_fig/_models/_plot_types/_distribution.py +36 -0
- scitex/fts/_fig/_models/_plot_types/_errorbar.py +60 -0
- scitex/fts/_fig/_models/_plot_types/_histogram.py +30 -0
- scitex/fts/_fig/_models/_plot_types/_image.py +61 -0
- scitex/fts/_fig/_models/_plot_types/_line.py +57 -0
- scitex/fts/_fig/_models/_plot_types/_scatter.py +30 -0
- scitex/fts/_fig/_models/_plot_types/_seaborn.py +121 -0
- scitex/fts/_fig/_models/_plot_types/_violin.py +36 -0
- scitex/fts/_fig/_utils/__init__.py +129 -0
- scitex/fts/_fig/_utils/_auto_layout.py +127 -0
- scitex/fts/_fig/_utils/_calc_bounds.py +111 -0
- scitex/fts/_fig/_utils/_const_sizes.py +48 -0
- scitex/fts/_fig/_utils/_convert_coords.py +77 -0
- scitex/fts/_fig/_utils/_get_template.py +178 -0
- scitex/fts/_fig/_utils/_normalize.py +73 -0
- scitex/fts/_fig/_utils/_plot_layout.py +397 -0
- scitex/fts/_fig/_utils/_validate.py +197 -0
- scitex/fts/_kinds/__init__.py +45 -0
- scitex/fts/_kinds/_figure/__init__.py +19 -0
- scitex/fts/_kinds/_figure/_composite.py +345 -0
- scitex/fts/_kinds/_plot/__init__.py +25 -0
- scitex/fts/_kinds/_plot/_backend/__init__.py +53 -0
- scitex/fts/_kinds/_plot/_backend/_export.py +165 -0
- scitex/fts/_kinds/_plot/_backend/_parser.py +188 -0
- scitex/fts/_kinds/_plot/_backend/_render.py +538 -0
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +46 -0
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +82 -0
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +441 -0
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +52 -0
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +47 -0
- scitex/fts/_kinds/_plot/_models/_Annotations.py +115 -0
- scitex/fts/_kinds/_plot/_models/_Axes.py +152 -0
- scitex/fts/_kinds/_plot/_models/_Figure.py +138 -0
- scitex/fts/_kinds/_plot/_models/_Guides.py +104 -0
- scitex/fts/_kinds/_plot/_models/_Plot.py +123 -0
- scitex/fts/_kinds/_plot/_models/_Styles.py +245 -0
- scitex/fts/_kinds/_plot/_models/__init__.py +80 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +156 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +43 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +38 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +36 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +60 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +30 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +61 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +57 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +30 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +121 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +36 -0
- scitex/fts/_kinds/_plot/_utils/__init__.py +129 -0
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +127 -0
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +111 -0
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +48 -0
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +77 -0
- scitex/fts/_kinds/_plot/_utils/_get_template.py +178 -0
- scitex/fts/_kinds/_plot/_utils/_normalize.py +73 -0
- scitex/fts/_kinds/_plot/_utils/_plot_layout.py +397 -0
- scitex/fts/_kinds/_plot/_utils/_validate.py +197 -0
- scitex/fts/_kinds/_shape/__init__.py +141 -0
- scitex/fts/_kinds/_stats/__init__.py +56 -0
- scitex/fts/_kinds/_stats/_dataclasses/_Stats.py +423 -0
- scitex/fts/_kinds/_stats/_dataclasses/__init__.py +48 -0
- scitex/fts/_kinds/_table/__init__.py +72 -0
- scitex/fts/_kinds/_table/_latex/__init__.py +93 -0
- scitex/fts/_kinds/_table/_latex/_editor/__init__.py +11 -0
- scitex/fts/_kinds/_table/_latex/_editor/_app.py +725 -0
- scitex/fts/_kinds/_table/_latex/_export.py +279 -0
- scitex/fts/_kinds/_table/_latex/_figure_exporter.py +153 -0
- scitex/fts/_kinds/_table/_latex/_stats_formatter.py +274 -0
- scitex/fts/_kinds/_table/_latex/_table_exporter.py +362 -0
- scitex/fts/_kinds/_table/_latex/_utils.py +369 -0
- scitex/fts/_kinds/_table/_latex/_validator.py +445 -0
- scitex/fts/_kinds/_text/__init__.py +77 -0
- scitex/fts/_schemas/data_info.schema.json +75 -0
- scitex/fts/_schemas/encoding.schema.json +90 -0
- scitex/fts/_schemas/node.schema.json +145 -0
- scitex/fts/_schemas/render_manifest.schema.json +62 -0
- scitex/fts/_schemas/stats.schema.json +132 -0
- scitex/fts/_schemas/theme.schema.json +141 -0
- scitex/fts/_stats/__init__.py +48 -0
- scitex/fts/_stats/_dataclasses/_Stats.py +423 -0
- scitex/fts/_stats/_dataclasses/__init__.py +48 -0
- scitex/fts/_tables/__init__.py +65 -0
- scitex/fts/_tables/_latex/__init__.py +93 -0
- scitex/fts/_tables/_latex/_editor/__init__.py +11 -0
- scitex/fts/_tables/_latex/_editor/_app.py +725 -0
- scitex/fts/_tables/_latex/_export.py +279 -0
- scitex/fts/_tables/_latex/_figure_exporter.py +153 -0
- scitex/fts/_tables/_latex/_stats_formatter.py +274 -0
- scitex/fts/_tables/_latex/_table_exporter.py +362 -0
- scitex/fts/_tables/_latex/_utils.py +369 -0
- scitex/fts/_tables/_latex/_validator.py +445 -0
- scitex/gen/__init__.py +66 -25
- scitex/gen/misc.py +28 -0
- scitex/io/__init__.py +47 -20
- scitex/io/_load.py +87 -36
- scitex/io/_load_modules/__init__.py +10 -7
- scitex/io/_load_modules/_pandas.py +6 -1
- scitex/io/_save.py +299 -1556
- scitex/io/_save_modules/__init__.py +76 -19
- scitex/io/_save_modules/_figure_utils.py +90 -0
- scitex/io/_save_modules/_image_csv.py +497 -0
- scitex/io/_save_modules/_legends.py +91 -0
- scitex/io/_save_modules/_pltz_bundle.py +356 -0
- scitex/io/_save_modules/_pltz_stx.py +536 -0
- scitex/io/_save_modules/_stx_bundle.py +104 -0
- scitex/io/_save_modules/_symlink.py +96 -0
- scitex/io/_save_modules/_yaml.py +1 -1
- scitex/io/_save_modules/_zarr.py +64 -18
- scitex/io/bundle/README.md +212 -0
- scitex/io/bundle/__init__.py +110 -0
- scitex/io/{_bundle.py → bundle/_core.py} +219 -89
- scitex/io/bundle/_nested.py +713 -0
- scitex/io/bundle/_types.py +74 -0
- scitex/io/bundle/_zip.py +487 -0
- scitex/io/utils/h5_to_zarr.py +1 -1
- scitex/logging/__init__.py +108 -13
- scitex/logging/_errors.py +508 -0
- scitex/logging/_formatters.py +30 -6
- scitex/logging/_warnings.py +261 -0
- scitex/plt/__init__.py +4 -1
- scitex/plt/_figrecipe.py +236 -0
- scitex/plt/_subplots/_AxisWrapper.py +6 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +112 -1
- scitex/plt/_subplots/_FigWrapper.py +15 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +125 -489
- scitex/plt/_subplots/_export_as_csv.py +11 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +2 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +62 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +208 -0
- scitex/plt/_subplots/_fonts.py +71 -0
- scitex/plt/_subplots/_mm_layout.py +282 -0
- scitex/plt/gallery/__init__.py +99 -2
- scitex/plt/io/_layered_bundle.py +0 -0
- scitex/plt/styles/_plot_postprocess.py +3 -1
- scitex/plt/utils/_configure_mpl.py +16 -19
- scitex/repro/_RandomStateManager.py +13 -8
- scitex/resource/__init__.py +19 -1
- scitex/resource/_utils/_get_env_info.py +13 -25
- scitex/schema/__init__.py +149 -160
- scitex/schema/_encoding.py +273 -0
- scitex/schema/_figure_elements.py +406 -0
- scitex/schema/_plot.py +0 -0
- scitex/schema/_theme.py +360 -0
- scitex/schema/_validation.py +0 -98
- scitex/scholar/__init__.py +56 -14
- scitex/scholar/auth/ScholarAuthManager.py +1 -1
- scitex/scholar/auth/__init__.py +11 -2
- scitex/scholar/auth/providers/BaseAuthenticator.py +1 -1
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +1 -1
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +1 -1
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +1 -1
- scitex/scholar/config/ScholarConfig.py +1 -1
- scitex/scholar/core/Scholar.py +1 -1
- scitex/session/_decorator.py +18 -16
- scitex/session/_lifecycle.py +9 -11
- scitex/session/template.py +9 -8
- scitex/sh/test_sh.py +72 -0
- scitex/sh/test_sh_simple.py +61 -0
- scitex/stats/__init__.py +221 -97
- scitex/stats/_schema.py +21 -22
- scitex/stats/descriptive/_circular.py +212 -351
- scitex/stats/descriptive/_describe.py +81 -132
- scitex/stats/descriptive/_nan.py +205 -433
- scitex/stats/descriptive/_real.py +127 -141
- scitex/str/_format_plot_text.py +5 -5
- scitex/str/_latex.py +26 -84
- scitex/str/_latex_fallback.py +53 -47
- scitex/web/_search_pubmed.py +5 -4
- scitex/writer/tests/test_diff_between.py +451 -0
- scitex/writer/tests/test_document_section.py +311 -0
- scitex/writer/tests/test_document_workflow.py +393 -0
- scitex/writer/tests/test_writer.py +361 -0
- scitex/writer/tests/test_writer_integration.py +303 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/METADATA +364 -181
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/RECORD +479 -108
- scitex/fig/editor/_edit.py +0 -751
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +0 -905
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +0 -99
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +0 -96
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/WHEEL +0 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,190 +1,176 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
# Timestamp: "2025-12-27 (refactored)"
|
|
3
|
+
# File: scitex/stats/descriptive/_real.py
|
|
4
|
+
"""
|
|
5
|
+
Descriptive statistics for real-valued data.
|
|
6
|
+
|
|
7
|
+
Uses torch when available (preserves tensor type), falls back to numpy.
|
|
8
|
+
"""
|
|
9
|
+
|
|
6
10
|
from __future__ import annotations
|
|
11
|
+
|
|
7
12
|
import os
|
|
8
13
|
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
9
16
|
__FILE__ = __file__
|
|
10
17
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
-
# ----------------------------------------
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- Provides mean, standard deviation, variance calculations
|
|
17
|
-
- Calculates z-scores, skewness, kurtosis
|
|
18
|
-
- Computes quantiles (25th, 50th, 75th percentiles)
|
|
19
|
-
- Demonstrates statistical computations with synthetic data
|
|
20
|
-
|
|
21
|
-
Dependencies:
|
|
22
|
-
- packages:
|
|
23
|
-
- torch
|
|
24
|
-
- numpy
|
|
25
|
-
- scitex
|
|
26
|
-
|
|
27
|
-
IO:
|
|
28
|
-
- input-files:
|
|
29
|
-
- PyTorch tensor or numpy array
|
|
30
|
-
- output-files:
|
|
31
|
-
- Descriptive statistics results
|
|
32
|
-
"""
|
|
19
|
+
# Optional torch support
|
|
20
|
+
try:
|
|
21
|
+
import torch
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
HAS_TORCH = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
torch = None
|
|
26
|
+
HAS_TORCH = False
|
|
36
27
|
|
|
37
|
-
import numpy as np
|
|
38
|
-
import scitex as stx
|
|
39
|
-
import torch
|
|
40
|
-
from scitex import logging
|
|
41
28
|
|
|
42
|
-
|
|
29
|
+
def _is_torch_tensor(x):
|
|
30
|
+
"""Check if x is a torch tensor."""
|
|
31
|
+
return HAS_TORCH and isinstance(x, torch.Tensor)
|
|
32
|
+
|
|
43
33
|
|
|
44
|
-
|
|
34
|
+
def _normalize_axis(axis, dim):
|
|
35
|
+
"""Normalize axis/dim parameter."""
|
|
36
|
+
return dim if dim is not None else axis
|
|
45
37
|
|
|
46
|
-
|
|
38
|
+
|
|
39
|
+
# =============================================================================
|
|
40
|
+
# Core Functions - Use torch when input is tensor, numpy otherwise
|
|
41
|
+
# =============================================================================
|
|
47
42
|
|
|
48
43
|
|
|
49
|
-
@torch_fn
|
|
50
44
|
def mean(x, axis=-1, dim=None, keepdims=False):
|
|
51
|
-
|
|
45
|
+
"""Compute mean along specified axis.
|
|
46
|
+
|
|
47
|
+
Parameters
|
|
48
|
+
----------
|
|
49
|
+
x : array-like
|
|
50
|
+
Input data (numpy array or torch tensor)
|
|
51
|
+
axis : int, default=-1
|
|
52
|
+
Axis along which to compute (deprecated, use dim)
|
|
53
|
+
dim : int or tuple, optional
|
|
54
|
+
Dimension(s) along which to compute
|
|
55
|
+
keepdims : bool, default=False
|
|
56
|
+
Keep reduced dimensions
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
ndarray or Tensor
|
|
61
|
+
Mean values (same type as input)
|
|
62
|
+
"""
|
|
63
|
+
dim = _normalize_axis(axis, dim)
|
|
64
|
+
if _is_torch_tensor(x):
|
|
65
|
+
return x.mean(dim=dim, keepdim=keepdims)
|
|
66
|
+
return np.mean(np.asarray(x), axis=dim, keepdims=keepdims)
|
|
52
67
|
|
|
53
68
|
|
|
54
|
-
@torch_fn
|
|
55
69
|
def std(x, axis=-1, dim=None, keepdims=False):
|
|
56
|
-
|
|
70
|
+
"""Compute standard deviation along specified axis."""
|
|
71
|
+
dim = _normalize_axis(axis, dim)
|
|
72
|
+
if _is_torch_tensor(x):
|
|
73
|
+
return x.std(dim=dim, keepdim=keepdims)
|
|
74
|
+
return np.std(np.asarray(x), axis=dim, keepdims=keepdims)
|
|
57
75
|
|
|
58
76
|
|
|
59
|
-
@torch_fn
|
|
60
77
|
def var(x, axis=-1, dim=None, keepdims=False):
|
|
61
|
-
|
|
78
|
+
"""Compute variance along specified axis."""
|
|
79
|
+
dim = _normalize_axis(axis, dim)
|
|
80
|
+
if _is_torch_tensor(x):
|
|
81
|
+
return x.var(dim=dim, keepdim=keepdims)
|
|
82
|
+
return np.var(np.asarray(x), axis=dim, keepdims=keepdims)
|
|
62
83
|
|
|
63
84
|
|
|
64
|
-
@torch_fn
|
|
65
85
|
def zscore(x, axis=-1, dim=None, keepdims=True):
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
"""Compute z-scores along specified axis."""
|
|
87
|
+
dim = _normalize_axis(axis, dim)
|
|
88
|
+
if _is_torch_tensor(x):
|
|
89
|
+
_mean = x.mean(dim=dim, keepdim=True)
|
|
90
|
+
_std = x.std(dim=dim, keepdim=True)
|
|
91
|
+
zscores = (x - _mean) / _std
|
|
92
|
+
return zscores if keepdims else zscores.squeeze(dim)
|
|
93
|
+
else:
|
|
94
|
+
x = np.asarray(x)
|
|
95
|
+
_mean = np.mean(x, axis=dim, keepdims=True)
|
|
96
|
+
_std = np.std(x, axis=dim, keepdims=True)
|
|
97
|
+
zscores = (x - _mean) / _std
|
|
98
|
+
if not keepdims and dim is not None:
|
|
99
|
+
zscores = np.squeeze(zscores, axis=dim)
|
|
100
|
+
return zscores
|
|
70
101
|
|
|
71
102
|
|
|
72
|
-
@torch_fn
|
|
73
103
|
def skewness(x, axis=-1, dim=None, keepdims=False):
|
|
74
|
-
|
|
75
|
-
|
|
104
|
+
"""Compute skewness along specified axis."""
|
|
105
|
+
dim = _normalize_axis(axis, dim)
|
|
106
|
+
zscores = zscore(x, dim=dim, keepdims=True)
|
|
107
|
+
if _is_torch_tensor(x):
|
|
108
|
+
return torch.mean(torch.pow(zscores, 3.0), dim=dim, keepdim=keepdims)
|
|
109
|
+
return np.mean(np.power(zscores, 3.0), axis=dim, keepdims=keepdims)
|
|
76
110
|
|
|
77
111
|
|
|
78
|
-
@torch_fn
|
|
79
112
|
def kurtosis(x, axis=-1, dim=None, keepdims=False):
|
|
80
|
-
|
|
81
|
-
|
|
113
|
+
"""Compute excess kurtosis along specified axis."""
|
|
114
|
+
dim = _normalize_axis(axis, dim)
|
|
115
|
+
zscores = zscore(x, dim=dim, keepdims=True)
|
|
116
|
+
if _is_torch_tensor(x):
|
|
117
|
+
return torch.mean(torch.pow(zscores, 4.0), dim=dim, keepdim=keepdims) - 3.0
|
|
118
|
+
return np.mean(np.power(zscores, 4.0), axis=dim, keepdims=keepdims) - 3.0
|
|
82
119
|
|
|
83
120
|
|
|
84
|
-
@torch_fn
|
|
85
121
|
def quantile(x, q, axis=-1, dim=None, keepdims=False):
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
122
|
+
"""Compute quantile along specified axis.
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
x : array-like
|
|
127
|
+
Input data
|
|
128
|
+
q : float
|
|
129
|
+
Quantile to compute (0-100)
|
|
130
|
+
axis : int, default=-1
|
|
131
|
+
Axis along which to compute
|
|
132
|
+
dim : int or tuple, optional
|
|
133
|
+
Dimension(s) along which to compute
|
|
134
|
+
keepdims : bool, default=False
|
|
135
|
+
Keep reduced dimensions
|
|
136
|
+
|
|
137
|
+
Returns
|
|
138
|
+
-------
|
|
139
|
+
ndarray or Tensor
|
|
140
|
+
Quantile values
|
|
141
|
+
"""
|
|
142
|
+
dim = _normalize_axis(axis, dim)
|
|
143
|
+
|
|
144
|
+
if _is_torch_tensor(x):
|
|
145
|
+
if isinstance(dim, (tuple, list)):
|
|
146
|
+
result = x
|
|
147
|
+
for d in sorted(dim, reverse=True):
|
|
148
|
+
result = torch.quantile(result, q / 100, dim=d, keepdim=keepdims)
|
|
149
|
+
return result
|
|
150
|
+
return torch.quantile(x, q / 100, dim=dim, keepdim=keepdims)
|
|
90
151
|
else:
|
|
91
|
-
x =
|
|
92
|
-
|
|
152
|
+
x = np.asarray(x)
|
|
153
|
+
if isinstance(dim, (tuple, list)):
|
|
154
|
+
result = x
|
|
155
|
+
for d in sorted(dim, reverse=True):
|
|
156
|
+
result = np.quantile(result, q / 100, axis=d, keepdims=keepdims)
|
|
157
|
+
return result
|
|
158
|
+
return np.quantile(x, q / 100, axis=dim, keepdims=keepdims)
|
|
93
159
|
|
|
94
160
|
|
|
95
|
-
@torch_fn
|
|
96
161
|
def q25(x, axis=-1, dim=None, keepdims=False):
|
|
162
|
+
"""Compute 25th percentile."""
|
|
97
163
|
return quantile(x, 25, axis=axis, dim=dim, keepdims=keepdims)
|
|
98
164
|
|
|
99
165
|
|
|
100
|
-
@torch_fn
|
|
101
166
|
def q50(x, axis=-1, dim=None, keepdims=False):
|
|
167
|
+
"""Compute 50th percentile (median)."""
|
|
102
168
|
return quantile(x, 50, axis=axis, dim=dim, keepdims=keepdims)
|
|
103
169
|
|
|
104
170
|
|
|
105
|
-
@torch_fn
|
|
106
171
|
def q75(x, axis=-1, dim=None, keepdims=False):
|
|
172
|
+
"""Compute 75th percentile."""
|
|
107
173
|
return quantile(x, 75, axis=axis, dim=dim, keepdims=keepdims)
|
|
108
174
|
|
|
109
175
|
|
|
110
|
-
def main(args) -> int:
|
|
111
|
-
"""Demonstrate descriptive statistics functions with synthetic data."""
|
|
112
|
-
x = np.random.rand(4, 3, 2)
|
|
113
|
-
|
|
114
|
-
# Compute statistics
|
|
115
|
-
x_mean = mean(x)
|
|
116
|
-
x_std = std(x)
|
|
117
|
-
x_var = var(x)
|
|
118
|
-
x_skew = skewness(x)
|
|
119
|
-
x_kurt = kurtosis(x)
|
|
120
|
-
x_q25 = q25(x)
|
|
121
|
-
x_q50 = q50(x)
|
|
122
|
-
x_q75 = q75(x)
|
|
123
|
-
|
|
124
|
-
# Store results
|
|
125
|
-
results = {
|
|
126
|
-
"input": x,
|
|
127
|
-
"mean": x_mean,
|
|
128
|
-
"std": x_std,
|
|
129
|
-
"variance": x_var,
|
|
130
|
-
"skewness": x_skew,
|
|
131
|
-
"kurtosis": x_kurt,
|
|
132
|
-
"q25": x_q25,
|
|
133
|
-
"q50": x_q50,
|
|
134
|
-
"q75": x_q75,
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
for k, v in results.items():
|
|
138
|
-
if isinstance(v, (np.ndarray, torch.Tensor)):
|
|
139
|
-
print(f"\n{k}, Type: {type(v)}, Shape: {v.shape}, Values: {v}")
|
|
140
|
-
elif isinstance(v, list):
|
|
141
|
-
print(f"\n{k}, Type: {type(v)}, Length: {len(v)}, Values: {v}")
|
|
142
|
-
else:
|
|
143
|
-
print(f"\n{k}, Type: {type(v)}, Values: {v}")
|
|
144
|
-
|
|
145
|
-
return 0
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def parse_args() -> argparse.Namespace:
|
|
149
|
-
"""Parse command line arguments."""
|
|
150
|
-
parser = argparse.ArgumentParser(
|
|
151
|
-
description="Demonstrate descriptive statistics functions"
|
|
152
|
-
)
|
|
153
|
-
args = parser.parse_args()
|
|
154
|
-
return args
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def run_main() -> None:
|
|
158
|
-
"""Initialize scitex framework, run main function, and cleanup."""
|
|
159
|
-
global CONFIG, CC, sys, plt, rng
|
|
160
|
-
import sys
|
|
161
|
-
|
|
162
|
-
import matplotlib.pyplot as plt
|
|
163
|
-
import scitex as stx
|
|
164
|
-
|
|
165
|
-
args = parse_args()
|
|
166
|
-
CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
|
|
167
|
-
sys,
|
|
168
|
-
plt,
|
|
169
|
-
args=args,
|
|
170
|
-
file=__FILE__,
|
|
171
|
-
sdir_suffix=None,
|
|
172
|
-
verbose=False,
|
|
173
|
-
agg=True,
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
exit_status = main(args)
|
|
177
|
-
|
|
178
|
-
stx.session.close(
|
|
179
|
-
CONFIG,
|
|
180
|
-
verbose=False,
|
|
181
|
-
notify=False,
|
|
182
|
-
message="",
|
|
183
|
-
exit_status=exit_status,
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if __name__ == "__main__":
|
|
188
|
-
run_main()
|
|
189
|
-
|
|
190
176
|
# EOF
|
scitex/str/_format_plot_text.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Time-stamp: "2025-06-04 11:08:00 (ywatanabe)"
|
|
4
3
|
# File: ./src/scitex/str/_format_plot_text.py
|
|
5
4
|
|
|
@@ -16,10 +15,10 @@ Prerequisites:
|
|
|
16
15
|
"""
|
|
17
16
|
|
|
18
17
|
import re
|
|
19
|
-
from typing import
|
|
18
|
+
from typing import Optional, Tuple
|
|
20
19
|
|
|
21
20
|
try:
|
|
22
|
-
from ._latex_fallback import
|
|
21
|
+
from ._latex_fallback import latex_fallback_decorator, safe_latex_render
|
|
23
22
|
|
|
24
23
|
FALLBACK_AVAILABLE = True
|
|
25
24
|
except ImportError:
|
|
@@ -102,10 +101,11 @@ def format_plot_text(
|
|
|
102
101
|
|
|
103
102
|
if latex_math:
|
|
104
103
|
# Extract and preserve LaTeX math
|
|
104
|
+
# Use ||| delimiters to avoid being processed by _replace_underscores
|
|
105
105
|
latex_pattern = r"\$[^$]+\$"
|
|
106
106
|
latex_matches = re.findall(latex_pattern, text)
|
|
107
107
|
for i, match in enumerate(latex_matches):
|
|
108
|
-
placeholder = f"
|
|
108
|
+
placeholder = f"|||LATEX{i}|||"
|
|
109
109
|
latex_sections.append(match)
|
|
110
110
|
text_working = text_working.replace(match, placeholder, 1)
|
|
111
111
|
|
|
@@ -126,7 +126,7 @@ def format_plot_text(
|
|
|
126
126
|
|
|
127
127
|
# Restore LaTeX sections with fallback handling
|
|
128
128
|
for i, latex_section in enumerate(latex_sections):
|
|
129
|
-
placeholder = f"
|
|
129
|
+
placeholder = f"|||LATEX{i}|||"
|
|
130
130
|
if enable_fallback and FALLBACK_AVAILABLE:
|
|
131
131
|
# Apply fallback to LaTeX sections
|
|
132
132
|
safe_latex = safe_latex_render(latex_section, preserve_math=True)
|
scitex/str/_latex.py
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
|
|
4
3
|
# File: ./src/scitex/str/_latex.py
|
|
5
4
|
|
|
6
5
|
"""
|
|
7
|
-
LaTeX formatting functions
|
|
6
|
+
LaTeX formatting functions for string manipulation.
|
|
8
7
|
|
|
9
8
|
Functionality:
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
- Convert strings/numbers to LaTeX math mode format
|
|
10
|
+
- Add LaTeX hat notation
|
|
12
11
|
Input:
|
|
13
12
|
Strings or numbers to format
|
|
14
13
|
Output:
|
|
15
|
-
LaTeX-formatted strings
|
|
14
|
+
LaTeX-formatted strings (wrapped in $...$)
|
|
16
15
|
Prerequisites:
|
|
17
|
-
|
|
16
|
+
None (pure string formatting)
|
|
18
17
|
"""
|
|
19
18
|
|
|
20
|
-
from ._latex_fallback import safe_latex_render, latex_fallback_decorator
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
24
20
|
def to_latex_style(str_or_num):
|
|
25
21
|
"""
|
|
26
|
-
Convert string or number to LaTeX math mode format
|
|
22
|
+
Convert string or number to LaTeX math mode format.
|
|
27
23
|
|
|
28
24
|
Parameters
|
|
29
25
|
----------
|
|
@@ -33,38 +29,34 @@ def to_latex_style(str_or_num):
|
|
|
33
29
|
Returns
|
|
34
30
|
-------
|
|
35
31
|
str
|
|
36
|
-
LaTeX-formatted string
|
|
32
|
+
LaTeX-formatted string wrapped in $...$
|
|
37
33
|
|
|
38
34
|
Examples
|
|
39
35
|
--------
|
|
40
36
|
>>> to_latex_style('aaa')
|
|
41
37
|
'$aaa$'
|
|
42
38
|
|
|
43
|
-
>>> to_latex_style('
|
|
44
|
-
'
|
|
39
|
+
>>> to_latex_style('x^2')
|
|
40
|
+
'$x^2$'
|
|
45
41
|
|
|
46
|
-
|
|
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.
|
|
42
|
+
>>> to_latex_style(123)
|
|
43
|
+
'$123$'
|
|
50
44
|
"""
|
|
51
|
-
if not str_or_num and str_or_num != 0:
|
|
45
|
+
if not str_or_num and str_or_num != 0:
|
|
52
46
|
return ""
|
|
53
47
|
|
|
54
48
|
string = str(str_or_num)
|
|
55
49
|
|
|
56
50
|
# Avoid double-wrapping
|
|
57
51
|
if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
|
|
58
|
-
return
|
|
52
|
+
return string
|
|
59
53
|
else:
|
|
60
|
-
|
|
61
|
-
return safe_latex_render(latex_string)
|
|
54
|
+
return f"${string}$"
|
|
62
55
|
|
|
63
56
|
|
|
64
|
-
@latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
|
|
65
57
|
def add_hat_in_latex_style(str_or_num):
|
|
66
58
|
"""
|
|
67
|
-
Add LaTeX hat notation to string
|
|
59
|
+
Add LaTeX hat notation to string.
|
|
68
60
|
|
|
69
61
|
Parameters
|
|
70
62
|
----------
|
|
@@ -74,82 +66,32 @@ def add_hat_in_latex_style(str_or_num):
|
|
|
74
66
|
Returns
|
|
75
67
|
-------
|
|
76
68
|
str
|
|
77
|
-
LaTeX-formatted string with hat notation
|
|
69
|
+
LaTeX-formatted string with hat notation
|
|
78
70
|
|
|
79
71
|
Examples
|
|
80
72
|
--------
|
|
81
73
|
>>> add_hat_in_latex_style('aaa')
|
|
82
74
|
'$\\hat{aaa}$'
|
|
83
75
|
|
|
84
|
-
>>> add_hat_in_latex_style('x')
|
|
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
|
-
|
|
76
|
+
>>> add_hat_in_latex_style('x')
|
|
77
|
+
'$\\hat{x}$'
|
|
99
78
|
|
|
100
|
-
|
|
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
|
|
79
|
+
>>> add_hat_in_latex_style(1)
|
|
80
|
+
'$\\hat{1}$'
|
|
115
81
|
"""
|
|
116
82
|
if not str_or_num and str_or_num != 0:
|
|
117
83
|
return ""
|
|
118
84
|
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
85
|
+
hat_latex = rf"\hat{{{str_or_num}}}"
|
|
86
|
+
return f"${hat_latex}$"
|
|
149
87
|
|
|
150
88
|
|
|
151
89
|
# Backward compatibility aliases
|
|
152
90
|
latex_style = to_latex_style
|
|
153
91
|
hat_latex_style = add_hat_in_latex_style
|
|
154
92
|
|
|
93
|
+
# Safe versions that are identical (no fallback needed for pure formatting)
|
|
94
|
+
safe_to_latex_style = to_latex_style
|
|
95
|
+
safe_add_hat_in_latex_style = add_hat_in_latex_style
|
|
96
|
+
|
|
155
97
|
# EOF
|
scitex/str/_latex_fallback.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-08-21 21:37:23 (ywatanabe)"
|
|
4
3
|
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/str/_latex_fallback.py
|
|
5
4
|
# ----------------------------------------
|
|
6
5
|
from __future__ import annotations
|
|
6
|
+
|
|
7
7
|
import os
|
|
8
8
|
|
|
9
9
|
__FILE__ = __file__
|
|
@@ -170,59 +170,65 @@ def latex_to_mathtext(latex_str: str) -> str:
|
|
|
170
170
|
if text.startswith("$") and text.endswith("$"):
|
|
171
171
|
text = text[1:-1]
|
|
172
172
|
|
|
173
|
-
#
|
|
174
|
-
|
|
173
|
+
# Simple string replacements (double backslash to single)
|
|
174
|
+
simple_conversions = {
|
|
175
175
|
# Greek letters
|
|
176
|
-
r"\\alpha":
|
|
177
|
-
r"\\beta":
|
|
178
|
-
r"\\gamma":
|
|
179
|
-
r"\\delta":
|
|
180
|
-
r"\\epsilon":
|
|
181
|
-
r"\\theta":
|
|
182
|
-
r"\\lambda":
|
|
183
|
-
r"\\mu":
|
|
184
|
-
r"\\pi":
|
|
185
|
-
r"\\sigma":
|
|
186
|
-
r"\\tau":
|
|
187
|
-
r"\\phi":
|
|
188
|
-
r"\\omega":
|
|
176
|
+
r"\\alpha": "\\alpha",
|
|
177
|
+
r"\\beta": "\\beta",
|
|
178
|
+
r"\\gamma": "\\gamma",
|
|
179
|
+
r"\\delta": "\\delta",
|
|
180
|
+
r"\\epsilon": "\\epsilon",
|
|
181
|
+
r"\\theta": "\\theta",
|
|
182
|
+
r"\\lambda": "\\lambda",
|
|
183
|
+
r"\\mu": "\\mu",
|
|
184
|
+
r"\\pi": "\\pi",
|
|
185
|
+
r"\\sigma": "\\sigma",
|
|
186
|
+
r"\\tau": "\\tau",
|
|
187
|
+
r"\\phi": "\\phi",
|
|
188
|
+
r"\\omega": "\\omega",
|
|
189
189
|
# Mathematical symbols
|
|
190
|
-
r"\\sum":
|
|
191
|
-
r"\\int":
|
|
192
|
-
r"\\partial":
|
|
193
|
-
r"\\infty":
|
|
194
|
-
r"\\pm":
|
|
195
|
-
r"\\times":
|
|
196
|
-
r"\\cdot":
|
|
197
|
-
r"\\approx":
|
|
198
|
-
r"\\neq":
|
|
199
|
-
r"\\leq":
|
|
200
|
-
r"\\geq":
|
|
190
|
+
r"\\sum": "\\sum",
|
|
191
|
+
r"\\int": "\\int",
|
|
192
|
+
r"\\partial": "\\partial",
|
|
193
|
+
r"\\infty": "\\infty",
|
|
194
|
+
r"\\pm": "\\pm",
|
|
195
|
+
r"\\times": "\\times",
|
|
196
|
+
r"\\cdot": "\\cdot",
|
|
197
|
+
r"\\approx": "\\approx",
|
|
198
|
+
r"\\neq": "\\neq",
|
|
199
|
+
r"\\leq": "\\leq",
|
|
200
|
+
r"\\geq": "\\geq",
|
|
201
201
|
# Functions
|
|
202
|
-
r"\\sin":
|
|
203
|
-
r"\\cos":
|
|
204
|
-
r"\\tan":
|
|
205
|
-
r"\\log":
|
|
206
|
-
r"\\ln":
|
|
207
|
-
r"\\exp":
|
|
202
|
+
r"\\sin": "\\sin",
|
|
203
|
+
r"\\cos": "\\cos",
|
|
204
|
+
r"\\tan": "\\tan",
|
|
205
|
+
r"\\log": "\\log",
|
|
206
|
+
r"\\ln": "\\ln",
|
|
207
|
+
r"\\exp": "\\exp",
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# Apply simple string replacements
|
|
211
|
+
for pattern, replacement in simple_conversions.items():
|
|
212
|
+
text = text.replace(pattern, replacement)
|
|
213
|
+
|
|
214
|
+
# Regex patterns with capture groups
|
|
215
|
+
regex_conversions = [
|
|
208
216
|
# Formatting (limited mathtext support)
|
|
209
|
-
r"\\textbf\{([^}]+)\}"
|
|
210
|
-
r"\\mathbf\{([^}]+)\}"
|
|
211
|
-
r"\\textit\{([^}]+)\}"
|
|
212
|
-
r"\\mathit\{([^}]+)\}"
|
|
217
|
+
(r"\\textbf\{([^}]+)\}", r"\\mathbf{\1}"),
|
|
218
|
+
(r"\\mathbf\{([^}]+)\}", r"\\mathbf{\1}"),
|
|
219
|
+
(r"\\textit\{([^}]+)\}", r"\\mathit{\1}"),
|
|
220
|
+
(r"\\mathit\{([^}]+)\}", r"\\mathit{\1}"),
|
|
213
221
|
# Hats and accents
|
|
214
|
-
r"\\hat\{([^}]+)\}"
|
|
215
|
-
r"\\overrightarrow\{([^}]+)\}"
|
|
216
|
-
r"\\vec\{([^}]+)\}"
|
|
222
|
+
(r"\\hat\{([^}]+)\}", r"\\hat{\1}"),
|
|
223
|
+
(r"\\overrightarrow\{([^}]+)\}", r"\\vec{\1}"),
|
|
224
|
+
(r"\\vec\{([^}]+)\}", r"\\vec{\1}"),
|
|
217
225
|
# Fractions (simple ones)
|
|
218
|
-
r"\\frac\{([^}]+)\}\{([^}]+)\}"
|
|
219
|
-
|
|
220
|
-
# Powers and indices are handled naturally by mathtext
|
|
221
|
-
}
|
|
226
|
+
(r"\\frac\{([^}]+)\}\{([^}]+)\}", r"\\frac{\1}{\2}"),
|
|
227
|
+
]
|
|
222
228
|
|
|
223
|
-
# Apply conversions
|
|
224
|
-
for
|
|
225
|
-
text = re.sub(
|
|
229
|
+
# Apply regex conversions
|
|
230
|
+
for pattern, replacement in regex_conversions:
|
|
231
|
+
text = re.sub(pattern, replacement, text)
|
|
226
232
|
|
|
227
233
|
# Wrap in mathtext markers
|
|
228
234
|
return f"${text}$"
|