61 using AtomT = linalg::remove_cvref_t<
decltype(
atom)>;
68 using AtomT = linalg::remove_cvref_t<
decltype(
atom)>;
70 return atom.mul(
T(-1));
72 return atom.template mul<
T(-1)>();
77 linalg::Vector<T, M> out{};
78 for (std::size_t
i = 0;
i <
M; ++
i) out(
i) =
scalar;
91 linalg::MatrixContainer<RHS>) {
93 "PSD inequalities only support variable lhs");
95 "PSD inequalities currently only support X >= C");
98 using RHSMat = linalg::remove_cvref_t<RHS>;
99 using RHSScalar = linalg::matrix_scalar_t<RHSMat>;
100 static_assert(linalg::mat_rows_v<RHSMat> ==
101 linalg::mat_rows_v<CodomPoint>,
102 "PSD inequality rhs row dim mismatch");
103 static_assert(linalg::mat_cols_v<RHSMat> ==
104 linalg::mat_cols_v<CodomPoint>,
105 "PSD inequality rhs col dim mismatch");
106 static_assert(std::convertible_to<RHSScalar, T>,
107 "PSD inequality rhs scalar type must convert to lhs type");
112 static constexpr std::size_t MatDim = linalg::mat_rows_v<CodomPoint>;
113 static constexpr std::size_t
K = MatDim * (MatDim + 1) / 2;
115 if constexpr (linalg::Real<RHSScalar>)
117 "PSD inequality expects symmetric matrix rhs");
120 "PSD inequality expects Hermitian matrix rhs");
127 const auto cones = std::make_tuple(
psd_cone);
131 }
else if constexpr (linalg::Field<RHS>) {
140 "PSD inequalities only support variable lhs");
142 "PSD inequalities currently only support X >= 0");
145 static constexpr std::size_t MatDim = linalg::mat_rows_v<CodomPoint>;
146 static constexpr std::size_t
K = MatDim * (MatDim + 1) / 2;
153 const auto cones = std::make_tuple(
psd_cone);
186 if constexpr (!linalg::MatrixContainer<RHS>) {
189 "RHS Atom must be fn, index, var, scalar, or matrix type");