scitex 2.8.1__py3-none-any.whl → 2.10.2__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/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/edit/panel_loader.py +1 -1
- scitex/fig/io/_bundle.py +7 -7
- 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 -32
- 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} +168 -97
- scitex/io/bundle/_nested.py +713 -0
- scitex/io/bundle/_types.py +74 -0
- scitex/io/{_zip_bundle.py → bundle/_zip.py} +93 -45
- 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/_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/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/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/_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.8.1.dist-info → scitex-2.10.2.dist-info}/METADATA +368 -183
- {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/RECORD +412 -97
- 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.8.1.dist-info → scitex-2.10.2.dist-info}/WHEEL +0 -0
- {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/entry_points.txt +0 -0
- {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,905 +0,0 @@
|
|
|
1
|
-
# Agreed Architecture v06 - Graph Visualization Enhancement
|
|
2
|
-
|
|
3
|
-
## Executive Summary
|
|
4
|
-
|
|
5
|
-
``` yaml
|
|
6
|
-
project_context:
|
|
7
|
-
current_state:
|
|
8
|
-
test_success_rate: 99.1% (1474 passed, 13 failed, 24 skipped)
|
|
9
|
-
graph_infrastructure: "Comprehensive NetworkX-based KnowledgeGraphManager"
|
|
10
|
-
node_types: ["document", "chunk", "entity"]
|
|
11
|
-
relationship_extraction: "Sophisticated patterns for cross-references"
|
|
12
|
-
persistence: "Pickle-based graph serialization"
|
|
13
|
-
mcp_integration: "FastMCP 2.0 compliant server"
|
|
14
|
-
|
|
15
|
-
enhancement_scope:
|
|
16
|
-
purpose: "Add powerful visualization capabilities to existing graph infrastructure"
|
|
17
|
-
key_features:
|
|
18
|
-
- Document connectivity visualization (Connected Papers-style)
|
|
19
|
-
- Interactive exploration with filtering and clustering
|
|
20
|
-
- Multiple output formats (PNG, SVG, HTML)
|
|
21
|
-
- CLI command integration
|
|
22
|
-
- MCP server tools for AI assistant integration
|
|
23
|
-
scale_support: "100-10K+ documents with performance optimization"
|
|
24
|
-
|
|
25
|
-
architectural_approach:
|
|
26
|
-
strategy: "Extension-based enhancement preserving existing infrastructure"
|
|
27
|
-
principles:
|
|
28
|
-
- Leverage existing KnowledgeGraphManager without modification
|
|
29
|
-
- Follow established naming conventions (_private files, public classes)
|
|
30
|
-
- Maintain test-driven development with >90% coverage
|
|
31
|
-
- Ensure backward compatibility
|
|
32
|
-
- Support both library and MCP usage modes
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Current Infrastructure Analysis
|
|
36
|
-
|
|
37
|
-
### Graph Foundation Assessment
|
|
38
|
-
|
|
39
|
-
``` yaml
|
|
40
|
-
existing_capabilities:
|
|
41
|
-
knowledge_graph_manager:
|
|
42
|
-
location: "src/semantic_graph/graph/_KnowledgeGraphManager.py"
|
|
43
|
-
features:
|
|
44
|
-
- NetworkX MultiDiGraph for directed relationships
|
|
45
|
-
- Node types: document, chunk, entity
|
|
46
|
-
- Comprehensive metadata tracking
|
|
47
|
-
- Cross-reference pattern extraction
|
|
48
|
-
- Graph persistence and loading
|
|
49
|
-
- Multiple search strategies (semantic, keyword, hybrid, graph)
|
|
50
|
-
- Centrality-based ranking
|
|
51
|
-
- Graph statistics and metrics
|
|
52
|
-
|
|
53
|
-
data_structures:
|
|
54
|
-
GraphNodeContainer:
|
|
55
|
-
fields: [node_id, node_type, title, file_path, content, metadata]
|
|
56
|
-
methods: [to_dict()]
|
|
57
|
-
|
|
58
|
-
GraphEdgeContainer:
|
|
59
|
-
fields: [source_id, target_id, relationship_type, weight, metadata]
|
|
60
|
-
methods: [to_dict()]
|
|
61
|
-
|
|
62
|
-
reference_patterns:
|
|
63
|
-
file_reference: "File path mentions"
|
|
64
|
-
section_reference: "Chapter/section numbers"
|
|
65
|
-
function_reference: "Function calls and mentions"
|
|
66
|
-
class_reference: "Class definitions and usage"
|
|
67
|
-
variable_reference: "Variable references"
|
|
68
|
-
|
|
69
|
-
strengths:
|
|
70
|
-
- Rich metadata for visualization
|
|
71
|
-
- Multiple relationship types
|
|
72
|
-
- File path tracking for document grouping
|
|
73
|
-
- Entity and relationship indices
|
|
74
|
-
- Graph traversal capabilities
|
|
75
|
-
|
|
76
|
-
opportunities:
|
|
77
|
-
- No visualization methods currently
|
|
78
|
-
- Graph statistics could feed visualization
|
|
79
|
-
- Relationship patterns perfect for edge styling
|
|
80
|
-
- Node metadata ideal for clustering
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Visualization Architecture Design
|
|
84
|
-
|
|
85
|
-
### Core Components Structure
|
|
86
|
-
|
|
87
|
-
``` text
|
|
88
|
-
src/semantic_graph/
|
|
89
|
-
├── visualization/ # NEW: Graph visualization module
|
|
90
|
-
│ ├── __init__.py
|
|
91
|
-
│ │ └── from ._GraphVisualizer import GraphVisualizer
|
|
92
|
-
│ │
|
|
93
|
-
│ ├── _GraphVisualizer.py # Main visualization orchestrator
|
|
94
|
-
│ │ └── class GraphVisualizer:
|
|
95
|
-
│ │ ├── __init__(self, graph_manager: KnowledgeGraphManager) -> None
|
|
96
|
-
│ │ ├── visualize_document_graph(self, output_path: str, **kwargs) -> str
|
|
97
|
-
│ │ ├── visualize_entity_graph(self, output_path: str, **kwargs) -> str
|
|
98
|
-
│ │ ├── visualize_relationship_network(self, output_path: str, **kwargs) -> str
|
|
99
|
-
│ │ ├── generate_interactive_html(self, output_path: str, **kwargs) -> str
|
|
100
|
-
│ │ ├── export_to_format(self, format: str, output_path: str) -> str
|
|
101
|
-
│ │ └── get_visualization_metrics(self) -> Dict[str, Any]
|
|
102
|
-
│ │
|
|
103
|
-
│ ├── _LayoutEngine.py # Graph layout algorithms
|
|
104
|
-
│ │ └── class LayoutEngine:
|
|
105
|
-
│ │ ├── __init__(self, algorithm: str = "force_directed") -> None
|
|
106
|
-
│ │ ├── compute_layout(self, graph: nx.Graph, **kwargs) -> Dict[str, Tuple[float, float]]
|
|
107
|
-
│ │ ├── force_directed_layout(self, graph: nx.Graph) -> Dict[str, Tuple[float, float]]
|
|
108
|
-
│ │ ├── hierarchical_layout(self, graph: nx.Graph) -> Dict[str, Tuple[float, float]]
|
|
109
|
-
│ │ ├── circular_layout(self, graph: nx.Graph) -> Dict[str, Tuple[float, float]]
|
|
110
|
-
│ │ └── clustered_layout(self, graph: nx.Graph, clusters: Dict) -> Dict[str, Tuple[float, float]]
|
|
111
|
-
│ │
|
|
112
|
-
│ ├── _NodeRenderer.py # Node visualization and styling
|
|
113
|
-
│ │ └── class NodeRenderer:
|
|
114
|
-
│ │ ├── __init__(self, style_config: Optional[Dict] = None) -> None
|
|
115
|
-
│ │ ├── render_node(self, node: GraphNodeContainer, position: Tuple[float, float]) -> Any
|
|
116
|
-
│ │ ├── get_node_color(self, node_type: str) -> str
|
|
117
|
-
│ │ ├── get_node_size(self, node: GraphNodeContainer) -> float
|
|
118
|
-
│ │ ├── get_node_shape(self, node_type: str) -> str
|
|
119
|
-
│ │ └── apply_clustering_colors(self, nodes: List, clusters: Dict) -> Dict[str, str]
|
|
120
|
-
│ │
|
|
121
|
-
│ ├── _EdgeRenderer.py # Edge visualization and styling
|
|
122
|
-
│ │ └── class EdgeRenderer:
|
|
123
|
-
│ │ ├── __init__(self, style_config: Optional[Dict] = None) -> None
|
|
124
|
-
│ │ ├── render_edge(self, edge: GraphEdgeContainer, positions: Dict) -> Any
|
|
125
|
-
│ │ ├── get_edge_color(self, relationship_type: str) -> str
|
|
126
|
-
│ │ ├── get_edge_width(self, weight: float) -> float
|
|
127
|
-
│ │ ├── get_edge_style(self, relationship_type: str) -> str
|
|
128
|
-
│ │ └── calculate_edge_curvature(self, source: str, target: str) -> float
|
|
129
|
-
│ │
|
|
130
|
-
│ ├── _FilterManager.py # Graph filtering and subgraph extraction
|
|
131
|
-
│ │ └── class FilterManager:
|
|
132
|
-
│ │ ├── __init__(self) -> None
|
|
133
|
-
│ │ ├── filter_by_node_type(self, graph: nx.Graph, node_types: List[str]) -> nx.Graph
|
|
134
|
-
│ │ ├── filter_by_relationship_type(self, graph: nx.Graph, rel_types: List[str]) -> nx.Graph
|
|
135
|
-
│ │ ├── filter_by_centrality(self, graph: nx.Graph, threshold: float) -> nx.Graph
|
|
136
|
-
│ │ ├── extract_subgraph(self, graph: nx.Graph, center_nodes: List[str], depth: int) -> nx.Graph
|
|
137
|
-
│ │ └── filter_by_metadata(self, graph: nx.Graph, conditions: Dict) -> nx.Graph
|
|
138
|
-
│ │
|
|
139
|
-
│ ├── _ClusteringEngine.py # Graph clustering algorithms
|
|
140
|
-
│ │ └── class ClusteringEngine:
|
|
141
|
-
│ │ ├── __init__(self) -> None
|
|
142
|
-
│ │ ├── detect_communities(self, graph: nx.Graph) -> Dict[str, int]
|
|
143
|
-
│ │ ├── cluster_by_file_path(self, graph: nx.Graph) -> Dict[str, int]
|
|
144
|
-
│ │ ├── cluster_by_similarity(self, graph: nx.Graph, threshold: float) -> Dict[str, int]
|
|
145
|
-
│ │ ├── hierarchical_clustering(self, graph: nx.Graph) -> Dict[str, int]
|
|
146
|
-
│ │ └── get_cluster_statistics(self, clusters: Dict) -> Dict[str, Any]
|
|
147
|
-
│ │
|
|
148
|
-
│ ├── _InteractiveExporter.py # Interactive HTML/JS visualization
|
|
149
|
-
│ │ └── class InteractiveExporter:
|
|
150
|
-
│ │ ├── __init__(self, template_path: Optional[str] = None) -> None
|
|
151
|
-
│ │ ├── export_to_html(self, graph_data: Dict, output_path: str) -> str
|
|
152
|
-
│ │ ├── generate_d3_json(self, graph: nx.Graph) -> str
|
|
153
|
-
│ │ ├── generate_vis_js_data(self, graph: nx.Graph) -> Dict
|
|
154
|
-
│ │ ├── embed_interactivity(self, html_content: str, interactions: Dict) -> str
|
|
155
|
-
│ │ └── add_search_interface(self, html_content: str) -> str
|
|
156
|
-
│ │
|
|
157
|
-
│ ├── _StaticExporter.py # Static image export (PNG, SVG, PDF)
|
|
158
|
-
│ │ └── class StaticExporter:
|
|
159
|
-
│ │ ├── __init__(self) -> None
|
|
160
|
-
│ │ ├── export_to_png(self, figure: Any, output_path: str, dpi: int = 300) -> str
|
|
161
|
-
│ │ ├── export_to_svg(self, figure: Any, output_path: str) -> str
|
|
162
|
-
│ │ ├── export_to_pdf(self, figure: Any, output_path: str) -> str
|
|
163
|
-
│ │ ├── create_matplotlib_figure(self, graph: nx.Graph, layout: Dict) -> Any
|
|
164
|
-
│ │ └── optimize_for_print(self, figure: Any) -> Any
|
|
165
|
-
│ │
|
|
166
|
-
│ └── types/ # Visualization-specific types
|
|
167
|
-
│ ├── __init__.py
|
|
168
|
-
│ ├── _VisualizationConfig.py
|
|
169
|
-
│ │ └── @dataclass class VisualizationConfig:
|
|
170
|
-
│ │ ├── output_format: str = "html"
|
|
171
|
-
│ │ ├── width: int = 1200
|
|
172
|
-
│ │ ├── height: int = 800
|
|
173
|
-
│ │ ├── layout_algorithm: str = "force_directed"
|
|
174
|
-
│ │ ├── show_labels: bool = True
|
|
175
|
-
│ │ ├── node_size_metric: str = "centrality"
|
|
176
|
-
│ │ ├── edge_width_metric: str = "weight"
|
|
177
|
-
│ │ ├── color_scheme: str = "default"
|
|
178
|
-
│ │ └── interactive: bool = True
|
|
179
|
-
│ │
|
|
180
|
-
│ └── _VisualizationMetrics.py
|
|
181
|
-
│ └── @dataclass class VisualizationMetrics:
|
|
182
|
-
│ ├── node_count: int
|
|
183
|
-
│ ├── edge_count: int
|
|
184
|
-
│ ├── clusters_detected: int
|
|
185
|
-
│ ├── max_degree: int
|
|
186
|
-
│ ├── avg_degree: float
|
|
187
|
-
│ ├── density: float
|
|
188
|
-
│ ├── connected_components: int
|
|
189
|
-
│ └── rendering_time: float
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### CLI Integration
|
|
193
|
-
|
|
194
|
-
``` text
|
|
195
|
-
src/semantic_graph/cli/
|
|
196
|
-
├── visualize_graph.py # NEW: CLI command for graph visualization
|
|
197
|
-
│ ├── create_parser() -> ArgumentParser
|
|
198
|
-
│ │ ├── --input-path: "Path to indexed documents or graph file"
|
|
199
|
-
│ │ ├── --output-path: "Output path for visualization"
|
|
200
|
-
│ │ ├── --format: choices=["html", "png", "svg", "pdf"]
|
|
201
|
-
│ │ ├── --layout: choices=["force", "hierarchical", "circular", "clustered"]
|
|
202
|
-
│ │ ├── --filter-node-types: "Node types to include"
|
|
203
|
-
│ │ ├── --filter-relationships: "Relationship types to include"
|
|
204
|
-
│ │ ├── --max-nodes: "Maximum nodes to display"
|
|
205
|
-
│ │ ├── --clustering: "Enable clustering analysis"
|
|
206
|
-
│ │ ├── --interactive: "Generate interactive visualization"
|
|
207
|
-
│ │ └── --style-config: "Path to style configuration file"
|
|
208
|
-
│ │
|
|
209
|
-
│ └── main(args: Optional[List[str]] = None) -> int
|
|
210
|
-
│ ├── Load or build knowledge graph
|
|
211
|
-
│ ├── Apply filters and clustering
|
|
212
|
-
│ ├── Generate visualization
|
|
213
|
-
│ └── Export to specified format
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### MCP Server Tools Integration
|
|
217
|
-
|
|
218
|
-
``` python
|
|
219
|
-
# Extension to _SemanticSearchMcpServer.py
|
|
220
|
-
|
|
221
|
-
@self.server.tool(
|
|
222
|
-
name="visualize_knowledge_graph",
|
|
223
|
-
description="Generate visualization of the knowledge graph"
|
|
224
|
-
)
|
|
225
|
-
async def visualize_knowledge_graph(
|
|
226
|
-
output_format: str = "html",
|
|
227
|
-
layout: str = "force_directed",
|
|
228
|
-
max_nodes: Optional[int] = None,
|
|
229
|
-
filter_node_types: Optional[List[str]] = None,
|
|
230
|
-
filter_relationships: Optional[List[str]] = None,
|
|
231
|
-
clustering: bool = False
|
|
232
|
-
) -> Dict[str, Any]:
|
|
233
|
-
"""Generate and return knowledge graph visualization."""
|
|
234
|
-
|
|
235
|
-
@self.server.tool(
|
|
236
|
-
name="get_graph_metrics",
|
|
237
|
-
description="Get comprehensive graph metrics and statistics"
|
|
238
|
-
)
|
|
239
|
-
async def get_graph_metrics() -> Dict[str, Any]:
|
|
240
|
-
"""Return graph statistics for visualization planning."""
|
|
241
|
-
|
|
242
|
-
@self.server.tool(
|
|
243
|
-
name="explore_document_connections",
|
|
244
|
-
description="Explore connections between specific documents"
|
|
245
|
-
)
|
|
246
|
-
async def explore_document_connections(
|
|
247
|
-
document_paths: List[str],
|
|
248
|
-
max_depth: int = 2,
|
|
249
|
-
include_entities: bool = True
|
|
250
|
-
) -> Dict[str, Any]:
|
|
251
|
-
"""Explore and visualize connections between documents."""
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
## API Design and Integration Points
|
|
255
|
-
|
|
256
|
-
### Public API Interface
|
|
257
|
-
|
|
258
|
-
``` yaml
|
|
259
|
-
graph_visualizer_api:
|
|
260
|
-
initialization:
|
|
261
|
-
- GraphVisualizer(graph_manager: KnowledgeGraphManager)
|
|
262
|
-
- GraphVisualizer.from_documents(documents: List[ChunkContainer])
|
|
263
|
-
- GraphVisualizer.from_pickle(pickle_path: str)
|
|
264
|
-
|
|
265
|
-
core_methods:
|
|
266
|
-
visualize:
|
|
267
|
-
signature: "visualize(config: VisualizationConfig) -> str"
|
|
268
|
-
returns: "Path to generated visualization"
|
|
269
|
-
|
|
270
|
-
visualize_subset:
|
|
271
|
-
signature: "visualize_subset(node_ids: List[str], config: VisualizationConfig) -> str"
|
|
272
|
-
returns: "Path to visualization of subgraph"
|
|
273
|
-
|
|
274
|
-
generate_interactive:
|
|
275
|
-
signature: "generate_interactive(output_path: str, **options) -> str"
|
|
276
|
-
returns: "Path to interactive HTML visualization"
|
|
277
|
-
|
|
278
|
-
export:
|
|
279
|
-
signature: "export(format: str, output_path: str, **options) -> str"
|
|
280
|
-
returns: "Path to exported visualization"
|
|
281
|
-
|
|
282
|
-
analysis_methods:
|
|
283
|
-
analyze_clusters:
|
|
284
|
-
signature: "analyze_clusters() -> Dict[str, List[str]]"
|
|
285
|
-
returns: "Cluster assignments for all nodes"
|
|
286
|
-
|
|
287
|
-
find_central_documents:
|
|
288
|
-
signature: "find_central_documents(top_k: int = 10) -> List[str]"
|
|
289
|
-
returns: "Most central documents by various metrics"
|
|
290
|
-
|
|
291
|
-
detect_communities:
|
|
292
|
-
signature: "detect_communities() -> Dict[str, int]"
|
|
293
|
-
returns: "Community detection results"
|
|
294
|
-
|
|
295
|
-
filtering_methods:
|
|
296
|
-
filter_by_importance:
|
|
297
|
-
signature: "filter_by_importance(threshold: float) -> GraphVisualizer"
|
|
298
|
-
returns: "New visualizer with filtered graph"
|
|
299
|
-
|
|
300
|
-
focus_on_documents:
|
|
301
|
-
signature: "focus_on_documents(paths: List[str], depth: int = 2) -> GraphVisualizer"
|
|
302
|
-
returns: "Visualizer focused on specific documents"
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### Integration with Existing Components
|
|
306
|
-
|
|
307
|
-
``` yaml
|
|
308
|
-
integration_points:
|
|
309
|
-
knowledge_graph_manager:
|
|
310
|
-
access_pattern: "Composition via dependency injection"
|
|
311
|
-
methods_used:
|
|
312
|
-
- graph (NetworkX graph access)
|
|
313
|
-
- node_index (Node metadata)
|
|
314
|
-
- entity_index (Entity information)
|
|
315
|
-
- relationship_index (Relationship details)
|
|
316
|
-
- get_graph_statistics() (Metrics)
|
|
317
|
-
|
|
318
|
-
search_engine:
|
|
319
|
-
enhancement: "Visualize search results as subgraph"
|
|
320
|
-
new_method: "SearchEngine.visualize_results(results: List[SearchResultContainer])"
|
|
321
|
-
|
|
322
|
-
cli_module:
|
|
323
|
-
registration: "Add visualize_graph to CLI command discovery"
|
|
324
|
-
integration: "GlobalArgumentParser auto-discovers new command"
|
|
325
|
-
|
|
326
|
-
mcp_server:
|
|
327
|
-
tool_addition: "Register visualization tools in _setup_tools()"
|
|
328
|
-
resource_addition: "Add graph visualization as MCP resource"
|
|
329
|
-
|
|
330
|
-
chunkers:
|
|
331
|
-
metadata_usage: "Use chunk metadata for node styling"
|
|
332
|
-
type_awareness: "Different visualization for different chunk types"
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
## Implementation Phases
|
|
336
|
-
|
|
337
|
-
### Phase 1: Core Visualization Foundation (Week 1)
|
|
338
|
-
|
|
339
|
-
``` yaml
|
|
340
|
-
phase_1_foundation:
|
|
341
|
-
objectives:
|
|
342
|
-
- Establish visualization module structure
|
|
343
|
-
- Implement basic graph rendering
|
|
344
|
-
- Create static export capabilities
|
|
345
|
-
|
|
346
|
-
deliverables:
|
|
347
|
-
files_to_create:
|
|
348
|
-
- src/semantic_graph/visualization/__init__.py
|
|
349
|
-
- src/semantic_graph/visualization/_GraphVisualizer.py
|
|
350
|
-
- src/semantic_graph/visualization/_LayoutEngine.py
|
|
351
|
-
- src/semantic_graph/visualization/_StaticExporter.py
|
|
352
|
-
- tests/semantic_graph/visualization/test_GraphVisualizer.py
|
|
353
|
-
- tests/semantic_graph/visualization/test_LayoutEngine.py
|
|
354
|
-
|
|
355
|
-
features:
|
|
356
|
-
- Basic force-directed layout
|
|
357
|
-
- PNG/SVG export
|
|
358
|
-
- Node type coloring
|
|
359
|
-
- Edge weight visualization
|
|
360
|
-
|
|
361
|
-
success_criteria:
|
|
362
|
-
- Render simple graphs with 100-1000 nodes
|
|
363
|
-
- Export to PNG with matplotlib
|
|
364
|
-
- All tests passing
|
|
365
|
-
- Coverage > 90%
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### Phase 2: Advanced Layout and Filtering (Week 2)
|
|
369
|
-
|
|
370
|
-
``` yaml
|
|
371
|
-
phase_2_advanced:
|
|
372
|
-
objectives:
|
|
373
|
-
- Implement multiple layout algorithms
|
|
374
|
-
- Add filtering capabilities
|
|
375
|
-
- Implement clustering
|
|
376
|
-
|
|
377
|
-
deliverables:
|
|
378
|
-
files_to_create:
|
|
379
|
-
- src/semantic_graph/visualization/_NodeRenderer.py
|
|
380
|
-
- src/semantic_graph/visualization/_EdgeRenderer.py
|
|
381
|
-
- src/semantic_graph/visualization/_FilterManager.py
|
|
382
|
-
- src/semantic_graph/visualization/_ClusteringEngine.py
|
|
383
|
-
- tests/semantic_graph/visualization/test_FilterManager.py
|
|
384
|
-
- tests/semantic_graph/visualization/test_ClusteringEngine.py
|
|
385
|
-
|
|
386
|
-
features:
|
|
387
|
-
- Hierarchical and circular layouts
|
|
388
|
-
- Community detection
|
|
389
|
-
- Centrality-based filtering
|
|
390
|
-
- File-based clustering
|
|
391
|
-
|
|
392
|
-
success_criteria:
|
|
393
|
-
- Handle graphs with 1000-5000 nodes
|
|
394
|
-
- Clustering accuracy > 85%
|
|
395
|
-
- Performance < 5s for typical graphs
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### Phase 3: Interactive Visualization (Week 3)
|
|
399
|
-
|
|
400
|
-
``` yaml
|
|
401
|
-
phase_3_interactive:
|
|
402
|
-
objectives:
|
|
403
|
-
- Create interactive HTML visualizations
|
|
404
|
-
- Implement search and exploration
|
|
405
|
-
- Add zoom and pan capabilities
|
|
406
|
-
|
|
407
|
-
deliverables:
|
|
408
|
-
files_to_create:
|
|
409
|
-
- src/semantic_graph/visualization/_InteractiveExporter.py
|
|
410
|
-
- src/semantic_graph/visualization/templates/graph_template.html
|
|
411
|
-
- src/semantic_graph/visualization/static/graph_viewer.js
|
|
412
|
-
- src/semantic_graph/visualization/static/graph_viewer.css
|
|
413
|
-
- tests/semantic_graph/visualization/test_InteractiveExporter.py
|
|
414
|
-
|
|
415
|
-
features:
|
|
416
|
-
- D3.js or vis.js integration
|
|
417
|
-
- Interactive node exploration
|
|
418
|
-
- Dynamic filtering
|
|
419
|
-
- Search interface
|
|
420
|
-
- Tooltip information
|
|
421
|
-
|
|
422
|
-
success_criteria:
|
|
423
|
-
- Smooth interaction up to 2000 nodes
|
|
424
|
-
- Search response < 100ms
|
|
425
|
-
- Cross-browser compatibility
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
### Phase 4: CLI and MCP Integration (Week 4)
|
|
429
|
-
|
|
430
|
-
``` yaml
|
|
431
|
-
phase_4_integration:
|
|
432
|
-
objectives:
|
|
433
|
-
- Integrate with CLI commands
|
|
434
|
-
- Add MCP server tools
|
|
435
|
-
- Create example scripts
|
|
436
|
-
|
|
437
|
-
deliverables:
|
|
438
|
-
files_to_create:
|
|
439
|
-
- src/semantic_graph/cli/visualize_graph.py
|
|
440
|
-
- examples/visualize_knowledge_graph.py
|
|
441
|
-
- examples/visualize_search_results.py
|
|
442
|
-
- tests/semantic_graph/cli/test_visualize_graph.py
|
|
443
|
-
- tests/semantic_graph/mcp_servers/test_visualization_tools.py
|
|
444
|
-
|
|
445
|
-
features:
|
|
446
|
-
- CLI command with full options
|
|
447
|
-
- MCP tools for AI assistants
|
|
448
|
-
- Batch visualization scripts
|
|
449
|
-
- Configuration file support
|
|
450
|
-
|
|
451
|
-
success_criteria:
|
|
452
|
-
- CLI command fully functional
|
|
453
|
-
- MCP tools tested with Claude
|
|
454
|
-
- Examples cover common use cases
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
### Phase 5: Performance and Polish (Week 5)
|
|
458
|
-
|
|
459
|
-
``` yaml
|
|
460
|
-
phase_5_optimization:
|
|
461
|
-
objectives:
|
|
462
|
-
- Optimize for large graphs (10K+ nodes)
|
|
463
|
-
- Add advanced styling options
|
|
464
|
-
- Complete documentation
|
|
465
|
-
|
|
466
|
-
deliverables:
|
|
467
|
-
files_to_create:
|
|
468
|
-
- src/semantic_graph/visualization/types/_VisualizationConfig.py
|
|
469
|
-
- src/semantic_graph/visualization/types/_VisualizationMetrics.py
|
|
470
|
-
- docs/visualization_guide.md
|
|
471
|
-
- docs/api/visualization.md
|
|
472
|
-
- benchmarks/visualization_performance.py
|
|
473
|
-
|
|
474
|
-
features:
|
|
475
|
-
- Graph simplification for large datasets
|
|
476
|
-
- Custom style configurations
|
|
477
|
-
- Performance monitoring
|
|
478
|
-
- Caching for repeated visualizations
|
|
479
|
-
|
|
480
|
-
success_criteria:
|
|
481
|
-
- Handle 10K+ nodes with sampling
|
|
482
|
-
- Render time < 10s for large graphs
|
|
483
|
-
- Documentation complete
|
|
484
|
-
- All integration tests passing
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
## Testing Strategy
|
|
488
|
-
|
|
489
|
-
### Test Coverage Plan
|
|
490
|
-
|
|
491
|
-
``` yaml
|
|
492
|
-
test_organization:
|
|
493
|
-
unit_tests:
|
|
494
|
-
visualization_core:
|
|
495
|
-
- test_GraphVisualizer.py: Core visualization logic
|
|
496
|
-
- test_LayoutEngine.py: Layout algorithms
|
|
497
|
-
- test_NodeRenderer.py: Node rendering
|
|
498
|
-
- test_EdgeRenderer.py: Edge rendering
|
|
499
|
-
|
|
500
|
-
filtering_clustering:
|
|
501
|
-
- test_FilterManager.py: Filtering operations
|
|
502
|
-
- test_ClusteringEngine.py: Clustering algorithms
|
|
503
|
-
|
|
504
|
-
exporters:
|
|
505
|
-
- test_StaticExporter.py: Image exports
|
|
506
|
-
- test_InteractiveExporter.py: HTML generation
|
|
507
|
-
|
|
508
|
-
integration_tests:
|
|
509
|
-
- test_visualization_integration.py: End-to-end workflows
|
|
510
|
-
- test_cli_visualization.py: CLI command testing
|
|
511
|
-
- test_mcp_visualization_tools.py: MCP server tools
|
|
512
|
-
|
|
513
|
-
performance_tests:
|
|
514
|
-
- test_visualization_performance.py: Large graph handling
|
|
515
|
-
- test_layout_performance.py: Algorithm efficiency
|
|
516
|
-
|
|
517
|
-
fixtures:
|
|
518
|
-
- fixtures/sample_graphs.py: Test graph generators
|
|
519
|
-
- fixtures/visualization_configs.py: Configuration templates
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
### Quality Assurance
|
|
523
|
-
|
|
524
|
-
``` yaml
|
|
525
|
-
quality_gates:
|
|
526
|
-
code_quality:
|
|
527
|
-
- Ruff linting: No errors
|
|
528
|
-
- Type checking: mypy strict mode
|
|
529
|
-
- Docstring coverage: 100%
|
|
530
|
-
- Naming conventions: Followed
|
|
531
|
-
|
|
532
|
-
test_quality:
|
|
533
|
-
- Unit test coverage: > 90%
|
|
534
|
-
- Integration test coverage: > 85%
|
|
535
|
-
- Performance benchmarks: Defined and met
|
|
536
|
-
- Edge cases: Explicitly tested
|
|
537
|
-
|
|
538
|
-
visualization_quality:
|
|
539
|
-
- Visual regression tests
|
|
540
|
-
- Cross-browser testing for HTML
|
|
541
|
-
- Accessibility compliance
|
|
542
|
-
- Print quality for static exports
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
## Performance Considerations
|
|
546
|
-
|
|
547
|
-
### Scalability Strategy
|
|
548
|
-
|
|
549
|
-
``` yaml
|
|
550
|
-
performance_targets:
|
|
551
|
-
small_graphs: # < 100 nodes
|
|
552
|
-
rendering_time: < 0.5s
|
|
553
|
-
interaction_fps: 60
|
|
554
|
-
memory_usage: < 50MB
|
|
555
|
-
|
|
556
|
-
medium_graphs: # 100-1000 nodes
|
|
557
|
-
rendering_time: < 2s
|
|
558
|
-
interaction_fps: 30
|
|
559
|
-
memory_usage: < 200MB
|
|
560
|
-
|
|
561
|
-
large_graphs: # 1000-10000 nodes
|
|
562
|
-
rendering_time: < 10s
|
|
563
|
-
interaction_fps: 15
|
|
564
|
-
memory_usage: < 1GB
|
|
565
|
-
optimization: "Progressive rendering, node aggregation"
|
|
566
|
-
|
|
567
|
-
massive_graphs: # 10000+ nodes
|
|
568
|
-
approach: "Sampling and summarization"
|
|
569
|
-
rendering_time: < 30s
|
|
570
|
-
techniques:
|
|
571
|
-
- Importance sampling
|
|
572
|
-
- Hierarchical aggregation
|
|
573
|
-
- Level-of-detail rendering
|
|
574
|
-
- Viewport culling
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
### Optimization Techniques
|
|
578
|
-
|
|
579
|
-
``` yaml
|
|
580
|
-
optimizations:
|
|
581
|
-
graph_simplification:
|
|
582
|
-
- Edge bundling for dense connections
|
|
583
|
-
- Node aggregation by clusters
|
|
584
|
-
- Importance-based filtering
|
|
585
|
-
- Progressive detail loading
|
|
586
|
-
|
|
587
|
-
rendering_optimization:
|
|
588
|
-
- Canvas rendering for large graphs
|
|
589
|
-
- WebGL for 3D visualization
|
|
590
|
-
- Virtualization for node lists
|
|
591
|
-
- Lazy loading of node details
|
|
592
|
-
|
|
593
|
-
caching_strategy:
|
|
594
|
-
- Layout computation caching
|
|
595
|
-
- Rendered image caching
|
|
596
|
-
- Cluster analysis caching
|
|
597
|
-
- Metric calculation caching
|
|
598
|
-
|
|
599
|
-
memory_management:
|
|
600
|
-
- Streaming graph processing
|
|
601
|
-
- Garbage collection optimization
|
|
602
|
-
- Memory-mapped file support
|
|
603
|
-
- Graph compression techniques
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
## Configuration Management
|
|
607
|
-
|
|
608
|
-
### Visualization Configuration
|
|
609
|
-
|
|
610
|
-
``` yaml
|
|
611
|
-
config_structure:
|
|
612
|
-
visualization_config:
|
|
613
|
-
location: "config/visualization.yaml"
|
|
614
|
-
sections:
|
|
615
|
-
defaults:
|
|
616
|
-
layout_algorithm: "force_directed"
|
|
617
|
-
output_format: "html"
|
|
618
|
-
width: 1200
|
|
619
|
-
height: 800
|
|
620
|
-
|
|
621
|
-
node_styles:
|
|
622
|
-
document:
|
|
623
|
-
color: "#4CAF50"
|
|
624
|
-
shape: "circle"
|
|
625
|
-
size: "centrality"
|
|
626
|
-
|
|
627
|
-
chunk:
|
|
628
|
-
color: "#2196F3"
|
|
629
|
-
shape: "square"
|
|
630
|
-
size: "fixed"
|
|
631
|
-
|
|
632
|
-
entity:
|
|
633
|
-
color: "#FF9800"
|
|
634
|
-
shape: "diamond"
|
|
635
|
-
size: "degree"
|
|
636
|
-
|
|
637
|
-
edge_styles:
|
|
638
|
-
references:
|
|
639
|
-
color: "#666666"
|
|
640
|
-
style: "solid"
|
|
641
|
-
width: "weight"
|
|
642
|
-
|
|
643
|
-
contains:
|
|
644
|
-
color: "#999999"
|
|
645
|
-
style: "dashed"
|
|
646
|
-
width: "fixed"
|
|
647
|
-
|
|
648
|
-
performance:
|
|
649
|
-
max_nodes_interactive: 2000
|
|
650
|
-
max_nodes_static: 10000
|
|
651
|
-
simplification_threshold: 5000
|
|
652
|
-
cache_enabled: true
|
|
653
|
-
cache_ttl: 3600
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
## Example Usage Patterns
|
|
657
|
-
|
|
658
|
-
### Library Usage
|
|
659
|
-
|
|
660
|
-
``` python
|
|
661
|
-
# Example 1: Basic visualization
|
|
662
|
-
from semantic_graph.graph import KnowledgeGraphManager
|
|
663
|
-
from semantic_graph.visualization import GraphVisualizer
|
|
664
|
-
|
|
665
|
-
# Load existing graph
|
|
666
|
-
kg_manager = KnowledgeGraphManager(persist_path="./knowledge_graph.pkl")
|
|
667
|
-
kg_manager.load_graph()
|
|
668
|
-
|
|
669
|
-
# Create visualizer
|
|
670
|
-
visualizer = GraphVisualizer(kg_manager)
|
|
671
|
-
|
|
672
|
-
# Generate visualization
|
|
673
|
-
output_path = visualizer.visualize_document_graph(
|
|
674
|
-
output_path="./graph_output.html",
|
|
675
|
-
layout="force_directed",
|
|
676
|
-
max_nodes=500,
|
|
677
|
-
clustering=True
|
|
678
|
-
)
|
|
679
|
-
|
|
680
|
-
# Example 2: Filtered visualization
|
|
681
|
-
filtered_viz = visualizer.filter_by_importance(threshold=0.7)
|
|
682
|
-
filtered_viz.focus_on_documents(
|
|
683
|
-
paths=["main.py", "config.yaml"],
|
|
684
|
-
depth=2
|
|
685
|
-
).generate_interactive("focused_graph.html")
|
|
686
|
-
|
|
687
|
-
# Example 3: Search result visualization
|
|
688
|
-
from semantic_graph.search import SearchEngine
|
|
689
|
-
|
|
690
|
-
search_engine = SearchEngine()
|
|
691
|
-
results = search_engine.search("machine learning")
|
|
692
|
-
|
|
693
|
-
# Visualize search results as subgraph
|
|
694
|
-
search_viz = GraphVisualizer.from_search_results(results)
|
|
695
|
-
search_viz.export("svg", "search_results.svg")
|
|
696
|
-
```
|
|
697
|
-
|
|
698
|
-
### CLI Usage
|
|
699
|
-
|
|
700
|
-
``` bash
|
|
701
|
-
# Basic visualization
|
|
702
|
-
semantic-graph visualize-graph \
|
|
703
|
-
--input-path ./indexed_docs \
|
|
704
|
-
--output-path ./visualizations/graph.html \
|
|
705
|
-
--format html \
|
|
706
|
-
--layout force \
|
|
707
|
-
--clustering
|
|
708
|
-
|
|
709
|
-
# Filtered visualization with custom styling
|
|
710
|
-
semantic-graph visualize-graph \
|
|
711
|
-
--input-path ./knowledge_graph.pkl \
|
|
712
|
-
--output-path ./viz/filtered.png \
|
|
713
|
-
--format png \
|
|
714
|
-
--filter-node-types document entity \
|
|
715
|
-
--max-nodes 1000 \
|
|
716
|
-
--style-config ./config/custom_style.yaml
|
|
717
|
-
|
|
718
|
-
# Export multiple formats
|
|
719
|
-
semantic-graph visualize-graph \
|
|
720
|
-
--input-path ./indexed_docs \
|
|
721
|
-
--output-path ./exports/graph \
|
|
722
|
-
--format html png svg \
|
|
723
|
-
--interactive \
|
|
724
|
-
--clustering
|
|
725
|
-
```
|
|
726
|
-
|
|
727
|
-
### MCP Server Usage
|
|
728
|
-
|
|
729
|
-
``` python
|
|
730
|
-
# AI Assistant Integration Example
|
|
731
|
-
{
|
|
732
|
-
"tool": "visualize_knowledge_graph",
|
|
733
|
-
"parameters": {
|
|
734
|
-
"output_format": "html",
|
|
735
|
-
"layout": "hierarchical",
|
|
736
|
-
"max_nodes": 500,
|
|
737
|
-
"filter_node_types": ["document", "entity"],
|
|
738
|
-
"clustering": true
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
# Response
|
|
743
|
-
{
|
|
744
|
-
"success": true,
|
|
745
|
-
"visualization_path": "/tmp/graph_20250831_073000.html",
|
|
746
|
-
"metrics": {
|
|
747
|
-
"nodes_rendered": 487,
|
|
748
|
-
"edges_rendered": 1243,
|
|
749
|
-
"clusters_detected": 12,
|
|
750
|
-
"rendering_time": 2.3
|
|
751
|
-
},
|
|
752
|
-
"preview_url": "http://localhost:8080/preview/graph_20250831_073000.html"
|
|
753
|
-
}
|
|
754
|
-
```
|
|
755
|
-
|
|
756
|
-
## Acceptance Criteria
|
|
757
|
-
|
|
758
|
-
\### Feature Acceptance Criteria
|
|
759
|
-
|
|
760
|
-
``` yaml
|
|
761
|
-
acceptance_criteria:
|
|
762
|
-
core_functionality:
|
|
763
|
-
- Visualize existing KnowledgeGraphManager graphs
|
|
764
|
-
- Support document, chunk, and entity nodes
|
|
765
|
-
- Display all relationship types
|
|
766
|
-
- Export to PNG, SVG, PDF, HTML
|
|
767
|
-
|
|
768
|
-
interactivity:
|
|
769
|
-
- Zoom and pan in HTML visualizations
|
|
770
|
-
- Click nodes for details
|
|
771
|
-
- Search and filter dynamically
|
|
772
|
-
- Highlight connections on hover
|
|
773
|
-
|
|
774
|
-
performance:
|
|
775
|
-
- Handle 100 documents in < 1s
|
|
776
|
-
- Handle 1000 documents in < 5s
|
|
777
|
-
- Handle 10000 documents with sampling
|
|
778
|
-
- Smooth interaction up to 2000 nodes
|
|
779
|
-
|
|
780
|
-
integration:
|
|
781
|
-
- CLI command fully functional
|
|
782
|
-
- MCP tools accessible to AI assistants
|
|
783
|
-
- Python API intuitive and documented
|
|
784
|
-
- Backward compatible with existing code
|
|
785
|
-
|
|
786
|
-
quality:
|
|
787
|
-
- Test coverage > 90%
|
|
788
|
-
- All linting checks pass
|
|
789
|
-
- Type checking complete
|
|
790
|
-
- Documentation comprehensive
|
|
791
|
-
```
|
|
792
|
-
|
|
793
|
-
## Risk Assessment and Mitigation
|
|
794
|
-
|
|
795
|
-
``` yaml
|
|
796
|
-
identified_risks:
|
|
797
|
-
technical_risks:
|
|
798
|
-
dependency_management:
|
|
799
|
-
risk: "Matplotlib/D3.js version conflicts"
|
|
800
|
-
mitigation: "Pin versions, provide fallbacks"
|
|
801
|
-
|
|
802
|
-
performance_degradation:
|
|
803
|
-
risk: "Large graphs cause browser crashes"
|
|
804
|
-
mitigation: "Implement progressive rendering, node limits"
|
|
805
|
-
|
|
806
|
-
cross_platform_issues:
|
|
807
|
-
risk: "Visualization differences across OS"
|
|
808
|
-
mitigation: "Extensive testing, use web standards"
|
|
809
|
-
|
|
810
|
-
implementation_risks:
|
|
811
|
-
scope_creep:
|
|
812
|
-
risk: "Feature requests beyond initial scope"
|
|
813
|
-
mitigation: "Strict phase boundaries, defer to v07"
|
|
814
|
-
|
|
815
|
-
integration_complexity:
|
|
816
|
-
risk: "Difficult integration with existing code"
|
|
817
|
-
mitigation: "Composition pattern, minimal coupling"
|
|
818
|
-
|
|
819
|
-
testing_complexity:
|
|
820
|
-
risk: "Visual testing is subjective"
|
|
821
|
-
mitigation: "Automated metrics, regression tests"
|
|
822
|
-
```
|
|
823
|
-
|
|
824
|
-
## Migration Path from v05
|
|
825
|
-
|
|
826
|
-
``` yaml
|
|
827
|
-
migration_notes:
|
|
828
|
-
from_v05_to_v06:
|
|
829
|
-
preserved:
|
|
830
|
-
- All existing graph infrastructure
|
|
831
|
-
- Current test success rate (99.1%)
|
|
832
|
-
- API compatibility
|
|
833
|
-
- MCP server structure
|
|
834
|
-
|
|
835
|
-
additions:
|
|
836
|
-
- New visualization module
|
|
837
|
-
- CLI visualize-graph command
|
|
838
|
-
- MCP visualization tools
|
|
839
|
-
- Interactive HTML exports
|
|
840
|
-
|
|
841
|
-
no_breaking_changes:
|
|
842
|
-
- Existing code continues to work
|
|
843
|
-
- New features are additive only
|
|
844
|
-
- Optional dependencies for visualization
|
|
845
|
-
|
|
846
|
-
testing_impact:
|
|
847
|
-
- New test files for visualization
|
|
848
|
-
- No changes to existing tests
|
|
849
|
-
- Separate test suite for visualization
|
|
850
|
-
```
|
|
851
|
-
|
|
852
|
-
## Communication and Coordination
|
|
853
|
-
|
|
854
|
-
``` yaml
|
|
855
|
-
agent_coordination:
|
|
856
|
-
ArchitectAgent:
|
|
857
|
-
responsibilities:
|
|
858
|
-
- Architecture definition and agreement
|
|
859
|
-
- Phase planning and acceptance criteria
|
|
860
|
-
- Integration point specification
|
|
861
|
-
|
|
862
|
-
SourceDeveloperAgent:
|
|
863
|
-
responsibilities:
|
|
864
|
-
- Implement visualization module
|
|
865
|
-
- Create GraphVisualizer and supporting classes
|
|
866
|
-
- Ensure code quality and conventions
|
|
867
|
-
|
|
868
|
-
TestDeveloperAgent:
|
|
869
|
-
responsibilities:
|
|
870
|
-
- Create comprehensive test suite
|
|
871
|
-
- Visual regression testing
|
|
872
|
-
- Performance benchmarks
|
|
873
|
-
|
|
874
|
-
IntegrationAgent:
|
|
875
|
-
responsibilities:
|
|
876
|
-
- CLI command integration
|
|
877
|
-
- MCP server tool addition
|
|
878
|
-
- Example script creation
|
|
879
|
-
|
|
880
|
-
bulletin_board_updates:
|
|
881
|
-
- Phase completion announcements
|
|
882
|
-
- Blocking issues identification
|
|
883
|
-
- Integration readiness signals
|
|
884
|
-
- Performance metrics sharing
|
|
885
|
-
```
|
|
886
|
-
|
|
887
|
-
## Conclusion
|
|
888
|
-
|
|
889
|
-
Architecture v06 introduces powerful graph visualization capabilities to the semantic search engine through a well-structured, extensible module that leverages the existing comprehensive KnowledgeGraphManager infrastructure. The design follows established patterns, maintains backward compatibility, and provides multiple integration points for CLI, MCP server, and library usage.
|
|
890
|
-
|
|
891
|
-
The phased implementation approach ensures systematic development with clear milestones, comprehensive testing, and performance optimization for graphs ranging from 100 to 10,000+ documents. The architecture emphasizes both static and interactive visualizations, supporting research-style document connectivity exploration similar to Connected Papers.
|
|
892
|
-
|
|
893
|
-
This enhancement will significantly improve the user\'s ability to understand document relationships, explore knowledge structures, and gain insights from their semantic search corpus through intuitive visual representations.
|
|
894
|
-
|
|
895
|
-
## Next Steps
|
|
896
|
-
|
|
897
|
-
1. ****Architecture Review and Agreement****: Obtain user approval for v06 architecture
|
|
898
|
-
2. ****Environment Setup****: Install visualization dependencies (matplotlib, plotly/d3.js)
|
|
899
|
-
3. ****Phase 1 Implementation****: Begin with core GraphVisualizer and basic layouts
|
|
900
|
-
4. ****Incremental Development****: Follow 5-week phase plan with regular testing
|
|
901
|
-
5. ****Integration Testing****: Ensure seamless CLI and MCP server integration
|
|
902
|
-
6. ****Documentation****: Create comprehensive user and developer documentation
|
|
903
|
-
7. ****Performance Optimization****: Implement caching and simplification for large graphs
|
|
904
|
-
|
|
905
|
-
The architecture is designed to be implemented incrementally while maintaining the stability of the existing codebase and its 99.1% test success rate.
|