finishing frequency

This commit is contained in:
elvis
2025-07-02 17:27:36 +02:00
parent f3ba949b82
commit fb3256c4a7
4 changed files with 120 additions and 26 deletions

View File

@ -1,6 +1,6 @@
#![allow(dead_code)]
use crate::rsprocess::structure::RSsystem;
use crate::rsprocess::structure::{RSset, RSsystem};
use crate::rsprocess::translator;
use crate::rsprocess::translator::Translator;
use crate::rsprocess::{frequency, perpetual, statistics, transitions};
@ -14,7 +14,11 @@ use std::io::prelude::*;
// the code
use super::grammar;
fn read_system(translator: &mut Translator, path: std::path::PathBuf) -> std::io::Result<RSsystem> {
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);
@ -22,13 +26,25 @@ fn read_system(translator: &mut Translator, path: std::path::PathBuf) -> std::io
buf_reader.read_to_string(&mut contents)?;
// parse
let result = grammar::SystemParser::new()
.parse(translator, &contents)
.unwrap();
let result = parser(translator, contents);
Ok(result)
}
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();
@ -36,7 +52,7 @@ pub fn stats() -> std::io::Result<()> {
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_system(&mut translator, path)?;
let system = read_file(&mut translator, path, parser_system)?;
// print statistics to screan
println!("{}", statistics::of_RSsystem(&translator, &system));
@ -56,7 +72,7 @@ pub fn target() -> std::io::Result<()> {
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_system(&mut translator, path)?;
let system = read_file(&mut translator, path, parser_system)?;
// the system needs to terminate to return
let res = match transitions::target(&system) {
@ -83,7 +99,7 @@ pub fn run() -> std::io::Result<()> {
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_system(&mut translator, path)?;
let system = read_file(&mut translator, path, parser_system)?;
// the system needs to terminate to return
let res = match transitions::run_separated(&system) {
@ -110,10 +126,12 @@ pub fn hoop() -> std::io::Result<()> {
let mut path = env::current_dir()?;
// file to read is inside testing/
path = path.join("testing/first.system");
let system = read_system(&mut translator, path)?;
let system = read_file(&mut translator, path, parser_system)?;
// we retrieve the id for "x" and use it to find the corresponding loop
let res = match perpetual::lollipops_only_loop_named(system, translator.encode("x")) {
let res =
match perpetual::lollipops_only_loop_named(system,
translator.encode("x")) {
Some(o) => o,
None => {
println!("No loop found.");
@ -130,13 +148,14 @@ pub fn hoop() -> std::io::Result<()> {
Ok(())
}
// equivalent to main_do(freq, PairList)
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");
let system = read_system(&mut translator, path)?;
let system = read_file(&mut translator, path, parser_system)?;
let res = match frequency::naive_frequency(&system) {
Ok(f) => f,
@ -153,3 +172,60 @@ pub fn freq() -> std::io::Result<()> {
Ok(())
}
// 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(())
}