79 template <
typename captype,
typename tcaptype,
typename flowtype>
class Energy:
public Graph<captype,tcaptype,flowtype>
99 Energy(
int var_num_max,
int edge_num_max,
void (*err_function)(
const char *) = NULL);
163 void (*error_function)(
const char *);
186 template <
typename captype,
typename tcaptype,
typename flowtype>
190 error_function = err_function;
193 template <
typename captype,
typename tcaptype,
typename flowtype>
196 template <
typename captype,
typename tcaptype,
typename flowtype>
198 {
return GraphT::add_node(num); }
200 template <
typename captype,
typename tcaptype,
typename flowtype>
203 template <
typename captype,
typename tcaptype,
typename flowtype>
207 this->add_tweights(x, B, A);
210 template <
typename captype,
typename tcaptype,
typename flowtype>
220 this->add_tweights(x, D, A);
235 this->add_tweights(x, 0, B);
236 this->add_tweights(y, 0, -B);
237 this->add_edge(x, y, 0, B+C);
245 this->add_tweights(x, 0, -C);
246 this->add_tweights(y, 0, C);
247 this->add_edge(x, y, B+C, 0);
251 this->add_edge(x, y, B, C);
255 template <
typename captype,
typename tcaptype,
typename flowtype>
262 register Value pi = (E000 + E011 + E101 + E110) - (E100 + E010 + E001 + E111);
263 register Value delta;
268 Econst += E111 - (E011 + E101 + E110);
270 add_tweights(x, E101, E001);
271 add_tweights(y, E110, E100);
272 add_tweights(z, E011, E010);
274 delta = (E010 + E001) - (E000 + E011);
276 add_edge(y, z, delta, 0);
278 delta = (E100 + E001) - (E000 + E101);
280 add_edge(z, x, delta, 0);
282 delta = (E100 + E010) - (E000 + E110);
284 add_edge(x, y, delta, 0);
289 add_edge(x, u, pi, 0);
290 add_edge(y, u, pi, 0);
291 add_edge(z, u, pi, 0);
292 add_tweights(u, 0, pi);
297 Econst += E000 - (E100 + E010 + E001);
299 add_tweights(x, E110, E010);
300 add_tweights(y, E011, E001);
301 add_tweights(z, E101, E100);
303 delta = (E110 + E101) - (E100 + E111);
305 add_edge(z, y, delta, 0);
307 delta = (E110 + E011) - (E010 + E111);
309 add_edge(x, z, delta, 0);
311 delta = (E101 + E011) - (E001 + E111);
313 add_edge(y, x, delta, 0);
316 add_edge(u, x, -pi, 0);
317 add_edge(u, y, -pi, 0);
318 add_edge(u, z, -pi, 0);
319 this->add_tweights(u, -pi, 0);
323 template <
typename captype,
typename tcaptype,
typename flowtype>
325 return Econst + GraphT::maxflow(); }
327 template <
typename captype,
typename tcaptype,
typename flowtype>
void add_term2(Var x, Var y, Value E00, Value E01, Value E10, Value E11)
Definition: energy.h:211
void add_constant(Value E)
Definition: energy.h:201
void add_term3(Var x, Var y, Var z, Value E000, Value E001, Value E010, Value E011, Value E100, Value E101, Value E110, Value E111)
Definition: energy.h:256
int node_id
Definition: graph.h:63
void add_term1(Var x, Value E0, Value E1)
Definition: energy.h:204
GraphT::node_id Var
Definition: energy.h:83
flowtype TotalValue
Definition: energy.h:91
Energy(int var_num_max, int edge_num_max, void(*err_function)(const char *)=NULL)
Definition: energy.h:187
captype Value
Definition: energy.h:90
TotalValue minimize()
Definition: energy.h:324
Var add_variable(int num=1)
Definition: energy.h:197
int get_var(Var x)
Definition: energy.h:328
~Energy()
Definition: energy.h:194