scitex 2.7.3__py3-none-any.whl → 2.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) 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/dev/plt/plot_mpl_axhline.py +0 -0
  105. scitex/dev/plt/plot_mpl_axhspan.py +0 -0
  106. scitex/dev/plt/plot_mpl_axvline.py +0 -0
  107. scitex/dev/plt/plot_mpl_axvspan.py +0 -0
  108. scitex/dev/plt/plot_mpl_bar.py +0 -0
  109. scitex/dev/plt/plot_mpl_barh.py +0 -0
  110. scitex/dev/plt/plot_mpl_boxplot.py +0 -0
  111. scitex/dev/plt/plot_mpl_contour.py +0 -0
  112. scitex/dev/plt/plot_mpl_contourf.py +0 -0
  113. scitex/dev/plt/plot_mpl_errorbar.py +0 -0
  114. scitex/dev/plt/plot_mpl_eventplot.py +0 -0
  115. scitex/dev/plt/plot_mpl_fill.py +0 -0
  116. scitex/dev/plt/plot_mpl_fill_between.py +0 -0
  117. scitex/dev/plt/plot_mpl_hexbin.py +0 -0
  118. scitex/dev/plt/plot_mpl_hist.py +0 -0
  119. scitex/dev/plt/plot_mpl_hist2d.py +0 -0
  120. scitex/dev/plt/plot_mpl_imshow.py +0 -0
  121. scitex/dev/plt/plot_mpl_pcolormesh.py +0 -0
  122. scitex/dev/plt/plot_mpl_pie.py +0 -0
  123. scitex/dev/plt/plot_mpl_plot.py +0 -0
  124. scitex/dev/plt/plot_mpl_quiver.py +0 -0
  125. scitex/dev/plt/plot_mpl_scatter.py +0 -0
  126. scitex/dev/plt/plot_mpl_stackplot.py +0 -0
  127. scitex/dev/plt/plot_mpl_stem.py +0 -0
  128. scitex/dev/plt/plot_mpl_step.py +0 -0
  129. scitex/dev/plt/plot_mpl_violinplot.py +0 -0
  130. scitex/dev/plt/plot_sns_barplot.py +0 -0
  131. scitex/dev/plt/plot_sns_boxplot.py +0 -0
  132. scitex/dev/plt/plot_sns_heatmap.py +0 -0
  133. scitex/dev/plt/plot_sns_histplot.py +0 -0
  134. scitex/dev/plt/plot_sns_kdeplot.py +0 -0
  135. scitex/dev/plt/plot_sns_lineplot.py +0 -0
  136. scitex/dev/plt/plot_sns_scatterplot.py +0 -0
  137. scitex/dev/plt/plot_sns_stripplot.py +0 -0
  138. scitex/dev/plt/plot_sns_swarmplot.py +0 -0
  139. scitex/dev/plt/plot_sns_violinplot.py +0 -0
  140. scitex/dev/plt/plot_stx_bar.py +0 -0
  141. scitex/dev/plt/plot_stx_barh.py +0 -0
  142. scitex/dev/plt/plot_stx_box.py +0 -0
  143. scitex/dev/plt/plot_stx_boxplot.py +0 -0
  144. scitex/dev/plt/plot_stx_conf_mat.py +0 -0
  145. scitex/dev/plt/plot_stx_contour.py +0 -0
  146. scitex/dev/plt/plot_stx_ecdf.py +0 -0
  147. scitex/dev/plt/plot_stx_errorbar.py +0 -0
  148. scitex/dev/plt/plot_stx_fill_between.py +0 -0
  149. scitex/dev/plt/plot_stx_fillv.py +0 -0
  150. scitex/dev/plt/plot_stx_heatmap.py +0 -0
  151. scitex/dev/plt/plot_stx_image.py +0 -0
  152. scitex/dev/plt/plot_stx_imshow.py +0 -0
  153. scitex/dev/plt/plot_stx_joyplot.py +0 -0
  154. scitex/dev/plt/plot_stx_kde.py +0 -0
  155. scitex/dev/plt/plot_stx_line.py +0 -0
  156. scitex/dev/plt/plot_stx_mean_ci.py +0 -0
  157. scitex/dev/plt/plot_stx_mean_std.py +0 -0
  158. scitex/dev/plt/plot_stx_median_iqr.py +0 -0
  159. scitex/dev/plt/plot_stx_raster.py +0 -0
  160. scitex/dev/plt/plot_stx_rectangle.py +0 -0
  161. scitex/dev/plt/plot_stx_scatter.py +0 -0
  162. scitex/dev/plt/plot_stx_shaded_line.py +0 -0
  163. scitex/dev/plt/plot_stx_violin.py +0 -0
  164. scitex/dev/plt/plot_stx_violinplot.py +0 -0
  165. scitex/diagram/README.md +197 -0
  166. scitex/diagram/__init__.py +48 -0
  167. scitex/diagram/_compile.py +312 -0
  168. scitex/diagram/_diagram.py +355 -0
  169. scitex/diagram/_presets.py +173 -0
  170. scitex/diagram/_schema.py +182 -0
  171. scitex/diagram/_split.py +278 -0
  172. scitex/dict/_pop_keys.py +1 -7
  173. scitex/dsp/__init__.py +15 -10
  174. scitex/dsp/add_noise.py +5 -2
  175. scitex/dsp/example.py +35 -22
  176. scitex/dsp/filt.py +8 -3
  177. scitex/dsp/reference.py +3 -2
  178. scitex/dsp/utils/__init__.py +2 -1
  179. scitex/dsp/utils/_differential_bandpass_filters.py +14 -4
  180. scitex/dt/__init__.py +39 -2
  181. scitex/errors.py +82 -521
  182. scitex/fig/__init__.py +4 -4
  183. scitex/fig/editor/__init__.py +5 -2
  184. scitex/fig/editor/_dearpygui_editor.py +1 -1
  185. scitex/fig/editor/_mpl_editor.py +1 -1
  186. scitex/fig/editor/_qt_editor.py +1 -1
  187. scitex/fig/editor/_tkinter_editor.py +1 -1
  188. scitex/fig/editor/edit/__init__.py +50 -0
  189. scitex/fig/editor/edit/backend_detector.py +109 -0
  190. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  191. scitex/fig/editor/edit/editor_launcher.py +239 -0
  192. scitex/fig/editor/edit/manual_handler.py +53 -0
  193. scitex/fig/editor/edit/panel_loader.py +232 -0
  194. scitex/fig/editor/edit/path_resolver.py +67 -0
  195. scitex/fig/editor/flask_editor/_bbox.py +23 -0
  196. scitex/fig/editor/flask_editor/_core.py +908 -103
  197. scitex/fig/editor/flask_editor/_renderer.py +74 -0
  198. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  199. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  200. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  201. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  202. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  203. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  204. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  205. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  206. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  207. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  208. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  209. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  210. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  211. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  212. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  213. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  214. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  215. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  216. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  217. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  218. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  219. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  220. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  221. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  222. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  223. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  224. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  225. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  226. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  227. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  228. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  229. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  230. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  231. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  232. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  233. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  234. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  235. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  236. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  237. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  238. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  239. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  240. scitex/fig/editor/flask_editor/templates/__init__.py +95 -5
  241. scitex/fig/editor/flask_editor/templates/_html.py +27 -9
  242. scitex/fig/editor/flask_editor/templates/_scripts.py +1928 -131
  243. scitex/fig/editor/flask_editor/templates/_styles.py +363 -51
  244. scitex/fig/io/_bundle.py +104 -19
  245. scitex/fts/README.md +262 -0
  246. scitex/fts/TODO.md +66 -0
  247. scitex/fts/__init__.py +90 -0
  248. scitex/fts/_bundle/README_IN_BUNDLE.md +102 -0
  249. scitex/fts/_bundle/_FTS.py +657 -0
  250. scitex/fts/_bundle/__init__.py +38 -0
  251. scitex/fts/_bundle/_children.py +216 -0
  252. scitex/fts/_bundle/_conversion/__init__.py +15 -0
  253. scitex/fts/_bundle/_conversion/_bundle2dict.py +44 -0
  254. scitex/fts/_bundle/_conversion/_dict2bundle.py +50 -0
  255. scitex/fts/_bundle/_dataclasses/_Axes.py +57 -0
  256. scitex/fts/_bundle/_dataclasses/_BBox.py +54 -0
  257. scitex/fts/_bundle/_dataclasses/_ColumnDef.py +72 -0
  258. scitex/fts/_bundle/_dataclasses/_DataFormat.py +40 -0
  259. scitex/fts/_bundle/_dataclasses/_DataInfo.py +135 -0
  260. scitex/fts/_bundle/_dataclasses/_DataSource.py +44 -0
  261. scitex/fts/_bundle/_dataclasses/_Node.py +319 -0
  262. scitex/fts/_bundle/_dataclasses/_NodeRefs.py +45 -0
  263. scitex/fts/_bundle/_dataclasses/_SizeMM.py +38 -0
  264. scitex/fts/_bundle/_dataclasses/__init__.py +35 -0
  265. scitex/fts/_bundle/_extractors/__init__.py +32 -0
  266. scitex/fts/_bundle/_extractors/_extract_bar.py +131 -0
  267. scitex/fts/_bundle/_extractors/_extract_line.py +71 -0
  268. scitex/fts/_bundle/_extractors/_extract_scatter.py +79 -0
  269. scitex/fts/_bundle/_loader.py +134 -0
  270. scitex/fts/_bundle/_mpl_helpers.py +389 -0
  271. scitex/fts/_bundle/_saver.py +269 -0
  272. scitex/fts/_bundle/_storage.py +200 -0
  273. scitex/fts/_bundle/_utils/__init__.py +55 -0
  274. scitex/fts/_bundle/_utils/_const.py +26 -0
  275. scitex/fts/_bundle/_utils/_errors.py +73 -0
  276. scitex/fts/_bundle/_utils/_generate.py +21 -0
  277. scitex/fts/_bundle/_utils/_types.py +76 -0
  278. scitex/fts/_bundle/_validation.py +434 -0
  279. scitex/fts/_bundle/_zipbundle.py +165 -0
  280. scitex/fts/_fig/__init__.py +22 -0
  281. scitex/fts/_fig/_backend/__init__.py +53 -0
  282. scitex/fts/_fig/_backend/_export.py +165 -0
  283. scitex/fts/_fig/_backend/_parser.py +188 -0
  284. scitex/fts/_fig/_backend/_render.py +538 -0
  285. scitex/fts/_fig/_composite.py +345 -0
  286. scitex/fts/_fig/_dataclasses/_ChannelEncoding.py +46 -0
  287. scitex/fts/_fig/_dataclasses/_Encoding.py +82 -0
  288. scitex/fts/_fig/_dataclasses/_Theme.py +441 -0
  289. scitex/fts/_fig/_dataclasses/_TraceEncoding.py +52 -0
  290. scitex/fts/_fig/_dataclasses/__init__.py +47 -0
  291. scitex/fts/_fig/_editor/__init__.py +14 -0
  292. scitex/fts/_fig/_editor/_cui/__init__.py +33 -0
  293. scitex/fts/_fig/_editor/_cui/_backend_detector.py +39 -0
  294. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +366 -0
  295. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +175 -0
  296. scitex/fts/_fig/_editor/_cui/_manual_handler.py +52 -0
  297. scitex/fts/_fig/_editor/_cui/_panel_loader.py +246 -0
  298. scitex/fts/_fig/_editor/_cui/_path_resolver.py +66 -0
  299. scitex/fts/_fig/_editor/_defaults.py +300 -0
  300. scitex/fts/_fig/_editor/_gui/__init__.py +11 -0
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +20 -0
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/_bbox.py +1339 -0
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/_core.py +1688 -0
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +664 -0
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/_renderer.py +853 -0
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +79 -0
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +41 -0
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +16 -0
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +85 -0
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +217 -0
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +93 -0
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +57 -0
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +112 -0
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +59 -0
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +212 -0
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/canvas.css +176 -0
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +190 -0
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +59 -0
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +45 -0
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +95 -0
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +101 -0
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +138 -0
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +31 -0
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +7 -0
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +56 -0
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +78 -0
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +314 -0
  328. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +107 -0
  329. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +54 -0
  330. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +172 -0
  331. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +258 -0
  332. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +48 -0
  333. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +71 -0
  334. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +288 -0
  335. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +143 -0
  336. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +245 -0
  337. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +992 -0
  338. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +339 -0
  339. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +286 -0
  340. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +371 -0
  341. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +293 -0
  342. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +426 -0
  343. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +152 -0
  344. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +265 -0
  345. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +184 -0
  346. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +57 -0
  347. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +100 -0
  348. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +34 -0
  349. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +124 -0
  350. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +851 -0
  351. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +4932 -0
  352. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +1657 -0
  353. scitex/fts/_fig/_editor/_gui/_flask_editor.py +36 -0
  354. scitex/fts/_fig/_models/_Annotations.py +115 -0
  355. scitex/fts/_fig/_models/_Axes.py +152 -0
  356. scitex/fts/_fig/_models/_Figure.py +138 -0
  357. scitex/fts/_fig/_models/_Guides.py +104 -0
  358. scitex/fts/_fig/_models/_Plot.py +123 -0
  359. scitex/fts/_fig/_models/_Styles.py +245 -0
  360. scitex/fts/_fig/_models/__init__.py +80 -0
  361. scitex/fts/_fig/_models/_plot_types/__init__.py +156 -0
  362. scitex/fts/_fig/_models/_plot_types/_bar.py +43 -0
  363. scitex/fts/_fig/_models/_plot_types/_box.py +38 -0
  364. scitex/fts/_fig/_models/_plot_types/_distribution.py +36 -0
  365. scitex/fts/_fig/_models/_plot_types/_errorbar.py +60 -0
  366. scitex/fts/_fig/_models/_plot_types/_histogram.py +30 -0
  367. scitex/fts/_fig/_models/_plot_types/_image.py +61 -0
  368. scitex/fts/_fig/_models/_plot_types/_line.py +57 -0
  369. scitex/fts/_fig/_models/_plot_types/_scatter.py +30 -0
  370. scitex/fts/_fig/_models/_plot_types/_seaborn.py +121 -0
  371. scitex/fts/_fig/_models/_plot_types/_violin.py +36 -0
  372. scitex/fts/_fig/_utils/__init__.py +129 -0
  373. scitex/fts/_fig/_utils/_auto_layout.py +127 -0
  374. scitex/fts/_fig/_utils/_calc_bounds.py +111 -0
  375. scitex/fts/_fig/_utils/_const_sizes.py +48 -0
  376. scitex/fts/_fig/_utils/_convert_coords.py +77 -0
  377. scitex/fts/_fig/_utils/_get_template.py +178 -0
  378. scitex/fts/_fig/_utils/_normalize.py +73 -0
  379. scitex/fts/_fig/_utils/_plot_layout.py +397 -0
  380. scitex/fts/_fig/_utils/_validate.py +197 -0
  381. scitex/fts/_kinds/__init__.py +45 -0
  382. scitex/fts/_kinds/_figure/__init__.py +19 -0
  383. scitex/fts/_kinds/_figure/_composite.py +345 -0
  384. scitex/fts/_kinds/_plot/__init__.py +25 -0
  385. scitex/fts/_kinds/_plot/_backend/__init__.py +53 -0
  386. scitex/fts/_kinds/_plot/_backend/_export.py +165 -0
  387. scitex/fts/_kinds/_plot/_backend/_parser.py +188 -0
  388. scitex/fts/_kinds/_plot/_backend/_render.py +538 -0
  389. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +46 -0
  390. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +82 -0
  391. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +441 -0
  392. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +52 -0
  393. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +47 -0
  394. scitex/fts/_kinds/_plot/_models/_Annotations.py +115 -0
  395. scitex/fts/_kinds/_plot/_models/_Axes.py +152 -0
  396. scitex/fts/_kinds/_plot/_models/_Figure.py +138 -0
  397. scitex/fts/_kinds/_plot/_models/_Guides.py +104 -0
  398. scitex/fts/_kinds/_plot/_models/_Plot.py +123 -0
  399. scitex/fts/_kinds/_plot/_models/_Styles.py +245 -0
  400. scitex/fts/_kinds/_plot/_models/__init__.py +80 -0
  401. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +156 -0
  402. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +43 -0
  403. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +38 -0
  404. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +36 -0
  405. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +60 -0
  406. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +30 -0
  407. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +61 -0
  408. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +57 -0
  409. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +30 -0
  410. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +121 -0
  411. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +36 -0
  412. scitex/fts/_kinds/_plot/_utils/__init__.py +129 -0
  413. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +127 -0
  414. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +111 -0
  415. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +48 -0
  416. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +77 -0
  417. scitex/fts/_kinds/_plot/_utils/_get_template.py +178 -0
  418. scitex/fts/_kinds/_plot/_utils/_normalize.py +73 -0
  419. scitex/fts/_kinds/_plot/_utils/_plot_layout.py +397 -0
  420. scitex/fts/_kinds/_plot/_utils/_validate.py +197 -0
  421. scitex/fts/_kinds/_shape/__init__.py +141 -0
  422. scitex/fts/_kinds/_stats/__init__.py +56 -0
  423. scitex/fts/_kinds/_stats/_dataclasses/_Stats.py +423 -0
  424. scitex/fts/_kinds/_stats/_dataclasses/__init__.py +48 -0
  425. scitex/fts/_kinds/_table/__init__.py +72 -0
  426. scitex/fts/_kinds/_table/_latex/__init__.py +93 -0
  427. scitex/fts/_kinds/_table/_latex/_editor/__init__.py +11 -0
  428. scitex/fts/_kinds/_table/_latex/_editor/_app.py +725 -0
  429. scitex/fts/_kinds/_table/_latex/_export.py +279 -0
  430. scitex/fts/_kinds/_table/_latex/_figure_exporter.py +153 -0
  431. scitex/fts/_kinds/_table/_latex/_stats_formatter.py +274 -0
  432. scitex/fts/_kinds/_table/_latex/_table_exporter.py +362 -0
  433. scitex/fts/_kinds/_table/_latex/_utils.py +369 -0
  434. scitex/fts/_kinds/_table/_latex/_validator.py +445 -0
  435. scitex/fts/_kinds/_text/__init__.py +77 -0
  436. scitex/fts/_schemas/data_info.schema.json +75 -0
  437. scitex/fts/_schemas/encoding.schema.json +90 -0
  438. scitex/fts/_schemas/node.schema.json +145 -0
  439. scitex/fts/_schemas/render_manifest.schema.json +62 -0
  440. scitex/fts/_schemas/stats.schema.json +132 -0
  441. scitex/fts/_schemas/theme.schema.json +141 -0
  442. scitex/fts/_stats/__init__.py +48 -0
  443. scitex/fts/_stats/_dataclasses/_Stats.py +423 -0
  444. scitex/fts/_stats/_dataclasses/__init__.py +48 -0
  445. scitex/fts/_tables/__init__.py +65 -0
  446. scitex/fts/_tables/_latex/__init__.py +93 -0
  447. scitex/fts/_tables/_latex/_editor/__init__.py +11 -0
  448. scitex/fts/_tables/_latex/_editor/_app.py +725 -0
  449. scitex/fts/_tables/_latex/_export.py +279 -0
  450. scitex/fts/_tables/_latex/_figure_exporter.py +153 -0
  451. scitex/fts/_tables/_latex/_stats_formatter.py +274 -0
  452. scitex/fts/_tables/_latex/_table_exporter.py +362 -0
  453. scitex/fts/_tables/_latex/_utils.py +369 -0
  454. scitex/fts/_tables/_latex/_validator.py +445 -0
  455. scitex/gen/__init__.py +66 -25
  456. scitex/gen/misc.py +28 -0
  457. scitex/io/__init__.py +47 -20
  458. scitex/io/_load.py +87 -36
  459. scitex/io/_load_modules/__init__.py +10 -7
  460. scitex/io/_load_modules/_pandas.py +6 -1
  461. scitex/io/_save.py +299 -1556
  462. scitex/io/_save_modules/__init__.py +76 -19
  463. scitex/io/_save_modules/_figure_utils.py +90 -0
  464. scitex/io/_save_modules/_image_csv.py +497 -0
  465. scitex/io/_save_modules/_legends.py +91 -0
  466. scitex/io/_save_modules/_pltz_bundle.py +356 -0
  467. scitex/io/_save_modules/_pltz_stx.py +536 -0
  468. scitex/io/_save_modules/_stx_bundle.py +104 -0
  469. scitex/io/_save_modules/_symlink.py +96 -0
  470. scitex/io/_save_modules/_yaml.py +1 -1
  471. scitex/io/_save_modules/_zarr.py +64 -18
  472. scitex/io/bundle/README.md +212 -0
  473. scitex/io/bundle/__init__.py +110 -0
  474. scitex/io/{_bundle.py → bundle/_core.py} +219 -89
  475. scitex/io/bundle/_nested.py +713 -0
  476. scitex/io/bundle/_types.py +74 -0
  477. scitex/io/bundle/_zip.py +487 -0
  478. scitex/io/utils/h5_to_zarr.py +1 -1
  479. scitex/logging/__init__.py +108 -13
  480. scitex/logging/_errors.py +508 -0
  481. scitex/logging/_formatters.py +30 -6
  482. scitex/logging/_warnings.py +261 -0
  483. scitex/plt/__init__.py +4 -1
  484. scitex/plt/_figrecipe.py +236 -0
  485. scitex/plt/_subplots/_AxisWrapper.py +6 -0
  486. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +0 -0
  487. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +0 -0
  488. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +0 -0
  489. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +0 -0
  490. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +0 -0
  491. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +0 -0
  492. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +0 -0
  493. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +0 -0
  494. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +0 -0
  495. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +0 -0
  496. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +0 -0
  497. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +0 -0
  498. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +0 -0
  499. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +112 -1
  500. scitex/plt/_subplots/_FigWrapper.py +15 -0
  501. scitex/plt/_subplots/_SubplotsWrapper.py +125 -489
  502. scitex/plt/_subplots/_export_as_csv.py +11 -0
  503. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +2 -0
  504. scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +66 -0
  505. scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +62 -0
  506. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +0 -0
  507. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +0 -0
  508. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +0 -0
  509. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +0 -0
  510. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +208 -0
  511. scitex/plt/_subplots/_fonts.py +71 -0
  512. scitex/plt/_subplots/_mm_layout.py +282 -0
  513. scitex/plt/gallery/__init__.py +99 -2
  514. scitex/plt/io/_layered_bundle.py +0 -0
  515. scitex/plt/styles/_plot_postprocess.py +3 -1
  516. scitex/plt/utils/_configure_mpl.py +16 -19
  517. scitex/repro/_RandomStateManager.py +13 -8
  518. scitex/resource/__init__.py +19 -1
  519. scitex/resource/_utils/_get_env_info.py +13 -25
  520. scitex/schema/__init__.py +149 -160
  521. scitex/schema/_encoding.py +273 -0
  522. scitex/schema/_figure_elements.py +406 -0
  523. scitex/schema/_plot.py +0 -0
  524. scitex/schema/_theme.py +360 -0
  525. scitex/schema/_validation.py +0 -98
  526. scitex/scholar/__init__.py +56 -14
  527. scitex/scholar/auth/ScholarAuthManager.py +1 -1
  528. scitex/scholar/auth/__init__.py +11 -2
  529. scitex/scholar/auth/providers/BaseAuthenticator.py +1 -1
  530. scitex/scholar/auth/providers/EZProxyAuthenticator.py +1 -1
  531. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +1 -1
  532. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +1 -1
  533. scitex/scholar/config/ScholarConfig.py +1 -1
  534. scitex/scholar/core/Scholar.py +1 -1
  535. scitex/session/_decorator.py +18 -16
  536. scitex/session/_lifecycle.py +9 -11
  537. scitex/session/template.py +9 -8
  538. scitex/sh/test_sh.py +72 -0
  539. scitex/sh/test_sh_simple.py +61 -0
  540. scitex/stats/__init__.py +221 -97
  541. scitex/stats/_schema.py +21 -22
  542. scitex/stats/descriptive/_circular.py +212 -351
  543. scitex/stats/descriptive/_describe.py +81 -132
  544. scitex/stats/descriptive/_nan.py +205 -433
  545. scitex/stats/descriptive/_real.py +127 -141
  546. scitex/str/_format_plot_text.py +5 -5
  547. scitex/str/_latex.py +26 -84
  548. scitex/str/_latex_fallback.py +53 -47
  549. scitex/web/_search_pubmed.py +5 -4
  550. scitex/writer/tests/test_diff_between.py +451 -0
  551. scitex/writer/tests/test_document_section.py +311 -0
  552. scitex/writer/tests/test_document_workflow.py +393 -0
  553. scitex/writer/tests/test_writer.py +361 -0
  554. scitex/writer/tests/test_writer_integration.py +303 -0
  555. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/METADATA +364 -181
  556. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/RECORD +479 -108
  557. scitex/fig/editor/_edit.py +0 -751
  558. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +0 -905
  559. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +0 -99
  560. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +0 -96
  561. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/WHEEL +0 -0
  562. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/entry_points.txt +0 -0
  563. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,190 +1,176 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-09-20 14:56:35 (ywatanabe)"
