LCOV - code coverage report
Current view: top level - src/ket - Ket.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 23 23 100.0 %
Date: 2026-10-14 13:16:16 Functions: 6 6 100.0 %

          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

Generated by: LCOV version 1.16