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.
Files changed (415) hide show
  1. scitex/__init__.py +15 -7
  2. scitex/__version__.py +1 -2
  3. scitex/_install_guide.py +250 -0
  4. scitex/_optional_deps.py +206 -39
  5. scitex/ai/_gen_ai/_Groq.py +2 -4
  6. scitex/ai/_gen_ai/_OpenAI.py +5 -2
  7. scitex/ai/_gen_ai/_Perplexity.py +20 -6
  8. scitex/audio/__init__.py +24 -15
  9. scitex/audio/_cross_process_lock.py +139 -0
  10. scitex/audio/_mcp_handlers.py +256 -0
  11. scitex/audio/_mcp_tool_schemas.py +203 -0
  12. scitex/audio/engines/elevenlabs_engine.py +5 -2
  13. scitex/audio/mcp_server.py +98 -457
  14. scitex/bridge/__init__.py +30 -19
  15. scitex/bridge/_figrecipe.py +245 -0
  16. scitex/bridge/_helpers.py +2 -1
  17. scitex/bridge/_plt_vis.py +23 -10
  18. scitex/bridge/_stats_plt.py +18 -5
  19. scitex/bridge/_stats_vis.py +16 -2
  20. scitex/browser/__init__.py +84 -44
  21. scitex/browser/automation/__init__.py +5 -1
  22. scitex/browser/core/BrowserMixin.py +17 -4
  23. scitex/browser/core/__init__.py +11 -2
  24. scitex/browser/remote/CaptchaHandler.py +1 -1
  25. scitex/browser/remote/ZenRowsAPIClient.py +1 -1
  26. scitex/capture/grid.py +487 -0
  27. scitex/capture/mcp_handlers.py +401 -0
  28. scitex/capture/mcp_tool_defs.py +192 -0
  29. scitex/capture/mcp_tools.py +241 -0
  30. scitex/capture/mcp_utils.py +30 -0
  31. scitex/cli/convert.py +421 -0
  32. scitex/cli/main.py +6 -4
  33. scitex/datetime/__init__.py +46 -0
  34. scitex/datetime/_linspace.py +100 -0
  35. scitex/datetime/_normalize_timestamp.py +306 -0
  36. scitex/db/_delete_duplicates.py +4 -4
  37. scitex/db/_sqlite3/_delete_duplicates.py +11 -2
  38. scitex/dev/plt/__init__.py +61 -62
  39. scitex/dev/plt/demo_plotters/__init__.py +0 -0
  40. scitex/dev/plt/demo_plotters/plot_mpl_axhline.py +28 -0
  41. scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py +28 -0
  42. scitex/dev/plt/demo_plotters/plot_mpl_axvline.py +28 -0
  43. scitex/dev/plt/demo_plotters/plot_mpl_axvspan.py +28 -0
  44. scitex/dev/plt/demo_plotters/plot_mpl_bar.py +29 -0
  45. scitex/dev/plt/demo_plotters/plot_mpl_barh.py +29 -0
  46. scitex/dev/plt/demo_plotters/plot_mpl_boxplot.py +28 -0
  47. scitex/dev/plt/demo_plotters/plot_mpl_contour.py +31 -0
  48. scitex/dev/plt/demo_plotters/plot_mpl_contourf.py +31 -0
  49. scitex/dev/plt/demo_plotters/plot_mpl_errorbar.py +30 -0
  50. scitex/dev/plt/demo_plotters/plot_mpl_eventplot.py +28 -0
  51. scitex/dev/plt/demo_plotters/plot_mpl_fill.py +30 -0
  52. scitex/dev/plt/demo_plotters/plot_mpl_fill_between.py +31 -0
  53. scitex/dev/plt/demo_plotters/plot_mpl_hexbin.py +28 -0
  54. scitex/dev/plt/demo_plotters/plot_mpl_hist.py +28 -0
  55. scitex/dev/plt/demo_plotters/plot_mpl_hist2d.py +28 -0
  56. scitex/dev/plt/demo_plotters/plot_mpl_imshow.py +29 -0
  57. scitex/dev/plt/demo_plotters/plot_mpl_pcolormesh.py +31 -0
  58. scitex/dev/plt/demo_plotters/plot_mpl_pie.py +29 -0
  59. scitex/dev/plt/demo_plotters/plot_mpl_plot.py +29 -0
  60. scitex/dev/plt/demo_plotters/plot_mpl_quiver.py +31 -0
  61. scitex/dev/plt/demo_plotters/plot_mpl_scatter.py +28 -0
  62. scitex/dev/plt/demo_plotters/plot_mpl_stackplot.py +31 -0
  63. scitex/dev/plt/demo_plotters/plot_mpl_stem.py +29 -0
  64. scitex/dev/plt/demo_plotters/plot_mpl_step.py +29 -0
  65. scitex/dev/plt/demo_plotters/plot_mpl_violinplot.py +28 -0
  66. scitex/dev/plt/demo_plotters/plot_sns_barplot.py +29 -0
  67. scitex/dev/plt/demo_plotters/plot_sns_boxplot.py +29 -0
  68. scitex/dev/plt/demo_plotters/plot_sns_heatmap.py +28 -0
  69. scitex/dev/plt/demo_plotters/plot_sns_histplot.py +29 -0
  70. scitex/dev/plt/demo_plotters/plot_sns_kdeplot.py +29 -0
  71. scitex/dev/plt/demo_plotters/plot_sns_lineplot.py +31 -0
  72. scitex/dev/plt/demo_plotters/plot_sns_scatterplot.py +29 -0
  73. scitex/dev/plt/demo_plotters/plot_sns_stripplot.py +29 -0
  74. scitex/dev/plt/demo_plotters/plot_sns_swarmplot.py +29 -0
  75. scitex/dev/plt/demo_plotters/plot_sns_violinplot.py +29 -0
  76. scitex/dev/plt/demo_plotters/plot_stx_bar.py +29 -0
  77. scitex/dev/plt/demo_plotters/plot_stx_barh.py +29 -0
  78. scitex/dev/plt/demo_plotters/plot_stx_box.py +28 -0
  79. scitex/dev/plt/demo_plotters/plot_stx_boxplot.py +28 -0
  80. scitex/dev/plt/demo_plotters/plot_stx_conf_mat.py +28 -0
  81. scitex/dev/plt/demo_plotters/plot_stx_contour.py +31 -0
  82. scitex/dev/plt/demo_plotters/plot_stx_ecdf.py +28 -0
  83. scitex/dev/plt/demo_plotters/plot_stx_errorbar.py +30 -0
  84. scitex/dev/plt/demo_plotters/plot_stx_fill_between.py +31 -0
  85. scitex/dev/plt/demo_plotters/plot_stx_fillv.py +28 -0
  86. scitex/dev/plt/demo_plotters/plot_stx_heatmap.py +28 -0
  87. scitex/dev/plt/demo_plotters/plot_stx_image.py +28 -0
  88. scitex/dev/plt/demo_plotters/plot_stx_imshow.py +28 -0
  89. scitex/dev/plt/demo_plotters/plot_stx_joyplot.py +28 -0
  90. scitex/dev/plt/demo_plotters/plot_stx_kde.py +28 -0
  91. scitex/dev/plt/demo_plotters/plot_stx_line.py +28 -0
  92. scitex/dev/plt/demo_plotters/plot_stx_mean_ci.py +28 -0
  93. scitex/dev/plt/demo_plotters/plot_stx_mean_std.py +28 -0
  94. scitex/dev/plt/demo_plotters/plot_stx_median_iqr.py +28 -0
  95. scitex/dev/plt/demo_plotters/plot_stx_raster.py +28 -0
  96. scitex/dev/plt/demo_plotters/plot_stx_rectangle.py +28 -0
  97. scitex/dev/plt/demo_plotters/plot_stx_scatter.py +29 -0
  98. scitex/dev/plt/demo_plotters/plot_stx_shaded_line.py +29 -0
  99. scitex/dev/plt/demo_plotters/plot_stx_violin.py +28 -0
  100. scitex/dev/plt/demo_plotters/plot_stx_violinplot.py +28 -0
  101. scitex/dev/plt/mpl/get_dir_ax.py +46 -0
  102. scitex/dev/plt/mpl/get_signatures.py +176 -0
  103. scitex/dev/plt/mpl/get_signatures_details.py +522 -0
  104. scitex/dict/_pop_keys.py +1 -7
  105. scitex/dsp/__init__.py +15 -10
  106. scitex/dsp/add_noise.py +5 -2
  107. scitex/dsp/example.py +35 -22
  108. scitex/dsp/filt.py +8 -3
  109. scitex/dsp/reference.py +3 -2
  110. scitex/dsp/utils/__init__.py +2 -1
  111. scitex/dsp/utils/_differential_bandpass_filters.py +14 -4
  112. scitex/dt/__init__.py +39 -2
  113. scitex/errors.py +82 -521
  114. scitex/fig/__init__.py +4 -4
  115. scitex/fig/editor/edit/panel_loader.py +1 -1
  116. scitex/fig/io/_bundle.py +7 -7
  117. scitex/fts/README.md +262 -0
  118. scitex/fts/TODO.md +66 -0
  119. scitex/fts/__init__.py +90 -0
  120. scitex/fts/_bundle/README_IN_BUNDLE.md +102 -0
  121. scitex/fts/_bundle/_FTS.py +657 -0
  122. scitex/fts/_bundle/__init__.py +38 -0
  123. scitex/fts/_bundle/_children.py +216 -0
  124. scitex/fts/_bundle/_conversion/__init__.py +15 -0
  125. scitex/fts/_bundle/_conversion/_bundle2dict.py +44 -0
  126. scitex/fts/_bundle/_conversion/_dict2bundle.py +50 -0
  127. scitex/fts/_bundle/_dataclasses/_Axes.py +57 -0
  128. scitex/fts/_bundle/_dataclasses/_BBox.py +54 -0
  129. scitex/fts/_bundle/_dataclasses/_ColumnDef.py +72 -0
  130. scitex/fts/_bundle/_dataclasses/_DataFormat.py +40 -0
  131. scitex/fts/_bundle/_dataclasses/_DataInfo.py +135 -0
  132. scitex/fts/_bundle/_dataclasses/_DataSource.py +44 -0
  133. scitex/fts/_bundle/_dataclasses/_Node.py +319 -0
  134. scitex/fts/_bundle/_dataclasses/_NodeRefs.py +45 -0
  135. scitex/fts/_bundle/_dataclasses/_SizeMM.py +38 -0
  136. scitex/fts/_bundle/_dataclasses/__init__.py +35 -0
  137. scitex/fts/_bundle/_extractors/__init__.py +32 -0
  138. scitex/fts/_bundle/_extractors/_extract_bar.py +131 -0
  139. scitex/fts/_bundle/_extractors/_extract_line.py +71 -0
  140. scitex/fts/_bundle/_extractors/_extract_scatter.py +79 -0
  141. scitex/fts/_bundle/_loader.py +134 -0
  142. scitex/fts/_bundle/_mpl_helpers.py +389 -0
  143. scitex/fts/_bundle/_saver.py +269 -0
  144. scitex/fts/_bundle/_storage.py +200 -0
  145. scitex/fts/_bundle/_utils/__init__.py +55 -0
  146. scitex/fts/_bundle/_utils/_const.py +26 -0
  147. scitex/fts/_bundle/_utils/_errors.py +73 -0
  148. scitex/fts/_bundle/_utils/_generate.py +21 -0
  149. scitex/fts/_bundle/_utils/_types.py +76 -0
  150. scitex/fts/_bundle/_validation.py +434 -0
  151. scitex/fts/_bundle/_zipbundle.py +165 -0
  152. scitex/fts/_fig/__init__.py +22 -0
  153. scitex/fts/_fig/_backend/__init__.py +53 -0
  154. scitex/fts/_fig/_backend/_export.py +165 -0
  155. scitex/fts/_fig/_backend/_parser.py +188 -0
  156. scitex/fts/_fig/_backend/_render.py +538 -0
  157. scitex/fts/_fig/_composite.py +345 -0
  158. scitex/fts/_fig/_dataclasses/_ChannelEncoding.py +46 -0
  159. scitex/fts/_fig/_dataclasses/_Encoding.py +82 -0
  160. scitex/fts/_fig/_dataclasses/_Theme.py +441 -0
  161. scitex/fts/_fig/_dataclasses/_TraceEncoding.py +52 -0
  162. scitex/fts/_fig/_dataclasses/__init__.py +47 -0
  163. scitex/fts/_fig/_editor/__init__.py +14 -0
  164. scitex/fts/_fig/_editor/_cui/__init__.py +33 -0
  165. scitex/fts/_fig/_editor/_cui/_backend_detector.py +39 -0
  166. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +366 -0
  167. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +175 -0
  168. scitex/fts/_fig/_editor/_cui/_manual_handler.py +52 -0
  169. scitex/fts/_fig/_editor/_cui/_panel_loader.py +246 -0
  170. scitex/fts/_fig/_editor/_cui/_path_resolver.py +66 -0
  171. scitex/fts/_fig/_editor/_defaults.py +300 -0
  172. scitex/fts/_fig/_editor/_gui/__init__.py +11 -0
  173. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +20 -0
  174. scitex/fts/_fig/_editor/_gui/_flask_editor/_bbox.py +1339 -0
  175. scitex/fts/_fig/_editor/_gui/_flask_editor/_core.py +1688 -0
  176. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +664 -0
  177. scitex/fts/_fig/_editor/_gui/_flask_editor/_renderer.py +853 -0
  178. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +79 -0
  179. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +41 -0
  180. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +16 -0
  181. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +85 -0
  182. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +217 -0
  183. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +93 -0
  184. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +57 -0
  185. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +112 -0
  186. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +59 -0
  187. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +212 -0
  188. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/canvas.css +176 -0
  189. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +190 -0
  190. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +59 -0
  191. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +45 -0
  192. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +95 -0
  193. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +101 -0
  194. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +138 -0
  195. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +31 -0
  196. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +7 -0
  197. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +56 -0
  198. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +78 -0
  199. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +314 -0
  200. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +107 -0
  201. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +54 -0
  202. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +172 -0
  203. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +258 -0
  204. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +48 -0
  205. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +71 -0
  206. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +288 -0
  207. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +143 -0
  208. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +245 -0
  209. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +992 -0
  210. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +339 -0
  211. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +286 -0
  212. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +371 -0
  213. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +293 -0
  214. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +426 -0
  215. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +152 -0
  216. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +265 -0
  217. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +184 -0
  218. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +57 -0
  219. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +100 -0
  220. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +34 -0
  221. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +124 -0
  222. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +851 -0
  223. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +4932 -0
  224. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +1657 -0
  225. scitex/fts/_fig/_editor/_gui/_flask_editor.py +36 -0
  226. scitex/fts/_fig/_models/_Annotations.py +115 -0
  227. scitex/fts/_fig/_models/_Axes.py +152 -0
  228. scitex/fts/_fig/_models/_Figure.py +138 -0
  229. scitex/fts/_fig/_models/_Guides.py +104 -0
  230. scitex/fts/_fig/_models/_Plot.py +123 -0
  231. scitex/fts/_fig/_models/_Styles.py +245 -0
  232. scitex/fts/_fig/_models/__init__.py +80 -0
  233. scitex/fts/_fig/_models/_plot_types/__init__.py +156 -0
  234. scitex/fts/_fig/_models/_plot_types/_bar.py +43 -0
  235. scitex/fts/_fig/_models/_plot_types/_box.py +38 -0
  236. scitex/fts/_fig/_models/_plot_types/_distribution.py +36 -0
  237. scitex/fts/_fig/_models/_plot_types/_errorbar.py +60 -0
  238. scitex/fts/_fig/_models/_plot_types/_histogram.py +30 -0
  239. scitex/fts/_fig/_models/_plot_types/_image.py +61 -0
  240. scitex/fts/_fig/_models/_plot_types/_line.py +57 -0
  241. scitex/fts/_fig/_models/_plot_types/_scatter.py +30 -0
  242. scitex/fts/_fig/_models/_plot_types/_seaborn.py +121 -0
  243. scitex/fts/_fig/_models/_plot_types/_violin.py +36 -0
  244. scitex/fts/_fig/_utils/__init__.py +129 -0
  245. scitex/fts/_fig/_utils/_auto_layout.py +127 -0
  246. scitex/fts/_fig/_utils/_calc_bounds.py +111 -0
  247. scitex/fts/_fig/_utils/_const_sizes.py +48 -0
  248. scitex/fts/_fig/_utils/_convert_coords.py +77 -0
  249. scitex/fts/_fig/_utils/_get_template.py +178 -0
  250. scitex/fts/_fig/_utils/_normalize.py +73 -0
  251. scitex/fts/_fig/_utils/_plot_layout.py +397 -0
  252. scitex/fts/_fig/_utils/_validate.py +197 -0
  253. scitex/fts/_kinds/__init__.py +45 -0
  254. scitex/fts/_kinds/_figure/__init__.py +19 -0
  255. scitex/fts/_kinds/_figure/_composite.py +345 -0
  256. scitex/fts/_kinds/_plot/__init__.py +25 -0
  257. scitex/fts/_kinds/_plot/_backend/__init__.py +53 -0
  258. scitex/fts/_kinds/_plot/_backend/_export.py +165 -0
  259. scitex/fts/_kinds/_plot/_backend/_parser.py +188 -0
  260. scitex/fts/_kinds/_plot/_backend/_render.py +538 -0
  261. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +46 -0
  262. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +82 -0
  263. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +441 -0
  264. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +52 -0
  265. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +47 -0
  266. scitex/fts/_kinds/_plot/_models/_Annotations.py +115 -0
  267. scitex/fts/_kinds/_plot/_models/_Axes.py +152 -0
  268. scitex/fts/_kinds/_plot/_models/_Figure.py +138 -0
  269. scitex/fts/_kinds/_plot/_models/_Guides.py +104 -0
  270. scitex/fts/_kinds/_plot/_models/_Plot.py +123 -0
  271. scitex/fts/_kinds/_plot/_models/_Styles.py +245 -0
  272. scitex/fts/_kinds/_plot/_models/__init__.py +80 -0
  273. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +156 -0
  274. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +43 -0
  275. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +38 -0
  276. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +36 -0
  277. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +60 -0
  278. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +30 -0
  279. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +61 -0
  280. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +57 -0
  281. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +30 -0
  282. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +121 -0
  283. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +36 -0
  284. scitex/fts/_kinds/_plot/_utils/__init__.py +129 -0
  285. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +127 -0
  286. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +111 -0
  287. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +48 -0
  288. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +77 -0
  289. scitex/fts/_kinds/_plot/_utils/_get_template.py +178 -0
  290. scitex/fts/_kinds/_plot/_utils/_normalize.py +73 -0
  291. scitex/fts/_kinds/_plot/_utils/_plot_layout.py +397 -0
  292. scitex/fts/_kinds/_plot/_utils/_validate.py +197 -0
  293. scitex/fts/_kinds/_shape/__init__.py +141 -0
  294. scitex/fts/_kinds/_stats/__init__.py +56 -0
  295. scitex/fts/_kinds/_stats/_dataclasses/_Stats.py +423 -0
  296. scitex/fts/_kinds/_stats/_dataclasses/__init__.py +48 -0
  297. scitex/fts/_kinds/_table/__init__.py +72 -0
  298. scitex/fts/_kinds/_table/_latex/__init__.py +93 -0
  299. scitex/fts/_kinds/_table/_latex/_editor/__init__.py +11 -0
  300. scitex/fts/_kinds/_table/_latex/_editor/_app.py +725 -0
  301. scitex/fts/_kinds/_table/_latex/_export.py +279 -0
  302. scitex/fts/_kinds/_table/_latex/_figure_exporter.py +153 -0
  303. scitex/fts/_kinds/_table/_latex/_stats_formatter.py +274 -0
  304. scitex/fts/_kinds/_table/_latex/_table_exporter.py +362 -0
  305. scitex/fts/_kinds/_table/_latex/_utils.py +369 -0
  306. scitex/fts/_kinds/_table/_latex/_validator.py +445 -0
  307. scitex/fts/_kinds/_text/__init__.py +77 -0
  308. scitex/fts/_schemas/data_info.schema.json +75 -0
  309. scitex/fts/_schemas/encoding.schema.json +90 -0
  310. scitex/fts/_schemas/node.schema.json +145 -0
  311. scitex/fts/_schemas/render_manifest.schema.json +62 -0
  312. scitex/fts/_schemas/stats.schema.json +132 -0
  313. scitex/fts/_schemas/theme.schema.json +141 -0
  314. scitex/fts/_stats/__init__.py +48 -0
  315. scitex/fts/_stats/_dataclasses/_Stats.py +423 -0
  316. scitex/fts/_stats/_dataclasses/__init__.py +48 -0
  317. scitex/fts/_tables/__init__.py +65 -0
  318. scitex/fts/_tables/_latex/__init__.py +93 -0
  319. scitex/fts/_tables/_latex/_editor/__init__.py +11 -0
  320. scitex/fts/_tables/_latex/_editor/_app.py +725 -0
  321. scitex/fts/_tables/_latex/_export.py +279 -0
  322. scitex/fts/_tables/_latex/_figure_exporter.py +153 -0
  323. scitex/fts/_tables/_latex/_stats_formatter.py +274 -0
  324. scitex/fts/_tables/_latex/_table_exporter.py +362 -0
  325. scitex/fts/_tables/_latex/_utils.py +369 -0
  326. scitex/fts/_tables/_latex/_validator.py +445 -0
  327. scitex/gen/__init__.py +66 -25
  328. scitex/gen/misc.py +28 -0
  329. scitex/io/__init__.py +47 -32
  330. scitex/io/_load.py +87 -36
  331. scitex/io/_load_modules/__init__.py +10 -7
  332. scitex/io/_load_modules/_pandas.py +6 -1
  333. scitex/io/_save.py +299 -1556
  334. scitex/io/_save_modules/__init__.py +76 -19
  335. scitex/io/_save_modules/_figure_utils.py +90 -0
  336. scitex/io/_save_modules/_image_csv.py +497 -0
  337. scitex/io/_save_modules/_legends.py +91 -0
  338. scitex/io/_save_modules/_pltz_bundle.py +356 -0
  339. scitex/io/_save_modules/_pltz_stx.py +536 -0
  340. scitex/io/_save_modules/_stx_bundle.py +104 -0
  341. scitex/io/_save_modules/_symlink.py +96 -0
  342. scitex/io/_save_modules/_yaml.py +1 -1
  343. scitex/io/_save_modules/_zarr.py +64 -18
  344. scitex/io/bundle/README.md +212 -0
  345. scitex/io/bundle/__init__.py +110 -0
  346. scitex/io/{_bundle.py → bundle/_core.py} +168 -97
  347. scitex/io/bundle/_nested.py +713 -0
  348. scitex/io/bundle/_types.py +74 -0
  349. scitex/io/{_zip_bundle.py → bundle/_zip.py} +93 -45
  350. scitex/io/utils/h5_to_zarr.py +1 -1
  351. scitex/logging/__init__.py +108 -13
  352. scitex/logging/_errors.py +508 -0
  353. scitex/logging/_formatters.py +30 -6
  354. scitex/logging/_warnings.py +261 -0
  355. scitex/plt/__init__.py +4 -1
  356. scitex/plt/_figrecipe.py +236 -0
  357. scitex/plt/_subplots/_AxisWrapper.py +6 -0
  358. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +112 -1
  359. scitex/plt/_subplots/_FigWrapper.py +15 -0
  360. scitex/plt/_subplots/_SubplotsWrapper.py +125 -489
  361. scitex/plt/_subplots/_export_as_csv.py +11 -0
  362. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +2 -0
  363. scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +66 -0
  364. scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +62 -0
  365. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +208 -0
  366. scitex/plt/_subplots/_fonts.py +71 -0
  367. scitex/plt/_subplots/_mm_layout.py +282 -0
  368. scitex/plt/gallery/__init__.py +99 -2
  369. scitex/plt/styles/_plot_postprocess.py +3 -1
  370. scitex/plt/utils/_configure_mpl.py +16 -19
  371. scitex/repro/_RandomStateManager.py +13 -8
  372. scitex/resource/__init__.py +19 -1
  373. scitex/resource/_utils/_get_env_info.py +13 -25
  374. scitex/schema/__init__.py +149 -160
  375. scitex/schema/_encoding.py +273 -0
  376. scitex/schema/_figure_elements.py +406 -0
  377. scitex/schema/_theme.py +360 -0
  378. scitex/schema/_validation.py +0 -98
  379. scitex/scholar/__init__.py +56 -14
  380. scitex/scholar/auth/ScholarAuthManager.py +1 -1
  381. scitex/scholar/auth/__init__.py +11 -2
  382. scitex/scholar/auth/providers/BaseAuthenticator.py +1 -1
  383. scitex/scholar/auth/providers/EZProxyAuthenticator.py +1 -1
  384. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +1 -1
  385. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +1 -1
  386. scitex/scholar/config/ScholarConfig.py +1 -1
  387. scitex/scholar/core/Scholar.py +1 -1
  388. scitex/session/_decorator.py +18 -16
  389. scitex/session/_lifecycle.py +9 -11
  390. scitex/session/template.py +9 -8
  391. scitex/sh/test_sh.py +72 -0
  392. scitex/sh/test_sh_simple.py +61 -0
  393. scitex/stats/__init__.py +221 -97
  394. scitex/stats/_schema.py +21 -22
  395. scitex/stats/descriptive/_circular.py +212 -351
  396. scitex/stats/descriptive/_describe.py +81 -132
  397. scitex/stats/descriptive/_nan.py +205 -433
  398. scitex/stats/descriptive/_real.py +127 -141
  399. scitex/str/_format_plot_text.py +5 -5
  400. scitex/str/_latex.py +26 -84
  401. scitex/str/_latex_fallback.py +53 -47
  402. scitex/web/_search_pubmed.py +5 -4
  403. scitex/writer/tests/test_diff_between.py +451 -0
  404. scitex/writer/tests/test_document_section.py +311 -0
  405. scitex/writer/tests/test_document_workflow.py +393 -0
  406. scitex/writer/tests/test_writer.py +361 -0
  407. scitex/writer/tests/test_writer_integration.py +303 -0
  408. {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/METADATA +368 -183
  409. {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/RECORD +412 -97
  410. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +0 -905
  411. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +0 -99
  412. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +0 -96
  413. {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/WHEEL +0 -0
  414. {scitex-2.8.1.dist-info → scitex-2.10.2.dist-info}/entry_points.txt +0 -0
  415. {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.