use serde::Deserialize;
use serde::Serialize;
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::integral_equations::FredholmEquation;
use crate::symbolic::integral_equations::VolterraEquation;
use crate::symbolic::integral_equations::solve_airfoil_equation;
#[derive(Serialize, Deserialize)]
struct FredholmNeumannInput {
equation: FredholmEquation,
iterations: usize,
}
#[derive(Serialize, Deserialize)]
struct FredholmSeparableInput {
equation: FredholmEquation,
a_funcs: Vec<Expr>,
b_funcs: Vec<Expr>,
}
#[derive(Serialize, Deserialize)]
struct VolterraSuccessiveInput {
equation: VolterraEquation,
iterations: usize,
}
#[derive(Serialize, Deserialize)]
struct AirfoilInput {
f_x: Expr,
var_x: String,
var_t: String,
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_fredholm_solve_neumann_bincode(
input_ptr: *const u8,
input_len: usize,
) -> BincodeBuffer {
let input_buffer = BincodeBuffer {
data: input_ptr.cast_mut(),
len: input_len,
};
let input: Option<FredholmNeumannInput> = from_bincode_buffer(&input_buffer);
let input = match input {
| Some(i) => i,
| None => {
return BincodeBuffer::empty();
},
};
let result = input.equation.solve_neumann_series(input.iterations);
to_bincode_buffer(&result)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_fredholm_solve_separable_bincode(
input_ptr: *const u8,
input_len: usize,
) -> BincodeBuffer {
let input_buffer = BincodeBuffer {
data: input_ptr.cast_mut(),
len: input_len,
};
let input: Option<FredholmSeparableInput> = from_bincode_buffer(&input_buffer);
let input = match input {
| Some(i) => i,
| None => {
return BincodeBuffer::empty();
},
};
match input
.equation
.solve_separable_kernel(&input.a_funcs, &input.b_funcs)
{
| Ok(result) => to_bincode_buffer(&result),
| Err(_) => BincodeBuffer::empty(),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_volterra_solve_successive_bincode(
input_ptr: *const u8,
input_len: usize,
) -> BincodeBuffer {
let input_buffer = BincodeBuffer {
data: input_ptr.cast_mut(),
len: input_len,
};
let input: Option<VolterraSuccessiveInput> = from_bincode_buffer(&input_buffer);
let input = match input {
| Some(i) => i,
| None => {
return BincodeBuffer::empty();
},
};
let result = input
.equation
.solve_successive_approximations(input.iterations);
to_bincode_buffer(&result)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_volterra_solve_by_differentiation_bincode(
input_ptr: *const u8,
input_len: usize,
) -> BincodeBuffer {
let input_buffer = BincodeBuffer {
data: input_ptr.cast_mut(),
len: input_len,
};
let equation: Option<VolterraEquation> = from_bincode_buffer(&input_buffer);
let equation = match equation {
| Some(e) => e,
| None => {
return BincodeBuffer::empty();
},
};
match equation.solve_by_differentiation() {
| Ok(result) => to_bincode_buffer(&result),
| Err(_) => BincodeBuffer::empty(),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_solve_airfoil_equation_bincode(
input_ptr: *const u8,
input_len: usize,
) -> BincodeBuffer {
let input_buffer = BincodeBuffer {
data: input_ptr.cast_mut(),
len: input_len,
};
let input: Option<AirfoilInput> = from_bincode_buffer(&input_buffer);
let input = match input {
| Some(i) => i,
| None => {
return BincodeBuffer::empty();
},
};
let result = solve_airfoil_equation(&input.f_x, &input.var_x, &input.var_t);
to_bincode_buffer(&result)
}