Program Listing for File context.hpp

Return to documentation for file (SeQuant/core/context.hpp)

#ifndef SEQUANT_CORE_CONTEXT_HPP
#define SEQUANT_CORE_CONTEXT_HPP

#include <SeQuant/core/attr.hpp>
#include <SeQuant/core/index_space_registry.hpp>
#include <SeQuant/core/options.hpp>
#include <SeQuant/core/utility/context.hpp>

namespace sequant {

// clang-format
//     or as subscript (`BraKetTypesetting::KetSub`); the latter is the
//     traditional tensor convention
// clang-format off
class Context {
 public:
  struct Defaults {
    constexpr static auto vacuum = Vacuum::Physical;
    constexpr static auto metric = IndexSpaceMetric::Unit;
    constexpr static auto braket_symmetry = BraKetSymmetry::Conjugate;
    constexpr static auto spbasis = SPBasis::Spinor;
    constexpr static auto first_dummy_index_ordinal = 100;
    constexpr static auto braket_typesetting = BraKetTypesetting::ContraSub;
    constexpr static auto braket_slot_typesetting =
        BraKetSlotTypesetting::TensorPackage;
  };


  struct Options {
      std::shared_ptr<IndexSpaceRegistry> index_space_registry_shared_ptr = nullptr;
      std::optional<IndexSpaceRegistry> index_space_registry = std::nullopt;
      Vacuum vacuum = Defaults::vacuum;
      IndexSpaceMetric metric = Defaults::metric;
      BraKetSymmetry braket_symmetry = Defaults::braket_symmetry;
      SPBasis spbasis = Defaults::spbasis;
      std::size_t first_dummy_index_ordinal = Defaults::first_dummy_index_ordinal;
      std::optional<CanonicalizeOptions> canonicalization_options = std::nullopt;
      BraKetTypesetting braket_typesetting = Defaults::braket_typesetting;
      BraKetSlotTypesetting braket_slot_typesetting =
        Defaults::braket_slot_typesetting;
  };
  static Options make_default_options() { return {}; }

  Context(Options options = make_default_options());

  ~Context() = default;

  Context(const Context& ctx) = default;

  Context& operator=(const Context& ctx) = default;

  Context clone() const;

  Context(Context&&) = default;

  Vacuum vacuum() const;
  std::shared_ptr<const IndexSpaceRegistry> index_space_registry() const;
  std::shared_ptr<IndexSpaceRegistry> mutable_index_space_registry() const;
  IndexSpaceMetric metric() const;
  BraKetSymmetry braket_symmetry() const;
  SPBasis spbasis() const;
  std::size_t first_dummy_index_ordinal() const;
  std::optional<CanonicalizeOptions> canonicalization_options() const;
  BraKetTypesetting braket_typesetting() const;
  BraKetSlotTypesetting braket_slot_typesetting() const;

  Context& set(Vacuum vacuum);
  Context& set(IndexSpaceRegistry ISR);
  Context& set(std::shared_ptr<IndexSpaceRegistry> ISR);
  Context& set(IndexSpaceMetric metric);
  Context& set(BraKetSymmetry braket_symmetry);
  Context& set(SPBasis spbasis);
  Context& set_first_dummy_index_ordinal(std::size_t first_dummy_index_ordinal);
  Context& set(CanonicalizeOptions copt);
  Context& set(BraKetTypesetting braket_typeset);
  Context& set(BraKetSlotTypesetting braket_slot_typeset);

 private:
  std::shared_ptr<IndexSpaceRegistry> idx_space_reg_ = nullptr;
  Vacuum vacuum_ = Defaults::vacuum;
  IndexSpaceMetric metric_ = Defaults::metric;
  BraKetSymmetry braket_symmetry_ = Defaults::braket_symmetry;
  SPBasis spbasis_ = Defaults::spbasis;
  std::size_t first_dummy_index_ordinal_ = Defaults::first_dummy_index_ordinal;
  std::optional<CanonicalizeOptions> canonicalization_options_ = std::nullopt;
  BraKetTypesetting braket_typesetting_ = Defaults::braket_typesetting;
  BraKetSlotTypesetting braket_slot_typesetting_ =
      Defaults::braket_slot_typesetting;
};

bool operator==(const Context& ctx1, const Context& ctx2);

bool operator!=(const Context& ctx1, const Context& ctx2);



inline constexpr bool default_context_manipulation_threadsafe() {
#ifdef SEQUANT_CONTEXT_MANIPULATION_THREADSAFE
  return true;
#else
  return false;
#endif
}

const Context& get_default_context(Statistics s = Statistics::Arbitrary);

void set_default_context(Context ctx,
                         Statistics s = Statistics::Arbitrary);

void set_default_context(Context::Options ctx_options,
                         Statistics s = Statistics::Arbitrary);

void set_default_context(const container::map<Statistics, Context>& ctxs);

void reset_default_context();

[[nodiscard]] detail::ImplicitContextResetter<
    container::map<Statistics, Context>>
set_scoped_default_context(const container::map<Statistics, Context>& ctx);

[[nodiscard]] detail::ImplicitContextResetter<
    container::map<Statistics, Context>>
set_scoped_default_context(Context ctx);

[[nodiscard]] detail::ImplicitContextResetter<
    container::map<Statistics, Context>>
set_scoped_default_context(Context::Options ctx_options);




[[nodiscard]] IndexSpace get_particle_space(
    const IndexSpace::QuantumNumbers& qn);

[[nodiscard]] IndexSpace get_hole_space(const IndexSpace::QuantumNumbers& qn);

[[nodiscard]] IndexSpace get_complete_space(
    const IndexSpace::QuantumNumbers& qn);


}  // namespace sequant

#endif