1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
|