From 5877ccdfa200f1ef37043ce5fac6466394c31515 Mon Sep 17 00:00:00 2001 From: Claas Date: Sun, 4 Aug 2024 00:29:47 +0200 Subject: [PATCH] Implement exponential distribution I think at least --- Cargo.lock | 173 +++++++++++++++------------ Cargo.toml | 2 +- exponential_distribution/Cargo.toml | 9 ++ exponential_distribution/src/main.rs | 95 +++++++++++++++ 4 files changed, 199 insertions(+), 80 deletions(-) create mode 100644 exponential_distribution/Cargo.toml create mode 100644 exponential_distribution/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 8a6fa5c..3c5d6fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,12 +193,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "bbqueue" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3baa8859d1a4c7411039a75c0599a4640ef1c9a8fc811e4325b00e6cfe0a55" - [[package]] name = "bindgen" version = "0.69.4" @@ -958,17 +952,6 @@ dependencies = [ "embedded-io", ] -[[package]] -name = "embedded-nal" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db9efecb57ab54fa918730f2874d7d37647169c50fa1357fecb81abee840b113" -dependencies = [ - "heapless 0.7.17", - "nb 1.1.0", - "no-std-net 0.5.0", -] - [[package]] name = "embedded-nal" version = "0.8.0" @@ -976,7 +959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a943fad5ed3d3f8a00f1e80f6bba371f1e7f0df28ec38477535eb318dc19cc" dependencies = [ "nb 1.1.0", - "no-std-net 0.6.0", + "no-std-net", ] [[package]] @@ -986,8 +969,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72229137a4fc12d239b0b7f50f04b30790678da6d782a0f3f1909bf57ec4b759" dependencies = [ "embedded-io-async", - "embedded-nal 0.8.0", - "no-std-net 0.6.0", + "embedded-nal", + "no-std-net", ] [[package]] @@ -1053,6 +1036,37 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "exponential_distribution" +version = "0.1.0" +dependencies = [ + "plotlib", + "rand", + "rand_distr", +] + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + [[package]] name = "fan-controller" version = "0.1.0" @@ -1069,10 +1083,9 @@ dependencies = [ "embassy-net", "embassy-rp", "embassy-time", - "mqttrust", - "mqttrust_core", "panic-probe", "portable-atomic", + "rand", "reqwless", "static_cell", ] @@ -1117,25 +1130,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" -[[package]] -name = "fugit" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" -dependencies = [ - "gcd", -] - -[[package]] -name = "fugit-timer" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9607bfc4c388f9d629704f56ede4a007546cad417b3bcd6fc7c87dc7edce04a" -dependencies = [ - "fugit", - "nb 1.1.0", -] - [[package]] name = "futures" version = "0.3.30" @@ -1209,12 +1203,6 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - [[package]] name = "generic-array" version = "0.12.4" @@ -1352,7 +1340,6 @@ dependencies = [ "atomic-polyfill", "hash32 0.2.1", "rustc_version 0.4.0", - "serde", "spin", "stable_deref_trait", ] @@ -1536,6 +1523,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "libredox" version = "0.1.3" @@ -1660,31 +1653,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "mqttrust" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae32f7b780d20b0fc574bba0ca71b33838bb264d7a48b098cd18e3327c30edde" -dependencies = [ - "heapless 0.7.17", -] - -[[package]] -name = "mqttrust_core" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d1cddb4f21cfbf6757aeb2ee8723a0b0d7f14199825989af6ccfef15e6a9d1" -dependencies = [ - "bbqueue", - "defmt", - "embedded-nal 0.6.0", - "fugit", - "fugit-timer", - "heapless 0.7.17", - "mqttrust", - "nb 1.1.0", -] - [[package]] name = "nb" version = "0.1.3" @@ -1717,12 +1685,6 @@ dependencies = [ "libc", ] -[[package]] -name = "no-std-net" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bcece43b12349917e096cddfa66107277f123e6c96a5aea78711dc601a47152" - [[package]] name = "no-std-net" version = "0.6.0" @@ -1755,6 +1717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1923,6 +1886,16 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "plotlib" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9462104f987d8d0f6625f0c7764f1c8b890bd1dc8584d8293e031f25c5a0d242" +dependencies = [ + "failure", + "svg", +] + [[package]] name = "polyval" version = "0.6.2" @@ -2017,6 +1990,17 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -2032,6 +2016,19 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] [[package]] name = "redox_syscall" @@ -2416,6 +2413,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "svg" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3685c82a045a6af0c488f0550b0f52b4c77d2a52b0ca8aba719f9d268fa96965" + [[package]] name = "syn" version = "1.0.109" @@ -2438,6 +2441,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "term" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index 61f9b2e..3101d56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["debug-listener", "fan-controller", "mqtt", ] +members = ["debug-listener", "exponential_distribution", "fan-controller", "mqtt", ] resolver = "2" diff --git a/exponential_distribution/Cargo.toml b/exponential_distribution/Cargo.toml new file mode 100644 index 0000000..49a9801 --- /dev/null +++ b/exponential_distribution/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "exponential_distribution" +version = "0.1.0" +edition = "2021" + +[dependencies] +plotlib = "0.5.1" +rand = "0.8.5" +rand_distr = "0.4.3" diff --git a/exponential_distribution/src/main.rs b/exponential_distribution/src/main.rs new file mode 100644 index 0000000..ce95ead --- /dev/null +++ b/exponential_distribution/src/main.rs @@ -0,0 +1,95 @@ +use plotlib::page::Page; +use plotlib::repr::Plot; +use plotlib::style::LineStyle; +use plotlib::view::ContinuousView; +use rand::Rng; +use rand::rngs::ThreadRng; +use rand_distr::num_traits::Pow; + +// Written by AI +fn exponential_random(random: &mut ThreadRng, max_value: f64, rate: f64) -> usize { + let exp_sample = random.gen::(); + (max_value - (-exp_sample.ln() / rate)).floor() as usize +} + +fn my_exponential_random(random: &mut ThreadRng) -> usize { + let power: f64 = random.gen_range(0.0..5.0); + let result = 1.0 - core::f64::consts::E.pow(-power); + let value = result * 60.0; + value.floor() as usize +} + +fn main() { + let mut random = rand::thread_rng(); + + let mut result_counts = [0u64; 60]; + let max = 1_000_000; + let mut count = 0; + loop { + // let value = my_exponential_random(&mut random); + let value = exponential_random(&mut random, 60.0, 0.1); + // dbg!(value); + + result_counts[value] += 1; + // let value: u64 = ((1.0 - result) * 60.0).round() as u64; + // dbg!(value); + // result_counts[value as usize] += 1; + + count += 1; + if count > max { + break; + } + } + + // println!("{:#?}", result_counts); + + let mut sum = 0.0; + let mut data = [(0.0, 0.0); 60]; + for index in 0..result_counts.len() { + let values = result_counts[index]; + let percentage = values as f64 / max as f64 * 100.0; + println!("{}: {:.2}", index, percentage); + sum += percentage; + data[index] = (index as f64 + 1.0, percentage); + } + + println!("Sum: {:.2}", sum); + + let plot = Plot::new(data.into()).line_style(LineStyle::new().colour("red")); + + let view = ContinuousView::new() + .add(plot) + // .add(plot2) + .x_range(0.0, 60.0) + .y_range(0.0, 20.0); + + Page::single(&view).save("./exponential.svg").unwrap(); + + // let max = 50; + // let mut count = 0; + // let mut result_counts = [0u64; 61];› + // loop { + // let value: f64 = random.sample(rand_distr::Exp1); + // // let value = 1.0 - value; + // // let value = value * 60.0; + // // let value = value.round(); + // dbg!(value); + // // result_counts[value] += 1; + // + // count += 1; + // if count > max { + // break; + // } + // } + + // println!("{:#?}", result_counts); + + // let mut max: f64 = 0.0; + // loop { + // let value: f64 = random.sample(rand_distr::Exp1); + // if value > max { + // max = value; + // println!("New max: {}", max); + // } + // } +} -- 2.51.2