42template <
typename _Scalar,
typename _Vectorizer,
typename _DerivedOperator>
44 public SQOperatorStorage<SquareRankFourTensor<_Scalar>, _Vectorizer, SimpleSQTwoElectronOperator<_Scalar, _Vectorizer, _DerivedOperator>>,
78 bool is_antisymmetrized =
false;
81 bool is_expressed_using_chemists_notation =
true;
107 throw std::invalid_argument(
"SimpleSQTwoElectronOperator::calculateExpectationValue(const Derived2DM&): The given 2-DM's dimension is not compatible with the two-electron operator.");
119 Eigen::Tensor<Scalar, 0> contraction = 0.5 *
parameters[i].template einsum<4>(
"pqrs, pqrs->", d.tensor());
122 expectation_values[i] = contraction(0);
139 template <
typename Z = Scalar>
142 if (DM.numberOfOrbitals() != this->numberOfOrbitals()) {
143 throw std::invalid_argument(
"SimpleSQTwoElectronOperator::calculateFockianMatrix(const Derived1DM&, const Derived2DM&): The 1-DM's dimensions are not compatible with this two-electron operator.");
146 if (dm.numberOfOrbitals() != this->numberOfOrbitals()) {
147 throw std::invalid_argument(
"SimpleSQTwoElectronOperator::calculateFockianMatrix(const Derived1DM&, const Derived2DM&): The 2-DM's dimensions are not compatible with this two-electron operator.");
154 const auto& d = dm.tensor();
167 F_i(p, q) += 0.5 * g_i(q, r, s, t) * (d(p, r, s, t) + d(r, p, s, t));
190 template <
typename Z = Scalar>
193 if (DM.numberOfOrbitals() != this->numberOfOrbitals()) {
194 throw std::invalid_argument(
"SimpleSQTwoElectronOperator::calculateFockianMatrix(const Derived1DM&, const Derived2DM&): The given 1-DM's dimensions are not compatible with this two-electron operator.");
197 if (dm.numberOfOrbitals() != this->numberOfOrbitals()) {
198 throw std::invalid_argument(
"SimpleSQTwoElectronOperator::calculateFockianMatrix(const Derived1DM&, const Derived2DM&): The given 2-DM's dimensions are not compatible with this two-electron operator.");
208 const auto& d = dm.tensor();
212 const auto& F_i = F_vector[i];
223 G_i(p, q, r, s) += F_i(p, s);
228 double value = g_i(s, t, q, u) * (d(r, t, p, u) + d(t, r, u, p));
229 value -= g_i(s, t, u, p) * (d(r, t, u, q) + d(t, r, q, u));
230 value -= g_i(s, p, t, u) * (d(r, q, t, u) + d(q, r, u, t));
232 G_i(p, q, r, s) += 0.5 * value;
256 auto& k = k_op.allParameters();
261 for (
size_t p = 0; p < K; p++) {
262 for (
size_t q = 0; q < K; q++) {
263 for (
size_t r = 0; r < K; r++) {
264 k[i](p, q) -= 0.5 * g[i](p, r, r, q);
289 const GQCP::Tensor<Scalar, 2> T_tensor = Eigen::TensorMap<Eigen::Tensor<const Scalar, 2>>(T.matrix().data(), T.matrix().rows(), T.matrix().cols());
303 const auto temp_1 =
parameters[i].template einsum<1>(
"TUVW,VR->TURW", T_conjugate).template einsum<1>(
"TURW,WS->TURS", T_tensor);
306 const auto temp_2 = T_tensor.template einsum<1>(
"UQ,TURS->TQRS", temp_1);
309 const auto transformed_component = T_conjugate.template einsum<1>(
"TP,TQRS->PQRS", temp_2);
311 result[i] = transformed_component;
339 const auto J = Transformation::FromJacobi(jacobi_rotation, this->
numberOfOrbitals());
373 auto& copy_parameters = copy.allParameters();
378 Eigen::array<int, 4> shuffle_indices;
380 shuffle_indices = Eigen::array<int, 4> {0, 3, 2, 1};
382 shuffle_indices = Eigen::array<int, 4> {0, 1, 3, 2};
385 auto& copy_parameters = copy.allParameters();
387 copy_parameters[i] -=
parameters[i].shuffle(shuffle_indices);
390 copy.is_antisymmetrized =
true;
429 auto& copy_parameters = copy.allParameters();
433 Eigen::array<int, 4> shuffle_indices {0, 2, 1, 3};
439 copy.is_expressed_using_chemists_notation =
true;
453 auto& copy_parameters = copy.allParameters();
457 Eigen::array<int, 4> shuffle_indices {0, 2, 1, 3};
463 copy.is_expressed_using_chemists_notation =
false;
488template <
typename _Scalar,
typename _Vectorizer,
typename _DerivedOperator>
509template <
typename _Scalar,
typename _Vectorizer,
typename _DerivedOperator>
524template <
typename _Scalar,
typename _Vectorizer,
typename _DerivedOperator>
Definition: JacobiRotatable.hpp:50
Definition: JacobiRotation.hpp:33
const MatrixRepresentation & parameters(const Indices &... indices) const
Definition: SQOperatorStorageBase.hpp:236
size_t numberOfOrbitals() const
Definition: SQOperatorStorageBase.hpp:277
const std::vector< MatrixRepresentation > & allParameters() const
Definition: SQOperatorStorageBase.hpp:221
StorageArray< MatrixRepresentation, Vectorizer > array
Definition: SQOperatorStorageBase.hpp:68
size_t numberOfComponents() const
Definition: SQOperatorStorageBase.hpp:272
Definition: SQOperatorStorage.hpp:44
Definition: SimpleSQTwoElectronOperator.hpp:46
typename OperatorTraits< DerivedOperator >::Transformation Transformation
Definition: SimpleSQTwoElectronOperator.hpp:73
typename OperatorTraits< DerivedOperator >::TwoDM Derived2DM
Definition: SimpleSQTwoElectronOperator.hpp:70
_Vectorizer Vectorizer
Definition: SimpleSQTwoElectronOperator.hpp:52
enable_if_t< std::is_same< Z, double >::value, StorageArray< SquareRankFourTensor< double >, Vectorizer > > calculateSuperFockianMatrix(const Derived1DM &DM, const Derived2DM &dm) const
Definition: SimpleSQTwoElectronOperator.hpp:191
_DerivedOperator DerivedOperator
Definition: SimpleSQTwoElectronOperator.hpp:55
typename OperatorTraits< DerivedOperator >::SQOneElectronOperator DerivedSQOneElectronOperator
Definition: SimpleSQTwoElectronOperator.hpp:64
DerivedOperator rotated(const JacobiRotation &jacobi_rotation) const override
Definition: SimpleSQTwoElectronOperator.hpp:336
void convertToChemistsNotation()
Definition: SimpleSQTwoElectronOperator.hpp:472
Self convertedToPhysicistsNotation() const
Definition: SimpleSQTwoElectronOperator.hpp:448
enable_if_t< std::is_same< Z, double >::value, StorageArray< SquareMatrix< double >, Vectorizer > > calculateFockianMatrix(const Derived1DM &DM, const Derived2DM &dm) const
Definition: SimpleSQTwoElectronOperator.hpp:140
_Scalar Scalar
Definition: SimpleSQTwoElectronOperator.hpp:49
void antisymmetrize()
Definition: SimpleSQTwoElectronOperator.hpp:404
Self antisymmetrized() const
Definition: SimpleSQTwoElectronOperator.hpp:368
bool isExpressedUsingPhysicistsNotation() const
Definition: SimpleSQTwoElectronOperator.hpp:419
StorageArray< Scalar, Vectorizer > calculateExpectationValue(const Derived2DM &d) const
Definition: SimpleSQTwoElectronOperator.hpp:104
void convertToPhysicistsNotation()
Definition: SimpleSQTwoElectronOperator.hpp:477
bool isExpressedUsingChemistsNotation() const
Definition: SimpleSQTwoElectronOperator.hpp:414
Self convertedToChemistsNotation() const
Definition: SimpleSQTwoElectronOperator.hpp:424
DerivedOperator transformed(const Transformation &T) const override
Definition: SimpleSQTwoElectronOperator.hpp:285
DerivedSQOneElectronOperator effectiveOneElectronPartition() const
Definition: SimpleSQTwoElectronOperator.hpp:249
typename OperatorTraits< DerivedOperator >::OneDM Derived1DM
Definition: SimpleSQTwoElectronOperator.hpp:67
bool isAntisymmetrized() const
Definition: SimpleSQTwoElectronOperator.hpp:358
Definition: SquareMatrix.hpp:39
static Self Zero(const size_t dim)
Definition: SquareMatrix.hpp:289
Definition: StorageArray.hpp:38
const Vectorizer & vectorizer() const
Definition: StorageArray.hpp:177
Definition: Tensor.hpp:46
Definition: BaseOneElectronIntegralBuffer.hpp:25
typename std::enable_if< B, T >::type enable_if_t
Definition: type_traits.hpp:37
Definition: JacobiRotatable.hpp:37
_DerivedOperator DerivedOperator
Definition: SimpleSQTwoElectronOperator.hpp:498
_Scalar Scalar
Definition: SimpleSQTwoElectronOperator.hpp:492
_Vectorizer Vectorizer
Definition: SimpleSQTwoElectronOperator.hpp:495
Definition: OperatorTraits.hpp:28