4
- # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/stats/desc/_real_dev.py
5
- # ----------------------------------------
2
+ # Timestamp: "2025-12-27 (refactored)"
3
+ # File: scitex/stats/descriptive/_real.py
4
+ """
5
+ Descriptive statistics for real-valued data.
6
+
7
+ Uses torch when available (preserves tensor type), falls back to numpy.
8
+ """
9
+
6
10
  from __future__ import annotations
11
+
7
12
  import os
8
13
 
14
+ import numpy as np
15
+
9
16
  __FILE__ = __file__
10
17
  __DIR__ = os.path.dirname(__FILE__)
11
- # ----------------------------------------
12
18
 
13
- """
14
- Functionalities:
15
- - Computes descriptive statistics on PyTorch tensors
16
- - Provides mean, standard deviation, variance calculations
17
- - Calculates z-scores, skewness, kurtosis
18
- - Computes quantiles (25th, 50th, 75th percentiles)
19
- - Demonstrates statistical computations with synthetic data
20
-
21
- Dependencies:
22
- - packages:
23
- - torch
24
- - numpy
25
- - scitex
26
-
27
- IO:
28
- - input-files:
29
- - PyTorch tensor or numpy array
30
- - output-files:
31
- - Descriptive statistics results
32
- """
19
+ # Optional torch support
20
+ try:
21
+ import torch
33
22
 
