Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
SMPI network calibration: tutorial
[simgrid.git] / docs / source / tuto_network_calibration / Utils.hpp
diff --git a/docs/source/tuto_network_calibration/Utils.hpp b/docs/source/tuto_network_calibration/Utils.hpp
new file mode 100644 (file)
index 0000000..d7d6eac
--- /dev/null
@@ -0,0 +1,50 @@
+/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <map>
+#include <memory>
+#include <simgrid/s4u.hpp>
+#include <vector>
+
+/** @brief Creates a platform based on dahu cluster in Grid'5000 */
+void load_dahu_platform(const simgrid::s4u::Engine& e, double bw, double lat);
+
+/** @brief Noise generation interface */
+class Sampler {
+public:
+  virtual double sample() = 0;
+};
+
+/** @brief Segmented noise generation. Use different sampler for each message size */
+class SegmentedRegression {
+  std::map<double, std::shared_ptr<Sampler>> segments_;
+  std::map<double, double> coef_;
+  bool use_coef_;
+  std::shared_ptr<Sampler> get_sampler(double x) const
+  {
+    auto sampler = segments_.upper_bound(x);
+    if (sampler->first >= x)
+      return sampler->second;
+    THROW_IMPOSSIBLE;
+  }
+
+public:
+  explicit SegmentedRegression(bool use = true) : use_coef_(use) {}
+  void append(double max, double coef, std::shared_ptr<Sampler> sampler)
+  {
+    coef_[max]     = coef;
+    segments_[max] = std::move(sampler);
+  }
+
+  double sample(double x) const
+  {
+    double value = get_sampler(x)->sample();
+    if (use_coef_)
+      value += x * coef_.upper_bound(x)->second;
+    return value;
+  }
+
+  double get_coef(double x) const { return coef_.upper_bound(x)->second; }
+};
\ No newline at end of file