                        Changes in version 0.2.0                        

This release adds the model features developed for the FIA (US Forest
Inventory and Analysis) and BWI (German Bundeswaldinventur) calibration
projects. Every new argument defaults to the previous behaviour, so code
written for 0.1.0 runs unchanged.

New features

  - Bundled Oregon FIA data as package datasets. The calibration sample
    that the D-Fit_to_FIA and E-Mortality vignettes fit on now ships as
    lazy-loaded datasets in FINN's input format: fia_obs_dt, fia_env_dt,
    fia_init_trees (200 training sites), fia_obs_test, fia_env_test,
    fia_init_test (200 disjoint holdout sites) and fia_species_dt (the
    shared species coding). They are ready for fit() / makeInitCohorts()
    without any file reading; see ?fia_obs_dt. The fia_*.csv files
    previously under inst/extdata are gone (the xz-compressed datasets
    are ~120 KB versus ~2.2 MB of CSV); the example_*.csv raw inputs for
    the data-preparation vignette stay.

  - Per-predictor environmental scaling (env_autoscale). Previously
    every environmental predictor was standardised the same way.
    env_autoscale now takes a per-predictor specification — "auto"
    (z-score, the default), "identity" (leave as supplied), "0to1"
    (min-max), or a user-supplied function(x) returning list(center=,
    scale=) — given either as a single value applied to all predictors
    or as a named vector/list per predictor. Every mode is affine, so
    ALE interpretation stays invertible. The fitted constants remain
    accessible via compute_env_scaling() / apply_env_scaling(). Dispatch
    is fully backward compatible: the previous TRUE / FALSE / NULL forms
    behave exactly as before.

  - Saturating regeneration process (FINN::regeneration_saturation). A
    new, exported regeneration process function that adds a
    Beverton-Holt density cap recruits = K*m/(K+m) on top of the
    standard mechanistic recruitment, keeping regeneration bounded at
    high propagule pressure. It is a drop-in alternative to
    FINN::regeneration, used as the regeneration_process in finn(). The
    fitted carrying capacity is a normal process parameter, declared
    through createProcess(custom_parameters = list(reg_logK = ...)): a
    length-1 init gives one shared K, a length-N_species init a
    per-species K (K = exp(reg_logK), read back with
    exp(as.numeric(m$reg_logK))). This replaces the earlier (unreleased)
    finn(regeneration_saturation = ) model-level option, so the cap now
    composes like any other process rather than as a special case.

  - Recruitment observation weight (finn(recruit_obs_weight = )). Scales
    the regeneration term in the loss so recruitment observations can be
    up- or down-weighted relative to the other responses during
    calibration.

  - Period-scale growth scoring (finn(growth_period_scale = )). Scores
    growth over a multi-year remeasurement interval rather than a single
    step, for inventories whose growth is only observed between
    remeasurements.

  - Custom process parameters (createProcess(custom_parameters = )).
    Lets a user-supplied process function declare and calibrate its own
    named parameters, beyond FINN's built-in per-species and
    per-environment coefficients.

  - Regeneration observation operator. An internal hook mapping latent
    recruitment to what an inventory actually records — a building block
    for the inventory simulator.

Bug fixes

  - createProcess(NN = ...) is no longer silently dropped inside
    create_nn().

                 Changes in version 0.1.0 (2026-08-09)                  

First public release.

FINN is a differentiable forest gap model: a cohort-based dynamic
vegetation model whose demographic processes (competition, growth,
mortality, regeneration) can each be a mechanistic function, a neural
network, or a mixture of the two, all calibrated end-to-end by gradient
descent.

Highlights of the current interface:

  - finn() assembles a model from one process per demographic component,
    each built with createProcess() (mechanistic) or createHybrid()
    (neural network).
  - simulateForest() runs a model forward; fit() calibrates one to data
    and predict() scores it, returning patch- and site-level results.
  - Per-response likelihoods: Gaussian ("mse"/"gaussian"), Poisson,
    negative binomial, and a "binomial" likelihood for mortality that
    takes a closed-cohort count pair (n_at_risk, n_died).
  - weights = "auto" (the default in fit()) scales each loss by its
    intercept-only baseline, so the six responses are commensurable and
    every term reads as a fraction of its own null deviance.
  - Data helpers makeObsData(), resolveSiteIDs() and makeInitCohorts()
    turn a raw tree list into FINN's input tables.
  - Model interpretation with ALE(), summary(), feature_importance() and
    conditionalEffects().

See the vignettes for a guided tour: Introduction to FINN, Plausible
succession from a handful of species, Preparing your data for FINN,
Fitting FINN to forest inventory data, and Mortality.
