use crate::hypotheses::Hypothesis;
use crate::rules::Rule;
use crate::substrates::graph::rules::RewriteRule;
pub fn generate_standard_hypotheses() -> Vec<Hypothesis<RewriteRule>> {
let mut hypotheses = Vec::new();
hypotheses.push(Hypothesis::new(
"H1_HAS_STRUCTURED",
|rules: &[RewriteRule]| rules.iter().any(|r| r.rule_type() == "structured"),
"persistence",
"Rule set contains at least one structured rule",
1.0,
));
hypotheses.push(Hypothesis::new(
"H2_MAJORITY_STRUCTURED",
|rules: &[RewriteRule]| {
if rules.is_empty() {
return false;
}
let n = rules
.iter()
.filter(|r| r.rule_type() == "structured")
.count();
n as f64 / rules.len() as f64 >= 0.5
},
"memory",
"Majority of rules are structured",
1.5,
));
hypotheses.push(Hypothesis::new(
"H3_LOGIC_GATE",
|rules: &[RewriteRule]| {
let logic = ["NAND", "NOR", "AND", "OR", "XOR", "NOT"];
rules.iter().any(|r| logic.contains(&r.name()))
},
"memory",
"Rule set contains a logic gate",
1.5,
));
hypotheses.push(Hypothesis::new(
"H4_ALL_STRUCTURED",
|rules: &[RewriteRule]| {
!rules.is_empty() && rules.iter().all(|r| r.rule_type() == "structured")
},
"persistence",
"All rules are structured",
1.0,
));
hypotheses.push(Hypothesis::new(
"H5_TRANSPORT",
|rules: &[RewriteRule]| {
let transport = ["PROPAGATE", "SWAP", "COPY_TO_OUT", "COPY_FROM_IN"];
rules.iter().any(|r| transport.contains(&r.name()))
},
"storage",
"Rule set contains an information transport rule",
1.0,
));
hypotheses.push(Hypothesis::new(
"H6_ALL_DESTRUCTIVE",
|rules: &[RewriteRule]| {
!rules.is_empty() && rules.iter().all(|r| r.rule_type() == "destructive")
},
"persistence",
"All rules are destructive (negative control)",
0.5,
));
hypotheses.push(Hypothesis::new(
"H7_MULTIPLE_LOGIC",
|rules: &[RewriteRule]| {
let logic = ["NAND", "NOR", "AND", "OR", "XOR", "NOT"];
rules.iter().filter(|r| logic.contains(&r.name())).count() >= 2
},
"memory",
"Rule set contains at least 2 logic gates",
2.0,
));
hypotheses.push(Hypothesis::new(
"H8_MIXED",
|rules: &[RewriteRule]| {
if rules.is_empty() {
return false;
}
let ratio = rules
.iter()
.filter(|r| r.rule_type() == "structured")
.count() as f64
/ rules.len() as f64;
ratio > 0.3 && ratio < 0.7
},
"persistence",
"Mixed structured and destructive rules",
2.0,
));
hypotheses
}