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
Metadata
Release files for cfuse 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cfuse-0.6.2.tar.gz | 174.8 kB | Without provenance | Details for cfuse-0.6.2.tar.gz |
Release files / cfuse-0.6.2.tar.gz
| Download URL | cfuse-0.6.2.tar.gz |
|---|---|
| Size | 174.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e958b90182254ec89fdb4c4ba5c0138122f884ab589c73ac4a2dc9916654776c
|
|
BLAKE2b-256 checksum How to use checksums |
99277e4e0b1e06cb7d61b8477e8973c39017a9c399be4a9866f766aa53fdc55c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Security for cfuse 0.6.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.