diff --git a/Cargo.toml b/Cargo.toml index 3083a25..5a4c5c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "hypergeometric-calc" version = "0.1.0" -edition = "2021" +edition = "2024" authors = ["Felipe Contreras Salinas "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/public/styles.scss b/public/styles.scss index 0b30a70..7fd0794 100644 --- a/public/styles.scss +++ b/public/styles.scss @@ -21,11 +21,6 @@ body { align-items: center; } -.buttons { - display: flex; - justify-content: space-evenly; -} - h1, h2, h3, @@ -37,16 +32,46 @@ h6 { padding: 2rem; } -p, -button { +p { margin: var(--size-6); } -body > picture, -button { - display: block; - margin-left: auto; - margin-right: auto; - text-align: center; - margin: 2rem; + +form { + display: table; + text-align: left; +} + +form > p { + display: table-row; + margin-bottom: 0.5em; +} + +form > p > label, form > p > input{ + display: table-cell; +} + +form input { + margin-left: 1em; + margin-bottom: 0.5em; + width: 4em; +} + +form > div.results { + display: grid; + grid-template-columns: 1fr 6em 6em 1fr; + min-width: 20em; + max-width: 30em; + width: 30vw; + font-size: 1.2em; +} + +form > div.results > span.left { + grid-column: 2 / 3; + text-align: right; + padding-right: 1em; +} + +form > div.results > span.right { + grid-column: 3 / 4; } diff --git a/src/calc.rs b/src/calc.rs index a63f667..9dc6038 100644 --- a/src/calc.rs +++ b/src/calc.rs @@ -27,20 +27,22 @@ pub fn hyper_geometric( hyper_geometric_exactly(population_size, successes, sample_size, sample_successes); let (less_than, less_or_equal, greater_or_equal, greater_than) = if sample_successes < sample_size / 2 { - let less_than: f64 = (0..sample_successes) + let less_than = (0..sample_successes) .map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i)) - .sum(); + .sum::() + .abs(); let less_or_equal = less_than + exactly; - let greater_or_equal = 1.0 - less_than; - let greater_than = 1.0 - less_or_equal; + let greater_or_equal = (1.0 - less_than).abs(); + let greater_than = (1.0 - less_or_equal).abs(); (less_than, less_or_equal, greater_or_equal, greater_than) } else { - let greater_than: f64 = (sample_successes + 1..=sample_size) + let greater_than = (sample_successes + 1..=sample_size) .map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i)) - .sum(); + .sum::() + .abs(); let greater_or_equal = greater_than + exactly; - let less_or_equal = 1.0 - greater_than; - let less_than = 1.0 - greater_or_equal; + let less_or_equal = (1.0 - greater_than).abs(); + let less_than = (1.0 - greater_or_equal).abs(); (less_than, less_or_equal, greater_or_equal, greater_than) }; Some(HyperGeometricProb { diff --git a/src/components/calculator.rs b/src/components/calculator.rs index c47003a..cf62eab 100644 --- a/src/components/calculator.rs +++ b/src/components/calculator.rs @@ -1,6 +1,8 @@ //! Hypergeometric Distribution Calculator use leptos::html::ElementChild; -use leptos::prelude::{signal, Get, GlobalAttributes, OnTargetAttribute, PropAttribute, Set}; +use leptos::prelude::{ + signal, ClassAttribute, Get, GlobalAttributes, OnTargetAttribute, PropAttribute, Set, +}; use leptos::{component, view, IntoView}; use crate::calc::hyper_geometric; @@ -74,36 +76,38 @@ pub fn Calculator() -> impl IntoView { } />

-

- "P(X = " - {sample_successes} - "): " - {move|| result().exactly} -

-

- "P(X < " - {sample_successes} - "): " - {move|| result().less_than} -

-

- "P(X ≤ " - {sample_successes} - "): " - {move|| result().less_or_equal} -

-

- "P(X > " - {sample_successes} - "): " - {move|| result().greater_than} -

-

- "P(X ≥ " - {sample_successes} - "): " - {move|| result().greater_or_equal} -

+
+ + "P(X = " + {sample_successes} + "): " + + {move || result().exactly} + + "P(X < " + {sample_successes} + "): " + + {move || result().less_than} + + "P(X ≤ " + {sample_successes} + "): " + + {move || result().less_or_equal} + + "P(X > " + {sample_successes} + "): " + + {move || result().greater_than} + + "P(X ≥ " + {sample_successes} + "): " + + {move || result().greater_or_equal} +
} }