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};
|
2025-07-02 10:37:29 +02:00
|
|
|
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 04:04:13 +02:00
|
|
|
|
2025-07-01 18:00:27 +02:00
|
|
|
use std::env;
|
2025-07-01 04:04:13 +02:00
|
|
|
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::*;
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
// 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 {
|
2025-07-01 04:04:13 +02:00
|
|
|
// 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);
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-01 04:04:13 +02:00
|
|
|
// 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)?;
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
// 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)?;
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
// 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 04:04:13 +02:00
|
|
|
};
|
|
|
|
|
|
2025-07-01 19:22:50 +02:00
|
|
|
println!(
|
|
|
|
|
"After {} steps we arrive at state:\n{}",
|
|
|
|
|
res.0,
|
2025-07-02 10:37:29 +02:00
|
|
|
translator::RSsetDisplay::from(&translator, &res.1)
|
2025-07-01 19:22:50 +02:00
|
|
|
);
|
2025-07-01 04:04:13 +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)?;
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
// 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(());
|
|
|
|
|
}
|
2025-07-01 04:04:13 +02:00
|
|
|
};
|
|
|
|
|
|
2025-07-02 10:37:29 +02:00
|
|
|
println!("The trace is composed by the set of entities:");
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
for (e, _c, _t) in res {
|
2025-07-02 10:37:29 +02:00
|
|
|
println!("{}", translator::RSsetDisplay::from(&translator, &e));
|
2025-07-01 04:04:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)?;
|
2025-07-01 04:04:13 +02:00
|
|
|
|
|
|
|
|
// 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(());
|
|
|
|
|
}
|
2025-07-01 04:04:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
println!("The loop is composed by the sets:");
|
|
|
|
|
|
|
|
|
|
for e in res {
|
2025-07-02 10:37:29 +02:00
|
|
|
println!("{}", translator::RSsetDisplay::from(&translator, &e));
|
2025-07-01 04:04:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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{}",
|
2025-07-02 10:37:29 +02:00
|
|
|
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(())
|
|
|
|
|
}
|