Loading examples/dev/script.qmd +11 −7 Original line number Diff line number Diff line Loading @@ -32,13 +32,18 @@ class ReservoirSpecs: max_release: float min_release: float @dataclass class CascadeSpecs: reservoirs: dict[str, ReservoirSpecs] # Read the reservoir configuration with open('reservoirs/reservoir_config.yaml', 'r') as file: config_dict = yaml.safe_load(file) # Convert dictionary to class instances wolf_creek = ReservoirSpecs(**config_dict['Wolf_Creek']) cordell_hull = ReservoirSpecs(**config_dict['Cordell_Hull']) reservoir_specs = { name: ReservoirSpecs(**specs) for name, specs in config_dict.items() } cascade_specs = CascadeSpecs(reservoirs=reservoir_specs) df = pd.read_csv("inflow_release_ex1.csv") inflow = df['inflow'].tolist() Loading @@ -47,8 +52,7 @@ release = df['release'].tolist() wc_storage, wc_release, wc_spill, ch_storage, ch_release, ch_spill = powersheds.simulate_cascade( inflow, release, wolf_creek, cordell_hull cascade_specs ) ``` Loading src/lib.rs +19 −4 Original line number Diff line number Diff line use pyo3::prelude::*; use pyo3::exceptions::PyValueError; use std::collections::HashMap; #[derive(FromPyObject)] struct ReservoirSpecs { Loading @@ -8,6 +9,12 @@ struct ReservoirSpecs { max_release: f64, min_release: f64, } #[derive(FromPyObject)] struct CascadeSpecs { reservoirs: HashMap<String, ReservoirSpecs>, } struct ReservoirState { storage: f64, release: f64, Loading Loading @@ -44,16 +51,24 @@ fn simulate_timestep( /// Simulates a cascade of reservoirs #[pyfunction] fn simulate_cascade(inflow: Vec<f64>, fn simulate_cascade( inflow: Vec<f64>, release_target: Vec<f64>, wolf_creek: ReservoirSpecs, cordell_hull: ReservoirSpecs) -> PyResult<(Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>)> { cascade_specs: CascadeSpecs, ) -> PyResult<(Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>)> { if inflow.len() != release_target.len() { return Err(PyValueError::new_err("Input vectors must have the same length")); } let wolf_creek = cascade_specs.reservoirs.get("Wolf_Creek") .ok_or_else(|| PyValueError::new_err("Missing Wolf Creek specifications"))?; let cordell_hull = cascade_specs.reservoirs.get("Cordell_Hull") .ok_or_else(|| PyValueError::new_err("Missing Cordell Hull specifications"))?; let n = inflow.len(); let mut wc_storage = vec![0.0; n]; let mut wc_release = vec![0.0; n]; Loading Loading
examples/dev/script.qmd +11 −7 Original line number Diff line number Diff line Loading @@ -32,13 +32,18 @@ class ReservoirSpecs: max_release: float min_release: float @dataclass class CascadeSpecs: reservoirs: dict[str, ReservoirSpecs] # Read the reservoir configuration with open('reservoirs/reservoir_config.yaml', 'r') as file: config_dict = yaml.safe_load(file) # Convert dictionary to class instances wolf_creek = ReservoirSpecs(**config_dict['Wolf_Creek']) cordell_hull = ReservoirSpecs(**config_dict['Cordell_Hull']) reservoir_specs = { name: ReservoirSpecs(**specs) for name, specs in config_dict.items() } cascade_specs = CascadeSpecs(reservoirs=reservoir_specs) df = pd.read_csv("inflow_release_ex1.csv") inflow = df['inflow'].tolist() Loading @@ -47,8 +52,7 @@ release = df['release'].tolist() wc_storage, wc_release, wc_spill, ch_storage, ch_release, ch_spill = powersheds.simulate_cascade( inflow, release, wolf_creek, cordell_hull cascade_specs ) ``` Loading
src/lib.rs +19 −4 Original line number Diff line number Diff line use pyo3::prelude::*; use pyo3::exceptions::PyValueError; use std::collections::HashMap; #[derive(FromPyObject)] struct ReservoirSpecs { Loading @@ -8,6 +9,12 @@ struct ReservoirSpecs { max_release: f64, min_release: f64, } #[derive(FromPyObject)] struct CascadeSpecs { reservoirs: HashMap<String, ReservoirSpecs>, } struct ReservoirState { storage: f64, release: f64, Loading Loading @@ -44,16 +51,24 @@ fn simulate_timestep( /// Simulates a cascade of reservoirs #[pyfunction] fn simulate_cascade(inflow: Vec<f64>, fn simulate_cascade( inflow: Vec<f64>, release_target: Vec<f64>, wolf_creek: ReservoirSpecs, cordell_hull: ReservoirSpecs) -> PyResult<(Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>)> { cascade_specs: CascadeSpecs, ) -> PyResult<(Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>, Vec<f64>)> { if inflow.len() != release_target.len() { return Err(PyValueError::new_err("Input vectors must have the same length")); } let wolf_creek = cascade_specs.reservoirs.get("Wolf_Creek") .ok_or_else(|| PyValueError::new_err("Missing Wolf Creek specifications"))?; let cordell_hull = cascade_specs.reservoirs.get("Cordell_Hull") .ok_or_else(|| PyValueError::new_err("Missing Cordell Hull specifications"))?; let n = inflow.len(); let mut wc_storage = vec![0.0; n]; let mut wc_release = vec![0.0; n]; Loading