Line data Source code
1 : // SPDX-FileCopyrightText: 2024 PairInteraction Developers 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : #include "pairinteraction/ket/Ket.hpp" 5 : 6 : #include "pairinteraction/ket/QuantumNumberNotAvailableError.hpp" 7 : #include "pairinteraction/utils/hash.hpp" 8 : 9 : namespace pairinteraction { 10 2656220 : Ket::Ket(double energy, std::unordered_map<std::string, double> quantum_numbers) 11 2656220 : : energy(energy), quantum_numbers(std::move(quantum_numbers)) {} 12 : 13 5212176 : double Ket::get_energy() const { return energy; } 14 : 15 8013826 : bool Ket::has_quantum_number(const std::string &name) const { 16 8013826 : return quantum_numbers.contains(name); 17 : } 18 : 19 2803421 : double Ket::get_quantum_number(const std::string &name) const { 20 2803421 : auto it = quantum_numbers.find(name); 21 2803421 : if (it == quantum_numbers.end()) { 22 2 : throw QuantumNumberNotAvailableError(name); 23 : } 24 2803419 : return it->second; 25 : } 26 : 27 40902 : bool Ket::operator==(const Ket &other) const { 28 40902 : return energy == other.energy && quantum_numbers == other.quantum_numbers; 29 : } 30 : 31 4644 : size_t Ket::hash::operator()(const Ket &k) const { 32 4644 : size_t seed = 0; 33 4644 : utils::hash_combine(seed, k.energy); 34 : // The quantum numbers are stored in an unordered map, so we combine the per-entry hashes in an 35 : // order-independent way (via xor) to obtain a deterministic result. 36 4644 : size_t quantum_numbers_hash = 0; 37 84428 : for (const auto &[key, value] : k.quantum_numbers) { 38 79784 : size_t entry_seed = 0; 39 79784 : utils::hash_combine(entry_seed, key); 40 79784 : utils::hash_combine(entry_seed, value); 41 79784 : quantum_numbers_hash ^= entry_seed; 42 : } 43 4644 : utils::hash_combine(seed, quantum_numbers_hash); 44 4644 : return seed; 45 : } 46 : } // namespace pairinteraction