From 734cdcebfe66ee283e7ae535cec13a857f8b4a29 Mon Sep 17 00:00:00 2001 From: "trevor.cohn" Date: Sat, 10 Jul 2010 16:49:23 +0000 Subject: Testing code for line search with simplex *equality* constraints and positivity constraints. git-svn-id: https://ws10smt.googlecode.com/svn/trunk@217 ec762483-ff6d-05da-a07a-a48fb63a330f --- gi/posterior-regularisation/linesearch.py | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 gi/posterior-regularisation/linesearch.py (limited to 'gi/posterior-regularisation/linesearch.py') diff --git a/gi/posterior-regularisation/linesearch.py b/gi/posterior-regularisation/linesearch.py new file mode 100644 index 00000000..5a3f2e9c --- /dev/null +++ b/gi/posterior-regularisation/linesearch.py @@ -0,0 +1,58 @@ +## Automatically adapted for scipy Oct 07, 2005 by convertcode.py + +from scipy.optimize import minpack2 +import numpy + +import __builtin__ +pymin = __builtin__.min + +def line_search(f, myfprime, xk, pk, gfk, old_fval, old_old_fval, + args=(), c1=1e-4, c2=0.9, amax=50): + + fc = 0 + gc = 0 + phi0 = old_fval + derphi0 = numpy.dot(gfk,pk) + alpha1 = pymin(1.0,1.01*2*(phi0-old_old_fval)/derphi0) + # trevor: added this test + alpha1 = pymin(alpha1,amax) + + if isinstance(myfprime,type(())): + eps = myfprime[1] + fprime = myfprime[0] + newargs = (f,eps) + args + gradient = False + else: + fprime = myfprime + newargs = args + gradient = True + + xtol = 1e-14 + amin = 1e-8 + isave = numpy.zeros((2,), numpy.intc) + dsave = numpy.zeros((13,), float) + task = 'START' + fval = old_fval + gval = gfk + + while 1: + stp,fval,derphi,task = minpack2.dcsrch(alpha1, phi0, derphi0, c1, c2, + xtol, task, amin, amax,isave,dsave) + #print 'minpack2.dcsrch', alpha1, phi0, derphi0, c1, c2, xtol, task, amin, amax,isave,dsave + #print 'returns', stp,fval,derphi,task + + if task[:2] == 'FG': + alpha1 = stp + fval = f(xk+stp*pk,*args) + fc += 1 + gval = fprime(xk+stp*pk,*newargs) + if gradient: gc += 1 + else: fc += len(xk) + 1 + phi0 = fval + derphi0 = numpy.dot(gval,pk) + else: + break + + if task[:5] == 'ERROR' or task[1:4] == 'WARN': + stp = None # failed + return stp, fc, gc, fval, old_fval, gval -- cgit v1.2.3