import numpy as np
import matplotlib.pyplot as plt

def ES(n,sigma,eval,term=lambda P,t:t>=100000,kappa=0.82,zw=0.2,fit=lambda P:P[0],lb=-10,ub=10):
    t=0
    P=np.random.uniform(lb, ub, n)
    succ=0
    stats=[]
    while not term(P,t):
        Pm=P+np.random.normal(0,sigma,n)

        if eval(P,Pm,t):
            P=Pm
            succ=succ+1
        t=t+1
        if (t % 100) == 0:
            we=succ/100
            stats.append([t,sigma,we,fit(P)])
            if we < zw:
                sigma=sigma*kappa
            if we > zw:
                sigma=sigma/kappa
            succ=0
    return stats

def minimizeAbs(P,Pm,t):
    return np.sum(np.abs(P))>np.sum(np.abs(Pm))

def corridor(P,Pm,t,b=np.array([10,13,1,6,18,20,4,10,13,2])):
    if (P[1]-Pm[1]) <= b[t//10000]:
        return Pm[0]>P[0]
    else:
        return 0

stats=np.zeros((6,4,1000))
j=0
runs=1000 # decrease for reasonable computationtime
for zw in np.array([0.15,0.2,0.25,0.3,0.5,0.6]):
    for i in np.arange(0,runs):
        stats[j]=stats[j]+np.transpose(ES(2,1,corridor,zw=zw,lb=0,ub=0))
    stats[j]=stats[j]/runs
    plt.plot(stats[j][0],stats[j][1],"rx")
    plt.xlabel("t")
    plt.ylabel("sigma")
    plt.title("sigma over time, zw="+str(zw))
    #plt.axis((0,100000,0,1e10))
    plt.savefig("/home/jph/abgabensammlungSS15/ea/ubA/figures/sigma"+str(zw)+".png")
    plt.close()
    plt.plot(stats[j][0],stats[j][2],"rx")
    plt.xlabel("t")
    plt.ylabel("we")
    plt.title("we over time, zw="+str(zw))
    plt.axis((0,100000,0,0.55))
    plt.savefig("/home/jph/abgabensammlungSS15/ea/ubA/figures/we"+str(zw)+".png")
    plt.close()
    plt.plot(stats[j][0],stats[j][3],"rx")
    plt.xlabel("t")
    plt.ylabel("fitness")
    plt.title("fitness over time, zw="+str(zw))
    plt.axis((0,100000,0,1e5))
    plt.savefig("/home/jph/abgabensammlungSS15/ea/ubA/figures/fitness"+str(zw)+".png")
    plt.close()
    j=j+1

np.save("/home/jph/abgabensammlungSS15/ea/ubA/figures/stats.npy",stats)
