From 665549930501597c12db2592ee099eeb6e1834c1 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sun, 9 Nov 2025 14:23:18 +0500 Subject: [PATCH 1/2] Learner and similarity index --- src/learner.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 52 insertions(+) create mode 100644 src/learner.rs diff --git a/src/learner.rs b/src/learner.rs new file mode 100644 index 0000000..596c8cf --- /dev/null +++ b/src/learner.rs @@ -0,0 +1,51 @@ +use crate::formula::Formula; + +pub struct Learner { + best_algorithm: Formula, + inputs: Vec, + expected_outputs: Vec, + formulas_per_iteration: usize, + iterations: usize, +} + +impl Learner { + pub fn new( + inputs: Vec, + expected_outputs: Vec, + formulas_per_iteration: Option, + iterations: Option, + ) -> Self { + Self { + best_algorithm: Formula::new(), + inputs, + expected_outputs, + formulas_per_iteration: formulas_per_iteration.unwrap_or(200), + iterations: iterations.unwrap_or(200), + } + } + fn get_similarity(expected_output: Vec, real_output: Vec) -> Result { + if expected_output.len() != real_output.len() { + return Err(()); + } + + let mut scalar = 0f64; + let mut expected_len = 0f64; + let mut real_len = 0f64; + + for i in 0..expected_output.len() { + expected_len += expected_output[i] * expected_output[i]; + real_len += real_output[i] * real_output[i]; + scalar += expected_output[i] * real_output[i]; + } + + expected_len = expected_len.sqrt(); + real_len = real_len.sqrt(); + + let cos: f64 = scalar / (expected_len * real_len); + let len_proportion: f64 = real_len / expected_len; + let similarity: f64 = + cos * (1f64 - ((len_proportion - 1f64).abs() / (len_proportion + 1f64))); + + Ok(similarity) + } +} diff --git a/src/lib.rs b/src/lib.rs index 97ffda3..76516c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ pub mod formula; +pub mod learner; pub mod node; #[cfg(test)] From 2ebfe38bac5333628c82b75024d1340170656af2 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sun, 9 Nov 2025 14:38:51 +0500 Subject: [PATCH 2/2] Nothing could stop us --- src/learner.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/learner.rs b/src/learner.rs index 596c8cf..fb14647 100644 --- a/src/learner.rs +++ b/src/learner.rs @@ -23,7 +23,34 @@ impl Learner { iterations: iterations.unwrap_or(200), } } - fn get_similarity(expected_output: Vec, real_output: Vec) -> Result { + pub fn iterate(&self) -> Formula { + let mut formulas: Vec<(Formula, f64)> = vec![]; + for _ in 0..self.formulas_per_iteration { + let mut formula = self.best_algorithm.clone(); + Learner::mutate_formula_randomly(&mut formula); + let outputs = formula.run(self.inputs.clone()); + formulas.push(( + formula, + Learner::get_similarity(&self.expected_outputs, &outputs).unwrap(), + )); + } + formulas + .iter() + .max_by(|x, y| { + if x.1 > y.1 { + std::cmp::Ordering::Greater + } else if x.1 < y.1 { + std::cmp::Ordering::Less + } else { + std::cmp::Ordering::Equal + } + }) + .unwrap() + .0 + .clone() + } + fn mutate_formula_randomly(formula: &mut Formula) {} + fn get_similarity(expected_output: &Vec, real_output: &Vec) -> Result { if expected_output.len() != real_output.len() { return Err(()); }