34
- """Imports"""
35
- import argparse
23
+ HAS_TORCH = True
24
+ except ImportError:
25
+ torch = None
26
+ HAS_TORCH = False
36
27
 
37
- import numpy as np
38
- import scitex as stx
39
- import torch
40
- from scitex import logging
41
28
 
42
- from scitex.decorators import torch_fn
29
+ def _is_torch_tensor(x):
30
+ """Check if x is a torch tensor."""
31
+ return HAS_TORCH and isinstance(x, torch.Tensor)
32
+
43
33
 
44
- logger = logging.getLogger(__name__)
34
+ def _normalize_axis(axis, dim):
35
+ """Normalize axis/dim parameter."""
36
+ return dim if dim is not None else axis
45
37
 
46
- """Functions & Classes"""
38
+
39
+ # =============================================================================
40
+ # Core Functions - Use torch when input is tensor, numpy otherwise
41
+ # =============================================================================
47
42
 
48
43
 
49
- @torch_fn
50
44
  def mean(x, axis=-1, dim=None, keepdims=False):
51
- return x.mean(dim, keepdims=keepdims)
45
+ """Compute mean along specified axis.
46
+
47
+ Parameters
48
+ ----------
49
+ x : array-like
50
+ Input data (numpy array or torch tensor)
51
+ axis : int, default=-1
52
+ Axis along which to compute (deprecated, use dim)
53
+ dim : int or tuple, optional
54
+ Dimension(s) along which to compute
55
+ keepdims : bool, default=False
56
+ Keep reduced dimensions
57
+
58
+ Returns
59
+ -------
60
+ ndarray or Tensor
61
+ Mean values (same type as input)
62
+ """
63
+ dim = _normalize_axis(axis, dim)
64
+ if _is_torch_tensor(x):
65
+ return x.mean(dim=dim, keepdim=keepdims)
66
+ return np.mean(np.asarray(x), axis=dim, keepdims=keepdims)
52
67
 
