Program Listing for File basis.cpp

↰ Return to documentation for file (SeQuant/core/basis.cpp)

#include <SeQuant/core/basis.hpp>
#include <SeQuant/core/utility/macros.hpp>

#include <string>

namespace sequant {

IndexBasis::IndexBasis(IndexSpace space, optional_instance basis_instance,
                       std::wstring name, std::optional<std::size_t> extent,
                       IndexBasisMetric metric, std::optional<Field> field)
    : space_(std::move(space)),
      basis_instance_(basis_instance),
      name_(std::move(name)),
      extent_(extent),
      metric_(metric),
      field_(field) {
  SEQUANT_ASSERT(name_.empty() || basis_instance_);
  SEQUANT_ASSERT(!name_.empty() ||
                 (!extent_ && metric_ == IndexBasisMetric::Unit && !field_));
}

std::wstring IndexBasis::instance_suffix() const {
  return basis_instance_ ? L";" + std::to_wstring(*basis_instance_)
                         : std::wstring{};
}

bool same_instance(const IndexBasis& b1, const IndexBasis& b2) noexcept {
  return b1.space() == b2.space() && b1.basis_instance() == b2.basis_instance();
}

bool includes(const IndexBasis& basis, const IndexBasis& subbasis) {
  return includes(basis.space(), subbasis.space()) &&
         (!basis.has_basis_instance() ||
          (basis.basis_instance() == subbasis.basis_instance() &&
           basis.name() == subbasis.name()));
}

bool different_instances(const IndexBasis& b1, const IndexBasis& b2) {
  return b1.has_basis_instance() && b2.has_basis_instance() &&
         (b1.basis_instance() != b2.basis_instance() || b1.name() != b2.name());
}

}  // namespace sequant