1#![allow(rustdoc::private_intra_doc_links)]
44
45#[cfg(feature = "schema")]
46pub mod schema;
47
48pub mod broadcast;
49pub mod config;
50pub mod constraints;
51pub mod error;
52pub mod extensions;
53pub mod initial_conditions;
54pub mod output;
55pub(crate) mod parquet_helpers;
56pub mod penalties;
57pub(crate) mod pipeline;
58pub mod post_study_stages;
59pub mod report;
60pub mod resolution;
61pub mod scenarios;
62pub mod stage_resolve;
63pub mod stages;
64pub mod system;
65pub mod validation;
66pub(crate) mod windowed_history;
67
68pub use broadcast::{
69 BroadcastComputedParameter, BroadcastParameterKind, BroadcastScalarParameter,
70 deserialize_parameters, deserialize_system, serialize_parameters, serialize_system,
71};
72pub use config::{
73 BoundaryPolicy, Config, EstimationConfig, OrderSelectionMethod, PolicyMode, parse_config,
74};
75pub use constraints::{
76 BusPenaltyOverrideRow, ContractBoundsRow, GenericConstraintBoundsRow, HydroBoundsRow,
77 HydroPenaltyOverrideRow, LineBoundsRow, LineBusPairIndex, LinePenaltyOverrideRow,
78 NcsPenaltyOverrideRow, PumpingBoundsRow, ThermalBoundsRow, build_line_bus_pair_index,
79 load_contract_bounds, load_generic_constraint_bounds, load_generic_constraints,
80 load_hydro_bounds, load_line_bounds, load_penalty_overrides_bus, load_penalty_overrides_hydro,
81 load_penalty_overrides_line, load_penalty_overrides_ncs, load_pumping_bounds,
82 load_thermal_bounds, parse_contract_bounds, parse_generic_constraint_bounds,
83 parse_generic_constraints, parse_hydro_bounds, parse_line_bounds, parse_penalty_overrides_bus,
84 parse_penalty_overrides_hydro, parse_penalty_overrides_line, parse_penalty_overrides_ncs,
85 parse_pumping_bounds, parse_thermal_bounds,
86};
87pub use error::LoadError;
88pub use extensions::{
89 EvaporationModelRow, FittingWindow, FphaColumnLayout, FphaDeviationPointRow, FphaHyperplaneRow,
90 HydroEnergyProductivityRow, HydroGeometryRow, HydroReferenceVolumeFractions,
91 PlaneReductionConfig, ProductionModelConfig, ProductionModelFile, SeasonConfig, SelectionMode,
92 StageRange, build_hydro_reference_volumes_resolved, load_fpha_hyperplanes,
93 load_hydro_energy_productivity, load_hydro_geometry, load_production_models,
94 load_scalar_parameters_json, parse_evaporation_models, parse_fpha_deviation_points,
95 parse_fpha_hyperplanes, parse_hydro_energy_productivity, parse_hydro_geometry,
96 parse_production_models, parse_scalar_parameters_json,
97};
98pub use initial_conditions::parse_initial_conditions;
99pub use output::policy::codec::{deserialize_checkpoint_manifest, serialize_checkpoint_manifest};
100pub use output::policy::records::CheckpointManifest;
101pub use output::policy::{
102 ENTITY_SLOT_DELIVERY_DATE_SENTINEL, EntitySlot, FORMAT_VERSION, GraphManifest, ManifestEdge,
103 ManifestNode, OwnedPolicyBasisRecord, OwnedPolicyCutRecord, PolicyBasisRecord,
104 PolicyCheckpoint, PolicyCutRecord, ProducerBlock, STAGE_CUTS_GRAPH_STAGE_ID_SENTINEL,
105 STAGE_CUTS_NODE_ID_SENTINEL, STAGE_STATES_NODE_ID_SENTINEL, StageCutsPayload,
106 StageCutsReadResult, StageStatesPayload, StageStatesReadResult, StateFamily,
107 deserialize_stage_basis, deserialize_stage_cuts, deserialize_stage_states,
108 read_policy_checkpoint, serialize_stage_basis, serialize_stage_cuts, serialize_stage_states,
109 write_policy_checkpoint,
110};
111pub use output::{
112 ConvergenceSummary, DeviationSummary, DeviationWorstEntry, DistributionInfo, FixedDeliveryRow,
113 GenericConstraintEchoRow, HostLayout, IterationRecord, MetadataBounds, MetadataConfiguration,
114 MetadataConvergence, MetadataCost, MetadataIterations, MetadataProblemDimensions,
115 MetadataRowPool, MetadataScenarios, MetadataSimulationSolveStats, MetadataTrainingSolveStats,
116 OutputContext, OutputError, ParquetWriterConfig, RowPoolStatistics, RowSelectionRecord,
117 SetupTimings, SimulationMetadata, SimulationOutput, SolverStatsRow, TrainingMetadata,
118 TrainingOutput, TrainingParquetWriter, WorkerTimingRecord, get_hostname, now_iso8601,
119 read_convergence_summary, read_hydro_model_summary, read_provenance_report,
120 read_simulation_metadata, read_training_metadata, write_dictionaries, write_evaporation_models,
121 write_fixed_delivery, write_fpha_deviation_points, write_fpha_hyperplanes,
122 write_generic_constraint_echo, write_hydro_model_summary, write_provenance_report,
123 write_results, write_row_selection_records, write_scaling_report, write_simulation_metadata,
124 write_simulation_results, write_simulation_solver_stats, write_solver_stats,
125 write_training_metadata, write_training_results,
126};
127pub use penalties::parse_penalties;
128pub use post_study_stages::parse_post_study_stages;
129pub use report::{ReportEntry, ValidationReport, generate_report};
130pub use resolution::{resolve_bounds, resolve_penalties};
131pub use scenarios::{
132 BlockFactor, ExternalLoadRow, ExternalNcsRow, ExternalScenarioRow, InflowArCoefficientRow,
133 InflowHistoryRow, InflowSeasonalStatsRow, LoadFactorEntry, LoadSeasonalStatsRow,
134 NoiseOpeningRow, ScenarioData, assemble_inflow_models, assemble_load_models, load_correlation,
135 load_external_inflow_scenarios, load_external_load_scenarios, load_external_ncs_scenarios,
136 load_inflow_ar_coefficients, load_inflow_history, load_inflow_seasonal_stats,
137 load_load_factors, load_load_seasonal_stats, load_noise_openings, load_scenarios,
138 parse_correlation, parse_external_inflow_scenarios, parse_external_load_scenarios,
139 parse_external_ncs_scenarios, parse_inflow_ar_coefficients, parse_inflow_history,
140 parse_inflow_seasonal_stats, parse_load_factors, parse_load_seasonal_stats,
141};
142pub use stage_resolve::StageIdResolver;
143pub use stages::{StagesData, build_season_stage_map, parse_stages};
144pub use system::{
145 load_energy_contracts, load_non_controllable_sources, load_pumping_stations, parse_buses,
146 parse_energy_contracts, parse_hydros, parse_lines, parse_non_controllable_sources,
147 parse_pumping_stations, parse_thermals,
148};
149pub use validation::scalar_parameters::validate_scalar_parameters;
150pub use validation::semantic::seed_lag_state_depth;
151pub use validation::structural::{FileManifest, validate_structure};
152pub use validation::{ErrorKind, Severity, ValidationContext, ValidationEntry};
153
154use cobre_core::{ScalarParameter, System};
155use std::path::Path;
156
157#[derive(Debug, Clone, Default)]
166pub struct CaseArtifacts {
167 pub file_manifest: FileManifest,
171
172 pub hydro_geometry: Vec<extensions::HydroGeometryRow>,
174
175 pub production_models: Vec<extensions::ProductionModelConfig>,
177
178 pub plane_reduction: Option<extensions::PlaneReductionConfig>,
183
184 pub hydro_energy_productivity: Vec<extensions::HydroEnergyProductivityRow>,
186
187 pub fpha_hyperplanes: Vec<extensions::FphaHyperplaneRow>,
189
190 pub scalar_parameters: Vec<ScalarParameter>,
192
193 pub tailrace_curves: Vec<extensions::TailraceCurveRow>,
195}
196
197#[derive(Debug)]
201pub struct LoadedCase {
202 pub system: System,
204 pub artifacts: CaseArtifacts,
206}
207
208pub fn load_case(path: &Path) -> Result<System, LoadError> {
235 pipeline::run_pipeline(path)
236}
237
238pub fn load_case_with_artifacts(path: &Path) -> Result<LoadedCase, LoadError> {
252 pipeline::run_pipeline_with_artifacts(path).map(|(loaded, _report)| loaded)
253}
254
255pub fn validate_case(path: &Path) -> Result<(System, ValidationReport), LoadError> {
266 pipeline::run_pipeline_with_report(path)
267}
268
269pub fn validate_case_with_artifacts(
283 path: &Path,
284) -> Result<(LoadedCase, ValidationReport), LoadError> {
285 pipeline::run_pipeline_with_artifacts(path)
286}
287
288#[cfg(test)]
289mod tests {
290 use crate::CaseArtifacts;
291
292 #[test]
293 fn case_artifacts_plane_reduction_defaults_to_none() {
294 let artifacts = CaseArtifacts::default();
295 assert!(artifacts.plane_reduction.is_none());
296 }
297}