# funcml 0.9.0

- Prepared for CRAN resubmission: removed the unused `methods` package
  from `Imports`, added explicit `importFrom` declarations for
  `predict()`, `model.frame()`, `model.response()`, `setNames()`,
  `median()` (stats) and `tail()` (utils) via a new package-level
  `R/funcml-package.R`, and excluded `LICENSE.md` from the build (the
  package uses the standard `GPL-3` license text that R bundles
  automatically; the file remains in the GitHub repo only). `R CMD
  check --as-cran` now passes with 0 errors, 0 warnings, 0 notes.

# funcml 0.8.9

- Renamed `compare_learners()` to `compare()` for consistency with the
  other short, verb-named entry points (`fit()`, `evaluate()`, `tune()`,
  `interpret()`, `estimate()`). This is a breaking change with no
  backward-compatible alias: code calling `compare_learners()` must be
  updated to call `compare()`. Note that `compare()` masks
  `testthat::compare()` when both packages are attached.

# funcml 0.8.8

- Prepared for CRAN resubmission (previous CRAN version: 0.7.1):
  removed the redundant `Author`/`Maintainer` DESCRIPTION fields (they
  had drifted out of sync with `Authors@R`, triggering a `R CMD check`
  NOTE) in favor of deriving them from `Authors@R`, and fixed a
  non-canonical CRAN task view URL in the README. `R CMD check
  --as-cran` now passes with 0 errors, 0 warnings, 0 notes.

# funcml 0.8.7

- Removed the stale hand-written `inst/CITATION`, which hardcoded "R
  package version 0.7.1" and had drifted six releases behind. R now
  falls back to the default citation auto-generated from `DESCRIPTION`,
  which always reflects the installed version.
- README's Citation section now shows the live `citation("funcml")`
  output instead of hardcoded text.

# funcml 0.8.6

- Reverted the SHAP/local-surrogate bar plot colors to green = positive,
  red = negative (the original convention), after the two intermediate
  swaps in 0.8.1 and 0.8.5.

# funcml 0.8.5

- Added numeric value labels to every bar-chart-style plot for easier
  reading: SHAP waterfall (`+0.148`/`-0.089` style, signed), SHAP
  feature importance, SHAP interaction strength, and local surrogate
  (`interpret(method = "local_model")`) contributions. The local
  surrogate plot's colors were also swapped to match the SHAP
  convention (positive = red, negative = green).

# funcml 0.8.4

- Fixed a hang introduced in 0.8.2: `interpret(method = "shap", ncores
  = <n>)` with `xgboost`, `lightgbm`, `mlp`, `densemlp`, or `bart` on
  Unix could hang indefinitely, because `functionals::fmap()` forks the
  process (`parallel::mclapply()`) and those models' fitted state holds
  a C/C++ handle that is not valid in the forked child. `ncores` is now
  ignored (with a warning) for those models, falling back to
  sequential; other models parallelize as before.

# funcml 0.8.3

- SHAP waterfall (`kind = "waterfall"`) is now a zero-anchored per-feature
  contribution bar chart instead of a cumulative chained waterfall: every
  bar starts at 0 and extends to its own SHAP value, so no bar crosses
  from one side of the reference line to the other. The vertical
  reference line is fixed at 0 instead of the baseline prediction.
- SHAP beeswarm/summary (`kind = "summary"`/`"beeswarm"`) now uses the
  standard SHAP blue (low) to red (high) colorbar on the right, instead
  of the previous bottom yellow-to-purple legend, and drops the
  per-feature numeric labels for plain feature names. It also gained a
  `v` argument to restrict the plot to a single feature.

# funcml 0.8.2

- `interpret(method = "shap")` gained an `ncores` argument that
  parallelizes the per-observation Monte Carlo SHAP computation via
  `functionals::fmap()` (the same backend already used by
  `evaluate()`/`tune()`/`compare_learners()`). Each observation is now
  seeded independently (`seed + observation_index - 1`) so results are
  identical whether run sequentially or in parallel; this changes the
  exact values produced by a seeded `interpret(method = "shap")` call
  compared to earlier releases, though the estimator itself (Monte
  Carlo permutation SHAP) is unchanged.

# funcml 0.8.1

- Printed result tables (`evaluate()`, `compare_learners()`, `tune()`,
  `interpret(method = "calibration")`, `interpret(method = "dca")`,
  `roc_curve()`, `auc_ci()`) now round numeric columns to 4 digits by
  default (`digits` argument on the relevant `print()`/`summary()`
  methods and on `auc_ci()`), instead of printing full floating-point
  precision.
- Swapped the SHAP waterfall/force colors: positive contributions are
  now red, negative are green.
- Reworked the SHAP beeswarm/summary plot (`kind = "beeswarm"` /
  `"summary"`) to show mean |SHAP value| next to each feature name, a
  yellow-to-purple `viridis` "plasma" feature-value gradient, and a
  bottom legend with Low/High endpoints. Also fixed a row-order
  misalignment bug in the per-feature value scaling introduced by the
  0.8.0 native SHAP plot rewrite.

# funcml 0.8.0

- Added `densemlp` as a new learner, wrapping the published `densemlp`
  CRAN package. It complements the existing built-in `mlp` learner with
  richer architecture options (residual connections, gated blocks, input
  projection, focal loss, label smoothing, LR schedules) for regression
  and classification.
- Added `roc_curve()` and `auc_ci()`, backed by the `pROC` package:
  `roc_curve()` returns the full sensitivity/specificity curve plus a
  `plot()` method, and `auc_ci()` reports AUC with a DeLong (default) or
  bootstrap confidence interval. funcml's own fast `auc()` is unchanged
  and remains what resampling/tuning use internally.
