def Simplex_Run(Gen, steps, GenHistory):
    print
    print " ========= Simplex Optimization ================= "
    Simp = Simplex(evalFitness, Gen, steps)
    # values, err, niter = SimplexOpt.minimize()
    old_low = 10000000000
    lastImprovement = 0
    for i in range(0, 10000):
        converged, err, low, hi = Simp.simplexStep(0.00001)
        if converged:
            print " converged in ", i, " steps "
            break
        if low < old_low:
            lastImprovement = i
            old_low = low
            subplot(2, 5, 5)
            plot(ts, Fs[4], "-", lw=0.25)
            grid()
            GenHistory.append(list(Simp.simplex[Simp.lowest]))
            print " new_low :  ", low, " iter: ", i, " err ", err
        if (i - lastImprovement) > (nnodes * 16):
            print " Not able to improve => Exiting .... "
            break
    print Simp.simplex[Simp.lowest]
    return Simp.simplex[Simp.lowest]
def Simplex_Run(Gen, steps, GenHistory):
    print
    print " ========= Simplex Optimization ================= "
    Simp = Simplex(evalFitness, Gen, steps)
    #values, err, niter = SimplexOpt.minimize()
    old_low = 10000000000
    lastImprovement = 0
    for i in range(0, 10000):
        converged, err, low, hi = Simp.simplexStep(0.00001)
        if converged:
            print " converged in ", i, " steps "
            break
        if (low < old_low):
            lastImprovement = i
            old_low = low
            subplot(2, 5, 5)
            plot(ts, Fs[4], '-', lw=0.25)
            grid()
            GenHistory.append(list(Simp.simplex[Simp.lowest]))
            print " new_low :  ", low, " iter: ", i, " err ", err
        if (i - lastImprovement) > (nnodes * 16):
            print " Not able to improve => Exiting .... "
            break
    print Simp.simplex[Simp.lowest]
    return Simp.simplex[Simp.lowest]
#Gen = MCrun( Gen, 10.0,  0.001, 100, 10  )

print " Initial Gen : ", Gen
Gen0 = array(Gen).copy()

Os, Rs, Fs = evalGen(Gen)

print "shape(ts)", shape(ts)
print "shape(ts)", shape(Fs[4])
#fitness = fitnesFunc(Fs)
plotTrj(Os, Rs, Fs, 0)

#Simp = Simplex(evalFitness, Gen, [1, 1, 1, 1])

steps = ones(nnodes * 2) * 0.05
Simp = Simplex(evalFitness, Gen, steps)
#values, err, niter = SimplexOpt.minimize()
old_low = 10000000000
lastImprovement = 0
for i in range(0, 10000):
    converged, err, low, hi = Simp.simplexStep(0.00001)
    if converged:
        print " converged in ", i, " steps "
        break
    if (low < old_low):
        lastImprovement = i
        old_low = low
        subplot(2, 5, 5)
        plot(ts, Fs[4], '-', lw=0.25)
        grid()
        GenHistory.append(list(Simp.simplex[Simp.lowest]))
#Gen = MCrun( Gen, 10.0,  0.001, 100, 10  )

print " Initial Gen : ", Gen
Gen0 = array(Gen).copy()

Os,Rs,Fs = evalGen(Gen)

print "shape(ts)", shape(ts)
print "shape(ts)", shape(Fs[4])
#fitness = fitnesFunc(Fs)
plotTrj( Os,Rs,Fs, 0 )

#Simp = Simplex(evalFitness, Gen, [1, 1, 1, 1])

steps = ones(nnodes*2)*0.05
Simp = Simplex(evalFitness, Gen, steps )
#values, err, niter = SimplexOpt.minimize()
old_low = 10000000000
lastImprovement = 0
for i in range(0, 10000):
    converged, err,low,hi = Simp.simplexStep( 0.00001 )
    if converged:
        print " converged in ",i," steps " 
        break;
    if(low < old_low):
        lastImprovement = i
        old_low = low 
        subplot(2,5,5); plot( ts, Fs[4], '-', lw=0.25 );  grid()
        GenHistory.append(list(Simp.simplex[Simp.lowest]))
        print " new_low :  ", low, " iter: ", i, " err ", err
    if(i-lastImprovement)>(nnodes*8):