#![cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
use super::domain::check_domain;
use crate::error::{error_json, error_to_json};
use crate::polynomial::{
predict, polynomial_elastic_net, polynomial_lasso, polynomial_regression, polynomial_ridge,
PolynomialFit, PolynomialOptions,
};
#[wasm_bindgen]
pub fn polynomial_regression_wasm(
y_json: &str,
x_json: &str,
degree: usize,
center: bool,
standardize: bool,
) -> 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: Vec<f64> = match serde_json::from_str(x_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x: {}", e)),
};
let options = PolynomialOptions {
degree,
center,
standardize,
intercept: true,
};
match polynomial_regression(&y, &x, &options) {
Ok(fit) => serde_json::to_string(&fit)
.unwrap_or_else(|_| error_json("Failed to serialize polynomial fit")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn polynomial_predict_wasm(fit_json: &str, x_new_json: &str) -> String {
if let Err(e) = check_domain() {
return error_to_json(&e);
}
let fit: PolynomialFit = match serde_json::from_str(fit_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse polynomial fit: {}", e)),
};
let x_new: Vec<f64> = match serde_json::from_str(x_new_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x_new: {}", e)),
};
match predict(&fit, &x_new) {
Ok(preds) => serde_json::to_string(&preds)
.unwrap_or_else(|_| error_json("Failed to serialize predictions")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn polynomial_ridge_wasm(
y_json: &str,
x_json: &str,
degree: usize,
lambda: f64,
center: bool,
standardize: bool,
) -> 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: Vec<f64> = match serde_json::from_str(x_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x: {}", e)),
};
match polynomial_ridge(&y, &x, degree, lambda, center, standardize) {
Ok(fit) => serde_json::to_string(&fit)
.unwrap_or_else(|_| error_json("Failed to serialize ridge fit")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn polynomial_lasso_wasm(
y_json: &str,
x_json: &str,
degree: usize,
lambda: f64,
center: bool,
standardize: bool,
) -> 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: Vec<f64> = match serde_json::from_str(x_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x: {}", e)),
};
match polynomial_lasso(&y, &x, degree, lambda, center, standardize) {
Ok(fit) => serde_json::to_string(&fit)
.unwrap_or_else(|_| error_json("Failed to serialize lasso fit")),
Err(e) => error_json(&e.to_string()),
}
}
#[wasm_bindgen]
pub fn polynomial_elastic_net_wasm(
y_json: &str,
x_json: &str,
degree: usize,
lambda: f64,
alpha: f64,
center: bool,
standardize: bool,
) -> 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: Vec<f64> = match serde_json::from_str(x_json) {
Ok(v) => v,
Err(e) => return error_json(&format!("Failed to parse x: {}", e)),
};
match polynomial_elastic_net(&y, &x, degree, lambda, alpha, center, standardize) {
Ok(fit) => serde_json::to_string(&fit)
.unwrap_or_else(|_| error_json("Failed to serialize elastic net fit")),
Err(e) => error_json(&e.to_string()),
}
}