Program Listing for File power.hpp¶
↰ Return to documentation for file (SeQuant/core/expressions/power.hpp)
#ifndef SEQUANT_EXPRESSIONS_POWER_HPP
#define SEQUANT_EXPRESSIONS_POWER_HPP
#include <SeQuant/core/expressions/constant.hpp>
#include <SeQuant/core/expressions/expr.hpp>
#include <SeQuant/core/expressions/expr_ptr.hpp>
#include <SeQuant/core/expressions/variable.hpp>
#include <SeQuant/core/rational.hpp>
namespace sequant {
class Power : public Expr {
public:
using exponent_type = rational;
Power() = delete;
virtual ~Power() = default;
Power(const Power&) = default;
Power(Power&&) = default;
Power& operator=(const Power&) = default;
Power& operator=(Power&&) = default;
Power(ExprPtr base, exponent_type exponent);
template <typename L>
requires std::constructible_from<std::wstring, L> &&
(!std::convertible_to<L, ExprPtr>)
Power(L&& label, exponent_type exponent)
: Power(ex<Variable>(std::forward<L>(label)), std::move(exponent)) {}
template <typename V>
requires(!std::constructible_from<std::wstring, V> &&
!std::convertible_to<V, ExprPtr> &&
std::constructible_from<Constant::scalar_type, V>)
Power(V&& value, exponent_type exponent)
: Power(ex<Constant>(std::forward<V>(value)), std::move(exponent)) {}
const ExprPtr& base() const;
const exponent_type& exponent() const;
bool conjugated() const;
void conjugate();
bool is_zero() const override;
static void flatten(ExprPtr& expr);
type_id_type type_id() const override;
bool is_scalar() const override;
ExprPtr clone() const override;
void adjoint() override;
Power& operator*=(const Expr& that);
private:
ExprPtr base_;
exponent_type exponent_;
bool conjugated_ = false;
hash_type memoizing_hash() const override;
bool static_equal(const Expr& that) const override;
bool static_less_than(const Expr& that) const override;
};
} // namespace sequant
#endif // SEQUANT_EXPRESSIONS_POWER_HPP