53
68
 
54
- @torch_fn
55
69
  def std(x, axis=-1, dim=None, keepdims=False):
56
- return x.std(dim, keepdims=keepdims)
70
+ """Compute standard deviation along specified axis."""
71
+ dim = _normalize_axis(axis, dim)
72
+ if _is_torch_tensor(x):
73
+ return x.std(dim=dim, keepdim=keepdims)
74
+ return np.std(np.asarray(x), axis=dim, keepdims=keepdims)
57
75
 
58
76
 
59
- @torch_fn
60
77
  def var(x, axis=-1, dim=None, keepdims=False):
61
- return x.var(dim, keepdims=keepdims)
78
+ """Compute variance along specified axis."""
79
+ dim = _normalize_axis(axis, dim)
80
+ if _is_torch_tensor(x):
81
+ return x.var(dim=dim, keepdim=keepdims)
82
+ return np.var(np.asarray(x), axis=dim, keepdims=keepdims)
62
83
 
63
84
 
64
- @torch_fn
65
85
  def zscore(x, axis=-1, dim=None, keepdims=True):
66
- _mean = mean(x, dim=dim, keepdims=True)
67
- _std = std(x, dim=dim, keepdims=True)
68
- zscores = (x - _mean) / _std
69
- return zscores if keepdims else zscores.squeeze(dim)
86
+ """Compute z-scores along specified axis."""
87
+ dim = _normalize_axis(axis, dim)
88
+ if _is_torch_tensor(x):
89
+ _mean = x.mean(dim=dim, keepdim=True)
90
+ _std = x.std(dim=dim, keepdim=True)
91
+ zscores = (x - _mean) / _std
92
+ return zscores if keepdims else zscores.squeeze(dim)
93
+ else:
94
+ x = np.asarray(x)
95
+ _mean = np.mean(x, axis=dim, keepdims=True)
96
+ _std = np.std(x, axis=dim, keepdims=True)
97
+ zscores = (x - _mean) / _std
98
+ if not keepdims and dim is not None:
99
+ zscores = np.squeeze(zscores, axis=dim)
100
+ return zscores
70
101
 
