use crate::ffi_apis::common::BincodeBuffer;
use crate::ffi_apis::common::from_bincode_buffer;
use crate::ffi_apis::common::to_bincode_buffer;
use crate::symbolic::core::Expr;
use crate::symbolic::stats_regression;
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_simple_linear_regression(data_buf: BincodeBuffer) -> BincodeBuffer {
let data: Option<Vec<(Expr, Expr)>> = from_bincode_buffer(&data_buf);
if let Some(data) = data {
let (b0, b1) = stats_regression::simple_linear_regression_symbolic(&data);
to_bincode_buffer(&vec![b0, b1])
} else {
BincodeBuffer::empty()
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_polynomial_regression(
data_buf: BincodeBuffer,
degree: usize,
) -> BincodeBuffer {
let data: Option<Vec<(Expr, Expr)>> = from_bincode_buffer(&data_buf);
if let Some(data) = data {
match stats_regression::polynomial_regression_symbolic(&data, degree) {
| Ok(coeffs) => to_bincode_buffer(&coeffs),
| Err(_) => BincodeBuffer::empty(),
}
} else {
BincodeBuffer::empty()
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_nonlinear_regression(
data_buf: BincodeBuffer,
model_buf: BincodeBuffer,
vars_buf: BincodeBuffer,
params_buf: BincodeBuffer,
) -> BincodeBuffer {
let data: Option<Vec<(Expr, Expr)>> = from_bincode_buffer(&data_buf);
let model: Option<Expr> = from_bincode_buffer(&model_buf);
let vars: Option<Vec<String>> = from_bincode_buffer(&vars_buf);
let params: Option<Vec<String>> = from_bincode_buffer(¶ms_buf);
match (data, model, vars, params) {
| (Some(data), Some(model), Some(vars), Some(params)) => {
let vars_refs: Vec<&str> = vars.iter().map(std::string::String::as_str).collect();
let params_refs: Vec<&str> = params.iter().map(std::string::String::as_str).collect();
match stats_regression::nonlinear_regression_symbolic(
&data,
&model,
&vars_refs,
¶ms_refs,
) {
| Some(solutions) => to_bincode_buffer(&solutions),
| None => BincodeBuffer::empty(),
}
},
| _ => BincodeBuffer::empty(),
}
}