public void CalculateTwoHopDelays()
{
int network_size = _addrs.Count;
int total = (network_size - 1) * (network_size - 1);
List<int> delays = new List<int>(total);
List<int> direct_delays = new List<int>(total);
List<int> overlay_delays = new List<int>(total);
int ugh = 0;
foreach(GraphNode src in _addr_to_node.Values) {
foreach(GraphNode dst in _addr_to_node.Values) {
if(src == dst) {
continue;
}
if(src.ConnectionTable.IndexOf(ConnectionType.Structured, dst.Address) >= 0) {
continue;
}
int direct_delay = CalculateDelay(src, dst);
if(direct_delay == 0 || direct_delay > 500) {
continue;
}
int delay = System.Math.Min(LowestDelay(src, dst), LowestDelay(dst, src));
if(delay < direct_delay) {
ugh++;
continue;
}
delays.Add(delay);
var result = SendPacket(src.Address, dst.Address);
if(result.Count == 0) {
throw new Exception("SendPacket failed!");
}
overlay_delays.Add(result[0].Delay);
direct_delays.Add(direct_delay);
}
}
Console.WriteLine(ugh + " " + direct_delays.Count);
Console.WriteLine("TwoHops results:");
double average = Average(direct_delays);
Console.WriteLine("\tDirect Delay: Average: {0}, Stdev: {1}", average,
StandardDeviation(direct_delays, average));
average = Average(delays);
Console.WriteLine("\tTwoHops Delay: Average: {0}, Stdev: {1}", average,
StandardDeviation(delays, average));
average = Average(overlay_delays);
Console.WriteLine("\tOverlay Delay: Average: {0}, Stdev: {1}", average,
StandardDeviation(overlay_delays, average));
}