71
102
 
72
- @torch_fn
73
103
  def skewness(x, axis=-1, dim=None, keepdims=False):
74
- zscores = zscore(x, axis=axis, keepdims=True)
75
- return torch.mean(torch.pow(zscores, 3.0), dim=dim, keepdims=keepdims)
104
+ """Compute skewness along specified axis."""
105
+ dim = _normalize_axis(axis, dim)
106
+ zscores = zscore(x, dim=dim, keepdims=True)
107
+ if _is_torch_tensor(x):
108
+ return torch.mean(torch.pow(zscores, 3.0), dim=dim, keepdim=keepdims)
109
+ return np.mean(np.power(zscores, 3.0), axis=dim, keepdims=keepdims)
76
110
 
77
111
 
78
- @torch_fn
79
112
  def kurtosis(x, axis=-1, dim=None, keepdims=False):
80
- zscores = zscore(x, axis=axis, keepdims=True)
81
- return torch.mean(torch.pow(zscores, 4.0), dim=dim, keepdims=keepdims) - 3.0
113
+ """Compute excess kurtosis along specified axis."""
114
+ dim = _normalize_axis(axis, dim)
115
+ zscores = zscore(x, dim=dim, keepdims=True)
116
+ if _is_torch_tensor(x):
117
+ return torch.mean(torch.pow(zscores, 4.0), dim=dim, keepdim=keepdims) - 3.0
118
+ return np.mean(np.power(zscores, 4.0), axis=dim, keepdims=keepdims) - 3.0
82
119
 
