Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / example / symphony / SymphonyStatistics.java
diff --git a/contrib/psg/src/example/symphony/SymphonyStatistics.java b/contrib/psg/src/example/symphony/SymphonyStatistics.java
new file mode 100644 (file)
index 0000000..4e97219
--- /dev/null
@@ -0,0 +1,77 @@
+package example.symphony;\r
+\r
+import peersim.config.Configuration;\r
+import peersim.core.Control;\r
+import peersim.core.Network;\r
+import peersim.core.Node;\r
+\r
+/**\r
+ *\r
+ * @author Andrea Esposito <and1989@gmail.com>\r
+ */\r
+public class SymphonyStatistics implements Control {\r
+\r
+    private static final String PAR_SYMPHONY = "symphony";\r
+    private final int symphonyID;\r
+    private long totalMsg = 0;\r
+    private long numRouteResposeMsg = 0;\r
+    private long numRouteMsg = 0;\r
+    private long numRouteFailMsg = 0;\r
+    private long numRouteFoundManagerMsg = 0;\r
+    private double mediaHopRouteResponseMsg = 0.0;\r
+\r
+    public SymphonyStatistics(String prefix) {\r
+        symphonyID = Configuration.getPid(prefix + "." + PAR_SYMPHONY);\r
+    }\r
+\r
+    public boolean execute() {\r
+\r
+        AdapterIterableNetwork itNetwork = new AdapterIterableNetwork();\r
+        for (Node node : itNetwork) {\r
+            SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);\r
+            Tuple<Message, Message>[] tupleMessages = symphony.getHistoryMessage();\r
+            totalMsg += tupleMessages.length;\r
+\r
+            for (Tuple<Message, Message> tupleMessage : tupleMessages) {\r
+\r
+                Message message = tupleMessage.x;\r
+\r
+                if (message != null) {\r
+                    switch (message.getType()) {\r
+                        case ROUTE:\r
+                            numRouteMsg++;\r
+                            if (tupleMessage.y != null && tupleMessage.y.getType() == Message.MessageType.ROUTE_RESPONSE) {\r
+                                numRouteFoundManagerMsg++;\r
+                                mediaHopRouteResponseMsg = ((mediaHopRouteResponseMsg * (numRouteFoundManagerMsg - 1)) + message.getHop()) / (double) numRouteFoundManagerMsg;\r
+                            }\r
+                            break;\r
+                        case ROUTE_FAIL:\r
+                            numRouteFailMsg++;\r
+                            break;\r
+                        case ROUTE_RESPONSE:\r
+                            numRouteResposeMsg++;\r
+                            break;\r
+                    }\r
+                }\r
+            }\r
+\r
+            symphony.clearHistoryMessage();\r
+        }\r
+\r
+        printStatistics();\r
+\r
+        return false;\r
+    }\r
+\r
+    private void printStatistics() {\r
+        System.out.println("### Statistics ###");\r
+        System.out.println("- Total Messages: " + totalMsg);\r
+        System.out.println("- Total Route Messages: " + numRouteMsg);\r
+        System.out.println("- Found Manager Route Message: " + numRouteFoundManagerMsg);\r
+        System.out.println("- Response Message: " + numRouteResposeMsg);\r
+        System.out.println("- Fail Message: " + numRouteFailMsg);\r
+        System.out.println();\r
+        System.out.println("Average Hop:" + mediaHopRouteResponseMsg + " Expected value (k = log n): " + (Math.log(Network.size()) / Math.log(2)));\r
+        System.out.println("### END ###\n");\r
+    }\r
+}\r