Program Listing for File variable.cpp

Return to documentation for file (SeQuant/core/expressions/variable.cpp)

#include <SeQuant/core/expressions/variable.hpp>
#include <SeQuant/core/hash.hpp>
#include <SeQuant/core/io/latex/latex.hpp>
#include <SeQuant/core/utility/macros.hpp>
#include <SeQuant/core/utility/string.hpp>

#include <string>
#include <string_view>

namespace sequant {

Variable::Variable(std::wstring label)
    : label_(std::move(label)), conjugated_(false) {}

Variable::Variable(const std::string &label)
    : label_(sequant::toUtf16(label)), conjugated_(false) {}

Expr::type_id_type Variable::type_id() const { return get_type_id<Variable>(); }

bool Variable::is_scalar() const { return true; }

Expr::hash_type Variable::memoizing_hash() const {
  auto compute_hash = [this]() {
    auto val = hash::value(label_);
    hash::combine(val, conjugated_);
    return val;
  };

  if (!hash_value_) {
    hash_value_ = compute_hash();
  } else {
    SEQUANT_ASSERT(*hash_value_ == compute_hash());
  }

  return *hash_value_;
}

bool Variable::static_equal(const Expr &that) const {
  return label_ == static_cast<const Variable &>(that).label_ &&
         conjugated_ == static_cast<const Variable &>(that).conjugated_;
}

std::wstring_view Variable::label() const { return label_; }

void Variable::set_label(std::wstring label) {
  label_ = std::move(label);
  reset_hash_value();
}

void Variable::conjugate() {
  conjugated_ = !conjugated_;
  reset_hash_value();
}

bool Variable::conjugated() const { return conjugated_; }

std::wstring Variable::to_latex() const {
  std::wstring result = L"{" + io::latex::utf_to_string(label_) + L"}";
  if (conjugated_) result = L"{" + result + L"^*" + L"}";
  return result;
}

ExprPtr Variable::clone() const { return ex<Variable>(*this); }

void Variable::adjoint() { conjugate(); }

}  // namespace sequant