Skip to content

Release fireSense_spreadPredict 1.2.0 - #27

Merged
eliotmcintire merged 50 commits into
mainfrom
development
Oct 7, 2026
Merged

eliotmcintire merged 50 commits into
mainfrom
development

Conversation

@eliotmcintire

Copy link
Copy Markdown
Collaborator

This moves a month of work on development into main as release 1.2.0. Fire spread can now be forecast across several fire regions with their own fits, each replicate uses one whole set of fitted values, and the module is renamed fireSense_spreadPredict.

Affects: predicted spread probabilities change, especially across replicates and in multi-region study areas; projects must use the new module name.

Technical details
  • Version 1.1.4 -> 1.2.0 in fireSense_spreadPredict.R; NEWS.md gains a 1.2.0 heading with a summary.
  • Multi-ELF prediction blended across ELFblendWidth; .rep picks one whole parameter set per replicate (no rowMeans() across sets); yearSpreadSD output as fireSense_SpreadSD; youngAge mutual exclusivity as in the fit; upper-tail link and intercept/centre ledger rows; floor/ceiling from fireSenseUtils; stop on coefficients without covariates; rename from fireSense_SpreadPredict; .studyAreaName; tests and pkgdown site.
  • development..main is empty, so there is no main-only content to carry.
  • To be merged with a merge commit; tag v1.2.0 and the GitHub release follow.

🤖 Generated with Claude Code

eliotmcintire and others added 30 commits September 11, 2026 08:58
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0133867aFrmKtbhpNXasToP9
Thin caller for the shared pkgdown-module reusable workflow, which renders
fireSense_SpreadPredict.Rmd as a pkgdown article via SpaDES.core::moduleRmdToVignette().

Builds on pull requests to development and deploys to gh-pages on push.
Same caller already running on fireSense_SpreadFit (#21).

See PredictiveEcology/SpaDES-modules#40.
ci: publish a pkgdown site for fireSense_SpreadPredict
Removes plotSpreadProbByFuelType() (no caller), the if (FALSE) pre-June-2025
prediction branch, and commented-out code. The live else-branch is unwrapped
and dedented; no behaviour change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…scheduling

74 expectations (was 13). Predicted spreadProb values are hand-computed through
the logistic from toy covariates and a toy fitted model, including rescaling
with the fit's covMinMax. All pass on development and on this branch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Removed parameters coefToUse, mutuallyExclusiveCols and .saveInterval, and
input fireSense_SpreadFitted: nothing reads them. The save event called
spreadPredictSave(), which does not exist; it now only emits a message.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013B4sgRg9EwyHaAQdDzUaQW
fireSense_SpreadFit now fits fuel biomass on the linear scale, divided by 1e4, and
records that as covMinMax_spread = c(0, 1e4) for each fuel column. Fuel still
reaches this module logged (fireSenseUtils::logMinB()), so for those columns the
run event undoes the log with fireSenseUtils::fuelLogToLinear(), the function the
fit used, before rescaling. A fit made earlier, on the log scale, has the log
range in covMinMax_spread and is predicted exactly as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013B4sgRg9EwyHaAQdDzUaQW
Remove dead code, document functions, correct Rmd
…ates

Predict a linear-fuel fit with linear fuel biomass
logisticAll() picks logistic3pUpper when the stored parameters include
upperTail1 (fireSenseUtils 0.2.3.9038), so the floor rises to that and a
value test pins the prediction against a hand calculation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Each fitted ELF's model predicts its own pixels and those within
ELFblendWidth (20 km) of them; overlapping predictions are averaged with
weights falling linearly from 1 inside an ELF to 0 at ELFblendWidth outside
it. Each ELF uses its own parameters, covMinMax_spread and covariates from
its ledger row. The per-ELF computation moves to spreadProbOneELF(); one
ELF behaves as before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Predict fits made with the upper-tail link
Predict spread across several ELFs, blending across their boundaries
…eadSD

The fitted per-year random effect is removed from the parameters before
spread probability is computed (it broke both the one- and several-ELF
paths), and is output as fireSense_SpreadSD: one number with one ELF, a
raster blended like the probabilities with several; 0 without it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
yearSpreadSD: not a coefficient; passed to fireSense as fireSense_SpreadSD
.studyAreaName is the parameter PredictiveEcology modules use for the study
area's name. Defined here (default NA) for consistency; the module does not
use it yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
fireSense_SpreadPredict.R:282 called fireSenseUtils::spreadProbFromIntegerCovs() with
mutuallyExclusive = NULL ("already done in dataPrepPredict"), so a young pixel's fuel biomass and
non-forest land-cover columns reached the logistic unchanged instead of being zeroed alongside
youngAge = 1, as the fit requires and as fireSenseCovariatesCreate() is now fixed to actually do
upstream (PredictiveEcology/fireSenseUtils#92). Prediction now derives the same rule itself, via
the new fireSenseUtils::youngAgeExclusiveCols(), using the fuel columns it already identifies
from covMinMax_spread plus the nfLCC_*/treedWetland naming convention, so it does not depend on
covariates always arriving pre-zeroed from an upstream module.

Requires fireSenseUtils@development (>= 0.2.3.9047).

Version 1.0.0.9006.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
fireSenseUtils#92 landed as 0.2.3.9048 (development moved to 0.2.3.9047 via a concurrent PR
first), so the floor here follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Apply youngAge mutual exclusivity at prediction time, matching the fit
Module files, metadata, documentation, tests and CI workflows use the new
name, and references to renamed siblings follow; version 1.1.0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Version 1.1.1. The toy params in test-simInit.R now use the real logistic
parameter names.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
eliotmcintire and others added 19 commits September 29, 2026 11:25
The rename moved the .md the symlink targets, leaving README.md dangling, so the
testthat-module and pkgdown-module workflows failed copying the module folder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Rename module to fireSense_spreadPredict; stop on a fitted coefficient with no covariate
Add `data.table` to reqdPkgs, bump version, NEWS.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
… rep)

spreadProbOneELF() averaged one map per parameter set and yearSpreadSDOf() averaged
yearSpreadSD, breaking the pairing of each set's yearSpreadSD with its coefficients.
Replicate `rep` now uses row ((rep - 1) %% nSets) + 1 of each ELF, via paramSetForRep().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Each prediction replicate uses one whole parameter set (new parameter .rep)
A row with an intercept and stored covariate centres is predicted with both; a row without them predicts as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Predict with the intercept and centres of a ledger row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
lowerSpreadProb and maxFireSpread default to the fireSenseUtils constants
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CwcjqqK59FmTJscyi7xUqv
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@eliotmcintire eliotmcintire added bug Something isn't working enhancement New feature or request breaking change Existing code or results need changes to keep working labels Oct 7, 2026
@eliotmcintire
eliotmcintire merged commit 314bb91 into main Oct 7, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking change Existing code or results need changes to keep working bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant