#!/usr/bin/python3
import numpy as np
import math
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as Axes3D
import mysearch as mys

def func(x,y):
    return ((x-1)**2+y**2)





def powell(f,x0):
    xn = x0
    xnm=xn
    pn=np.array([0,0])
    pset = np.array([[1,0],[0,1]]) #initial direction set is R^2 canonical basis
    def fline(t): #define a function that represents the function in direction of pn
        x=xn+t*pn
        return f(x[0],x[1])
    deltaf=[0,0] #create vector to log functional differences
    for j in range(0,10):
        fn=f(xn[0],xn[1])
        for i in range(0,2): #iterate for each direction
            pn = pset[i]
            blist = mys.minbracket(fline,0,4,25)
            if len(blist)>0:
                tmin = mys.golden(fline,blist[0][0],blist[0][1],1e-5)
                xn=xn+tmin*pn
            deltaf[i]=fn-fline(tmin)
        if np.sqrt((xnm[0]-xn[0])**2+(xnm[0]-xn[0])**2) < 1e-9:
            return xnm
        else: 
            xnm=xn
            s=np.argmin(np.abs(deltaf)) #find vector with smallest functional difference for powell's method
            pset[s]=xn-xnm #powell's vector updating



print(powell(func,np.array([-2,-1])))
