._site

(Arne Babenhauserheide)
2012-07-26: added a cli interface.

added a cli interface.

diff --git a/sim.py b/sim.py
--- a/sim.py
+++ b/sim.py
@@ -19,7 +19,7 @@ def distances(target, nodelist):
         lengths.append(dist(n,target))
     return lengths
 
-def randomnodes(num=500):
+def randomnodes(num=8000):
     """Generate num nodes with locations between 0 and 1."""
     nodes = set()
     for n in range(num):
@@ -94,7 +94,7 @@ def generatesmallworldunclean(nodes, con
                     conn in net[node] or
                     node in net[conn] or
                    net[conn][connectionspernode+10:])):
-                closestindex = (closestindex + randint(-lennodes/connectionspernode,lennodes/connectionspernode-1))%len(nodes)
+                closestindex = (closestindex + randint(int(-lennodes/connectionspernode),int(lennodes/connectionspernode-1)))%len(nodes)
                 conn = nodes[closestindex]
             net[node].append(conn)
             if not conn in net:
@@ -369,7 +369,7 @@ def checkfold(target, prev, net, probabi
     if strategy == "connectsimple":
         return checksimpleconnect(target, prev, net)
 
-def fold(net, num=100, maxhtl=20):
+def fold(net, num=100, strategy="jumphalf", maxhtl=20):
     """do num path foldings.
 
     :return: the lengths of all used routes."""
@@ -390,7 +390,7 @@ def fold(net, num=100, maxhtl=20):
         # fold all on the route except for the start and the endpoint
         for prev in route[:-1]:
             pnet = net[prev]
-            didfold = checkfold(target, prev, net)
+            didfold = checkfold(target, prev, net, strategy=strategy)
             if didfold:
                 target = prev
     return routelengths
@@ -402,24 +402,37 @@ def linklengths(net):
         lengths.extend(distances(node, targets))
     return lengths
 
+def parse_args():
+    from argparse import ArgumentParser
+    parser = ArgumentParser(description="Simulate Freenet network optimization.")
+    parser.add_argument("--strategy", help="The optimization strategy: jump switch jumphalf connect replacebest replacelongest connectsimple", default="jumphalf")
+    parser.add_argument("--size", help="The size of the network.", default=1000, type=int)
+    parser.add_argument("--connections", help="The mean number of connections per node.", default=20, type=int)
+    parser.add_argument("--maxhtl", help="The maximum length of routes to be successful.", default=20, type=int)
+    parser.add_argument("--steps", help="The maximum number of modelsteps.", default=120, type=int)
+    parser.add_argument("--perstep", help="The number of requests to run per step.", default=100, type=int)
+    parser.add_argument("-o", "--output", help="Filename of the pylab plot.", default="plot.png")
+    return parser.parse_args()
+
 if __name__ == "__main__":
-    nodes = randomnodes()
-    basenet = generatesmallworldunclean(nodes)
+    args = parse_args()
+    nodes = randomnodes(args.size)
+    basenet = generatesmallworldunclean(nodes, args.connections)
     lensnapshots = {}
-    foldperstep = 500
+    foldperstep = args.perstep
     for run in range(2):
         if not run: 
             net = deepcopy(basenet)
         else:
-            net = generateflat(nodes)
+            net = generateflat(nodes, args.connections)
         lensnapshots[(run,0)] = linklengths(net), [0]
         print (np.mean(lensnapshots[(0,0)][0]))
         print("===", "run", run, "===")
         routelengths = fold(net, 20)
         linklens = linklengths(net)
         print (np.mean(linklens), np.mean(routelengths), "±", np.std(routelengths), "succ", len([r for r in routelengths if r < 20])/len(routelengths), min(routelengths), max(routelengths), sum(deviationfromsmallworld(linklens, numbins=10)))
-        for i in range(40):
-            routelengths = fold(net, foldperstep)
+        for i in range(args.steps):
+            routelengths = fold(net, foldperstep, args.strategy, args.maxhtl)
             linklens = linklengths(net)
             lensnapshots[(run, i+1)] = linklens, routelengths
             print (np.mean(linklens), np.mean(routelengths), "±", np.std(routelengths), "succ", len([r for r in routelengths if r < 20])/len(routelengths),
@@ -427,6 +440,7 @@ if __name__ == "__main__":
 
     # now plot the data
     import pylab as pl
+    pl.rcParams['font.size'] = 5
     for key, val in sorted(lensnapshots.items()):
         run, i = key
         linklen, routelen = val
@@ -436,5 +450,5 @@ if __name__ == "__main__":
         pl.hist(linklen, 10000, cumulative=True, normed=True, histtype='step', label=str(run) + ", " + str(i*foldperstep) + ", " + str(np.mean(routelen)))
         pl.semilogx()
     pl.legend(loc="best")
-    pl.savefig("123.png")
+    pl.savefig(args.output)