use powerio_core::Error;
use powerio_tx::BalancedNetwork;
use crate::diagnostics::codes;
use crate::instance::balanced::{
AcOpfInstance, AcPfInstance, DcOpfInstance, DcPfInstance, transform_discarded,
};
use crate::instance::scuc_inputs::ScucInputs;
#[derive(Clone, Debug)]
pub struct AcScucInstance {
network: BalancedNetwork,
inputs: ScucInputs,
}
impl AcScucInstance {
pub fn new(network: BalancedNetwork, inputs: ScucInputs) -> Result<Self, Error> {
let stated = inputs.static_data.bus.len();
if stated != network.buses().len() {
return Err(Error::new(
&codes::BUILD_INSTANCE_SHAPE_MISMATCH,
format!(
"the GO Challenge 3 inputs state {stated} buses; the network states {}",
network.buses().len()
),
));
}
Ok(Self { network, inputs })
}
#[must_use]
pub fn network(&self) -> &BalancedNetwork {
&self.network
}
#[must_use]
pub const fn inputs(&self) -> &ScucInputs {
&self.inputs
}
pub fn to_ac_opf(&self) -> Result<(AcOpfInstance, Vec<powerio_core::Diagnostic>), Error> {
let instance = AcOpfInstance::from_network(self.network.clone())?;
Ok((instance, vec![scheduling_discarded()]))
}
pub fn to_dc_opf(&self) -> Result<(DcOpfInstance, Vec<powerio_core::Diagnostic>), Error> {
let instance = DcOpfInstance::from_network(self.network.clone())?;
Ok((instance, vec![scheduling_discarded()]))
}
pub fn to_ac_pf(&self) -> Result<(AcPfInstance, Vec<powerio_core::Diagnostic>), Error> {
let instance = AcPfInstance::from_network(self.network.clone())?;
Ok((instance, vec![scheduling_discarded()]))
}
pub fn to_dc_pf(&self) -> Result<(DcPfInstance, Vec<powerio_core::Diagnostic>), Error> {
let instance = DcPfInstance::from_network(self.network.clone())?;
Ok((instance, vec![scheduling_discarded()]))
}
}
fn scheduling_discarded() -> powerio_core::Diagnostic {
transform_discarded(
"the scheduling, reserve, contingency, energy window, and violation cost categories",
)
}