Skip to main content

Welcome to TorchCrop

Open in Colab Open in Binder Open In Studio Lab PyPI Version Downloads Documentation Status License

Introduction

torchcrop is a fully differentiable reimplementation of the LINTUL-5 crop growth model (Wolf, 2012). Every step of the simulation — from sowing to harvest — produces valid torch.autograd gradients, so mechanistic crop processes can be combined seamlessly with learnable components (neural residuals, learned stress responses, parameter networks) and calibrated end-to-end with standard torch.optim optimizers.

Features

  • Differentiable Lintul5 — daily forward-Euler simulation of phenology, radiation interception, photosynthesis, partitioning, leaf/stem/root dynamics, water balance, and NPK demand, uptake, and soil availability, all as torch.nn.Modules. Supports potential (IOPT=1), water-limited (IOPT=2), and water-and-NPK-limited (IOPT=3/4) production modes, with optional automatic irrigation.
  • Batch-first — every state, parameter and driver carries a leading batch dimension [B, ...] so that many sites, years, or parameter sets can be simulated in parallel on GPU.
  • 23 bundled crop presetstorchcrop.available_crops() lists species (wheat, maize, rice, soybean, potato, sugar beet, …); load one via CropParameters(crop_name="wheat").
  • Gradient-based calibrationtorchcrop.calibration provides a constraint-aware (bounds, dtype, table-ordinate, ordering), transform-based CalibrationManager for fitting crop parameters to observations.
  • Hybrid modeling hooks — a HybridManager wiring layer accepts declarative ResidualSpecs (see default_slots()) to inject NeuralResidual corrections at named points in the pipeline, plus drop-in LearnedStressFactor and ParameterNet modules.
  • External irrigation/fertiliser — pass explicit irrigation: [B, T] and fertilizer: [B, T, 3] schedules to model(...), overriding the internal table-driven application on a per-day basis.
  • Smooth options — stage-based branching (DVS < 1, maturity, etc.) can be switched between hard torch.where and sigmoid blends for second-order smoothness.
  • Gradient-checked primitives — differentiable AFGEN-style interpolation and soft FST helpers (LIMIT, INSW, NOTNUL) pass torch.autograd.gradcheck.

Installation

pip install torchcrop

Quickstart

import torch
import torchcrop
from torchcrop.utils.io import make_constant_weather

weather = make_constant_weather(batch_size=2, n_days=150)
model = torchcrop.Lintul5Model()
output = model(weather, start_doy=60)

print(output.yield_)        # [B] final storage-organ biomass (g m-2)
print(output.lai.shape)     # [B, T+1] LAI trajectory
print(output.dvs.shape)     # [B, T+1] development stage trajectory

Gradient-based parameter calibration

torchcrop.calibration turns bounded crop/soil/site parameters into optimizable latents, keeping them inside their physical range by construction:

import torch
from torchcrop import CalibrationManager, Lintul5Model, ParameterSpec

model = Lintul5Model(crop_params=torchcrop.CropParameters().to(dtype=torch.float64)).double()
manager = CalibrationManager(
    model, specs=[ParameterSpec(name="crop.scale_factor_rue", bounds=(0.5, 1.5))]
)
optimizer = torch.optim.Adam(manager.parameters(), lr=1e-2)

for _ in range(50):
    optimizer.zero_grad()
    manager.materialize()  # write the current latents into model.crop_params
    out = model(weather.to(torch.float64), start_doy=60)
    loss = ((out.yield_ - observed_yield) ** 2).mean()
    loss.backward()
    optimizer.step()

See docs/examples/04_calibration/ for a full worked example.

Hybrid modeling

Inject a neural residual on top of a named point in the mechanistic pipeline via a declarative ResidualSpec:

from torchcrop.nn import ResidualSpec

model = torchcrop.Lintul5Model(
    residual_specs=[
        ResidualSpec(
            "photosynthesis.gtotal",
            "rate_factor",
            context=("lai", "dvs", "davtmp", "tranrf", "nstress"),
            scale=0.15,
        ),
    ],
)

torchcrop.nn.default_slots() returns the recommended catalogue of observable-tied slots (photosynthesis, water stress, partitioning, leaf senescence); pass a hand-picked subset rather than the whole list unless every pathway is observable. All parameters — mechanistic and neural — are surfaced by model.parameters() and can be optimized jointly.

Package layout

torchcrop/
├── model.py                   # Lintul5Model(nn.Module)
├── engine.py                  # SimulationEngine time-stepping loop
├── config.py                  # RunConfig
├── parameters/                # CropParameters / SoilParameters / SiteParameters
│                              # + 23 bundled crop presets (crop_data/*.yaml)
├── drivers/weather.py         # WeatherDriver [B, T, C]
├── states/model_state.py      # ModelState / DiagnosticState tensor containers
├── processes/                 # Biophysical processes (astro, phenology,
│                              # irradiation, evapotranspiration,
│                              # co2_transpiration, water_balance,
│                              # photosynthesis, partitioning, leaf_dynamics,
│                              # stem_dynamics, root_dynamics, nutrient_demand,
│                              # soil_nutrients, heat_stress, stress)
├── functions/                 # Differentiable primitives (AFGEN, FST, smoothing)
├── nn/                        # NeuralResidual, LearnedStressFactor, ParameterNet,
│                              # HybridManager / ResidualSpec wiring layer
├── calibration/                # CalibrationManager, ParameterSpec,
│                              # ConstraintGroup, transforms
└── utils/                     # I/O, visualisation, validation helpers

Examples

Worked notebooks under docs/examples/ (rendered into the docs site):

  • 01_potential/ — potential production (winter wheat)
  • 02_water_limited/ — water-limited production (winter wheat)
  • 03_water_and_nutrient_limited/ — water + N and water + NPK limited production
  • 04_calibration/ — gradient-based parameter calibration
  • 05_hybrid/ — hybrid ML residual corrections (reserved, notebook in progress)
  • 06_daily_timestep/ — low-level, day-by-day API usage
  • others/data_prep.ipynb — preparing the Brandenburg example dataset

Development

pytest                    # run the test suite
flake8 torchcrop tests    # lint
black torchcrop tests     # format
pre-commit run --all-files

References

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

torchcrop-1.1.0.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

torchcrop-1.1.0-py2.py3-none-any.whl (157.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file torchcrop-1.1.0.tar.gz.

File metadata

  • Download URL: torchcrop-1.1.0.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for torchcrop-1.1.0.tar.gz
Algorithm Hash digest
SHA256 2ae7bbf0ab2b9279e4fa3a38337432df384cc8beb2b7ea223ca3cdcdb44b3262
MD5 39c93c3b329c1cf4c4cc6656cdb66a50
BLAKE2b-256 8a97366af0b10b2e259b20c4d6aa9b610d3812c8de7f548bd224bc6c018a13ab

See more details on using hashes here.

File details

Details for the file torchcrop-1.1.0-py2.py3-none-any.whl.

File metadata

  • Download URL: torchcrop-1.1.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 157.8 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for torchcrop-1.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 d46b55d32a6dbcfa4519be099ac0e5a181faee50a7e3393d31f22d4145c74e11
MD5 345bfa47801b57e4f7f9dcc030ad7064
BLAKE2b-256 1c4f40f13736c9fa1e9607c7d1c1409fef50eddf641233cb69f296089dc3ec4f

See more details on using hashes here.

Release history Release notifications | RSS feed

1.1.1

2 files

This release

1.1.0 This release

2 files

1.0.0

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page