Description
Description
-
Refactor all procedural implementations of HBV model variants into class-based structures that inherit from BaseHBVModel. Each variant should override the step_run() method and any additional behavior needed (e.g., lake routing, special snow handling).
-
Migrate the existing procedural implementations of HBV variants (e.g. hbv.py, hbv_lake.py, hbvold.py, hbvlumped.py, hbv_bergestrom92.py) into class-based implementations that inherit from a newly created BaseHBVModel. This allows shared routines to be reused and variant-specific logic to be isolated via subclassing.
The following modules currently implement procedural HBV variants and will be refactored:
src/Hapi/rrm/
├── hbv.py
├── hbv_lake.py
├── hbvold.py
├── hbvlumped.py
├── hbv_bergestrom92.py
Each file contains functions like:
- Precipitation()
- Snow()
- Soil()
- Response()
- StepRun() or _step_run()
- Routing() or _routing()
These functions follow the HBV model structure, with many repetitions and only minor differences in implementation (e.g., lake evaporation logic, or routing weights).
By inheriting from a BaseHBVModel
, we can:
- Centralize shared logic.
- Encourage composability and reuse.
- Support polymorphism (e.g., run different models with the same simulator).
- Make the codebase easier to maintain and test.
Implementaion
1 - After creating the BaseHBVModel
, in #141
2 - Wrap each HBV variant into a class
#hbv.py
from Hapi.rrm.base_model import BaseHBVModel
class HBVModel(BaseHBVModel):
def step_run(self, p, p2, v, St):
# call self.precipitation(), self.snow(), etc.
# customize behavior if needed
...
3- Apply similar class wrappers for:
- HBVLakeModel(BaseHBVModel)
- HBVLumpedModel(BaseHBVModel)
- HBVBergestromModel(BaseHBVModel)
- HBVOldModel(BaseHBVModel)
Checklist
- Refactor hbv.py → HBVModel
- Refactor hbv_lake.py → HBVLakeModel
- Refactor hbvold.py → HBVOldModel
- Refactor hbvlumped.py → HBVLumpedModel
- Refactor hbv_bergestrom92.py → HBVBergestromModel
- Replace procedural step_run() functions
- Write/adjust unit tests for each class
- Ensure compatibility with calibration/routing/parameter modules