Skip to main content

ocas_py/
lib.rs

1//! Python bindings for oCAS.
2//!
3//! The top-level Python module is named `ocas` (see `pyproject.toml`).
4//!
5//! # Quick start
6//!
7//! ```python
8//! import ocas
9//!
10//! e = ocas.Expression("x^2 + 2*x + 1")
11//! print(e.diff("x"))                 # derivative
12//! print(e.simplify())
13//!
14//! print(ocas.solve_diophantine(3, 5, 1))
15//! ```
16
17use pyo3::prelude::*;
18
19pub mod domain;
20pub mod eval;
21pub mod expression;
22pub mod matrix;
23pub mod polynomial;
24pub mod solve;
25
26pub use domain::{PyFiniteField, PyIntegerDomain, PyRationalDomain};
27pub use eval::PyExpressionEvaluator;
28pub use expression::Expression;
29pub use matrix::PyMatrix;
30pub use polynomial::{PyPolynomial, PyPolynomialFactor};
31pub use solve::{
32    PyDiophantineSolution, py_solve_diophantine, py_solve_linear_integer, py_solve_linear_rational,
33};
34
35/// The oCAS Python module entry point.
36///
37/// The function name `ocas` determines the exported symbol `PyInit_ocas`,
38/// which Python looks for when importing the module named `ocas`.
39#[pymodule]
40fn ocas(m: &Bound<'_, PyModule>) -> PyResult<()> {
41    m.add("__version__", env!("CARGO_PKG_VERSION"))?;
42
43    m.add_class::<Expression>()?;
44    m.add_class::<PyExpressionEvaluator>()?;
45    m.add_class::<PyDiophantineSolution>()?;
46    m.add_class::<PyPolynomial>()?;
47    m.add_class::<PyPolynomialFactor>()?;
48    m.add_class::<PyMatrix>()?;
49    m.add_class::<PyIntegerDomain>()?;
50    m.add_class::<PyRationalDomain>()?;
51    m.add_class::<PyFiniteField>()?;
52
53    m.add_function(wrap_pyfunction!(py_solve_linear_rational, m)?)?;
54    m.add_function(wrap_pyfunction!(py_solve_linear_integer, m)?)?;
55    m.add_function(wrap_pyfunction!(py_solve_diophantine, m)?)?;
56
57    Ok(())
58}