Skip to main content

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::multideterminant::rep_analyse_multideterminants_fci_basis,
75        &m
76    )?)?;
77    m.add_function(wrap_pyfunction!(
78        representation_analysis::vibrational_coordinate::rep_analyse_vibrational_coordinate_collection,
79        &m
80    )?)?;
81    #[cfg(feature = "integrals")]
82    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_real, &m)?)?;
83    #[cfg(feature = "integrals")]
84    m.add_function(wrap_pyfunction!(integrals::calc_overlap_2c_complex, &m)?)?;
85    #[cfg(feature = "integrals")]
86    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_real, &m)?)?;
87    #[cfg(feature = "integrals")]
88    m.add_function(wrap_pyfunction!(integrals::calc_overlap_4c_complex, &m)?)?;
89
90    // -------
91    // Classes
92    // -------
93    m.add_class::<integrals::PyBasisAngularOrder>()?;
94    m.add_class::<integrals::PySpinConstraint>()?;
95    m.add_class::<integrals::PySpinOrbitCoupled>()?;
96    m.add_class::<integrals::ShellType>()?;
97    #[cfg(feature = "integrals")]
98    m.add_class::<integrals::PyBasisShellContraction>()?;
99    m.add_class::<symmetry_group_detection::PyMolecule>()?;
100    m.add_class::<symmetry_group_detection::PySymmetry>()?;
101    m.add_class::<symmetry_group_detection::PySymmetryElementKind>()?;
102    m.add_class::<representation_analysis::density::PyDensityReal>()?;
103    m.add_class::<representation_analysis::density::PyDensityComplex>()?;
104    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsReal>()?;
105    m.add_class::<representation_analysis::multideterminant::PyMultiDeterminantsComplex>()?;
106    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantReal>()?;
107    m.add_class::<representation_analysis::slater_determinant::PySlaterDeterminantComplex>()?;
108    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionReal>()?;
109    m.add_class::<representation_analysis::vibrational_coordinate::PyVibrationalCoordinateCollectionComplex>()?;
110    m.add_class::<EigenvalueComparisonMode>()?;
111    m.add_class::<MagneticSymmetryAnalysisKind>()?;
112    m.add_class::<SymmetryTransformationKind>()?;
113
114    // ----------
115    // Submodules
116    // ----------
117    #[cfg(feature = "sandbox")]
118    register_sandbox_module(_py, m)?;
119
120    Ok(())
121}