use std::collections::{HashMap, HashSet};
use graph_process_manager_core::process::persistent_state::AbstractProcessMutablePersistentState;
use maplit::hashset;
use crate::core::terms::term::{LanguageTerm, RewritableLanguageOperatorSymbol};
use crate::rewriting_process::conf::RewriteConfig;
use crate::rewriting_process::context::RewritingProcessContextAndParameterization;
use crate::rewriting_process::filtration::RewritingFiltrationResult;
use crate::rewriting_process::node::RewriteNodeKind;
use crate::rewriting_process::step::RewriteStepKind;
pub struct ConcreteRewritingPhaseInformation<LOS : RewritableLanguageOperatorSymbol> {
pub model_abstract_phase_id : usize,
pub initial_input_terms : HashSet<LanguageTerm<LOS>>,
pub final_irreducible_terms : HashSet<LanguageTerm<LOS>>,
}
impl<LOS: RewritableLanguageOperatorSymbol> ConcreteRewritingPhaseInformation<LOS> {
pub fn new(model_abstract_phase_id: usize, initial_input_terms: HashSet<LanguageTerm<LOS>>) -> Self {
Self {
model_abstract_phase_id,
initial_input_terms,
final_irreducible_terms: HashSet::new()
}
}
}
pub struct RewritingProcessState<LOS : RewritableLanguageOperatorSymbol> {
pub concrete_phases : Vec<ConcreteRewritingPhaseInformation<LOS>>,
pub successors_on_changed : HashMap<usize,usize>,
pub successors_on_unchanged : HashMap<usize,usize>,
pub node_count : u32
}
impl<LOS : RewritableLanguageOperatorSymbol> RewritingProcessState<LOS> {
pub fn new(
concrete_phases : Vec<ConcreteRewritingPhaseInformation<LOS>>,
node_count : u32
) -> Self {
Self {
concrete_phases,
successors_on_changed : HashMap::new(),
successors_on_unchanged : HashMap::new(),
node_count
}
}
}
impl<LOS : RewritableLanguageOperatorSymbol> AbstractProcessMutablePersistentState<RewriteConfig<LOS>> for RewritingProcessState<LOS> {
fn get_initial_state(
_context_and_param: &RewritingProcessContextAndParameterization<LOS>,
initial_node : &RewriteNodeKind<LOS>
) -> Self {
let concrete_phases = vec![
ConcreteRewritingPhaseInformation::new(
0,
hashset!{initial_node.term.clone()}
)
];
Self::new(
concrete_phases,
0
)
}
fn update_on_node_reached(
&mut self,
_context_and_param: &RewritingProcessContextAndParameterization<LOS>,
_node: &RewriteNodeKind<LOS>
) {
self.node_count += 1;
}
fn update_on_next_steps_collected_reached(
&mut self,
_context_and_param: &RewritingProcessContextAndParameterization<LOS>,
_node: &RewriteNodeKind<LOS>,
_steps: &[RewriteStepKind<LOS>]
) {
}
fn update_on_filtered(
&mut self,
_context_and_param: &RewritingProcessContextAndParameterization<LOS>,
_parent_node: &RewriteNodeKind<LOS>,
_filtration_result: &RewritingFiltrationResult
) {
}
fn warrants_termination_of_the_process(
&self,
_context_and_param: &RewritingProcessContextAndParameterization<LOS>
) -> bool {
false
}
}