From 8d853eba29b4ab8fb76d6c4268896e4e04d6398b Mon Sep 17 00:00:00 2001 From: Oli Date: Wed, 22 Apr 2026 11:10:24 +0200 Subject: [PATCH 1/9] Added files for javascript bindings --- crates/ci-js/src/conversion.rs | 0 crates/ci-js/src/handler.rs | 0 crates/ci-js/src/lib.rs | 1 - crates/ci-js/src/main.rs | 0 crates/ci-js/src/server.rs | 0 crates/ci-js/src/test.js | 0 6 files changed, 1 deletion(-) create mode 100644 crates/ci-js/src/conversion.rs create mode 100644 crates/ci-js/src/handler.rs delete mode 100644 crates/ci-js/src/lib.rs create mode 100644 crates/ci-js/src/main.rs create mode 100644 crates/ci-js/src/server.rs create mode 100644 crates/ci-js/src/test.js diff --git a/crates/ci-js/src/conversion.rs b/crates/ci-js/src/conversion.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/ci-js/src/handler.rs b/crates/ci-js/src/handler.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/ci-js/src/lib.rs b/crates/ci-js/src/lib.rs deleted file mode 100644 index 8b13789..0000000 --- a/crates/ci-js/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/crates/ci-js/src/main.rs b/crates/ci-js/src/main.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/ci-js/src/server.rs b/crates/ci-js/src/server.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/ci-js/src/test.js b/crates/ci-js/src/test.js new file mode 100644 index 0000000..e69de29 From c0a01f53354b8b9df2997660f2bda41ba3be128a Mon Sep 17 00:00:00 2001 From: Oli Date: Fri, 24 Apr 2026 14:40:14 +0200 Subject: [PATCH 2/9] feat: serialization and deserialization; basic server structure --- crates/ci-js/Cargo.toml | 9 +- crates/ci-js/src/conversion.rs | 180 +++++++++++++++++++++++++++++++++ crates/ci-js/src/handler.rs | 21 ++++ crates/ci-js/src/main.rs | 12 +++ crates/ci-js/src/server.rs | 10 ++ 5 files changed, 229 insertions(+), 3 deletions(-) diff --git a/crates/ci-js/Cargo.toml b/crates/ci-js/Cargo.toml index 694d7ab..e5f5cf7 100644 --- a/crates/ci-js/Cargo.toml +++ b/crates/ci-js/Cargo.toml @@ -9,9 +9,12 @@ repository = "" [dependencies] ci_core = { path = "../ci-core" } +axum = "0.8" +tokio = { version = "1", features = ["full"] } +tower-http = { version = "0.6", features = ["cors"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +ndarray = {workspace = true} [lints] workspace = true - -[lib] -crate-type = ["cdylib"] diff --git a/crates/ci-js/src/conversion.rs b/crates/ci-js/src/conversion.rs index e69de29..441fc37 100644 --- a/crates/ci-js/src/conversion.rs +++ b/crates/ci-js/src/conversion.rs @@ -0,0 +1,180 @@ +#![allow(dead_code)] +#![allow(unused_imports)] +#![allow(unused_variables)] + +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize)] +pub struct TestRequest { + pub z: Option>>, + pub x: Vec, + pub y: Vec, + pub boolean: bool, + pub significance_level: f64, +} + +#[derive(Serialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum TestResponse { + Boolean { + boolean: bool, + }, + PValue { + p_value: f64, + coefficient: f64, + }, + Statistics { + p_value: f64, + coefficient: f64, + dof: f64, + }, +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::{from_value, json, to_value}; + + #[test] + fn test_request_succeeds_with_all_fields() { + let input = json!({ + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "boolean": false, + "significance_level": 0.05 + }); + let req: TestRequest = from_value(input).unwrap(); + assert_eq!(req.boolean, false); + assert!((req.significance_level - 0.05).abs() < 1e-10); + } + + #[test] + fn test_request_deserializes_with_z() { + let input = json!({ + "z": [[1.0, 2.0], [3.0, 4.0]], + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "boolean": true, + "significance_level": 0.05 + }); + let req: TestRequest = from_value(input).unwrap(); + assert_eq!(req.x, vec![1.0, 2.0, 3.0]); + assert_eq!(req.y, vec![4.0, 5.0, 6.0]); + assert_eq!(req.z, Some(vec![vec![1.0, 2.0], vec![3.0, 4.0]])); + assert_eq!(req.boolean, true); + assert_eq!(req.significance_level, 0.05); + } + + #[test] + fn test_request_deserializes_without_z() { + let input = json!({ + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "boolean": true, + "significance_level": 0.05 + }); + let req: TestRequest = from_value(input).unwrap(); + assert!(req.z.is_none()); + } + + #[test] + fn test_request_deserializes_with_null_z() { + let input = json!({ + "z": null, + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "boolean": true, + "significance_level": 0.05 + }); + let req: TestRequest = from_value(input).unwrap(); + assert!(req.z.is_none()); + } + + #[test] + fn test_request_fails_without_x() { + let input = json!({ + "y": [1.0, 2.0, 3.0] + }); + assert!(from_value::(input).is_err()); + } + + #[test] + fn test_request_fails_without_y() { + let input = json!({ + "x": [1.0, 2.0, 3.0] + }); + assert!(from_value::(input).is_err()); + } + + #[test] + fn test_request_fails_with_wrong_type() { + let input = json!({ + "x": "not_an_array", + "y": [1.0, 2.0, 3.0] + }); + assert!(from_value::(input).is_err()); + } + + #[test] + fn test_request_fails_without_boolean() { + let input = json!({ + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "significance_level": 0.05 + }); + assert!(from_value::(input).is_err()); + } + + #[test] + fn test_request_fails_without_significance_level() { + let input = json!({ + "x": [1.0, 2.0, 3.0], + "y": [4.0, 5.0, 6.0], + "boolean": false + }); + assert!(from_value::(input).is_err()); + } + + #[test] + fn test_result_boolean_serializes() { + let result = TestResponse::Boolean { boolean: true }; + let json = to_value(&result).unwrap(); + println!("Value Json {}", json); + assert_eq!(json["boolean"], true); + } + + #[test] + fn test_result_pval_serializes() { + let result = TestResponse::PValue { + p_value: 0.03, + coefficient: 0.85, + }; + let json = to_value(&result).unwrap(); + assert!((json["p_value"].as_f64().unwrap() - 0.03).abs() < 1e-10); + assert!((json["coefficient"].as_f64().unwrap() - 0.85).abs() < 1e-10); + } + + #[test] + fn test_result_statistics_serializes() { + let result = TestResponse::Statistics { + p_value: 0.01, + coefficient: 0.9, + dof: 5.0, + }; + let json = to_value(&result).unwrap(); + assert!((json["p_value"].as_f64().unwrap() - 0.01).abs() < 1e-10); + assert!((json["coefficient"].as_f64().unwrap() - 0.9).abs() < 1e-10); + assert!((json["dof"].as_f64().unwrap() - 5.0).abs() < 1e-10); + } + + #[test] + fn test_result_does_not_serialize_nan() { + let result = TestResponse::PValue { + p_value: f64::NAN, + coefficient: 0.5, + }; + let json = to_value(&result).unwrap(); + // serde_json serializes NaN as null — verify you catch this in your handler + assert!(json["p_value"].is_null()); + } +} diff --git a/crates/ci-js/src/handler.rs b/crates/ci-js/src/handler.rs index e69de29..a40e06f 100644 --- a/crates/ci-js/src/handler.rs +++ b/crates/ci-js/src/handler.rs @@ -0,0 +1,21 @@ +#![allow(dead_code)] +#![allow(unused_imports)] +#![allow(unused_variables)] + +use crate::conversion::{TestRequest, TestResponse}; +use axum::{ + extract::Path, + http::StatusCode, + response::{IntoResponse, Response}, + Json, +}; +use ci_core::strategy::CITest; +use ci_core::ci_tests::chi_squared::ChiSquared; +use ci_core::ci_tests::cressie_read::CressieRead; +use ci_core::ci_tests::freeman_tukey::FreemanTukey; +use ci_core::ci_tests::log_likelihood::LogLikelihood; +use ci_core::ci_tests::pearson_correlation::PearsonCorrelation; +use ci_core::ci_tests::pearson_equivalence::PearsonEquivalence; +use ndarray::{Array1, Array2}; + +//pub async fn run_test(Path(test_name):Path, Json(req):Json) -> Response{} \ No newline at end of file diff --git a/crates/ci-js/src/main.rs b/crates/ci-js/src/main.rs index e69de29..e6a1695 100644 --- a/crates/ci-js/src/main.rs +++ b/crates/ci-js/src/main.rs @@ -0,0 +1,12 @@ +mod conversion; +mod handler; +mod server; + + +#[tokio::main] +async fn main() { + let app = server::build_router(); + let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + println!("Listening on http://localhost:3000"); + axum::serve(listener, app).await.unwrap(); +} diff --git a/crates/ci-js/src/server.rs b/crates/ci-js/src/server.rs index e69de29..cf541a1 100644 --- a/crates/ci-js/src/server.rs +++ b/crates/ci-js/src/server.rs @@ -0,0 +1,10 @@ +use crate::handler::run_test; +use axum::{routing::post, Router}; +use tower_http::cors::CorsLayer; + +pub fn build_router() -> Router { + Router::new() + .route("/tests/{test_name}", post(run_test)) + .layer(CorsLayer::permissive()) +} + From 1512b39531ad81ebf99fa0d652083ab0421ed29f Mon Sep 17 00:00:00 2001 From: Oli Date: Wed, 6 May 2026 11:02:21 +0200 Subject: [PATCH 3/9] feat: naive api implementation --- crates/ci-js/src/conversion.rs | 14 +++++++------- crates/ci-js/src/handler.rs | 34 ++++++++++++++++++++++++++++++++-- crates/ci-js/src/test.js | 14 ++++++++++++++ 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/crates/ci-js/src/conversion.rs b/crates/ci-js/src/conversion.rs index 441fc37..acac9ac 100644 --- a/crates/ci-js/src/conversion.rs +++ b/crates/ci-js/src/conversion.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; #[derive(Deserialize)] pub struct TestRequest { - pub z: Option>>, + pub z: Vec>, pub x: Vec, pub y: Vec, pub boolean: bool, @@ -26,7 +26,7 @@ pub enum TestResponse { Statistics { p_value: f64, coefficient: f64, - dof: f64, + dof: usize, }, } @@ -60,7 +60,7 @@ mod tests { let req: TestRequest = from_value(input).unwrap(); assert_eq!(req.x, vec![1.0, 2.0, 3.0]); assert_eq!(req.y, vec![4.0, 5.0, 6.0]); - assert_eq!(req.z, Some(vec![vec![1.0, 2.0], vec![3.0, 4.0]])); + assert_eq!(req.z, vec![vec![1.0, 2.0], vec![3.0, 4.0]]); assert_eq!(req.boolean, true); assert_eq!(req.significance_level, 0.05); } @@ -74,7 +74,7 @@ mod tests { "significance_level": 0.05 }); let req: TestRequest = from_value(input).unwrap(); - assert!(req.z.is_none()); + assert!(req.z.is_empty()); } #[test] @@ -87,7 +87,7 @@ mod tests { "significance_level": 0.05 }); let req: TestRequest = from_value(input).unwrap(); - assert!(req.z.is_none()); + assert!(req.z.is_empty()); } #[test] @@ -159,12 +159,12 @@ mod tests { let result = TestResponse::Statistics { p_value: 0.01, coefficient: 0.9, - dof: 5.0, + dof: 5, }; let json = to_value(&result).unwrap(); assert!((json["p_value"].as_f64().unwrap() - 0.01).abs() < 1e-10); assert!((json["coefficient"].as_f64().unwrap() - 0.9).abs() < 1e-10); - assert!((json["dof"].as_f64().unwrap() - 5.0).abs() < 1e-10); + assert_eq!(json["dof"], 5); } #[test] diff --git a/crates/ci-js/src/handler.rs b/crates/ci-js/src/handler.rs index a40e06f..6e21bd0 100644 --- a/crates/ci-js/src/handler.rs +++ b/crates/ci-js/src/handler.rs @@ -9,7 +9,7 @@ use axum::{ response::{IntoResponse, Response}, Json, }; -use ci_core::strategy::CITest; +use ci_core::strategy::{CITest,TestResult}; use ci_core::ci_tests::chi_squared::ChiSquared; use ci_core::ci_tests::cressie_read::CressieRead; use ci_core::ci_tests::freeman_tukey::FreemanTukey; @@ -18,4 +18,34 @@ use ci_core::ci_tests::pearson_correlation::PearsonCorrelation; use ci_core::ci_tests::pearson_equivalence::PearsonEquivalence; use ndarray::{Array1, Array2}; -//pub async fn run_test(Path(test_name):Path, Json(req):Json) -> Response{} \ No newline at end of file +pub async fn run_test(Path(test_name):Path, Json(req):Json) -> Response{ + let test = PearsonCorrelation::new(req.boolean, req.significance_level); + + + let z_row = req.z.len(); + let z_col = req.z.first().map_or(0, |r|r.len()); + + let z = if req.z.is_empty(){ + Array2::zeros((req.x.len(),0)) + } + else{ + Array2::from_shape_vec((z_row, z_col), req.z.into_iter().flatten().collect()).unwrap() + }; + + let x = Array1::from_vec(req.x); + let y = Array1::from_vec(req.y); + + match test.run_test(x, y, z) { + Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(), + Ok(result) => return(Json(map_test_result(result)). into_response()) + } +} + +fn map_test_result(result:TestResult) -> TestResponse{ + match result { + TestResult::PValue(pval, coef) => TestResponse::PValue { p_value: pval, coefficient: coef}, + TestResult::Boolean(bool) => TestResponse::Boolean { boolean: bool }, + TestResult::Statistic(pval,coef , d) => TestResponse::Statistics { p_value: pval, coefficient: coef, dof: d}, +} + +} diff --git a/crates/ci-js/src/test.js b/crates/ci-js/src/test.js index e69de29..adc8cc9 100644 --- a/crates/ci-js/src/test.js +++ b/crates/ci-js/src/test.js @@ -0,0 +1,14 @@ +const response = await fetch("http://localhost:3000/tests/pearson_correlation", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + x: [1.0, 2.0, 3.0, 4.0, 5.0], + y: [1.0, 2.0, 3.0, 4.0, 5.0], + z: [], + boolean: false, + significance_level: 0.05 + }) +}); + +const result = await response.json(); +console.log(result); \ No newline at end of file From 5c76c863b8f1cc4c30ec234ddd19ab3d0491ecf8 Mon Sep 17 00:00:00 2001 From: Oli Date: Wed, 6 May 2026 11:03:19 +0200 Subject: [PATCH 4/9] feat: Replaced ndarray-linalg with nalgebra --- Cargo.lock | 1652 +++-------------- crates/ci-core/Cargo.toml | 8 +- crates/ci-core/src/ci_tests/mod.rs | 16 +- .../src/ci_tests/pearson_correlation.rs | 62 +- crates/ci-core/src/lib.rs | 2 +- 5 files changed, 323 insertions(+), 1417 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e23b50e..b5c962e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aho-corasick" version = "1.1.4" @@ -17,15 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anes" version = "0.1.6" @@ -54,28 +39,68 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.5.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "base16ct" -version = "0.2.0" +name = "autocfg" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "base64" -version = "0.22.1" +name = "axum" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] [[package]] -name = "base64ct" -version = "1.8.3" +name = "axum-core" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] [[package]] name = "bit-set" @@ -98,15 +123,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "bumpalo" version = "3.20.2" @@ -131,64 +147,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" -[[package]] -name = "cauchy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff11ddd2af3b5e80dd0297fee6e56ac038d9bdc549573cdb51bd6d2efe7f05e" -dependencies = [ - "num-complex", - "num-traits", - "rand 0.8.5", - "serde", -] - -[[package]] -name = "cblas-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" -dependencies = [ - "libc", -] - -[[package]] -name = "cc" -version = "1.2.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" -dependencies = [ - "find-msvc-tools", - "shlex", -] - [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - [[package]] name = "ci_core" version = "0.1.0" dependencies = [ "anyhow", "criterion", + "nalgebra", "ndarray", - "ndarray-linalg", "ordered-float", "proptest", "rand 0.9.2", @@ -200,7 +172,13 @@ dependencies = [ name = "ci_js" version = "0.1.0" dependencies = [ + "axum", "ci_core", + "ndarray", + "serde", + "serde_json", + "tokio", + "tower-http", ] [[package]] @@ -272,40 +250,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - [[package]] name = "criterion" version = "0.5.1" @@ -373,155 +317,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn", -] - -[[package]] -name = "der" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" -dependencies = [ - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys 0.5.0", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.4.6", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "either" version = "1.15.0" @@ -541,7 +336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -550,33 +345,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" -[[package]] -name = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" @@ -590,37 +358,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "foreign-types" -version = "0.3.2" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "foreign-types-shared", + "percent-encoding", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "futures-channel" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "futures-core" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] -name = "generic-array" -version = "0.14.7" +name = "futures-util" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "typenum", - "version_check", + "futures-core", + "futures-task", + "pin-project-lite", + "slab", ] [[package]] @@ -659,18 +435,6 @@ dependencies = [ "wasip3", ] -[[package]] -name = "getset" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "half" version = "2.7.1" @@ -720,116 +484,74 @@ dependencies = [ ] [[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "iana-time-zone" -version = "0.1.65" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", + "bytes", + "http", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "cc", + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "icu_collections" -version = "2.2.0" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "icu_locale_core" -version = "2.2.0" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "icu_normalizer" -version = "2.2.0" +name = "hyper" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", "smallvec", - "zerovec", + "tokio", ] [[package]] -name = "icu_normalizer_data" -version = "2.2.0" +name = "hyper-util" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "bytes", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] [[package]] name = "id-arena" @@ -837,33 +559,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "indexmap" version = "2.13.1" @@ -876,28 +571,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "intel-mkl-src" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee70586cd5b3e772a8739a1bd43eaa90d4f4bf0fb2a4edc202e979937ee7f5e" -dependencies = [ - "anyhow", - "intel-mkl-tool", - "ocipkg", -] - -[[package]] -name = "intel-mkl-tool" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887a16b4537d82227af54d3372971cfa5e0cde53322e60f57584056c16ada1b4" -dependencies = [ - "anyhow", - "log", - "walkdir", -] - [[package]] name = "is-terminal" version = "0.4.17" @@ -906,7 +579,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -934,47 +607,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "katexit" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfb0b7ce7938f84a5ecbdca5d0a991e46bc9d6d078934ad5e92c5270fe547db" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "lapack-sys" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b879030845b68571809a6978e52d3b67ac5fba07e77b1b317b484092e2fb5" -dependencies = [ - "libc", -] - -[[package]] -name = "lax" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda593cb87a3b1c06625e73710812005caf1523e45b0b898adcd7716602f8ba2" -dependencies = [ - "cauchy", - "intel-mkl-src", - "katexit", - "lapack-sys", - "num-traits", - "openblas-src", - "thiserror 2.0.18", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "leb128fmt" version = "0.1.0" @@ -993,18 +625,6 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" -[[package]] -name = "libredox" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" -dependencies = [ - "bitflags", - "libc", - "plain", - "redox_syscall", -] - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1012,10 +632,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "litemap" -version = "0.8.2" +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] [[package]] name = "log" @@ -1023,6 +646,12 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "matrixmultiply" version = "0.3.10" @@ -1040,13 +669,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] -name = "miniz_oxide" -version = "0.8.9" +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ - "adler2", - "simd-adler32", + "libc", + "wasi", + "windows-sys", ] [[package]] @@ -1057,6 +693,7 @@ checksum = "9d43ddcacf343185dfd6de2ee786d9e8b1c2301622afab66b6c73baf9882abfd" dependencies = [ "approx", "matrixmultiply", + "nalgebra-macros", "num-complex", "num-rational", "num-traits", @@ -1067,20 +704,14 @@ dependencies = [ ] [[package]] -name = "native-tls" -version = "0.2.18" +name = "nalgebra-macros" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -1089,9 +720,6 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520080814a7a6b4a6e9070823bb24b4531daac8c4627e08ba5de8c5ef2f2752d" dependencies = [ - "approx", - "cblas-sys", - "libc", "matrixmultiply", "num-complex", "num-integer", @@ -1101,22 +729,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "ndarray-linalg" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb0783188ff249ab498417e0477f7fade3b312d1d287314ca76de570d9a83ee0" -dependencies = [ - "cauchy", - "katexit", - "lax", - "ndarray", - "num-complex", - "num-traits", - "rand 0.8.5", - "thiserror 2.0.18", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -1134,8 +746,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", - "rand 0.8.5", - "serde", ] [[package]] @@ -1184,48 +794,6 @@ dependencies = [ "rustc-hash", ] -[[package]] -name = "oci-spec" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf88ddc01cc6bccbe1044adb6a29057333f523deadcb4953c011a73158cfa5e" -dependencies = [ - "derive_builder", - "getset", - "serde", - "serde_json", - "strum", - "strum_macros", - "thiserror 1.0.69", -] - -[[package]] -name = "ocipkg" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" -dependencies = [ - "base16ct", - "base64", - "chrono", - "directories", - "flate2", - "lazy_static", - "log", - "oci-spec", - "regex", - "serde", - "serde_json", - "sha2", - "tar", - "thiserror 1.0.69", - "toml", - "ureq 2.12.1", - "url", - "uuid", - "walkdir", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -1239,88 +807,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] -name = "openblas-build" -version = "0.10.15" +name = "ordered-float" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd235aa8876fa5c4be452efde09b9b8bafa19aea0bf14a4926508213082439a3" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ - "anyhow", - "cc", - "flate2", - "tar", - "thiserror 2.0.18", - "ureq 3.3.0", + "num-traits", ] [[package]] -name = "openblas-src" -version = "0.10.15" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fccd2c4f5271ab871f2069cb6f1a13ef2c0db50e1145ce03428ee541f4c63c4f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "dirs", - "openblas-build", - "pkg-config", - "vcpkg", + "lock_api", + "parking_lot_core", ] [[package]] -name = "openssl" -version = "0.10.76" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "bitflags", "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.112" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" -dependencies = [ - "cc", "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" -dependencies = [ - "num-traits", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] @@ -1329,15 +844,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pem-rfc7468" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" -dependencies = [ - "base64ct", -] - [[package]] name = "percent-encoding" version = "2.3.2" @@ -1345,16 +851,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "plotters" @@ -1399,15 +899,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -1427,28 +918,6 @@ dependencies = [ "syn", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -1678,35 +1147,13 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.3" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - [[package]] name = "regex" version = "1.12.3" @@ -1736,20 +1183,6 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "rustc-hash" version = "2.1.2" @@ -1766,42 +1199,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", + "windows-sys", ] [[package]] @@ -1822,6 +1220,12 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "safe_arch" version = "0.7.4" @@ -1841,36 +1245,10 @@ dependencies = [ ] [[package]] -name = "schannel" -version = "0.1.29" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" @@ -1922,30 +1300,37 @@ dependencies = [ ] [[package]] -name = "serde_spanned" -version = "0.6.9" +name = "serde_path_to_error" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ + "itoa", "serde", + "serde_core", ] [[package]] -name = "sha2" -version = "0.10.9" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] [[package]] name = "simba" @@ -1961,10 +1346,10 @@ dependencies = [ ] [[package]] -name = "simd-adler32" -version = "0.3.9" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -1973,10 +1358,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "stable_deref_trait" -version = "1.2.1" +name = "socket2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys", +] [[package]] name = "statrs" @@ -1990,37 +1379,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.117" @@ -2033,26 +1391,10 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tar" -version = "0.4.45" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" -dependencies = [ - "filetime", - "libc", - "xattr", -] +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "target-lexicon" @@ -2070,32 +1412,41 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] -name = "thiserror" -version = "1.0.69" +name = "tinytemplate" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ - "thiserror-impl 1.0.69", + "serde", + "serde_json", ] [[package]] -name = "thiserror" -version = "2.0.18" +name = "tokio" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ - "thiserror-impl 2.0.18", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", ] [[package]] -name = "thiserror-impl" -version = "1.0.69" +name = "tokio-macros" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2103,77 +1454,67 @@ dependencies = [ ] [[package]] -name = "thiserror-impl" -version = "2.0.18" +name = "tower" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ - "proc-macro2", - "quote", - "syn", + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", ] [[package]] -name = "tinystr" -version = "0.8.3" +name = "tower-http" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "displaydoc", - "zerovec", + "bitflags", + "bytes", + "http", + "pin-project-lite", + "tower-layer", + "tower-service", ] [[package]] -name = "tinytemplate" -version = "1.2.1" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] -name = "toml" -version = "0.8.23" +name = "tower-service" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] -name = "toml_datetime" -version = "0.6.11" +name = "tracing" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "serde", + "log", + "pin-project-lite", + "tracing-core", ] [[package]] -name = "toml_edit" -version = "0.22.27" +name = "tracing-core" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", + "once_cell", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "typenum" version = "1.19.0" @@ -2198,106 +1539,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "url", - "webpki-roots 0.26.11", -] - -[[package]] -name = "ureq" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" -dependencies = [ - "base64", - "der", - "log", - "native-tls", - "percent-encoding", - "rustls-pki-types", - "ureq-proto", - "utf8-zero", - "webpki-root-certs", -] - -[[package]] -name = "ureq-proto" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" -dependencies = [ - "base64", - "http", - "httparse", - "log", -] - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8-zero" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" -dependencies = [ - "getrandom 0.4.2", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "wait-timeout" version = "0.2.1" @@ -2430,33 +1671,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-root-certs" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.6", -] - -[[package]] -name = "webpki-roots" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "wide" version = "0.7.33" @@ -2473,42 +1687,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "windows-sys", ] [[package]] @@ -2517,42 +1696,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -2562,136 +1705,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -2780,45 +1793,6 @@ dependencies = [ "wasmparser", ] -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "xattr" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.8.48" @@ -2839,66 +1813,6 @@ dependencies = [ "syn", ] -[[package]] -name = "zerofrom" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zmij" version = "1.0.21" diff --git a/crates/ci-core/Cargo.toml b/crates/ci-core/Cargo.toml index b8312b1..73902ad 100644 --- a/crates/ci-core/Cargo.toml +++ b/crates/ci-core/Cargo.toml @@ -17,15 +17,9 @@ ndarray = { workspace = true } statrs = { workspace = true } ordered-float = "5.3.0" rand = "0.9" +nalgebra = "0.33" -[target.'cfg(target_os = "linux")'.dependencies] -ndarray-linalg = { version = "0.18.1", features = ["openblas-system"] } -[target.'cfg(target_os = "macos")'.dependencies] -ndarray-linalg = { version = "0.18.1", features = ["openblas-system"] } - -[target.'cfg(windows)'.dependencies] -ndarray-linalg = { version = "0.18.1", features = ["intel-mkl-static"] } [dev-dependencies] criterion = { workspace = true } diff --git a/crates/ci-core/src/ci_tests/mod.rs b/crates/ci-core/src/ci_tests/mod.rs index 9cae276..2242363 100644 --- a/crates/ci-core/src/ci_tests/mod.rs +++ b/crates/ci-core/src/ci_tests/mod.rs @@ -1,10 +1,10 @@ -mod chi_squared; -mod cressie_read; -mod freeman_tukey; -mod log_likelihood; -mod modified_likelihood; -mod pearson_correlation; -mod pearson_equivalence; +pub mod chi_squared; +pub mod cressie_read; +pub mod freeman_tukey; +pub mod log_likelihood; +pub mod modified_likelihood; +pub mod pearson_correlation; +pub mod pearson_equivalence; use chi_squared::ChiSquared; use cressie_read::CressieRead; @@ -30,7 +30,7 @@ pub fn register_all_tests(registry: &mut Registry) { .expect("Failed to register Modified Likelihood Test!"); registry - .add_to_registry("pearson_correlation", PearsonCorrelation::new(true, 0.05)) + .add_to_registry("pearson_correlation", PearsonCorrelation::new(false, 0.05)) .expect("Failed to register Pearson Correlation test!"); registry diff --git a/crates/ci-core/src/ci_tests/pearson_correlation.rs b/crates/ci-core/src/ci_tests/pearson_correlation.rs index 57b9b4f..1f319fe 100644 --- a/crates/ci-core/src/ci_tests/pearson_correlation.rs +++ b/crates/ci-core/src/ci_tests/pearson_correlation.rs @@ -1,7 +1,7 @@ use crate::strategy::{CITest, CITestDataType, TestResult}; use anyhow::{ensure, Context}; use ndarray::{Array1, Array2, ArrayView1}; -use ndarray_linalg::LeastSquaresSvd; +use nalgebra::{DMatrix, DVector}; use statrs::distribution::{ContinuousCDF, StudentsT}; use statrs::statistics::Statistics; @@ -45,38 +45,36 @@ impl CITest for PearsonCorrelation { /// /// - If `boolean=true`: `TestResult::Boolean(p_value >= SIGNIFICANCE_LEVEL)` /// - If `boolean=false`: `TestResult::PValue(p_value, coefficient)` - fn run_test( - &self, - x_values: Array1, - y_values: Array1, - z: Array2, - ) -> anyhow::Result { - if z.is_empty() { - let (coefficient, p_value) = pearsonr(&x_values.view(), &y_values.view())?; - Ok(wrap_result( - self.boolean, - p_value, - coefficient, - self.significance_level, - )) - } else { - // Use linear regression to compute residuals and test independence on it. - let x_coefficient = z.view().least_squares(&x_values.view())?.solution; - - let y_coefficient = z.view().least_squares(&y_values.view())?.solution; - - let residual_x = x_values - z.dot(&x_coefficient); - let residual_y = y_values - z.dot(&y_coefficient); - - let (coefficient, p_value) = pearsonr(&residual_x.view(), &residual_y.view())?; - Ok(wrap_result( - self.boolean, - p_value, - coefficient, - self.significance_level, - )) - } + fn run_test( + &self, + x_values: Array1, + y_values: Array1, + z: Array2, +) -> anyhow::Result { + if z.is_empty() { + let (coefficient, p_value) = pearsonr(&x_values.view(), &y_values.view())?; + Ok(wrap_result(self.boolean, p_value, coefficient, self.significance_level)) + } else { + let z_na = DMatrix::from_row_iterator(z.nrows(), z.ncols(), z.iter().cloned()); + let x_na = DVector::from_iterator(x_values.len(), x_values.iter().cloned()); + let y_na = DVector::from_iterator(y_values.len(), y_values.iter().cloned()); + + let svd = z_na.svd(true, true); + let x_coefficient = svd.solve(&x_na, 1e-10) + .map_err(|e| anyhow::anyhow!("least squares failed for x: {e}"))?; + let y_coefficient = svd.solve(&y_na, 1e-10) + .map_err(|e| anyhow::anyhow!("least squares failed for y: {e}"))?; + + let x_coef_nd = Array1::from_vec(x_coefficient.iter().cloned().collect()); + let y_coef_nd = Array1::from_vec(y_coefficient.iter().cloned().collect()); + + let residual_x = x_values - z.dot(&x_coef_nd); + let residual_y = y_values - z.dot(&y_coef_nd); + + let (coefficient, p_value) = pearsonr(&residual_x.view(), &residual_y.view())?; + Ok(wrap_result(self.boolean, p_value, coefficient, self.significance_level)) } +} fn data_types(&self) -> &'static [CITestDataType] { &[CITestDataType::Continuous] diff --git a/crates/ci-core/src/lib.rs b/crates/ci-core/src/lib.rs index 3294e97..abc87ef 100644 --- a/crates/ci-core/src/lib.rs +++ b/crates/ci-core/src/lib.rs @@ -1,4 +1,4 @@ -mod ci_tests; +pub mod ci_tests; pub mod registry; pub mod strategy; pub mod utils; From 50753519c9eec8fd4af8ef4e623a06b57a152eb9 Mon Sep 17 00:00:00 2001 From: Oli Date: Wed, 6 May 2026 11:49:45 +0200 Subject: [PATCH 5/9] Removed previous API code and added lib.rs --- crates/ci-js/src/conversion.rs | 180 --------------------------------- crates/ci-js/src/handler.rs | 51 ---------- crates/ci-js/src/lib.rs | 0 crates/ci-js/src/main.rs | 12 --- crates/ci-js/src/server.rs | 10 -- 5 files changed, 253 deletions(-) delete mode 100644 crates/ci-js/src/conversion.rs delete mode 100644 crates/ci-js/src/handler.rs create mode 100644 crates/ci-js/src/lib.rs delete mode 100644 crates/ci-js/src/main.rs delete mode 100644 crates/ci-js/src/server.rs diff --git a/crates/ci-js/src/conversion.rs b/crates/ci-js/src/conversion.rs deleted file mode 100644 index acac9ac..0000000 --- a/crates/ci-js/src/conversion.rs +++ /dev/null @@ -1,180 +0,0 @@ -#![allow(dead_code)] -#![allow(unused_imports)] -#![allow(unused_variables)] - -use serde::{Deserialize, Serialize}; - -#[derive(Deserialize)] -pub struct TestRequest { - pub z: Vec>, - pub x: Vec, - pub y: Vec, - pub boolean: bool, - pub significance_level: f64, -} - -#[derive(Serialize)] -#[serde(tag = "type", rename_all = "camelCase")] -pub enum TestResponse { - Boolean { - boolean: bool, - }, - PValue { - p_value: f64, - coefficient: f64, - }, - Statistics { - p_value: f64, - coefficient: f64, - dof: usize, - }, -} - -#[cfg(test)] -mod tests { - use super::*; - use serde_json::{from_value, json, to_value}; - - #[test] - fn test_request_succeeds_with_all_fields() { - let input = json!({ - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "boolean": false, - "significance_level": 0.05 - }); - let req: TestRequest = from_value(input).unwrap(); - assert_eq!(req.boolean, false); - assert!((req.significance_level - 0.05).abs() < 1e-10); - } - - #[test] - fn test_request_deserializes_with_z() { - let input = json!({ - "z": [[1.0, 2.0], [3.0, 4.0]], - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "boolean": true, - "significance_level": 0.05 - }); - let req: TestRequest = from_value(input).unwrap(); - assert_eq!(req.x, vec![1.0, 2.0, 3.0]); - assert_eq!(req.y, vec![4.0, 5.0, 6.0]); - assert_eq!(req.z, vec![vec![1.0, 2.0], vec![3.0, 4.0]]); - assert_eq!(req.boolean, true); - assert_eq!(req.significance_level, 0.05); - } - - #[test] - fn test_request_deserializes_without_z() { - let input = json!({ - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "boolean": true, - "significance_level": 0.05 - }); - let req: TestRequest = from_value(input).unwrap(); - assert!(req.z.is_empty()); - } - - #[test] - fn test_request_deserializes_with_null_z() { - let input = json!({ - "z": null, - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "boolean": true, - "significance_level": 0.05 - }); - let req: TestRequest = from_value(input).unwrap(); - assert!(req.z.is_empty()); - } - - #[test] - fn test_request_fails_without_x() { - let input = json!({ - "y": [1.0, 2.0, 3.0] - }); - assert!(from_value::(input).is_err()); - } - - #[test] - fn test_request_fails_without_y() { - let input = json!({ - "x": [1.0, 2.0, 3.0] - }); - assert!(from_value::(input).is_err()); - } - - #[test] - fn test_request_fails_with_wrong_type() { - let input = json!({ - "x": "not_an_array", - "y": [1.0, 2.0, 3.0] - }); - assert!(from_value::(input).is_err()); - } - - #[test] - fn test_request_fails_without_boolean() { - let input = json!({ - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "significance_level": 0.05 - }); - assert!(from_value::(input).is_err()); - } - - #[test] - fn test_request_fails_without_significance_level() { - let input = json!({ - "x": [1.0, 2.0, 3.0], - "y": [4.0, 5.0, 6.0], - "boolean": false - }); - assert!(from_value::(input).is_err()); - } - - #[test] - fn test_result_boolean_serializes() { - let result = TestResponse::Boolean { boolean: true }; - let json = to_value(&result).unwrap(); - println!("Value Json {}", json); - assert_eq!(json["boolean"], true); - } - - #[test] - fn test_result_pval_serializes() { - let result = TestResponse::PValue { - p_value: 0.03, - coefficient: 0.85, - }; - let json = to_value(&result).unwrap(); - assert!((json["p_value"].as_f64().unwrap() - 0.03).abs() < 1e-10); - assert!((json["coefficient"].as_f64().unwrap() - 0.85).abs() < 1e-10); - } - - #[test] - fn test_result_statistics_serializes() { - let result = TestResponse::Statistics { - p_value: 0.01, - coefficient: 0.9, - dof: 5, - }; - let json = to_value(&result).unwrap(); - assert!((json["p_value"].as_f64().unwrap() - 0.01).abs() < 1e-10); - assert!((json["coefficient"].as_f64().unwrap() - 0.9).abs() < 1e-10); - assert_eq!(json["dof"], 5); - } - - #[test] - fn test_result_does_not_serialize_nan() { - let result = TestResponse::PValue { - p_value: f64::NAN, - coefficient: 0.5, - }; - let json = to_value(&result).unwrap(); - // serde_json serializes NaN as null — verify you catch this in your handler - assert!(json["p_value"].is_null()); - } -} diff --git a/crates/ci-js/src/handler.rs b/crates/ci-js/src/handler.rs deleted file mode 100644 index 6e21bd0..0000000 --- a/crates/ci-js/src/handler.rs +++ /dev/null @@ -1,51 +0,0 @@ -#![allow(dead_code)] -#![allow(unused_imports)] -#![allow(unused_variables)] - -use crate::conversion::{TestRequest, TestResponse}; -use axum::{ - extract::Path, - http::StatusCode, - response::{IntoResponse, Response}, - Json, -}; -use ci_core::strategy::{CITest,TestResult}; -use ci_core::ci_tests::chi_squared::ChiSquared; -use ci_core::ci_tests::cressie_read::CressieRead; -use ci_core::ci_tests::freeman_tukey::FreemanTukey; -use ci_core::ci_tests::log_likelihood::LogLikelihood; -use ci_core::ci_tests::pearson_correlation::PearsonCorrelation; -use ci_core::ci_tests::pearson_equivalence::PearsonEquivalence; -use ndarray::{Array1, Array2}; - -pub async fn run_test(Path(test_name):Path, Json(req):Json) -> Response{ - let test = PearsonCorrelation::new(req.boolean, req.significance_level); - - - let z_row = req.z.len(); - let z_col = req.z.first().map_or(0, |r|r.len()); - - let z = if req.z.is_empty(){ - Array2::zeros((req.x.len(),0)) - } - else{ - Array2::from_shape_vec((z_row, z_col), req.z.into_iter().flatten().collect()).unwrap() - }; - - let x = Array1::from_vec(req.x); - let y = Array1::from_vec(req.y); - - match test.run_test(x, y, z) { - Err(e) => return (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response(), - Ok(result) => return(Json(map_test_result(result)). into_response()) - } -} - -fn map_test_result(result:TestResult) -> TestResponse{ - match result { - TestResult::PValue(pval, coef) => TestResponse::PValue { p_value: pval, coefficient: coef}, - TestResult::Boolean(bool) => TestResponse::Boolean { boolean: bool }, - TestResult::Statistic(pval,coef , d) => TestResponse::Statistics { p_value: pval, coefficient: coef, dof: d}, -} - -} diff --git a/crates/ci-js/src/lib.rs b/crates/ci-js/src/lib.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/ci-js/src/main.rs b/crates/ci-js/src/main.rs deleted file mode 100644 index e6a1695..0000000 --- a/crates/ci-js/src/main.rs +++ /dev/null @@ -1,12 +0,0 @@ -mod conversion; -mod handler; -mod server; - - -#[tokio::main] -async fn main() { - let app = server::build_router(); - let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); - println!("Listening on http://localhost:3000"); - axum::serve(listener, app).await.unwrap(); -} diff --git a/crates/ci-js/src/server.rs b/crates/ci-js/src/server.rs deleted file mode 100644 index cf541a1..0000000 --- a/crates/ci-js/src/server.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::handler::run_test; -use axum::{routing::post, Router}; -use tower_http::cors::CorsLayer; - -pub fn build_router() -> Router { - Router::new() - .route("/tests/{test_name}", post(run_test)) - .layer(CorsLayer::permissive()) -} - From 9f2099c4488ec06a4938e755f6f31cdeb2815d06 Mon Sep 17 00:00:00 2001 From: Oli Date: Fri, 8 May 2026 11:09:26 +0200 Subject: [PATCH 6/9] Applied fmt and added comments to pearson correlation --- crates/ci-core/src/ci_tests/pearson_correlation.rs | 6 +++++- crates/ci-js/src/lib.rs | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/ci-core/src/ci_tests/pearson_correlation.rs b/crates/ci-core/src/ci_tests/pearson_correlation.rs index 1f319fe..de61668 100644 --- a/crates/ci-core/src/ci_tests/pearson_correlation.rs +++ b/crates/ci-core/src/ci_tests/pearson_correlation.rs @@ -55,19 +55,23 @@ impl CITest for PearsonCorrelation { let (coefficient, p_value) = pearsonr(&x_values.view(), &y_values.view())?; Ok(wrap_result(self.boolean, p_value, coefficient, self.significance_level)) } else { + // Convert ndarrays into DMatrix and DVector let z_na = DMatrix::from_row_iterator(z.nrows(), z.ncols(), z.iter().cloned()); let x_na = DVector::from_iterator(x_values.len(), x_values.iter().cloned()); let y_na = DVector::from_iterator(y_values.len(), y_values.iter().cloned()); - + + // Least square computation let svd = z_na.svd(true, true); let x_coefficient = svd.solve(&x_na, 1e-10) .map_err(|e| anyhow::anyhow!("least squares failed for x: {e}"))?; let y_coefficient = svd.solve(&y_na, 1e-10) .map_err(|e| anyhow::anyhow!("least squares failed for y: {e}"))?; + // Convert nalgebra resuult into ndarray let x_coef_nd = Array1::from_vec(x_coefficient.iter().cloned().collect()); let y_coef_nd = Array1::from_vec(y_coefficient.iter().cloned().collect()); + // Compute residuals let residual_x = x_values - z.dot(&x_coef_nd); let residual_y = y_values - z.dot(&y_coef_nd); diff --git a/crates/ci-js/src/lib.rs b/crates/ci-js/src/lib.rs index e69de29..8b13789 100644 --- a/crates/ci-js/src/lib.rs +++ b/crates/ci-js/src/lib.rs @@ -0,0 +1 @@ + From 3e1043b7ddfdcbc75496eca642774bcf62534531 Mon Sep 17 00:00:00 2001 From: Oli Date: Wed, 13 May 2026 10:51:28 +0200 Subject: [PATCH 7/9] Updated JS_bindings Cargo.toml --- Cargo.lock | 433 +--------------------------------------- crates/ci-js/Cargo.toml | 14 +- 2 files changed, 10 insertions(+), 437 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5c962e..6de6517 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,70 +38,12 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "axum" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" -dependencies = [ - "axum-core", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "bit-set" version = "0.8.0" @@ -135,12 +77,6 @@ version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" - [[package]] name = "cast" version = "0.3.0" @@ -172,13 +108,9 @@ dependencies = [ name = "ci_js" version = "0.1.0" dependencies = [ - "axum", - "ci_core", + "js-sys", "ndarray", - "serde", - "serde_json", - "tokio", - "tower-http", + "wasm-bindgen", ] [[package]] @@ -357,48 +289,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "slab", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -473,86 +363,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "bytes", - "http", - "http-body", - "hyper", - "pin-project-lite", - "tokio", - "tower-service", -] - [[package]] name = "id-arena" version = "2.3.0" @@ -631,27 +441,12 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - [[package]] name = "matrixmultiply" version = "0.3.10" @@ -668,23 +463,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mio" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - [[package]] name = "nalgebra" version = "0.33.3" @@ -815,47 +593,12 @@ dependencies = [ "num-traits", ] -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - [[package]] name = "plotters" version = "0.3.7" @@ -1145,15 +888,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - [[package]] name = "regex" version = "1.12.3" @@ -1220,12 +954,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - [[package]] name = "safe_arch" version = "0.7.4" @@ -1244,12 +972,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "semver" version = "1.0.28" @@ -1299,39 +1021,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - [[package]] name = "simba" version = "0.9.1" @@ -1345,28 +1034,6 @@ dependencies = [ "wide", ] -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "statrs" version = "0.18.0" @@ -1390,12 +1057,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" - [[package]] name = "target-lexicon" version = "0.13.5" @@ -1425,96 +1086,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "tokio" -version = "1.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags", - "bytes", - "http", - "pin-project-lite", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - [[package]] name = "typenum" version = "1.19.0" diff --git a/crates/ci-js/Cargo.toml b/crates/ci-js/Cargo.toml index e5f5cf7..b3078d8 100644 --- a/crates/ci-js/Cargo.toml +++ b/crates/ci-js/Cargo.toml @@ -7,14 +7,16 @@ license = "" description = "wasm-pack bindings for Conditional Independence Testing" repository = "" +[lib] +crate-type = ["cdylib"] + [dependencies] -ci_core = { path = "../ci-core" } -axum = "0.8" -tokio = { version = "1", features = ["full"] } -tower-http = { version = "0.6", features = ["cors"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" +wasm-bindgen = "0.2" +js-sys = "0.3" ndarray = {workspace = true} [lints] workspace = true + +[profile.release] +opt-level = "s" \ No newline at end of file From 150fe8edcc5aca47e5202faae9d3ba6c0a62b57c Mon Sep 17 00:00:00 2001 From: ayca12111 Date: Wed, 13 May 2026 11:42:16 +0200 Subject: [PATCH 8/9] Js bindings naive version --- crates/ci-js/src/lib.rs | 56 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/crates/ci-js/src/lib.rs b/crates/ci-js/src/lib.rs index 8b13789..2d6e87b 100644 --- a/crates/ci-js/src/lib.rs +++ b/crates/ci-js/src/lib.rs @@ -1 +1,57 @@ +use ci_core::strategy::TestResult; +use ndarray::{Array1, Array2}; +use js_sys::{Float64Array, Array}; +use wasm_bindgen::prelude::*; +#[wasm_bindgen] +pub struct JSCITest {} + +#[wasm_bindgen] +impl JSCITest { + #[wasm_bindgen(js_name = "run_test")] + pub fn run_test( + &self, + z_flat: &Float64Array, + z_rows: usize, + z_cols: usize, + x: &Float64Array, + y: &Float64Array, + boolean: bool, + significance_level: f64, + ) -> Result { + //Converting Float64Array -> Vec -> ndarray + let z_vec: Vec = z_flat.to_vec(); + let x_vec: Vec = x.to_vec(); + let y_vec: Vec = y.to_vec(); + + let z: Array2 = Array2::from_shape_vec((z_rows, z_cols), z_vec) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + let x: Array1 = Array1::from_vec(x_vec); + let y: Array1 = Array1::from_vec(y_vec); + + let test = PearsonCorrelation::new(&boolean, &significance_level); + + let result = test + .run_test(x, y, z) + .map_err(|e| JsError::new(&e.to_string()))?; + + match result { + TestResult::Boolean(b) => Ok(JsValue::from_bool(b)), + TestResult::PValue(p_value, coefficient) => { + let array = Array::new(); + array.push(&JsValue::from_f64(p_value)); + array.push(&JsValue::from_f64(coefficient)); + Ok(array.into()) + } + + TestResult::Statistic(p_value, statistic, dof) => { + let array = Array::new(); + array.push(&JsValue::from_f64(p_value)); + array.push(&JsValue::from_f64(statistic)); + array.push(&JsValue::from_f64(dof as f64)); + Ok(array.into())} + + } + + } +} From e436263ee4abd14fea68aadbb2cbadbc947c3ca1 Mon Sep 17 00:00:00 2001 From: ayca12111 Date: Wed, 13 May 2026 11:44:18 +0200 Subject: [PATCH 9/9] Cargo.toml update --- crates/ci-js/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ci-js/Cargo.toml b/crates/ci-js/Cargo.toml index b3078d8..16ad7d0 100644 --- a/crates/ci-js/Cargo.toml +++ b/crates/ci-js/Cargo.toml @@ -11,6 +11,7 @@ repository = "" crate-type = ["cdylib"] [dependencies] +ci_core = { path = "../ci_core"} wasm-bindgen = "0.2" js-sys = "0.3" ndarray = {workspace = true}