Program Listing for File space_qns.hpp

Return to documentation for file (SeQuant/domain/mbpt/space_qns.hpp)

//
// Created by Eduard Valeyev on 3/9/25.
//

#ifndef SEQUANT_DOMAIN_MBPT_SPACE_QNS_HPP
#define SEQUANT_DOMAIN_MBPT_SPACE_QNS_HPP

#include "SeQuant/core/fwd.hpp"

namespace sequant::mbpt {

template <typename BitSet>
struct mask;

template <typename BitSet>
constexpr auto mask_v = mask<BitSet>::value;

template <typename BitSet>
using mask_t = mask<BitSet>::type;

// SeQuant/mbpt definitions of IndexSpace QNs

enum class Spin : bitset_t {
  alpha = 0b000001,
  beta = 0b000010,
  any = alpha | beta,
  // syntactic sugar
  free = any,
  none = any,
  up = alpha,
  down = beta,
  // only used by legacy code
  null = 0b000000
};

template <>
struct mask<Spin> {
  using type = std::underlying_type_t<Spin>;
  static constexpr type value = static_cast<type>(Spin::any);
};

enum class LCAOQNS : bitset_t {
  ao = 0b000100,
  pao = 0b001000  // projected AO space denotes unoccupied spaces made
                  // from AO basis and orthogonal to occupied orbitals
};

template <>
struct mask<LCAOQNS> {
  using type = std::underlying_type_t<LCAOQNS>;
  static constexpr type value =
      static_cast<type>(LCAOQNS::ao) | static_cast<type>(LCAOQNS::pao);
};

enum class TensorFactorizationQNS : bitset_t {
  df = 0b010000,  // density fitting
  thc = 0b100000  // tensor hypercontraction
};

template <>
struct mask<TensorFactorizationQNS> {
  using type = std::underlying_type_t<TensorFactorizationQNS>;
  static constexpr type value = static_cast<type>(TensorFactorizationQNS::df) |
                                static_cast<type>(TensorFactorizationQNS::thc);
};

enum class BatchingQNS : bitset_t {
  batch = 0b1000000,  // for batching tensors
};

template <>
struct mask<BatchingQNS> {
  using type = std::underlying_type_t<BatchingQNS>;
  static constexpr type value = static_cast<type>(BatchingQNS::batch);
};

}  // namespace sequant::mbpt

#endif  // SEQUANT_DOMAIN_MBPT_SPACE_QNS_HPP