21#ifndef _libint2_src_bin_libint_quanta_h_
22#define _libint2_src_bin_libint_quanta_h_
27#include <global_macros.h>
37 public Hashable<LIBINT2_UINT_LEAST64,ComputeKey> {
39 typedef DummyIterator iter_type;
44 virtual std::string label()
const =0;
49 virtual void inc(
unsigned int i) =0;
51 virtual void dec(
unsigned int i) =0;
73 std::string label()
const override;
76 void inc(
unsigned int i)
override { ++qn_.at(i); }
78 void dec(
unsigned int i)
override {
80 if (qn_.at(i) == T(0))
81 throw std::runtime_error(
"QuantumNumbers::dec -- quantum number already zero");
87 const T
elem(
unsigned int i)
const {
97 LIBINT2_UINT_LEAST64
key()
const override {
98 LIBINT2_UINT_LEAST64
key = 0;
99 LIBINT2_UINT_LEAST64 pfac = 1;
101 for(
int i=maxi; i>=0; i--) {
111 LIBINT2_UINT_LEAST64
max_key = 1;
113 for(
int i=maxi; i>=0; i--) {
121 template<
typename T,
unsigned int N>
122 QuantumNumbers<T,N>::QuantumNumbers(
const std::vector<T>& qn) :
127 template<
typename T,
unsigned int N>
128 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumNumbers>& sptr) :
133 template<
typename T,
unsigned int N>
134 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumSet>& sptr)
136 const SafePtr< QuantumNumbers<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbers,QuantumSet>(sptr);
139 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbers");
142 qn_ = sptr_cast->qn_;
145 template<
typename T,
unsigned int N>
146 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<ConstructablePolymorphically>& sptr)
148 const SafePtr< QuantumNumbers<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbers,ConstructablePolymorphically>(sptr);
151 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbers");
154 qn_ = sptr_cast->qn_;
157 template<
typename T,
unsigned int N>
158 QuantumNumbers<T,N>::QuantumNumbers(
const ConstructablePolymorphically& sptr)
160 const QuantumNumbers<T,N>& sptr_cast =
dynamic_cast<const QuantumNumbers&
>(sptr);
164 template<
typename T,
unsigned int N>
165 QuantumNumbers<T,N>::~QuantumNumbers()
169 template<
typename T,
unsigned int N>
171 QuantumNumbers<T,N>::operator==(
const QuantumNumbers& a)
const
176 template<
typename T,
unsigned int N>
178 QuantumNumbers<T,N>::label()
const
180 std::ostringstream oss;
184 for(
int i=1; i<qn_.size(); i++)
185 oss <<
"," << qn_[i];
216 std::string label()
const override;
219 void inc(
unsigned int i)
override { ++qn_[i]; }
221 void dec(
unsigned int i)
override {
224 throw std::runtime_error(
"QuantumNumbersA::dec -- quantum number already zero");
230 const T
elem(
unsigned int i)
const {
245 LIBINT2_UINT_LEAST64
key()
const override {
246 LIBINT2_UINT_LEAST64
key = 0;
247 LIBINT2_UINT_LEAST64 pfac = 1;
249 for(
int i=maxi; i>=0; i--) {
259 LIBINT2_UINT_LEAST64
max_key = 1;
261 for(
int i=maxi; i>=0; i--) {
269 template<
typename T,
unsigned int N>
270 QuantumNumbersA<T,N>::QuantumNumbersA(
const T& val)
272 for(
unsigned int i=0; i<N; i++)
276 template<
typename T,
unsigned int N>
277 QuantumNumbersA<T,N>::QuantumNumbersA(
const T* qn)
279 for(
int i=0; i<N; i++)
283 template<
typename T,
unsigned int N>
284 QuantumNumbersA<T,N>::QuantumNumbersA(
const std::vector<T>& qn)
286 for(
int i=0; i<N; i++)
290 template<
typename T,
unsigned int N>
291 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<QuantumNumbersA>& sptr)
294 for(
unsigned int i=0; i<N; i++)
298 template<
typename T,
unsigned int N>
299 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<QuantumSet>& sptr)
301 const SafePtr< QuantumNumbersA<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbersA,QuantumSet>(sptr);
304 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
307 T* qn = sptr_cast->qn_;
308 for(
int i=0; i<N; i++)
312 template<
typename T,
unsigned int N>
313 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<ConstructablePolymorphically>& sptr)
315 const SafePtr< QuantumNumbersA<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbersA,ConstructablePolymorphically>(sptr);
318 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
320 T* qn = sptr_cast->qn_;
321 for(
int i=0; i<N; i++)
325 template<
typename T,
unsigned int N>
326 QuantumNumbersA<T,N>::~QuantumNumbersA()
330 template<
typename T,
unsigned int N>
332 QuantumNumbersA<T,N>::operator==(
const QuantumNumbersA& a)
const
335 const T* qn1 = a.qn_;
336 for(
int i=0; i<N; i++, ++qn0, ++qn1)
343 template<
typename T,
unsigned int N>
345 QuantumNumbersA<T,N>::label()
const
347 std::ostringstream oss;
351 for(
unsigned int i=1; i<N; i++)
352 oss <<
"," << qn_[i];
367 QuantumNumbersA(
const std::vector<T>& qn) {}
368 QuantumNumbersA(
const SafePtr<QuantumNumbersA>&) {}
369 QuantumNumbersA(
const SafePtr<QuantumSet>&) {}
370 QuantumNumbersA(
const SafePtr<ConstructablePolymorphically>&) {}
371 ~QuantumNumbersA() {}
373 bool operator==(
const QuantumNumbersA&)
const {
return true; }
374 std::string label()
const override {
return "{}"; }
377 void inc(
unsigned int i)
override {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to increment"); }
379 void dec(
unsigned int i)
override {
380 throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to decrement");
383 const T
elem(
unsigned int i)
const {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to return"); }
388 LIBINT2_UINT_LEAST64
key()
const override {
return 0; }
391 LIBINT2_UINT_LEAST64
max_key()
const {
return 1; }
396 template <
typename T,
unsigned int N>
ConstructablePolymorphically is a base for all objects which can be constructed using a SafePtr to a ...
Definition: polyconstr.h:31
Objects of Hashable<T> class provide hashing function key() which computes keys of type KeyType.
Definition: hashable.h:74
unsigned int num_quanta() const override
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:385
void dec(unsigned int i) override
Decrement quantum number i.
Definition: quanta.h:379
void inc(unsigned int i) override
Increment quantum number i.
Definition: quanta.h:377
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:391
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:363
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:383
LIBINT2_UINT_LEAST64 key() const override
Implements Hashable::key()
Definition: quanta.h:388
QuantumNumbersA<T,N> is a set of N quantum numbers of type T implemented in terms of a C-style array.
Definition: quanta.h:197
LIBINT2_UINT_LEAST64 key() const override
Implements Hashable::key()
Definition: quanta.h:245
void dec(unsigned int i) override
Decrement quantum number i.
Definition: quanta.h:221
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:204
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:230
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:258
void inc(unsigned int i) override
Increment quantum number i.
Definition: quanta.h:219
void set_elem(unsigned int i, const T &value)
Return i-th quantum number.
Definition: quanta.h:235
unsigned int num_quanta() const override
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:240
QuantumNumbers<T,N> is a set of N quantum numbers of type T implemented in terms of std::vector.
Definition: quanta.h:56
unsigned int num_quanta() const
Return i-th quantum number.
Definition: quanta.h:92
void inc(unsigned int i) override
Increment quantum number i.
Definition: quanta.h:76
void dec(unsigned int i) override
Decrement quantum number i.
Definition: quanta.h:78
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:110
LIBINT2_UINT_LEAST64 key() const override
Implements Hashable::key()
Definition: quanta.h:97
QuantumNumbers iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:63
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:87
QuantumSet is the base class for all (sets of) quantum numbers.
Definition: quanta.h:37
virtual unsigned int num_quanta() const =0
Number of quantum numbers in the set.
virtual void dec(unsigned int i)=0
Decrement i-th quantum number.
static const LIBINT2_UINT_LEAST64 max_quantum_number
Quantum numbers lie in range [0,max_quantum_number)
Definition: quanta.h:41
virtual void inc(unsigned int i)=0
Increment i-th quantum number.
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
DefaultQuantumNumbers< unsignedint, 1 >::Result mType
mType is the type that describes the auxiliary index of standard 2-body repulsion integrals
Definition: quanta.h:408
DefaultQuantumNumbers< int, 0 >::Result EmptySet
EmptySet is the type that describes null set of auxiliary indices.
Definition: quanta.h:404
Default implementation of QuantumNumbers.
Definition: quanta.h:397
QuantumNumbersA< T, N > Result
This defines which QuantumNumbers implementation to use.
Definition: quanta.h:399