1use pyo3::prelude::*;
14use pyo3::types::PyDict;
15use pyo3::wrap_pymodule;
16
17pub mod bosons;
18pub mod fermions;
19pub mod mixed_systems;
20pub mod spins;
21
22use thiserror::Error;
23
24#[derive(Debug, Error, PartialEq, Eq)]
26pub enum StruqturePyError {
27 #[error("Failed to convert input to PauliProduct")]
29 ConversionError,
30}
31
32#[pymodule]
47fn struqture_py(_py: Python, module: &Bound<PyModule>) -> PyResult<()> {
48 let wrapper1 = wrap_pymodule!(spins::spins);
49 module.add_wrapped(wrapper1)?;
50
51 let wrapper2 = wrap_pymodule!(fermions::fermions);
52 module.add_wrapped(wrapper2)?;
53
54 let wrapper4 = wrap_pymodule!(mixed_systems::mixed_systems);
55 module.add_wrapped(wrapper4)?;
56
57 let wrapper3 = wrap_pymodule!(bosons::bosons);
58 module.add_wrapped(wrapper3)?;
59
60 let system = PyModule::import(_py, "sys")?;
61 let binding = system.getattr("modules")?;
62 let system_modules: &Bound<PyDict> = binding.downcast()?;
63 system_modules.set_item("struqture_py.spins", module.getattr("spins")?)?;
64 system_modules.set_item("struqture_py.fermions", module.getattr("fermions")?)?;
65 system_modules.set_item(
66 "struqture_py.mixed_systems",
67 module.getattr("mixed_systems")?,
68 )?;
69 system_modules.set_item("struqture_py.bosons", module.getattr("bosons")?)?;
70 Ok(())
71}
72
73use num_complex::Complex64;
74use numpy::{IntoPyArray, PyArray1};
75use struqture::CooSparseMatrix;
76
77pub type PyCooMatrix = (
78 Py<PyArray1<Complex64>>,
79 (Py<PyArray1<usize>>, Py<PyArray1<usize>>),
80);
81
82fn to_py_coo(coo: CooSparseMatrix) -> PyResult<PyCooMatrix> {
85 Python::with_gil(|py| -> PyResult<PyCooMatrix> {
86 let values: Py<PyArray1<Complex64>> = coo.0.into_pyarray(py).into();
87 let rows: Py<PyArray1<usize>> = coo.1 .0.into_pyarray(py).into();
88 let columns: Py<PyArray1<usize>> = coo.1 .1.into_pyarray(py).into();
89 Ok((values, (rows, columns)))
90 })
91}