hessboost 0.2.0__tar.gz → 0.2.2__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 (477) hide show
  1. {hessboost-0.2.0 → hessboost-0.2.2}/Cargo.toml +1 -1
  2. hessboost-0.2.2/PKG-INFO +573 -0
  3. {hessboost-0.2.0 → hessboost-0.2.2}/README.md +19 -5
  4. {hessboost-0.2.0 → hessboost-0.2.2}/pyproject.toml +3 -0
  5. {hessboost-0.2.0 → hessboost-0.2.2}/python/Cargo.lock +2 -2
  6. {hessboost-0.2.0 → hessboost-0.2.2}/python/Cargo.toml +1 -1
  7. hessboost-0.2.2/python/README.md +533 -0
  8. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/__init__.py +11 -1
  9. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_booster.py +330 -1
  10. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_data.py +120 -17
  11. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_hessboost.pyi +73 -0
  12. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_matrix.py +25 -12
  13. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_model_io.py +1 -1
  14. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_sklearn_common.py +2 -2
  15. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_training.py +86 -5
  16. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/online.py +5 -2
  17. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/sklearn.py +2 -2
  18. hessboost-0.2.2/python/hessboost/target_stats.py +245 -0
  19. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/booster.rs +43 -1
  20. hessboost-0.2.2/python/src/compact.rs +96 -0
  21. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/data.rs +2 -2
  22. hessboost-0.2.2/python/src/gpu.rs +144 -0
  23. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/lib.rs +8 -0
  24. hessboost-0.2.2/python/src/target_stats.rs +105 -0
  25. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/train.rs +39 -3
  26. hessboost-0.2.2/python/tests/test_compact.py +83 -0
  27. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_data.py +7 -4
  28. hessboost-0.2.2/python/tests/test_gpu.py +77 -0
  29. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_model_io.py +17 -0
  30. hessboost-0.2.2/python/tests/test_polars.py +91 -0
  31. hessboost-0.2.2/python/tests/test_target_stats.py +168 -0
  32. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_training.py +29 -0
  33. {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/exact_sum.rs +78 -0
  34. {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/metal.rs +801 -154
  35. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/dmatrix.rs +88 -3
  36. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/target_stats.rs +95 -6
  37. {hessboost-0.2.0 → hessboost-0.2.2}/src/lib.rs +6 -3
  38. hessboost-0.2.2/src/model/embed.rs +128 -0
  39. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/mod.rs +5 -0
  40. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/cv/mod.rs +175 -30
  41. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/cache.rs +41 -3
  42. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/mod.rs +6 -3
  43. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/update.rs +5 -1
  44. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/compact.rs +173 -0
  45. hessboost-0.2.2/tests/data/saved/0.2.1/aft.bin +0 -0
  46. hessboost-0.2.2/tests/data/saved/0.2.1/aft.hbtd +0 -0
  47. hessboost-0.2.2/tests/data/saved/0.2.1/aft.json +694 -0
  48. hessboost-0.2.2/tests/data/saved/0.2.1/aft.margins +7 -0
  49. hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.bin +0 -0
  50. hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.hbtd +0 -0
  51. hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.json +864 -0
  52. hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.margins +5 -0
  53. hessboost-0.2.2/tests/data/saved/0.2.1/dart.bin +0 -0
  54. hessboost-0.2.2/tests/data/saved/0.2.1/dart.hbtd +0 -0
  55. hessboost-0.2.2/tests/data/saved/0.2.1/dart.json +850 -0
  56. hessboost-0.2.2/tests/data/saved/0.2.1/dart.margins +1 -0
  57. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm +0 -0
  58. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm.json +2874 -0
  59. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm.probe +1 -0
  60. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm +0 -0
  61. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm.json +2879 -0
  62. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm.probe +1 -0
  63. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm +0 -0
  64. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm.json +2526 -0
  65. hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm.probe +1 -0
  66. hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.bin +0 -0
  67. hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.hbtd +0 -0
  68. hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.json +1173 -0
  69. hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.margins +1 -0
  70. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.bin +0 -0
  71. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.hbtd +0 -0
  72. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.json +1589 -0
  73. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.margins +0 -0
  74. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.bin +0 -0
  75. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.json +975 -0
  76. hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.margins +0 -0
  77. hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.bin +0 -0
  78. hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.hbtd +0 -0
  79. hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.json +798 -0
  80. hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.margins +1 -0
  81. hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.bin +0 -0
  82. hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.hbtd +0 -0
  83. hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.json +1384 -0
  84. hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.margins +0 -0
  85. hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff +0 -0
  86. hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff.json +127628 -0
  87. hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff.probe +0 -0
  88. hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff +0 -0
  89. hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff.json +88629 -0
  90. hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff.probe +3 -0
  91. hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.bin +0 -0
  92. hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.json +42 -0
  93. hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.margins +0 -0
  94. hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.bin +0 -0
  95. hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.json +1066 -0
  96. hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.margins +0 -0
  97. hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.bin +0 -0
  98. hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.hbtd +0 -0
  99. hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.json +1615 -0
  100. hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.margins +0 -0
  101. hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.bin +0 -0
  102. hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.hbtd +0 -0
  103. hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.json +6028 -0
  104. hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.margins +0 -0
  105. hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.bin +0 -0
  106. hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.hbtd +0 -0
  107. hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.json +2358 -0
  108. hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.margins +0 -0
  109. hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.bin +0 -0
  110. hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.json +1036 -0
  111. hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.margins +0 -0
  112. hessboost-0.2.2/tests/data/saved/0.2.2/aft.bin +0 -0
  113. hessboost-0.2.2/tests/data/saved/0.2.2/aft.hbtd +0 -0
  114. hessboost-0.2.2/tests/data/saved/0.2.2/aft.json +694 -0
  115. hessboost-0.2.2/tests/data/saved/0.2.2/aft.margins +7 -0
  116. hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.bin +0 -0
  117. hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.hbtd +0 -0
  118. hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.json +864 -0
  119. hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.margins +5 -0
  120. hessboost-0.2.2/tests/data/saved/0.2.2/dart.bin +0 -0
  121. hessboost-0.2.2/tests/data/saved/0.2.2/dart.hbtd +0 -0
  122. hessboost-0.2.2/tests/data/saved/0.2.2/dart.json +850 -0
  123. hessboost-0.2.2/tests/data/saved/0.2.2/dart.margins +1 -0
  124. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm +0 -0
  125. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm.json +2874 -0
  126. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm.probe +1 -0
  127. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm +0 -0
  128. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm.json +2879 -0
  129. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm.probe +1 -0
  130. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm +0 -0
  131. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm.json +2526 -0
  132. hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm.probe +1 -0
  133. hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.bin +0 -0
  134. hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.hbtd +0 -0
  135. hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.json +1173 -0
  136. hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.margins +1 -0
  137. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.bin +0 -0
  138. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.hbtd +0 -0
  139. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.json +1589 -0
  140. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.margins +0 -0
  141. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.bin +0 -0
  142. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.json +975 -0
  143. hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.margins +0 -0
  144. hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.bin +0 -0
  145. hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.hbtd +0 -0
  146. hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.json +798 -0
  147. hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.margins +1 -0
  148. hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.bin +0 -0
  149. hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.hbtd +0 -0
  150. hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.json +1384 -0
  151. hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.margins +0 -0
  152. hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff +0 -0
  153. hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff.json +127628 -0
  154. hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff.probe +0 -0
  155. hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff +0 -0
  156. hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff.json +88629 -0
  157. hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff.probe +3 -0
  158. hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.bin +0 -0
  159. hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.json +42 -0
  160. hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.margins +0 -0
  161. hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.bin +0 -0
  162. hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.json +1066 -0
  163. hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.margins +0 -0
  164. hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.bin +0 -0
  165. hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.hbtd +0 -0
  166. hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.json +1615 -0
  167. hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.margins +0 -0
  168. hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.bin +0 -0
  169. hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.hbtd +0 -0
  170. hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.json +6028 -0
  171. hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.margins +0 -0
  172. hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.bin +0 -0
  173. hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.hbtd +0 -0
  174. hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.json +2358 -0
  175. hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.margins +0 -0
  176. hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.bin +0 -0
  177. hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.json +1036 -0
  178. hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.margins +0 -0
  179. {hessboost-0.2.0 → hessboost-0.2.2}/tests/metal.rs +65 -0
  180. {hessboost-0.2.0 → hessboost-0.2.2}/tests/online.rs +98 -0
  181. hessboost-0.2.0/PKG-INFO +0 -383
  182. hessboost-0.2.0/python/README.md +0 -345
  183. {hessboost-0.2.0 → hessboost-0.2.2}/LICENSE +0 -0
  184. {hessboost-0.2.0 → hessboost-0.2.2}/benches/training.rs +0 -0
  185. {hessboost-0.2.0 → hessboost-0.2.2}/examples/balanced_bagging.rs +0 -0
  186. {hessboost-0.2.0 → hessboost-0.2.2}/examples/bench_compare.rs +0 -0
  187. {hessboost-0.2.0 → hessboost-0.2.2}/examples/binary_classification.rs +0 -0
  188. {hessboost-0.2.0 → hessboost-0.2.2}/examples/boulevard_inference.rs +0 -0
  189. {hessboost-0.2.0 → hessboost-0.2.2}/examples/budget.rs +0 -0
  190. {hessboost-0.2.0 → hessboost-0.2.2}/examples/common/mod.rs +0 -0
  191. {hessboost-0.2.0 → hessboost-0.2.2}/examples/compact_model.rs +0 -0
  192. {hessboost-0.2.0 → hessboost-0.2.2}/examples/conformal.rs +0 -0
  193. {hessboost-0.2.0 → hessboost-0.2.2}/examples/constraints.rs +0 -0
  194. {hessboost-0.2.0 → hessboost-0.2.2}/examples/custom_objective.rs +0 -0
  195. {hessboost-0.2.0 → hessboost-0.2.2}/examples/distributional.rs +0 -0
  196. {hessboost-0.2.0 → hessboost-0.2.2}/examples/ebm.rs +0 -0
  197. {hessboost-0.2.0 → hessboost-0.2.2}/examples/forest_flow.rs +0 -0
  198. {hessboost-0.2.0 → hessboost-0.2.2}/examples/metal.rs +0 -0
  199. {hessboost-0.2.0 → hessboost-0.2.2}/examples/model_io.rs +0 -0
  200. {hessboost-0.2.0 → hessboost-0.2.2}/examples/multiclass.rs +0 -0
  201. {hessboost-0.2.0 → hessboost-0.2.2}/examples/online_update.rs +0 -0
  202. {hessboost-0.2.0 → hessboost-0.2.2}/examples/ordered_target_stats.rs +0 -0
  203. {hessboost-0.2.0 → hessboost-0.2.2}/examples/pfn_boost.rs +0 -0
  204. {hessboost-0.2.0 → hessboost-0.2.2}/examples/rank_xendcg.rs +0 -0
  205. {hessboost-0.2.0 → hessboost-0.2.2}/examples/ranking.rs +0 -0
  206. {hessboost-0.2.0 → hessboost-0.2.2}/examples/shap.rs +0 -0
  207. {hessboost-0.2.0 → hessboost-0.2.2}/examples/train_regression.rs +0 -0
  208. {hessboost-0.2.0 → hessboost-0.2.2}/examples/tree_diffusion.rs +0 -0
  209. {hessboost-0.2.0 → hessboost-0.2.2}/examples/virtual_ensembles.rs +0 -0
  210. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_core.py +0 -0
  211. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_exceptions.py +0 -0
  212. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_sklearn_base.pyi +0 -0
  213. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/conformal.py +0 -0
  214. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/diffusion/__init__.py +0 -0
  215. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/diffusion/forest.py +0 -0
  216. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/ebm.py +0 -0
  217. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/folds.py +0 -0
  218. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/inference.py +0 -0
  219. {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/py.typed +0 -0
  220. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/codec.rs +0 -0
  221. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/conformal.rs +0 -0
  222. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/diffusion.rs +0 -0
  223. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/dist.rs +0 -0
  224. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/ebm.rs +0 -0
  225. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/errors.rs +0 -0
  226. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/forest.rs +0 -0
  227. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/inference.rs +0 -0
  228. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/online.rs +0 -0
  229. {hessboost-0.2.0 → hessboost-0.2.2}/python/src/params.rs +0 -0
  230. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/conftest.py +0 -0
  231. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_conformal.py +0 -0
  232. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_diffusion.py +0 -0
  233. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_ebm.py +0 -0
  234. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_forest.py +0 -0
  235. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_inference.py +0 -0
  236. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_online.py +0 -0
  237. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_params.py +0 -0
  238. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_sklearn.py +0 -0
  239. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_stubs.py +0 -0
  240. {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_threads.py +0 -0
  241. {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/mod.rs +0 -0
  242. {hessboost-0.2.0 → hessboost-0.2.2}/src/check.rs +0 -0
  243. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/groups.rs +0 -0
  244. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/mod.rs +0 -0
  245. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/params.rs +0 -0
  246. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/emit.rs +0 -0
  247. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/mod.rs +0 -0
  248. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/parse.rs +0 -0
  249. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/schema.rs +0 -0
  250. {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/tests.rs +0 -0
  251. {hessboost-0.2.0 → hessboost-0.2.2}/src/conformal.rs +0 -0
  252. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/ghist.rs +0 -0
  253. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/loaders.rs +0 -0
  254. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/meta.rs +0 -0
  255. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/mod.rs +0 -0
  256. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/quantile.rs +0 -0
  257. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/sketch.rs +0 -0
  258. {hessboost-0.2.0 → hessboost-0.2.2}/src/data/sort.rs +0 -0
  259. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/fit.rs +0 -0
  260. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/encoding.rs +0 -0
  261. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/fit.rs +0 -0
  262. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/format.rs +0 -0
  263. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/mod.rs +0 -0
  264. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/format.rs +0 -0
  265. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/io.rs +0 -0
  266. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/mod.rs +0 -0
  267. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/process.rs +0 -0
  268. {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/sample.rs +0 -0
  269. {hessboost-0.2.0 → hessboost-0.2.2}/src/ebm/grid.rs +0 -0
  270. {hessboost-0.2.0 → hessboost-0.2.2}/src/ebm/mod.rs +0 -0
  271. {hessboost-0.2.0 → hessboost-0.2.2}/src/error.rs +0 -0
  272. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/ebm.rs +0 -0
  273. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/kernel.rs +0 -0
  274. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/linalg.rs +0 -0
  275. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/mod.rs +0 -0
  276. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/refit.rs +0 -0
  277. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/solver.rs +0 -0
  278. {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/term_kernel.rs +0 -0
  279. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/curve.rs +0 -0
  280. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/distributional.rs +0 -0
  281. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/elementwise.rs +0 -0
  282. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/factory.rs +0 -0
  283. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/mod.rs +0 -0
  284. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/quantile.rs +0 -0
  285. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/ranking.rs +0 -0
  286. {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/survival.rs +0 -0
  287. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/categories.rs +0 -0
  288. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/bitstream.rs +0 -0
  289. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/decode.rs +0 -0
  290. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/encode.rs +0 -0
  291. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/mod.rs +0 -0
  292. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/tests.rs +0 -0
  293. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/container.rs +0 -0
  294. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/io.rs +0 -0
  295. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/lightgbm.rs +0 -0
  296. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/native.rs +0 -0
  297. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/objective.rs +0 -0
  298. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/predict.rs +0 -0
  299. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/predictions.rs +0 -0
  300. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/sections.rs +0 -0
  301. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/serde.rs +0 -0
  302. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/shap.rs +0 -0
  303. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/shrinkage.rs +0 -0
  304. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/slice.rs +0 -0
  305. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/ubjson.rs +0 -0
  306. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/uncertainty.rs +0 -0
  307. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/validate.rs +0 -0
  308. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/document.rs +0 -0
  309. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/mod.rs +0 -0
  310. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/objective.rs +0 -0
  311. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/parse.rs +0 -0
  312. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/tests.rs +0 -0
  313. {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/tree.rs +0 -0
  314. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/absolute.rs +0 -0
  315. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/classification.rs +0 -0
  316. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/count.rs +0 -0
  317. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/custom.rs +0 -0
  318. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/count.rs +0 -0
  319. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/dist.rs +0 -0
  320. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/family.rs +0 -0
  321. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/loss.rs +0 -0
  322. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/mod.rs +0 -0
  323. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/special.rs +0 -0
  324. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/tests.rs +0 -0
  325. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/mod.rs +0 -0
  326. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/multi_target.rs +0 -0
  327. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/multiclass.rs +0 -0
  328. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/params.rs +0 -0
  329. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/quantile.rs +0 -0
  330. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/query.rs +0 -0
  331. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/ranking.rs +0 -0
  332. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/regression.rs +0 -0
  333. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/spec.rs +0 -0
  334. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/aft.rs +0 -0
  335. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/cox.rs +0 -0
  336. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/mod.rs +0 -0
  337. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/tests.rs +0 -0
  338. {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/xendcg.rs +0 -0
  339. {hessboost-0.2.0 → hessboost-0.2.2}/src/rng.rs +0 -0
  340. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/aarch64/tests.rs +0 -0
  341. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/aarch64.rs +0 -0
  342. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/mod.rs +0 -0
  343. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/scalar.rs +0 -0
  344. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/tests.rs +0 -0
  345. {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/x86_64.rs +0 -0
  346. {hessboost-0.2.0 → hessboost-0.2.2}/src/test_support.rs +0 -0
  347. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/api.rs +0 -0
  348. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/boulevard.rs +0 -0
  349. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/budget.rs +0 -0
  350. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/continuation.rs +0 -0
  351. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/cv/fold.rs +0 -0
  352. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/dart.rs +0 -0
  353. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/boulevard.rs +0 -0
  354. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/classic.rs +0 -0
  355. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/fast.rs +0 -0
  356. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/mod.rs +0 -0
  357. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/eval.rs +0 -0
  358. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/gblinear.rs +0 -0
  359. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/margins.rs +0 -0
  360. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/mod.rs +0 -0
  361. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/multi_output.rs +0 -0
  362. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/prepare.rs +0 -0
  363. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/refresh.rs +0 -0
  364. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/round.rs +0 -0
  365. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/row_sampling.rs +0 -0
  366. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/sampling.rs +0 -0
  367. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/sglb.rs +0 -0
  368. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/train/tests.rs +0 -0
  369. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/train.rs +0 -0
  370. {hessboost-0.2.0 → hessboost-0.2.2}/src/training/validate.rs +0 -0
  371. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/budget.rs +0 -0
  372. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/categorical.rs +0 -0
  373. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/exact.rs +0 -0
  374. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/hist/mod.rs +0 -0
  375. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/hist/search.rs +0 -0
  376. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/lightgbm.rs +0 -0
  377. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/mod.rs +0 -0
  378. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/multi.rs +0 -0
  379. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/oblivious.rs +0 -0
  380. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/online.rs +0 -0
  381. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/partition.rs +0 -0
  382. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/shared.rs +0 -0
  383. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/split.rs +0 -0
  384. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/constraints.rs +0 -0
  385. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/gain.rs +0 -0
  386. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/mod.rs +0 -0
  387. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/quantized.rs +0 -0
  388. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/walk.rs +0 -0
  389. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/linear.rs +0 -0
  390. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/linear_fit.rs +0 -0
  391. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/mod.rs +0 -0
  392. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/oblivious.rs +0 -0
  393. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/regtree.rs +0 -0
  394. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/reuse.rs +0 -0
  395. {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/sampler.rs +0 -0
  396. {hessboost-0.2.0 → hessboost-0.2.2}/tests/boulevard.rs +0 -0
  397. {hessboost-0.2.0 → hessboost-0.2.2}/tests/budget.rs +0 -0
  398. {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/bits.rs +0 -0
  399. {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/fixtures.rs +0 -0
  400. {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/mod.rs +0 -0
  401. {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/smooth.rs +0 -0
  402. {hessboost-0.2.0 → hessboost-0.2.2}/tests/continuation.rs +0 -0
  403. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-binary.expected.json +0 -0
  404. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-binary.txt +0 -0
  405. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-linear.expected.json +0 -0
  406. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-linear.txt +0 -0
  407. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.bin +0 -0
  408. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.hbtd +0 -0
  409. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.json +0 -0
  410. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.margins +0 -0
  411. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.bin +0 -0
  412. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.hbtd +0 -0
  413. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.json +0 -0
  414. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.margins +0 -0
  415. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.bin +0 -0
  416. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.hbtd +0 -0
  417. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.json +0 -0
  418. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.margins +0 -0
  419. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.bin +0 -0
  420. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.hbtd +0 -0
  421. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.json +0 -0
  422. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.margins +0 -0
  423. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.bin +0 -0
  424. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.hbtd +0 -0
  425. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.json +0 -0
  426. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.margins +0 -0
  427. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.bin +0 -0
  428. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.json +0 -0
  429. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.margins +0 -0
  430. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.bin +0 -0
  431. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.hbtd +0 -0
  432. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.json +0 -0
  433. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.margins +0 -0
  434. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.bin +0 -0
  435. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.hbtd +0 -0
  436. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.json +0 -0
  437. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.margins +0 -0
  438. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.bin +0 -0
  439. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.json +0 -0
  440. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.margins +0 -0
  441. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.bin +0 -0
  442. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.json +0 -0
  443. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.margins +0 -0
  444. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.bin +0 -0
  445. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.hbtd +0 -0
  446. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.json +0 -0
  447. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.margins +0 -0
  448. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.bin +0 -0
  449. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.hbtd +0 -0
  450. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.json +0 -0
  451. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.margins +0 -0
  452. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.bin +0 -0
  453. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.hbtd +0 -0
  454. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.json +0 -0
  455. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.margins +0 -0
  456. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.bin +0 -0
  457. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.json +0 -0
  458. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.margins +0 -0
  459. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/xgboost-3.4.2-categorical.json +0 -0
  460. {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/xgboost-3.4.2-categorical.ubj +0 -0
  461. {hessboost-0.2.0 → hessboost-0.2.2}/tests/diffusion.rs +0 -0
  462. {hessboost-0.2.0 → hessboost-0.2.2}/tests/distributional.rs +0 -0
  463. {hessboost-0.2.0 → hessboost-0.2.2}/tests/ebm.rs +0 -0
  464. {hessboost-0.2.0 → hessboost-0.2.2}/tests/forest.rs +0 -0
  465. {hessboost-0.2.0 → hessboost-0.2.2}/tests/lightgbm_parity.rs +0 -0
  466. {hessboost-0.2.0 → hessboost-0.2.2}/tests/model_format.rs +0 -0
  467. {hessboost-0.2.0 → hessboost-0.2.2}/tests/multi_output.rs +0 -0
  468. {hessboost-0.2.0 → hessboost-0.2.2}/tests/native_format.rs +0 -0
  469. {hessboost-0.2.0 → hessboost-0.2.2}/tests/parity.rs +0 -0
  470. {hessboost-0.2.0 → hessboost-0.2.2}/tests/properties.rs +0 -0
  471. {hessboost-0.2.0 → hessboost-0.2.2}/tests/quantized.rs +0 -0
  472. {hessboost-0.2.0 → hessboost-0.2.2}/tests/round_hook.rs +0 -0
  473. {hessboost-0.2.0 → hessboost-0.2.2}/tests/sampling.rs +0 -0
  474. {hessboost-0.2.0 → hessboost-0.2.2}/tests/sglb.rs +0 -0
  475. {hessboost-0.2.0 → hessboost-0.2.2}/tests/shap_accumulation.rs +0 -0
  476. {hessboost-0.2.0 → hessboost-0.2.2}/tests/target_stats.rs +0 -0
  477. {hessboost-0.2.0 → hessboost-0.2.2}/tests/tree_options.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "hessboost"
3
- version = "0.2.0"
3
+ version = "0.2.2"
4
4
  edition = "2024"
5
5
  rust-version = "1.93"
6
6
  license = "Apache-2.0"
@@ -0,0 +1,573 @@
1
+ Metadata-Version: 2.4
2
+ Name: hessboost
3
+ Version: 0.2.2
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Intended Audience :: Developers
6
+ Classifier: Intended Audience :: Science/Research
7
+ Classifier: Operating System :: MacOS
8
+ Classifier: Operating System :: Microsoft :: Windows
9
+ Classifier: Operating System :: POSIX :: Linux
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
17
+ Classifier: Programming Language :: Python :: Implementation :: CPython
18
+ Classifier: Programming Language :: Rust
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Classifier: Typing :: Typed
21
+ Requires-Dist: numpy>=2
22
+ Requires-Dist: pandas>=2.2 ; extra == 'pandas'
23
+ Requires-Dist: polars>=1.0 ; extra == 'polars'
24
+ Requires-Dist: scikit-learn>=1.6 ; extra == 'scikit-learn'
25
+ Provides-Extra: pandas
26
+ Provides-Extra: polars
27
+ Provides-Extra: scikit-learn
28
+ Summary: Fast, deterministic gradient boosting in Rust: conformal intervals, explainable boosting machines, distributional boosting, and tree-based diffusion
29
+ Keywords: xgboost,gradient-boosting,gbdt,machine-learning,decision-trees,rust
30
+ Author-email: Brenden Matthews <brenden@brndn.io>
31
+ License-Expression: Apache-2.0
32
+ Requires-Python: >=3.11
33
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
34
+ Project-URL: Changelog, https://github.com/brndnmtthws/hessboost/releases
35
+ Project-URL: Documentation, https://github.com/brndnmtthws/hessboost/tree/main/python#readme
36
+ Project-URL: Homepage, https://github.com/brndnmtthws/hessboost
37
+ Project-URL: Issues, https://github.com/brndnmtthws/hessboost/issues
38
+ Project-URL: Repository, https://github.com/brndnmtthws/hessboost
39
+
40
+ # hessboost for Python
41
+
42
+ **Fast, deterministic gradient boosting in Rust.** The core API (`DMatrix`,
43
+ `train`, `cv`, `Booster`, and scikit-learn estimators) takes the parameter
44
+ names XGBoost users know, and models move to and from XGBoost as JSON or
45
+ UBJSON.
46
+
47
+ - **Strict.** An unknown parameter, a value of the wrong type or range, or
48
+ a combination hessboost does not implement raises an error; nothing is
49
+ silently ignored.
50
+ - **Deterministic.** The same parameters, data, and seed give the same
51
+ model at any `nthread`.
52
+ - **Typed** (`py.typed`, complete type information), with the GIL released
53
+ while training and predicting, and free-threaded CPython supported.
54
+ - **Modern modeling (opt-in).** Conformal prediction intervals,
55
+ confidence intervals for the regression function (Boulevard boosting),
56
+ distributional boosting (a predictive distribution per row), LightGBM/CatBoost
57
+ tree options, class-balanced binary bagging, and XE-NDCG ranking
58
+ (`objective="rank:xendcg"`).
59
+
60
+ ## Installation
61
+
62
+ ```sh
63
+ uv add hessboost # or: pip install hessboost
64
+ ```
65
+
66
+ Extras: `hessboost[pandas]`, `hessboost[polars]`, and
67
+ `hessboost[scikit-learn]`. numpy is the only required dependency.
68
+
69
+ Prebuilt wheels are published for Linux x86_64 and aarch64 (glibc
70
+ manylinux and musl/Alpine musllinux), macOS arm64 (with Metal support:
71
+ `device="metal"` training histograms and `Booster.to_gpu()` GPU batch
72
+ prediction), and Windows x86_64: one `abi3` wheel per platform for
73
+ CPython 3.11 and newer, plus a wheel for free-threaded CPython 3.14t.
74
+ Elsewhere the installer builds from the source distribution, which needs
75
+ Rust 1.93 or newer and a C compiler (for libzstd).
76
+
77
+ ## Quick start
78
+
79
+ Train on a `DMatrix`, evaluating a holdout set every round and stopping
80
+ once it stops improving:
81
+
82
+ ```python
83
+ import numpy as np
84
+ import hessboost
85
+
86
+ rng = np.random.default_rng(0)
87
+ X = rng.normal(size=(1000, 5))
88
+ y = (X[:, 0] + X[:, 1] ** 2 > 1).astype(int)
89
+
90
+ dtrain = hessboost.DMatrix(X[:800], label=y[:800])
91
+ dvalid = hessboost.DMatrix(X[800:], label=y[800:])
92
+
93
+ booster = hessboost.train(
94
+ {"objective": "binary:logistic", "max_depth": 4, "eta": 0.1, "eval_metric": "auc"},
95
+ dtrain,
96
+ num_boost_round=500,
97
+ evals=[(dvalid, "valid")],
98
+ early_stopping_rounds=20,
99
+ verbose_eval=False,
100
+ )
101
+ ```
102
+
103
+ `predict` takes a `DMatrix` or anything its constructor accepts. The default
104
+ range is the iterations through `best_iteration` (pass `iteration_range=(0, 0)`
105
+ for every iteration), except `pred_leaf`, which defaults to all of the
106
+ model's trees, not just through `best_iteration`.
107
+ The flag arguments are exclusive:
108
+
109
+ ```python
110
+ probabilities = booster.predict(X[800:]) # through best_iteration
111
+ margins = booster.predict(X[800:], output_margin=True)
112
+ shap = booster.predict(X[800:], pred_contribs=True) # (rows, features + 1)
113
+ leaves = booster.predict(X[800:], pred_leaf=True) # (rows, trees) int32, all trees
114
+ print(booster.best_iteration, booster.get_score(importance_type="gain"))
115
+ ```
116
+
117
+ ### Input data
118
+
119
+ `DMatrix` takes numpy arrays of any numeric dtype and memory layout (a
120
+ C-contiguous `float32` array is used without a copy), pandas and polars
121
+ DataFrames, scipy sparse matrices, and anything `numpy.asarray` accepts.
122
+ NaN, and a frame's null, is missing (or pass `missing=`); ranking data
123
+ takes `group=` sizes or `qid=`, and `survival:aft` takes
124
+ `label_lower_bound=`/`label_upper_bound=`.
125
+ `Booster.predict` accepts the same inputs directly.
126
+
127
+ ### Training controls
128
+
129
+ `train` supports XGBoost's everyday arguments: `evals`, `evals_result`,
130
+ `early_stopping_rounds`, `verbose_eval` (printed live, every round or
131
+ every `n`-th), `xgb_model` (continued training, or tree refresh with
132
+ `process_type="update"`), a custom objective `obj`, a `custom_metric`,
133
+ and `callbacks`. Ctrl-C stops training at the end of the current round
134
+ and raises `KeyboardInterrupt`. `hessboost.cv` cross-validates over
135
+ shuffled folds, explicit folds, or a scikit-learn splitter; on ranking data
136
+ each fold must hold whole query groups (e.g. `GroupKFold` over the query
137
+ ids). `hessboost.train_with_budget(params, dtrain, budget)` trains with one
138
+ fitting budget in place of `eta`, tree limits, and a round count
139
+ (PerpetualBooster's algorithm).
140
+
141
+ Subclass `TrainingCallback` to stop on your own condition; `after_iteration`
142
+ sees the round and the evaluation history, and returning `True` stops
143
+ training with the rounds so far:
144
+
145
+ ```python
146
+ class StopAtTarget(hessboost.TrainingCallback):
147
+ def after_iteration(self, iteration, evals_log):
148
+ return evals_log["valid"]["auc"][-1] > 0.99 # True stops training
149
+
150
+
151
+ hessboost.train(
152
+ {"objective": "binary:logistic", "eval_metric": "auc", "max_depth": 4},
153
+ dtrain,
154
+ 1000,
155
+ evals=[(dvalid, "valid")],
156
+ callbacks=[StopAtTarget()],
157
+ )
158
+ ```
159
+
160
+ ### DataFrames and categorical features
161
+
162
+ pandas and polars column names become feature names, and categorical
163
+ columns (pandas `category`; polars `Enum` and `Categorical`) become native
164
+ categorical features. A category's code is its position in the column's
165
+ categories: a pandas column's or an `Enum`'s declared categories, or a
166
+ polars `Categorical`'s values, sorted (as pandas infers them). The booster
167
+ remembers each column's categories and re-codes a frame passed to `predict`
168
+ (and the other prediction and calibration methods) whose categories are
169
+ ordered differently or include unseen values (which count as missing),
170
+ whichever library the frame is from:
171
+
172
+ ```python
173
+ import pandas as pd
174
+
175
+ df = pd.DataFrame({"color": pd.Categorical(["red", "blue", "red"] * 100), "size": np.arange(300.0)})
176
+ booster = hessboost.train({}, hessboost.DMatrix(df, label=np.arange(300.0)), 20)
177
+ booster.predict(df)
178
+ ```
179
+
180
+ A `DMatrix` is coded once, when it is built, so it must have the features
181
+ of every model or matrix it meets: `predict` and the calibrators check it
182
+ against each model reading it, and `train` checks every `evals` matrix
183
+ against `dtrain` and against `xgb_model`, and `dtrain` against `xgb_model`
184
+ (continued training or refresh). Feature names (where both have them;
185
+ `predict(validate_features=False)` skips them), which features are
186
+ categorical, and each categorical feature's categories, in order, must
187
+ match; a mismatch raises `HessboostError` naming the eval set and the
188
+ feature. Build eval frames with the training frame's categories (for
189
+ example `valid["color"].cat.set_categories(train["color"].cat.categories)`
190
+ in pandas; in polars, an `Enum` of the training categories, since a
191
+ `Categorical` missing some of its values has other categories).
192
+ Codes without recorded categories (numpy data with
193
+ `feature_types=["c", ...]`) are taken to be the other side's codes; only
194
+ which features are categorical is compared, and a model continued on them
195
+ keeps the earlier model's categories. `ConformalizedQuantile.calibrate`
196
+ likewise needs its two models to share their features, and re-codes frames
197
+ to whichever model records categories. The scikit-learn estimators re-code
198
+ every `eval_set` frame to the training frame's categories and, with
199
+ `xgb_model`, the training frame to the earlier model's.
200
+
201
+ ## scikit-learn
202
+
203
+ The estimators take XGBoost's scikit-learn parameter names, plus
204
+ `callbacks`. Parameters left at `None` keep hessboost's defaults, and
205
+ `params={...}` passes any other training parameter; `fit(..., verbose=True)`
206
+ (or a period) prints rounds live:
207
+
208
+ ```python
209
+ from hessboost.sklearn import HessboostClassifier
210
+
211
+ model = HessboostClassifier(
212
+ n_estimators=300, max_depth=4, learning_rate=0.1, early_stopping_rounds=20
213
+ )
214
+ model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)])
215
+ model.predict_proba(X_test)
216
+ model.feature_importances_
217
+ ```
218
+
219
+ `HessboostRegressor` (multi-target with a 2-D `y`), `HessboostClassifier`
220
+ (any class labels), `HessboostRanker` (`group=` or `qid=`), and
221
+ `HessboostDistributionRegressor` (`dist:*` objectives; `predict` returns
222
+ means, `predict_distribution` the distributions) work with pipelines,
223
+ `clone`, grid search, and pickling, and pass scikit-learn's estimator checks
224
+ (except three documented deviations). `import hessboost` does not import
225
+ scikit-learn; `hessboost.sklearn` needs it.
226
+
227
+ ## Model files
228
+
229
+ | Method | Formats |
230
+ |---|---|
231
+ | `save_model(path, format=None)` | by extension: `.json` native JSON, `.ubj` XGBoost UBJSON, anything else native binary; or `format="binary" \| "json" \| "xgboost-json" \| "xgboost-ubjson"` |
232
+ | `Booster(path_or_bytes)`, `load_model(...)` | any of the four, or a LightGBM 4.x text model (`format="lightgbm"`, import only), detected from the content (`ModelFormatError` if it looks like none of them) |
233
+ | `save_raw(format="binary")` | the same formats as bytes |
234
+ | `pickle` / `copy` | native binary plus feature names, categories, and `best_score` |
235
+
236
+ The native binary format is compressed, checksummed, and lossless; files
237
+ load in subsequent releases. A LightGBM model
238
+ (`lightgbm.Booster.save_model`) predicts LightGBM's values for inputs with
239
+ missing values as `NaN` and categorical features as non-negative codes;
240
+ models with no exact equivalent raise `ModelFormatError`:
241
+
242
+ ```python
243
+ booster.save_model("model.ubj") # a file XGBoost loads; .json for native JSON
244
+ loaded = hessboost.Booster("model.ubj") # format detected from the content
245
+ early = booster[:10] # the first 10 boosting iterations, as a Booster
246
+ ```
247
+
248
+ ## Modern modeling
249
+
250
+ ### Conformal intervals
251
+
252
+ `SplitConformal` wraps one single-output model in `f(x) ± Q`, where `Q` is
253
+ the calibration set's quantile of `|y - f(x)|` — finite-sample `1 - alpha`
254
+ coverage for exchangeable rows:
255
+
256
+ ```python
257
+ from hessboost.conformal import SplitConformal
258
+
259
+ cal = SplitConformal.calibrate(booster, X_cal, y_cal, alpha=0.1)
260
+ lower, upper = cal.predict_interval(X_test).T
261
+ ```
262
+
263
+ `ConformalizedQuantile` instead adjusts a quantile band `[q_lo(x), q_hi(x)]`
264
+ by its calibration quantile, so it also tightens a band that over-covers.
265
+ The band comes from two single-quantile models (`calibrate`), two outputs
266
+ of one multi-quantile model (`calibrate_outputs`), or a `dist:*` model's
267
+ central quantiles (`calibrate_distribution`):
268
+
269
+ ```python
270
+ from hessboost.conformal import ConformalizedQuantile
271
+
272
+ band = hessboost.train(
273
+ {"objective": "reg:quantileerror", "quantile_alpha": [0.05, 0.95]},
274
+ hessboost.DMatrix(X_train, y_train),
275
+ 200,
276
+ )
277
+ cqr = ConformalizedQuantile.calibrate_outputs(band, X_cal, y_cal, alpha=0.1)
278
+ lower, upper = cqr.predict_interval(X_test).T # >= 90% coverage, finite-sample
279
+ ```
280
+
281
+ ### Distributional boosting
282
+
283
+ A `dist:*` objective fits a predictive distribution per row instead of a
284
+ point. `predict_distribution` returns a `Distributions` object whose
285
+ summaries are vectorized over rows:
286
+
287
+ ```python
288
+ dist = hessboost.train({"objective": "dist:normal"}, hessboost.DMatrix(X_train, y_train), 300)
289
+ d = dist.predict_distribution(X_test)
290
+ means, stds = d.mean(), d.std()
291
+ lower, upper = d.interval(0.9).T
292
+ ll, score = d.log_prob(y_test), d.crps(y_test)
293
+ ```
294
+
295
+ ### Virtual ensembles
296
+
297
+ A model trained with `posterior_sampling` (SGLB: `langevin` noise plus
298
+ `model_shrink_rate`) carries its own posterior ensemble: `count` members
299
+ rebuilt exactly from its model shrinkage, member-major (`(count, rows)` for
300
+ single-output models), with each member's iteration count alongside:
301
+
302
+ ```python
303
+ sglb = hessboost.train({"posterior_sampling": True}, hessboost.DMatrix(X_train, y_train), 1000)
304
+ members, iterations = sglb.predict_virtual_ensembles(X_test, 10)
305
+ u = sglb.predict_uncertainty(X_test, 10) # u.mean, u.knowledge, u.data, u.total
306
+ ```
307
+
308
+ `predict_uncertainty` decomposes the ensemble à la CatBoost: knowledge
309
+ (epistemic) uncertainty rises off the training data. Plain regression has
310
+ only `mean` and `knowledge` (`data`/`total` are `None`); `dist:*` and
311
+ classification models get the full decomposition.
312
+
313
+ ### Online updates
314
+
315
+ `OnlineModel` keeps a trained model with its training data and updates both
316
+ in place as rows arrive or must be forgotten. `Exact()` retrains, so every
317
+ update equals `hessboost.train` on the updated data bit for bit;
318
+ `Approximate(tolerance)` (default, `0.1`) keeps splits that still rank near
319
+ the top and is faster for small changes. A refused, stopped, or interrupted
320
+ (Ctrl-C) update changes nothing:
321
+
322
+ ```python
323
+ from hessboost.online import Approximate, OnlineModel
324
+
325
+ online = OnlineModel.train(
326
+ {"tree_method": "hist", "max_depth": 6},
327
+ hessboost.DMatrix(X_train, y_train),
328
+ 100,
329
+ Approximate(0.1),
330
+ )
331
+ report = online.update(hessboost.DMatrix(X_new, y_new), deletions=[3, 17])
332
+ online.model.predict(X_test) # online.data: the updated training rows
333
+ ```
334
+
335
+ The report counts kept nodes, regrown subtrees, and refreshed rows
336
+ (`UpdateReport`); `OnlineModel.from_model` resumes from a saved `Booster`
337
+ and its training data. Updates need `hist` depth-wise trees without sampling
338
+ or constraints and unweighted data.
339
+
340
+ ### Explainable boosting machines
341
+
342
+ `{"booster": "ebm"}` trains a cyclic GA2M with outer bags, FAST pairs, and
343
+ per-bag early stopping. Every term's piecewise-constant shape function is
344
+ readable from the model (`NumericAxis` edges or `CategoricalAxis` codes,
345
+ plus a missing cell per axis); intercept plus shapes is the margin:
346
+
347
+ ```python
348
+ from hessboost import ebm
349
+
350
+ model = hessboost.train({"booster": "ebm"}, hessboost.DMatrix(X_train, y_train), 50)
351
+ shapes = ebm.shape_functions(model)
352
+ shapes.intercept, shapes.terms[0].values
353
+ ```
354
+
355
+ A Boulevard EBM (`{"booster": "ebm", "ebm_boulevard": True}`) additionally
356
+ supports confidence bands on its shapes via
357
+ `hessboost.inference.EbmInference.term_bands`.
358
+
359
+ ### Boulevard inference
360
+
361
+ Boulevard boosting (`{"booster": "boulevard"}`) samples trees with dropout
362
+ so the ensemble converges to a kernel ridge posterior, whose leaf kernel
363
+ gives asymptotic confidence, prediction, and reproduction intervals for
364
+ `f(x)`. Refit the leaves on independent rows first (`honest_refit`), fit
365
+ the kernel over those rows, then query any rows:
366
+
367
+ ```python
368
+ from hessboost.inference import BoulevardInference, honest_refit
369
+
370
+ trained = hessboost.train(
371
+ {"booster": "boulevard", "eta": 0.8, "boulevard_dropout": 0.5, "subsample": 0.8},
372
+ hessboost.DMatrix(X_struct, y_struct),
373
+ 200,
374
+ )
375
+ model = honest_refit(trained, X_values, y_values) # leaves from independent rows
376
+ inference = BoulevardInference.fit(model, X_values, y_values, holdout=X_cal, holdout_label=y_cal)
377
+ lower, upper = inference.confidence_intervals(X_test, alpha=0.05).T # for f(x)
378
+ ```
379
+
380
+ The intervals are conditional on the tree structures: nominal for
381
+ low-dimensional smooth signals after an honest refit, under-covering
382
+ elsewhere (see the crate's `inference` docs). `Booster.boulevard` records
383
+ how the model was trained.
384
+
385
+ ### Diffusion models
386
+
387
+ `hessboost.diffusion` fits nonparametric `p(y | x)` for scalar or vector
388
+ labels (multimodal, skewed, heavy-tailed) by conditional diffusion or flow
389
+ matching with GBDT score models, after Treeffuser and DiffGBM. `sample`
390
+ returns `(rows, n_samples, outputs)` draws, deterministic per seed and step
391
+ count (`n_steps=` overrides the model's); `mean`, `quantiles`, and `crps`
392
+ summarize them:
393
+
394
+ ```python
395
+ from hessboost.diffusion import DiffusionModel, DiffusionParams, crps, quantiles
396
+
397
+ flow = DiffusionModel.fit(DiffusionParams.flow_matching(), X_train, y_train)
398
+ draws = flow.sample(X_test, 200, seed=0) # (rows, 200, outputs) float32
399
+ bands = quantiles(draws, [0.05, 0.5, 0.95]) # (rows, 3, outputs)
400
+ scores = crps(draws, y_test) # (rows, outputs)
401
+ ```
402
+
403
+ `DiffusionParams` is a frozen dataclass tree with presets `default()`,
404
+ `treeffuser()`, and `flow_matching()`; its `training` mappings are XGBoost
405
+ parameters, as `train` reads them. Models save with
406
+ `to_bytes(format="binary")` / `save(path, format="binary")` (`"binary"` or
407
+ `"json"`) and load with `from_bytes(data, format="auto")` /
408
+ `load(path, format="auto")`, or pickle (which also keeps feature names and
409
+ categories). `fit` releases the GIL but cannot be interrupted: Ctrl-C takes
410
+ effect once it returns.
411
+
412
+ ### Synthetic tabular data
413
+
414
+ `hessboost.diffusion.forest` fits ForestFlow / ForestDiffusion models of
415
+ whole rows (optionally per class of a label) with per-noise-level GBDTs.
416
+ `sample` draws synthetic rows as a `ForestSamples` (`values`, plus `labels`
417
+ for a class-conditional model); `sample_for_labels` draws one row per given
418
+ label:
419
+
420
+ ```python
421
+ from hessboost.diffusion.forest import ForestModel, ForestParams
422
+
423
+ forest = ForestModel.fit(ForestParams.forest_diffusion(), X_with_nans)
424
+ synthetic = forest.sample(1000, seed=0) # .values (1000, columns), .labels None
425
+ ```
426
+
427
+ The diffusion variant also imputes missing values, keeping the observed
428
+ entries (flow models refuse). Values are in the data's own coding:
429
+
430
+ ```python
431
+ filled = forest.impute(X_with_nans, n_imputations=5) # (5, rows, columns)
432
+ ```
433
+
434
+ `ForestParams` has presets `forest_flow()` (the defaults) and
435
+ `forest_diffusion()`; its `training` mappings are XGBoost parameters, and
436
+ models save and load like `DiffusionModel`s.
437
+
438
+ ### GPU prediction
439
+
440
+ On macOS, `Booster.to_gpu()` lays the model out for batch prediction on
441
+ Metal: the forest uploads once, and each call predicts bit-identically to
442
+ `Booster.predict` (values or raw margins), faster from roughly a few
443
+ thousand row-trees upward:
444
+
445
+ ```python
446
+ from hessboost import GpuModel
447
+
448
+ gpu = booster.to_gpu()
449
+ probabilities = gpu.predict(X_test)
450
+ ```
451
+
452
+ ### Compact models
453
+
454
+ `Booster.to_compact()` packs the trees default prediction uses into
455
+ hessboost's bit-packed `HBTD` format (*Boosted Trees on a Diet*), which
456
+ predicts bit-identical values and margins in a fraction of the size;
457
+ training with `toad_penalty_feature`/`toad_penalty_threshold` shrinks it
458
+ further. `Booster.size_report()` compares the two formats:
459
+
460
+ ```python
461
+ from hessboost import CompactModel
462
+
463
+ compact = booster.to_compact()
464
+ compact.save_model("model.hbtd")
465
+ predictions = CompactModel("model.hbtd").predict(X_test)
466
+ print(booster.size_report().compression_ratio)
467
+ ```
468
+
469
+ ### Validation folds
470
+
471
+ `hessboost.folds` builds `(train_rows, test_rows)` splits for `cv` or custom
472
+ loops: shuffled `k_fold` (what `cv` uses by default), `forward_chaining`
473
+ expanding windows with a purged `gap`, and `purged_forward` (timestamped
474
+ rows, purged by each row's own label window, for overlapping or irregular
475
+ horizons):
476
+
477
+ ```python
478
+ from hessboost import folds
479
+
480
+ splits = folds.forward_chaining(dtrain.num_row(), 4, gap=24)
481
+ result = hessboost.cv({"max_depth": 4}, dtrain, 100, folds=splits)
482
+ ```
483
+
484
+ ### Ordered target statistics
485
+
486
+ `hessboost.target_stats.OrderedTargetEncoder` replaces categorical columns
487
+ with CatBoost-style ordered target means: a training row's encoding never
488
+ sees its own label. `label=` supplies the target for a multi-target matrix
489
+ or a class's 0/1 indicator. In `cv`, `target_stats=` fits the encoder on
490
+ each fold's training rows only, so no held-out label reaches an encoding:
491
+
492
+ ```python
493
+ from hessboost.target_stats import OrderedTargetEncoder
494
+
495
+ encoder = OrderedTargetEncoder(seed=7)
496
+ dtrain_encoded, stats = encoder.fit_transform(dtrain, ["city"])
497
+ booster = hessboost.train({"max_depth": 4}, dtrain_encoded, 100)
498
+ predictions = booster.predict(stats.transform(X_test))
499
+ result = hessboost.cv({"max_depth": 4}, dtrain, 100, target_stats=["city"], target_encoder=encoder)
500
+ ```
501
+
502
+ ### Extra training options
503
+
504
+ Every hessboost training option (`path_smooth`, `extra_trees`,
505
+ `linear_tree`, `grow_policy="symmetric"`, `use_quantized_grad`,
506
+ `pos_bagging_fraction`, `neg_bagging_fraction`, `bagging_by_query`, the
507
+ `dist:*` objectives and their `dist_gradient`, `rank:xendcg`, ...) is a
508
+ `params` key. XE-NDCG's keyed per-round random stream differs from
509
+ LightGBM's `rank_xendcg` stream.
510
+
511
+ ## Differences from XGBoost's Python package
512
+
513
+ - Errors: `hessboost.HessboostError` (a `ValueError`) for refused inputs,
514
+ with subclasses `InvalidDataError` (data content: labels outside the
515
+ objective's domain, negative weights, bad groups or bounds; the message
516
+ names the input and any eval set), `IncompatibleModelError` (a model the
517
+ parameters or data do not match: continued training, refresh, slicing)
518
+ and `ModelFormatError` (model files); invalid or conflicting parameters
519
+ raise `HessboostError` itself. `TypeError` for wrong types.
520
+ Unsupported parameters are refused, including `verbosity`; `missing`
521
+ belongs to `DMatrix`.
522
+ - `TrainingCallback.after_iteration(iteration, evals_log) -> bool` sees the
523
+ round and the evaluation history, not the model (XGBoost's also gets the
524
+ booster and has `before_training`/`after_training` hooks); returning
525
+ `True` stops training with the rounds so far. `hessboost.cv` has no
526
+ callbacks and finishes its folds before Ctrl-C takes effect.
527
+ - `custom_metric(predictions, labels, weights)` returns a float and is named
528
+ by the function's `__name__` (XGBoost passes a `DMatrix` and returns
529
+ `(name, value)`). `obj(margins, dtrain)` matches XGBoost; the model then
530
+ predicts margins from a zero intercept (or `base_score`). `obj` replaces
531
+ `objective`, which `params` must then not set, and `num_class` is the
532
+ custom objective's output count (XGBoost's custom-softmax convention;
533
+ default: one per label column).
534
+ - `cv` returns a dict of numpy arrays (`test-<metric>-mean`/`-std`) with
535
+ held-out metrics only; there is no `stratified` or `as_pandas`.
536
+ - `predict` defaults to the iterations through `best_iteration` (XGBoost's
537
+ scikit-learn behavior); pass `iteration_range=(0, 0)` for all. SHAP and
538
+ leaf ranges start at iteration 0; `pred_leaf` defaults to every iteration
539
+ instead, and returns `int32`.
540
+ - On macOS, `Booster.to_gpu()` lays the model out for GPU batch prediction
541
+ on Metal (`GpuModel.predict`, bit-identical to `Booster.predict`; see
542
+ whether a device exists with `GpuModel.available()`).
543
+ - Model files do not store feature names or categories (pickles do).
544
+ - Not available: `DMatrix` from files or `QuantileDMatrix`, `inplace_predict`
545
+ (`predict` takes arrays directly), `Booster.get_dump`/`trees_to_dataframe`
546
+ /`dump_model`, attributes (`set_attr`), plotting, distributed (Dask/Spark)
547
+ and CUDA training, `approx_contribs`, and `strict_shape`. The macOS wheels
548
+ support `device="metal"` (GPU histograms while training).
549
+
550
+ ## Development
551
+
552
+ From `python/` in the [repository](https://github.com/brndnmtthws/hessboost),
553
+ with [uv](https://docs.astral.sh/uv/):
554
+
555
+ ```sh
556
+ uv sync --locked # build the extension and install dev tools
557
+ uv run --locked pytest
558
+ uv run --locked pyright --verifytypes hessboost --ignoreexternal
559
+ ```
560
+
561
+ Lint, format, and type-check all of the repository's Python from its root
562
+ (configuration: `ruff.toml`, `ty.toml`):
563
+
564
+ ```sh
565
+ uv run --project python --locked ruff check
566
+ uv run --project python --locked ruff format --check
567
+ uv run --project python --locked ty check
568
+ ```
569
+
570
+ ## License
571
+
572
+ Apache-2.0.
573
+
@@ -89,6 +89,17 @@ let result = Trainer::new(&params, &dtrain, 1000)
89
89
  let model = result.model; // predicts with the best iteration
90
90
  ```
91
91
 
92
+ To ship a self-contained (e.g. static) binary, compile the model file into it;
93
+ it decodes on first use:
94
+
95
+ ```rust
96
+ use hessboost::model::EmbeddedModel;
97
+
98
+ static MODEL: EmbeddedModel = EmbeddedModel::new(include_bytes!("model.bin"), ModelFormat::Binary);
99
+
100
+ let preds = MODEL.get()?.predict(&dtest, Iterations::Best)?;
101
+ ```
102
+
92
103
  Every type and option is in the [API docs](https://docs.rs/hessboost);
93
104
  runnable programs live in [`examples/`](examples)
94
105
  (`cargo run --release --example <name>`):
@@ -122,8 +133,10 @@ runnable programs live in [`examples/`](examples)
122
133
 
123
134
  [`python/`](python) holds the Python package (`pip install hessboost`):
124
135
  `DMatrix`, `train`, `cv`, and `Booster` (taking XGBoost's parameter names),
125
- scikit-learn estimators, pandas categorical input, and the conformal,
126
- distributional, tree-diffusion, ForestFlow, and in-place update extras:
136
+ scikit-learn estimators, pandas and polars categorical input, and the conformal,
137
+ distributional, tree-diffusion, ForestFlow, in-place update, ordered target
138
+ statistics, budget training, and compact model extras
139
+ (on macOS, `Booster.to_gpu()` batch-predicts on the Metal GPU):
127
140
 
128
141
  ```python
129
142
  import hessboost
@@ -143,9 +156,10 @@ See [`python/README.md`](python/README.md).
143
156
  - **Objectives & metrics:** Regression (squared, log, Huber, quantile, expectile),
144
157
  binary/multiclass classification, ranking (LambdaMART, XE-NDCG), count, and survival (Cox, AFT),
145
158
  plus typed objective and metric APIs and custom loss hooks.
146
- - **Validation & workflow:** Cross-validation (including purged and forward time-series folds),
147
- early stopping, feature importance, SHAP values and interactions, model slicing, and iteration ranges.
148
- - **Interchange:** Native binary and JSON formats, XGBoost JSON/UBJSON import/export, and LightGBM model import.
159
+ - **Validation & workflow:** Cross-validation (including purged and forward time-series folds,
160
+ whole-query ranking folds, and per-fold target statistics), early stopping, feature importance,
161
+ SHAP values and interactions, model slicing, and iteration ranges.
162
+ - **Interchange:** Native binary and JSON formats, XGBoost JSON/UBJSON import/export, LightGBM model import, and models embedded in the binary at compile time.
149
163
  - **Modern modeling (opt-in):**
150
164
  - [Conformal intervals](https://docs.rs/hessboost/latest/hessboost/conformal/): Finite-sample coverage guarantees.
151
165
  - [Boulevard inference](https://docs.rs/hessboost/latest/hessboost/inference/): Asymptotic confidence and prediction intervals for `f(x)`.
@@ -34,6 +34,7 @@ dependencies = ["numpy>=2"]
34
34
 
35
35
  [project.optional-dependencies]
36
36
  pandas = ["pandas>=2.2"]
37
+ polars = ["polars>=1.0"]
37
38
  scikit-learn = ["scikit-learn>=1.6"]
38
39
 
39
40
  [project.urls]
@@ -49,6 +50,8 @@ test = [
49
50
  # CI's `pyright --verifytypes` checks the installed wheel's public types.
50
51
  "pyright>=1.1.414",
51
52
  "pandas>=2.2",
53
+ # abi3-only wheels: test-wheel.sh leaves it out on free-threaded Python.
54
+ "polars>=1.0",
52
55
  "scikit-learn>=1.6",
53
56
  "scipy>=1.14",
54
57
  ]
@@ -88,7 +88,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
88
88
 
89
89
  [[package]]
90
90
  name = "hessboost"
91
- version = "0.2.0"
91
+ version = "0.2.2"
92
92
  dependencies = [
93
93
  "objc2",
94
94
  "objc2-foundation",
@@ -101,7 +101,7 @@ dependencies = [
101
101
 
102
102
  [[package]]
103
103
  name = "hessboost-python"
104
- version = "0.2.0"
104
+ version = "0.2.2"
105
105
  dependencies = [
106
106
  "hessboost",
107
107
  "numpy",
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "hessboost-python"
3
3
  # Must equal the root crate's version: the wheel version comes from here.
4
- version = "0.2.0"
4
+ version = "0.2.2"
5
5
  authors = ["Brenden Matthews <brenden@brndn.io>"]
6
6
  description = "Python bindings for hessboost"
7
7
  edition = "2024"