21 #ifndef _libint2_src_bin_libint_quanta_h_ 22 #define _libint2_src_bin_libint_quanta_h_ 26 #include <smart_ptr.h> 27 #include <global_macros.h> 40 public Hashable<LIBINT2_UINT_LEAST64,ComputeKey> {
42 typedef DummyIterator iter_type;
44 static const LIBINT2_UINT_LEAST64 max_quantum_number = 100;
47 virtual std::string label()
const =0;
50 virtual unsigned int num_quanta()
const =0;
52 virtual void inc(
unsigned int i) =0;
54 virtual void dec(
unsigned int i) =0;
76 std::string label()
const;
79 void inc(
unsigned int i) { ++qn_.at(i); }
81 void dec(
unsigned int i) {
83 if (qn_.at(i) == T(0))
84 throw std::runtime_error(
"QuantumNumbers::dec -- quantum number already zero");
90 const T
elem(
unsigned int i)
const {
100 LIBINT2_UINT_LEAST64
key()
const {
101 LIBINT2_UINT_LEAST64 key = 0;
102 LIBINT2_UINT_LEAST64 pfac = 1;
103 const int maxi = ((int)num_quanta()) - 1;
104 for(
int i=maxi; i>=0; i--) {
106 pfac *= QuantumSet::max_quantum_number;
108 assert(key < this->max_key());
114 LIBINT2_UINT_LEAST64 max_key = 1;
115 const int maxi = ((int)num_quanta()) - 1;
116 for(
int i=maxi; i>=0; i--) {
117 max_key *= QuantumSet::max_quantum_number;
124 template<
typename T,
unsigned int N>
125 QuantumNumbers<T,N>::QuantumNumbers(
const vector<T>& qn) :
130 template<
typename T,
unsigned int N>
131 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumNumbers>& sptr) :
136 template<
typename T,
unsigned int N>
137 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumSet>& sptr)
139 const SafePtr< QuantumNumbers<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbers,QuantumSet>(sptr);
142 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbers");
145 qn_ = sptr_cast->qn_;
148 template<
typename T,
unsigned int N>
149 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<ConstructablePolymorphically>& sptr)
151 const SafePtr< QuantumNumbers<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbers,ConstructablePolymorphically>(sptr);
154 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbers");
157 qn_ = sptr_cast->qn_;
160 template<
typename T,
unsigned int N>
161 QuantumNumbers<T,N>::QuantumNumbers(
const ConstructablePolymorphically& sptr)
163 const QuantumNumbers<T,N>& sptr_cast = dynamic_cast<const QuantumNumbers&>(sptr);
167 template<
typename T,
unsigned int N>
168 QuantumNumbers<T,N>::~QuantumNumbers()
172 template<
typename T,
unsigned int N>
174 QuantumNumbers<T,N>::operator==(
const QuantumNumbers& a)
const 179 template<
typename T,
unsigned int N>
181 QuantumNumbers<T,N>::label()
const 183 std::ostringstream oss;
187 for(
int i=1; i<qn_.size(); i++)
188 oss <<
"," << qn_[i];
219 std::string label()
const;
222 void inc(
unsigned int i) { ++qn_[i]; }
224 void dec(
unsigned int i) {
227 throw std::runtime_error(
"QuantumNumbersA::dec -- quantum number already zero");
233 const T
elem(
unsigned int i)
const {
248 LIBINT2_UINT_LEAST64
key()
const {
249 LIBINT2_UINT_LEAST64
key = 0;
250 LIBINT2_UINT_LEAST64 pfac = 1;
252 for(
int i=maxi; i>=0; i--) {
262 LIBINT2_UINT_LEAST64
max_key = 1;
264 for(
int i=maxi; i>=0; i--) {
272 template<
typename T,
unsigned int N>
273 QuantumNumbersA<T,N>::QuantumNumbersA(
const T& val)
275 for(
unsigned int i=0; i<N; i++)
279 template<
typename T,
unsigned int N>
280 QuantumNumbersA<T,N>::QuantumNumbersA(
const T* qn)
282 for(
int i=0; i<N; i++)
286 template<
typename T,
unsigned int N>
287 QuantumNumbersA<T,N>::QuantumNumbersA(
const vector<T>& qn)
289 for(
int i=0; i<N; i++)
293 template<
typename T,
unsigned int N>
294 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<QuantumNumbersA>& sptr)
297 for(
unsigned int i=0; i<N; i++)
301 template<
typename T,
unsigned int N>
302 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<QuantumSet>& sptr)
304 const SafePtr< QuantumNumbersA<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbersA,QuantumSet>(sptr);
307 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
310 T* qn = sptr_cast->qn_;
311 for(
int i=0; i<N; i++)
315 template<
typename T,
unsigned int N>
316 QuantumNumbersA<T,N>::QuantumNumbersA(
const SafePtr<ConstructablePolymorphically>& sptr)
318 const SafePtr< QuantumNumbersA<T,N> > sptr_cast = dynamic_pointer_cast<QuantumNumbersA,ConstructablePolymorphically>(sptr);
321 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
323 T* qn = sptr_cast->qn_;
324 for(
int i=0; i<N; i++)
328 template<
typename T,
unsigned int N>
329 QuantumNumbersA<T,N>::~QuantumNumbersA()
333 template<
typename T,
unsigned int N>
335 QuantumNumbersA<T,N>::operator==(
const QuantumNumbersA& a)
const 338 const T* qn1 = a.qn_;
339 for(
int i=0; i<N; i++, ++qn0, ++qn1)
346 template<
typename T,
unsigned int N>
348 QuantumNumbersA<T,N>::label()
const 350 std::ostringstream oss;
354 for(
unsigned int i=1; i<N; i++)
355 oss <<
"," << qn_[i];
370 QuantumNumbersA(
const vector<T>& qn) {}
371 QuantumNumbersA(
const SafePtr<QuantumNumbersA>&) {}
372 QuantumNumbersA(
const SafePtr<QuantumSet>&) {}
373 QuantumNumbersA(
const SafePtr<ConstructablePolymorphically>&) {}
374 ~QuantumNumbersA() {}
376 bool operator==(
const QuantumNumbersA&)
const {
return true; }
377 std::string label()
const {
return "{}"; }
380 void inc(
unsigned int i) {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to increment"); }
382 void dec(
unsigned int i) {
383 throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to decrement");
386 const T
elem(
unsigned int i)
const {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to return"); }
391 LIBINT2_UINT_LEAST64
key()
const {
return 0; }
394 LIBINT2_UINT_LEAST64
max_key()
const {
return 1; }
399 template <
typename T,
unsigned int N>
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:90
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:100
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:366
static const LIBINT2_UINT_LEAST64 max_quantum_number
Quantum numbers lie in range [0,max_quantum_number)
Definition: quanta.h:44
ConstructablePolymorphically is a base for all objects which can be constructed using a SafePtr to a ...
Definition: polyconstr.h:31
QuantumSet is the base class for all (sets of) quantum numbers.
Definition: quanta.h:39
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:81
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
Objects of Hashable<T> class provide hashing function key() which computes keys of type KeyType.
Definition: hashable.h:73
unsigned int num_quanta() const
Return i-th quantum number.
Definition: quanta.h:95
QuantumNumbers<T,N> is a set of N quantum numbers of type T implemented in terms of std::vector.
Definition: quanta.h:59
DefaultQuantumNumbers< unsigned int, 1 >::Result mType
mType is the type that describes the auxiliary index of standard 2-body repulsion integrals
Definition: quanta.h:411
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:382
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:380
QuantumNumbersA<T,N> is a set of N quantum numbers of type T implemented in terms of a C-style array.
Definition: quanta.h:200
void set_elem(unsigned int i, const T &value)
Return i-th quantum number.
Definition: quanta.h:238
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:79
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:113
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:391
unsigned int num_quanta() const
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:388
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:386
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:233
unsigned int num_quanta() const
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:243
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:394
QuantumNumbers iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:66
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:222
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:224
Default implementation of QuantumNumbers.
Definition: quanta.h:400
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:207
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:248
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:261
QuantumNumbersA< T, N > Result
This defines which QuantumNumbers implementation to use.
Definition: quanta.h:402
DefaultQuantumNumbers< int, 0 >::Result EmptySet
EmptySet is the type that describes null set of auxiliary indices.
Definition: quanta.h:407