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)