19 using namespace xaifBoosterCrossCountryInterface;
25 using namespace boost;
31 int forward_mode_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
33 vector<c_graph_t::vertex_t>& vv2) {
35 if (vv1.size() == 0) {set_empty_objective ();
return 0; }
36 vv2.push_back (vv1[0]);
38 for (
size_t c= 1; c < vv1.size(); c++)
39 if (vv1[c] < vv2[0]) vv2[0]= vv1[c];
40 set_objective (vv2[0]);
50 int reverse_mode_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
52 vector<c_graph_t::vertex_t>& vv2) {
54 if (vv1.size() == 0) {set_empty_objective ();
return 0; }
55 vv2.push_back (vv1[0]);
57 for (
size_t c= 1; c < vv1.size(); c++)
58 if (vv1[c] > vv2[0]) vv2[0]= vv1[c];
59 set_objective (vv2[0]);
72 return in_degree (v, cg) * out_degree (v, cg); }
75 int lowest_markowitz_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
77 vector<c_graph_t::vertex_t>& vv2) {
94 return front ? out_degree (target (edge, cg), cg) - dep[target (edge, cg)]
95 : in_degree (source (edge, cg), cg) - indep[source (edge, cg)]; }
97 return eb.second ? out_degree (target (eb.first, cg), cg) - dep[target (eb.first, cg)]
98 : in_degree (source (eb.first, cg), cg) - indep[source (eb.first, cg)]; }
100 return in_degree (v, cg) * out_degree (v, cg) - indep[v] * dep[v]; }
103 int lowest_relative_markowitz_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
105 vector<c_graph_t::vertex_t>& vv2) {
122 iei_t siei, sie_end, tiei, tie_end;
123 tie (siei, sie_end)= in_edges (source (e, cg), cg);
124 tie (tiei, tie_end)= in_edges (target (e, cg), cg);
127 vector<vertex_t> nsl;
129 for (; siei != sie_end; ++siei) {
130 vertex_t ss= source (*siei, cg);
132 for (; i != tie_end; ++i)
133 if (source (*i, cg) == ss)
break;
135 && find (nsl.begin(), nsl.end(), ss) == nsl.end()) {
136 nsl.push_back (ss); new_edges++; }
148 oei_t soei, soe_end, toei, toe_end;
149 tie (soei, soe_end)= out_edges (source (e, cg), cg);
150 tie (toei, toe_end)= out_edges (target (e, cg), cg);
153 vector<vertex_t> ntl;
155 for (; toei != toe_end; ++toei) {
156 vertex_t tt= target (*toei, cg);
158 for (; i != soe_end; ++i)
159 if (target (*i, cg) == tt)
break;
161 && find (ntl.begin(), ntl.end(), tt) == ntl.end()) {
162 ntl.push_back (tt); new_edges++; }
179 for (tie (iei, ie_end)= in_edges (v, cg); iei != ie_end; ++iei)
184 int lowest_fill_in_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
186 vector<c_graph_t::vertex_t>& vv2) {
200 bool eliminate_parallel_edges=
false) {
204 if (eliminate_parallel_edges) {
206 for (tie (soei, soe_end)= out_edges (s, cg); soei != soe_end; soei++)
207 ee+= target (*soei, cg) == t;
210 return in_degree (source (e, cg), cg) * (
new_out_edges (e, cg) - ee);
218 "e and e2 does not match");
231 for (tie (iei, ie_end)= in_edges (j, cg); iei != ie_end; ++iei)
232 if (source (*iei, cg) == se)
break;
233 if (iei == ie_end) in_edge_change++;
235 return in_edge_change * out_degree (j, cg);
241 bool eliminate_parallel_edges=
false) {
244 if (eliminate_parallel_edges) {
247 for (tie (tiei, tie_end)= in_edges (t, cg); tiei != tie_end; ++tiei)
248 ee+= source (*tiei, cg) == s;
251 return out_degree (target (e, cg), cg) * (
new_in_edges (e, cg) - ee);
260 "e and e2 does not match");
265 int out_edge_change= out_degree (se, cg) == 1 ? -1 : 0;
269 for (tie (oei, oe_end)= out_edges (j, cg); oei != oe_end; ++oei)
270 if (target (*oei, cg) == te)
break;
271 if (oei == oe_end) out_edge_change++;
273 return out_edge_change * in_degree (j, cg);
291 tie (iei, ie_end)= in_edges (v, cg);
292 for (; iei != ie_end; ++iei) {
293 vertex_t v= source (*iei, cg);
294 if (find (cv.begin(), cv.end(), v) == cv.end()) {
296 cv.push_back (v); } }
300 tie (oei, oe_end)= out_edges (v, cg);
301 for (; oei != oe_end; ++oei) {
302 vertex_t v= target (*oei, cg);
303 if (find (cv.begin(), cv.end(), v) == cv.end()) {
305 cv.push_back (v); } }
333 int markowitz= in_degree (v, cg) * out_degree (v, cg),
335 return int (
double (markowitz) + w *
double (damage)); }
338 int lmmd_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
340 vector<c_graph_t::vertex_t>& vv2) {
354 int momr= in_degree (v, cg) * out_degree (v, cg)
364 int momr_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
366 vector<c_graph_t::vertex_t>& vv2) {
379 const vector<int>& vni,
const vector<int>& vli,
380 const vector<int>& vno,
const vector<int>& vlo,
385 "e1 and e2 does not match");
391 boost::tie (e, found)=
edge (p, s, cg);
393 return found ? vno[s] * (vni[p] + vli[p]) + vni[p] * (vno[s] + vlo[s])
398 const vector<int>& vni,
const vector<int>& vli,
399 const vector<int>& vno,
const vector<int>& vlo,
403 graph_traits<c_graph_t>::out_edge_iterator oei, oe_end;
404 tie (oei, oe_end)= out_edges (target (e, cg), cg);
406 for (; oei != oe_end; ++oei)
407 oplr+=
oplr_face (e, *oei, vni, vli, vno, vlo, cg);
413 const vector<int>& vni,
const vector<int>& vli,
414 const vector<int>& vno,
const vector<int>& vlo,
418 graph_traits<c_graph_t>::in_edge_iterator iei, ie_end;
419 tie (iei, ie_end)= in_edges (source (e, cg), cg);
421 for (; iei != ie_end; ++iei)
422 oplr+=
oplr_face (*iei, e, vni, vli, vno, vlo, cg);
433 vector<int> vni, vli,
vno, vlo;
439 for (tie (iei, ie_end)= in_edges (v, cg); iei != ie_end; ++iei)
444 int moplr_vertex_t::operator() (
const vector<c_graph_t::vertex_t>& vv1,
446 vector<c_graph_t::vertex_t>& vv2) {
460 vector<c_graph_t::edge_t>& ev2) {
463 if (ev1.size() == 0)
return 0;
464 ev2.push_back (ev1[0]);
466 for (
size_t c= 1; c < ev1.size(); c++)
478 int high, low, notfront;
479 if (eb.second) high= target (edge, cg), low= source (edge, cg), notfront= 0;
480 else high= source (edge, cg), low= target (edge, cg), notfront= 1;
481 return (2 * high + notfront) * double (cg.
x()) + low;
484 int forward_mode_edge_t::operator() (
const vector<edge_bool_t>& ev1,
486 vector<edge_bool_t>& ev2) {
488 if (ev1.size() == 0) {set_empty_objective ();
return 0; }
489 ev2.push_back (ev1[0]);
491 for (
size_t c= 1; c < ev1.size(); c++) {
494 if (
lex_less (ev1[c], ev2[0], cg)) ev2[0]= ev1[c]; }
495 set_objective (
fme_obj (ev2[0], cg));
512 vector<c_graph_t::edge_t>& ev2) {
515 if (ev1.size() == 0)
return 0;
516 ev2.push_back (ev1[0]);
518 for (
size_t c= 1; c < ev1.size(); c++)
530 int high, low, front;
531 if (eb.second) high= target (edge, cg), low= source (edge, cg), front= 1;
532 else high= source (edge, cg), low= target (edge, cg), front= 0;
533 return (2 * high + front) * double (cg.
x()) + low;
536 int reverse_mode_edge_t::operator() (
const vector<edge_bool_t>& ev1,
538 vector<edge_bool_t>& ev2) {
541 if (ev1.size() == 0) {set_empty_objective ();
return 0; }
542 ev2.push_back (ev1[0]);
544 for (
size_t c= 1; c < ev1.size(); c++) {
547 if (
lex_greater (ev1[c], ev2[0], cg)) ev2[0]= ev1[c]; }
548 set_objective (
rme_obj (ev2[0], cg));
565 vector<c_graph_t::edge_t>& ev2) {
568 if (ev1.size() == 0)
return 0;
569 int min_degree= front ? out_degree (target (ev1[0], cg), cg)
570 : in_degree (source (ev1[0], cg), cg);
571 ev2.push_back (ev1[0]);
573 for (
size_t c= 1; c < ev1.size(); c++) {
575 int degree= front ? out_degree (target (e, cg), cg)
576 : in_degree (source (e, cg), cg);
577 if (degree < min_degree) ev2.resize (0);
578 if (degree <= min_degree) {
579 ev2.push_back (e); min_degree= degree;}
587 return eb.second ? out_degree (target (eb.first, cg), cg)
588 : in_degree (source (eb.first, cg), cg); }
591 int lowest_markowitz_edge_t::operator() (
const vector<edge_bool_t>& ev1,
593 vector<edge_bool_t>& ev2) {
607 vector<c_graph_t::edge_t>& ev2) {
609 if (ev1.size() == 0)
return 0;
611 int min_degree= lrm_op (front, ev1[0], cg);
612 ev2.push_back (ev1[0]);
614 for (
size_t c= 1; c < ev1.size(); c++) {
615 int degree= lrm_op (front, ev1[c], cg);
616 if (degree < min_degree) ev2.resize (0);
617 if (degree <= min_degree) {
618 ev2.push_back (ev1[c]); min_degree= degree;} }
622 int lowest_relative_markowitz_edge_t::operator() (
const vector<edge_bool_t>& ev1,
624 vector<edge_bool_t>& ev2) {
647 vector<c_graph_t::edge_t>& ev2) {
650 if (ev1.size() == 0)
return 0;
653 ev2.push_back (ev1[0]);
655 for (
size_t c= 1; c < ev1.size(); c++) {
659 if (degree < min_degree) ev2.resize (0);
660 if (degree <= min_degree) {
661 ev2.push_back (e); min_degree= degree;}
675 int markowitz= out_degree (target (e, cg), cg);
679 return int (
double (markowitz) + w *
double (damage));
683 int markowitz= in_degree (source (e, cg), cg);
687 return int (
double (markowitz) + w *
double (damage));
698 int lmmd_edge_t::operator() (
const vector<edge_bool_t>& ev1,
700 vector<edge_bool_t>& ev2) {
723 for (boost::tie (ei, e_end)= edges (gtmp); ei != e_end; ++ei)
724 if (source (*ei, gtmp) == s && target (*ei, gtmp) == t) {
739 int momr= in_degree (source (e, cg), cg);
746 tie (iei, ie_end)= in_edges (source (e, cg), cg);
747 for (; iei != ie_end; ++iei)
758 int old_overall_markowitz= 0, new_overall_markowitz= 0;
759 for (boost::tie (vi, v_end)= vertices (gtmp); vi != v_end; ++vi)
760 old_overall_markowitz+= in_degree (*vi, gtmp) * out_degree (*vi, gtmp);
766 for (boost::tie (ei, e_end)= edges (gtmp); ei != e_end; ++ei)
767 if (source (*ei, gtmp) == s && target (*ei, gtmp) == t) {
773 for (boost::tie (vi, v_end)= vertices (gtmp); vi != v_end; ++vi)
774 new_overall_markowitz+= in_degree (*vi, gtmp) * out_degree (*vi, gtmp);
793 vector<c_graph_t::edge_t>& ev2) {
795 if (ev1.size() == 0)
return 0;
797 int max_momr= momre_op (front, ev1[0], cg);
798 ev2.push_back (ev1[0]);
800 for (
size_t c= 1; c < ev1.size(); c++) {
801 int momr= momre_op (front, ev1[c], cg);
802 if (momr > max_momr) ev2.resize (0);
803 if (momr >= max_momr) {
804 ev2.push_back (ev1[c]); max_momr= momr;}
809 int momr_edge_t::operator() (
const vector<edge_bool_t>& ev1,
const c_graph_t& cg,
810 vector<edge_bool_t>& ev2) {
825 vector<c_graph_t::vertex_t> nb;
828 for (
size_t c= 0; c < nb.size(); c++)
829 if (nb[c] - i > dist) dist= nb[c] - i;
832 for (
size_t c= 0; c < nb.size(); c++)
833 if (j - nb[c] > dist) dist= j - nb[c]; }
838 int minimal_distance_edge_t::operator() (
const vector<edge_bool_t>& ev1,
const c_graph_t& cg,
839 vector<edge_bool_t>& ev2) {
852 vector<c_graph_t::edge_t>& ev2) {
854 if (ev1.size() == 0)
return 0;
856 vector<int> vni, vli, vno, vlo;
861 ev2.push_back (ev1[0]);
863 for (
size_t c= 1; c < ev1.size(); c++) {
867 if (oplr > max_oplr) ev2.resize (0);
868 if (oplr >= max_oplr) {
869 ev2.push_back (e); max_oplr= oplr;}
884 int i, j, k, x= lg.
x();
886 return ((
double (j) *
double (x)) +
double (i)) * double (x) + double (k);
889 int forward_mode_face_t::operator() (
const vector<line_graph_t::face_t>& fv1,
891 vector<line_graph_t::face_t>& fv2) {
893 if (fv1.size() == 0) {set_empty_objective ();
return 0; }
894 fv2.push_back (fv1[0]);
896 for (
size_t c= 1; c < fv1.size(); c++) {
900 set_objective (
fmf_obj (fv2[0], lg));
910 int reverse_mode_face_t::operator() (
const vector<line_graph_t::face_t>& fv1,
912 vector<line_graph_t::face_t>& fv2) {
914 if (fv1.size() == 0) {set_empty_objective ();
return 0; }
915 fv2.push_back (fv1[0]);
917 for (
size_t c= 1; c < fv1.size(); c++) {
921 set_objective (
fmf_obj (fv2[0], lg));
927 int reverse_mode_face_whole_vertex_t::operator() (
const vector<line_graph_t::face_t>& fv1,
929 vector<line_graph_t::face_t>& fv2) {
931 if (fv1.size() == 0)
return 0;
932 fv2.push_back (fv1[0]);
935 int maxv= evn[source(fv1[0], lg)].second;
937 for (
size_t c= 1; c < fv1.size(); c++) {
939 int v= evn[source(f, lg)].second;
940 if (v > maxv) {fv2.resize (0); maxv= v;}
941 if (v == maxv) fv2.push_back (f); }
953 vector<int>& mdegree) {
956 int max_vertex_cg= 0;
958 for (boost::tie (ei, e_end)= vertices (lg); ei != e_end; ++ei)
959 if (max_vertex_cg < evn[*ei].second) max_vertex_cg= evn[*ei].second;
963 mdegree.resize (0); mdegree.resize (max_vertex_cg+1);
965 for (boost::tie (fi, f_end)= edges (lg); fi != f_end; ++fi) {
967 if (evn[s].first != evn[s].second && evn[t].first != evn[t].second)
968 mdegree[evn[s].second]++; }
988 int lowest_markowitz_face_t::operator() (
const vector<line_graph_t::face_t>& fv1,
990 vector<line_graph_t::face_t>& fv2) {
1011 for (tie (ofi, of_end)= out_edges (pi, lg); ofi != of_end; ++ofi) {
1016 if (v2 == k)
return 0; }
1037 for (tie (ifi, if_end)= in_edges (ks, lg); ifi != if_end; ++ifi) {
1042 if (v1 == i)
return 0; }
1062 if (out_degree (ij, lg) == 1)
1067 if (in_degree (jk, lg) == 1)
1079 if (old_overall_markowitz - new_overall_markowitz != momr) {
1083 cout <<
"overall_markowitz_degree is " << old_overall_markowitz <<
"\n";
1084 cout <<
"elimination of face: ";
1090 cout <<
"overall_markowitz_degree is " << new_overall_markowitz
1091 <<
" momr is " << momr <<
"\n";
1103 int momr_face_t::operator() (
const vector<line_graph_t::face_t>& fv1,
1105 vector<line_graph_t::face_t>& fv2) {
1123 int minimal_distance_face_t::operator() (
const vector<line_graph_t::face_t>& fv1,
1124 const line_graph_t& lg, vector<line_graph_t::face_t>& fv2) {
1128 #ifdef USEXAIFBOOSTER
1135 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel) {
1137 boost::property_map<c_graph_t, EdgeType>::const_type eType =
get(
EdgeType(), angelLCG);
1144 bool isFront = be.second;
1145 int nontrivialEdgeChange = 0;
1148 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange--;
1150 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[e] !=
UNIT_EDGE) nontrivialEdgeChange--;
1152 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[e] ==
VARIABLE_EDGE) nontrivialEdgeChange--;
1156 if (in_degree (target (e, angelLCG), angelLCG) == 1) {
1157 for (tie (oei, oe_end) = out_edges (target (e, angelLCG), angelLCG); oei != oe_end; ++oei) {
1159 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange--;
1160 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*oei] !=
UNIT_EDGE) nontrivialEdgeChange--;
1161 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*oei] ==
VARIABLE_EDGE) nontrivialEdgeChange--;
1166 for (tie (oei, oe_end) = out_edges (target (e, angelLCG), angelLCG); oei != oe_end; ++oei) {
1167 tie (absorb_e, found_absorb) =
edge (source (e, angelLCG), target (*oei, angelLCG), angelLCG);
1171 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange++;
1173 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1177 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange++;
1179 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[e] !=
UNIT_EDGE || eType[*oei] !=
UNIT_EDGE)) nontrivialEdgeChange++;
1181 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[e] ==
VARIABLE_EDGE || eType[*oei] ==
VARIABLE_EDGE)) nontrivialEdgeChange++;
1189 if (out_degree (source (e, angelLCG), angelLCG) == 1 &&
vertex_type (source (e, angelLCG), angelLCG) !=
dependent) {
1190 for (tie (iei, ie_end) = in_edges (source (e, angelLCG), angelLCG); iei != ie_end; ++iei) {
1191 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange--;
1192 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*iei] !=
UNIT_EDGE) nontrivialEdgeChange--;
1193 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*iei] ==
VARIABLE_EDGE) nontrivialEdgeChange--;
1198 for (tie (iei, ie_end) = in_edges (source (e, angelLCG), angelLCG); iei != ie_end; ++iei) {
1199 tie (absorb_e, found_absorb) =
edge (source (*iei, angelLCG), target (e, angelLCG), angelLCG);
1203 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange++;
1205 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1209 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange++;
1211 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[e] !=
UNIT_EDGE || eType[*iei] !=
UNIT_EDGE)) nontrivialEdgeChange++;
1213 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[e] ==
VARIABLE_EDGE || eType[*iei] ==
VARIABLE_EDGE)) nontrivialEdgeChange++;
1218 return nontrivialEdgeChange;
1223 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel) {
1229 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1230 vector<EdgeElim>& bev2) {
1232 if (bev1.empty())
return 0;
1234 for (
size_t c = 0; c < bev1.size(); c++)
1236 bev2.push_back (bev1[c]);
1239 cout <<
" Of " << bev1.size() <<
" edge eliminations passed to maintaining_edge_eliminations(), " << bev2.size() <<
" maintain the nontrivial edge count" << endl;
1251 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1252 vector<EdgeElim>& bev2) {
1254 if (bev1.empty())
return 0;
1256 for (
size_t c = 0; c < bev1.size(); c++)
1258 bev2.push_back (bev1[c]);
1261 cout <<
" Of " << bev1.size() <<
" edge eliminations passed to reducing_edge_eliminations()"
1262 <<
", " << bev2.size() <<
" reduce the nontrivial edge count" << endl;
1275 vector<EdgeElim>& bev2) {
1282 refillDependenceMap_t::const_iterator depMap_i;
1283 vertex_set_t::const_iterator vDepSet_i;
1284 property_map<pure_c_graph_t, VertexVisited>::type visited =
get(
VertexVisited(), angelLCG);
1287 for (
size_t c = 0; c < bev1.size(); c++) {
1290 depMap_i = refillDependences.find(make_pair(source (e, angelLCG), target(e, angelLCG)));
1291 if (depMap_i != refillDependences.end()) {
1293 cout <<
"edge " << e <<
" has some refill dependences. Checking them..." << endl;
1299 for (vDepSet_i = vDepSet.begin(); vDepSet_i != vDepSet.end(); vDepSet_i++) {
1301 for (tie(cleari, clear_end) = vertices(angelLCG); cleari != clear_end; ++cleari) visited[*cleari] =
false;
1302 if (
reachable (source (e, angelLCG), *vDepSet_i, angelLCG)) {
1304 for (tie(cleari, clear_end) = vertices(angelLCG); cleari != clear_end; ++cleari) visited[*cleari] =
false;
1305 if (
reachable (*vDepSet_i, target (e, angelLCG), angelLCG)) {
1307 cout <<
"edge " << e <<
" has an unmet refill dependence on vertex " << *vDepSet_i << endl;
1315 if (vDepSet_i == vDepSet.end())
1316 bev2.push_back(bev1[c]);
1318 else bev2.push_back(bev1[c]);
1323 cout <<
" Of " << bev1.size() <<
" edge eliminations passed to refill_avoiding_edge_eliminations(), " << bev2.size() <<
" don't violate refill dependences" << endl;
1335 const std::vector<Transformation>& transformationsPerformedV,
1336 vector<EdgeElim>& reroutingConsiderateEdgeElimsV) {
1337 reroutingConsiderateEdgeElimsV.clear();
1342 for (
size_t i = 0; i < bev.size(); i++) {
1345 if (bev[i].isFront()) {
1347 for (j = 0; j < transformationsPerformedV.size(); j++) {
1348 if (transformationsPerformedV[j].isRerouting()
1349 && transformationsPerformedV[j].getRerouting().isPre()
1350 && source(transformationsPerformedV[j].getRerouting().getE(angelLCG), angelLCG) == bev[i].getSource()
1351 && source(transformationsPerformedV[j].getRerouting().getPivotE(angelLCG), angelLCG) == bev[i].getTarget())
1357 for (j = 0; j < transformationsPerformedV.size(); j++) {
1358 if (transformationsPerformedV[j].isRerouting()
1359 && !transformationsPerformedV[j].getRerouting().isPre()
1360 && target(transformationsPerformedV[j].getRerouting().getE(angelLCG), angelLCG) == bev[i].getTarget()
1361 && target(transformationsPerformedV[j].getRerouting().getPivotE(angelLCG), angelLCG) == bev[i].getSource())
1366 if (j == transformationsPerformedV.size())
1367 reroutingConsiderateEdgeElimsV.push_back(bev[i]);
1371 cout <<
" Of " << bev.size() <<
" edge eliminations passed to rerouting_considerate_edge_eliminations(), " << reroutingConsiderateEdgeElimsV.size() <<
" don't undo a rerouting" << endl;
1374 if (reroutingConsiderateEdgeElimsV.empty()) {
1375 reroutingConsiderateEdgeElimsV = bev;
1383 vector<EdgeElim>& outEEV) {
1388 vector<edge_bool_t> inBEV, outBEV;
1390 for (
size_t i = 0; i < inEEV.size(); i++)
1391 inBEV.push_back(inEEV[i].getBool(angelLCG));
1395 for (
size_t i = 0; i < outBEV.size(); i++)
1396 outEEV.push_back(
EdgeElim (outBEV[i], angelLCG));
1398 return outEEV.size();
1403 vector<EdgeElim>& outEEV) {
1408 vector<edge_bool_t> inBEV, outBEV;
1410 for (
size_t i = 0; i < inEEV.size(); i++)
1411 inBEV.push_back(inEEV[i].getBool(angelLCG));
1415 for (
size_t i = 0; i < outBEV.size(); i++)
1416 outEEV.push_back(
EdgeElim (outBEV[i], angelLCG));
1426 const std::vector<Transformation>& transformationsPerformedV,
1428 vector<Rerouting>& noncyclicReroutingsV) {
1429 noncyclicReroutingsV.clear();
1434 for (
size_t i = 0; i < erv.size(); i++) {
1436 for (j = 0; j < transformationsPerformedV.size(); j++)
1437 if (transformationsPerformedV[j].isRerouting()
1438 && transformationsPerformedV[j].getRerouting() == erv[i]);
1440 if (j == transformationsPerformedV.size())
1441 noncyclicReroutingsV.push_back(erv[i]);
1443 return noncyclicReroutingsV.size();
1502 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1503 vector<Rerouting>& reducingReroutingsV) {
1504 reducingReroutingsV.clear();
1508 boost::property_map<c_graph_t, EdgeType>::const_type eType =
get(
EdgeType(), angelLCG);
1512 bool found_absorb_e;
1514 for (
size_t i = 0; i < erv.size(); i++) {
1517 bool incrementIsTrivial;
1518 int nontrivialEdgeChange_rerouting =
reroute_effect (er, angelLCG, ourAwarenessLevel, incrementIsTrivial);
1526 int nontrivialEdgeChange_elimIncrement = 0;
1527 int nontrivialEdgeChange_elimPivot = 0;
1535 if (in_degree (source (e, angelLCG), angelLCG) > 0) {
1537 if (!incrementIsTrivial) nontrivialEdgeChange_elimIncrement--;
1540 for (tie(iei, ie_end) = in_edges(source(e, angelLCG), angelLCG); iei != ie_end; ++iei) {
1541 tie(absorb_e, found_absorb_e) =
edge(source(*iei, angelLCG), source(pe, angelLCG), angelLCG);
1542 if (found_absorb_e) {
1543 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_elimIncrement++;
1544 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1545 if (eType[*iei] ==
VARIABLE_EDGE || !incrementIsTrivial) nontrivialEdgeChange_elimIncrement++;
1548 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimIncrement++;
1549 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[*iei] !=
UNIT_EDGE || !incrementIsTrivial)) nontrivialEdgeChange_elimIncrement++;
1550 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[*iei] ==
VARIABLE_EDGE || !incrementIsTrivial)) nontrivialEdgeChange_elimIncrement++;
1553 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_elimIncrement < 0) er.
increment_eliminatable =
true;
1561 if (in_degree(target(pe, angelLCG), angelLCG) == 2 &&
vertex_type(target(pe, angelLCG), angelLCG) !=
dependent) {
1564 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot--;
1565 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[pe] !=
UNIT_EDGE) nontrivialEdgeChange_elimPivot--;
1566 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[pe] ==
VARIABLE_EDGE) nontrivialEdgeChange_elimPivot--;
1569 for (tie (oei, oe_end) = out_edges(target(pe, angelLCG), angelLCG); oei != oe_end; ++oei) {
1571 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot--;
1572 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*oei] !=
UNIT_EDGE) nontrivialEdgeChange_elimPivot--;
1573 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*oei] ==
VARIABLE_EDGE) nontrivialEdgeChange_elimPivot--;
1575 tie (absorb_e, found_absorb_e) =
edge (source(pe, angelLCG), target(*oei, angelLCG), angelLCG);
1576 if (found_absorb_e) {
1577 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_elimPivot++;
1578 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1582 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot++;
1583 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[pe] !=
UNIT_EDGE || eType[*oei] !=
UNIT_EDGE)) nontrivialEdgeChange_elimPivot++;
1584 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[pe] ==
VARIABLE_EDGE || eType[*oei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_elimPivot++;
1588 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_elimPivot < 0) er.
pivot_eliminatable =
true;
1596 for (tie(oei, oe_end) = out_edges(target(e, angelLCG), angelLCG); oei != oe_end; ++oei) {
1597 int nontrivialEdgeChange_backElimination = 0;
1600 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS
1601 || (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*oei] !=
UNIT_EDGE)
1602 || (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*oei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_backElimination--;
1605 for (tie(iei, ie_end) = in_edges(target(e, angelLCG), angelLCG); iei != ie_end; ++iei) {
1606 if (*iei == e)
continue;
1607 tie(absorb_e, found_absorb_e) =
edge(source(*iei, angelLCG), target(*oei, angelLCG), angelLCG);
1608 if (found_absorb_e) {
1609 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_backElimination++;
1610 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1614 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_backElimination++;
1615 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[*oei] !=
UNIT_EDGE || eType[*iei] !=
UNIT_EDGE)) nontrivialEdgeChange_backElimination++;
1616 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[*oei] ==
VARIABLE_EDGE || eType[*iei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_backElimination++;
1619 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_backElimination < 0) er.
type3EdgeElimVector.push_back(target(*oei, angelLCG));
1632 if (!incrementIsTrivial) nontrivialEdgeChange_elimIncrement--;
1635 for (tie (oei, oe_end) = out_edges(target(e, angelLCG), angelLCG); oei != oe_end; ++oei) {
1636 tie (absorb_e, found_absorb_e) =
edge(target(pe, angelLCG), target(*oei, angelLCG), angelLCG);
1637 if (found_absorb_e) {
1638 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_elimIncrement++;
1639 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1640 if (eType[*oei] ==
VARIABLE_EDGE || !incrementIsTrivial) nontrivialEdgeChange_elimIncrement++;
1643 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimIncrement++;
1644 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[*oei] !=
UNIT_EDGE || !incrementIsTrivial)) nontrivialEdgeChange_elimIncrement++;
1645 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[*oei] ==
VARIABLE_EDGE || !incrementIsTrivial)) nontrivialEdgeChange_elimIncrement++;
1648 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_elimIncrement < 0) er.
increment_eliminatable =
true;
1656 if (out_degree (source(pe, angelLCG), angelLCG) == 2 && in_degree (source(pe, angelLCG), angelLCG) > 0) {
1659 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot--;
1660 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[pe] !=
UNIT_EDGE) nontrivialEdgeChange_elimPivot--;
1661 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[pe] ==
VARIABLE_EDGE) nontrivialEdgeChange_elimPivot--;
1665 for (tie (iei, ie_end) = in_edges(source(pe, angelLCG), angelLCG); iei != ie_end; ++iei) {
1667 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot--;
1668 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*iei] !=
UNIT_EDGE) nontrivialEdgeChange_elimPivot--;
1669 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*iei] ==
VARIABLE_EDGE) nontrivialEdgeChange_elimPivot--;
1671 tie (absorb_e, found_absorb_e) =
edge (source(*iei, angelLCG), target(pe, angelLCG), angelLCG);
1672 if (found_absorb_e) {
1673 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_elimPivot++;
1674 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1678 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_elimPivot++;
1679 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[pe] !=
UNIT_EDGE || eType[*iei] !=
UNIT_EDGE)) nontrivialEdgeChange_elimPivot++;
1680 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[pe] ==
VARIABLE_EDGE || eType[*iei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_elimPivot++;
1684 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_elimPivot < 0) er.
pivot_eliminatable =
true;
1693 for (tie(iei, ie_end) = in_edges(source(e, angelLCG), angelLCG); iei != ie_end; ++iei) {
1694 int nontrivialEdgeChange_frontElimination = 0;
1697 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS
1698 || (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[*iei] !=
UNIT_EDGE)
1699 || (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[*iei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_frontElimination--;
1702 for (tie(oei, oe_end) = out_edges(source(e, angelLCG), angelLCG); oei != oe_end; ++oei) {
1703 if (*oei == e)
continue;
1704 tie(absorb_e, found_absorb_e) =
edge(source(*iei, angelLCG), target(*oei, angelLCG), angelLCG);
1705 if (found_absorb_e) {
1706 if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && eType[absorb_e] ==
UNIT_EDGE) nontrivialEdgeChange_frontElimination++;
1707 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && eType[absorb_e] !=
VARIABLE_EDGE)
1711 if (ourAwarenessLevel == AwarenessLevel::NO_AWARENESS) nontrivialEdgeChange_frontElimination++;
1712 else if (ourAwarenessLevel == AwarenessLevel::UNIT_AWARENESS && (eType[*oei] !=
UNIT_EDGE || eType[*iei] !=
UNIT_EDGE)) nontrivialEdgeChange_frontElimination++;
1713 else if (ourAwarenessLevel == AwarenessLevel::CONSTANT_AWARENESS && (eType[*oei] ==
VARIABLE_EDGE || eType[*iei] ==
VARIABLE_EDGE)) nontrivialEdgeChange_frontElimination++;
1716 if (nontrivialEdgeChange_rerouting + nontrivialEdgeChange_frontElimination < 0) er.
type3EdgeElimVector.push_back(source(*iei, angelLCG));
1722 reducingReroutingsV.push_back(
Rerouting (er, angelLCG));
1727 cout <<
" Of " << erv.size() <<
" reroutings passed to reducing_reroutings(), " << reducingReroutingsV.size() <<
" reduce the nontrivial edge count when followed by elimination" << endl;
1730 return !reducingReroutingsV.empty();
1739 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel) {
1742 bool dummy_incrementIsTrivial;
1751 const std::vector<Transformation>& transformationsPerformedV,
1752 vector<Transformation>& allViableTransformationsV) {
1753 allViableTransformationsV.clear();
1755 vector<EdgeElim> allEdgeElimsV;
1757 for (
size_t i = 0; i < allEdgeElimsV.size(); i++)
1758 allViableTransformationsV.push_back(
Transformation (allEdgeElimsV[i]));
1760 vector<Rerouting> allReroutingsV, noncyclicReroutingsV;
1762 noncyclicReroutings (allReroutingsV, transformationsPerformedV, angelLCG, noncyclicReroutingsV);
1763 for (
size_t i = 0; i < noncyclicReroutingsV.size(); i++)
1764 allViableTransformationsV.push_back(
Transformation (noncyclicReroutingsV[i]));
1766 cout <<
"\tThere are " << allEdgeElimsV.size() <<
" viable Edge eliminations in G" << endl;
1767 cout <<
"\tOf " << allReroutingsV.size() <<
" possible reroutings, " << noncyclicReroutingsV.size() <<
" are noncyclic" << endl;
1768 cout <<
"\t\tThere are " << allViableTransformationsV.size() <<
" viable transformations in G" << endl;
1770 return !allViableTransformationsV.empty();
1775 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1776 vector<Transformation>& maintainingTransformationsV) {
1777 maintainingTransformationsV.clear();
1781 vector<Rerouting> tempReroutingsV;
1782 vector<EdgeElim> tempEdgeElimsV, tempMaintainingEdgeElimsV;
1785 for (
size_t i = 0; i < tv.size(); i++)
1786 tv[i].isRerouting() ? tempReroutingsV.push_back(tv[i].getRerouting())
1787 : tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1791 for (
size_t i = 0; i < tempMaintainingEdgeElimsV.size(); i++)
1792 maintainingTransformationsV.push_back(
Transformation (tempMaintainingEdgeElimsV[i]));
1795 for (
size_t i = 0; i < tempReroutingsV.size(); i++)
1796 maintainingTransformationsV.push_back(
Transformation (tempReroutingsV[i]));
1799 cout <<
"Of " << tv.size() <<
" transformations passed to maintaining_transformations()"
1800 <<
", " << maintainingTransformationsV.size() <<
" maintain the nontrivial edge count" << endl;
1804 if (maintainingTransformationsV.empty()) {
1805 maintainingTransformationsV = tv;
1813 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1814 vector<Transformation>& reducingTransformationsV) {
1815 reducingTransformationsV.clear();
1819 vector<Rerouting> tempReroutingsV, tempReducingReroutingsV;
1820 vector<EdgeElim> tempEdgeElimsV, tempReducingEdgeElimsV;
1823 for (
size_t i = 0; i < tv.size(); i++)
1824 tv[i].isRerouting() ? tempReroutingsV.push_back(tv[i].getRerouting())
1825 : tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1829 for (
size_t i = 0; i < tempReducingEdgeElimsV.size(); i++)
1830 reducingTransformationsV.push_back(
Transformation (tempReducingEdgeElimsV[i]));
1833 if (
reducing_reroutings(tempReroutingsV, angelLCG, ourAwarenessLevel, tempReducingReroutingsV))
1834 for (
size_t i = 0; i < tempReducingReroutingsV.size(); i++)
1835 reducingTransformationsV.push_back(
Transformation (tempReducingReroutingsV[i]));
1838 cout <<
"Of " << tv.size() <<
" transformations passed to reducing_transformations(), " << reducingTransformationsV.size() <<
" reduce the nontrivial edge count" << endl;
1842 if (reducingTransformationsV.empty()) {
1843 for (
size_t i = 0; i < tempEdgeElimsV.size(); i++)
1844 reducingTransformationsV.push_back(
Transformation (tempEdgeElimsV[i]));
1846 if (reducingTransformationsV.empty()) {
1847 vector<EdgeElim> allEdgeElimsV;
1849 for (
size_t j = 0; j < allEdgeElimsV.size(); j++)
1850 reducingTransformationsV.push_back(
Transformation (allEdgeElimsV[j]));
1866 const AwarenessLevel::AwarenessLevel_E ourAwarenessLevel,
1868 vector<Transformation>& refillAvoidingTransformationsV) {
1869 refillAvoidingTransformationsV.clear();
1873 vector<Rerouting> tempReroutingsV;
1874 vector<EdgeElim> tempEdgeElimsV, tempRefillAvoidingEdgeElimsV;
1877 for (
size_t i = 0; i < tv.size(); i++)
1878 tv[i].isRerouting() ? tempReroutingsV.push_back(tv[i].getRerouting())
1879 : tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1884 for (
size_t i = 0; i < tempRefillAvoidingEdgeElimsV.size(); i++)
1885 refillAvoidingTransformationsV.push_back(
Transformation (tempRefillAvoidingEdgeElimsV[i]));
1887 for (
size_t i = 0; i < tempReroutingsV.size(); i++)
1888 refillAvoidingTransformationsV.push_back(
Transformation (tempReroutingsV[i]));
1893 refillAvoidingTransformationsV = tv;
1900 const std::vector<Transformation>& transformationsPerformedV,
1901 vector<Transformation>& reroutingConsiderateTransformationsV) {
1902 reroutingConsiderateTransformationsV.clear();
1906 vector<Transformation> tempReroutingsV;
1907 vector<EdgeElim> tempEdgeElimsV, tempReroutingConsiderateEdgeElimsV;
1910 for (
size_t i = 0; i < tv.size(); i++)
1911 tv[i].isRerouting() ? tempReroutingsV.push_back(tv[i].getRerouting())
1912 : tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1917 for (
size_t i = 0; i < tempReroutingConsiderateEdgeElimsV.size(); i++)
1918 reroutingConsiderateTransformationsV.push_back(
Transformation (tempReroutingConsiderateEdgeElimsV[i]));
1920 for (
size_t i = 0; i < tempReroutingsV.size(); i++)
1921 reroutingConsiderateTransformationsV.push_back(
Transformation (tempReroutingsV[i]));
1926 reroutingConsiderateTransformationsV = tv;
1933 vector<Transformation>& lowestMarkowitzTransformationsV) {
1934 lowestMarkowitzTransformationsV.clear();
1938 vector<EdgeElim> tempEdgeElimsV, tempLowestMarkowitzEdgeElimsV;
1939 for (
size_t i = 0; i < tv.size(); i++)
1940 if (!tv[i].isRerouting())
1941 tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1943 if (tempEdgeElimsV.empty()) {
1944 lowestMarkowitzTransformationsV = tv;
1949 for (
size_t i = 0; i < tempLowestMarkowitzEdgeElimsV.size(); i++)
1950 lowestMarkowitzTransformationsV.push_back(
Transformation (tempLowestMarkowitzEdgeElimsV[i]));
1956 vector<Transformation>& reverseModeTransformationsV) {
1957 reverseModeTransformationsV.clear();
1961 vector<EdgeElim> tempEdgeElimsV, tempReverseModeEdgeElimsV;
1962 for (
size_t i = 0; i < tv.size(); i++)
1963 if (!tv[i].isRerouting())
1964 tempEdgeElimsV.push_back(tv[i].getEdgeElim());
1966 if (tempEdgeElimsV.empty()) {
1967 reverseModeTransformationsV = tv;
1972 for (
size_t i = 0; i < tempReverseModeEdgeElimsV.size(); i++)
1973 reverseModeTransformationsV.push_back(
Transformation (tempReverseModeEdgeElimsV[i]));
1977 #endif // USEXAIFBOOSTER