add initial zad3

This commit is contained in:
jacekpoz 2024-05-09 02:53:08 +02:00
parent e791acc2fe
commit 772d49043d
Signed by: poz
SSH key fingerprint: SHA256:JyLeVWE4bF3tDnFeUpUaJsPsNlJyBldDGV/dIKSLyN8
16 changed files with 553 additions and 0 deletions

2
lab3/zad3/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
target/
results/

293
lab3/zad3/Cargo.lock generated Normal file
View file

@ -0,0 +1,293 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "autocfg"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "bitflags"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossbeam-deque"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
[[package]]
name = "dashmap"
version = "5.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
dependencies = [
"cfg-if",
"hashbrown",
"lock_api",
"once_cell",
"parking_lot_core",
]
[[package]]
name = "either"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
[[package]]
name = "getrandom"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "libc"
version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libgen"
version = "0.1.0"
dependencies = [
"rand",
]
[[package]]
name = "libselect"
version = "0.1.0"
dependencies = [
"libsort",
"rand",
]
[[package]]
name = "libsort"
version = "0.1.0"
[[package]]
name = "lock_api"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]]
name = "once_cell"
version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "parking_lot_core"
version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-targets",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "redox_syscall"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
dependencies = [
"bitflags",
]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "smallvec"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "windows-targets"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
[[package]]
name = "windows_i686_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
[[package]]
name = "windows_i686_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
[[package]]
name = "zad2"
version = "0.1.0"
dependencies = [
"dashmap",
"libgen",
"libselect",
"rayon",
]

10
lab3/zad3/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "zad2"
version = "0.1.0"
edition = "2021"
[dependencies]
libgen = { path = "../../libgen" }
libselect = { path = "../../libselect" }
rayon = "1.10.0"
dashmap = "5.5.3"

14
lab3/zad3/gnuplot/comp.gp Normal file
View file

@ -0,0 +1,14 @@
set title "Average comparisons, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average comparisons"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:2 t "Select 3", \
"" using 1:5 t "Select 5", \
"" using 1:8 t "Select 7", \
"" using 1:11 t "Select 9"
# vim: ft=gnuplot

View file

@ -0,0 +1,14 @@
set title "Average comparisons / n, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average comparisons / n"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:14 t "Select 3", \
"" using 1:17 t "Select 5", \
"" using 1:20 t "Select 7", \
"" using 1:23 t "Select 9"
# vim: ft=gnuplot

14
lab3/zad3/gnuplot/swap.gp Normal file
View file

@ -0,0 +1,14 @@
set title "Average swaps, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average swaps"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:3 t "Select 3", \
"" using 1:6 t "Select 5", \
"" using 1:9 t "Select 7", \
"" using 1:12 t "Select 9"
# vim: ft=gnuplot

View file

@ -0,0 +1,14 @@
set title "Average swaps / n, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average swaps / n"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:15 t "Select 3", \
"" using 1:18 t "Select 5", \
"" using 1:21 t "Select 7", \
"" using 1:24 t "Select 9"
# vim: ft=gnuplot

14
lab3/zad3/gnuplot/time.gp Normal file
View file

@ -0,0 +1,14 @@
set title "Average time, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average time"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:4 t "Select 3", \
"" using 1:7 t "Select 5", \
"" using 1:10 t "Select 7", \
"" using 1:13 t "Select 9"
# vim: ft=gnuplot

View file

@ -0,0 +1,14 @@
set title "Average time / n, n ∈ {100, 200, ..., 50000}"
set style data lines
set xlabel "n"
set ylabel "Average time / n"
set term pdfcairo font "JetBrainsMono-NF,12"
plot "./results/result" \
using 1:16 t "Select 3", \
"" using 1:19 t "Select 5", \
"" using 1:22 t "Select 7", \
"" using 1:25 t "Select 9"
# vim: ft=gnuplot

BIN
lab3/zad3/plots/comp.pdf Normal file

Binary file not shown.

BIN
lab3/zad3/plots/comp_n.pdf Normal file

Binary file not shown.

BIN
lab3/zad3/plots/swap.pdf Normal file

Binary file not shown.

BIN
lab3/zad3/plots/swap_n.pdf Normal file

Binary file not shown.

BIN
lab3/zad3/plots/time.pdf Normal file

Binary file not shown.

BIN
lab3/zad3/plots/time_n.pdf Normal file

Binary file not shown.

164
lab3/zad3/src/main.rs Normal file
View file

