cFUSE - Differentiable FUSE
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)
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e958b90182254ec89fdb4c4ba5c0138122f884ab589c73ac4a2dc9916654776c
|
|
| MD5 |
fc0147593b1a5c292eb0e9a294746982
|
|
| BLAKE2b-256 |
99277e4e0b1e06cb7d61b8477e8973c39017a9c399be4a9866f766aa53fdc55c
|