cobre_sddp/setup/
accessors.rs1use cobre_core::scenario::SamplingScheme;
4
5use crate::{
6 context::{StageContext, TrainingContext},
7 cut::FutureCostFunction,
8 energy_conversion::EnergyConversionSet,
9 indexer::StageIndexer,
10 simulation::SimulationConfig,
11 workspace::CapturedBasis,
12};
13
14use super::StudySetup;
15
16impl StudySetup {
17 pub fn replace_fcf(&mut self, fcf: FutureCostFunction) {
23 self.fcf = fcf;
24 }
25
26 pub fn set_start_iteration(&mut self, iteration: u64) {
28 self.loop_params.start_iteration = iteration;
29 }
30
31 pub fn set_warm_start_basis_cache(&mut self, cache: Vec<Option<CapturedBasis>>) {
42 self.warm_start_basis_cache = Some(cache);
43 }
44
45 pub fn set_export_states(&mut self, export: bool) {
47 self.events.export_states = export;
48 }
49
50 pub fn set_budget(&mut self, budget: Option<u32>) {
52 self.cut_management.budget = budget;
53 }
54
55 #[must_use]
65 pub fn energy_conversion(&self) -> &EnergyConversionSet {
66 &self.energy_conversion
67 }
68
69 #[must_use]
71 pub fn simulation_config(&self) -> &SimulationConfig {
72 &self.simulation_config
73 }
74
75 #[must_use]
85 pub fn stage_indexer(&self) -> &StageIndexer {
86 &self.stage_data.indexer
87 }
88
89 #[must_use]
95 pub fn num_stages(&self) -> usize {
96 self.methodology.horizon.num_stages()
97 }
98
99 #[must_use]
101 pub fn stage_ctx(&self) -> StageContext<'_> {
102 StageContext {
103 templates: &self.stage_data.stage_templates.templates,
104 base_rows: &self.stage_data.stage_templates.base_rows,
105 noise_scale: &self.stage_data.stage_templates.noise_scale,
106 n_hydros: self.stage_data.stage_templates.n_hydros,
107 n_load_buses: self.stage_data.stage_templates.n_load_buses,
108 load_balance_row_starts: &self.stage_data.stage_templates.load_balance_row_starts,
109 load_bus_indices: &self.stage_data.stage_templates.load_bus_indices,
110 block_counts_per_stage: &self.stage_data.block_counts_per_stage,
111 ncs_max_gen: &self.ncs_max_gen,
112 ncs_allow_curtailment: &self.ncs_allow_curtailment,
113 discount_factors: &self.stage_data.stage_templates.discount_factors,
114 cumulative_discount_factors: &self
115 .stage_data
116 .stage_templates
117 .cumulative_discount_factors,
118 stage_lag_transitions: &self.stage_data.stage_lag_transitions,
119 noise_group_ids: &self.stage_data.noise_group_ids,
120 downstream_par_order: self.downstream_par_order,
121 }
122 }
123
124 #[cfg(test)]
126 #[must_use]
127 pub(crate) fn training_ctx(&self) -> TrainingContext<'_> {
128 let tr = &self.scenario_libraries.training;
129 TrainingContext {
130 horizon: &self.methodology.horizon,
131 indexer: &self.stage_data.indexer,
132 inflow_method: &self.methodology.inflow_method,
133 stochastic: &self.stochastic,
134 initial_state: &self.initial_state,
135 inflow_scheme: tr.inflow_scheme,
136 load_scheme: tr.load_scheme,
137 ncs_scheme: tr.ncs_scheme,
138 stages: &self.stage_data.stages,
139 historical_library: tr.historical.as_ref(),
140 external_inflow_library: tr.external_inflow.as_ref(),
141 external_load_library: tr.external_load.as_ref(),
142 external_ncs_library: tr.external_ncs.as_ref(),
143 recent_accum_seed: &self.recent_observation_seed.accum_seed,
144 recent_weight_seed: self.recent_observation_seed.weight_seed,
145 dcs: self
146 .cut_management
147 .cut_selection
148 .as_ref()
149 .and_then(crate::dcs::DcsParams::from_strategy),
150 noise_key_diag: None,
151 }
152 }
153
154 #[must_use]
159 pub(crate) fn simulation_ctx(&self) -> TrainingContext<'_> {
160 let tr = &self.scenario_libraries.training;
161 let sim = &self.scenario_libraries.simulation;
162
163 let historical_library =
166 sim.historical
167 .as_ref()
168 .or(if sim.inflow_scheme == SamplingScheme::Historical {
169 tr.historical.as_ref()
170 } else {
171 None
172 });
173 let external_inflow_library =
174 sim.external_inflow
175 .as_ref()
176 .or(if sim.inflow_scheme == SamplingScheme::External {
177 tr.external_inflow.as_ref()
178 } else {
179 None
180 });
181 let external_load_library =
182 sim.external_load
183 .as_ref()
184 .or(if sim.load_scheme == SamplingScheme::External {
185 tr.external_load.as_ref()
186 } else {
187 None
188 });
189 let external_ncs_library =
190 sim.external_ncs
191 .as_ref()
192 .or(if sim.ncs_scheme == SamplingScheme::External {
193 tr.external_ncs.as_ref()
194 } else {
195 None
196 });
197
198 TrainingContext {
199 horizon: &self.methodology.horizon,
200 indexer: &self.stage_data.indexer,
201 inflow_method: &self.methodology.inflow_method,
202 stochastic: &self.stochastic,
203 initial_state: &self.initial_state,
204 inflow_scheme: sim.inflow_scheme,
205 load_scheme: sim.load_scheme,
206 ncs_scheme: sim.ncs_scheme,
207 stages: &self.stage_data.stages,
208 historical_library,
209 external_inflow_library,
210 external_load_library,
211 external_ncs_library,
212 recent_accum_seed: &self.recent_observation_seed.accum_seed,
213 recent_weight_seed: self.recent_observation_seed.weight_seed,
214 dcs: self
218 .cut_management
219 .cut_selection
220 .as_ref()
221 .and_then(crate::dcs::DcsParams::from_strategy),
222 noise_key_diag: None,
224 }
225 }
226}