From fe4bd8e43cc6ef56d0fecf173931c06617e76e0d Mon Sep 17 00:00:00 2001 From: fruzitent Date: Sun, 3 Nov 2024 20:24:02 +0200 Subject: [PATCH 01/21] feat(s3_dsa/p01): initial commit --- .gitignore | 2 ++ s3_dsa/p01/Cargo.lock | 7 +++++++ s3_dsa/p01/Cargo.toml | 6 ++++++ s3_dsa/p01/src/main.rs | 3 +++ 4 files changed, 18 insertions(+) create mode 100644 s3_dsa/p01/Cargo.lock create mode 100644 s3_dsa/p01/Cargo.toml create mode 100644 s3_dsa/p01/src/main.rs diff --git a/.gitignore b/.gitignore index 446fe69..dd7eee6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ # @help: https://git-scm.com/docs/gitignore + +target/ diff --git a/s3_dsa/p01/Cargo.lock b/s3_dsa/p01/Cargo.lock new file mode 100644 index 0000000..a63d11f --- /dev/null +++ b/s3_dsa/p01/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "p01" +version = "0.1.0" diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml new file mode 100644 index 0000000..2207e2d --- /dev/null +++ b/s3_dsa/p01/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "p01" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/s3_dsa/p01/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} From 673b8b15d236cd66b25bbe025dbd6e49401f70c3 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Sun, 3 Nov 2024 20:32:20 +0200 Subject: [PATCH 02/21] chore(s3_dsa/p01): update config --- s3_dsa/p01/Cargo.toml | 16 +++++++++++++++- s3_dsa/p01/rust-toolchain.toml | 5 +++++ s3_dsa/p01/rustfmt.toml | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 s3_dsa/p01/rust-toolchain.toml create mode 100644 s3_dsa/p01/rustfmt.toml diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml index 2207e2d..f1f3532 100644 --- a/s3_dsa/p01/Cargo.toml +++ b/s3_dsa/p01/Cargo.toml @@ -1,6 +1,20 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json +# @help: https://doc.rust-lang.org/cargo/reference/manifest.html + [package] +authors = ["fruzitent "] +description = "s3_dsa/p01" +edition = "2021" +license-file = "license.md" name = "p01" +readme = "readme.md" +repository = "git+https://github.com/fruzitent/kpi.git" version = "0.1.0" -edition = "2021" + +[build-dependencies] [dependencies] + +[dev-dependencies] + +[features] diff --git a/s3_dsa/p01/rust-toolchain.toml b/s3_dsa/p01/rust-toolchain.toml new file mode 100644 index 0000000..15badae --- /dev/null +++ b/s3_dsa/p01/rust-toolchain.toml @@ -0,0 +1,5 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/rust-toolchain.json +# @help: https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file + +[toolchain] +channel = "stable" diff --git a/s3_dsa/p01/rustfmt.toml b/s3_dsa/p01/rustfmt.toml new file mode 100644 index 0000000..0192a88 --- /dev/null +++ b/s3_dsa/p01/rustfmt.toml @@ -0,0 +1,4 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/rustfmt.json +# @help: https://rust-lang.github.io/rustfmt + +max_width = 120 From 25ee21db5a6ab5b7c51f06e3985dee4d1e76b3bc Mon Sep 17 00:00:00 2001 From: fruzitent Date: Sun, 3 Nov 2024 20:42:02 +0200 Subject: [PATCH 03/21] feat(s3_dsa/p01): implement n-nacci generator --- s3_dsa/p01/src/main.rs | 2 ++ s3_dsa/p01/src/nacci.rs | 71 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 s3_dsa/p01/src/nacci.rs diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index e7a11a9..ba5d9bf 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -1,3 +1,5 @@ +mod nacci; + fn main() { println!("Hello, world!"); } diff --git a/s3_dsa/p01/src/nacci.rs b/s3_dsa/p01/src/nacci.rs new file mode 100644 index 0000000..89378ae --- /dev/null +++ b/s3_dsa/p01/src/nacci.rs @@ -0,0 +1,71 @@ +/// @see: https://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers#Fibonacci_numbers_of_higher_order +pub struct Nacci { + // TODO: replace usize with T + cache: Vec, + index: usize, + length: usize, + total: usize, +} + +impl Nacci { + pub fn new(order: usize, length: usize) -> Option { + if order < 2 { + // TODO: https://en.wikipedia.org/wiki/Negafibonacci_coding + return None; + } + let mut cache = vec![0; order]; + cache[order - 1] = 1; + Some(Self { + cache, + index: 0, + length, + total: 1, + }) + } +} + +impl Iterator for Nacci { + type Item = usize; + + fn collect>(self) -> B + where + Self: Sized, + { + FromIterator::from_iter(self) + } + + fn next(&mut self) -> Option { + if self.length == 0 { + return None; + } + self.length -= 1; + let result = self.cache[self.index]; + self.cache[self.index] = self.total; + self.index = (self.index + 1) % self.cache.len(); + self.total = self.total * 2 - result; + Some(result) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + assert!(Nacci::new(1, 16).is_none()); + assert_eq!( + Nacci::new(2, 16).unwrap().collect::>(), + vec![0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610] + ); + assert_eq!( + Nacci::new(3, 16).unwrap().collect::>(), + vec![0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705] + ); + assert_eq!( + Nacci::new(4, 16).unwrap().collect::>(), + vec![0, 0, 0, 1, 1, 2, 4, 8, 15, 29, 56, 108, 208, 401, 773, 1490] + ); + assert_eq!(Nacci::new(5, 0).unwrap().collect::>(), vec![]); + } +} From cc98744994cddb161c4f769c45724827241537f7 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Mon, 4 Nov 2024 19:01:53 +0200 Subject: [PATCH 04/21] feat(s3_sda/p01): generate file with random data --- s3_dsa/p01/.gitignore | 3 +++ s3_dsa/p01/Cargo.lock | 9 +++++++++ s3_dsa/p01/Cargo.toml | 3 +-- s3_dsa/p01/src/main.rs | 8 +++++++- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 s3_dsa/p01/.gitignore diff --git a/s3_dsa/p01/.gitignore b/s3_dsa/p01/.gitignore new file mode 100644 index 0000000..e40c306 --- /dev/null +++ b/s3_dsa/p01/.gitignore @@ -0,0 +1,3 @@ +# @help: https://git-scm.com/docs/gitignore + +*.bin diff --git a/s3_dsa/p01/Cargo.lock b/s3_dsa/p01/Cargo.lock index a63d11f..01fd2e3 100644 --- a/s3_dsa/p01/Cargo.lock +++ b/s3_dsa/p01/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + [[package]] name = "p01" version = "0.1.0" +dependencies = [ + "nanorand", +] diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml index f1f3532..d3a5046 100644 --- a/s3_dsa/p01/Cargo.toml +++ b/s3_dsa/p01/Cargo.toml @@ -14,7 +14,6 @@ version = "0.1.0" [build-dependencies] [dependencies] - -[dev-dependencies] +nanorand = "0.7.0" [features] diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index ba5d9bf..dc048f4 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -1,5 +1,11 @@ mod nacci; fn main() { - println!("Hello, world!"); + let input_path = std::path::Path::new("./input.bin"); + if !input_path.exists() { + let mut rng = nanorand::tls_rng(); + let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); + let mut input_file = std::fs::File::create(&input_path).unwrap(); + std::io::Write::write_all(&mut input_file, &data).unwrap(); + } } From 693297276bfeb2bf2abc2f6f4f2ad5ab156ab60b Mon Sep 17 00:00:00 2001 From: fruzitent Date: Tue, 5 Nov 2024 05:11:32 +0200 Subject: [PATCH 05/21] feat(s3_sda/p01): read file in chunks --- s3_dsa/p01/Cargo.lock | 31 +++++++++++++++++++++++++++++++ s3_dsa/p01/Cargo.toml | 4 ++++ s3_dsa/p01/src/main.rs | 28 +++++++++++++++++++++++++++- s3_dsa/p01/src/sort.rs | 25 +++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 s3_dsa/p01/src/sort.rs diff --git a/s3_dsa/p01/Cargo.lock b/s3_dsa/p01/Cargo.lock index 01fd2e3..b42ba2a 100644 --- a/s3_dsa/p01/Cargo.lock +++ b/s3_dsa/p01/Cargo.lock @@ -2,6 +2,33 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + +[[package]] +name = "fern" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ff9c9d5fb3e6da8ac2f77ab76fe7e8087d512ce095200f8f29ac5b656cf6dc" +dependencies = [ + "log", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + [[package]] name = "nanorand" version = "0.7.0" @@ -12,5 +39,9 @@ checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" name = "p01" version = "0.1.0" dependencies = [ + "bytemuck", + "fern", + "humantime", + "log", "nanorand", ] diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml index d3a5046..15f671d 100644 --- a/s3_dsa/p01/Cargo.toml +++ b/s3_dsa/p01/Cargo.toml @@ -14,6 +14,10 @@ version = "0.1.0" [build-dependencies] [dependencies] +bytemuck = "1.19.0" +fern = "0.7.0" +humantime = "2.1.0" +log = "0.4.22" nanorand = "0.7.0" [features] diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index dc048f4..327b5ef 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -1,11 +1,37 @@ mod nacci; +mod sort; + +fn setup_logger() -> Result<(), fern::InitError> { + fern::Dispatch::new() + .format(|out, message, record| { + out.finish(format_args!( + "[{} {} {}:{}] {}", + humantime::format_rfc3339_seconds(std::time::SystemTime::now()), + record.level(), + record.file().unwrap(), + record.line().unwrap(), + message + )) + }) + .level(log::LevelFilter::Debug) + .chain(std::io::stdout()) + .apply()?; + Ok(()) +} + +fn main() -> Result<(), Box> { + setup_logger()?; -fn main() { let input_path = std::path::Path::new("./input.bin"); + let output_path = std::path::Path::new("./output.bin"); + if !input_path.exists() { let mut rng = nanorand::tls_rng(); let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); let mut input_file = std::fs::File::create(&input_path).unwrap(); std::io::Write::write_all(&mut input_file, &data).unwrap(); } + + sort::polyphase_merge_sort(input_path, output_path, 3); + Ok(()) } diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs new file mode 100644 index 0000000..cd4a825 --- /dev/null +++ b/s3_dsa/p01/src/sort.rs @@ -0,0 +1,25 @@ +const CHUNK_SIZE: usize = 4096; + +fn process_chunk(file: std::fs::File, chunk_size: usize, callback: fn(buffer: &[u8])) { + let mut reader = std::io::BufReader::with_capacity(chunk_size, file); + loop { + let mut buffer = vec![0; chunk_size].into_boxed_slice(); + let length = std::io::Read::read(&mut reader, &mut buffer).unwrap(); + if length == 0 { + break; + } + callback(&buffer[..length]); + } +} + +/// @see: https://en.wikipedia.org/wiki/Polyphase_merge_sort +pub fn polyphase_merge_sort(input_path: &std::path::Path, output_path: &std::path::Path, tape_count: usize) { + if tape_count >= 8 { + log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); + } + let input_file = std::fs::File::open(input_path).unwrap(); + process_chunk(input_file, CHUNK_SIZE, |buffer| { + let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); + println!("{data:?}"); + }) +} From 9cfd969ece85f4ebf17570c83f9c449b89540e7e Mon Sep 17 00:00:00 2001 From: fruzitent Date: Tue, 5 Nov 2024 06:11:11 +0200 Subject: [PATCH 06/21] fixup! feat(s3_sda/p01): read file in chunks --- s3_dsa/p01/src/sort.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index cd4a825..035d879 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -21,5 +21,5 @@ pub fn polyphase_merge_sort(input_path: &std::path::Path, output_path: &std::pat process_chunk(input_file, CHUNK_SIZE, |buffer| { let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); println!("{data:?}"); - }) + }); } From a07122599068f24d13c9f60b7a42f2fc955584ff Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 7 Nov 2024 14:46:31 +0200 Subject: [PATCH 07/21] feat(s3_dsa/p01): split in records --- s3_dsa/p01/src/sort.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 035d879..69926d3 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -1,6 +1,9 @@ const CHUNK_SIZE: usize = 4096; -fn process_chunk(file: std::fs::File, chunk_size: usize, callback: fn(buffer: &[u8])) { +fn process_file(file: std::fs::File, chunk_size: usize, mut callback: F) +where + F: FnMut(&[u8]), +{ let mut reader = std::io::BufReader::with_capacity(chunk_size, file); loop { let mut buffer = vec![0; chunk_size].into_boxed_slice(); @@ -12,14 +15,47 @@ fn process_chunk(file: std::fs::File, chunk_size: usize, callback: fn(buffer: &[ } } +fn process_chunk(runs: &mut Vec>, data: &[i32]) { + let mut run = runs.last_mut().unwrap(); + for &curr in data { + match run.last() { + Some(&prev) => { + if prev > curr { + run.push(curr); + } else { + runs.push(vec![curr]); + run = runs.last_mut().unwrap(); + } + } + None => { + run.push(curr); + } + } + } +} + /// @see: https://en.wikipedia.org/wiki/Polyphase_merge_sort pub fn polyphase_merge_sort(input_path: &std::path::Path, output_path: &std::path::Path, tape_count: usize) { if tape_count >= 8 { log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } + let mut runs: Vec> = vec![vec![]]; let input_file = std::fs::File::open(input_path).unwrap(); - process_chunk(input_file, CHUNK_SIZE, |buffer| { + process_file(input_file, CHUNK_SIZE, |buffer| { let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); - println!("{data:?}"); + process_chunk(&mut runs, data); }); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_records() { + let mut runs: Vec> = vec![vec![]]; + let data: &[i32] = &[5, 4, 3, 7, 6, 9]; + process_chunk(&mut runs, data); + assert_eq!(runs, vec![vec![5, 4, 3], vec![7, 6], vec![9]]); + } +} From 899713e0351a363f147164cc1330567d7fea28ca Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 7 Nov 2024 15:05:58 +0200 Subject: [PATCH 08/21] feat(s3_dsa/p01): add reverse flag --- s3_dsa/p01/src/main.rs | 2 +- s3_dsa/p01/src/sort.rs | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index 327b5ef..1385304 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -32,6 +32,6 @@ fn main() -> Result<(), Box> { std::io::Write::write_all(&mut input_file, &data).unwrap(); } - sort::polyphase_merge_sort(input_path, output_path, 3); + sort::polyphase_merge_sort(input_path, output_path, false, 3); Ok(()) } diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 69926d3..08359fe 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -1,5 +1,16 @@ const CHUNK_SIZE: usize = 4096; +fn comparator(a: T, b: T, reverse: bool) -> bool +where + T: Ord, +{ + if reverse { + a > b + } else { + a < b + } +} + fn process_file(file: std::fs::File, chunk_size: usize, mut callback: F) where F: FnMut(&[u8]), @@ -15,12 +26,12 @@ where } } -fn process_chunk(runs: &mut Vec>, data: &[i32]) { +fn process_chunk(runs: &mut Vec>, data: &[i32], reverse: bool) { let mut run = runs.last_mut().unwrap(); for &curr in data { match run.last() { Some(&prev) => { - if prev > curr { + if comparator(prev, curr, reverse) { run.push(curr); } else { runs.push(vec![curr]); @@ -35,7 +46,12 @@ fn process_chunk(runs: &mut Vec>, data: &[i32]) { } /// @see: https://en.wikipedia.org/wiki/Polyphase_merge_sort -pub fn polyphase_merge_sort(input_path: &std::path::Path, output_path: &std::path::Path, tape_count: usize) { +pub fn polyphase_merge_sort( + input_path: &std::path::Path, + output_path: &std::path::Path, + reverse: bool, + tape_count: usize, +) { if tape_count >= 8 { log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } @@ -43,7 +59,7 @@ pub fn polyphase_merge_sort(input_path: &std::path::Path, output_path: &std::pat let input_file = std::fs::File::open(input_path).unwrap(); process_file(input_file, CHUNK_SIZE, |buffer| { let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); - process_chunk(&mut runs, data); + process_chunk(&mut runs, data, reverse); }); } @@ -55,7 +71,7 @@ mod tests { fn get_records() { let mut runs: Vec> = vec![vec![]]; let data: &[i32] = &[5, 4, 3, 7, 6, 9]; - process_chunk(&mut runs, data); + process_chunk(&mut runs, data, true); assert_eq!(runs, vec![vec![5, 4, 3], vec![7, 6], vec![9]]); } } From e518949c1faee0664fa2abbc7fcde8c1970b851c Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 7 Nov 2024 15:35:46 +0200 Subject: [PATCH 09/21] refactor(s3_dsa/p01): replace .length with take() --- s3_dsa/p01/src/nacci.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/s3_dsa/p01/src/nacci.rs b/s3_dsa/p01/src/nacci.rs index 89378ae..fff709a 100644 --- a/s3_dsa/p01/src/nacci.rs +++ b/s3_dsa/p01/src/nacci.rs @@ -3,12 +3,11 @@ pub struct Nacci { // TODO: replace usize with T cache: Vec, index: usize, - length: usize, total: usize, } impl Nacci { - pub fn new(order: usize, length: usize) -> Option { + pub fn new(order: usize) -> Option { if order < 2 { // TODO: https://en.wikipedia.org/wiki/Negafibonacci_coding return None; @@ -18,7 +17,6 @@ impl Nacci { Some(Self { cache, index: 0, - length, total: 1, }) } @@ -35,10 +33,6 @@ impl Iterator for Nacci { } fn next(&mut self) -> Option { - if self.length == 0 { - return None; - } - self.length -= 1; let result = self.cache[self.index]; self.cache[self.index] = self.total; self.index = (self.index + 1) % self.cache.len(); @@ -53,19 +47,19 @@ mod tests { #[test] fn it_works() { - assert!(Nacci::new(1, 16).is_none()); + assert!(Nacci::new(1).is_none()); assert_eq!( - Nacci::new(2, 16).unwrap().collect::>(), + Nacci::new(2).unwrap().take(16).collect::>(), vec![0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610] ); assert_eq!( - Nacci::new(3, 16).unwrap().collect::>(), + Nacci::new(3).unwrap().take(16).collect::>(), vec![0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705] ); assert_eq!( - Nacci::new(4, 16).unwrap().collect::>(), + Nacci::new(4).unwrap().take(16).collect::>(), vec![0, 0, 0, 1, 1, 2, 4, 8, 15, 29, 56, 108, 208, 401, 773, 1490] ); - assert_eq!(Nacci::new(5, 0).unwrap().collect::>(), vec![]); + assert_eq!(Nacci::new(5).unwrap().take(0).collect::>(), vec![]); } } From 2272a58ff76894094e765844765a22fe513358b6 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 7 Nov 2024 17:42:32 +0200 Subject: [PATCH 10/21] feat(s3_dsa/p01): distribute nacci in tapes --- s3_dsa/p01/src/nacci.rs | 12 ++++++++++++ s3_dsa/p01/src/sort.rs | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/s3_dsa/p01/src/nacci.rs b/s3_dsa/p01/src/nacci.rs index fff709a..b23011e 100644 --- a/s3_dsa/p01/src/nacci.rs +++ b/s3_dsa/p01/src/nacci.rs @@ -41,6 +41,18 @@ impl Iterator for Nacci { } } +pub fn get_dist(length: usize, tape_count: usize) -> Vec { + let fib = Nacci::new(tape_count - 1).unwrap(); + let mut levels: Vec = vec![0; tape_count - 1]; + for (i, val) in fib.enumerate() { + levels[i % (tape_count - 1)] = val; + if levels.iter().sum::() >= length { + break; + } + } + levels +} + #[cfg(test)] mod tests { use super::*; diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 08359fe..a8581fe 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -1,3 +1,5 @@ +use crate::nacci; + const CHUNK_SIZE: usize = 4096; fn comparator(a: T, b: T, reverse: bool) -> bool @@ -56,11 +58,15 @@ pub fn polyphase_merge_sort( log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } let mut runs: Vec> = vec![vec![]]; + let input_file = std::fs::File::open(input_path).unwrap(); process_file(input_file, CHUNK_SIZE, |buffer| { let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); process_chunk(&mut runs, data, reverse); }); + + let dist = nacci::get_dist(runs.len(), tape_count); + println!("{dist:?}"); } #[cfg(test)] From 055d08d4c9963cfe64bc8960be754268b7b110cd Mon Sep 17 00:00:00 2001 From: fruzitent Date: Tue, 12 Nov 2024 02:58:23 +0200 Subject: [PATCH 11/21] chore: syntax changes --- s3_dsa/p01/src/main.rs | 4 ++-- s3_dsa/p01/src/sort.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index 1385304..8466b3b 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -28,8 +28,8 @@ fn main() -> Result<(), Box> { if !input_path.exists() { let mut rng = nanorand::tls_rng(); let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); - let mut input_file = std::fs::File::create(&input_path).unwrap(); - std::io::Write::write_all(&mut input_file, &data).unwrap(); + let mut input_file = std::fs::File::create(&input_path)?; + std::io::Write::write_all(&mut input_file, &data)?; } sort::polyphase_merge_sort(input_path, output_path, false, 3); diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index a8581fe..600d0fe 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -30,7 +30,7 @@ where fn process_chunk(runs: &mut Vec>, data: &[i32], reverse: bool) { let mut run = runs.last_mut().unwrap(); - for &curr in data { + for &curr in data.iter() { match run.last() { Some(&prev) => { if comparator(prev, curr, reverse) { From 386ba2a9e1efb44b0fee1fab9031906775939780 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 13 Nov 2024 11:32:13 +0200 Subject: [PATCH 12/21] feat(s3_dsa/p01): write series to tape --- s3_dsa/p01/src/sort.rs | 49 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 600d0fe..ce5177f 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -47,6 +47,25 @@ fn process_chunk(runs: &mut Vec>, data: &[i32], reverse: bool) { } } +type Tape = Vec>; + +fn write_to_tape(series: Tape, dist: &mut Vec, tapes: &mut Vec>) +where + T: Clone, +{ + let mut iter = series.iter(); + for (i, d) in dist.iter_mut().enumerate() { + while *d != 0 { + if let Some(s) = iter.next() { + tapes[i].push(s.clone()); + } else { + tapes[i].push(vec![]); + } + *d -= 1; + } + } +} + /// @see: https://en.wikipedia.org/wiki/Polyphase_merge_sort pub fn polyphase_merge_sort( input_path: &std::path::Path, @@ -57,16 +76,17 @@ pub fn polyphase_merge_sort( if tape_count >= 8 { log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } - let mut runs: Vec> = vec![vec![]]; + let mut series: Tape = vec![vec![]]; let input_file = std::fs::File::open(input_path).unwrap(); process_file(input_file, CHUNK_SIZE, |buffer| { let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); - process_chunk(&mut runs, data, reverse); + process_chunk(&mut series, data, reverse); }); - let dist = nacci::get_dist(runs.len(), tape_count); - println!("{dist:?}"); + let mut dist = nacci::get_dist(series.len(), tape_count); + let mut tapes: Vec> = vec![vec![]; tape_count]; + write_to_tape(series, &mut dist, &mut tapes); } #[cfg(test)] @@ -74,7 +94,26 @@ mod tests { use super::*; #[test] - fn get_records() { + fn fill_empty() { + let mut dist = vec![1, 2, 4]; + let series: Tape = vec![vec![6], vec![3, 20], vec![15], vec![13], vec![8, 10, 17], vec![1]]; + let tape_count: usize = 4; + + let mut tapes: Vec> = vec![vec![]; tape_count]; + write_to_tape(series, &mut dist, &mut tapes); + assert_eq!( + tapes, + vec![ + vec![vec![6]], + vec![vec![3, 20], vec![15]], + vec![vec![13], vec![8, 10, 17], vec![1], vec![]], + vec![], + ] + ); + } + + #[test] + fn get_series() { let mut runs: Vec> = vec![vec![]]; let data: &[i32] = &[5, 4, 3, 7, 6, 9]; process_chunk(&mut runs, data, true); From 255cb105c1a0d6ebd5d305d82a3e3401e4ff40c8 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 13 Nov 2024 11:56:14 +0200 Subject: [PATCH 13/21] chore(s3_dsa/p01): add debug info --- s3_dsa/p01/src/sort.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index ce5177f..9c7dcc6 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -83,10 +83,14 @@ pub fn polyphase_merge_sort( let data: &[i32] = bytemuck::try_cast_slice(buffer).unwrap(); process_chunk(&mut series, data, reverse); }); + log::debug!("series={series:?}"); let mut dist = nacci::get_dist(series.len(), tape_count); + log::debug!("dist={dist:?}"); + let mut tapes: Vec> = vec![vec![]; tape_count]; write_to_tape(series, &mut dist, &mut tapes); + log::debug!("tapes={tapes:?}"); } #[cfg(test)] From bed329101ff5d5cd0517e2dcc6dd4c63ebbbf917 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 13 Nov 2024 14:54:39 +0200 Subject: [PATCH 14/21] refactor(s3_dsa/p01): add init_merge feature --- s3_dsa/p01/Cargo.toml | 1 + s3_dsa/p01/src/sort.rs | 28 ++++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml index 15f671d..e5b45b2 100644 --- a/s3_dsa/p01/Cargo.toml +++ b/s3_dsa/p01/Cargo.toml @@ -21,3 +21,4 @@ log = "0.4.22" nanorand = "0.7.0" [features] +init_merge = [] diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 9c7dcc6..d52edd2 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -29,8 +29,15 @@ where } fn process_chunk(runs: &mut Vec>, data: &[i32], reverse: bool) { + #[cfg(feature = "init_merge")] let mut run = runs.last_mut().unwrap(); + for &curr in data.iter() { + #[cfg(not(feature = "init_merge"))] + // TODO: unused variable: reverse + runs.push(vec![curr]); + + #[cfg(feature = "init_merge")] match run.last() { Some(&prev) => { if comparator(prev, curr, reverse) { @@ -76,7 +83,11 @@ pub fn polyphase_merge_sort( if tape_count >= 8 { log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } - let mut series: Tape = vec![vec![]]; + + let mut series: Tape = vec![ + #[cfg(feature = "init_merge")] + vec![], + ]; let input_file = std::fs::File::open(input_path).unwrap(); process_file(input_file, CHUNK_SIZE, |buffer| { @@ -118,9 +129,18 @@ mod tests { #[test] fn get_series() { - let mut runs: Vec> = vec![vec![]]; + let mut series: Tape = vec![ + #[cfg(feature = "init_merge")] + vec![], + ]; + let data: &[i32] = &[5, 4, 3, 7, 6, 9]; - process_chunk(&mut runs, data, true); - assert_eq!(runs, vec![vec![5, 4, 3], vec![7, 6], vec![9]]); + process_chunk(&mut series, data, true); + + #[cfg(feature = "init_merge")] + assert_eq!(series, vec![vec![5, 4, 3], vec![7, 6], vec![9]]); + + #[cfg(not(feature = "init_merge"))] + assert_eq!(series, vec![vec![5], vec![4], vec![3], vec![7], vec![6], vec![9]]); } } From 6b374c70c1c915e45a3462c0f2843b1104484cb5 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 13 Nov 2024 14:57:44 +0200 Subject: [PATCH 15/21] chore(s3_dsa/p01): fix clippy warnings --- s3_dsa/p01/src/main.rs | 2 +- s3_dsa/p01/src/sort.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/main.rs index 8466b3b..1a4688d 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/main.rs @@ -28,7 +28,7 @@ fn main() -> Result<(), Box> { if !input_path.exists() { let mut rng = nanorand::tls_rng(); let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); - let mut input_file = std::fs::File::create(&input_path)?; + let mut input_file = std::fs::File::create(input_path)?; std::io::Write::write_all(&mut input_file, &data)?; } diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index d52edd2..6091d3c 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -56,7 +56,7 @@ fn process_chunk(runs: &mut Vec>, data: &[i32], reverse: bool) { type Tape = Vec>; -fn write_to_tape(series: Tape, dist: &mut Vec, tapes: &mut Vec>) +fn write_to_tape(series: Tape, dist: &mut [usize], tapes: &mut [Tape]) where T: Clone, { From 0d800f5d221a813ec6c24763d7212824f59f5600 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 13 Nov 2024 15:28:48 +0200 Subject: [PATCH 16/21] fixup! feat(s3_dsa/p01): write series to tape --- s3_dsa/p01/src/sort.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 6091d3c..04e75fe 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -109,7 +109,7 @@ mod tests { use super::*; #[test] - fn fill_empty() { + fn add_dummy_series() { let mut dist = vec![1, 2, 4]; let series: Tape = vec![vec![6], vec![3, 20], vec![15], vec![13], vec![8, 10, 17], vec![1]]; let tape_count: usize = 4; From fb1cc0d735de7a545016496657c05a12e4f74064 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 14 Nov 2024 12:41:39 +0200 Subject: [PATCH 17/21] fixup! feat(s3_dsa/p01): write series to tape --- s3_dsa/p01/src/sort.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/sort.rs index 04e75fe..0fa4a0c 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/sort.rs @@ -61,14 +61,14 @@ where T: Clone, { let mut iter = series.iter(); - for (i, d) in dist.iter_mut().enumerate() { - while *d != 0 { + for (i, fib) in dist.iter_mut().enumerate() { + while *fib != 0 { if let Some(s) = iter.next() { tapes[i].push(s.clone()); } else { tapes[i].push(vec![]); } - *d -= 1; + *fib -= 1; } } } From 79e1674666bcc33342d5a0f9a8e42ade0b75db0e Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 14 Nov 2024 12:42:11 +0200 Subject: [PATCH 18/21] fixup! chore(s3_dsa/p01): add debug info --- s3_dsa/p01/src/nacci.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/s3_dsa/p01/src/nacci.rs b/s3_dsa/p01/src/nacci.rs index b23011e..af81633 100644 --- a/s3_dsa/p01/src/nacci.rs +++ b/s3_dsa/p01/src/nacci.rs @@ -46,7 +46,9 @@ pub fn get_dist(length: usize, tape_count: usize) -> Vec { let mut levels: Vec = vec![0; tape_count - 1]; for (i, val) in fib.enumerate() { levels[i % (tape_count - 1)] = val; - if levels.iter().sum::() >= length { + let total: usize = levels.iter().sum(); + log::debug!("i={i:?}, val={val:?}, levels={levels:?}, total={total:?}", i = i + 1); + if total >= length { break; } } From 3e899c4cf82a698d60b2e4a0f10366c0bf9bbcbc Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 14 Nov 2024 17:04:50 +0200 Subject: [PATCH 19/21] refactor(s3_dsa/p01): split in packages --- s3_dsa/p01/Cargo.lock | 26 +++++++++++++++-- s3_dsa/p01/Cargo.toml | 29 +++++++++---------- s3_dsa/p01/src/bin/gen/Cargo.toml | 21 ++++++++++++++ s3_dsa/p01/src/bin/gen/src/main.rs | 7 +++++ s3_dsa/p01/src/bin/sort/Cargo.toml | 24 +++++++++++++++ s3_dsa/p01/src/{ => bin/sort/src}/main.rs | 19 ++---------- s3_dsa/p01/src/lib/nacci/Cargo.toml | 21 ++++++++++++++ .../src/{nacci.rs => lib/nacci/src/lib.rs} | 3 +- s3_dsa/p01/src/lib/polyphase/Cargo.toml | 23 +++++++++++++++ .../src/{sort.rs => lib/polyphase/src/lib.rs} | 9 +----- 10 files changed, 140 insertions(+), 42 deletions(-) create mode 100644 s3_dsa/p01/src/bin/gen/Cargo.toml create mode 100644 s3_dsa/p01/src/bin/gen/src/main.rs create mode 100644 s3_dsa/p01/src/bin/sort/Cargo.toml rename s3_dsa/p01/src/{ => bin/sort/src}/main.rs (57%) create mode 100644 s3_dsa/p01/src/lib/nacci/Cargo.toml rename s3_dsa/p01/src/{nacci.rs => lib/nacci/src/lib.rs} (97%) create mode 100644 s3_dsa/p01/src/lib/polyphase/Cargo.toml rename s3_dsa/p01/src/{sort.rs => lib/polyphase/src/lib.rs} (95%) diff --git a/s3_dsa/p01/Cargo.lock b/s3_dsa/p01/Cargo.lock index b42ba2a..54f07f9 100644 --- a/s3_dsa/p01/Cargo.lock +++ b/s3_dsa/p01/Cargo.lock @@ -17,6 +17,13 @@ dependencies = [ "log", ] +[[package]] +name = "gen" +version = "0.1.0" +dependencies = [ + "nanorand", +] + [[package]] name = "humantime" version = "2.1.0" @@ -29,6 +36,13 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "nacci" +version = "0.1.0" +dependencies = [ + "log", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -36,12 +50,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" [[package]] -name = "p01" +name = "polyphase" version = "0.1.0" dependencies = [ "bytemuck", + "log", + "nacci", +] + +[[package]] +name = "sort" +version = "0.1.0" +dependencies = [ "fern", "humantime", "log", - "nanorand", + "polyphase", ] diff --git a/s3_dsa/p01/Cargo.toml b/s3_dsa/p01/Cargo.toml index e5b45b2..d627abf 100644 --- a/s3_dsa/p01/Cargo.toml +++ b/s3_dsa/p01/Cargo.toml @@ -1,24 +1,23 @@ #:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json # @help: https://doc.rust-lang.org/cargo/reference/manifest.html -[package] +[workspace] +default-members = ["./src/bin/sort/"] +members = [ + "./src/bin/gen/", + "./src/bin/sort/", + "./src/lib/nacci/", + "./src/lib/polyphase/", +] +resolver = "2" + +[workspace.dependencies] +log = "0.4.22" + +[workspace.package] authors = ["fruzitent "] description = "s3_dsa/p01" edition = "2021" license-file = "license.md" -name = "p01" readme = "readme.md" repository = "git+https://github.com/fruzitent/kpi.git" -version = "0.1.0" - -[build-dependencies] - -[dependencies] -bytemuck = "1.19.0" -fern = "0.7.0" -humantime = "2.1.0" -log = "0.4.22" -nanorand = "0.7.0" - -[features] -init_merge = [] diff --git a/s3_dsa/p01/src/bin/gen/Cargo.toml b/s3_dsa/p01/src/bin/gen/Cargo.toml new file mode 100644 index 0000000..2567458 --- /dev/null +++ b/s3_dsa/p01/src/bin/gen/Cargo.toml @@ -0,0 +1,21 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json +# @help: https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] + +[dependencies] +nanorand = "0.7.0" + +[dev-dependencies] + +[features] + +[package] +authors.workspace = true +description.workspace = true +edition.workspace = true +license-file.workspace = true +name = "gen" +readme.workspace = true +repository.workspace = true +version = "0.1.0" diff --git a/s3_dsa/p01/src/bin/gen/src/main.rs b/s3_dsa/p01/src/bin/gen/src/main.rs new file mode 100644 index 0000000..ae162dc --- /dev/null +++ b/s3_dsa/p01/src/bin/gen/src/main.rs @@ -0,0 +1,7 @@ +fn main() { + let input_path = std::path::Path::new("./input.bin"); + let mut rng = nanorand::tls_rng(); + let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); + let mut input_file = std::fs::File::create(input_path).unwrap(); + std::io::Write::write_all(&mut input_file, &data).unwrap(); +} diff --git a/s3_dsa/p01/src/bin/sort/Cargo.toml b/s3_dsa/p01/src/bin/sort/Cargo.toml new file mode 100644 index 0000000..58dc07b --- /dev/null +++ b/s3_dsa/p01/src/bin/sort/Cargo.toml @@ -0,0 +1,24 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json +# @help: https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] + +[dependencies] +fern = "0.7.0" +humantime = "2.1.0" +log.workspace = true +polyphase = { path = "../../lib/polyphase/" } + +[dev-dependencies] + +[features] + +[package] +authors.workspace = true +description.workspace = true +edition.workspace = true +license-file.workspace = true +name = "sort" +readme.workspace = true +repository.workspace = true +version = "0.1.0" diff --git a/s3_dsa/p01/src/main.rs b/s3_dsa/p01/src/bin/sort/src/main.rs similarity index 57% rename from s3_dsa/p01/src/main.rs rename to s3_dsa/p01/src/bin/sort/src/main.rs index 1a4688d..0801382 100644 --- a/s3_dsa/p01/src/main.rs +++ b/s3_dsa/p01/src/bin/sort/src/main.rs @@ -1,6 +1,3 @@ -mod nacci; -mod sort; - fn setup_logger() -> Result<(), fern::InitError> { fern::Dispatch::new() .format(|out, message, record| { @@ -19,19 +16,9 @@ fn setup_logger() -> Result<(), fern::InitError> { Ok(()) } -fn main() -> Result<(), Box> { - setup_logger()?; - +fn main() { + setup_logger().unwrap(); let input_path = std::path::Path::new("./input.bin"); let output_path = std::path::Path::new("./output.bin"); - - if !input_path.exists() { - let mut rng = nanorand::tls_rng(); - let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); - let mut input_file = std::fs::File::create(input_path)?; - std::io::Write::write_all(&mut input_file, &data)?; - } - - sort::polyphase_merge_sort(input_path, output_path, false, 3); - Ok(()) + polyphase::sort(input_path, output_path, false, 3); } diff --git a/s3_dsa/p01/src/lib/nacci/Cargo.toml b/s3_dsa/p01/src/lib/nacci/Cargo.toml new file mode 100644 index 0000000..d8f0d95 --- /dev/null +++ b/s3_dsa/p01/src/lib/nacci/Cargo.toml @@ -0,0 +1,21 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json +# @help: https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] + +[dependencies] +log.workspace = true + +[dev-dependencies] + +[features] + +[package] +authors.workspace = true +description.workspace = true +edition.workspace = true +license-file.workspace = true +name = "nacci" +readme.workspace = true +repository.workspace = true +version = "0.1.0" diff --git a/s3_dsa/p01/src/nacci.rs b/s3_dsa/p01/src/lib/nacci/src/lib.rs similarity index 97% rename from s3_dsa/p01/src/nacci.rs rename to s3_dsa/p01/src/lib/nacci/src/lib.rs index af81633..3957279 100644 --- a/s3_dsa/p01/src/nacci.rs +++ b/s3_dsa/p01/src/lib/nacci/src/lib.rs @@ -25,8 +25,9 @@ impl Nacci { impl Iterator for Nacci { type Item = usize; - fn collect>(self) -> B + fn collect(self) -> B where + B: FromIterator, Self: Sized, { FromIterator::from_iter(self) diff --git a/s3_dsa/p01/src/lib/polyphase/Cargo.toml b/s3_dsa/p01/src/lib/polyphase/Cargo.toml new file mode 100644 index 0000000..9ba5e78 --- /dev/null +++ b/s3_dsa/p01/src/lib/polyphase/Cargo.toml @@ -0,0 +1,23 @@ +#:schema https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/cargo.json +# @help: https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] + +[dependencies] +bytemuck = "1.19.0" +log.workspace = true +nacci = { path = "../nacci/" } + +[dev-dependencies] + +[features] + +[package] +authors.workspace = true +description.workspace = true +edition.workspace = true +license-file.workspace = true +name = "polyphase" +readme.workspace = true +repository.workspace = true +version = "0.1.0" diff --git a/s3_dsa/p01/src/sort.rs b/s3_dsa/p01/src/lib/polyphase/src/lib.rs similarity index 95% rename from s3_dsa/p01/src/sort.rs rename to s3_dsa/p01/src/lib/polyphase/src/lib.rs index 0fa4a0c..f417ef2 100644 --- a/s3_dsa/p01/src/sort.rs +++ b/s3_dsa/p01/src/lib/polyphase/src/lib.rs @@ -1,5 +1,3 @@ -use crate::nacci; - const CHUNK_SIZE: usize = 4096; fn comparator(a: T, b: T, reverse: bool) -> bool @@ -74,12 +72,7 @@ where } /// @see: https://en.wikipedia.org/wiki/Polyphase_merge_sort -pub fn polyphase_merge_sort( - input_path: &std::path::Path, - output_path: &std::path::Path, - reverse: bool, - tape_count: usize, -) { +pub fn sort(input_path: &std::path::Path, output_path: &std::path::Path, reverse: bool, tape_count: usize) { if tape_count >= 8 { log::warn!("balanced_merge_sort() may perform better at 8 or more tapes"); } From d26d6bf1b33ad0ed6333ad714bd8d66bf0d76012 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 14 Nov 2024 21:05:41 +0200 Subject: [PATCH 20/21] refactor(s3_dsa/p01): replace map with fill_bytes --- s3_dsa/p01/src/bin/gen/src/main.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/s3_dsa/p01/src/bin/gen/src/main.rs b/s3_dsa/p01/src/bin/gen/src/main.rs index ae162dc..deafbac 100644 --- a/s3_dsa/p01/src/bin/gen/src/main.rs +++ b/s3_dsa/p01/src/bin/gen/src/main.rs @@ -1,7 +1,11 @@ fn main() { - let input_path = std::path::Path::new("./input.bin"); + let path = std::path::Path::new("./input.bin"); + let size = usize::pow(2, 30); + + let mut data = vec![0; size]; let mut rng = nanorand::tls_rng(); - let data: Vec = (0..2u32.pow(8)).map(|_| nanorand::Rng::generate(&mut rng)).collect(); - let mut input_file = std::fs::File::create(input_path).unwrap(); - std::io::Write::write_all(&mut input_file, &data).unwrap(); + nanorand::Rng::fill_bytes(&mut rng, &mut data); + + let mut file = std::fs::File::create(path).unwrap(); + std::io::Write::write_all(&mut file, &data).unwrap(); } From 076f3a6e177b1efe0b5018e095de4041a0420b33 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Thu, 14 Nov 2024 21:28:06 +0200 Subject: [PATCH 21/21] fixup! refactor(s3_dsa/p01): split in packages --- s3_dsa/p01/src/lib/polyphase/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/s3_dsa/p01/src/lib/polyphase/Cargo.toml b/s3_dsa/p01/src/lib/polyphase/Cargo.toml index 9ba5e78..cc0becb 100644 --- a/s3_dsa/p01/src/lib/polyphase/Cargo.toml +++ b/s3_dsa/p01/src/lib/polyphase/Cargo.toml @@ -11,6 +11,7 @@ nacci = { path = "../nacci/" } [dev-dependencies] [features] +init_merge = [] [package] authors.workspace = true