From d4d6ba4618907aff29784b2474ad8b04d6fe7955 Mon Sep 17 00:00:00 2001 From: Layne Shepherd Date: Wed, 15 Apr 2026 16:13:01 -0400 Subject: [PATCH 1/4] updates to rational and piecewise --- .dockerignore | 40 ++++++++++++++++++++++++++++++++++++ src/functions.rs | 4 ++++ src/functions/exponential.rs | 0 src/functions/logarithmic.rs | 0 src/functions/piecewise.rs | 15 ++++++++++++++ src/functions/polynomial.rs | 12 +++++------ src/functions/rational.rs | 33 +++++++++++++++++++++++++++-- 7 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 .dockerignore create mode 100644 src/functions/exponential.rs create mode 100644 src/functions/logarithmic.rs create mode 100644 src/functions/piecewise.rs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..05b26ab --- /dev/null +++ b/.dockerignore @@ -0,0 +1,40 @@ +# Rust build artifacts +target/ +debug/ +release/ + +# Cargo metadata / local caches +.cargo/ + +# Git +.git/ +.gitignore + +# IDE / editor +.vscode/ +.idea/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db + +# Environment / secrets +.env +.env.* + +# Logs +*.log + +# Docker / compose overrides (optional) +docker-compose.override.yml + +# Test / temp outputs +*.tmp +*.bak + +# Generated artifacts +*.png +*.svg +*.pdf \ No newline at end of file diff --git a/src/functions.rs b/src/functions.rs index 1ef0759..c568b0a 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -2,3 +2,7 @@ pub mod polynomial; pub mod rational; pub mod radical; + +pub mod piecewise; +mod exponential; +mod logarithmic; diff --git a/src/functions/exponential.rs b/src/functions/exponential.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/functions/logarithmic.rs b/src/functions/logarithmic.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/functions/piecewise.rs b/src/functions/piecewise.rs new file mode 100644 index 0000000..e81b8ed --- /dev/null +++ b/src/functions/piecewise.rs @@ -0,0 +1,15 @@ +use crate::core::traits::Function; + +pub struct Piecewise { + functions: Vec>, +} + +impl Piecewise { + pub fn count(&self) -> usize { + self.functions.len() + } + + pub fn functions(&self) -> &[Box] { + &self.functions + } +} \ No newline at end of file diff --git a/src/functions/polynomial.rs b/src/functions/polynomial.rs index 77d0384..8b0d69c 100644 --- a/src/functions/polynomial.rs +++ b/src/functions/polynomial.rs @@ -1,4 +1,4 @@ -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Polynomial { /// Coefficients in descending degree order. /// Example: x^2 - 4x + 3 => vec![1.0, -4.0, 3.0] @@ -64,11 +64,6 @@ impl Polynomial { Polynomial::new(result) } - pub fn evaluate(&self, x: f64) -> f64 { - // Horner's method - self.coefficients.iter().fold(0.0, |acc, &c| acc * x + c) - } - pub fn derivative(&self) -> Self { let degree = self.degree(); @@ -94,6 +89,11 @@ impl Polynomial { self.evaluate(0.0) } + pub fn evaluate(&self, x: f64) -> f64 { + // Horner's method + self.coefficients.iter().fold(0.0, |acc, &c| acc * x + c) + } + pub fn leading_coefficient(&self) -> f64 { self.coefficients[0] } diff --git a/src/functions/rational.rs b/src/functions/rational.rs index d6a88e4..171bf14 100644 --- a/src/functions/rational.rs +++ b/src/functions/rational.rs @@ -4,8 +4,8 @@ use crate::functions::polynomial::Polynomial; pub struct Rational { /// Coefficients in descending degree order. /// Example: x^2 - 4x + 3 => vec![1.0, -4.0, 3.0] - pub numerator: Polynomial, - pub denominator: Polynomial, + numerator: Polynomial, + denominator: Polynomial, } impl Rational { @@ -15,4 +15,33 @@ impl Rational { denominator, } } + + pub fn asymptote(&self) -> Polynomial { + let numerator = &self.numerator; + let denominator = &self.denominator; + if numerator.degree() == denominator.degree() { + let ratio = numerator.leading_coefficient() / denominator.leading_coefficient(); + return Polynomial::new(vec![ratio]); + } else if numerator.degree() > denominator.degree() { + return Polynomial::new(vec![]); + } else { + return Polynomial::new(vec![0.0]); + } + } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn expect_horizontal_asymptote_zero() { + let numerator = Polynomial::new(vec![1.0, 1.0]); + let denominator = Polynomial::new(vec![1.0, 1.0, 1.0]); + let rational = Rational::new(numerator, denominator); + let asymptote: Polynomial = rational.asymptote(); + + let horizontal_expected: Polynomial = Polynomial::new(vec![0.0]); + assert_eq!(asymptote, horizontal_expected); + } +} \ No newline at end of file From 2706255e41e0891f92f1660acabd5536bd546fbf Mon Sep 17 00:00:00 2001 From: Layne Shepherd Date: Wed, 15 Apr 2026 16:17:50 -0400 Subject: [PATCH 2/4] fix formatting issues --- src/functions.rs | 2 +- src/functions/exponential.rs | 1 + src/functions/logarithmic.rs | 1 + src/functions/piecewise.rs | 2 +- src/functions/rational.rs | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/functions.rs b/src/functions.rs index c568b0a..0362357 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -3,6 +3,6 @@ pub mod rational; pub mod radical; -pub mod piecewise; mod exponential; mod logarithmic; +pub mod piecewise; diff --git a/src/functions/exponential.rs b/src/functions/exponential.rs index e69de29..8b13789 100644 --- a/src/functions/exponential.rs +++ b/src/functions/exponential.rs @@ -0,0 +1 @@ + diff --git a/src/functions/logarithmic.rs b/src/functions/logarithmic.rs index e69de29..8b13789 100644 --- a/src/functions/logarithmic.rs +++ b/src/functions/logarithmic.rs @@ -0,0 +1 @@ + diff --git a/src/functions/piecewise.rs b/src/functions/piecewise.rs index e81b8ed..f6f27bc 100644 --- a/src/functions/piecewise.rs +++ b/src/functions/piecewise.rs @@ -12,4 +12,4 @@ impl Piecewise { pub fn functions(&self) -> &[Box] { &self.functions } -} \ No newline at end of file +} diff --git a/src/functions/rational.rs b/src/functions/rational.rs index 171bf14..b5bffda 100644 --- a/src/functions/rational.rs +++ b/src/functions/rational.rs @@ -44,4 +44,4 @@ mod tests { let horizontal_expected: Polynomial = Polynomial::new(vec![0.0]); assert_eq!(asymptote, horizontal_expected); } -} \ No newline at end of file +} From 91c0b09f8bca2500e902c381b5769d887a907246 Mon Sep 17 00:00:00 2001 From: Layne Shepherd Date: Wed, 15 Apr 2026 16:19:51 -0400 Subject: [PATCH 3/4] fix for unnecessary return --- src/functions/rational.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/functions/rational.rs b/src/functions/rational.rs index b5bffda..a701a9d 100644 --- a/src/functions/rational.rs +++ b/src/functions/rational.rs @@ -21,11 +21,11 @@ impl Rational { let denominator = &self.denominator; if numerator.degree() == denominator.degree() { let ratio = numerator.leading_coefficient() / denominator.leading_coefficient(); - return Polynomial::new(vec![ratio]); + Polynomial::new(vec![ratio]); } else if numerator.degree() > denominator.degree() { - return Polynomial::new(vec![]); + Polynomial::new(vec![]); } else { - return Polynomial::new(vec![0.0]); + Polynomial::new(vec![0.0]); } } } From 2452c37fb6b91110b7bd24dca217d1cb15942752 Mon Sep 17 00:00:00 2001 From: Layne Shepherd Date: Wed, 15 Apr 2026 16:20:52 -0400 Subject: [PATCH 4/4] fix for unnecessary return --- src/functions/rational.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/functions/rational.rs b/src/functions/rational.rs index a701a9d..479de9d 100644 --- a/src/functions/rational.rs +++ b/src/functions/rational.rs @@ -21,11 +21,11 @@ impl Rational { let denominator = &self.denominator; if numerator.degree() == denominator.degree() { let ratio = numerator.leading_coefficient() / denominator.leading_coefficient(); - Polynomial::new(vec![ratio]); + Polynomial::new(vec![ratio]) } else if numerator.degree() > denominator.degree() { - Polynomial::new(vec![]); + Polynomial::new(vec![]) } else { - Polynomial::new(vec![0.0]); + Polynomial::new(vec![0.0]) } } }