25 #ifndef SRC_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_EDGE_SET_H_ 26 #define SRC_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_EDGE_SET_H_ 49 using Ptr = std::shared_ptr<EdgeSetInterface>;
58 virtual void clear() = 0;
77 using Ptr = std::shared_ptr<OptimizationEdgeSet>;
79 void clear()
override;
83 void registerEdgesAtVertices();
85 void getDimensions(
int& non_lsq_obj_dim,
int& lsq_obj_dim,
int& eq_dim,
int& ineq_dim);
87 void addEdges(std::initializer_list<BaseEdge::Ptr> objective_edges, std::initializer_list<BaseEdge::Ptr> lsq_objective_edges,
88 std::initializer_list<BaseEdge::Ptr> equality_edges, std::initializer_list<BaseEdge::Ptr> inequality_edges,
89 std::initializer_list<BaseMixedEdge::Ptr> mixed_edges)
92 if (objective_edges.size() > 0) _objectives.insert(_objectives.end(), objective_edges.begin(), objective_edges.end());
93 if (lsq_objective_edges.size() > 0) _lsq_objectives.insert(_lsq_objectives.end(), lsq_objective_edges.begin(), lsq_objective_edges.end());
94 if (equality_edges.size() > 0) _equalities.insert(_equalities.end(), equality_edges.begin(), equality_edges.end());
95 if (inequality_edges.size() > 0) _inequalities.insert(_inequalities.end(), inequality_edges.begin(), inequality_edges.end());
96 if (mixed_edges.size() > 0) _mixed.insert(_mixed.end(), mixed_edges.begin(), mixed_edges.end());
99 void addEdges(std::initializer_list<BaseEdge::Ptr> objective_edges, std::initializer_list<BaseEdge::Ptr> equality_edges,
100 std::initializer_list<BaseEdge::Ptr> inequality_edges, std::initializer_list<BaseMixedEdge::Ptr> mixed_edges)
103 if (objective_edges.size() > 0)
105 for (
auto& edge : objective_edges)
107 if (edge->isLeastSquaresForm())
108 _lsq_objectives.push_back(edge);
110 _objectives.push_back(edge);
113 if (equality_edges.size() > 0) _equalities.insert(_equalities.end(), equality_edges.begin(), equality_edges.end());
114 if (inequality_edges.size() > 0) _inequalities.insert(_inequalities.end(), inequality_edges.begin(), inequality_edges.end());
115 if (mixed_edges.size() > 0) _mixed.insert(_mixed.end(), mixed_edges.begin(), mixed_edges.end());
120 if (edge->isLeastSquaresForm())
121 addLsqObjectiveEdge(edge);
124 getObjectiveEdgesRef().push_back(edge);
135 "OptimizationEdgeSet::addLsqObjectiveEdge(): The added edge does not return isLeastSquaresForm() == true.");
136 getLsqObjectiveEdgesRef().push_back(edge);
151 return _lsq_objectives;
163 return _inequalities;
171 const std::vector<BaseMixedEdge::Ptr>&
getMixedEdges()
const {
return _mixed; }
177 bool isEdgeCacheEmpty();
178 void clearEdgeCache();
182 void computeObjectiveEdgeIndices(std::vector<BaseEdge::Ptr>& edges,
int& idx,
bool lsq_edges);
184 void computeEdgeIndices(std::vector<BaseMixedEdge::Ptr>& edges,
int& idx_obj,
int& idx_lsq_obj,
int& idx_eq,
int& idx_ineq);
196 #endif // SRC_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_EDGE_SET_H_ bool hasOnlyLeastSquaresObjectives() const
std::vector< BaseEdge::Ptr > & getInequalityEdgesRef()
void setEdgeIdx(BaseMixedEdge &edge, int obj_idx, int eq_idx, int ineq_idx)
void setModified(bool modified)
std::vector< BaseEdge::Ptr > & getEqualityEdgesRef()
Abstract class representing a set of vertices.
#define PRINT_ERROR_COND(cond, msg)
Print msg-stream only if cond == true.
virtual ~EdgeSetInterface()
Virtual destructor.
std::vector< BaseEdge::Ptr > & getLsqObjectiveEdgesRef()
void addEdges(std::initializer_list< BaseEdge::Ptr > objective_edges, std::initializer_list< BaseEdge::Ptr > equality_edges, std::initializer_list< BaseEdge::Ptr > inequality_edges, std::initializer_list< BaseMixedEdge::Ptr > mixed_edges)
const std::vector< BaseEdge::Ptr > & getEqualityEdges() const
void setEdgeIdx(BaseEdge &edge, int idx)
void addMixedEdge(BaseMixedEdge::Ptr edge)
Abstract class representing a set of edges.
std::shared_ptr< EdgeSetInterface > Ptr
const std::vector< BaseEdge::Ptr > & getInequalityEdges() const
std::vector< BaseMixedEdge::Ptr > & getMixedEdgesRef()
const std::vector< BaseEdge::Ptr > & getObjectiveEdges() const
void addEdges(std::initializer_list< BaseEdge::Ptr > objective_edges, std::initializer_list< BaseEdge::Ptr > lsq_objective_edges, std::initializer_list< BaseEdge::Ptr > equality_edges, std::initializer_list< BaseEdge::Ptr > inequality_edges, std::initializer_list< BaseMixedEdge::Ptr > mixed_edges)
std::shared_ptr< BaseMixedEdge > Ptr
std::vector< BaseEdge::Ptr > & getObjectiveEdgesRef()
std::shared_ptr< BaseEdge > Ptr
void addObjectiveEdge(BaseEdge::Ptr edge)
const std::vector< BaseEdge::Ptr > & getLsqObjectiveEdges() const
virtual void computeEdgeIndices()=0
Precompute edge indices in the hyper-graph (e.g. for the Jacobian structure)
std::vector< BaseEdge::Ptr > _objectives
virtual void reserveEdgeCacheMemory(int est_value_cache_size, int est_jacobians_cache_size)=0
void addEqualityEdge(BaseEdge::Ptr edge)
std::vector< BaseEdge::Ptr > _lsq_objectives
std::vector< BaseEdge::Ptr > _inequalities
const std::vector< BaseMixedEdge::Ptr > & getMixedEdges() const
std::vector< BaseMixedEdge::Ptr > _mixed
void addInequalityEdge(BaseEdge::Ptr edge)
std::vector< BaseEdge::Ptr > _equalities
void addLsqObjectiveEdge(BaseEdge::Ptr edge)