File: linesearch.py

package info (click to toggle)
python-scipy 0.7.2%2Bdfsg1-1%2Bdeb6u1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze-lts
  • size: 28,572 kB
  • ctags: 36,183
  • sloc: cpp: 216,880; fortran: 76,016; python: 71,833; ansic: 62,118; makefile: 243; sh: 17
file content (54 lines) | stat: -rw-r--r-- 1,442 bytes parent folder | download | duplicates (2)
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
## 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)

    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)

        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