21#ifndef _libint2_src_bin_libint_quanta_h_
22#define _libint2_src_bin_libint_quanta_h_
24#include <global_macros.h>
39 public Hashable<LIBINT2_UINT_LEAST64, ComputeKey> {
41 typedef DummyIterator iter_type;
46 virtual std::string label()
const = 0;
51 virtual void inc(
unsigned int i) = 0;
53 virtual void dec(
unsigned int i) = 0;
59template <
typename T,
unsigned int N>
71 QuantumNumbers(
const std::shared_ptr<ConstructablePolymorphically>&);
76 std::string label()
const override;
79 void inc(
unsigned int i)
override { ++qn_.at(i); }
81 void dec(
unsigned int i)
override {
83 if (qn_.at(i) == T(0))
84 throw std::runtime_error(
85 "QuantumNumbers::dec -- quantum number already zero");
91 const T
elem(
unsigned int i)
const {
return qn_.at(i); }
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--) {
102 key += pfac * qn_[i];
111 LIBINT2_UINT_LEAST64
max_key = 1;
113 for (
int i = maxi; i >= 0; i--) {
120template <
typename T,
unsigned int N>
121QuantumNumbers<T, N>::QuantumNumbers(
const std::vector<T>& qn) : qn_(qn) {}
123template <
typename T,
unsigned int N>
124QuantumNumbers<T, N>::QuantumNumbers(
125 const std::shared_ptr<QuantumNumbers>& sptr)
128template <
typename T,
unsigned int N>
129QuantumNumbers<T, N>::QuantumNumbers(
const std::shared_ptr<QuantumSet>& sptr) {
130 const std::shared_ptr<QuantumNumbers<T, N> > sptr_cast =
131 std::dynamic_pointer_cast<QuantumNumbers, QuantumSet>(sptr);
134 throw std::runtime_error(
135 "QuantumNumbers<T,N>::QuantumNumbers(const "
136 "std::shared_ptr<QuantumSet>& sptr) -- type of sptr is incompatible "
137 "with QuantumNumbers");
140 qn_ = sptr_cast->qn_;
143template <
typename T,
unsigned int N>
144QuantumNumbers<T, N>::QuantumNumbers(
145 const std::shared_ptr<ConstructablePolymorphically>& sptr) {
146 const std::shared_ptr<QuantumNumbers<T, N> > sptr_cast =
147 std::dynamic_pointer_cast<QuantumNumbers, ConstructablePolymorphically>(
151 throw std::runtime_error(
152 "QuantumNumbers<T,N>::QuantumNumbers(const "
153 "std::shared_ptr<ConstructablePolymorphically>& sptr) -- type of sptr "
154 "is incompatible with QuantumNumbers");
157 qn_ = sptr_cast->qn_;
160template <
typename T,
unsigned int N>
161QuantumNumbers<T, N>::QuantumNumbers(
const ConstructablePolymorphically& sptr) {
162 const QuantumNumbers<T, N>& sptr_cast =
163 dynamic_cast<const QuantumNumbers&
>(sptr);
167template <
typename T,
unsigned int N>
168QuantumNumbers<T, N>::~QuantumNumbers() {}
170template <
typename T,
unsigned int N>
171bool QuantumNumbers<T, N>::operator==(
const QuantumNumbers& a)
const {
175template <
typename T,
unsigned int N>
176std::string QuantumNumbers<T, N>::label()
const {
177 std::ostringstream oss;
179 if (qn_.size() > 0) oss << qn_[0];
180 for (
int i = 1; i < qn_.size(); i++) oss <<
"," << qn_[i];
192template <
typename T,
unsigned int N>
211 std::string label()
const override;
214 void inc(
unsigned int i)
override { ++qn_[i]; }
216 void dec(
unsigned int i)
override {
219 throw std::runtime_error(
220 "QuantumNumbersA::dec -- quantum number already zero");
226 const T
elem(
unsigned int i)
const {
return qn_[i]; }
229 void set_elem(
unsigned int i,
const T& value) { qn_[i] = value; }
235 LIBINT2_UINT_LEAST64
key()
const override {
236 LIBINT2_UINT_LEAST64
key = 0;
237 LIBINT2_UINT_LEAST64 pfac = 1;
239 for (
int i = maxi; i >= 0; i--) {
240 key += pfac * qn_[i];
249 LIBINT2_UINT_LEAST64
max_key = 1;
251 for (
int i = maxi; i >= 0; i--) {
258template <
typename T,
unsigned int N>
259QuantumNumbersA<T, N>::QuantumNumbersA(
const T& val) {
260 for (
unsigned int i = 0; i < N; i++) qn_[i] = val;
263template <
typename T,
unsigned int N>
264QuantumNumbersA<T, N>::QuantumNumbersA(
const T* qn) {
265 for (
int i = 0; i < N; i++) qn_[i] = qn[i];
268template <
typename T,
unsigned int N>
269QuantumNumbersA<T, N>::QuantumNumbersA(
const std::vector<T>& qn) {
270 for (
int i = 0; i < N; i++) qn_[i] = qn[i];
273template <
typename T,
unsigned int N>
274QuantumNumbersA<T, N>::QuantumNumbersA(
275 const std::shared_ptr<QuantumNumbersA>& sptr) {
277 for (
unsigned int i = 0; i < N; i++) qn_[i] = qn[i];
280template <
typename T,
unsigned int N>
281QuantumNumbersA<T, N>::QuantumNumbersA(
282 const std::shared_ptr<QuantumSet>& sptr) {
283 const std::shared_ptr<QuantumNumbersA<T, N> > sptr_cast =
284 std::dynamic_pointer_cast<QuantumNumbersA, QuantumSet>(sptr);
287 throw std::runtime_error(
288 "QuantumNumbersA<T,N>::QuantumNumbersA(const "
289 "std::shared_ptr<QuantumSet>& sptr) -- type of sptr is incompatible "
290 "with QuantumNumbersA");
293 T* qn = sptr_cast->qn_;
294 for (
int i = 0; i < N; i++) qn_[i] = qn[i];
297template <
typename T,
unsigned int N>
298QuantumNumbersA<T, N>::QuantumNumbersA(
299 const std::shared_ptr<ConstructablePolymorphically>& sptr) {
300 const std::shared_ptr<QuantumNumbersA<T, N> > sptr_cast =
301 std::dynamic_pointer_cast<QuantumNumbersA, ConstructablePolymorphically>(
305 throw std::runtime_error(
306 "QuantumNumbersA<T,N>::QuantumNumbersA(const "
307 "std::shared_ptr<ConstructablePolymorphically>& sptr) -- type of sptr "
308 "is incompatible with QuantumNumbersA");
310 T* qn = sptr_cast->qn_;
311 for (
int i = 0; i < N; i++) qn_[i] = qn[i];
314template <
typename T,
unsigned int N>
315QuantumNumbersA<T, N>::~QuantumNumbersA() {}
317template <
typename T,
unsigned int N>
318bool QuantumNumbersA<T, N>::operator==(
const QuantumNumbersA& a)
const {
320 const T* qn1 = a.qn_;
321 for (
int i = 0; i < N; i++, ++qn0, ++qn1)
322 if (*qn0 != *qn1)
return false;
327template <
typename T,
unsigned int N>
328std::string QuantumNumbersA<T, N>::label()
const {
329 std::ostringstream oss;
331 if (N > 0) oss << qn_[0];
332 for (
unsigned int i = 1; i < N; i++) oss <<
"," << qn_[i];
347 QuantumNumbersA(
const std::vector<T>& qn) {}
348 QuantumNumbersA(
const std::shared_ptr<QuantumNumbersA>&) {}
349 QuantumNumbersA(
const std::shared_ptr<QuantumSet>&) {}
350 QuantumNumbersA(
const std::shared_ptr<ConstructablePolymorphically>&) {}
351 ~QuantumNumbersA() {}
353 bool operator==(
const QuantumNumbersA&)
const {
return true; }
354 std::string label()
const override {
return "{}"; }
357 void inc(
unsigned int i)
override {
358 throw std::runtime_error(
359 "QuantumNumbersA<T,0>::inc -- no quantum numbers to increment");
362 void dec(
unsigned int i)
override {
363 throw std::runtime_error(
364 "QuantumNumbersA<T,0>::inc -- no quantum numbers to decrement");
367 const T
elem(
unsigned int i)
const {
368 throw std::runtime_error(
369 "QuantumNumbersA<T,0>::inc -- no quantum numbers to return");
375 LIBINT2_UINT_LEAST64
key()
const override {
return 0; }
378 LIBINT2_UINT_LEAST64
max_key()
const {
return 1; }
382template <
typename T,
unsigned int N>
ConstructablePolymorphically is a base for all objects which can be constructed using a std::shared_p...
Definition polyconstr.h:30
Objects of Hashable<T> class provide hashing function key() which computes keys of type KeyType.
Definition hashable.h:79
unsigned int num_quanta() const override
Implementation of QuantumSet::num_quanta()
Definition quanta.h:372
void dec(unsigned int i) override
Decrement quantum number i.
Definition quanta.h:362
void inc(unsigned int i) override
Increment quantum number i.
Definition quanta.h:357
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition quanta.h:378
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition quanta.h:343
const T elem(unsigned int i) const
Return i-th quantum number.
Definition quanta.h:367
LIBINT2_UINT_LEAST64 key() const override
Implements Hashable::key()
Definition quanta.h:375
QuantumNumbersA<T,N> is a set of N quantum numbers of type T implemented in terms of a C-style array.
Definition quanta.h:193
LIBINT2_UINT_LEAST64 key() const override
Implements Hashable::key()
Definition quanta.h:235
void dec(unsigned int i) override
Decrement quantum number i.
Definition quanta.h:216
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition quanta.h:199
const T elem(unsigned int i) const
Return i-th quantum number.
Definition quanta.h:226
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition quanta.h:248
void inc(unsigned int i) override
Increment quantum number i.
Definition quanta.h:214
void set_elem(unsigned int i, const T &value)
Return i-th quantum number.
Definition quanta.h:229
unsigned int num_quanta() const override
Implementation of QuantumSet::num_quanta()
Definition quanta.h:232
QuantumNumbers<T,N> is a set of N quantum numbers of type T implemented in terms of std::vector.
Definition quanta.h:60
unsigned int num_quanta() const
Return i-th quantum number.
Definition quanta.h:94
void inc(unsigned int i) override
Increment quantum number i.
Definition quanta.h:79
void dec(unsigned int i) override
Decrement quantum number i.
Definition quanta.h:81
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:66
const T elem(unsigned int i) const
Return i-th quantum number.
Definition quanta.h:91
QuantumSet is the base class for all (sets of) quantum numbers.
Definition quanta.h:39
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:43
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:395
DefaultQuantumNumbers< int, 0 >::Result EmptySet
EmptySet is the type that describes null set of auxiliary indices.
Definition quanta.h:390
Default implementation of QuantumNumbers.
Definition quanta.h:383
QuantumNumbersA< T, N > Result
This defines which QuantumNumbers implementation to use.
Definition quanta.h:385