83
120
 
84
- @torch_fn
85
121
  def quantile(x, q, axis=-1, dim=None, keepdims=False):
86
- dim = axis if dim is None else dim
87
- if isinstance(dim, (tuple, list)):
88
- for d in sorted(dim, reverse=True):
89
- x = torch.quantile(x, q / 100, dim=d, keepdims=keepdims)
122
+ """Compute quantile along specified axis.
123
+
124
+ Parameters
125
+ ----------
126
+ x : array-like
127
+ Input data
128
+ q : float
129
+ Quantile to compute (0-100)
130
+ axis : int, default=-1
131
+ Axis along which to compute
132
+ dim : int or tuple, optional
133
+ Dimension(s) along which to compute
134
+ keepdims : bool, default=False
135
+ Keep reduced dimensions
136
+
137
+ Returns
138
+ -------
139
+ ndarray or Tensor
140
+ Quantile values
141
+ """
142
+ dim = _normalize_axis(axis, dim)
143
+
144
+ if _is_torch_tensor(x):
145
+ if isinstance(dim, (tuple, list)):
146
+ result = x
147
+ for d in sorted(dim, reverse=True):
148
+ result = torch.quantile(result, q / 100, dim=d, keepdim=keepdims)
149
+ return result
150
+ return torch.quantile(x, q / 100, dim=dim, keepdim=keepdims)
90
151
  else:
91
- x = torch.quantile(x, q / 100, dim=dim, keepdims=keepdims)
92
- return x
152
+ x = np.asarray(x)
153
+ if isinstance(dim, (tuple, list)):
154
+ result = x
155
+ for d in sorted(dim, reverse=True):
156
+ result = np.quantile(result, q / 100, axis=d, keepdims=keepdims)
157
+ return result
158
+ return np.quantile(x, q / 100, axis=dim, keepdims=keepdims)
93
159
 
94
160
 
95
- @torch_fn
96
161
  def q25(x, axis=-1, dim=None, keepdims=False):
162
+ """Compute 25th percentile."""
97
163
  return quantile(x, 25, axis=axis, dim=dim, keepdims=keepdims)
98
164
 
99
165
 
100
- @torch_fn
101
166
  def q50(x, axis=-1, dim=None, keepdims=False):
167
+ """Compute 50th percentile (median)."""
102
168
  return quantile(x, 50, axis=axis, dim=dim, keepdims=keepdims)
103
169
 
104
170
 
105
- @torch_fn
106
171
  def q75(x, axis=-1, dim=None, keepdims=False):
172
+ """Compute 75th percentile."""
107
173
  return quantile(x, 75, axis=axis, dim=dim, keepdims=keepdims)
108
174
 
109
175
 
110
- def main(args) -> int:
111
- """Demonstrate descriptive statistics functions with synthetic data."""
112
- x = np.random.rand(4, 3, 2)
113
-
114
- # Compute statistics
115
- x_mean = mean(x)
116
- x_std = std(x)
117
- x_var = var(x)
118
- x_skew = skewness(x)
119
- x_kurt = kurtosis(x)
120
- x_q25 = q25(x)
121
- x_q50 = q50(x)
122
- x_q75 = q75(x)
123
-
124
- # Store results
125
- results = {
126
- "input": x,
127
- "mean": x_mean,
128
- "std": x_std,
129
- "variance": x_var,
130
- "skewness": x_skew,
131
- "kurtosis": x_kurt,
132
- "q25": x_q25,
133
- "q50": x_q50,
134
- "q75": x_q75,
135
- }
136
-
137
- for k, v in results.items():
138
- if isinstance(v, (np.ndarray, torch.Tensor)):
139
- print(f"\n{k}, Type: {type(v)}, Shape: {v.shape}, Values: {v}")
140
- elif isinstance(v, list):
141
- print(f"\n{k}, Type: {type(v)}, Length: {len(v)}, Values: {v}")
142
- else:
143
- print(f"\n{k}, Type: {type(v)}, Values: {v}")
144
-
145
- return 0
146
-
147
-
148
- def parse_args() -> argparse.Namespace:
149
- """Parse command line arguments."""
150
- parser = argparse.ArgumentParser(
151
- description="Demonstrate descriptive statistics functions"
152
- )
153
- args = parser.parse_args()
154
- return args
155
-
156
-
157
- def run_main() -> None:
158
- """Initialize scitex framework, run main function, and cleanup."""
159
- global CONFIG, CC, sys, plt, rng
160
- import sys
161
-
162
- import matplotlib.pyplot as plt
163
- import scitex as stx
164
-
165
- args = parse_args()
166
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
167
- sys,
168
- plt,
169
- args=args,
170
- file=__FILE__,
171
- sdir_suffix=None,
172
- verbose=False,
173
- agg=True,
174
- )
175
-
176
- exit_status = main(args)
177
-
178
- stx.session.close(
179
- CONFIG,
180
- verbose=False,
181
- notify=False,
182
- message="",
183
- exit_status=exit_status,
184
- )
185
-
186
-
187
- if __name__ == "__main__":
188
- run_main()
189
-
190
176
  # EOF
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Time-stamp: "2025-06-04 11:08:00 (ywatanabe)"
4
3
  # File: ./src/scitex/str/_format_plot_text.py
5
4
 
@@ -16,10 +15,10 @@ Prerequisites:
16
15
  """
17
16
 
18
17
  import re
19
- from typing import Union, Tuple, Optional
18
+ from typing import Optional, Tuple
20
19
 
21
20
  try:
22
- from ._latex_fallback import safe_latex_render, latex_fallback_decorator
21
+ from ._latex_fallback import latex_fallback_decorator, safe_latex_render
23
22
 
24
23
  FALLBACK_AVAILABLE = True
25
24
  except ImportError:
@@ -102,10 +101,11 @@ def format_plot_text(
102
101
 
103
102
  if latex_math:
104
103
  # Extract and preserve LaTeX math
104
+ # Use ||| delimiters to avoid being processed by _replace_underscores
105
105
  latex_pattern = r"\$[^$]+\$"
106
106
  latex_matches = re.findall(latex_pattern, text)
107
107
  for i, match in enumerate(latex_matches):
108
- placeholder = f"__LATEX_{i}__"
108
+ placeholder = f"|||LATEX{i}|||"
109
109
  latex_sections.append(match)
110
110
  text_working = text_working.replace(match, placeholder, 1)
111
111
 
@@ -126,7 +126,7 @@ def format_plot_text(
126
126
 
127
127
  # Restore LaTeX sections with fallback handling
128
128
  for i, latex_section in enumerate(latex_sections):
129
- placeholder = f"__LATEX_{i}__"
129
+ placeholder = f"|||LATEX{i}|||"
130
130
  if enable_fallback and FALLBACK_AVAILABLE:
131
131
  # Apply fallback to LaTeX sections
132
132
  safe_latex = safe_latex_render(latex_section, preserve_math=True)
scitex/str/_latex.py CHANGED
@@ -1,29 +1,25 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Time-stamp: "2025-06-05 12:00:00 (ywatanabe)"
4
3
  # File: ./src/scitex/str/_latex.py
5
4
 
6
5
  """
7
- LaTeX formatting functions with fallback mechanisms.
6
+ LaTeX formatting functions for string manipulation.
8
7
 
9
8
  Functionality:
10
- - LaTeX text formatting with automatic fallback
11
- - Safe handling of LaTeX rendering failures
9
+ - Convert strings/numbers to LaTeX math mode format
10
+ - Add LaTeX hat notation
12
11
  Input:
13
12
  Strings or numbers to format
14
13
  Output:
15
- LaTeX-formatted strings with fallback support
14
+ LaTeX-formatted strings (wrapped in $...$)
16
15
  Prerequisites:
17
- matplotlib, _latex_fallback module
16
+ None (pure string formatting)
18
17
  """
19
18
 
20
- from ._latex_fallback import safe_latex_render, latex_fallback_decorator
21
19
 
22
-
23
- @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
24
20
  def to_latex_style(str_or_num):
25
21
  """
26
- Convert string or number to LaTeX math mode format with fallback.
22
+ Convert string or number to LaTeX math mode format.
27
23
 
28
24
  Parameters
29
25
  ----------
@@ -33,38 +29,34 @@ def to_latex_style(str_or_num):
33
29
  Returns
34
30
  -------
35
31
  str
36
- LaTeX-formatted string with automatic fallback
32
+ LaTeX-formatted string wrapped in $...$
37
33
 
38
34
  Examples
39
35
  --------
40
36
  >>> to_latex_style('aaa')
41
37
  '$aaa$'
42
38
 
43
- >>> to_latex_style('alpha') # Falls back to unicode if LaTeX fails
44
- 'α'
39
+ >>> to_latex_style('x^2')
40
+ '$x^2$'
45
41
 
46
- Notes
47
- -----
48
- If LaTeX rendering fails (e.g., due to missing fonts or Node.js conflicts),
49
- this function automatically falls back to mathtext or unicode alternatives.
42
+ >>> to_latex_style(123)
43
+ '$123$'
50
44
  """
51
- if not str_or_num and str_or_num != 0: # Handle empty string case
45
+ if not str_or_num and str_or_num != 0:
52
46
  return ""
53
47
 
54
48
  string = str(str_or_num)
55
49
 
56
50
  # Avoid double-wrapping
57
51
  if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
58
- return safe_latex_render(string)
52
+ return string
59
53
  else:
60
- latex_string = "${}$".format(string)
61
- return safe_latex_render(latex_string)
54
+ return f"${string}$"
62
55
 
63
56
 
64
- @latex_fallback_decorator(fallback_strategy="auto", preserve_math=True)
65
57
  def add_hat_in_latex_style(str_or_num):
66
58
  """
67
- Add LaTeX hat notation to string with fallback.
59
+ Add LaTeX hat notation to string.
68
60
 
69
61
  Parameters
70
62
  ----------
@@ -74,82 +66,32 @@ def add_hat_in_latex_style(str_or_num):
74
66
  Returns
75
67
  -------
76
68
  str
77
- LaTeX-formatted string with hat notation and automatic fallback
69
+ LaTeX-formatted string with hat notation
78
70
 
79
71
  Examples
80
72
  --------
81
73
  >>> add_hat_in_latex_style('aaa')
82
74
  '$\\hat{aaa}$'
83
75
 