@ -0,0 +1,164 @@
use std::{fs::{self, OpenOptions}, io::{self, Write}, sync::Arc, time::SystemTime};
use dashmap::DashMap;
use libgen::gen_rand;
use libselect::normal_select::NormalSelect;
use libselect::Select;
use rayon::{current_thread_index, iter::{IntoParallelIterator, ParallelIterator}};
fn comp_avg(results_map: &DashMap<u64, Vec<(u64, u64, u128)>>) -> DashMap<u64, f64> {
results_map.iter()
.map(|ref_multi| {
let (i, results) = ref_multi.pair();
(*i, (results.iter()
.map(|res| res.0)
.sum::<u64>() as f64 / results.len() as f64))
}
)
.collect()
}
fn swap_avg(results_map: &DashMap<u64, Vec<(u64, u64, u128)>>) -> DashMap<u64, f64> {
results_map.iter()
.map(|ref_multi| {
let (i, results) = ref_multi.pair();
(*i, (results.iter()
.map(|res| res.1)
.sum::<u64>() as f64 / results.len() as f64))
}
)
.collect()
}
fn time_avg(results_map: &DashMap<u64, Vec<(u64, u64, u128)>>) -> DashMap<u64, f64> {
results_map.iter()
.map(|ref_multi| {
let (i, results) = ref_multi.pair();
(*i, (results.iter()
.map(|res| res.2)
.sum::<u128>() as f64 / results.len() as f64))
}
)
.collect()
}
fn main() -> io::Result<()> {
let m = 50;
let select_3_results: Arc<DashMap<u64, Vec<(u64, u64, u128)>>> = Arc::new(DashMap::new());
let select_5_results: Arc<DashMap<u64, Vec<(u64, u64, u128)>>> = Arc::new(DashMap::new());
let select_7_results: Arc<DashMap<u64, Vec<(u64, u64, u128)>>> = Arc::new(DashMap::new());
let select_9_results: Arc<DashMap<u64, Vec<(u64, u64, u128)>>> = Arc::new(DashMap::new());
let select_3_results_clone = Arc::clone(&select_3_results);
let select_5_results_clone = Arc::clone(&select_5_results);
let select_7_results_clone = Arc::clone(&select_7_results);
let select_9_results_clone = Arc::clone(&select_9_results);
(100u64..=50000u64).step_by(100).collect::<Vec<_>>().into_par_iter().for_each(move |n| {
if select_3_results_clone.get(&n).is_some() {
return;
}
if select_5_results_clone.get(&n).is_some() {
return;
}
if select_7_results_clone.get(&n).is_some() {
return;
}
if select_9_results_clone.get(&n).is_some() {
return;
}
println!("{}: starting n: {n}", current_thread_index().unwrap());
let input = gen_rand(n);
select_3_results_clone.insert(n, vec![]);
select_5_results_clone.insert(n, vec![]);
select_7_results_clone.insert(n, vec![]);
select_9_results_clone.insert(n, vec![]);
let mut select_3 = NormalSelect::new(false);
let mut select_5 = NormalSelect::new(false);
let mut select_7 = NormalSelect::new(false);
let mut select_9 = NormalSelect::new(false);
let k = n as usize / 2;
for _ in 0..m {
_ = std::io::stdout().flush();
let time_3 = SystemTime::now();
select_3.select_k(&input, k, 3);
let time_3 = time_3.elapsed().unwrap().as_millis();
let time_5 = SystemTime::now();
select_5.select_k(&input, k, 5);
let time_5 = time_5.elapsed().unwrap().as_millis();
let time_7 = SystemTime::now();
select_7.select_k(&input, k, 7);
let time_7 = time_7.elapsed().unwrap().as_millis();
let time_9 = SystemTime::now();
select_9.select_k(&input, k, 9);
let time_9 = time_9.elapsed().unwrap().as_millis();
select_3_results_clone.get_mut(&n).unwrap().push((select_3.num_comp(), select_3.num_swap(), time_3));
select_5_results_clone.get_mut(&n).unwrap().push((select_5.num_comp(), select_5.num_swap(), time_5));
select_7_results_clone.get_mut(&n).unwrap().push((select_7.num_comp(), select_7.num_swap(), time_7));
select_9_results_clone.get_mut(&n).unwrap().push((select_9.num_comp(), select_9.num_swap(), time_9));
}
println!("{}: finished n: {n}", current_thread_index().unwrap());
});
let select_3_comp_averages = comp_avg(&select_3_results);
let select_3_swap_averages = swap_avg(&select_3_results);
let select_3_time_averages = time_avg(&select_3_results);
let select_5_comp_averages = comp_avg(&select_5_results);
let select_5_swap_averages = swap_avg(&select_5_results);
let select_5_time_averages = time_avg(&select_5_results);
let select_7_comp_averages = comp_avg(&select_7_results);
let select_7_swap_averages = swap_avg(&select_7_results);
let select_7_time_averages = time_avg(&select_7_results);
let select_9_comp_averages = comp_avg(&select_9_results);
let select_9_swap_averages = swap_avg(&select_9_results);
let select_9_time_averages = time_avg(&select_9_results);
_ = fs::create_dir_all("./results");
let mut results_file = OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(format!("./results/result"))?;
for n in (100..=50000).step_by(100) {
writeln!(results_file, "{n} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}",
select_3_comp_averages.get(&n).unwrap().value(),
select_3_swap_averages.get(&n).unwrap().value(),
select_3_time_averages.get(&n).unwrap().value(),
select_5_comp_averages.get(&n).unwrap().value(),
select_5_swap_averages.get(&n).unwrap().value(),
select_5_time_averages.get(&n).unwrap().value(),
select_7_comp_averages.get(&n).unwrap().value(),
select_7_swap_averages.get(&n).unwrap().value(),
select_7_time_averages.get(&n).unwrap().value(),
select_9_comp_averages.get(&n).unwrap().value(),
select_9_swap_averages.get(&n).unwrap().value(),
select_9_time_averages.get(&n).unwrap().value(),
select_3_comp_averages.get(&n).unwrap().value() / n as f64,
select_3_swap_averages.get(&n).unwrap().value() / n as f64,
select_3_time_averages.get(&n).unwrap().value() / n as f64,
select_5_comp_averages.get(&n).unwrap().value() / n as f64,
select_5_swap_averages.get(&n).unwrap().value() / n as f64,
select_5_time_averages.get(&n).unwrap().value() / n as f64,
select_7_comp_averages.get(&n).unwrap().value() / n as f64,
select_7_swap_averages.get(&n).unwrap().value() / n as f64,
select_7_time_averages.get(&n).unwrap().value() / n as f64,
select_9_comp_averages.get(&n).unwrap().value() / n as f64,
select_9_swap_averages.get(&n).unwrap().value() / n as f64,
select_9_time_averages.get(&n).unwrap().value() / n as f64,
)?;
}
Ok(())
}