20 QuadExpr(ValueT t_constant) : m_affine(std::move(t_constant)) {}
21 QuadExpr(
const KeyT& t_key) : m_affine(std::move(t_key)) {}
22 QuadExpr(LinExpr<KeyT, ValueT> t_expr) : m_affine(std::move(t_expr)) {}
25 QuadExpr(
const KeyT& t_key1,
const KeyT& t_key2) : LinExpr<CommutativePair<KeyT>, ValueT>(
CommutativePair<KeyT>(t_key1, t_key2)) {}
26 QuadExpr(
const ValueT& t_factor,
const KeyT& t_key1,
const KeyT& t_key2) : LinExpr<CommutativePair<KeyT>, ValueT>(
CommutativePair<KeyT>(t_key1, t_key2), t_factor) {}
27 QuadExpr(ValueT&& t_factor,
const KeyT& t_key1,
const KeyT& t_key2) : LinExpr<CommutativePair<KeyT>, ValueT>(
CommutativePair<KeyT>(t_key1, t_key2), std::move(t_factor)) {}
28 QuadExpr(
const ValueT& t_factor,
const KeyT& t_key) : m_affine(t_factor, t_key) {}
29 QuadExpr(ValueT&& t_factor,
const KeyT& t_key) : m_affine(std::move(t_factor), t_key) {}
31 QuadExpr(
const QuadExpr& t_src) =
default;
32 QuadExpr(QuadExpr&&)
noexcept =
default;
34 QuadExpr& operator=(
const QuadExpr& t_rhs) =
default;
35 QuadExpr& operator=(QuadExpr&&)
noexcept =
default;
37 QuadExpr& operator+=(
const QuadExpr& t_rhs);
38 QuadExpr& operator-=(
const QuadExpr& t_rhs);
39 QuadExpr& operator*=(
double t_rhs)
override;
40 QuadExpr& operator/=(
double t_rhs)
override;
41 QuadExpr operator-()
const;
46 [[nodiscard]]
bool has_quadratic()
const {
return !LinExpr<CommutativePair<KeyT>, ValueT>::empty(); }
48 [[nodiscard]]
bool empty_all()
const {
return LinExpr<CommutativePair<KeyT>, ValueT>::empty() && m_affine.linear().empty(); }
50 [[nodiscard]]
bool is_zero(
double t_tolerance)
const override;