use bevy_ecs::prelude::*;
use bevy_ecs::schedule::ScheduleLabel;
use crate::basic::ecs::elements::bus::bus_systems::init_node_lookup;
use crate::basic::ecs::elements::line::line_systems::setup_line_systems;
use crate::basic::ecs::elements::shunt::shunt_systems::setup_shunt_systems;
use crate::basic::ecs::elements::trans::trans_systems::setup_transformer;
use crate::basic::ecs::network::apply_permutation;
use crate::io::pandapower::ecs_net_conv::pandapower_init_system;
use super::init::{
PQBus, PVBus, SlackBus, label_pq_nodes, label_pv_nodes, label_slack_nodes, p_mw_inj,
q_mvar_inj, v_inj,
};
use super::mutation::ParamDiff;
use super::structure_update::reset_solvers;
use super::systems::{PowerFlowMat, PowerFlowResult, init_states};
#[derive(ScheduleLabel, Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct PFInit;
pub fn cleanup_solver_state(world: &mut World) {
world.remove_resource::<PowerFlowMat>();
world.remove_resource::<PowerFlowResult>();
if let Some(mut msgs) = world.get_resource_mut::<bevy_ecs::message::Messages<ParamDiff>>() {
msgs.clear();
}
}
pub fn clear_node_type_tags(
mut cmd: Commands,
q: Query<Entity, Or<(With<PQBus>, With<PVBus>, With<SlackBus>)>>,
) {
for e in &q {
cmd.entity(e).remove::<(PQBus, PVBus, SlackBus)>();
}
}
pub fn build_pf_init_schedule() -> Schedule {
let mut s = Schedule::new(PFInit);
s.add_systems(
(
pandapower_init_system,
cleanup_solver_state,
init_node_lookup,
setup_transformer,
setup_line_systems,
setup_shunt_systems,
clear_node_type_tags,
label_pv_nodes,
label_slack_nodes,
label_pq_nodes,
(p_mw_inj, q_mvar_inj, v_inj),
init_states,
apply_permutation,
reset_solvers,
)
.chain(),
);
s
}