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",
]
[[package]]
name = "itoa"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]]
name = "libc"
version = "0.2.153"
@ -31,6 +37,24 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "rand"
version = "0.8.5"
@ -61,13 +85,69 @@ dependencies = [
"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]]
name = "traktor"
version = "0.1.0"
dependencies = [
"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]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"

View file

@ -7,3 +7,5 @@ edition = "2021"
[dependencies]
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::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 {
value: u32,
}
@ -12,7 +16,7 @@ impl Point {
}
}
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Serialize)]
struct ClusterGapInfo {
span_length: f32, // Full span length
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<()> {
let filename = "random_values.txt";
let dataset = load_dataset(filename)?;
let args: Vec<String> = env::args().collect();
if args.len() < 4 {
eprintln!("Usage: {} <filename> <factor> <min_cluster_size>", args[0]);
process::exit(1);
}
let factor = 3.8;
let min_cluster_size = 7;
let filename = &args[1];
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);
@ -159,12 +169,11 @@ fn main() -> io::Result<()> {
}
}
// Output results with distinction between clusters and gaps
for (index, info) in cluster_gap_infos.iter().enumerate() {
let element_type = if info.num_elements > 0 { "Cluster" } else { "Gap" };
println!("Num Elements: {}, Centroid: {:.2}, Z-Score: {:.2}, Span: {:.2}, ",
info.num_elements, info.centroid, info.z_score.unwrap_or(0.0), info.span_length);
}
// Convert cluster_gap_infos to JSON
let json = serde_json::to_string_pretty(&cluster_gap_infos).expect("Failed to serialize to JSON");
// Output the JSON string
println!("{}", json);
Ok(())
}
}