use pyo3::prelude::*;
use crate::python_interface::modules::PySequential;
use crate::python_interface::layers::{PyEmbeddingBag, PyLinear};
use crate::python_interface::policy::PyPolicy;
fn init_nn_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PyEmbeddingBag>()?;
m.add_class::<PySequential>()?;
m.add_class::<PyLinear>()?;
m.add_class::<PyPolicy>()?;
Ok(())
}
use crate::python_interface::pyenv::PyEnv;
use crate::python_interface::env::{PyPuzzleEnv, PyBaseEnv, solve_py, evaluate_py};
fn init_env_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PyPuzzleEnv>()?;
m.add_class::<PyBaseEnv>()?;
m.add_class::<PyEnv>()?;
Ok(())
}
use crate::python_interface::collector::PyPPOCollector;
use crate::python_interface::collector::PyAZCollector;
use crate::python_interface::collector::PyCollectedData;
fn init_collector_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PyPPOCollector>()?;
m.add_class::<PyAZCollector>()?;
m.add_class::<PyCollectedData>()?;
m.add_function(wrap_pyfunction!(solve_py, m)?)?;
m.add_function(wrap_pyfunction!(evaluate_py, m)?)?;
Ok(())
}
fn add_twisterl_functionality(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
let nn_submod = PyModule::new(py, "nn")?;
init_nn_module(&nn_submod)?;
m.add_submodule(&nn_submod)?;
let env_submod = PyModule::new(py, "env")?;
init_env_module(&env_submod)?;
m.add_submodule(&env_submod)?;
let collector_submod = PyModule::new(py, "collector")?;
init_collector_module(&collector_submod)?;
m.add_submodule(&collector_submod)?;
Ok(())
}
#[pymodule]
fn twisterl(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
add_twisterl_functionality(py, m)?;
Ok(())
}