19template <AtomLike Var>
22 const auto builder = conic::create_empty_cblk_builder<Space>();
41template <conic::BuilderLike Builder, StageType Stage>
44 using T = linalg::space_type_t<conic::builder_dom_t<Builder>>;
63 template <AtomLike Atom>
66 static_assert(
false,
"Atom is not a set type");
82 template <InequalityType IType, AtomLike LHS,
typename RHS>
96 static constexpr std::size_t
ConeN =
97 linalg::mat_cols_v<
decltype(cb.map.linear_part())>;
98 static constexpr std::size_t
EqN =
99 linalg::mat_cols_v<
decltype(
builder.eq_map.linear_part())>;
101 linalg::RowVector<T, AugN> c{};
102 affine::AffineMap<
decltype(c)>
new_map(c);
104 const auto new_builder = conic::make_builder<conic::builder_dom_t<Builder>>(
117 template <AtomLike Atom>
121 "Attempting to minimize a set or intersection of sets");
125 "Attempting to minimize over a var type, please use affine op, "
126 "convex function, or index of var instead of raw type");
129 static constexpr std::size_t
ConeN =
130 linalg::mat_cols_v<
decltype(cb.map.linear_part())>;
131 static constexpr std::size_t
EqN =
132 linalg::mat_cols_v<
decltype(
builder.eq_map.linear_part())>;
134 linalg::RowVector<T, AugN> c{};
135 auto b =
builder.coord_map.translation()(0) +
atom.map.translation()(0);
136 static constexpr std::size_t N =
137 linalg::space_dim_v<conic::builder_dom_t<Builder>>;
139 for (std::size_t
i = 0;
i <
CopyN; ++
i)
140 c(0,
i) =
atom.map.linear_part()(0,
i);
141 const affine::AffineMap<
decltype(c)>
new_map(c, b);
143 conic::make_builder<conic::builder_dom_t<Builder>>(
150 static_assert(
false,
"Attempting to minimize a concave function");
154 static constexpr std::size_t
ConeN =
155 linalg::mat_cols_v<
decltype(
obj_builder.cb.map.linear_part())>;
156 static constexpr std::size_t
EqN =
157 linalg::mat_cols_v<
decltype(
obj_builder.eq_map.linear_part())>;
159 static constexpr std::size_t
ObjN =
160 linalg::mat_cols_v<
decltype(
obj_builder.coord_map.linear_part())>;
162 linalg::RowVector<T, FullN> c{};
164 for (std::size_t
i = 0;
i <
CopyN; ++
i)
167 const auto b =
obj_builder.coord_map.translation()(0);
168 const auto obj_map = affine::AffineMap<decltype(c)>(c, b);
186 template <AtomLike Atom>
190 "Attempting to maximize a set or intersection of sets");
194 "Attempting to maximize over a var type, please use affine op, "
195 "concave function, or index of var instead of raw type");
199 static_assert(
false,
"Attempting to maximize a convex function");
225 return linalg::as_vector(
builder.coord_map.linear_part());
278 return builder.canonical_trace;
constexpr auto make_builder(const CoordMap &coord_map, const CB &cb, const EqMap &eq_map, const CanonicalTrace &canonical_trace={})
Construct a canonical-form builder while deducing all realized component types (aside from dec var do...
typename builder_traits< linalg::remove_cvref_t< Builder > >::Dom builder_dom_t
builder domain
typename dom_traits< linalg::remove_cvref_t< Dom > >::Space dom_space_t
constexpr std::size_t dom_size_v
CurvatureType
Curvature annotation for atom codomain.
constexpr auto make_problem(const Var &x)
make problem
StageType
Problem construction lifecycle stage.
CRTP base for convex atoms.
constexpr ConvexProblem(const Builder &builder_in)
CTOR.
constexpr auto add_constraint(const Inequality< IType, LHS, RHS > &ineq) const
add ineq constraint
constexpr bool validate() const
validate
Builder builder
member var
constexpr auto canonical_trace() const
Structural trace of canonical rows emitted during canonicalization.
constexpr auto constraint_map() const
constraint map (canonical conic form) [ F; g ]
constexpr auto in_set(const Atom &atom) const
in set constraint
constexpr auto linear_objective() const
linear objective
linalg::space_type_t< conic::builder_dom_t< Builder > > T
alias for scalar type
constexpr auto equality_map() const
affine equality map [ A; b ]
constexpr auto minimize(const Atom &atom) const
minimize
constexpr auto constraint_cones() const
cones
constexpr auto feasibility() const
feasibility
constexpr auto maximize(const Atom &atom) const
maximize
forward declaration of inequality