qsym2/bindings/python/
mod.rs

1//! Python bindings for QSym².
2
3use pyo3::prelude::*;
4
5pub mod integrals;
6pub mod molecule_symmetrisation;
7pub mod projection;
8pub mod representation_analysis;
9pub mod symmetry_group_detection;
10
11use crate::analysis::EigenvalueComparisonMode;
12use crate::drivers::representation_analysis::MagneticSymmetryAnalysisKind;
13use crate::interfaces::cli::{qsym2_output_contributors, qsym2_output_heading};
14use crate::symmetry::symmetry_transformation::SymmetryTransformationKind;
15
16#[cfg(feature = "sandbox")]
17use crate::sandbox::bindings::python::register_sandbox_module;
18
19/// Python module for QSym² implemented in Rust.
20#[pymodule]
21pub fn qsym2(_py: Python<'_>, m: Bound<'_, PyModule>) -> PyResult<()> {
22    // --------------
23    // Python logging
24    // --------------
25    pyo3_log::init();
26
27    // -------
28    // Version
29    // -------
30    m.add("__version__", env!("CARGO_PKG_VERSION"))?;
31
32    // ---------
33    // Functions
34    // ---------
35    m.add_function(wrap_pyfunction!(qsym2_output_heading, &m)?)?;
36    m.add_function(wrap_pyfunction!(qsym2_output_contributors, &m)?)?;
37    m.add_function(wrap_pyfunction!(
38        symmetry_group_detection::detect_symmetry_group,
39        &m
40    )?)?;
41    m.add_function(wrap_pyfunction!(
42        molecule_symmetrisation::symmetrise_molecule,
43        &m
44    )?)?;
45    m.add_function(wrap_pyfunction!(
46        projection::density::project_densities,
47        &m
48    )?)?;
49    m.add_function(wrap_pyfunction!(
50        projection::slater_determinant::project_slater_determinant,
51        &m
52    )?)?;
53    m.add_function(wrap_pyfunction!(
54        representation_analysis::density::rep_analyse_densities,
55        &m
56    )?)?;
57    m.add_function(wrap_pyfunction!(
58        representation_analysis::slater_determinant::rep_analyse_slater_determinant,
59        &m
60    )?)?;
61    m.add_function(wrap_pyfunction!(
62        representation_analysis::multideterminant::rep_analyse_multideterminants_orbit_basis_external_solver,
63        &m
64    )?)?;
65    m.add_function(wrap_pyfunction!(
66        representation_analysis::multideterminant::rep_analyse_multideterminants_orbit_basis_internal_solver,
67        &m
68    )?)?;
69    m.add_function(wrap_pyfunction!(
70        representation_analysis::multideterminant::rep_analyse_multideterminants_eager_basis,
71        &m
72    )?)?;
73    m.add_function(wrap_pyfunction!(
74        representation_analysis::vibrational_coordinate::rep_analyse_vibrational_coordinate_collection,
75        &m
76    )?)?;
77    #[cfg(feature = "integrals")]
78    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_real, &m)?)?;
79    #[cfg(feature = "integrals")]
80    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_complex, &m)?)?;
81    #[cfg(feature = "integrals")]
82    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_real, &m)?)?;
83    #[cfg(feature = "integrals")]
84    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_complex, &m)?)?;
85
86    // -------
87    // Classes
88    // -------
89    m.add_class::<integrals::PyBasisAngularOrder>()?;
90    m.add_class::<integrals::PySpinConstraint>()?;
91    m.add_class::<integrals::PySpinOrbitCoupled>()?;
92    m.add_class::<integrals::ShellType>()?;
93    #[cfg(feature = "integrals")]
94    m.add_class::<integrals::PyBasisShellContraction>()?;
95    m.add_class::<symmetry_group_detection::PyMolecule>()?;
96    m.add_class::<symmetry_group_detection::PySymmetry>()?;
97    m.add_class::<symmetry_group_detection::PySymmetryElementKind>()?;
98    m.add_class::<representation_analysis::density::PyDensityReal>()?;
99    m.add_class::<representation_analysis::density::PyDensityComplex>()?;
100    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsReal>()?;
101    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsComplex>()?;
102    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantReal>()?;
103    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantComplex>()?;
104    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionReal>()?;
105    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionComplex>()?;
106    m.add_class::<EigenvalueComparisonMode>()?;
107    m.add_class::<MagneticSymmetryAnalysisKind>()?;
108    m.add_class::<SymmetryTransformationKind>()?;
109
110    // ----------
111    // Submodules
112    // ----------
113    #[cfg(feature = "sandbox")]
114    register_sandbox_module(_py, m)?;
115
116    Ok(())
117}