X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/48b49c2ca6573b31386bd5afd4e68304c740e8ec..83a3f82cc260646073f39d2b0862e4ca9e6608e4:/loba_bulk.cpp diff --git a/loba_bulk.cpp b/loba_bulk.cpp index 44d54ab..de9c099 100644 --- a/loba_bulk.cpp +++ b/loba_bulk.cpp @@ -1,5 +1,5 @@ +#include #include -#include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); @@ -7,81 +7,88 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); void loba_bulk::load_balance() { - float myLoad = get_load(); + float myLoad = get_load(); - unsigned NbNwMinLoad = 0; - unsigned NbNwLowerLoad = 0; - unsigned NbNeighbours = pneigh.size(); + unsigned NbNwMinLoad = 0; + unsigned NbNwLowerLoad = 0; + unsigned NbNeighbours = pneigh.size(); - double *S = new double[NbNeighbours]; - for (unsigned i = 0; i < NbNeighbours; i++) - S[i] = 0.0; - //What is the minimum and maximum load under myLoad? - float minLoad = myLoad; - for (unsigned i = 0; i < NbNeighbours; i++) { - if (pneigh[i]->get_load() < minLoad) { - minLoad = pneigh[i]->get_load(); - } - if (pneigh[i]->get_load() < myLoad) { - NbNwLowerLoad++; - } - } - for (unsigned i = 0; i < NbNeighbours; i++) - if (pneigh[i]->get_load() == minLoad) - NbNwMinLoad++; + double *S = new double[NbNeighbours]; + for (unsigned i = 0; i < NbNeighbours; i++) + S[i] = 0.0; - float maxLoad = minLoad; - for (unsigned i = 0; i < NbNeighbours; i++) { - if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad) - if (maxLoad < pneigh[i]->get_load()) - maxLoad = pneigh[i]->get_load(); - } + // What is the minimum and maximum load under myLoad? + float minLoad = myLoad; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() < minLoad) { + minLoad = pneigh[i]->get_load(); + } + if (pneigh[i]->get_load() < myLoad) { + NbNwLowerLoad++; + } + } + for (unsigned i = 0; i < NbNeighbours; i++) + if (pneigh[i]->get_load() == minLoad) + NbNwMinLoad++; + + float maxLoad = minLoad; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad) + if (maxLoad < pneigh[i]->get_load()) + maxLoad = pneigh[i]->get_load(); + } - double alpha = 0.0; + double alpha = 0.0; - if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) //There is one or many neighbors with minimum load but not all neighbors have minimum load - alpha = (1. / ((double) NbNwMinLoad + 2)); - if (NbNwMinLoad == NbNwLowerLoad) //All neighbors have minimum load - alpha = (1. / ((double) NbNwMinLoad + 1)); - float myS = 0.; - //There exist underloaded neighbors - if (NbNwMinLoad && myLoad != 0.0) { - for (unsigned i = 0; i < NbNeighbours; i++) { - if (pneigh[i]->get_load() == minLoad) { - S[i] = floor(alpha * (myLoad - minLoad)); - myS += S[i]; - } else { - if (pneigh[i]->get_load() < myLoad) { - S[i] = floor(alpha * (myLoad - pneigh[i]->get_load())); - myS += S[i]; - } - } - } - //Check assumption 4.2 (b) page 520 - bool HaveToCorrectS = false; - for (unsigned i = 0; i < NbNeighbours; i++) { - if (pneigh[i]->get_load() < myLoad) { // - //Condition 4.6 - if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) { - HaveToCorrectS = true; - } - } - } - if (HaveToCorrectS) { - for (unsigned i = 0; i < NbNeighbours; i++) { - while (((myLoad - myS) < pneigh[i]->get_load() + S[i]) && (S[i] > 0)) { - myS -= 1.0; - S[i] -= 1.0; - } - } - } - }//End there are underloaded neighbors; - for (unsigned i = 0 ; i < NbNeighbours ; i++) { - send(pneigh[i], S[i]); - XBT_DEBUG("sent to %s", pneigh[i]->get_name()); + if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) { + // There is one or many neighbors with minimum load but not + // all neighbors have minimum load + alpha = (1. / ((double) NbNwMinLoad + 2)); + } + if (NbNwMinLoad == NbNwLowerLoad) { + // All neighbors have minimum load + alpha = (1. / ((double) NbNwMinLoad + 1)); + } + float myS = 0.; + // There exist underloaded neighbors + if (NbNwMinLoad && myLoad != 0.0) { + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() == minLoad) { + S[i] = std::floor(alpha * (myLoad - minLoad)); + myS += S[i]; + } else { + if (pneigh[i]->get_load() < myLoad) { + S[i] = std::floor(alpha * (myLoad - pneigh[i]->get_load())); + myS += S[i]; + } + } + } + // Check assumption 4.2 (b) page 520 + bool HaveToCorrectS = false; + for (unsigned i = 0; i < NbNeighbours; i++) { + if (pneigh[i]->get_load() < myLoad) { + // Condition 4.6 + if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) { + HaveToCorrectS = true; + } + } + } + if (HaveToCorrectS) { + for (unsigned i = 0; i < NbNeighbours; i++) { + while (((myLoad - myS) < pneigh[i]->get_load() + S[i]) + && (S[i] > 0)) { + myS -= 1.0; + S[i] -= 1.0; + } + } } + } // End there are underloaded neighbors; + for (unsigned i = 0; i < NbNeighbours; i++) { + send(pneigh[i], S[i]); + XBT_DEBUG("sent to %s", pneigh[i]->get_name()); + } - delete[] S; + delete[] S; } // Local variables: