Commit 6b3965c6 authored by Turner, Sean's avatar Turner, Sean
Browse files

multi-res input argument

parent ddf5f46b
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -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()
@@ -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
)
```

+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 {
@@ -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,
@@ -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];