chore: improve UI design + fix -0.0
This commit is contained in:
parent
b9a79b41b7
commit
e3e92a158a
4 changed files with 85 additions and 54 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "hypergeometric-calc"
|
name = "hypergeometric-calc"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
authors = ["Felipe Contreras Salinas <felipe@bstr.cl>"]
|
authors = ["Felipe Contreras Salinas <felipe@bstr.cl>"]
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
|
||||||
|
|
@ -21,11 +21,6 @@ body {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.buttons {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-evenly;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
h1,
|
||||||
h2,
|
h2,
|
||||||
h3,
|
h3,
|
||||||
|
|
@ -37,16 +32,46 @@ h6 {
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
p,
|
p {
|
||||||
button {
|
|
||||||
margin: var(--size-6);
|
margin: var(--size-6);
|
||||||
}
|
}
|
||||||
|
|
||||||
body > picture,
|
|
||||||
button {
|
form {
|
||||||
display: block;
|
display: table;
|
||||||
margin-left: auto;
|
text-align: left;
|
||||||
margin-right: auto;
|
}
|
||||||
text-align: center;
|
|
||||||
margin: 2rem;
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
src/calc.rs
18
src/calc.rs
|
|
@ -27,20 +27,22 @@ pub fn hyper_geometric(
|
||||||
hyper_geometric_exactly(population_size, successes, sample_size, sample_successes);
|
hyper_geometric_exactly(population_size, successes, sample_size, sample_successes);
|
||||||
let (less_than, less_or_equal, greater_or_equal, greater_than) =
|
let (less_than, less_or_equal, greater_or_equal, greater_than) =
|
||||||
if sample_successes < sample_size / 2 {
|
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))
|
.map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i))
|
||||||
.sum();
|
.sum::<f64>()
|
||||||
|
.abs();
|
||||||
let less_or_equal = less_than + exactly;
|
let less_or_equal = less_than + exactly;
|
||||||
let greater_or_equal = 1.0 - less_than;
|
let greater_or_equal = (1.0 - less_than).abs();
|
||||||
let greater_than = 1.0 - less_or_equal;
|
let greater_than = (1.0 - less_or_equal).abs();
|
||||||
(less_than, less_or_equal, greater_or_equal, greater_than)
|
(less_than, less_or_equal, greater_or_equal, greater_than)
|
||||||
} else {
|
} 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))
|
.map(|i| hyper_geometric_exactly(population_size, successes, sample_size, i))
|
||||||
.sum();
|
.sum::<f64>()
|
||||||
|
.abs();
|
||||||
let greater_or_equal = greater_than + exactly;
|
let greater_or_equal = greater_than + exactly;
|
||||||
let less_or_equal = 1.0 - greater_than;
|
let less_or_equal = (1.0 - greater_than).abs();
|
||||||
let less_than = 1.0 - greater_or_equal;
|
let less_than = (1.0 - greater_or_equal).abs();
|
||||||
(less_than, less_or_equal, greater_or_equal, greater_than)
|
(less_than, less_or_equal, greater_or_equal, greater_than)
|
||||||
};
|
};
|
||||||
Some(HyperGeometricProb {
|
Some(HyperGeometricProb {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
//! Hypergeometric Distribution Calculator
|
//! Hypergeometric Distribution Calculator
|
||||||
use leptos::html::ElementChild;
|
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 leptos::{component, view, IntoView};
|
||||||
|
|
||||||
use crate::calc::hyper_geometric;
|
use crate::calc::hyper_geometric;
|
||||||
|
|
@ -74,36 +76,38 @@ pub fn Calculator() -> impl IntoView {
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<div class="results">
|
||||||
|
<span class="left">
|
||||||
<span>"P(X = "</span>
|
<span>"P(X = "</span>
|
||||||
<span>{sample_successes}</span>
|
<span>{sample_successes}</span>
|
||||||
<span>"): "</span>
|
<span>"): "</span>
|
||||||
<span>{move|| result().exactly}</span>
|
</span>
|
||||||
</p>
|
<span class="right">{move || result().exactly}</span>
|
||||||
<p>
|
<span class="left">
|
||||||
<span>"P(X < "</span>
|
<span>"P(X < "</span>
|
||||||
<span>{sample_successes}</span>
|
<span>{sample_successes}</span>
|
||||||
<span>"): "</span>
|
<span>"): "</span>
|
||||||
<span>{move|| result().less_than}</span>
|
</span>
|
||||||
</p>
|
<span class="right">{move || result().less_than}</span>
|
||||||
<p>
|
<span class="left">
|
||||||
<span>"P(X ≤ "</span>
|
<span>"P(X ≤ "</span>
|
||||||
<span>{sample_successes}</span>
|
<span>{sample_successes}</span>
|
||||||
<span>"): "</span>
|
<span>"): "</span>
|
||||||
<span>{move|| result().less_or_equal}</span>
|
</span>
|
||||||
</p>
|
<span class="right">{move || result().less_or_equal}</span>
|
||||||
<p>
|
<span class="left">
|
||||||
<span>"P(X > "</span>
|
<span>"P(X > "</span>
|
||||||
<span>{sample_successes}</span>
|
<span>{sample_successes}</span>
|
||||||
<span>"): "</span>
|
<span>"): "</span>
|
||||||
<span>{move|| result().greater_than}</span>
|
</span>
|
||||||
</p>
|
<span class="right">{move || result().greater_than}</span>
|
||||||
<p>
|
<span class="left">
|
||||||
<span>"P(X ≥ "</span>
|
<span>"P(X ≥ "</span>
|
||||||
<span>{sample_successes}</span>
|
<span>{sample_successes}</span>
|
||||||
<span>"): "</span>
|
<span>"): "</span>
|
||||||
<span>{move|| result().greater_or_equal}</span>
|
</span>
|
||||||
</p>
|
<span class="right">{move || result().greater_or_equal}</span>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue