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