Skip to main content

powerio_matrix/
lindist3flow_pf.rs

1//! Fixed-dispatch LinDist3Flow compilation and semantic SI limit evaluation.
2
3use powerio_prob::{LinDist3FlowLimitCheck, LinDist3FlowOpfValues, LinDist3FlowPfInstance};
4
5use crate::{
6    LinDist3FlowConicProblem, LinDist3FlowStandardForm, LinDist3FlowStandardFormOptions, Result,
7    build_lindist3flow_conic_problem, build_lindist3flow_standard_form_with_options,
8    lindist3flow_values_from_primal, lindist3flow_values_from_standard_primal,
9};
10
11/// Compile the fixed-dispatch electrical equations. The instance constructor
12/// has already removed conductor limits from the enforced constraint set and
13/// replaced the objective with zero.
14///
15/// # Errors
16/// As [`build_lindist3flow_conic_problem`].
17pub fn build_lindist3flow_pf_conic_problem(
18    instance: &LinDist3FlowPfInstance,
19) -> Result<LinDist3FlowConicProblem> {
20    build_lindist3flow_conic_problem(instance.formulation())
21}
22
23/// Compile the fixed-dispatch problem in the default scaled standard form.
24///
25/// # Errors
26/// As [`build_lindist3flow_standard_form_with_options`].
27pub fn build_lindist3flow_pf_standard_form(
28    instance: &LinDist3FlowPfInstance,
29) -> Result<LinDist3FlowStandardForm> {
30    build_lindist3flow_pf_standard_form_with_options(
31        instance,
32        LinDist3FlowStandardFormOptions::default(),
33    )
34}
35
36/// Compile the fixed-dispatch problem with explicit numerical scaling.
37///
38/// # Errors
39/// As [`build_lindist3flow_standard_form_with_options`].
40pub fn build_lindist3flow_pf_standard_form_with_options(
41    instance: &LinDist3FlowPfInstance,
42    options: LinDist3FlowStandardFormOptions,
43) -> Result<LinDist3FlowStandardForm> {
44    build_lindist3flow_standard_form_with_options(instance.formulation(), options)
45}
46
47/// Decode a canonical SI primal for a fixed-dispatch instance.
48///
49/// # Errors
50/// The primal does not match the canonical variable axis.
51pub fn lindist3flow_pf_values_from_primal(
52    problem: &LinDist3FlowConicProblem,
53    primal: &[f64],
54) -> Result<LinDist3FlowOpfValues> {
55    lindist3flow_values_from_primal(problem, primal)
56}
57
58/// Decode a scaled standard-form primal for a fixed-dispatch instance.
59///
60/// # Errors
61/// The primal does not match the standard-form variable axis.
62pub fn lindist3flow_pf_values_from_standard_primal(
63    form: &LinDist3FlowStandardForm,
64    primal: &[f64],
65) -> Result<LinDist3FlowOpfValues> {
66    lindist3flow_values_from_standard_primal(form, primal)
67}
68
69/// Evaluate every supported line thermal limit at a fixed-dispatch point.
70/// Values and limits are returned in SI units: volt amperes and amperes.
71/// Current is evaluated independently at both physical line endpoints as
72/// `hypot(P,Q) / |V|`. Parallel switch contacts remain separate prepared
73/// lines, so crossed ratings cannot be relaxed by aggregation.
74///
75/// # Errors
76/// The values do not match the formulation axes, a rating is invalid, or an
77/// endpoint squared voltage is nonpositive or non-finite.
78pub fn evaluate_lindist3flow_pf_limits(
79    instance: &LinDist3FlowPfInstance,
80    values: &LinDist3FlowOpfValues,
81) -> Result<Vec<LinDist3FlowLimitCheck>> {
82    powerio_prob::evaluate_lindist3flow_pf_limits(instance, values).map_err(crate::Error::Commit)
83}