qsym2/bindings/python/
mod.rs

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