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_external_solver,
54        &m
55    )?)?;
56    m.add_function(wrap_pyfunction!(
57        representation_analysis::multideterminant::rep_analyse_multideterminants_orbit_basis_internal_solver,
58        &m
59    )?)?;
60    m.add_function(wrap_pyfunction!(
61        representation_analysis::multideterminant::rep_analyse_multideterminants_eager_basis,
62        &m
63    )?)?;
64    m.add_function(wrap_pyfunction!(
65        representation_analysis::vibrational_coordinate::rep_analyse_vibrational_coordinate_collection,
66        &m
67    )?)?;
68    #[cfg(feature = "integrals")]
69    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_real, &m)?)?;
70    #[cfg(feature = "integrals")]
71    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_complex, &m)?)?;
72    #[cfg(feature = "integrals")]
73    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_real, &m)?)?;
74    #[cfg(feature = "integrals")]
75    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_complex, &m)?)?;
76
77    // -------
78    // Classes
79    // -------
80    m.add_class::<integrals::PyBasisAngularOrder>()?;
81    m.add_class::<integrals::PySpinConstraint>()?;
82    m.add_class::<integrals::PySpinOrbitCoupled>()?;
83    m.add_class::<integrals::ShellType>()?;
84    #[cfg(feature = "integrals")]
85    m.add_class::<integrals::PyBasisShellContraction>()?;
86    m.add_class::<symmetry_group_detection::PyMolecule>()?;
87    m.add_class::<symmetry_group_detection::PySymmetry>()?;
88    m.add_class::<symmetry_group_detection::PySymmetryElementKind>()?;
89    m.add_class::<representation_analysis::density::PyDensityReal>()?;
90    m.add_class::<representation_analysis::density::PyDensityComplex>()?;
91    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsReal>()?;
92    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsComplex>()?;
93    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantReal>()?;
94    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantComplex>()?;
95    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionReal>()?;
96    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionComplex>()?;
97    m.add_class::<EigenvalueComparisonMode>()?;
98    m.add_class::<MagneticSymmetryAnalysisKind>()?;
99    m.add_class::<SymmetryTransformationKind>()?;
100
101    // ----------
102    // Submodules
103    // ----------
104    #[cfg(feature = "sandbox")]
105    register_sandbox_module(_py, m)?;
106
107    Ok(())
108}