Limitations and caveats¶
The fixed-depth full-binary structure makes JAX-friendly vectorization easy but caps practical depth around \(D \le 10\) to \(12\) because of the \(2^D - 1\) split-parameter blowup. For larger problems, a grown-tree variant in the style of Hehn et al. [2020] could be added as a separate fitter that reuses the same tree representation. The scaling notebook measures size, fit, and prediction cost against depth.
Splits are oblique linear by default. Non-linear splits (small CNNs or feature-attention gates) fit the same training framework but are not yet exposed as a public API.
Inverse design is local; multi-start ascent is the practical fallback for multimodality. The failure-modes notebook shows this along with seed sensitivity and the behavior of the uncertainty under extrapolation.
The exported leaf polytopes are closed, as is standard in big-M MILP
formulations, so a MILP optimum can sit on a split boundary and use either
neighbouring leaf’s model there. export.repair_solution moves such a point
into the chosen leaf (see Repairing MILP solutions).
Continuity without tied splits costs accuracy on oblique trees in more than
one dimension, because T-junctions over-constrain the leaves and the kinks are
pinned to the learned splits. Use tied_splits=True with continuous=True
instead. Tied splits give up some flexibility, since a depth-\(D\) tree then has
\(D\) hyperplanes rather than \(2^D - 1\).
A pruned spec matches predict(hard=True) only inside the export box.
Pruning unreached leaves (prune_unreached=True) also reassigns their regions
to neighbouring leaves.