- Added decision curve analysis (Vickers and Elkin, 2006): `dca()` computes
  net benefit across risk thresholds for the model, "treat all", and
  "treat none" strategies, and `interpret(method = "dca")` runs it directly
  on a fitted binary classifier with a `plot()` method.
- Removed the `shapviz` dependency. All SHAP plot kinds (`waterfall`,
  `force`, `summary`/`beeswarm`, `importance`/`bar`, `dependence`,
  `dependence2d`, `interaction`) are now native `ggplot2` implementations
  reading directly from funcml's own SHAP result table. The underlying
  SHAP values were already funcml's own Monte Carlo permutation estimate
  (`interpret(method = "shap")`); shapviz was only ever used for plotting.
- Reworked `theme_funcml()` to match the CLAVUS Nature Medicine figure
  style: `theme_classic()` base, Okabe-Ito colorblind-safe palette, bold
  unboxed strip labels, and `grey92` major gridlines. All package plots
  (`interpret()`, `evaluate()`, `compare_learners()`, `tune()`,
  `estimate()`) now share this theme instead of each building its own
  ad-hoc `theme_bw()`/`theme_minimal()` variant.
- Migrated internal row-accumulation (resampling folds, tuning grids,
  learner comparisons, PDP/ICE/ALE curves, permutation importance,
  interaction grids, MLP training history) from `do.call(rbind, ...)` to
  `data.table::rbindlist()` for faster combination of many small result
  frames. All public return objects remain plain `data.frame`s; no API
  or behavior change.
- Added a citation for Naimi, Cole, and Kennedy (2016)
  <doi:10.1093/ije/dyw323> to `DESCRIPTION`, covering the plug-in
  g-computation method.
- `plot.funcml_pdp()` now fixes the y-axis to the [0, 1] probability scale
  for classification PDPs (`type = "prob"`), instead of auto-scaling to the
  local range of the curve, which could visually exaggerate small effects.
  Regression PDPs are unaffected.
- Moved every learner engine package (`MASS`, `mgcv`, `nnet`, `rpart`,
  `glmnet`, `ranger`, `e1071`, `randomForest`, `gbm`, `C50`, `kknn`,
  `earth`, `naivebayes`, `mda`, `ada`, `pls`, `partykit`, `dbarts`,
  `torch`, `xgboost`, `lightgbm`, `densemlp`) from `Suggests` to
  `Imports`, so a standard installation always has every advertised
  learner available and `learners()`/`fit()` cannot fail with a
  missing-package error for a registered model.

# funcml 0.7.2

- Added `mlp` as an internal torch-backed learner for regression, binary
  classification, and multiclass classification.
- Added CRAN installation instructions to the README and kept the GitHub
  installation path for development snapshots.
- Added a README note that the `funcml` companion paper is submitted to
  JMLR.

# funcml 0.7.1

- Refined the README into a more detailed progressive API walkthrough with
  additional tables, figures, and staged examples covering the full package
  surface.
- Hardened interpretability runtime paths by forcing `vip` to use
  permutation importance consistently while retaining `shapviz`-enhanced
  SHAP plotting when the optional plotting packages are installed.

# funcml 0.7.0

- Consolidated `funcml` as a machine learning framework for R with stable S3 interfaces for fitting, prediction, evaluation, tuning, learner comparison, interpretation, and plug-in g-computation.
- Added richer resampling support through plain holdout, grouped cross-validation, and time-aware rolling splits.
- Added uncertainty summaries to `evaluate()` and `compare_learners()`, including fold-level standard errors and confidence intervals in summaries and plots.
- Added random-search tuning with `search = "random"` and `n_evals`, plus nested resampling support in `tune()` for outer-fold performance estimates of the model-selection procedure.
- Hardened the fit/predict contract with clearer errors for missing predictor columns and unseen factor levels, stricter probability-output normalization, and broader learner contract coverage across the registry.
- Added multiclass and weighted AUC support and clarified default evaluation behavior for binary versus multiclass classification.
- Added `list_learners()` as a learner capability catalog and improved package metadata, citation, and repository scaffolding for release and paper preparation.
- Removed the `catboost` learner backend from the registry and package metadata.
- Kept `lightgbm` as a standard learner dependency available with `funcml`.

# funcml 0.2.0

- Added richer evaluation-centered resampling with plain holdout, grouped cross-validation, and time-aware rolling splits.
- Added uncertainty summaries to `evaluate()` and `compare_learners()`, including fold-level standard errors and confidence intervals in summaries and plots.
- Extended `estimate()` with configurable interval reporting, including bootstrap percentile intervals for average causal estimands.
- Added random-search tuning with `search = "random"` and `n_evals` for budgeted hyperparameter search.
- Added nested resampling to `tune()` via `outer_resampling`, so tuning can report unbiased outer-fold performance estimates for the selected workflow.
- Hardened the fit/predict contract with clearer errors for missing predictor columns and unseen factor levels, plus stricter probability-output normalization.
- Expanded the test suite with focused coverage for resampling, uncertainty, tuning, and prediction-contract behavior.

# funcml 0.1.1

- Vendored canonical interpretability implementations from `vip`, `pdp`, `iml`, and a minimal internal `shapviz` layer.
- Replaced runtime `vip` and `pdp` dependencies with internal implementations while preserving the existing `funcml` entrypoints.
- Added parity tests against sourced upstream reference code for permutation importance, PDP, ICE, ALE, Shapley values, and local surrogate explanations.
- Switched `local` / `local_model` to an `iml::LocalModel`-style sparse local surrogate using `glmnet` and Gower weighting.
