scitex 2.10.3__py3-none-any.whl → 2.13.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 +1 -4
- scitex/__main__.py +24 -5
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/_optional_deps.py +33 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
- scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
- scitex/ai/plt/_plot_feature_importance.py +1 -1
- scitex/ai/plt/_plot_learning_curve.py +1 -1
- scitex/ai/plt/_plot_optuna_study.py +1 -1
- scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
- scitex/ai/plt/_plot_roc_curve.py +1 -1
- scitex/ai/plt/_stx_conf_mat.py +1 -1
- scitex/ai/training/_LearningCurveLogger.py +1 -1
- scitex/audio/mcp_server.py +38 -8
- scitex/bridge/_figrecipe.py +1 -1
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_plt.py +1 -1
- scitex/bridge/_stats_vis.py +2 -2
- scitex/browser/automation/CookieHandler.py +1 -1
- scitex/browser/core/BrowserMixin.py +1 -1
- scitex/browser/core/ChromeProfileManager.py +1 -1
- scitex/browser/debugging/_browser_logger.py +1 -1
- scitex/browser/debugging/_highlight_element.py +1 -1
- scitex/browser/debugging/_show_grid.py +1 -1
- scitex/browser/interaction/click_center.py +1 -1
- scitex/browser/interaction/click_with_fallbacks.py +1 -1
- scitex/browser/interaction/close_popups.py +1 -1
- scitex/browser/interaction/fill_with_fallbacks.py +1 -1
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
- scitex/browser/stealth/HumanBehavior.py +1 -1
- scitex/browser/stealth/StealthManager.py +1 -1
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/canvas/_mcp_handlers.py +372 -0
- scitex/canvas/_mcp_tool_schemas.py +219 -0
- scitex/{fig → canvas}/backend/_parser.py +1 -1
- scitex/{fig → canvas}/canvas.py +13 -14
- scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
- scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
- scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
- scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
- scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
- scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
- scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
- scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
- scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
- scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
- scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
- scitex/{fig → canvas}/io/__init__.py +32 -38
- scitex/{fig → canvas}/io/_bundle.py +217 -154
- scitex/{fig → canvas}/io/_canvas.py +1 -1
- scitex/{fig → canvas}/io/_data.py +1 -1
- scitex/{fig → canvas}/io/_export.py +1 -1
- scitex/{fig → canvas}/io/_load.py +1 -1
- scitex/{fig → canvas}/io/_panel.py +1 -1
- scitex/{fig → canvas}/io/_save.py +1 -1
- scitex/canvas/mcp_server.py +151 -0
- scitex/{fig → canvas}/model/__init__.py +1 -1
- scitex/{fig → canvas}/model/_annotations.py +1 -1
- scitex/{fig → canvas}/model/_axes.py +1 -1
- scitex/{fig → canvas}/model/_figure.py +1 -1
- scitex/{fig → canvas}/model/_guides.py +1 -1
- scitex/{fig → canvas}/model/_plot.py +1 -1
- scitex/{fig → canvas}/model/_styles.py +1 -1
- scitex/{fig → canvas}/utils/__init__.py +1 -1
- scitex/capture/mcp_server.py +41 -12
- scitex/cli/audio.py +233 -0
- scitex/cli/capture.py +307 -0
- scitex/cli/convert.py +10 -6
- scitex/cli/main.py +27 -4
- scitex/cli/repro.py +233 -0
- scitex/cli/resource.py +240 -0
- scitex/cli/stats.py +325 -0
- scitex/cli/template.py +236 -0
- scitex/cli/tex.py +286 -0
- scitex/cli/web.py +11 -12
- scitex/dev/__init__.py +3 -0
- scitex/dev/_pyproject.py +405 -0
- scitex/dev/plt/__init__.py +2 -2
- scitex/dev/plt/mpl/get_dir_ax.py +1 -1
- scitex/dev/plt/mpl/get_signatures.py +1 -1
- scitex/dev/plt/mpl/get_signatures_details.py +1 -1
- scitex/diagram/README.md +7 -7
- scitex/diagram/_mcp_handlers.py +400 -0
- scitex/diagram/_mcp_tool_schemas.py +157 -0
- scitex/diagram/mcp_server.py +151 -0
- scitex/dsp/_demo_sig.py +51 -5
- scitex/dsp/_mne.py +13 -2
- scitex/dsp/_modulation_index.py +15 -3
- scitex/dsp/_pac.py +23 -5
- scitex/dsp/_psd.py +16 -4
- scitex/dsp/_resample.py +24 -4
- scitex/dsp/_transform.py +16 -3
- scitex/dsp/add_noise.py +15 -1
- scitex/dsp/norm.py +17 -2
- scitex/dsp/reference.py +17 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
- scitex/dsp/utils/_zero_pad.py +18 -4
- scitex/dt/_normalize_timestamp.py +1 -1
- scitex/git/_session.py +1 -1
- scitex/io/__init__.py +7 -19
- scitex/io/_load.py +15 -19
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_con.py +17 -6
- scitex/io/_load_modules/_eeg.py +28 -13
- scitex/io/_load_modules/_optuna.py +21 -63
- scitex/io/_load_modules/_torch.py +11 -3
- scitex/io/_save.py +11 -16
- scitex/io/_save_modules/__init__.py +6 -10
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
- scitex/io/_save_modules/_plot_bundle.py +112 -0
- scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
- scitex/io/_save_modules/_stx_bundle.py +16 -16
- scitex/io/_save_modules/_torch.py +11 -3
- scitex/io/bundle/README.md +89 -80
- scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
- scitex/io/bundle/__init__.py +67 -35
- scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
- scitex/io/bundle/_core.py +184 -97
- scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
- scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
- scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
- scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
- scitex/io/bundle/_manifest.py +99 -0
- scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
- scitex/io/bundle/_nested.py +113 -100
- scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
- scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
- scitex/io/bundle/_types.py +41 -16
- scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
- scitex/io/bundle/_zip.py +21 -31
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
- scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
- scitex/io/bundle/schemas/__init__.py +30 -0
- scitex/mcp_server.py +159 -0
- scitex/parallel/_run.py +5 -4
- scitex/path/_find.py +60 -83
- scitex/path/_get_module_path.py +23 -21
- scitex/path/_get_spath.py +6 -27
- scitex/path/_getsize.py +23 -9
- scitex/path/_increment_version.py +31 -38
- scitex/path/_mk_spath.py +26 -29
- scitex/path/_path.py +5 -12
- scitex/path/_split.py +27 -15
- scitex/path/_this_path.py +23 -9
- scitex/plt/_mcp_handlers.py +361 -0
- scitex/plt/_mcp_tool_schemas.py +169 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
- scitex/plt/gallery/_generate.py +76 -50
- scitex/plt/io/__init__.py +17 -19
- scitex/plt/io/_bundle.py +99 -52
- scitex/plt/io/_layered_bundle.py +303 -168
- scitex/plt/mcp_server.py +205 -0
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/repro/README_RandomStateManager.md +3 -3
- scitex/repro/_RandomStateManager.py +14 -14
- scitex/repro/_gen_ID.py +1 -1
- scitex/repro/_gen_timestamp.py +1 -1
- scitex/repro/_hash_array.py +4 -4
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/scholar/__main__.py +24 -2
- scitex/scholar/_mcp_handlers.py +685 -0
- scitex/scholar/_mcp_tool_schemas.py +339 -0
- scitex/scholar/docs/template.py +1 -1
- scitex/scholar/examples/07_storage_integration.py +1 -1
- scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
- scitex/scholar/impact_factor/jcr/build_database.py +1 -1
- scitex/scholar/mcp_server.py +315 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
- scitex/scholar/storage/PaperIO.py +1 -1
- scitex/session/README.md +4 -4
- scitex/session/__init__.py +1 -1
- scitex/session/_decorator.py +9 -9
- scitex/session/_lifecycle.py +5 -5
- scitex/session/template.py +1 -1
- scitex/stats/__init__.py +30 -33
- scitex/stats/__main__.py +281 -0
- scitex/stats/_mcp_handlers.py +1191 -0
- scitex/stats/_mcp_tool_schemas.py +384 -0
- scitex/stats/_schema.py +1 -1
- scitex/stats/correct/_correct_bonferroni.py +1 -1
- scitex/stats/correct/_correct_fdr.py +1 -1
- scitex/stats/correct/_correct_fdr_.py +1 -1
- scitex/stats/correct/_correct_holm.py +1 -1
- scitex/stats/correct/_correct_sidak.py +1 -1
- scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
- scitex/stats/effect_sizes/_cohens_d.py +1 -1
- scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
- scitex/stats/effect_sizes/_eta_squared.py +1 -1
- scitex/stats/effect_sizes/_prob_superiority.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- scitex/stats/mcp_server.py +405 -0
- scitex/stats/posthoc/_dunnett.py +1 -1
- scitex/stats/posthoc/_games_howell.py +1 -1
- scitex/stats/posthoc/_tukey_hsd.py +1 -1
- scitex/stats/power/_power.py +1 -1
- scitex/stats/utils/_effect_size.py +1 -1
- scitex/stats/utils/_formatters.py +1 -1
- scitex/stats/utils/_power.py +1 -1
- scitex/template/_mcp_handlers.py +259 -0
- scitex/template/_mcp_tool_schemas.py +112 -0
- scitex/template/mcp_server.py +186 -0
- scitex/utils/_verify_scitex_format.py +2 -2
- scitex/utils/template.py +1 -1
- scitex/web/__init__.py +12 -11
- scitex/web/_scraping.py +26 -265
- scitex/web/download_images.py +316 -0
- scitex/writer/Writer.py +1 -1
- scitex/writer/_clone_writer_project.py +1 -1
- scitex/writer/_validate_tree_structures.py +1 -1
- scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
- scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
- scitex/writer/dataclasses/core/_Document.py +1 -1
- scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
- scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
- scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
- scitex/writer/utils/.legacy_git_retry.py +7 -5
- scitex/writer/utils/_parse_latex_logs.py +1 -1
- scitex-2.13.0.dist-info/METADATA +1231 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
- scitex-2.13.0.dist-info/entry_points.txt +11 -0
- scitex/fig/editor/_defaults.py +0 -300
- scitex/fig/editor/edit/panel_loader.py +0 -232
- scitex/fig/editor/flask_editor/_bbox.py +0 -1299
- scitex/fig/editor/flask_editor/_core.py +0 -1429
- scitex/fig/editor/flask_editor/_renderer.py +0 -813
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
- scitex/fts/README.md +0 -262
- scitex/fts/TODO.md +0 -66
- scitex/fts/__init__.py +0 -90
- scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
- scitex/fts/_bundle/__init__.py +0 -38
- scitex/fts/_bundle/_utils/__init__.py +0 -55
- scitex/fts/_bundle/_utils/_const.py +0 -26
- scitex/fts/_bundle/_utils/_errors.py +0 -73
- scitex/fts/_bundle/_utils/_generate.py +0 -21
- scitex/fts/_bundle/_utils/_types.py +0 -76
- scitex/fts/_bundle/_zipbundle.py +0 -165
- scitex/fts/_fig/__init__.py +0 -22
- scitex/fts/_fig/_backend/_parser.py +0 -188
- scitex/fts/_fig/_editor/__init__.py +0 -14
- scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
- scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
- scitex/fts/_fig/_models/_Annotations.py +0 -115
- scitex/fts/_fig/_models/_Axes.py +0 -152
- scitex/fts/_fig/_models/_Figure.py +0 -138
- scitex/fts/_fig/_models/_Plot.py +0 -123
- scitex/fts/_fig/_utils/_plot_layout.py +0 -397
- scitex/fts/_kinds/_figure/_composite.py +0 -345
- scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
- scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
- scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
- scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
- scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
- scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
- scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
- scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
- scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
- scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
- scitex/fts/_kinds/_table/_latex/_export.py +0 -279
- scitex/fts/_stats/__init__.py +0 -48
- scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
- scitex/fts/_stats/_dataclasses/__init__.py +0 -48
- scitex/fts/_tables/__init__.py +0 -65
- scitex/fts/_tables/_latex/__init__.py +0 -93
- scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
- scitex/fts/_tables/_latex/_editor/_app.py +0 -725
- scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
- scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
- scitex/fts/_tables/_latex/_table_exporter.py +0 -362
- scitex/fts/_tables/_latex/_utils.py +0 -369
- scitex/fts/_tables/_latex/_validator.py +0 -445
- scitex/io/_save_modules/_pltz_bundle.py +0 -356
- scitex-2.10.3.dist-info/METADATA +0 -952
- scitex-2.10.3.dist-info/entry_points.txt +0 -2
- /scitex/{fig → canvas}/README.md +0 -0
- /scitex/{fig → canvas}/backend/__init__.py +0 -0
- /scitex/{fig → canvas}/backend/_export.py +0 -0
- /scitex/{fig → canvas}/backend/_render.py +0 -0
- /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{fig → canvas}/editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
- /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
- /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
- /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
- /scitex/{fig → canvas}/io/_directory.py +0 -0
- /scitex/{fig → canvas}/model/_plot_types.py +0 -0
- /scitex/{fig → canvas}/utils/_defaults.py +0 -0
- /scitex/{fig → canvas}/utils/_validate.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
scitex/session/README.md
CHANGED
|
@@ -22,7 +22,7 @@ def main(
|
|
|
22
22
|
CONFIG=scitex.INJECTED,
|
|
23
23
|
plt=scitex.INJECTED,
|
|
24
24
|
COLORS=scitex.INJECTED,
|
|
25
|
-
|
|
25
|
+
rng=scitex.INJECTED,
|
|
26
26
|
):
|
|
27
27
|
"""Args injected by @scitex.session decorator"""
|
|
28
28
|
print(f"Session ID: {CONFIG['ID']}")
|
|
@@ -46,7 +46,7 @@ def main(
|
|
|
46
46
|
CONFIG=scitex.INJECTED,
|
|
47
47
|
plt=scitex.INJECTED,
|
|
48
48
|
COLORS=scitex.INJECTED,
|
|
49
|
-
|
|
49
|
+
rng=scitex.INJECTED,
|
|
50
50
|
):
|
|
51
51
|
"""Args injected by @scitex.session decorator"""
|
|
52
52
|
print(f"Session ID: {CONFIG['ID']}")
|
|
@@ -59,7 +59,7 @@ The decorator automatically injects the following parameters:
|
|
|
59
59
|
- `CONFIG`: Configuration dictionary with session metadata
|
|
60
60
|
- `plt`: Configured matplotlib.pyplot module
|
|
61
61
|
- `COLORS`: Color cycle dictionary
|
|
62
|
-
- `
|
|
62
|
+
- `rng`: RandomStateManager instance
|
|
63
63
|
|
|
64
64
|
Using `scitex.INJECTED` as default values makes it explicit that these parameters are injected by the decorator.
|
|
65
65
|
|
|
@@ -249,4 +249,4 @@ if __name__ == "__main__":
|
|
|
249
249
|
- Automatically fixes seeds for all libraries
|
|
250
250
|
- Reproducible across runs
|
|
251
251
|
|
|
252
|
-
<!-- EOF -->
|
|
252
|
+
<!-- EOF -->
|
scitex/session/__init__.py
CHANGED
|
@@ -22,7 +22,7 @@ Usage:
|
|
|
22
22
|
from scitex import session
|
|
23
23
|
|
|
24
24
|
# Start a session
|
|
25
|
-
CONFIG, sys.stdout, sys.stderr, plt, COLORS,
|
|
25
|
+
CONFIG, sys.stdout, sys.stderr, plt, COLORS, rng = session.start(sys, plt)
|
|
26
26
|
|
|
27
27
|
# Your experiment code here
|
|
28
28
|
|
scitex/session/_decorator.py
CHANGED
|
@@ -79,7 +79,7 @@ def session(
|
|
|
79
79
|
# - CONFIG: Session configuration dict
|
|
80
80
|
# - plt: Matplotlib pyplot (configured for session)
|
|
81
81
|
# - COLORS: Custom Colors
|
|
82
|
-
# -
|
|
82
|
+
# - rng: RandomStateManager (fixes seeds, creates named generators)
|
|
83
83
|
logger.info(f"Session ID: {CONFIG['ID']}")
|
|
84
84
|
logger.info(f"Output directory: {CONFIG['SDIR_RUN']}")
|
|
85
85
|
# ... training code ...
|
|
@@ -100,8 +100,8 @@ def session(
|
|
|
100
100
|
- CONFIG (dict): Session configuration with ID, SDIR, paths, etc.
|
|
101
101
|
- plt (module): matplotlib.pyplot configured with session settings
|
|
102
102
|
- COLORS (CustomColors): Custom Colors for consistent plotting
|
|
103
|
-
-
|
|
104
|
-
and creating named generators via
|
|
103
|
+
- rng (RandomStateManager): Manages reproducibility by fixing global seeds
|
|
104
|
+
and creating named generators via rng("name")
|
|
105
105
|
"""
|
|
106
106
|
|
|
107
107
|
def decorator(func: Callable) -> Callable:
|
|
@@ -163,7 +163,7 @@ def _run_with_session(
|
|
|
163
163
|
# Start session
|
|
164
164
|
import matplotlib.pyplot as plt
|
|
165
165
|
|
|
166
|
-
CONFIG, stdout, stderr, plt, COLORS,
|
|
166
|
+
CONFIG, stdout, stderr, plt, COLORS, rng = start(
|
|
167
167
|
sys=sys_module,
|
|
168
168
|
plt=plt,
|
|
169
169
|
args=cleaned_args,
|
|
@@ -182,7 +182,7 @@ def _run_with_session(
|
|
|
182
182
|
func_globals["CONFIG"] = CONFIG
|
|
183
183
|
func_globals["plt"] = plt
|
|
184
184
|
func_globals["COLORS"] = COLORS
|
|
185
|
-
func_globals["
|
|
185
|
+
func_globals["rng"] = rng
|
|
186
186
|
func_globals["logger"] = script_logger
|
|
187
187
|
|
|
188
188
|
# Log injected globals for user awareness (only in verbose mode)
|
|
@@ -195,7 +195,7 @@ def _run_with_session(
|
|
|
195
195
|
_decorator_logger.info(f" - CONFIG['PID']: {CONFIG['PID']}")
|
|
196
196
|
_decorator_logger.info(" • plt - matplotlib.pyplot (configured for session)")
|
|
197
197
|
_decorator_logger.info(" • COLORS - CustomColors (for consistent plotting)")
|
|
198
|
-
_decorator_logger.info(" •
|
|
198
|
+
_decorator_logger.info(" • rng - RandomStateManager (for reproducibility)")
|
|
199
199
|
_decorator_logger.info(" • logger - SciTeX logger (configured for your script)")
|
|
200
200
|
_decorator_logger.info("=" * 60)
|
|
201
201
|
|
|
@@ -216,7 +216,7 @@ def _run_with_session(
|
|
|
216
216
|
"CONFIG": CONFIG,
|
|
217
217
|
"plt": plt,
|
|
218
218
|
"COLORS": COLORS,
|
|
219
|
-
"
|
|
219
|
+
"rng": rng,
|
|
220
220
|
"logger": script_logger,
|
|
221
221
|
}
|
|
222
222
|
|
|
@@ -419,7 +419,7 @@ Global Variables Injected by @session Decorator:
|
|
|
419
419
|
plt.plot(x, y, color=COLORS.blue)
|
|
420
420
|
plt.plot(x, y, color=COLORS['blue'])
|
|
421
421
|
|
|
422
|
-
|
|
422
|
+
rng (RandomStateManager)
|
|
423
423
|
Manages reproducible randomness
|
|
424
424
|
|
|
425
425
|
logger (SciTeXLogger)
|
|
@@ -596,7 +596,7 @@ def run(func: Callable, parse_args: Callable = None, **session_kwargs) -> Any:
|
|
|
596
596
|
# Start session
|
|
597
597
|
import matplotlib.pyplot as plt
|
|
598
598
|
|
|
599
|
-
CONFIG, stdout, stderr, plt, COLORS,
|
|
599
|
+
CONFIG, stdout, stderr, plt, COLORS, rng = start(
|
|
600
600
|
sys=sys_module,
|
|
601
601
|
plt=plt,
|
|
602
602
|
args=args,
|
scitex/session/_lifecycle.py
CHANGED
|
@@ -411,12 +411,12 @@ def start(
|
|
|
411
411
|
Returns
|
|
412
412
|
-------
|
|
413
413
|
tuple
|
|
414
|
-
(CONFIGS, stdout, stderr, plt, COLORS,
|
|
414
|
+
(CONFIGS, stdout, stderr, plt, COLORS, rng)
|
|
415
415
|
- CONFIGS: Configuration dictionary
|
|
416
416
|
- stdout, stderr: Redirected output streams
|
|
417
417
|
- plt: Configured matplotlib.pyplot module
|
|
418
418
|
- COLORS: Color cycle dictionary
|
|
419
|
-
-
|
|
419
|
+
- rng: Global RandomStateManager instance for reproducible random generation
|
|
420
420
|
"""
|
|
421
421
|
IS_DEBUG = _get_debug_mode()
|
|
422
422
|
ID, PID = _initialize_env(IS_DEBUG)
|
|
@@ -516,7 +516,7 @@ def start(
|
|
|
516
516
|
pass
|
|
517
517
|
|
|
518
518
|
# Initialize RandomStateManager (automatically fixes all seeds)
|
|
519
|
-
|
|
519
|
+
rng = RandomStateManager(seed=seed, verbose=verbose)
|
|
520
520
|
if verbose:
|
|
521
521
|
logger.info(f"Initialized RandomStateManager with seed {seed}")
|
|
522
522
|
|
|
@@ -554,9 +554,9 @@ def start(
|
|
|
554
554
|
|
|
555
555
|
# Return appropriate values based on whether sys was provided
|
|
556
556
|
if sys is not None:
|
|
557
|
-
return CONFIGS, sys.stdout, sys.stderr, plt, COLORS,
|
|
557
|
+
return CONFIGS, sys.stdout, sys.stderr, plt, COLORS, rng
|
|
558
558
|
else:
|
|
559
|
-
return CONFIGS, None, None, plt, COLORS,
|
|
559
|
+
return CONFIGS, None, None, plt, COLORS, rng
|
|
560
560
|
|
|
561
561
|
|
|
562
562
|
def _format_diff_time(diff_time):
|
scitex/session/template.py
CHANGED
scitex/stats/__init__.py
CHANGED
|
@@ -57,21 +57,21 @@ from .auto import (
|
|
|
57
57
|
)
|
|
58
58
|
|
|
59
59
|
# =============================================================================
|
|
60
|
-
# Stats Schema - Use scitex.
|
|
60
|
+
# Stats Schema - Use scitex.io.bundle.Stats as single source of truth
|
|
61
61
|
# =============================================================================
|
|
62
62
|
|
|
63
|
-
#
|
|
63
|
+
# Re-export Stats from bundle module
|
|
64
64
|
try:
|
|
65
|
-
from scitex.
|
|
65
|
+
from scitex.io.bundle import Stats
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
BUNDLE_AVAILABLE = True
|
|
68
68
|
except ImportError:
|
|
69
69
|
Stats = None
|
|
70
|
-
|
|
70
|
+
BUNDLE_AVAILABLE = False
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
def test_result_to_stats(result: dict) -> "Stats":
|
|
74
|
-
"""Convert test result dict to
|
|
74
|
+
"""Convert test result dict to Stats schema.
|
|
75
75
|
|
|
76
76
|
Parameters
|
|
77
77
|
----------
|
|
@@ -92,26 +92,24 @@ def test_result_to_stats(result: dict) -> "Stats":
|
|
|
92
92
|
Returns
|
|
93
93
|
-------
|
|
94
94
|
Stats
|
|
95
|
-
|
|
95
|
+
Stats object suitable for bundle storage
|
|
96
96
|
|
|
97
97
|
Example
|
|
98
98
|
-------
|
|
99
99
|
>>> result = stats.t_test(x, y)
|
|
100
|
-
>>>
|
|
101
|
-
>>> bundle.stats =
|
|
100
|
+
>>> stat_obj = stats.test_result_to_stats(result)
|
|
101
|
+
>>> bundle.stats = stat_obj
|
|
102
102
|
"""
|
|
103
|
-
if not
|
|
104
|
-
raise ImportError("scitex.
|
|
103
|
+
if not BUNDLE_AVAILABLE:
|
|
104
|
+
raise ImportError("scitex.io.bundle is required for Stats conversion")
|
|
105
105
|
|
|
106
106
|
import uuid
|
|
107
107
|
|
|
108
|
-
from scitex.
|
|
108
|
+
from scitex.io.bundle._stats._dataclasses._Stats import (
|
|
109
109
|
Analysis,
|
|
110
110
|
EffectSize,
|
|
111
111
|
StatMethod,
|
|
112
|
-
|
|
113
|
-
from scitex.fts._stats._dataclasses._Stats import (
|
|
114
|
-
StatResult as FTSStatResult,
|
|
112
|
+
StatResult,
|
|
115
113
|
)
|
|
116
114
|
|
|
117
115
|
# Handle legacy flat format vs new nested format
|
|
@@ -134,7 +132,7 @@ def test_result_to_stats(result: dict) -> "Stats":
|
|
|
134
132
|
ci_lower=ci[0] if len(ci) > 0 else None,
|
|
135
133
|
ci_upper=ci[1] if len(ci) > 1 else None,
|
|
136
134
|
)
|
|
137
|
-
stat_result =
|
|
135
|
+
stat_result = StatResult(
|
|
138
136
|
statistic=result.get("statistic", 0.0),
|
|
139
137
|
statistic_name=result.get("statistic_name", ""),
|
|
140
138
|
p_value=result.get("p_value", 1.0),
|
|
@@ -164,7 +162,7 @@ def test_result_to_stats(result: dict) -> "Stats":
|
|
|
164
162
|
ci_upper=es.get("ci_upper"),
|
|
165
163
|
)
|
|
166
164
|
|
|
167
|
-
stat_result =
|
|
165
|
+
stat_result = StatResult(
|
|
168
166
|
statistic=results_data.get("statistic", 0.0),
|
|
169
167
|
statistic_name=results_data.get("statistic_name", ""),
|
|
170
168
|
p_value=results_data.get("p_value", 1.0),
|
|
@@ -189,25 +187,25 @@ def test_result_to_stats(result: dict) -> "Stats":
|
|
|
189
187
|
|
|
190
188
|
|
|
191
189
|
# =============================================================================
|
|
192
|
-
# .
|
|
190
|
+
# .stats Bundle Support
|
|
193
191
|
# =============================================================================
|
|
194
192
|
|
|
195
193
|
|
|
196
|
-
def
|
|
194
|
+
def save_stats(
|
|
197
195
|
comparisons,
|
|
198
196
|
path,
|
|
199
197
|
metadata=None,
|
|
200
198
|
as_zip=False,
|
|
201
199
|
):
|
|
202
200
|
"""
|
|
203
|
-
Save statistical results as
|
|
201
|
+
Save statistical results as a SciTeX bundle.
|
|
204
202
|
|
|
205
203
|
Parameters
|
|
206
204
|
----------
|
|
207
205
|
comparisons : list of dict
|
|
208
206
|
List of comparison results.
|
|
209
207
|
path : str or Path
|
|
210
|
-
Output path (e.g., "results.zip").
|
|
208
|
+
Output path (e.g., "results.stats" or "results.stats.zip").
|
|
211
209
|
metadata : dict, optional
|
|
212
210
|
Additional metadata.
|
|
213
211
|
as_zip : bool, optional
|
|
@@ -220,14 +218,14 @@ def save_statsz(
|
|
|
220
218
|
"""
|
|
221
219
|
from pathlib import Path
|
|
222
220
|
|
|
223
|
-
from scitex.
|
|
221
|
+
from scitex.io.bundle import Bundle
|
|
224
222
|
|
|
225
223
|
p = Path(path)
|
|
226
224
|
if as_zip and not p.suffix == ".zip":
|
|
227
225
|
p = p.with_suffix(".zip")
|
|
228
226
|
|
|
229
|
-
# Create
|
|
230
|
-
bundle =
|
|
227
|
+
# Create bundle
|
|
228
|
+
bundle = Bundle(p, create=True, bundle_type="stats")
|
|
231
229
|
|
|
232
230
|
# Convert comparisons to Stats
|
|
233
231
|
if comparisons:
|
|
@@ -246,14 +244,14 @@ def save_statsz(
|
|
|
246
244
|
return p
|
|
247
245
|
|
|
248
246
|
|
|
249
|
-
def
|
|
247
|
+
def load_stats(path):
|
|
250
248
|
"""
|
|
251
|
-
Load a stats bundle
|
|
249
|
+
Load a stats bundle.
|
|
252
250
|
|
|
253
251
|
Parameters
|
|
254
252
|
----------
|
|
255
253
|
path : str or Path
|
|
256
|
-
Path to bundle.
|
|
254
|
+
Path to bundle (.stats or .stats.zip).
|
|
257
255
|
|
|
258
256
|
Returns
|
|
259
257
|
-------
|
|
@@ -262,9 +260,9 @@ def load_statsz(path):
|
|
|
262
260
|
Each comparison is a flat dict with:
|
|
263
261
|
- name, method, p_value, effect_size, ci95, formatted
|
|
264
262
|
"""
|
|
265
|
-
from scitex.
|
|
263
|
+
from scitex.io.bundle import Bundle
|
|
266
264
|
|
|
267
|
-
bundle =
|
|
265
|
+
bundle = Bundle(path)
|
|
268
266
|
|
|
269
267
|
comparisons = []
|
|
270
268
|
if bundle.stats and bundle.stats.analyses:
|
|
@@ -317,9 +315,8 @@ __all__ = [
|
|
|
317
315
|
"describe",
|
|
318
316
|
# Torch availability flag (for GPU acceleration)
|
|
319
317
|
"TORCH_AVAILABLE",
|
|
320
|
-
# Stats schema
|
|
318
|
+
# Stats schema
|
|
321
319
|
"Stats",
|
|
322
|
-
"FTS_AVAILABLE",
|
|
323
320
|
# Auto module convenience exports
|
|
324
321
|
"StatContext",
|
|
325
322
|
"TestRule",
|
|
@@ -334,8 +331,8 @@ __all__ = [
|
|
|
334
331
|
# Conversion utilities
|
|
335
332
|
"test_result_to_stats",
|
|
336
333
|
# Bundle functions
|
|
337
|
-
"
|
|
338
|
-
"
|
|
334
|
+
"save_stats",
|
|
335
|
+
"load_stats",
|
|
339
336
|
]
|
|
340
337
|
|
|
341
338
|
__version__ = "2.2.0"
|
scitex/stats/__main__.py
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-08
|
|
3
|
+
# File: src/scitex/stats/__main__.py
|
|
4
|
+
# ----------------------------------------
|
|
5
|
+
|
|
6
|
+
"""Stats CLI entry point.
|
|
7
|
+
|
|
8
|
+
Subcommand-based interface:
|
|
9
|
+
- recommend: Recommend statistical tests based on data characteristics
|
|
10
|
+
- test: Run a statistical test
|
|
11
|
+
- power: Power analysis and sample size calculation
|
|
12
|
+
- mcp: Start MCP server for LLM integration
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import asyncio
|
|
19
|
+
import json
|
|
20
|
+
import sys
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def create_parser():
|
|
24
|
+
"""Create main argument parser with subcommands."""
|
|
25
|
+
parser = argparse.ArgumentParser(
|
|
26
|
+
prog="python -m scitex.stats",
|
|
27
|
+
description="""
|
|
28
|
+
SciTeX Stats - Statistical Testing Framework
|
|
29
|
+
═══════════════════════════════════════════
|
|
30
|
+
|
|
31
|
+
Subcommand interface:
|
|
32
|
+
recommend - Recommend statistical tests
|
|
33
|
+
test - Run a statistical test
|
|
34
|
+
power - Power analysis
|
|
35
|
+
mcp - Start MCP server for LLM integration
|
|
36
|
+
""",
|
|
37
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
subparsers = parser.add_subparsers(
|
|
41
|
+
dest="command",
|
|
42
|
+
help="Available commands",
|
|
43
|
+
required=True,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# ========================================
|
|
47
|
+
# Subcommand: recommend
|
|
48
|
+
# ========================================
|
|
49
|
+
recommend_parser = subparsers.add_parser(
|
|
50
|
+
"recommend",
|
|
51
|
+
help="Recommend statistical tests",
|
|
52
|
+
description="Recommend appropriate statistical tests based on data characteristics",
|
|
53
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
54
|
+
)
|
|
55
|
+
recommend_parser.add_argument(
|
|
56
|
+
"--n-groups",
|
|
57
|
+
type=int,
|
|
58
|
+
default=2,
|
|
59
|
+
help="Number of groups to compare (default: 2)",
|
|
60
|
+
)
|
|
61
|
+
recommend_parser.add_argument(
|
|
62
|
+
"--sample-sizes",
|
|
63
|
+
type=int,
|
|
64
|
+
nargs="+",
|
|
65
|
+
help="Sample sizes for each group",
|
|
66
|
+
)
|
|
67
|
+
recommend_parser.add_argument(
|
|
68
|
+
"--outcome",
|
|
69
|
+
type=str,
|
|
70
|
+
choices=["continuous", "ordinal", "categorical", "binary"],
|
|
71
|
+
default="continuous",
|
|
72
|
+
help="Outcome variable type (default: continuous)",
|
|
73
|
+
)
|
|
74
|
+
recommend_parser.add_argument(
|
|
75
|
+
"--design",
|
|
76
|
+
type=str,
|
|
77
|
+
choices=["between", "within", "mixed"],
|
|
78
|
+
default="between",
|
|
79
|
+
help="Study design (default: between)",
|
|
80
|
+
)
|
|
81
|
+
recommend_parser.add_argument(
|
|
82
|
+
"--paired",
|
|
83
|
+
action="store_true",
|
|
84
|
+
help="Data is paired/matched",
|
|
85
|
+
)
|
|
86
|
+
recommend_parser.add_argument(
|
|
87
|
+
"--has-control",
|
|
88
|
+
action="store_true",
|
|
89
|
+
help="Has a control group",
|
|
90
|
+
)
|
|
91
|
+
recommend_parser.add_argument(
|
|
92
|
+
"--top-k",
|
|
93
|
+
type=int,
|
|
94
|
+
default=3,
|
|
95
|
+
help="Number of recommendations (default: 3)",
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# ========================================
|
|
99
|
+
# Subcommand: test
|
|
100
|
+
# ========================================
|
|
101
|
+
test_parser = subparsers.add_parser(
|
|
102
|
+
"test",
|
|
103
|
+
help="Run a statistical test",
|
|
104
|
+
description="Execute a statistical test on provided data",
|
|
105
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
106
|
+
)
|
|
107
|
+
test_parser.add_argument(
|
|
108
|
+
"test_name",
|
|
109
|
+
type=str,
|
|
110
|
+
help="Name of the test to run",
|
|
111
|
+
)
|
|
112
|
+
test_parser.add_argument(
|
|
113
|
+
"--data",
|
|
114
|
+
type=str,
|
|
115
|
+
help="JSON array of group data, e.g., '[[1,2,3],[4,5,6]]'",
|
|
116
|
+
)
|
|
117
|
+
test_parser.add_argument(
|
|
118
|
+
"--alternative",
|
|
119
|
+
type=str,
|
|
120
|
+
choices=["two-sided", "less", "greater"],
|
|
121
|
+
default="two-sided",
|
|
122
|
+
help="Alternative hypothesis (default: two-sided)",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# ========================================
|
|
126
|
+
# Subcommand: power
|
|
127
|
+
# ========================================
|
|
128
|
+
power_parser = subparsers.add_parser(
|
|
129
|
+
"power",
|
|
130
|
+
help="Power analysis",
|
|
131
|
+
description="Calculate statistical power or required sample size",
|
|
132
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
133
|
+
)
|
|
134
|
+
power_parser.add_argument(
|
|
135
|
+
"--test-type",
|
|
136
|
+
type=str,
|
|
137
|
+
choices=["ttest", "anova", "correlation", "chi2"],
|
|
138
|
+
default="ttest",
|
|
139
|
+
help="Type of statistical test (default: ttest)",
|
|
140
|
+
)
|
|
141
|
+
power_parser.add_argument(
|
|
142
|
+
"--effect-size",
|
|
143
|
+
type=float,
|
|
144
|
+
help="Expected effect size (Cohen's d, f, r, or w)",
|
|
145
|
+
)
|
|
146
|
+
power_parser.add_argument(
|
|
147
|
+
"--n",
|
|
148
|
+
type=int,
|
|
149
|
+
help="Sample size per group (for power calculation)",
|
|
150
|
+
)
|
|
151
|
+
power_parser.add_argument(
|
|
152
|
+
"--power",
|
|
153
|
+
type=float,
|
|
154
|
+
default=0.8,
|
|
155
|
+
help="Desired power (default: 0.8)",
|
|
156
|
+
)
|
|
157
|
+
power_parser.add_argument(
|
|
158
|
+
"--alpha",
|
|
159
|
+
type=float,
|
|
160
|
+
default=0.05,
|
|
161
|
+
help="Significance level (default: 0.05)",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# ========================================
|
|
165
|
+
# Subcommand: mcp
|
|
166
|
+
# ========================================
|
|
167
|
+
subparsers.add_parser(
|
|
168
|
+
"mcp",
|
|
169
|
+
help="Start MCP server for LLM integration",
|
|
170
|
+
description="Start the MCP (Model Context Protocol) server for Claude/LLM integration",
|
|
171
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
return parser
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def run_recommend(args):
|
|
178
|
+
"""Run test recommendation."""
|
|
179
|
+
from scitex.stats.auto import StatContext, recommend_tests
|
|
180
|
+
from scitex.stats.auto._rules import TEST_RULES
|
|
181
|
+
|
|
182
|
+
ctx = StatContext(
|
|
183
|
+
n_groups=args.n_groups,
|
|
184
|
+
sample_sizes=args.sample_sizes or [30] * args.n_groups,
|
|
185
|
+
outcome_type=args.outcome,
|
|
186
|
+
design=args.design,
|
|
187
|
+
paired=args.paired,
|
|
188
|
+
has_control_group=args.has_control,
|
|
189
|
+
n_factors=1,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
tests = recommend_tests(ctx, top_k=args.top_k)
|
|
193
|
+
|
|
194
|
+
print("\n=== Recommended Statistical Tests ===\n")
|
|
195
|
+
for i, test_name in enumerate(tests, 1):
|
|
196
|
+
rule = TEST_RULES.get(test_name)
|
|
197
|
+
if rule:
|
|
198
|
+
print(f"{i}. {test_name}")
|
|
199
|
+
print(f" Family: {rule.family}")
|
|
200
|
+
print(f" Priority: {rule.priority}")
|
|
201
|
+
if rule.needs_normality:
|
|
202
|
+
print(" Requires: normality assumption")
|
|
203
|
+
if rule.needs_equal_variance:
|
|
204
|
+
print(" Requires: equal variance assumption")
|
|
205
|
+
print()
|
|
206
|
+
|
|
207
|
+
return 0
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def run_test(args):
|
|
211
|
+
"""Run a statistical test."""
|
|
212
|
+
if not args.data:
|
|
213
|
+
print("Error: --data is required")
|
|
214
|
+
return 1
|
|
215
|
+
|
|
216
|
+
data = json.loads(args.data)
|
|
217
|
+
|
|
218
|
+
from scitex.stats._mcp_handlers import run_test_handler
|
|
219
|
+
|
|
220
|
+
result = asyncio.run(
|
|
221
|
+
run_test_handler(
|
|
222
|
+
test_name=args.test_name,
|
|
223
|
+
data=data,
|
|
224
|
+
alternative=args.alternative,
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
print(json.dumps(result, indent=2))
|
|
229
|
+
return 0 if result.get("success") else 1
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def run_power(args):
|
|
233
|
+
"""Run power analysis."""
|
|
234
|
+
from scitex.stats._mcp_handlers import power_analysis_handler
|
|
235
|
+
|
|
236
|
+
result = asyncio.run(
|
|
237
|
+
power_analysis_handler(
|
|
238
|
+
test_type=args.test_type,
|
|
239
|
+
effect_size=args.effect_size,
|
|
240
|
+
n=args.n,
|
|
241
|
+
power=args.power,
|
|
242
|
+
alpha=args.alpha,
|
|
243
|
+
)
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
print(json.dumps(result, indent=2))
|
|
247
|
+
return 0 if result.get("success") else 1
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
async def run_mcp_server():
|
|
251
|
+
"""Run MCP server."""
|
|
252
|
+
from .mcp_server import main as mcp_main
|
|
253
|
+
|
|
254
|
+
print("Starting Stats MCP server...", file=sys.stderr)
|
|
255
|
+
await mcp_main()
|
|
256
|
+
return 0
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def main():
|
|
260
|
+
"""Main entry point."""
|
|
261
|
+
parser = create_parser()
|
|
262
|
+
args = parser.parse_args()
|
|
263
|
+
|
|
264
|
+
if args.command == "recommend":
|
|
265
|
+
return run_recommend(args)
|
|
266
|
+
elif args.command == "test":
|
|
267
|
+
return run_test(args)
|
|
268
|
+
elif args.command == "power":
|
|
269
|
+
return run_power(args)
|
|
270
|
+
elif args.command == "mcp":
|
|
271
|
+
return asyncio.run(run_mcp_server())
|
|
272
|
+
else:
|
|
273
|
+
print(f"Unknown command: {args.command}")
|
|
274
|
+
return 1
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
if __name__ == "__main__":
|
|
278
|
+
sys.exit(main())
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
# EOF
|