This commit is contained in:
randogoth 2024-02-10 19:58:33 +02:00
parent 74a276216d
commit 7ad1f49dc8
3 changed files with 104 additions and 13 deletions

80
Cargo.lock generated
View file

@ -19,6 +19,12 @@ dependencies = [
"wasi", "wasi",
] ]
[[package]]
name = "itoa"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.153" version = "0.2.153"
@ -31,6 +37,24 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.8.5" version = "0.8.5"
@ -61,13 +85,69 @@ dependencies = [
"getrandom", "getrandom",
] ]
[[package]]
name = "ryu"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
[[package]]
name = "serde"
version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.113"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]] [[package]]
name = "traktor" name = "traktor"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"rand", "rand",
"serde",
"serde_json",
] ]
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.11.0+wasi-snapshot-preview1"

View file

@ -7,3 +7,5 @@ edition = "2021"
[dependencies] [dependencies]
rand = "0.8.5" rand = "0.8.5"
serde = { version = "1.0.196", features = ["derive"] }
serde_json = "1.0.113"

View file

@ -1,7 +1,11 @@
use std::fs::File; use std::fs::File;
use std::io::{self, BufRead, BufReader}; use std::io::{self, BufRead, BufReader};
use std::env;
use std::process;
use serde::Serialize;
use serde_json;
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
struct Point { struct Point {
value: u32, value: u32,
} }
@ -12,7 +16,7 @@ impl Point {
} }
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, Serialize)]
struct ClusterGapInfo { struct ClusterGapInfo {
span_length: f32, // Full span length span_length: f32, // Full span length
num_elements: usize, // Number of elements, 0 for gaps num_elements: usize, // Number of elements, 0 for gaps
@ -132,11 +136,17 @@ fn calculate_z_scores(densities: &[f32], mean: f32, std_dev: f32) -> Vec<f32> {
} }
fn main() -> io::Result<()> { fn main() -> io::Result<()> {
let filename = "random_values.txt"; let args: Vec<String> = env::args().collect();
let dataset = load_dataset(filename)?; if args.len() < 4 {
eprintln!("Usage: {} <filename> <factor> <min_cluster_size>", args[0]);
process::exit(1);
}
let factor = 3.8; let filename = &args[1];
let min_cluster_size = 7; let factor: f32 = args[2].parse().expect("Factor must be a float");
let min_cluster_size: usize = args[3].parse().expect("Min cluster size must be an integer");
let dataset = load_dataset(filename)?;
let mut cluster_gap_infos = calculate_densities_and_gaps(&dataset, factor, min_cluster_size); let mut cluster_gap_infos = calculate_densities_and_gaps(&dataset, factor, min_cluster_size);
@ -159,12 +169,11 @@ fn main() -> io::Result<()> {
} }
} }
// Output results with distinction between clusters and gaps // Convert cluster_gap_infos to JSON
for (index, info) in cluster_gap_infos.iter().enumerate() { let json = serde_json::to_string_pretty(&cluster_gap_infos).expect("Failed to serialize to JSON");
let element_type = if info.num_elements > 0 { "Cluster" } else { "Gap" };
println!("Num Elements: {}, Centroid: {:.2}, Z-Score: {:.2}, Span: {:.2}, ", // Output the JSON string
info.num_elements, info.centroid, info.z_score.unwrap_or(0.0), info.span_length); println!("{}", json);
}
Ok(()) Ok(())
} }