20#include "ONVBasis/SpinResolvedONVBasis.hpp"
33template <
typename _Scalar>
84 template <
typename Z = Scalar>
87 const auto onv_basis_J = linear_expansion_J.
onvBasis();
88 const auto onv_basis_I = linear_expansion_I.
onvBasis();
90 if ((onv_basis_J.alpha().numberOfElectrons() - onv_basis_I.alpha().numberOfElectrons() != 0) && (onv_basis_J.beta().numberOfElectrons() - onv_basis_I.beta().numberOfElectrons() != 1)) {
91 if ((onv_basis_J.alpha().numberOfElectrons() - onv_basis_I.alpha().numberOfElectrons() != 1) && (onv_basis_J.beta().numberOfElectrons() - onv_basis_I.beta().numberOfElectrons() != 0)) {
92 throw std::runtime_error(
"DysonOrbital::TransitionAmplitudes(LinearExpansion, LinearExpansion): linear_expansion_I is not expressed in a spin-resolved ONV basis with one fewer electron than linear_expansion_J.");
101 auto passive_onv_basis_J = onv_basis_J.alpha();
102 auto passive_onv_basis_I = onv_basis_I.alpha();
103 auto target_onv_basis_J = onv_basis_J.beta();
104 auto target_onv_basis_I = onv_basis_I.beta();
107 size_t passive_mod_J = target_onv_basis_J.dimension();
108 size_t passive_mod_I = target_onv_basis_I.dimension();
109 size_t target_mod = 1;
112 if ((onv_basis_J.alpha().numberOfElectrons() - onv_basis_I.alpha().numberOfElectrons() == 1) && (onv_basis_J.beta().numberOfElectrons() - onv_basis_I.beta().numberOfElectrons() == 0)) {
113 passive_onv_basis_J = target_onv_basis_J;
114 passive_onv_basis_I = target_onv_basis_I;
115 target_onv_basis_J = onv_basis_J.alpha();
116 target_onv_basis_I = onv_basis_I.alpha();
120 target_mod = passive_onv_basis_J.dimension();
123 const auto& ci_coeffs_J = linear_expansion_J.
coefficients();
124 const auto& ci_coeffs_I = linear_expansion_I.
coefficients();
133 SpinUnresolvedONV onv = target_onv_basis_J.constructONVFromAddress(0);
135 for (
size_t Jt = 0; Jt < target_onv_basis_J.dimension(); Jt++) {
137 for (
size_t e = 0; e < target_onv_basis_J.numberOfElectrons(); e++) {
141 size_t p = onv.occupationIndexOf(e);
146 size_t address = target_onv_basis_I.addressOf(onv.unsignedRepresentation());
149 for (
size_t Jp = 0; Jp < passive_onv_basis_J.dimension(); Jp++) {
150 coeff += sign * ci_coeffs_J(Jt * target_mod + Jp * passive_mod_J) * ci_coeffs_I(address * target_mod + Jp * passive_mod_I);
152 dyson_coeffs(p) += coeff;
156 if (Jt < target_onv_basis_J.dimension() - 1) {
157 target_onv_basis_J.transformONVToNextPermutation(onv);
172 template <
typename Z = Scalar>
177 const auto onv_basis_J = linear_expansion_J.
onvBasis();
178 const auto onv_basis_I = linear_expansion_I.
onvBasis();
180 if (onv_basis_J.numberOfElectrons() - onv_basis_I.numberOfElectrons() != 1) {
181 throw std::runtime_error(
"DysonOrbital::TransitionAmplitudes(LinearExpansion, LinearExpansion): linear_expansion_I is not expressed in a spin-unresolved ONV basis with one fewer electron than linear_expansion_J.");
184 const auto& ci_coeffs_J = linear_expansion_J.
coefficients();
185 const auto& ci_coeffs_I = linear_expansion_I.
coefficients();
194 SpinUnresolvedONV onv = onv_basis_J.constructONVFromAddress(0);
197 for (
size_t J = 0; J < onv_basis_J.dimension(); J++) {
199 for (
size_t e = 0; e < onv_basis_J.numberOfElectrons(); e++) {
203 size_t p = onv.occupationIndexOf(e);
208 size_t address = onv_basis_I.addressOf(onv.unsignedRepresentation());
210 coeff = sign * ci_coeffs_J(J) * ci_coeffs_I(address);
212 dyson_coeffs(p) += coeff;
216 if (J < onv_basis_J.dimension() - 1) {
217 onv_basis_J.transformONVToNextPermutation(onv);
Definition: DysonOrbital.hpp:34
DysonOrbital(const VectorX< Scalar > &litudes)
Definition: DysonOrbital.hpp:69
static enable_if_t< std::is_same< Z, double >::value, DysonOrbital< double > > TransitionAmplitudes(const LinearExpansion< double, SpinResolvedONVBasis > &linear_expansion_J, const LinearExpansion< double, SpinResolvedONVBasis > &linear_expansion_I)
Definition: DysonOrbital.hpp:85
_Scalar Scalar
Definition: DysonOrbital.hpp:37
DysonOrbital(const size_t K)
Definition: DysonOrbital.hpp:60
const VectorX< Scalar > & amplitudes() const
Definition: DysonOrbital.hpp:231
static enable_if_t< std::is_same< Z, double >::value, DysonOrbital< double > > TransitionAmplitudes(const LinearExpansion< double, SpinUnresolvedONVBasis > &linear_expansion_J, const LinearExpansion< double, SpinUnresolvedONVBasis > &linear_expansion_I)
Definition: DysonOrbital.hpp:173
Definition: LinearExpansion.hpp:59
const VectorX< Scalar > & coefficients() const
Definition: LinearExpansion.hpp:393
const ONVBasis & onvBasis() const
Definition: LinearExpansion.hpp:398
Definition: Matrix.hpp:47
Definition: BaseOneElectronIntegralBuffer.hpp:25
typename std::enable_if< B, T >::type enable_if_t
Definition: type_traits.hpp:37