Skip to content

Comments

Nested case when#227

Merged
EmilHvitfeldt merged 18 commits intomainfrom
nested-case_when
Feb 20, 2026
Merged

Nested case when#227
EmilHvitfeldt merged 18 commits intomainfrom
nested-case_when

Conversation

@EmilHvitfeldt
Copy link
Member

In reference to tidymodels/orbital#109

This PR switches all tree-based models to generate nested case_when() expressions instead of flat ones. Nested expressions mirror the tree structure, producing more efficient R and SQL code.

Before (flat):

case_when(
  x <= 5 & y <= 3 ~ "low",
  x <= 5 & y > 3  ~ "med",
  x > 5           ~ "high"
)

After (nested):

case_when(
  x <= 5 ~ case_when(
    y <= 3 ~ "low",
    .default = "med"
  ),
  .default = "high"
)

Changes

New features

  • All tree models (rpart, partykit, ranger, randomForest, xgboost, lightgbm, catboost) now generate nested case_when() expressions
  • New vignette (vignettes/tree-internals.Rmd) explaining the nested approach and tree algorithms
  • parse_model() documentation now explains the version system (v1/v2/v3) and model type classes

Internal improvements

  • Reorganized model files with clear section headers separating nested builders from legacy code
  • Extracted shared helpers to reduce duplication:
    • apply_xgb_objective() and apply_lgb_objective() for objective transformations
    • apply_lgb_multiclass_transformation() and apply_catboost_multiclass_transformation() for multiclass handling
  • Documented operator naming conventions in tree-nested.R
  • Legacy flat case_when() builders preserved for backwards compatibility with parsed models saved using v1/v2 format

@EmilHvitfeldt EmilHvitfeldt merged commit 2161629 into main Feb 20, 2026
7 checks passed
@EmilHvitfeldt EmilHvitfeldt deleted the nested-case_when branch February 20, 2026 22:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant