int cycleNumber = 0;
int lastSwaps = 0;
int lastNoSwaps = 0;
int failures = 0;
int successes = 0;
RunningAverage avg = new SimpleRunningAverage(100, 0.0);
RunningAverage avg2 = new BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 100, null);
int pings = 0;
for(int total = 0; total < maxTests; total++) {
cycleNumber++;
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
// Ignore
}
for(int i = 0; i < nodes.length; i++) {
System.err.println("Cycle " + cycleNumber + " node " + i + ": " + nodes[i].getLocation());
}
int newSwaps = LocationManager.swaps;
int totalStarted = LocationManager.startedSwaps;
int noSwaps = LocationManager.noSwaps;
System.err.println("Swaps: " + (newSwaps - lastSwaps));
System.err.println("\nTotal swaps: Started*2: " + totalStarted * 2 + ", succeeded: " + newSwaps + ", last minute failures: " + noSwaps +
", ratio " + (double) noSwaps / (double) newSwaps + ", early failures: " + ((totalStarted * 2) - (noSwaps + newSwaps)));
System.err.println("This cycle ratio: " + ((double) (noSwaps - lastNoSwaps)) / ((double) (newSwaps - lastSwaps)));
lastNoSwaps = noSwaps;
System.err.println("Swaps rejected (already locked): " + LocationManager.swapsRejectedAlreadyLocked);
System.err.println("Swaps rejected (nowhere to go): " + LocationManager.swapsRejectedNowhereToGo);
System.err.println("Swaps rejected (rate limit): " + LocationManager.swapsRejectedRateLimit);
System.err.println("Swaps rejected (recognized ID):" + LocationManager.swapsRejectedRecognizedID);
System.err.println("Swaps failed:" + LocationManager.noSwaps);
System.err.println("Swaps succeeded:" + LocationManager.swaps);
double totalSwapInterval = 0.0;
double totalSwapTime = 0.0;
for(int i = 0; i < nodes.length; i++) {
totalSwapInterval += nodes[i].lm.getSendSwapInterval();
totalSwapTime += nodes[i].lm.getAverageSwapTime();
}
System.err.println("Average swap time: " + (totalSwapTime / nodes.length));
System.err.println("Average swap sender interval: " + (totalSwapInterval / nodes.length));
waitForAllConnected(nodes);
lastSwaps = newSwaps;
// Do some (routed) test-pings
for(int i = 0; i < 10; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e1) {
}
try {
Node randomNode = nodes[random.nextInt(nodes.length)];
Node randomNode2 = randomNode;
while(randomNode2 == randomNode) {
randomNode2 = nodes[random.nextInt(nodes.length)];
}
double loc2 = randomNode2.getLocation();
Logger.normal(RealNodeRoutingTest.class, "Pinging " + randomNode2.getDarknetPortNumber() + " @ " + loc2 + " from " + randomNode.getDarknetPortNumber() + " @ " + randomNode.getLocation());
int hopsTaken = randomNode.routedPing(loc2, randomNode2.getDarknetPubKeyHash());
pings++;
if(hopsTaken < 0) {
failures++;
avg.report(0.0);
avg2.report(0.0);
double ratio = (double) successes / ((double) (failures + successes));
System.err.println("Routed ping " + pings + " FAILED from " + randomNode.getDarknetPortNumber() + " to " + randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" + avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
} else {
totalHopsTaken += hopsTaken;
successes++;
avg.report(1.0);
avg2.report(1.0);
double ratio = (double) successes / ((double) (failures + successes));
System.err.println("Routed ping " + pings + " success: " + hopsTaken + ' ' + randomNode.getDarknetPortNumber() + " to " + randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" + avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
}
} catch(Throwable t) {
Logger.error(RealNodeRoutingTest.class, "Caught " + t, t);
}
}
System.err.println("Average path length for successful requests: "+totalHopsTaken/successes);
if(pings > 10 && avg.currentValue() > accuracy && ((double) successes / ((double) (failures + successes)) > accuracy)) {
System.err.println();
System.err.println("Reached " + (accuracy * 100) + "% accuracy.");
System.err.println();
System.err.println("Network size: " + nodes.length);
System.err.println("Maximum HTL: " + MAX_HTL);