From 7ad1f49dc8c9d8bd6cf4a1b16970ec6dcf7b3423 Mon Sep 17 00:00:00 2001 From: randogoth Date: Sat, 10 Feb 2024 19:58:33 +0200 Subject: [PATCH] CLI --- Cargo.lock | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/main.rs | 35 ++++++++++++++--------- 3 files changed, 104 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f3141f..fcdc14a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 5f7d897..ab22e63 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" [dependencies] rand = "0.8.5" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" diff --git a/src/main.rs b/src/main.rs index ffb9a0d..a4e1706 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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 { } fn main() -> io::Result<()> { - let filename = "random_values.txt"; - let dataset = load_dataset(filename)?; + let args: Vec = env::args().collect(); + if args.len() < 4 { + eprintln!("Usage: {} ", 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(()) -} +} \ No newline at end of file