#![cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
use super::domain::check_domain;
use crate::core;
use crate::error::{error_json, error_to_json};
#[wasm_bindgen]
pub fn ols_regression(y_json: &str, x_vars_json: &str, variable_names: &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 names: Vec<String> = match serde_json::from_str(variable_names) {
Ok(v) => v,
Err(_) => vec!["Intercept".to_string()],
};
match core::ols_regression(&y, &x_vars, &names) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize output")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn wls_regression(y_json: &str, x_vars_json: &str, weights_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)),
};
let weights: Vec<f64> = match serde_json::from_str(weights_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse weights: {}", e)),
};
match crate::weighted_regression::wls_regression(&y, &x_vars, &weights) {
Ok(output) => serde_json::to_string(&output)
.unwrap_or_else(|_| error_json("Failed to serialize WLS regression result")),
Err(e) => error_json(&e.to_string()),
}
}