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)