initial commit
This commit is contained in:
commit
8823021ef7
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "calculator-rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "calculator-rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
use crate::numbers::Number;
|
||||||
|
|
||||||
|
|
||||||
|
/// a function that represents specificaly a mathmatical function, with a fixed number of inputs
|
||||||
|
/// and outputs. it is generic over inputs and outputs, so you can have something like this
|
||||||
|
/// ```
|
||||||
|
/// /// the function defined as being its own derivitave.
|
||||||
|
/// struct Exponential<T: Number> {
|
||||||
|
/// // some exponential internals
|
||||||
|
/// }
|
||||||
|
/// // could be done by using Into<Complex> instead
|
||||||
|
/// impl Functiton<f64, f64, 1, 1> for Exponential<f64> {
|
||||||
|
/// fn call(&self, arg: f64) -> f64 {
|
||||||
|
/// todo!();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// impl Functiton<Complex, Complex, 1, 1> for Exponential<Complex> {
|
||||||
|
/// fn call(&self, arg: Complex) -> Complex {
|
||||||
|
/// todo!();
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
pub trait Function<T, U> {
|
||||||
|
fn call(&self, arg: T) -> U;
|
||||||
|
}
|
||||||
|
/// ```
|
||||||
|
/// struct Polonomial {
|
||||||
|
/// // polonomial internals
|
||||||
|
/// }
|
||||||
|
/// impl<T, U> Function<T, U> for Polonomial {
|
||||||
|
/// fn call(&self, arg: T)
|
||||||
|
/// }
|
||||||
|
/// impl<T, U, O> Differentiable<T, U, O> for Polonomial {
|
||||||
|
/// type Output = Polonomial
|
||||||
|
///
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
pub trait Differentiable<T, U, O>: Function<T, U> {
|
||||||
|
type Output: Function<T, O>;
|
||||||
|
fn derivitave(self) -> Self::Output;
|
||||||
|
}
|
||||||
|
pub trait Smooth<T, U, O>: Differentiable<T, U, O> {}
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct Exponential<T: Number>{
|
||||||
|
phantom: PhantomData<T>,
|
||||||
|
}
|
||||||
|
impl Function<f64, f64>for Exponential<f64> {
|
||||||
|
fn call(&self, arg: f64) -> f64 {
|
||||||
|
std::f64::consts::E.powf(arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Differentiable<f64, f64, f64> for Exponential<f64> {
|
||||||
|
type Output = Self;
|
||||||
|
fn derivitave(self) -> Self::Output {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* impl<T, U, O, A, X> Smooth<T, U, O> for A
|
||||||
|
where
|
||||||
|
X: Smooth<T, U, O>,
|
||||||
|
A: Differentiable<T, U, O, Output = X>,
|
||||||
|
{
|
||||||
|
|
||||||
|
} */
|
||||||
|
impl<T, U, O, A> Smooth<T, U, O> for A
|
||||||
|
where
|
||||||
|
A: Differentiable<T, U, O, Output = A>,
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
pub mod polonomial;
|
||||||
|
pub mod numbers;
|
||||||
|
pub mod linear;
|
||||||
|
pub mod function;
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::numbers::Number;
|
||||||
|
|
||||||
|
/// A mathmatical Vector
|
||||||
|
pub struct Vector<T:Number, const D: usize>([T; D]);
|
||||||
|
// impl<T,
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
use std::ops::*;
|
||||||
|
|
||||||
|
pub trait Number: Add + Sub + Mul + Div + Neg + Clone + Sized { }
|
||||||
|
impl<T: Add + Sub + Mul + Div + Neg + Clone + Sized> Number for T {}
|
||||||
|
|
||||||
|
/// angles are assumed to always be in radians
|
||||||
|
pub type Angle = f64;
|
||||||
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
pub struct Complex{
|
||||||
|
real: f64,
|
||||||
|
imaginary: f64,
|
||||||
|
}
|
||||||
|
impl Complex {
|
||||||
|
pub const IMAGINARY_UNIT: Self = Self { real:0.0, imaginary: 0.0};
|
||||||
|
/// computes the absolute value of a complex number
|
||||||
|
pub fn abs(&self) -> f64 {
|
||||||
|
(self.real.powi(2) + self.imaginary.powi(2)).sqrt()
|
||||||
|
}
|
||||||
|
/// returns a unit vector that is angle a away from the positive x axis
|
||||||
|
pub fn unit_angle(a: Angle) -> Self {
|
||||||
|
Self {
|
||||||
|
real: a.cos(),
|
||||||
|
imaginary: a.sin(),
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
impl From<f64> for Complex {
|
||||||
|
fn from(value: f64) -> Self {
|
||||||
|
Self { real: value, imaginary: 0.0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Add for Complex {
|
||||||
|
type Output = Self;
|
||||||
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
real: self.real + rhs.real,
|
||||||
|
imaginary: self.imaginary + rhs.imaginary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl AddAssign for Complex {
|
||||||
|
fn add_assign(&mut self, rhs: Self) {
|
||||||
|
*self = self.clone() + rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
impl Sub for Complex {
|
||||||
|
type Output = Self;
|
||||||
|
fn sub(self, rhs: Self) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
real: self.real - rhs.real,
|
||||||
|
imaginary: self.imaginary - rhs.imaginary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl SubAssign for Complex {
|
||||||
|
fn sub_assign(&mut self, rhs: Self) {
|
||||||
|
*self = self.clone() - rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
impl Mul for Complex {
|
||||||
|
type Output = Self;
|
||||||
|
fn mul(self, rhs: Self) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
real: self.real * rhs.real - self.imaginary * rhs.imaginary,
|
||||||
|
imaginary: self.real * rhs.imaginary + self.imaginary * rhs.real,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Div for Complex {
|
||||||
|
type Output = Self;
|
||||||
|
fn div(self, rhs: Self) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
real: self.real / rhs.real - self.imaginary / rhs.imaginary,
|
||||||
|
imaginary: self.real / rhs.imaginary + self.imaginary / rhs.real,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
use super::numbers::Number;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
/// a factor of a polinomial
|
||||||
|
// this is of the form (coeficient*x+offset)^power
|
||||||
|
pub struct Factor<T: Number = f64> {
|
||||||
|
power: i32,
|
||||||
|
coeficient: T,
|
||||||
|
offset: T,
|
||||||
|
}
|
||||||
|
#[derive(Default, Debug, Clone)]
|
||||||
|
pub struct Equation<T: Number = f64> {
|
||||||
|
fields: Vec<Option<T>>,
|
||||||
|
// fields: HashMap<usize, T>,
|
||||||
|
}
|
||||||
|
impl<T:Number> Equation<T> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue