Files
ReactionSystems/src/examples.rs

232 lines
6.3 KiB
Rust
Raw Normal View History

2025-07-01 19:22:50 +02:00
#![allow(dead_code)]
2025-07-02 17:27:36 +02:00
use crate::rsprocess::structure::{RSset, RSsystem};
use crate::rsprocess::translator;
use crate::rsprocess::translator::Translator;
2025-07-01 19:22:50 +02:00
use crate::rsprocess::{frequency, perpetual, statistics, transitions};
2025-07-01 18:00:27 +02:00
use std::env;
use std::fs;
2025-07-01 18:00:27 +02:00
use std::io;
2025-07-01 19:22:50 +02:00
use std::io::prelude::*;
// grammar is defined in main.rs, calling lalrpop_mod! twice, generates twice
// the code
use super::grammar;
2025-07-02 17:27:36 +02:00
fn read_file<T, F>(
translator: &mut Translator,
path: std::path::PathBuf,
parser: F
) -> std::io::Result<T> where F: Fn(&mut Translator, String) -> T {
// we read the file with a buffer
let f = fs::File::open(path.clone())?;
let mut buf_reader = io::BufReader::new(f);
let mut contents = String::new();
buf_reader.read_to_string(&mut contents)?;
// parse
2025-07-02 17:27:36 +02:00
let result = parser(translator, contents);
Ok(result)
}
2025-07-02 17:27:36 +02:00
fn parser_system(translator: &mut Translator, contents: String) -> RSsystem {
grammar::SystemParser::new()
.parse(translator, &contents)
.unwrap()
}
fn parser_experiment(translator: &mut Translator, contents: String) -> (Vec<u32>, Vec<RSset>) {
grammar::ExperimentParser::new()
.parse(translator, &contents)
.unwrap()
}
// equivalent main_do(stat) or main_do(stat, MissingE)
pub fn stats() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
2025-07-02 17:27:36 +02:00
let system = read_file(&mut translator, path, parser_system)?;
// print statistics to screan
println!("{}", statistics::of_RSsystem(&translator, &system));
// to write to file:
//// path = path.with_extension("stats");
//// let mut f = std::fs::File::create(path)?;
//// writeln!(f, "{}", statistics::of_RSsystem(translator, &result))?;
Ok(())
}
// equivalent to main_do(target, E)
pub fn target() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
2025-07-02 17:27:36 +02:00
let system = read_file(&mut translator, path, parser_system)?;
// the system needs to terminate to return
let res = match transitions::target(&system) {
2025-07-01 19:22:50 +02:00
Ok(o) => o,
Err(e) => {
println!("Error computing target: {e}");
return Ok(());
}
};
2025-07-01 19:22:50 +02:00
println!(
"After {} steps we arrive at state:\n{}",
res.0,
translator::RSsetDisplay::from(&translator, &res.1)
2025-07-01 19:22:50 +02:00
);
Ok(())
}
// equivalent to main_do(run,Es)
pub fn run() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
2025-07-02 17:27:36 +02:00
let system = read_file(&mut translator, path, parser_system)?;
// the system needs to terminate to return
let res = match transitions::run_separated(&system) {
2025-07-01 19:22:50 +02:00
Ok(o) => o,
Err(e) => {
println!("Error computing target: {e}");
return Ok(());
}
};
println!("The trace is composed by the set of entities:");
for (e, _c, _t) in res {
println!("{}", translator::RSsetDisplay::from(&translator, &e));
}
Ok(())
}
// equivalent to main_do(loop,Es)
pub fn hoop() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
2025-07-02 17:27:36 +02:00
let system = read_file(&mut translator, path, parser_system)?;
// we retrieve the id for "x" and use it to find the corresponding loop
2025-07-02 17:27:36 +02:00
let res =
match perpetual::lollipops_only_loop_named(system,
translator.encode("x")) {
2025-07-01 19:22:50 +02:00
Some(o) => o,
None => {
println!("No loop found.");
return Ok(());
}
};
println!("The loop is composed by the sets:");
for e in res {
println!("{}", translator::RSsetDisplay::from(&translator, &e));
}
Ok(())
}
2025-07-01 18:00:27 +02:00
2025-07-02 17:27:36 +02:00
// equivalent to main_do(freq, PairList)
2025-07-01 18:00:27 +02:00
pub fn freq() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
2025-07-02 17:27:36 +02:00
let system = read_file(&mut translator, path, parser_system)?;
2025-07-01 18:00:27 +02:00
let res = match frequency::naive_frequency(&system) {
2025-07-01 19:22:50 +02:00
Ok(f) => f,
Err(e) => {
println!("Error computing target: {e}");
return Ok(());
}
2025-07-01 18:00:27 +02:00
};
2025-07-01 19:22:50 +02:00
println!(
"Frequency of encountered symbols:\n{}",
translator::FrequencyDisplay::from(&translator, &res)
2025-07-01 19:22:50 +02:00
);
2025-07-01 18:00:27 +02:00
Ok(())
}
2025-07-02 17:27:36 +02:00
// equivalent to main_do(limitfreq, PairList)
pub fn limit_freq() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_file(&mut translator, path, parser_system)?;
path = env::current_dir()?;
path = path.join("testing/first.experiment");
let (_, sets) = read_file(&mut translator, path, parser_experiment)?;
let res = match frequency::limit_frequency(&sets,
system.get_reaction_rules(),
system.get_available_entities()) {
Some(e) => e,
None => {return Ok(());}
};
println!(
"Frequency of encountered symbols:\n{}",
translator::FrequencyDisplay::from(&translator, &res)
);
Ok(())
}
// equivalent to main_do(fastfreq, PairList)
pub fn fast_freq() -> std::io::Result<()> {
let mut translator = Translator::new();
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_file(&mut translator, path, parser_system)?;
path = env::current_dir()?;
path = path.join("testing/first.experiment");
let (weights, sets) = read_file(&mut translator, path, parser_experiment)?;
let res = match frequency::fast_frequency(&sets,
system.get_reaction_rules(),
system.get_available_entities(),
&weights) {
Some(e) => e,
None => {return Ok(());}
};
println!(
"Frequency of encountered symbols:\n{}",
translator::FrequencyDisplay::from(&translator, &res)
);
Ok(())
}