20 this->componentVector = std::vector<std::vector<T>>(1);
25 boost::get(boost::vertex_bundle, this->
main_graph);
27 boost::get(boost::edge_bundle, this->
main_graph);
28 std::pair<T, T> pair_energy;
32 for (i_ver = boost::vertices(this->
main_graph).first;
34 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
35 energy -= vertex_attribute_map(*i_ver).weight *
36 vertex_attribute_map(*i_ver).observation[i_dim] *
37 vertex_attribute_map(*i_ver).value[i_dim];
40 pair_energy.first = energy;
43 i_edg_end = boost::edges(this->
main_graph).second;
44 for (i_edg = boost::edges(this->
main_graph).first; i_edg != i_edg_end;
46 if (!edge_attribute_map(*i_edg).realEdge) {
49 energy += .5 * edge_attribute_map(*i_edg).isActive *
50 this->parameter.reg_strenth *
51 edge_attribute_map(*i_edg).weight;
53 pair_energy.second = energy;
68 std::vector<std::vector<uint32_t>> corners =
69 std::vector<std::vector<uint32_t>>(this->
components.size(),
70 std::vector<uint32_t>(2, 0));
74 boost::boykov_kolmogorov_max_flow(
91 std::vector<std::vector<uint32_t>>&
96 for (uint32_t i_com = 0; i_com < this->
components.size(); i_com++) {
100 std::pair<uint32_t, uint32_t> corners_pair =
find_corner(i_com);
101 corners[i_com][0] = corners_pair.first;
102 corners[i_com][1] = corners_pair.second;
110 std::pair<uint32_t, uint32_t>
find_corner(
const uint32_t& i_com) {
113 boost::get(boost::vertex_bundle, this->
main_graph);
114 std::vector<T> average_vector(this->
dim, 0);
115 for (uint32_t i_ver = 0; i_ver < this->
components[i_com].size();
117 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
118 average_vector.at(i_dim) +=
119 vertex_attribute_map[this->
components[i_com][i_ver]]
120 .observation[i_dim] *
121 vertex_attribute_map[this->
components[i_com][i_ver]]
125 uint32_t indexOfMax = 0;
126 for (uint32_t i_dim = 1; i_dim < this->
dim; i_dim++) {
127 if (average_vector.at(indexOfMax) < average_vector.at(i_dim)) {
131 average_vector[indexOfMax] = -1;
132 uint32_t indexOfSndMax = 0;
133 for (uint32_t i_dim = 1; i_dim < this->
dim; i_dim++) {
134 if (average_vector[indexOfSndMax] < average_vector[i_dim]) {
135 indexOfSndMax = i_dim;
138 return std::pair<uint32_t, uint32_t>(indexOfMax, indexOfSndMax);
146 const std::vector<std::vector<uint32_t>>& corners) {
150 boost::get(boost::vertex_bundle, this->
main_graph);
152 boost::get(boost::edge_bundle, this->
main_graph);
158 for (uint32_t i_com = 0; i_com < this->
components.size(); i_com++) {
162 for (uint32_t i_ver = 0; i_ver < this->
components[i_com].size();
171 edge_attribute_map(desc_v2source)
177 if (vertex_attribute_map(desc_v).weight == 0) {
178 edge_attribute_map(desc_source2v).capacity = 0;
179 edge_attribute_map(desc_v2sink).capacity = 0;
182 cost_B += vertex_attribute_map(desc_v)
183 .observation[corners[i_com][0]];
184 cost_notB += vertex_attribute_map(desc_v)
185 .observation[corners[i_com][1]];
186 if (cost_B > cost_notB) {
187 edge_attribute_map(desc_source2v).capacity =
189 edge_attribute_map(desc_v2sink).capacity = 0.;
191 edge_attribute_map(desc_source2v).capacity = 0.;
192 edge_attribute_map(desc_v2sink).capacity =
200 for (boost::tie(i_edg, i_edg_end) = boost::edges(this->
main_graph);
201 i_edg != i_edg_end; ++i_edg) {
202 if (!edge_attribute_map(*i_edg).realEdge) {
205 if (!edge_attribute_map(*i_edg).isActive) {
206 edge_attribute_map(*i_edg).capacity =
207 edge_attribute_map(*i_edg).weight *
208 this->parameter.reg_strenth;
210 edge_attribute_map(*i_edg).capacity = 0;
219 std::pair<std::vector<T>, T>
compute_value(
const uint32_t& i_com)
override {
221 boost::get(boost::vertex_bundle, this->
main_graph);
224 this->componentVector =
225 std::vector<std::vector<T>>(this->
components.size());
227 std::vector<T> average_vector(this->
dim), component_value(this->
dim);
229 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
230 average_vector[i_dim] = 0;
232 for (uint32_t ind_ver = 0; ind_ver < this->
components[i_com].size();
234 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
235 average_vector[i_dim] +=
236 vertex_attribute_map[this->
components[i_com][ind_ver]]
237 .observation[i_dim] *
238 vertex_attribute_map[this->
components[i_com][ind_ver]]
242 vertex_attribute_map[this->
components[i_com][ind_ver]]
244 vertex_attribute_map(this->
components[i_com][ind_ver])
245 .in_component = i_com;
247 this->componentVector[i_com] = average_vector;
248 uint32_t indexOfMax = 0;
249 for (uint32_t i_dim = 1; i_dim < this->
dim; i_dim++) {
250 if (average_vector[indexOfMax] < average_vector[i_dim]) {
254 for (uint32_t ind_ver = 0; ind_ver < this->
components[i_com].size();
256 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
257 if (i_dim == indexOfMax) {
258 component_value[i_dim] = 1;
259 vertex_attribute_map(this->
components[i_com][ind_ver])
262 component_value[i_dim] = 0;
263 vertex_attribute_map(this->
components[i_com][ind_ver])
268 return std::pair<std::vector<T>, T>(component_value, total_weight);
282 std::vector<T> merge_value(this->
dim), mergedVector(this->
dim);
285 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
286 mergedVector[i_dim] =
287 this->componentVector[reduced_vertex_vertex_index_map(
289 this->componentVector[reduced_vertex_vertex_index_map(
292 uint32_t indexOfMax = 0;
293 for (uint32_t i_dim = 1; i_dim < this->
dim; i_dim++) {
294 if (mergedVector[indexOfMax] < mergedVector[i_dim]) {
298 for (uint32_t i_dim = 0; i_dim < this->
dim; i_dim++) {
299 if (i_dim == indexOfMax) {
300 merge_value[i_dim] = 1;
302 merge_value[i_dim] = 0;
304 gain += mergedVector[i_dim] * merge_value[i_dim] -
305 this->componentVector[reduced_vertex_vertex_index_map(
307 reduced_vertex_attribute_map(comp1).value[i_dim] -
308 this->componentVector[reduced_vertex_vertex_index_map(
310 reduced_vertex_attribute_map(comp2).value[i_dim];
313 return std::pair<std::vector<T>, T>(merge_value, gain);
boost::vec_adj_list_vertex_property_map< Graph< T >, Graph< T > *, VertexAttribute< T >, VertexAttribute< T > &, boost::vertex_bundle_t > VertexAttributeMap
typename boost::graph_traits< Graph< T > >::edge_iterator EdgeIterator
typename boost::graph_traits< Graph< T > >::vertex_iterator VertexIterator
boost::graph_traits< boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS > >::edge_descriptor EdgeDescriptor
typename boost::graph_traits< CP::Graph< T > >::vertex_descriptor VertexDescriptor
typename boost::property_map< Graph< T >, boost::vertex_index_t >::type VertexIndexMap
boost::adj_list_edge_property_map< boost::directed_tag, EdgeAttribute< T >, EdgeAttribute< T > &, uint64_t, CP::EdgeAttribute< T >, boost::edge_bundle_t > EdgeAttributeMap
std::pair< uint32_t, uint32_t > find_corner(const uint32_t &i_com)
std::pair< std::vector< T >, T > compute_value(const uint32_t &i_com) override
CutPursuit_Linear(uint32_t nbVertex=1)
std::pair< T, T > compute_energy() override
void compute_corners(std::vector< std::vector< uint32_t >> &corners)
void set_capacities(const std::vector< std::vector< uint32_t >> &corners)
std::pair< std::vector< T >, T > compute_merge_gain(const VertexDescriptor< T > &comp1, const VertexDescriptor< T > &comp2) override
std::vector< std::vector< T > > componentVector
CP::VertexIterator< T > lastIterator
std::vector< std::vector< VertexDescriptor< T > > > components
VertexDescriptor< T > sink
VertexDescriptor< T > source
size_t activate_edges(bool allows_saturation=true)
std::vector< bool > saturated_components