#![cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
use super::domain::check_domain;
use crate::diagnostics;
use crate::error::{error_json, error_to_json};
#[wasm_bindgen]
pub fn rainbow_test(y_json: &str, x_vars_json: &str, fraction: f64, method: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
let method = match method.to_lowercase().as_str() {
"python" => diagnostics::RainbowMethod::Python,
"both" => diagnostics::RainbowMethod::Both,
_ => diagnostics::RainbowMethod::R, };
match diagnostics::rainbow_test(&y, &x_vars, fraction, method) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Rainbow test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn harvey_collier_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::harvey_collier_test(&y, &x_vars, diagnostics::HarveyCollierMethod::R) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Harvey-Collier test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn breusch_pagan_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::breusch_pagan_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Breusch-Pagan test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn white_test(y_json: &str, x_vars_json: &str, method: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
let method = match method.to_lowercase().as_str() {
"python" => diagnostics::WhiteMethod::Python,
"both" => diagnostics::WhiteMethod::Both,
_ => diagnostics::WhiteMethod::R, };
match diagnostics::white_test(&y, &x_vars, method) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize White test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn r_white_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::r_white_method(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize R White test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn python_white_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::python_white_method(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Python White test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn jarque_bera_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::jarque_bera_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Jarque-Bera test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn durbin_watson_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::durbin_watson_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Durbin-Watson test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn shapiro_wilk_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::shapiro_wilk_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Shapiro-Wilk test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn anderson_darling_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::anderson_darling_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Anderson-Darling test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn cooks_distance_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::cooks_distance_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Cook's distance result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn dfbetas_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::dfbetas_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize DFBETAS result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn dffits_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::dffits_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize DFFITS result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn vif_test(y_json: &str, x_vars_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
match diagnostics::vif_test(&y, &x_vars) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize VIF result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn reset_test(y_json: &str, x_vars_json: &str, powers_json: &str, type_: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
let powers: Vec<usize> = match serde_json::from_str(powers_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse powers: {}", e)),
};
let reset_type = match type_.to_lowercase().as_str() {
"regressor" => diagnostics::ResetType::Regressor,
"princomp" => diagnostics::ResetType::PrincipalComponent,
_ => diagnostics::ResetType::Fitted,
};
match diagnostics::reset_test(&y, &x_vars, &powers, reset_type) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize RESET test result")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn breusch_godfrey_test(y_json: &str, x_vars_json: &str, order: usize, test_type: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let y: Vec<f64> = match serde_json::from_str(y_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse y: {}", e)),
};
let x_vars: Vec<Vec<f64>> = match serde_json::from_str(x_vars_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_vars: {}", e)),
};
let bg_test_type = match test_type.to_lowercase().as_str() {
"f" => diagnostics::BGTestType::F,
_ => diagnostics::BGTestType::Chisq,
};
match diagnostics::breusch_godfrey_test(&y, &x_vars, order, bg_test_type) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize Breusch-Godfrey test result")),
Err(e) => error_json(&e.to_string()),
}
}