qsym2/interfaces/input/
analysis.rs1use std::path::PathBuf;
4
5use anyhow;
6use serde::{Deserialize, Serialize};
7
8use crate::drivers::molecule_symmetrisation_bootstrap::MoleculeSymmetrisationBootstrapParams;
9use crate::drivers::representation_analysis::angular_function::AngularFunctionRepAnalysisParams;
10use crate::drivers::representation_analysis::slater_determinant::SlaterDeterminantRepAnalysisParams;
11#[cfg(feature = "qchem")]
12use crate::drivers::representation_analysis::vibrational_coordinate::VibrationalCoordinateRepAnalysisParams;
13use crate::interfaces::binaries::BinariesSlaterDeterminantSource;
14use crate::interfaces::input::SymmetryGroupDetectionInputKind;
15#[cfg(feature = "qchem")]
16use crate::interfaces::qchem::{
17 QChemArchiveSlaterDeterminantSource, QChemArchiveVibrationalCoordinateSource,
18};
19
20#[derive(Clone, Serialize, Deserialize)]
31pub enum AnalysisTarget {
32 MolecularSymmetry {
35 xyz: PathBuf,
37
38 symmetrisation: Option<MoleculeSymmetrisationBootstrapParams>,
40 },
41
42 RealSlaterDeterminant(SlaterDeterminantControl),
45
46 #[cfg(feature = "qchem")]
49 VibrationalCoordinates(VibrationalCoordinateControl),
50}
51
52impl AnalysisTarget {
53 pub(crate) fn all_default() -> Vec<Self> {
56 vec![
57 AnalysisTarget::MolecularSymmetry {
58 xyz: PathBuf::from("path/to/xyz"),
59 symmetrisation: Some(MoleculeSymmetrisationBootstrapParams::default()),
60 },
61 AnalysisTarget::RealSlaterDeterminant(SlaterDeterminantControl::default()),
62 #[cfg(feature = "qchem")]
63 AnalysisTarget::VibrationalCoordinates(VibrationalCoordinateControl::default()),
64 ]
65 }
66}
67
68impl Default for AnalysisTarget {
69 fn default() -> Self {
70 AnalysisTarget::RealSlaterDeterminant(SlaterDeterminantControl::default())
71 }
72}
73
74pub(crate) trait SlaterDeterminantSourceHandle {
80 type Outcome;
81
82 fn sd_source_handle(
84 &self,
85 pd_params_inp: &SymmetryGroupDetectionInputKind,
86 afa_params: &AngularFunctionRepAnalysisParams,
87 sda_params: &SlaterDeterminantRepAnalysisParams<f64>,
88 ) -> Result<Self::Outcome, anyhow::Error>;
89}
90
91#[derive(Clone, Serialize, Deserialize, Default)]
94pub struct SlaterDeterminantControl {
95 pub source: SlaterDeterminantSource,
97
98 pub control: SlaterDeterminantRepAnalysisParams<f64>,
100}
101
102#[derive(Clone, Serialize, Deserialize)]
105pub enum SlaterDeterminantSource {
106 #[cfg(feature = "qchem")]
109 QChemArchive(QChemArchiveSlaterDeterminantSource),
110
111 Binaries(BinariesSlaterDeterminantSource),
113}
114
115#[cfg(feature = "qchem")]
116impl Default for SlaterDeterminantSource {
117 fn default() -> Self {
118 SlaterDeterminantSource::QChemArchive(QChemArchiveSlaterDeterminantSource::default())
119 }
120}
121
122#[cfg(not(feature = "qchem"))]
123impl Default for SlaterDeterminantSource {
124 fn default() -> Self {
125 SlaterDeterminantSource::Binaries(BinariesSlaterDeterminantSource::default())
126 }
127}
128
129#[cfg(feature = "qchem")]
135pub(crate) trait VibrationalCoordinateSourceHandle {
136 type Outcome;
137
138 fn vc_source_handle(
140 &self,
141 pd_params_inp: &SymmetryGroupDetectionInputKind,
142 afa_params: &AngularFunctionRepAnalysisParams,
143 vca_params: &VibrationalCoordinateRepAnalysisParams<f64>,
144 ) -> Result<Self::Outcome, anyhow::Error>;
145}
146
147#[cfg(feature = "qchem")]
150#[derive(Clone, Serialize, Deserialize, Default)]
151pub struct VibrationalCoordinateControl {
152 pub source: VibrationalCoordinateSource,
154
155 pub control: VibrationalCoordinateRepAnalysisParams<f64>,
157}
158
159#[cfg(feature = "qchem")]
162#[derive(Clone, Serialize, Deserialize)]
163pub enum VibrationalCoordinateSource {
164 QChemArchive(QChemArchiveVibrationalCoordinateSource),
167}
168
169#[cfg(feature = "qchem")]
170impl Default for VibrationalCoordinateSource {
171 fn default() -> Self {
172 VibrationalCoordinateSource::QChemArchive(QChemArchiveVibrationalCoordinateSource::default())
173 }
174}