Skip to main content

cFUSE - Differentiable FUSE

CI Python Tests

A differentiable implementation of the FUSE hydrological model framework with Enzyme automatic differentiation.

Note cFUSE is in active development

Features

  • Differentiable physics: Full gradient computation via Enzyme AD
  • PyTorch integration: Custom autograd function for gradient-based calibration

Quick Start

1. Install Dependencies

# Python dependencies
pip install numpy pandas xarray pydantic torch netCDF4 tqdm matplotlib symfluence

# macOS: Install LLVM 19 for Enzyme
brew install llvm@19

2. Build Enzyme (one-time setup)

git clone https://github.com/EnzymeAD/Enzyme.git
cd Enzyme && mkdir build && cd build
cmake ../enzyme -DLLVM_DIR=$(brew --prefix llvm@19)/lib/cmake/llvm
make -j
sudo cp Enzyme/ClangEnzyme-19.dylib /opt/homebrew/lib/

3. Build cFUSE

cd cFUSE
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
    -DDFUSE_BUILD_PYTHON=ON \
    -DDFUSE_USE_NETCDF=ON \
    -DDFUSE_USE_ENZYME=ON \
    -DCMAKE_CXX_COMPILER=$(brew --prefix llvm@19)/bin/clang++
make -j
cp cfuse_core*.so ../python/

3b. Build Python package with Enzyme + NetCDF (optional)

# Use local Enzyme plugin and enable NetCDF in the build
CMAKE_ARGS="-DDFUSE_USE_ENZYME=ON -DDFUSE_USE_NETCDF=ON -DENZYME_PLUGIN=/path/to/ClangEnzyme-19.dylib" \
    python -m build --no-isolation --skip-dependency-check

4. Run Example Optimization

cd path/to/cFUSE/python
python optimize_basin.py

Command Line Options

python optimize_basin.py --help

# Examples:
python optimize_basin.py --iterations 700          # More iterations
python optimize_basin.py --lr 0.05                 # Lower learning rate
python optimize_basin.py --loss nse                # Optimize NSE instead of KGE
python optimize_basin.py --spinup-days 730         # 2-year spinup

Test Data

Example data is distributed as a release asset starting with v0.4.1. Download the Bow-at-Banff dataset from https://github.com/DarriEy/cFUSE/releases/tag/v0.4.1 and extract it so the path is data/domain_Bow_at_Banff_lumped_era5/ before running examples.

  • Basin: Bow River at Banff (2210 km²)
  • Forcing: ERA5 reanalysis (precipitation, temperature, PET)
  • Observations: Streamflow for validation

Project Structure

cFUSE/
├── data/                    # Downloaded example data (release asset)
├── include/cfuse/          # C++ headers
├── python/
│   ├── optimize_basin.py   # Example optimization script
│   └── cfuse/              # Python package
├── build/                  # Build output
└── README.md

License

GNU General Public License v3.0 or later (GPL-3.0-or-later). See LICENSE.

This matches the license of the original FUSE implementation (CH-Earth/fuse), from which this work derives.

Acknowledgments

  • Original FUSE: Clark et al. (2008), Water Resources Research
  • Enzyme AD: Moses & Churavy (2020), NeurIPS

Download files

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

Source Distribution

cfuse-0.6.2.tar.gz (174.8 kB view details)

Uploaded Source

File details

Details for the file cfuse-0.6.2.tar.gz.

File metadata

  • Download URL: cfuse-0.6.2.tar.gz
  • Upload date:
  • Size: 174.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for cfuse-0.6.2.tar.gz
Algorithm Hash digest
SHA256 e958b90182254ec89fdb4c4ba5c0138122f884ab589c73ac4a2dc9916654776c
MD5 fc0147593b1a5c292eb0e9a294746982
BLAKE2b-256 99277e4e0b1e06cb7d61b8477e8973c39017a9c399be4a9866f766aa53fdc55c

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.6.2 This release

1 file

0.6.1

1 file

0.6.0

1 file

0.5.0

1 file

0.4.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