use pyo3::prelude::*;
fn map_err(e: impl std::fmt::Display) -> PyErr {
pyo3::exceptions::PyValueError::new_err(e.to_string())
}
#[pyfunction]
pub fn solve_for_all_py(expr_str: &str, var: usize) -> PyResult<Vec<String>> {
let tree = crate::parse(expr_str).map_err(map_err)?;
let lowered = tree.lower().simplify();
let zero = crate::LoweredOp::Const(0.0);
let result = crate::solve_for_all(&lowered, &zero, var).map_err(map_err)?;
Ok(result.roots.iter().map(|r| r.to_latex()).collect())
}
#[pyfunction]
pub fn solve_polynomial_complex_py(expr_str: &str, var: usize) -> PyResult<Vec<(f64, f64)>> {
let tree = crate::parse(expr_str).map_err(map_err)?;
let lowered = tree.lower().simplify();
let poly = crate::Poly::from_lowered(&lowered, var)
.map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?;
let complex_roots = crate::solve_poly::solve_polynomial_complex(&poly)
.map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?;
Ok(complex_roots
.roots
.into_iter()
.map(|c| (c.re, c.im))
.collect())
}