import matplotlib.pyplot as plt import random def ncollapse(column, pval): for x in reversed(xrange(1, len(column))): if column[x] and random.random() < pval: column[x-1] += column[x] column[x] = 0 def wcollapse(column, pval): for x in reversed(xrange(1, len(column))): if column[x] and random.random() < pval*column[x]: column[x-1] += column[x] column[x] = 0 def icollapse(column,pval): for x in reversed(xrange(1, len(column))): if column[x] and random.random() < pval/column[x]: column[x-1] += column[x] column[x] = 0 def gcollapse(column, pval, pfunc): #a more general form of the above functions for x in reversed(xrange(1, len(column))): if column[x] and random.random() < pfunc(pval, column[x]): column[x-1] += column[x] column[x] = 0 def uniformcplot(size, steps, pval, cfunc): bottom = [] stack = [0]+[1 for x in xrange(size-1)] for x in xrange(0,steps): bottom.append(stack[0]) cfunc(stack, pval) return bottom def thresholdcplot(size, threshold, pval, cfunc, margin): #stops at threshold bottom = [] stack = [0]+[1 for x in xrange(size-1)] extra = margin while extra+1: if stack[0] >= sum(stack)*threshold: extra -= 1 bottom.append(stack[0]) cfunc(stack, pval) return bottom def uaverage(lol): #uniform lens only avgl = [] for x in xrange(len(lol[0])): tsum = 0 for y in xrange(len(lol)): tsum += lol[y][x] avg = float(tsum)/len(lol) avgl.append(avg) return avgl def daverage(lol): #dynamic length avgl = [] for x in xrange(max([len(val) for val in lol])): tsum = 0 for y in xrange(len(lol)): if len(lol[y]) > x: tsum += lol[y][x] else: tsum += lol[y][-1] avg = float(tsum)/len(lol) avgl.append(avg) return avgl def mplot(count, cfunc, pval, threshold, margin, size): results = [thresholdcplot(size, threshold, pval, cfunc, margin) for x in xrange(count)] results = daverage(results) print max(results), min(results) plt.plot(results) plt.show() #mplot(1000,ncollapse, 0.1, 1,100, 100) #lol = [uniformcplot(100,1200,0.1, icollapse) for x in xrange(1000)] #lol = average(lol)