15template <
typename Scalar>
17 Private , std::initializer_list<size_t> atomic_indices,
18 std::initializer_list<std::shared_ptr<
const BasisAtom<Scalar>>> atomic_bases, real_t energy)
19 :
Ket(energy, calculate_quantum_number_f(atomic_indices, atomic_bases),
20 calculate_quantum_number_m(atomic_indices, atomic_bases),
21 calculate_parity(atomic_indices, atomic_bases)),
22 atomic_indices(atomic_indices), atomic_bases(atomic_bases) {
23 if (atomic_indices.size() != atomic_bases.size()) {
24 throw std::invalid_argument(
25 "The number of atomic indices, and atomic bases must be the same.");
29template <
typename Scalar>
32 std::string separator;
33 for (
size_t atom_index = 0; atom_index < atomic_indices.size(); ++atom_index) {
35 atomic_bases[atom_index]
36 ->get_corresponding_ket(atomic_indices[atom_index])
43template <
typename Scalar>
44std::shared_ptr<KetPair<Scalar>>
50 throw std::runtime_error(
"Not implemented.");
53template <
typename Scalar>
55 std::vector<std::shared_ptr<const BasisAtom<Scalar>>> atomic_states;
56 atomic_states.reserve(atomic_indices.size());
57 for (
size_t atom_index = 0; atom_index < atomic_indices.size(); ++atom_index) {
58 atomic_states.push_back(atomic_bases[atom_index]->get_state(atomic_indices[atom_index]));
63template <
typename Scalar>
65 return Ket::operator==(other) && atomic_indices == other.atomic_indices &&
66 atomic_bases == other.atomic_bases;
69template <
typename Scalar>
71 return !(*
this == other);
74template <
typename Scalar>
77 for (
const auto &index : k.atomic_indices) {
80 for (
const auto &basis : k.atomic_bases) {
86template <
typename Scalar>
88 const std::vector<size_t> & ,
91 return std::numeric_limits<real_t>::max();
94template <
typename Scalar>
96 const std::vector<size_t> &indices,
98 for (
const auto &basis : bases) {
99 if (!basis->has_quantum_number_m()) {
100 return std::numeric_limits<real_t>::max();
103 real_t total_quantum_number_m = 0;
104 for (
size_t i = 0; i < indices.size(); ++i) {
105 total_quantum_number_m += bases[i]->get_quantum_number_m(indices[i]);
107 return total_quantum_number_m;
110template <
typename Scalar>
111Parity KetPair<Scalar>::calculate_parity(
112 const std::vector<size_t> & ,
113 const std::vector<std::shared_ptr<
const BasisAtom<Scalar>>> & ) {
119template class KetPair<double>;
120template class KetPair<std::complex<double>>;
Class for creating a basis of atomic kets.
bool operator==(const KetPair< Scalar > &other) const
std::string get_label() const override
std::vector< std::shared_ptr< const BasisAtom< Scalar > > > get_atomic_states() const
bool operator!=(const KetPair< Scalar > &other) const
std::shared_ptr< KetPair< Scalar > > get_ket_for_different_quantum_number_m(real_t new_quantum_number_m) const
KetPair(Private, std::initializer_list< size_t > atomic_indices, std::initializer_list< std::shared_ptr< const BasisAtom< Scalar > > > atomic_bases, real_t energy)
bool operator==(const Ket &other) const
void hash_combine(std::size_t &seed, T const &v)
Combine hashes.
std::size_t operator()(const KetPair< Scalar > &k) const