pub mod calculus;
pub mod numeric;
pub mod solve;
pub mod symreg;
pub use symreg::PyDiscoveredFormula;
pub use symreg::PySymRegEngine;
use pyo3::prelude::*;
#[pyclass(name = "SymRegConfig", from_py_object)]
#[derive(Clone)]
pub struct PySymRegConfig {
pub(crate) inner: crate::symreg::SymRegConfig,
pub max_formulas: usize,
pub uq_analytic: bool,
pub smt_prune_solver: bool,
}
#[pymethods]
impl PySymRegConfig {
#[staticmethod]
pub fn quick() -> Self {
Self {
inner: crate::symreg::SymRegConfig::quick(),
max_formulas: 0,
uq_analytic: false,
smt_prune_solver: false,
}
}
#[staticmethod]
pub fn balanced() -> Self {
Self {
inner: crate::symreg::SymRegConfig::balanced(),
max_formulas: 0,
uq_analytic: false,
smt_prune_solver: false,
}
}
#[staticmethod]
pub fn exhaustive() -> Self {
Self {
inner: crate::symreg::SymRegConfig::exhaustive(),
max_formulas: 0,
uq_analytic: false,
smt_prune_solver: false,
}
}
#[getter]
pub fn depth_limit(&self) -> usize {
self.inner.max_depth
}
#[setter]
pub fn set_depth_limit(&mut self, v: usize) {
self.inner.max_depth = v;
}
#[getter]
pub fn get_max_formulas(&self) -> usize {
self.max_formulas
}
#[setter]
pub fn set_max_formulas(&mut self, v: usize) {
self.max_formulas = v;
}
#[getter]
pub fn adam_steps(&self) -> usize {
self.inner.max_iter
}
#[setter]
pub fn set_adam_steps(&mut self, v: usize) {
self.inner.max_iter = v;
}
#[getter]
pub fn seed(&self) -> Option<u64> {
self.inner.seed
}
#[setter]
pub fn set_seed(&mut self, v: Option<u64>) {
self.inner.seed = v;
}
#[getter]
pub fn get_uq_analytic(&self) -> bool {
self.uq_analytic
}
#[setter]
pub fn set_uq_analytic(&mut self, v: bool) {
self.uq_analytic = v;
self.inner.uq_analytic = v;
}
#[getter]
pub fn get_smt_prune_solver(&self) -> bool {
self.smt_prune_solver
}
#[setter]
pub fn set_smt_prune_solver(&mut self, v: bool) {
self.smt_prune_solver = v;
self.inner.smt_prune_solver = v;
}
pub fn __repr__(&self) -> String {
format!(
"SymRegConfig(depth_limit={}, adam_steps={}, max_formulas={}, uq_analytic={}, smt_prune_solver={})",
self.inner.max_depth,
self.inner.max_iter,
self.max_formulas,
self.uq_analytic,
self.smt_prune_solver,
)
}
}
#[pymodule]
pub fn _core(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PySymRegConfig>()?;
m.add_class::<PyDiscoveredFormula>()?;
m.add_class::<PySymRegEngine>()?;
m.add_function(wrap_pyfunction!(calculus::integrate_definite_py, m)?)?;
m.add_function(wrap_pyfunction!(calculus::limit_py, m)?)?;
m.add_function(wrap_pyfunction!(solve::solve_for_all_py, m)?)?;
m.add_function(wrap_pyfunction!(solve::solve_polynomial_complex_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::erf_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::erfc_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::lgamma_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::digamma_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::ei_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::si_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::ci_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::lambert_w0_py, m)?)?;
m.add_function(wrap_pyfunction!(numeric::lambert_wm1_py, m)?)?;
m.add_function(wrap_pyfunction!(symreg::dsolve_py, m)?)?;
Ok(())
}