]> AND Private Git Repository - loba.git/blobdiff - main.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Allow changing communicator::send_count_before_flush at run-time.
[loba.git] / main.cpp
index 5326e732e9f9bf1834a64166fa971aa6e4276b19..907869eaad4aa4d2d517160d8648200a84e7198e 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1,5 +1,7 @@
+#include <algorithm>
 #include <cmath>
 #include <cstring>
+#include <tr1/functional>
 #include <iostream>
 #include <numeric>
 #include <stdexcept>
@@ -87,16 +89,19 @@ static void check_for_lost_load()
 
 static void compute_load_imbalance()
 {
+    using std::tr1::bind;
+    using std::tr1::placeholders::_1;
+
     unsigned n = loads.size();
     load_avg = std::accumulate(loads.begin(), loads.end(), 0.0) / n;
-    double variance = 0.0;
-    double epsilon = 0.0;
-    for (unsigned i = 0 ; i < n ; ++i) {
-        double diff = loads[i] - load_avg;
-        variance += diff * diff;
-        epsilon += diff;
-    }
-    variance = (variance - (epsilon * epsilon) / n) / n;
+
+    std::vector<double> diff(loads);
+    std::transform(diff.begin(), diff.end(), diff.begin(),
+                   bind(std::minus<double>(), _1, load_avg));
+    double epsilon = std::accumulate(diff.begin(), diff.end(), 0.0);
+    double square_sum = std::inner_product(diff.begin(), diff.end(),
+                                           diff.begin(), 0.0);
+    double variance = (square_sum - (epsilon * epsilon) / n) / n;
     load_stddev = sqrt(variance);
 }
 
@@ -128,7 +133,7 @@ int main(int argc, char* argv[])
     MSG_global_init(&argc, argv);
 
     // Parse global parameters
-    int parse_res = opt::parse_args(&argc, argv);
+    bool parse_res = opt::parse_args(&argc, argv);
     if (!parse_res
         || opt::version_requested || opt::help_requested) {
         if (opt::version_requested)