84
- >>> add_hat_in_latex_style('x') # Falls back to unicode if LaTeX fails
85
- 'x̂'
86
-
87
- Notes
88
- -----
89
- If LaTeX rendering fails, this function falls back to unicode hat
90
- notation or plain text alternatives.
91
- """
92
- if not str_or_num and str_or_num != 0: # Handle empty string case
93
- return ""
94
-
95
- hat_latex = r"\hat{%s}" % str_or_num
96
- latex_string = to_latex_style(hat_latex)
97
- return safe_latex_render(latex_string)
98
-
76
+ >>> add_hat_in_latex_style('x')
77
+ '$\\hat{x}$'
99
78
 
100
- def safe_to_latex_style(str_or_num, fallback_strategy="auto"):
101
- """
102
- Safe version of to_latex_style with explicit fallback control.
103
-
104
- Parameters
105
- ----------
106
- str_or_num : str or numeric
107
- Input to format in LaTeX style
108
- fallback_strategy : str, optional
109
- Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
110
-
111
- Returns
112
- -------
113
- str
114
- Formatted string with specified fallback behavior
79
+ >>> add_hat_in_latex_style(1)
80
+ '$\\hat{1}$'
115
81
  """
116
82
  if not str_or_num and str_or_num != 0:
117
83
  return ""
118
84
 
119
- string = str(str_or_num)
120
- if len(string) >= 2 and string[0] == "$" and string[-1] == "$":
121
- return safe_latex_render(string, fallback_strategy)
122
- else:
123
- latex_string = "${}$".format(string)
124
- return safe_latex_render(latex_string, fallback_strategy)
125
-
126
-
127
- def safe_add_hat_in_latex_style(str_or_num, fallback_strategy="auto"):
128
- """
129
- Safe version of add_hat_in_latex_style with explicit fallback control.
130
-
131
- Parameters
132
- ----------
133
- str_or_num : str or numeric
134
- Input to format with hat notation
135
- fallback_strategy : str, optional
136
- Explicit fallback strategy: "auto", "mathtext", "unicode", "plain"
137
-
138
- Returns
139
- -------
140
- str
141
- Formatted string with hat notation and specified fallback behavior
142
- """
143
- if not str_or_num and str_or_num != 0:
144
- return ""
145
-
146
- hat_latex = r"\hat{%s}" % str_or_num
147
- latex_string = safe_to_latex_style(hat_latex, fallback_strategy)
148
- return latex_string
85
+ hat_latex = rf"\hat{{{str_or_num}}}"
86
+ return f"${hat_latex}$"
149
87
 
150
88
 
151
89
  # Backward compatibility aliases
152
90
  latex_style = to_latex_style
153
91
  hat_latex_style = add_hat_in_latex_style
154
92
 
93
+ # Safe versions that are identical (no fallback needed for pure formatting)
94
+ safe_to_latex_style = to_latex_style
95
+ safe_add_hat_in_latex_style = add_hat_in_latex_style
96
+
155
97
  # EOF
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: "2025-08-21 21:37:23 (ywatanabe)"
4
3
  # File: /home/ywatanabe/proj/scitex_repo/src/scitex/str/_latex_fallback.py
5
4
  # ----------------------------------------
6
5
  from __future__ import annotations
6
+
7
7
  import os
8
8
 
9
9
  __FILE__ = __file__
@@ -170,59 +170,65 @@ def latex_to_mathtext(latex_str: str) -> str:
170
170
  if text.startswith("$") and text.endswith("$"):
171
171
  text = text[1:-1]
172
172
 
173
- # Common LaTeX to mathtext conversions
174
- conversions = {
173
+ # Simple string replacements (double backslash to single)
174
+ simple_conversions = {
175
175
  # Greek letters
176
- r"\\alpha": r"\alpha",
177
- r"\\beta": r"\beta",
178
- r"\\gamma": r"\gamma",
179
- r"\\delta": r"\delta",
180
- r"\\epsilon": r"\epsilon",
181
- r"\\theta": r"\theta",
182
- r"\\lambda": r"\lambda",
183
- r"\\mu": r"\mu",
184
- r"\\pi": r"\pi",
185
- r"\\sigma": r"\sigma",
186
- r"\\tau": r"\tau",
187
- r"\\phi": r"\phi",
188
- r"\\omega": r"\omega",
176
+ r"\\alpha": "\\alpha",
177
+ r"\\beta": "\\beta",
178
+ r"\\gamma": "\\gamma",
179
+ r"\\delta": "\\delta",
180
+ r"\\epsilon": "\\epsilon",
181
+ r"\\theta": "\\theta",
182
+ r"\\lambda": "\\lambda",
183
+ r"\\mu": "\\mu",
184
+ r"\\pi": "\\pi",
185
+ r"\\sigma": "\\sigma",
186
+ r"\\tau": "\\tau",
187
+ r"\\phi": "\\phi",
188
+ r"\\omega": "\\omega",
189
189
  # Mathematical symbols
190
- r"\\sum": r"\sum",
191
- r"\\int": r"\int",
192
- r"\\partial": r"\partial",
193
- r"\\infty": r"\infty",
194
- r"\\pm": r"\pm",
195
- r"\\times": r"\times",
196
- r"\\cdot": r"\cdot",
197
- r"\\approx": r"\approx",
198
- r"\\neq": r"\neq",
199
- r"\\leq": r"\leq",
200
- r"\\geq": r"\geq",
190
+ r"\\sum": "\\sum",
191
+ r"\\int": "\\int",
192
+ r"\\partial": "\\partial",
193
+ r"\\infty": "\\infty",
194
+ r"\\pm": "\\pm",
195
+ r"\\times": "\\times",
196
+ r"\\cdot": "\\cdot",
197
+ r"\\approx": "\\approx",
198
+ r"\\neq": "\\neq",
199
+ r"\\leq": "\\leq",
200
+ r"\\geq": "\\geq",
201
201
  # Functions
202
- r"\\sin": r"\sin",
203
- r"\\cos": r"\cos",
204
- r"\\tan": r"\tan",
205
- r"\\log": r"\log",
206
- r"\\ln": r"\ln",
207
- r"\\exp": r"\exp",
202
+ r"\\sin": "\\sin",
203
+ r"\\cos": "\\cos",
204
+ r"\\tan": "\\tan",
205
+ r"\\log": "\\log",
206
+ r"\\ln": "\\ln",
207
+ r"\\exp": "\\exp",
208
+ }
209
+
210
+ # Apply simple string replacements
211
+ for pattern, replacement in simple_conversions.items():
212
+ text = text.replace(pattern, replacement)
213
+
214
+ # Regex patterns with capture groups
215
+ regex_conversions = [
208
216
  # Formatting (limited mathtext support)
209
- r"\\textbf\{([^}]+)\}": r"\mathbf{\1}",
210
- r"\\mathbf\{([^}]+)\}": r"\mathbf{\1}",
211
- r"\\textit\{([^}]+)\}": r"\mathit{\1}",
212
- r"\\mathit\{([^}]+)\}": r"\mathit{\1}",
217
+ (r"\\textbf\{([^}]+)\}", r"\\mathbf{\1}"),
218
+ (r"\\mathbf\{([^}]+)\}", r"\\mathbf{\1}"),
219
+ (r"\\textit\{([^}]+)\}", r"\\mathit{\1}"),
220
+ (r"\\mathit\{([^}]+)\}", r"\\mathit{\1}"),
213
221
  # Hats and accents
214
- r"\\hat\{([^}]+)\}": r"\hat{\1}",
215
- r"\\overrightarrow\{([^}]+)\}": r"\vec{\1}",
216
- r"\\vec\{([^}]+)\}": r"\vec{\1}",
222
+ (r"\\hat\{([^}]+)\}", r"\\hat{\1}"),
223
+ (r"\\overrightarrow\{([^}]+)\}", r"\\vec{\1}"),
224
+ (r"\\vec\{([^}]+)\}", r"\\vec{\1}"),
217
225
  # Fractions (simple ones)
218
- r"\\frac\{([^}]+)\}\{([^}]+)\}": r"\frac{\1}{\2}",
219
- # Subscripts and superscripts (should work as-is)
220
- # Powers and indices are handled naturally by mathtext
221
- }
226
+ (r"\\frac\{([^}]+)\}\{([^}]+)\}", r"\\frac{\1}{\2}"),
227
+ ]
222
228
 
223
- # Apply conversions
224
- for latex_pattern, mathtext_replacement in conversions.items():
225
- text = re.sub(latex_pattern, mathtext_replacement, text)
229
+ # Apply regex conversions
230
+ for pattern, replacement in regex_conversions:
231
+ text = re.sub(pattern, replacement, text)
226
232
 
227
233
  # Wrap in mathtext markers
228
234
  return f"${text}$"