seraplot 2.3.62__tar.gz → 2.3.69__tar.gz

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 (433) hide show
  1. {seraplot-2.3.62 → seraplot-2.3.69}/Cargo.lock +11 -1
  2. {seraplot-2.3.62 → seraplot-2.3.69}/Cargo.toml +2 -10
  3. {seraplot-2.3.62 → seraplot-2.3.69}/PKG-INFO +3 -1
  4. {seraplot-2.3.62 → seraplot-2.3.69}/README.md +2 -0
  5. seraplot-2.3.69/bench_issues.json +13 -0
  6. {seraplot-2.3.62 → seraplot-2.3.69}/bench_seraplot.py +71 -16
  7. {seraplot-2.3.62 → seraplot-2.3.69}/bench_sklearn.py +2 -1
  8. seraplot-2.3.69/benchmark_gridsearch.py +201 -0
  9. seraplot-2.3.69/benchmark_gridsearch2.py +138 -0
  10. {seraplot-2.3.62 → seraplot-2.3.69}/pyproject.toml +2 -2
  11. seraplot-2.3.69/python/seraplot/__init__.py +29 -0
  12. seraplot-2.3.69/python/seraplot/seraplot.cp311-win_amd64.pyd.old +0 -0
  13. {seraplot-2.3.62 → seraplot-2.3.69}/results_seraplot.json +33 -33
  14. {seraplot-2.3.62 → seraplot-2.3.69}/results_sklearn.json +34 -34
  15. seraplot-2.3.62/src/bindings/python/python.rs → seraplot-2.3.69/src/bindings/commands/charts.rs +201 -105
  16. seraplot-2.3.69/src/bindings/commands/docs.rs +2481 -0
  17. seraplot-2.3.69/src/bindings/commands/ml.rs +2215 -0
  18. seraplot-2.3.69/src/bindings/commands/mod.rs +17 -0
  19. seraplot-2.3.69/src/bindings/commands/registry.rs +45 -0
  20. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/mod.rs +4 -4
  21. seraplot-2.3.69/src/bindings/registry_macro.rs +141 -0
  22. {seraplot-2.3.62 → seraplot-2.3.69}/src/book.toml +1 -0
  23. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/SUMMARY.md +12 -9
  24. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/api/index.md +5 -7
  25. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/area.md +0 -3
  26. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bar.md +0 -11
  27. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/boxplot.md +0 -9
  28. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bubble.md +0 -6
  29. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bullet.md +1 -5
  30. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/candlestick.md +0 -3
  31. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/donut.md +0 -3
  32. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/dumbbell.md +0 -3
  33. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/funnel.md +0 -3
  34. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/gauge.md +0 -3
  35. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/grid.md +0 -6
  36. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/grouped-bar.md +7 -9
  37. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/hbar.md +0 -3
  38. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/heatmap.md +22 -24
  39. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/histogram-overlay.md +21 -24
  40. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/histogram.md +16 -20
  41. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/kde.md +0 -6
  42. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/line.md +0 -9
  43. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/lollipop.md +0 -3
  44. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/multiline.md +0 -6
  45. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/parallel.md +0 -9
  46. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/pie.md +0 -3
  47. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/radar.md +0 -3
  48. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/ridgeline.md +0 -11
  49. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/scatter.md +32 -32
  50. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/slideshow.md +0 -6
  51. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/slope.md +0 -3
  52. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/stacked-bar.md +0 -6
  53. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/sunburst.md +0 -6
  54. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/treemap.md +0 -6
  55. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/violin.md +0 -6
  56. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/waterfall.md +0 -3
  57. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/wordcloud.md +0 -6
  58. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/bar3d.md +0 -3
  59. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/bubble3d.md +0 -3
  60. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/candlestick3d.md +0 -3
  61. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/dumbbell3d.md +0 -3
  62. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/funnel3d.md +0 -3
  63. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/globe3d.md +1 -5
  64. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/heatmap3d.md +0 -6
  65. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/index.md +0 -2
  66. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/kde3d.md +0 -6
  67. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/line3d.md +0 -6
  68. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/lollipop3d.md +0 -3
  69. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/pie3d.md +1 -5
  70. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/radar3d.md +0 -3
  71. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/ridgeline3d.md +0 -6
  72. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/scatter3d.md +0 -6
  73. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/stacked-bar3d.md +0 -6
  74. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/sunburst3d.md +0 -6
  75. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/violin3d.md +0 -6
  76. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/bubble-map.md +0 -3
  77. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/choropleth.md +0 -3
  78. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/index.md +1 -3
  79. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/background.md +0 -9
  80. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/hover.md +100 -143
  81. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/palette.md +123 -202
  82. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/chart-methods.md +1 -76
  83. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/chart-object.md +138 -214
  84. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/installation.md +187 -289
  85. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/quickstart.md +0 -4
  86. seraplot-2.3.69/src/docs/ml/adaboost.md +185 -0
  87. seraplot-2.3.69/src/docs/ml/bayes-index.md +43 -0
  88. seraplot-2.3.69/src/docs/ml/clustering-index.md +39 -0
  89. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan-class.md +0 -12
  90. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan.md +0 -9
  91. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan3d.md +0 -9
  92. seraplot-2.3.69/src/docs/ml/decision-tree.md +197 -0
  93. seraplot-2.3.69/src/docs/ml/decomposition-index.md +69 -0
  94. seraplot-2.3.69/src/docs/ml/decomposition.md +239 -0
  95. seraplot-2.3.69/src/docs/ml/elastic-net.md +175 -0
  96. seraplot-2.3.69/src/docs/ml/evaluation-index.md +79 -0
  97. seraplot-2.3.69/src/docs/ml/gradient-boosting.md +193 -0
  98. seraplot-2.3.69/src/docs/ml/grid-search.md +491 -0
  99. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/index.md +18 -2
  100. seraplot-2.3.69/src/docs/ml/knn.md +175 -0
  101. seraplot-2.3.69/src/docs/ml/lasso.md +159 -0
  102. seraplot-2.3.69/src/docs/ml/linear-index.md +53 -0
  103. seraplot-2.3.69/src/docs/ml/linear-regression.md +151 -0
  104. seraplot-2.3.69/src/docs/ml/logistic-regression.md +171 -0
  105. seraplot-2.3.69/src/docs/ml/metrics.md +211 -0
  106. seraplot-2.3.69/src/docs/ml/naive-bayes.md +249 -0
  107. seraplot-2.3.69/src/docs/ml/neighbors-index.md +35 -0
  108. seraplot-2.3.69/src/docs/ml/preprocessing-index.md +69 -0
  109. seraplot-2.3.69/src/docs/ml/preprocessing.md +281 -0
  110. seraplot-2.3.69/src/docs/ml/random-forest.md +185 -0
  111. seraplot-2.3.69/src/docs/ml/ridge.md +177 -0
  112. seraplot-2.3.69/src/docs/ml/selection-index.md +89 -0
  113. seraplot-2.3.69/src/docs/ml/sgd.md +229 -0
  114. seraplot-2.3.69/src/docs/ml/svm-index.md +51 -0
  115. seraplot-2.3.69/src/docs/ml/svm.md +209 -0
  116. seraplot-2.3.69/src/docs/ml/train-test-split.md +229 -0
  117. seraplot-2.3.69/src/docs/ml/tree-index.md +57 -0
  118. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/theme/custom.css +30 -0
  119. seraplot-2.3.69/src/docs/theme/lang-switcher.js +141 -0
  120. {seraplot-2.3.62 → seraplot-2.3.69}/src/lib.rs +42 -49
  121. seraplot-2.3.69/src/ml/cache.rs +422 -0
  122. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/elastic_net.rs +19 -2
  123. seraplot-2.3.69/src/ml/linear/lasso.rs +32 -0
  124. seraplot-2.3.69/src/ml/linear/logistic.rs +497 -0
  125. seraplot-2.3.69/src/ml/linear/ols.rs +148 -0
  126. seraplot-2.3.69/src/ml/linear/ridge.rs +152 -0
  127. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/sgd.rs +62 -10
  128. seraplot-2.3.69/src/ml/mod.rs +40 -0
  129. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/cross_val.rs +7 -6
  130. seraplot-2.3.69/src/ml/model_selection/grid_search.rs +1256 -0
  131. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/mod.rs +2 -0
  132. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/split.rs +41 -20
  133. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/bernoulli.rs +11 -1
  134. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/gaussian.rs +28 -42
  135. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/multinomial.rs +5 -0
  136. seraplot-2.3.69/src/ml/neighbors/knn.rs +609 -0
  137. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/svm/svm.rs +14 -4
  138. seraplot-2.3.69/src/ml/tree/adaboost.rs +396 -0
  139. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/decision_tree.rs +10 -0
  140. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/gradient_boosting.rs +10 -0
  141. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/random_forest.rs +10 -0
  142. seraplot-2.3.62/bench_issues.json +0 -32
  143. seraplot-2.3.62/python/seraplot/__init__.py +0 -2
  144. seraplot-2.3.62/src/bindings/js/mod.rs +0 -2
  145. seraplot-2.3.62/src/bindings/python/mod.rs +0 -7
  146. seraplot-2.3.62/src/bindings/python/python_ml.rs +0 -1916
  147. seraplot-2.3.62/src/bindings/python/python_registry.rs +0 -175
  148. seraplot-2.3.62/src/docs/ml/adaboost.md +0 -107
  149. seraplot-2.3.62/src/docs/ml/decision-tree.md +0 -143
  150. seraplot-2.3.62/src/docs/ml/decomposition.md +0 -277
  151. seraplot-2.3.62/src/docs/ml/elastic-net.md +0 -129
  152. seraplot-2.3.62/src/docs/ml/gradient-boosting.md +0 -141
  153. seraplot-2.3.62/src/docs/ml/knn.md +0 -143
  154. seraplot-2.3.62/src/docs/ml/lasso.md +0 -123
  155. seraplot-2.3.62/src/docs/ml/linear-regression.md +0 -210
  156. seraplot-2.3.62/src/docs/ml/logistic-regression.md +0 -117
  157. seraplot-2.3.62/src/docs/ml/metrics.md +0 -141
  158. seraplot-2.3.62/src/docs/ml/naive-bayes.md +0 -152
  159. seraplot-2.3.62/src/docs/ml/preprocessing.md +0 -345
  160. seraplot-2.3.62/src/docs/ml/random-forest.md +0 -146
  161. seraplot-2.3.62/src/docs/ml/ridge.md +0 -112
  162. seraplot-2.3.62/src/docs/ml/sgd.md +0 -331
  163. seraplot-2.3.62/src/docs/ml/svm.md +0 -316
  164. seraplot-2.3.62/src/docs/ml/train-test-split.md +0 -110
  165. seraplot-2.3.62/src/docs/theme/lang-switcher.js +0 -70
  166. seraplot-2.3.62/src/ml/linear/lasso.rs +0 -19
  167. seraplot-2.3.62/src/ml/linear/logistic.rs +0 -351
  168. seraplot-2.3.62/src/ml/linear/ols.rs +0 -81
  169. seraplot-2.3.62/src/ml/linear/ridge.rs +0 -84
  170. seraplot-2.3.62/src/ml/mod.rs +0 -21
  171. seraplot-2.3.62/src/ml/neighbors/knn.rs +0 -546
  172. seraplot-2.3.62/src/ml/tree/adaboost.rs +0 -212
  173. {seraplot-2.3.62 → seraplot-2.3.69}/.gitignore +0 -0
  174. {seraplot-2.3.62 → seraplot-2.3.69}/05--Diabetes_SeraPlot.ipynb +0 -0
  175. {seraplot-2.3.62 → seraplot-2.3.69}/07--OpenFoodFacts_SeraPlot_Benchmark.ipynb +0 -0
  176. {seraplot-2.3.62 → seraplot-2.3.69}/TEST_1M_Battle.ipynb +0 -0
  177. {seraplot-2.3.62 → seraplot-2.3.69}/bench_all.py +0 -0
  178. {seraplot-2.3.62 → seraplot-2.3.69}/bench_bigdata.py +0 -0
  179. {seraplot-2.3.62 → seraplot-2.3.69}/bench_full.py +0 -0
  180. {seraplot-2.3.62 → seraplot-2.3.69}/bench_knn_sgd.py +0 -0
  181. {seraplot-2.3.62 → seraplot-2.3.69}/bench_perf.py +0 -0
  182. {seraplot-2.3.62 → seraplot-2.3.69}/bench_quick.py +0 -0
  183. {seraplot-2.3.62 → seraplot-2.3.69}/bench_quick2.py +0 -0
  184. {seraplot-2.3.62 → seraplot-2.3.69}/bench_scale.py +0 -0
  185. {seraplot-2.3.62 → seraplot-2.3.69}/bench_svc.py +0 -0
  186. {seraplot-2.3.62 → seraplot-2.3.69}/bench_svc2.py +0 -0
  187. {seraplot-2.3.62 → seraplot-2.3.69}/bench_test.py +0 -0
  188. {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_kmeans_heavy.ipynb +0 -0
  189. {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_kmeans_openfoodfacts.ipynb +0 -0
  190. {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml.ipynb +0 -0
  191. {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml_openfoodfacts.ipynb +0 -0
  192. {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml_out.ipynb +0 -0
  193. {seraplot-2.3.62 → seraplot-2.3.69}/gen_bench_slides.py +0 -0
  194. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/1.png +0 -0
  195. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/2.png +0 -0
  196. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/3.png +0 -0
  197. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/4.png +0 -0
  198. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/5.png +0 -0
  199. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/6.png +0 -0
  200. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/7.png +0 -0
  201. {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/8.png +0 -0
  202. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/1.png +0 -0
  203. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/2.png +0 -0
  204. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/3.png +0 -0
  205. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/4.png +0 -0
  206. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/5.png +0 -0
  207. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/6.png +0 -0
  208. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/7.png +0 -0
  209. {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/8.png +0 -0
  210. {seraplot-2.3.62 → seraplot-2.3.69}/images/README.md +0 -0
  211. {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/1.png +0 -0
  212. {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/2.png +0 -0
  213. {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/3.png +0 -0
  214. {seraplot-2.3.62 → seraplot-2.3.69}/images/logo.png +0 -0
  215. {seraplot-2.3.62 → seraplot-2.3.69}/kmeans_test.html +0 -0
  216. {seraplot-2.3.62 → seraplot-2.3.69}/python/seraplot/matplotlib.py +0 -0
  217. {seraplot-2.3.62 → seraplot-2.3.69}/src/.github/workflows/mdbook.yml +0 -0
  218. {seraplot-2.3.62 → seraplot-2.3.69}/src/README.md +0 -0
  219. {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/SVG World Map with labels.svg +0 -0
  220. {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/logo.png +0 -0
  221. {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/world.svg +0 -0
  222. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/builder_template.rs +0 -0
  223. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/chart_types.rs +0 -0
  224. /seraplot-2.3.62/src/bindings/js/js_bindings.rs → /seraplot-2.3.69/src/bindings/commands/wasm.rs +0 -0
  225. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/export_builder.rs +0 -0
  226. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/fast_export_c.rs +0 -0
  227. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/fast_render.rs +0 -0
  228. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/memory_pool.rs +0 -0
  229. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/unified_builder.rs +0 -0
  230. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/unified_config.rs +0 -0
  231. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/arena_alloc.rs +0 -0
  232. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/bitset.rs +0 -0
  233. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/compact_state.rs +0 -0
  234. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/data_processor.rs +0 -0
  235. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/image_processor.rs +0 -0
  236. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/lazy_builders.rs +0 -0
  237. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/memory_pool.rs +0 -0
  238. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/mod.rs +0 -0
  239. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/simd_ops.rs +0 -0
  240. {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/state_export.rs +0 -0
  241. {seraplot-2.3.62 → seraplot-2.3.69}/src/core/builders.rs +0 -0
  242. {seraplot-2.3.62 → seraplot-2.3.69}/src/core/math.rs +0 -0
  243. {seraplot-2.3.62 → seraplot-2.3.69}/src/core/mod.rs +0 -0
  244. {seraplot-2.3.62 → seraplot-2.3.69}/src/data/conversion.rs +0 -0
  245. {seraplot-2.3.62 → seraplot-2.3.69}/src/data/index.rs +0 -0
  246. {seraplot-2.3.62 → seraplot-2.3.69}/src/data/loader.rs +0 -0
  247. {seraplot-2.3.62 → seraplot-2.3.69}/src/data/mod.rs +0 -0
  248. {seraplot-2.3.62 → seraplot-2.3.69}/src/data/processor.rs +0 -0
  249. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/index.md +0 -0
  250. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/auto-display.md +0 -0
  251. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/introduction.md +0 -0
  252. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/kmeans-class.md +0 -0
  253. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/kmeans.md +0 -0
  254. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/area.html +0 -0
  255. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bar.html +0 -0
  256. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bar3d.html +0 -0
  257. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-matplotlib.html +0 -0
  258. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-plotly.html +0 -0
  259. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-seraplot.html +0 -0
  260. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/boxplot.html +0 -0
  261. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble-map.html +0 -0
  262. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble.html +0 -0
  263. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble3d.html +0 -0
  264. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bullet.html +0 -0
  265. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/candlestick.html +0 -0
  266. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/candlestick3d.html +0 -0
  267. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/choropleth.html +0 -0
  268. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan-class.html +0 -0
  269. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan.html +0 -0
  270. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan3d.html +0 -0
  271. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/donut.html +0 -0
  272. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dumbbell.html +0 -0
  273. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dumbbell3d.html +0 -0
  274. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/funnel.html +0 -0
  275. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/funnel3d.html +0 -0
  276. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/gauge.html +0 -0
  277. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/globe3d.html +0 -0
  278. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/grid.html +0 -0
  279. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/grouped-bar.html +0 -0
  280. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/hbar.html +0 -0
  281. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/heatmap.html +0 -0
  282. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/heatmap3d.html +0 -0
  283. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/histogram-overlay.html +0 -0
  284. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/histogram.html +0 -0
  285. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/kde.html +0 -0
  286. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/kde3d.html +0 -0
  287. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/line.html +0 -0
  288. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/line3d.html +0 -0
  289. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/lollipop.html +0 -0
  290. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/lollipop3d.html +0 -0
  291. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/multiline.html +0 -0
  292. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/parallel.html +0 -0
  293. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/pie.html +0 -0
  294. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/pie3d.html +0 -0
  295. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/radar.html +0 -0
  296. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/radar3d.html +0 -0
  297. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/ridgeline.html +0 -0
  298. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/ridgeline3d.html +0 -0
  299. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/scatter.html +0 -0
  300. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/scatter3d.html +0 -0
  301. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/slideshow.html +0 -0
  302. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/slope.html +0 -0
  303. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/stacked-bar.html +0 -0
  304. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/stacked-bar3d.html +0 -0
  305. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/sunburst.html +0 -0
  306. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/sunburst3d.html +0 -0
  307. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/treemap.html +0 -0
  308. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/violin.html +0 -0
  309. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/violin3d.html +0 -0
  310. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/waterfall.html +0 -0
  311. {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/wordcloud.html +0 -0
  312. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/assets.rs +0 -0
  313. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/fast_builders.rs +0 -0
  314. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/fast_exporter.rs +0 -0
  315. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/hover.rs +0 -0
  316. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/html_export.rs +0 -0
  317. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/html_template.rs +0 -0
  318. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/js_3d.rs +0 -0
  319. {seraplot-2.3.62 → seraplot-2.3.69}/src/html/mod.rs +0 -0
  320. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/decomposition/mod.rs +0 -0
  321. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/decomposition/pca.rs +0 -0
  322. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linalg.rs +0 -0
  323. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/mod.rs +0 -0
  324. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/classification.rs +0 -0
  325. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/mod.rs +0 -0
  326. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/regression.rs +0 -0
  327. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/mod.rs +0 -0
  328. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/neighbors/mod.rs +0 -0
  329. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/encoders.rs +0 -0
  330. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/mod.rs +0 -0
  331. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/scalers.rs +0 -0
  332. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/svm/mod.rs +0 -0
  333. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/decision_tree_backup.rs +0 -0
  334. {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/mod.rs +0 -0
  335. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/camera.rs +0 -0
  336. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/canvas.rs +0 -0
  337. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/containers_3d.rs +0 -0
  338. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/chart_controller.rs +0 -0
  339. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/mod.rs +0 -0
  340. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/plot_3d_controller.rs +0 -0
  341. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/bar_3d.rs +0 -0
  342. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/line_3d.rs +0 -0
  343. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/mod.rs +0 -0
  344. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/plot_3d_types.rs +0 -0
  345. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/scatter_3d.rs +0 -0
  346. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/bar.rs +0 -0
  347. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/chart.rs +0 -0
  348. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/kmeans.rs +0 -0
  349. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/line.rs +0 -0
  350. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/mod.rs +0 -0
  351. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/scatter.rs +0 -0
  352. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/svg.rs +0 -0
  353. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/generic.rs +0 -0
  354. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe.rs +0 -0
  355. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe_html.rs +0 -0
  356. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe_types.rs +0 -0
  357. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/mod.rs +0 -0
  358. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/bubble_map.rs +0 -0
  359. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/chart.rs +0 -0
  360. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/choropleth.rs +0 -0
  361. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/mod.rs +0 -0
  362. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/svg_parser.rs +0 -0
  363. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/world_data.rs +0 -0
  364. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/mod.rs +0 -0
  365. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/projection.rs +0 -0
  366. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/renderers.rs +0 -0
  367. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/scale_renderer.rs +0 -0
  368. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/_3d/mod.rs +0 -0
  369. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/_3d/plot_3d_types.rs +0 -0
  370. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/chart.rs +0 -0
  371. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/mod.rs +0 -0
  372. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/candlestick3d.rs +0 -0
  373. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/dumbbell3d.rs +0 -0
  374. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/funnel3d.rs +0 -0
  375. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/heatmap3d.rs +0 -0
  376. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/kde3d.rs +0 -0
  377. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/lollipop3d.rs +0 -0
  378. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/mod.rs +0 -0
  379. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/pie3d.rs +0 -0
  380. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/plot_3d_types.rs +0 -0
  381. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/radar3d.rs +0 -0
  382. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/ridgeline3d.rs +0 -0
  383. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/stacked_bar3d.rs +0 -0
  384. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/sunburst3d.rs +0 -0
  385. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/violin3d.rs +0 -0
  386. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/area.rs +0 -0
  387. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/boxplot.rs +0 -0
  388. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/bubble.rs +0 -0
  389. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/bullet.rs +0 -0
  390. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/candlestick.rs +0 -0
  391. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/common.rs +0 -0
  392. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/dumbbell.rs +0 -0
  393. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/funnel.rs +0 -0
  394. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/gauge.rs +0 -0
  395. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/grouped_bar.rs +0 -0
  396. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/heatmap.rs +0 -0
  397. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/histogram.rs +0 -0
  398. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/kde.rs +0 -0
  399. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/lollipop.rs +0 -0
  400. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/mod.rs +0 -0
  401. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/multiline.rs +0 -0
  402. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/parallel.rs +0 -0
  403. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/pie.rs +0 -0
  404. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/radar.rs +0 -0
  405. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/ridgeline.rs +0 -0
  406. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/slope.rs +0 -0
  407. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/sunburst.rs +0 -0
  408. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/treemap.rs +0 -0
  409. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/violin.rs +0 -0
  410. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/waterfall.rs +0 -0
  411. {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/wordcloud.rs +0 -0
  412. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/cache.rs +0 -0
  413. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/chart.rs +0 -0
  414. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/gui.rs +0 -0
  415. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/hybrid.rs +0 -0
  416. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/manager/button_manager.rs +0 -0
  417. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/manager/mod.rs +0 -0
  418. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/mod.rs +0 -0
  419. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/advanced_render.rs +0 -0
  420. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/fast_render_gui.rs +0 -0
  421. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/mod.rs +0 -0
  422. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/pipeline.rs +0 -0
  423. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/viewer_3d.rs +0 -0
  424. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/wiki_viewer.rs +0 -0
  425. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/utils/image_loader.rs +0 -0
  426. {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/utils/mod.rs +0 -0
  427. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/api.rs +0 -0
  428. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/extractor.rs +0 -0
  429. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/language.rs +0 -0
  430. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/macros.rs +0 -0
  431. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/metadata.rs +0 -0
  432. {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/mod.rs +0 -0
  433. {seraplot-2.3.62 → seraplot-2.3.69}/test_accuracy.py +0 -0
@@ -2107,6 +2107,15 @@ dependencies = [
2107
2107
  "cfg-if",
2108
2108
  ]
2109
2109
 
2110
+ [[package]]
2111
+ name = "inventory"
2112
+ version = "0.3.24"
2113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2114
+ checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b"
2115
+ dependencies = [
2116
+ "rustversion",
2117
+ ]
2118
+
2110
2119
  [[package]]
2111
2120
  name = "io-lifetimes"
2112
2121
  version = "1.0.11"
@@ -3048,6 +3057,7 @@ checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8"
3048
3057
  dependencies = [
3049
3058
  "cfg-if",
3050
3059
  "indoc",
3060
+ "inventory",
3051
3061
  "libc",
3052
3062
  "memoffset 0.9.1",
3053
3063
  "parking_lot",
@@ -3461,7 +3471,7 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
3461
3471
 
3462
3472
  [[package]]
3463
3473
  name = "seraplot"
3464
- version = "2.3.62"
3474
+ version = "2.3.69"
3465
3475
  dependencies = [
3466
3476
  "base64 0.22.1",
3467
3477
  "criterion",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "seraplot"
3
- version = "2.3.62"
3
+ version = "2.3.69"
4
4
  edition = "2021"
5
5
  authors = ["feur25"]
6
6
  description = "Rust data visualization framework - The modern Plotly alternative"
@@ -17,7 +17,7 @@ serde = { version = "1.0", features = ["derive"] }
17
17
  serde_json = "1.0"
18
18
  thiserror = "1.0"
19
19
  parking_lot = "0.12"
20
- pyo3 = { version = "0.21", features = ["extension-module"], optional = true }
20
+ pyo3 = { version = "0.21", features = ["extension-module", "multiple-pymethods"], optional = true }
21
21
  csv = "1.3"
22
22
  egui = { version = "0.27", optional = true }
23
23
  eframe = { version = "0.27", optional = true }
@@ -43,14 +43,6 @@ js = ["dep:wasm-bindgen", "dep:js-sys", "dep:getrandom", "dep:egui"]
43
43
  all = ["python"]
44
44
  pyo3 = ["dep:pyo3"]
45
45
 
46
- [[example]]
47
- name = "csv_test"
48
- path = "examples/csv_test.rs"
49
-
50
- [[example]]
51
- name = "csv_viewer"
52
- path = "examples/csv_viewer.rs"
53
-
54
46
  [profile.release]
55
47
  lto = "thin"
56
48
  codegen-units = 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seraplot
3
- Version: 2.3.62
3
+ Version: 2.3.69
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Environment :: Win32 (MS Windows)
6
6
  Classifier: Intended Audience :: Developers
@@ -37,6 +37,8 @@ alternative to Plotly, designed specifically for data visualization. This librar
37
37
  across multiple programming languages (Python, C#, C++, JavaScript), regularly maintained and
38
38
  updated, offering superior speed and significantly lower memory consumption compared to competitors.
39
39
 
40
+ documentation : https://feur25.github.io/seraplot/introduction.html
41
+
40
42
  ---
41
43
 
42
44
  ### Why Choose SeraPlot
@@ -5,6 +5,8 @@ alternative to Plotly, designed specifically for data visualization. This librar
5
5
  across multiple programming languages (Python, C#, C++, JavaScript), regularly maintained and
6
6
  updated, offering superior speed and significantly lower memory consumption compared to competitors.
7
7
 
8
+ documentation : https://feur25.github.io/seraplot/introduction.html
9
+
8
10
  ---
9
11
 
10
12
  ### Why Choose SeraPlot
@@ -0,0 +1,13 @@
1
+ {
2
+ "score_bugs": [],
3
+ "speed_bugs": [
4
+ {
5
+ "algo": "LabelEncoder.fit_transform",
6
+ "sp_fit_s": 0.0131,
7
+ "sk_fit_s": 0.0079,
8
+ "speedup": 0.603
9
+ }
10
+ ],
11
+ "n": 50000,
12
+ "date": "2026-04-18"
13
+ }
@@ -3,6 +3,21 @@ import json
3
3
  import numpy as np
4
4
  import pandas as pd
5
5
  import seraplot as sp
6
+ from sklearn.linear_model import (
7
+ LinearRegression as SkLR, Ridge as SkRidge, Lasso as SkLasso,
8
+ ElasticNet as SkEN, SGDRegressor as SkSGDR,
9
+ LogisticRegression as SkLogR, SGDClassifier as SkSGDC,
10
+ )
11
+ from sklearn.tree import DecisionTreeClassifier as SkDTC
12
+ from sklearn.ensemble import (
13
+ RandomForestClassifier as SkRFC, GradientBoostingClassifier as SkGBC,
14
+ AdaBoostClassifier as SkABC,
15
+ )
16
+ from sklearn.neighbors import KNeighborsClassifier as SkKNN
17
+ from sklearn.naive_bayes import GaussianNB as SkGNB, BernoulliNB as SkBNB
18
+ from sklearn.svm import LinearSVC as SkSVC
19
+ from sklearn.model_selection import StratifiedKFold, cross_val_score
20
+ from sklearn.metrics import accuracy_score, r2_score as sk_r2
6
21
 
7
22
  DATA_PATH = r"C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz"
8
23
  N_MAX = 50_000
@@ -18,8 +33,9 @@ CLASS_COL = "pnns_groups_1"
18
33
 
19
34
  print("Chargement des données…")
20
35
  df = pd.read_csv(
21
- DATA_PATH, sep="\t", on_bad_lines="skip", engine="python",
36
+ DATA_PATH, sep="\t", on_bad_lines="skip",
22
37
  usecols=NUMERIC_COLS + [CLASS_COL],
38
+ engine="python", nrows=500_000, quoting=3,
23
39
  )
24
40
  NUMERIC_COLS = [c for c in NUMERIC_COLS if c in df.columns]
25
41
  FEATURE_COLS = [c for c in NUMERIC_COLS if c != TARGET_REG]
@@ -58,6 +74,7 @@ yc_tr, yc_te = y_cls[tr], y_cls[te]
58
74
  ls_tr = label_strings[tr]
59
75
 
60
76
  records = {}
77
+ sk_records = {}
61
78
 
62
79
  def run(name, model, Xtr, ytr, Xte, yte, metric="acc"):
63
80
  t0 = time.perf_counter()
@@ -70,6 +87,16 @@ def run(name, model, Xtr, ytr, Xte, yte, metric="acc"):
70
87
  records[name] = {"fit_s": round(fit_s, 4), "pred_s": round(pred_s, 4), "metric": metric, "score": round(score, 4)}
71
88
  print(f" {name:<40} fit={fit_s:8.4f}s pred={pred_s:7.4f}s {metric}={score:.4f}")
72
89
 
90
+ def run_sk(name, model, Xtr, ytr, Xte, yte, metric="acc"):
91
+ t0 = time.perf_counter()
92
+ model.fit(Xtr, ytr)
93
+ fit_s = time.perf_counter() - t0
94
+ t0 = time.perf_counter()
95
+ pred = model.predict(Xte)
96
+ pred_s = time.perf_counter() - t0
97
+ score = float(accuracy_score(yte, pred) if metric == "acc" else sk_r2(yte, pred))
98
+ sk_records[name] = {"fit_s": round(fit_s, 4), "pred_s": round(pred_s, 4), "metric": metric, "score": round(score, 4)}
99
+
73
100
  def runt(name, fn, *args, **kw):
74
101
  t0 = time.perf_counter()
75
102
  fn(*args, **kw)
@@ -94,6 +121,12 @@ run("Lasso(α=0.1)", sp.Lasso(alpha=0.1, max_iter=500),
94
121
  run("ElasticNet(α=0.1,l1=.5)", sp.ElasticNet(alpha=0.1, l1_ratio=0.5, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
95
122
  run("SGDRegressor", sp.SGDRegressor(loss="squared_error", alpha=1e-4, max_iter=200, eta0=0.01), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
96
123
 
124
+ run_sk("LinearRegression", SkLR(), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
125
+ run_sk("Ridge(α=1.0)", SkRidge(alpha=1.0), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
126
+ run_sk("Lasso(α=0.1)", SkLasso(alpha=0.1, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
127
+ run_sk("ElasticNet(α=0.1,l1=.5)",SkEN(alpha=0.1, l1_ratio=0.5, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
128
+ run_sk("SGDRegressor", SkSGDR(loss="squared_error", alpha=1e-4, max_iter=200, eta0=0.01), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
129
+
97
130
  print()
98
131
  run("LogisticRegression(C=1)", sp.LogisticRegression(c=1.0, max_iter=300), Xs_tr, yc_tr, Xs_te, yc_te)
99
132
  run("SGDClassifier(hinge)", sp.SGDClassifier(loss="hinge", alpha=1e-4, max_iter=200), Xs_tr, yc_tr, Xs_te, yc_te)
@@ -106,28 +139,50 @@ run("GaussianNB", sp.GaussianNB(),
106
139
  run("BernoulliNB", sp.BernoulliNB(), Xb_tr, yc_tr, Xb_te, yc_te)
107
140
  run("LinearSVC(C=1)", sp.LinearSVC(c=1.0, max_iter=500), Xs_tr, yc_tr, Xs_te, yc_te)
108
141
 
142
+ run_sk("LogisticRegression(C=1)",SkLogR(C=1.0, max_iter=300, solver="lbfgs"), Xs_tr, yc_tr, Xs_te, yc_te)
143
+ run_sk("SGDClassifier(hinge)", SkSGDC(loss="hinge", alpha=1e-4, max_iter=200), Xs_tr, yc_tr, Xs_te, yc_te)
144
+ run_sk("DecisionTree(d=10)", SkDTC(max_depth=10), X_tr, yc_tr, X_te, yc_te)
145
+ run_sk("RandomForest(50,d=10)", SkRFC(n_estimators=50, max_depth=10, n_jobs=-1), X_tr, yc_tr, X_te, yc_te)
146
+ run_sk("GradientBoosting(50,d=3)",SkGBC(n_estimators=50, max_depth=3, learning_rate=0.1), X_tr, yc_tr, X_te, yc_te)
147
+ run_sk("AdaBoost(50)", SkABC(n_estimators=50), X_tr, yc_tr, X_te, yc_te)
148
+ run_sk("KNeighbors(k=5)", SkKNN(n_neighbors=5), Xs_tr, yc_tr, Xs_te, yc_te)
149
+ run_sk("GaussianNB", SkGNB(), X_tr, yc_tr, X_te, yc_te)
150
+ run_sk("BernoulliNB", SkBNB(), Xb_tr, yc_tr, Xb_te, yc_te)
151
+ run_sk("LinearSVC(C=1)", SkSVC(C=1.0, max_iter=500), Xs_tr, yc_tr, Xs_te, yc_te)
152
+
109
153
  print()
110
154
  skf = sp.StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
111
- cv_acc = []
155
+ folds_data = list(skf.split(Xs_tr, yc_tr))
112
156
  t0 = time.perf_counter()
113
- for ti, vi in skf.split(Xs_tr, yc_tr):
114
- m = sp.LogisticRegression(c=1.0, max_iter=200)
115
- m.fit(Xs_tr[ti], yc_tr[ti])
116
- cv_acc.append(float(sp.accuracy_score(yc_tr[vi], m.predict(Xs_tr[vi]))))
157
+ cv_acc = sp.parallel_cv_cls(Xs_tr, yc_tr, folds_data, c=1.0, max_iter=200)
117
158
  cv_s = time.perf_counter() - t0
118
159
  cv_mean = float(np.mean(cv_acc))
119
160
  records["StratifiedKFold(5)×LR"] = {"fit_s": round(cv_s, 4), "pred_s": 0.0, "metric": "cv_acc", "score": round(cv_mean, 4)}
120
161
  print(f" {'StratifiedKFold(5)×LR':<40} {cv_s:.4f}s mean_acc={cv_mean:.4f}")
121
162
 
122
- with open("results_seraplot.json", "w") as f:
123
- json.dump(records, f, indent=2)
163
+ skf_sk = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
164
+ t0 = time.perf_counter()
165
+ sk_cv_scores = cross_val_score(SkLogR(C=1.0, max_iter=200, solver="lbfgs"), Xs_tr, yc_tr, cv=skf_sk, scoring="accuracy")
166
+ sk_cv_s = time.perf_counter() - t0
167
+ sk_records["StratifiedKFold(5)×LR"] = {"fit_s": round(sk_cv_s, 4), "pred_s": 0.0, "metric": "cv_acc", "score": round(float(np.mean(sk_cv_scores)), 4)}
124
168
 
125
- print(f"\n{'═'*76}")
126
- print(f" {'Algorithme':<40} {'Fit (s)':>10} {'Pred (s)':>10} {'Score':>8}")
127
- print(f"{'═'*76}")
128
- for k, v in records.items():
129
- pred_str = f"{v['pred_s']:.4f}" if v["pred_s"] > 0 else "-"
130
- score_str = f"{v['score']:.4f}" if v["metric"] not in ("ms", "s") else "-"
131
- print(f" {k:<40} {v['fit_s']:>10.4f} {pred_str:>10} {score_str:>8}")
132
- print(f"{'═'*76}")
169
+ with open("results_seraplot.json", "w") as f:
170
+ json.dump({"seraplot": records, "sklearn": sk_records}, f, indent=2)
171
+
172
+ print(f"\n{'═'*100}")
173
+ print(f" {'Algorithme':<40} {'SP fit':>8} {'SK fit':>8} {'Speedup':>8} {'SP score':>10} {'SK score':>10} {'Δ score':>8}")
174
+ print(f"{''*100}")
175
+ all_keys = list(records.keys())
176
+ for k in all_keys:
177
+ sp_r = records.get(k, {})
178
+ sk_r = sk_records.get(k, {})
179
+ sp_t = sp_r.get("fit_s", 0.0)
180
+ sk_t = sk_r.get("fit_s", 0.0)
181
+ sp_s = sp_r.get("score", 0.0)
182
+ sk_s = sk_r.get("score", 0.0)
183
+ ratio_str = f"{sk_t/sp_t:.1f}×" if sp_t > 0 and sk_t > 0 else "-"
184
+ delta = abs(sp_s - sk_s) if sp_r.get("metric") not in ("s",) else 0.0
185
+ ok = "✓" if delta < 0.01 else "✗" if sp_r.get("metric") not in ("s",) else ""
186
+ print(f" {k:<40} {sp_t:>8.4f} {sk_t:>8.4f} {ratio_str:>8} {sp_s:>10.4f} {sk_s:>10.4f} {delta:>7.4f}{ok}")
187
+ print(f"{'═'*100}")
133
188
  print(f"\nRésultats sauvegardés → results_seraplot.json")
@@ -32,8 +32,9 @@ CLASS_COL = "pnns_groups_1"
32
32
 
33
33
  print("Chargement des données…")
34
34
  df = pd.read_csv(
35
- DATA_PATH, sep="\t", on_bad_lines="skip", engine="python",
35
+ DATA_PATH, sep="\t", on_bad_lines="skip",
36
36
  usecols=NUMERIC_COLS + [CLASS_COL],
37
+ engine="python",
37
38
  )
38
39
  NUMERIC_COLS = [c for c in NUMERIC_COLS if c in df.columns]
39
40
  FEATURE_COLS = [c for c in NUMERIC_COLS if c != TARGET_REG]
@@ -0,0 +1,201 @@
1
+ """
2
+ Benchmark: SeraPlot GridSearchCV vs scikit-learn GridSearchCV
3
+ Dataset: OpenFoodFacts (500k rows)
4
+ """
5
+ import time
6
+ import numpy as np
7
+ import pandas as pd
8
+
9
+ FEATURES = [
10
+ 'energy-kcal_100g', 'fat_100g', 'saturated-fat_100g',
11
+ 'carbohydrates_100g', 'sugars_100g', 'fiber_100g',
12
+ 'proteins_100g', 'salt_100g',
13
+ ]
14
+
15
+ def load_data(n_rows=500_000):
16
+ print(f"Loading OpenFoodFacts ({n_rows} rows)...")
17
+ t0 = time.perf_counter()
18
+ df = pd.read_csv(
19
+ r'C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz',
20
+ sep='\t', usecols=FEATURES + ['nutriscore_score', 'nutriscore_grade'],
21
+ nrows=n_rows * 3, # load extra to handle NaN drops
22
+ )
23
+ df = df.dropna(subset=FEATURES + ['nutriscore_score']).head(n_rows)
24
+ X = df[FEATURES].values.astype(np.float64)
25
+ y_reg = df['nutriscore_score'].values.astype(np.float64)
26
+ # For classification: bin nutriscore into 5 classes (0-4)
27
+ y_cls = pd.qcut(y_reg, q=5, labels=False, duplicates='drop').astype(np.int32)
28
+ print(f" Loaded {X.shape[0]} rows x {X.shape[1]} features in {time.perf_counter()-t0:.2f}s")
29
+ print(f" Classes: {np.unique(y_cls)}")
30
+ return X, y_reg, y_cls
31
+
32
+
33
+ def bench_sklearn_gridsearch_ridge(X, y):
34
+ from sklearn.linear_model import Ridge
35
+ from sklearn.model_selection import GridSearchCV
36
+ param_grid = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]}
37
+ gs = GridSearchCV(Ridge(), param_grid, cv=5, scoring='r2', n_jobs=-1)
38
+ t0 = time.perf_counter()
39
+ gs.fit(X, y)
40
+ elapsed = time.perf_counter() - t0
41
+ return elapsed, gs.best_score_, gs.best_params_
42
+
43
+
44
+ def bench_seraplot_gridsearch_ridge(X, y):
45
+ from seraplot import GridSearchCV
46
+ param_grid = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]}
47
+ gs = GridSearchCV('Ridge', param_grid, cv=5)
48
+ t0 = time.perf_counter()
49
+ gs.fit(X, y)
50
+ elapsed = time.perf_counter() - t0
51
+ return elapsed, gs.best_score_, gs.best_params_
52
+
53
+
54
+ def bench_sklearn_gridsearch_rf(X, y):
55
+ from sklearn.ensemble import RandomForestClassifier
56
+ from sklearn.model_selection import GridSearchCV
57
+ param_grid = {
58
+ 'n_estimators': [50, 100],
59
+ 'max_depth': [5, 10, 20],
60
+ 'min_samples_split': [2, 5],
61
+ 'min_samples_leaf': [1, 2],
62
+ }
63
+ gs = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=3, scoring='accuracy', n_jobs=-1)
64
+ t0 = time.perf_counter()
65
+ gs.fit(X, y)
66
+ elapsed = time.perf_counter() - t0
67
+ return elapsed, gs.best_score_, gs.best_params_
68
+
69
+
70
+ def bench_seraplot_gridsearch_rf(X, y):
71
+ from seraplot import GridSearchCV
72
+ param_grid = {
73
+ 'n_estimators': [50, 100],
74
+ 'max_depth': [5, 10, 20],
75
+ 'min_samples_split': [2, 5],
76
+ 'min_samples_leaf': [1, 2],
77
+ }
78
+ gs = GridSearchCV('RandomForestClassifier', param_grid, cv=3)
79
+ t0 = time.perf_counter()
80
+ gs.fit(X, y)
81
+ elapsed = time.perf_counter() - t0
82
+ return elapsed, gs.best_score_, gs.best_params_
83
+
84
+
85
+ def bench_sklearn_randomsearch_gb(X, y):
86
+ from sklearn.ensemble import GradientBoostingClassifier
87
+ from sklearn.model_selection import RandomizedSearchCV
88
+ param_dist = {
89
+ 'n_estimators': [50, 100, 200],
90
+ 'learning_rate': [0.01, 0.05, 0.1, 0.2],
91
+ 'max_depth': [3, 5, 7, 10],
92
+ 'min_samples_split': [2, 5, 10],
93
+ 'min_samples_leaf': [1, 2, 4],
94
+ }
95
+ rs = RandomizedSearchCV(GradientBoostingClassifier(random_state=42), param_dist, n_iter=20, cv=3, scoring='accuracy', n_jobs=-1, random_state=42)
96
+ t0 = time.perf_counter()
97
+ rs.fit(X, y)
98
+ elapsed = time.perf_counter() - t0
99
+ return elapsed, rs.best_score_, rs.best_params_
100
+
101
+
102
+ def bench_seraplot_randomsearch_gb(X, y):
103
+ from seraplot import RandomizedSearchCV
104
+ param_dist = {
105
+ 'n_estimators': [50, 100, 200],
106
+ 'learning_rate': [0.01, 0.05, 0.1, 0.2],
107
+ 'max_depth': [3, 5, 7, 10],
108
+ 'min_samples_split': [2, 5, 10],
109
+ 'min_samples_leaf': [1, 2, 4],
110
+ }
111
+ rs = RandomizedSearchCV('GradientBoostingClassifier', param_dist, n_iter=20, cv=3)
112
+ t0 = time.perf_counter()
113
+ rs.fit(X, y)
114
+ elapsed = time.perf_counter() - t0
115
+ return elapsed, rs.best_score_, rs.best_params_
116
+
117
+
118
+ def bench_sklearn_halving_rf(X, y):
119
+ from sklearn.ensemble import RandomForestClassifier
120
+ from sklearn.experimental import enable_halving_search_cv
121
+ from sklearn.model_selection import HalvingGridSearchCV
122
+ param_grid = {
123
+ 'n_estimators': [50, 100, 200],
124
+ 'max_depth': [3, 5, 10, 20],
125
+ 'min_samples_split': [2, 5, 10],
126
+ 'min_samples_leaf': [1, 2, 4],
127
+ }
128
+ hg = HalvingGridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=3, factor=3, scoring='accuracy', n_jobs=-1, random_state=42)
129
+ t0 = time.perf_counter()
130
+ hg.fit(X, y)
131
+ elapsed = time.perf_counter() - t0
132
+ return elapsed, hg.best_score_, hg.best_params_
133
+
134
+
135
+ def bench_seraplot_halving_rf(X, y):
136
+ from seraplot import HalvingGridSearchCV
137
+ param_grid = {
138
+ 'n_estimators': [50, 100, 200],
139
+ 'max_depth': [3, 5, 10, 20],
140
+ 'min_samples_split': [2, 5, 10],
141
+ 'min_samples_leaf': [1, 2, 4],
142
+ }
143
+ hg = HalvingGridSearchCV('RandomForestClassifier', param_grid, cv=3, factor=3)
144
+ t0 = time.perf_counter()
145
+ hg.fit(X, y)
146
+ elapsed = time.perf_counter() - t0
147
+ return elapsed, hg.best_score_, hg.best_params_
148
+
149
+
150
+ def print_result(name, t_sk, score_sk, params_sk, t_sp, score_sp, params_sp):
151
+ speedup = t_sk / t_sp if t_sp > 0 else float('inf')
152
+ print(f"\n{'='*70}")
153
+ print(f" {name}")
154
+ print(f"{'='*70}")
155
+ print(f" scikit-learn : {t_sk:8.2f}s score={score_sk:.4f} params={params_sk}")
156
+ print(f" SeraPlot : {t_sp:8.2f}s score={score_sp:.4f} params={params_sp}")
157
+ print(f" Speedup : {speedup:8.1f}x")
158
+
159
+
160
+ def main():
161
+ X, y_reg, y_cls = load_data(500_000)
162
+
163
+ # Reduce data for slower benchmarks
164
+ X_small = X[:50_000]
165
+ y_cls_small = y_cls[:50_000]
166
+
167
+ print("\n" + "="*70)
168
+ print(" BENCHMARK: SeraPlot vs scikit-learn GridSearchCV")
169
+ print("="*70)
170
+
171
+ # 1. Ridge GridSearchCV (full 500k)
172
+ print("\n[1/4] Ridge GridSearchCV (500k rows, 6 alpha values, cv=5)...")
173
+ t_sk, s_sk, p_sk = bench_sklearn_gridsearch_ridge(X, y_reg)
174
+ t_sp, s_sp, p_sp = bench_seraplot_gridsearch_ridge(X, y_reg)
175
+ print_result("Ridge GridSearchCV (500k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
176
+
177
+ # 2. RandomForest GridSearchCV (50k subset - RF is heavy)
178
+ print("\n[2/4] RandomForest GridSearchCV (50k rows, 24 combos, cv=3)...")
179
+ t_sk, s_sk, p_sk = bench_sklearn_gridsearch_rf(X_small, y_cls_small)
180
+ t_sp, s_sp, p_sp = bench_seraplot_gridsearch_rf(X_small, y_cls_small)
181
+ print_result("RandomForest GridSearchCV (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
182
+
183
+ # 3. GradientBoosting RandomizedSearchCV (50k subset)
184
+ print("\n[3/4] GradientBoosting RandomizedSearchCV (50k rows, 20 iters, cv=3)...")
185
+ t_sk, s_sk, p_sk = bench_sklearn_randomsearch_gb(X_small, y_cls_small)
186
+ t_sp, s_sp, p_sp = bench_seraplot_randomsearch_gb(X_small, y_cls_small)
187
+ print_result("GradientBoosting RandomizedSearchCV (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
188
+
189
+ # 4. HalvingGridSearchCV with RF (50k subset)
190
+ print("\n[4/4] HalvingGridSearchCV RF (50k rows, 108 combos, factor=3)...")
191
+ t_sk, s_sk, p_sk = bench_sklearn_halving_rf(X_small, y_cls_small)
192
+ t_sp, s_sp, p_sp = bench_seraplot_halving_rf(X_small, y_cls_small)
193
+ print_result("HalvingGridSearchCV RF (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
194
+
195
+ print("\n" + "="*70)
196
+ print(" BENCHMARK COMPLETE")
197
+ print("="*70)
198
+
199
+
200
+ if __name__ == '__main__':
201
+ main()
@@ -0,0 +1,138 @@
1
+ """
2
+ Benchmark #2: Large search spaces - SeraPlot vs scikit-learn
3
+ Focus on where parallel Rust execution dominates.
4
+ """
5
+ import time
6
+ import numpy as np
7
+ import pandas as pd
8
+
9
+
10
+ def load_data():
11
+ print("Loading OpenFoodFacts...")
12
+ t0 = time.perf_counter()
13
+ cols = ['energy-kcal_100g', 'fat_100g', 'saturated-fat_100g',
14
+ 'carbohydrates_100g', 'sugars_100g', 'proteins_100g',
15
+ 'salt_100g', 'nutriscore_score']
16
+ df = pd.read_csv(
17
+ r'C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz',
18
+ sep='\t', nrows=500_000, low_memory=False, on_bad_lines='skip',
19
+ )
20
+ df = df[cols].dropna()
21
+ X = df[cols[:-1]].values.astype(np.float64)
22
+ y_reg = df['nutriscore_score'].values.astype(np.float64)
23
+ y_cls = pd.qcut(y_reg, q=3, labels=False, duplicates='drop').astype(np.int32)
24
+ print(f" {X.shape[0]} rows x {X.shape[1]} features in {time.perf_counter()-t0:.2f}s")
25
+ return X, y_reg, y_cls
26
+
27
+
28
+ def main():
29
+ X, y_reg, y_cls = load_data()
30
+
31
+ # Use subsets for different tests
32
+ X_100k, y_reg_100k = X[:100_000], y_reg[:100_000]
33
+ X_50k, y_cls_50k = X[:50_000], y_cls[:50_000]
34
+
35
+ print(f"\n{'='*70}")
36
+ print(" BENCHMARK 2: Large search spaces")
37
+ print(f"{'='*70}")
38
+
39
+ # 1. Lasso: 5 alphas x 3 max_iter x 3 tol = 45 combos, cv=5 = 225 fits, 100k rows
40
+ print("\n[1] Lasso GridSearchCV (100k rows, 45 combos, cv=5 = 225 fits)...")
41
+ from sklearn.linear_model import Lasso as SkLasso
42
+ from sklearn.model_selection import GridSearchCV as SkGS
43
+ pg = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1.0], 'max_iter': [500, 1000, 2000], 'tol': [1e-4, 1e-3, 1e-2]}
44
+ t0 = time.perf_counter()
45
+ sk = SkGS(SkLasso(), pg, cv=5, scoring='r2', n_jobs=-1); sk.fit(X_100k, y_reg_100k)
46
+ t_sk = time.perf_counter() - t0
47
+
48
+ from seraplot import GridSearchCV as SpGS
49
+ t0 = time.perf_counter()
50
+ sp = SpGS('Lasso', pg, cv=5); sp.fit(X_100k, y_reg_100k)
51
+ t_sp = time.perf_counter() - t0
52
+ print(f" sklearn: {t_sk:.2f}s score={sk.best_score_:.4f} params={sk.best_params_}")
53
+ print(f" SeraPlot: {t_sp:.2f}s score={sp.best_score_:.4f} params={sp.best_params_}")
54
+ print(f" Speedup: {t_sk/t_sp:.1f}x")
55
+
56
+ # 2. ElasticNet: 5 alpha x 5 l1_ratio x 3 max_iter = 75 combos, cv=5 = 375 fits, 100k rows
57
+ print("\n[2] ElasticNet GridSearchCV (100k rows, 75 combos, cv=5 = 375 fits)...")
58
+ from sklearn.linear_model import ElasticNet as SkEN
59
+ pg2 = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1.0], 'l1_ratio': [0.1, 0.3, 0.5, 0.7, 0.9], 'max_iter': [500, 1000, 2000]}
60
+ t0 = time.perf_counter()
61
+ sk2 = SkGS(SkEN(), pg2, cv=5, scoring='r2', n_jobs=-1); sk2.fit(X_100k, y_reg_100k)
62
+ t_sk2 = time.perf_counter() - t0
63
+ t0 = time.perf_counter()
64
+ sp2 = SpGS('ElasticNet', pg2, cv=5); sp2.fit(X_100k, y_reg_100k)
65
+ t_sp2 = time.perf_counter() - t0
66
+ print(f" sklearn: {t_sk2:.2f}s score={sk2.best_score_:.4f}")
67
+ print(f" SeraPlot: {t_sp2:.2f}s score={sp2.best_score_:.4f}")
68
+ print(f" Speedup: {t_sk2/t_sp2:.1f}x")
69
+
70
+ # 3. LogisticRegression GridSearchCV: 6C x 3 max_iter = 18 combos, cv=5, 50k rows
71
+ print("\n[3] LogisticRegression GridSearchCV (50k rows, 18 combos, cv=5 = 90 fits)...")
72
+ from sklearn.linear_model import LogisticRegression as SkLR
73
+ pg3 = {'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0], 'max_iter': [100, 500, 1000]}
74
+ t0 = time.perf_counter()
75
+ sk3 = SkGS(SkLR(), pg3, cv=5, scoring='accuracy', n_jobs=-1); sk3.fit(X_50k, y_cls_50k)
76
+ t_sk3 = time.perf_counter() - t0
77
+ t0 = time.perf_counter()
78
+ sp3 = SpGS('LogisticRegression', pg3, cv=5); sp3.fit(X_50k, y_cls_50k)
79
+ t_sp3 = time.perf_counter() - t0
80
+ print(f" sklearn: {t_sk3:.2f}s score={sk3.best_score_:.4f}")
81
+ print(f" SeraPlot: {t_sp3:.2f}s score={sp3.best_score_:.4f}")
82
+ print(f" Speedup: {t_sk3/t_sp3:.1f}x")
83
+
84
+ # 4. KNN GridSearchCV: 8 k-values x 2 weights = 16 combos, cv=5 = 80 fits, 50k
85
+ print("\n[4] KNN GridSearchCV (50k rows, 16 combos, cv=5 = 80 fits)...")
86
+ from sklearn.neighbors import KNeighborsClassifier as SkKNN
87
+ pg4 = {'n_neighbors': [3, 5, 7, 9, 11, 15, 21, 31], 'weights': ['uniform', 'distance']}
88
+ t0 = time.perf_counter()
89
+ sk4 = SkGS(SkKNN(), pg4, cv=5, scoring='accuracy', n_jobs=-1); sk4.fit(X_50k, y_cls_50k)
90
+ t_sk4 = time.perf_counter() - t0
91
+ t0 = time.perf_counter()
92
+ sp4 = SpGS('KNeighborsClassifier', pg4, cv=5); sp4.fit(X_50k, y_cls_50k)
93
+ t_sp4 = time.perf_counter() - t0
94
+ print(f" sklearn: {t_sk4:.2f}s score={sk4.best_score_:.4f}")
95
+ print(f" SeraPlot: {t_sp4:.2f}s score={sp4.best_score_:.4f}")
96
+ print(f" Speedup: {t_sk4/t_sp4:.1f}x")
97
+
98
+ # 5. HalvingRandomSearchCV: Large space, 256 candidates, factor=3
99
+ print("\n[5] HalvingRandomSearchCV GradientBoosting (50k, 256 candidates)...")
100
+ from sklearn.ensemble import GradientBoostingClassifier as SkGB
101
+ from sklearn.experimental import enable_halving_search_cv
102
+ from sklearn.model_selection import HalvingRandomSearchCV as SkHRS
103
+ from seraplot import HalvingRandomSearchCV as SpHRS
104
+ pg5 = {
105
+ 'n_estimators': [25, 50, 100, 200],
106
+ 'learning_rate': [0.01, 0.05, 0.1, 0.2],
107
+ 'max_depth': [3, 5, 7, 10],
108
+ 'min_samples_split': [2, 5, 10],
109
+ 'min_samples_leaf': [1, 2, 4],
110
+ }
111
+ t0 = time.perf_counter()
112
+ sk5 = SkHRS(SkGB(random_state=42), pg5, n_candidates=256, cv=3, factor=3, scoring='accuracy', n_jobs=-1, random_state=42); sk5.fit(X_50k, y_cls_50k)
113
+ t_sk5 = time.perf_counter() - t0
114
+ t0 = time.perf_counter()
115
+ sp5 = SpHRS('GradientBoostingClassifier', pg5, n_candidates=256, cv=3, factor=3); sp5.fit(X_50k, y_cls_50k)
116
+ t_sp5 = time.perf_counter() - t0
117
+ print(f" sklearn: {t_sk5:.2f}s score={sk5.best_score_:.4f}")
118
+ print(f" SeraPlot: {t_sp5:.2f}s score={sp5.best_score_:.4f}")
119
+ print(f" Speedup: {t_sk5/t_sp5:.1f}x")
120
+
121
+ print(f"\n{'='*70}")
122
+ print(f" SUMMARY")
123
+ print(f"{'='*70}")
124
+ results = [
125
+ ("Lasso GS 45x5", t_sk, t_sp),
126
+ ("ElasticNet GS 75x5", t_sk2, t_sp2),
127
+ ("LogisticReg GS 18x5", t_sk3, t_sp3),
128
+ ("KNN GS 16x5", t_sk4, t_sp4),
129
+ ("HalvingRandom GB 256", t_sk5, t_sp5),
130
+ ]
131
+ for name, ts, tp in results:
132
+ print(f" {name:30s} sklearn={ts:7.2f}s seraplot={tp:7.2f}s speedup={ts/tp:7.1f}x")
133
+ avg_speedup = sum(ts/tp for _, ts, tp in results) / len(results)
134
+ print(f"\n Average speedup: {avg_speedup:.1f}x")
135
+
136
+
137
+ if __name__ == '__main__':
138
+ main()
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
- requires = ["maturin>=0.15,<0.16"]
2
+ requires = ["maturin>=1.0"]
3
3
  build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "seraplot"
7
- version = "2.3.62"
7
+ version = "2.3.69"
8
8
  description = "Rust data visualization framework - The modern Plotly alternative"
9
9
  readme = "README.md"
10
10
  readme-content-type = "text/markdown"
@@ -0,0 +1,29 @@
1
+ from .seraplot import *
2
+ from .seraplot import __version__, Chart
3
+ import numpy as _np
4
+ import pandas as _pd
5
+
6
+ class LabelEncoder:
7
+ def __init__(self):
8
+ self.classes_ = None
9
+
10
+ def fit(self, y):
11
+ _, uniques = _pd.factorize(y, sort=True)
12
+ self.classes_ = _np.asarray(uniques)
13
+ return self
14
+
15
+ def transform(self, y):
16
+ y = _np.asarray(y)
17
+ idx = _np.searchsorted(self.classes_, y)
18
+ return idx.astype(_np.int32)
19
+
20
+ def fit_transform(self, y):
21
+ codes, uniques = _pd.factorize(y, sort=True)
22
+ self.classes_ = _np.asarray(uniques)
23
+ return codes.astype(_np.int32)
24
+
25
+ def inverse_transform(self, y):
26
+ return self.classes_[_np.asarray(y)]
27
+
28
+ def __repr__(self):
29
+ return "LabelEncoder()"