Files
ReactionSystems/src/rsprocess/confluence.rs

98 lines
2.7 KiB
Rust
Raw Normal View History

2025-06-22 16:09:31 +02:00
#![allow(dead_code)]
use super::perpetual::{
2025-06-22 18:57:35 +02:00
lollipops_decomposed_named, lollipops_named, lollipops_only_loop_decomposed, lollipops_only_loop_decomposed_named, lollipops_prefix_len_loop_decomposed, lollipops_prefix_len_loop_decomposed_named};
2025-06-22 16:09:31 +02:00
use super::structure::{RSenvironment, RSreaction, RSset};
use super::translator::IdType;
use std::cmp;
2025-06-22 18:57:35 +02:00
// see confluent, confluents
2025-06-22 16:09:31 +02:00
pub fn confluent(
delta: &RSenvironment,
reaction_rules: &[RSreaction],
entities: &[RSset],
) -> Option<(usize, usize, Vec<RSset>)> {
let mut max_distance = 0;
let mut dimension = 0;
let mut hoop = vec![];
if let Some(el) = entities.first() {
2025-06-22 18:57:35 +02:00
if let Some(new_hoop) = lollipops_only_loop_decomposed(delta,
reaction_rules,
el).first()
{
2025-06-22 16:09:31 +02:00
dimension = new_hoop.len();
hoop = new_hoop.clone();
}
}
for available_entities in entities.iter().skip(1) {
// FIXME we take just the first? do we compare all?
if let Some((prefix_len, new_hoop)) =
2025-06-22 18:57:35 +02:00
lollipops_prefix_len_loop_decomposed(delta,
reaction_rules,
available_entities).first()
2025-06-22 16:09:31 +02:00
{
2025-06-22 18:57:35 +02:00
if new_hoop.len() != dimension || !hoop.contains(new_hoop
.first()
.unwrap())
{
2025-06-22 16:09:31 +02:00
return None;
}
max_distance = cmp::max(max_distance, *prefix_len);
} else {
return None;
}
}
Some((max_distance, dimension, hoop))
}
2025-06-22 18:57:35 +02:00
// see confluent, confluents
2025-06-22 16:09:31 +02:00
pub fn confluent_named(
delta: &RSenvironment,
reaction_rules: &[RSreaction],
entities: &[RSset],
symb: IdType
) -> Option<(usize, usize, Vec<RSset>)> {
let mut max_distance = 0;
let mut dimension = 0;
let mut hoop = vec![];
if let Some(el) = entities.first() {
2025-06-22 18:57:35 +02:00
if let Some(new_hoop) =
lollipops_only_loop_decomposed_named(delta,
reaction_rules,
el,
symb)
{
2025-06-22 16:09:31 +02:00
dimension = new_hoop.len();
hoop = new_hoop.clone();
2025-06-22 18:57:35 +02:00
} else {
return None
}
2025-06-22 16:09:31 +02:00
}
for available_entities in entities.iter().skip(1) {
// FIXME we take just the first? do we compare all?
if let Some((prefix_len, new_hoop)) =
2025-06-22 18:57:35 +02:00
lollipops_prefix_len_loop_decomposed_named(delta,
reaction_rules,
available_entities,
symb)
2025-06-22 16:09:31 +02:00
{
2025-06-22 18:57:35 +02:00
if new_hoop.len() != dimension || !hoop.contains(new_hoop
.first()
.unwrap())
{
2025-06-22 16:09:31 +02:00
return None;
}
max_distance = cmp::max(max_distance, prefix_len);
} else {
return None;
}
}
Some((max_distance, dimension, hoop))
}