Ignore:
Timestamp:
08/09/09 13:45:49 (7 years ago)
Author:
altafang
Message:

Fixing termination, gradient call counter

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/alta/mystic-0.1a2/mystic/scipy_ncg.py

    r169 r176  
    1818   - StepMonitor = CustomSow() with 4 columns 
    1919   - enable_signal_handler() 
     20   - termination = SolutionImprovement(tolerance) 
    2021 
    2122Usage 
     
    130131 
    131132 
    132     def Solve(self, func, fprime, termination, sigint_callback=None, 
    133               EvaluationMonitor=Null, StepMonitor=Null, GradMonitor=Null, 
    134               HessianMonitor=Null, ExtraArgs=(), **kwds): 
     133    def Solve(self, func, termination, sigint_callback=None, 
     134              EvaluationMonitor=Null, StepMonitor=Null, #GradientMonitor=Null, 
     135              ExtraArgs=(), **kwds): 
    135136        """Minimize a function using NCG. 
    136137 
     
    143144 
    144145    func -- the Python function or method to be minimized. 
    145     fprime -- callable f'(x,*args) 
    146             Gradient of f. 
    147146    termination -- callable object providing termination conditions. 
    148147 
     
    158157Further Inputs: 
    159158 
     159    fprime -- callable f'(x,*args) 
     160            Gradient of f. 
    160161    fhess_p : callable fhess_p(x,p,*args) 
    161162        Function which computes the Hessian of f times an 
     
    186187        x0 = self.population[0] 
    187188        x0 = asarray(x0).flatten() 
     189 
    188190        epsilon = _epsilon 
    189         disp = 1 
    190         callback = None 
     191        self.disp = 1 
     192        self.callback = None 
    191193        fhess_p = None 
    192194        fhess = None 
    193195 
    194196        if kwds.has_key('epsilon'): epsilon = kwds['epsilon'] 
    195         if kwds.has_key('callback'): callback = kwds['callback'] 
    196         if kwds.has_key('disp'): disp = kwds['disp'] 
     197        if kwds.has_key('callback'): self.callback = kwds['callback'] 
     198        if kwds.has_key('disp'): self.disp = kwds['disp'] 
    197199        if kwds.has_key('fhess'): fhess = kwds['fhess'] 
    198200        if kwds.has_key('fhess_p'): fhess_p = kwds['fhess_p'] 
     201 
     202        # fprime is actually required. Temporary fix?: 
     203        if kwds.has_key('fprime'): fprime = kwds['fprime'] 
    199204        #------------------------------------------------------------- 
    200205 
     
    216221            self._maxiter = len(x0)*200 
    217222 
    218         # Wrap gradient function?         
     223        # Wrap gradient function?  
     224        # gcalls, fprime = wrap_function(fprime, args, GradientMonitor)    
    219225        gcalls, fprime = wrap_function(fprime, args, Null) 
    220226 
     
    286292            update = alphak * pk 
    287293 
     294            # Put last solution in trialSolution for termination() 
    288295            self.trialSolution = xk 
    289296 
    290297            xk = xk + update        # upcast if necessary 
    291             if callback is not None: 
    292                 callback(xk) 
     298            if self.callback is not None: 
     299                self.callback(xk) 
    293300            k += 1 
    294301 
     
    304311        self.generations = k 
    305312 
     313        # Fix me? 
    306314        self.hcalls = hcalls 
     315        self.gcalls = gcalls[0] 
    307316 
    308317        signal.signal(signal.SIGINT,signal.default_int_handler) 
    309318     
    310         if disp: 
     319        if self.disp: 
    311320            fval = old_fval 
    312321        if k >= self._maxiter: 
    313             if disp: 
     322            if self.disp: 
    314323                print "Warning: Maximum number of iterations has been exceeded" 
    315324                print "         Current function value: %f" % fval 
     
    319328                print "         Hessian evaluations: %d" % hcalls 
    320329        else: 
    321             if disp: 
     330            if self.disp: 
    322331                print "Optimization terminated successfully." 
    323332                print "         Current function value: %f" % fval 
     
    402411  
    403412    from mystic.tools import Sow, CustomSow 
    404     from mystic.termination import XTermination 
     413    from mystic.termination import SolutionImprovement 
    405414    #stepmon = Sow() 
    406415    stepmon = CustomSow('x','y','g','h', x='x', y='fval', \ 
     
    413422    solver.SetEvaluationLimits(maxiter,None) 
    414423    # Does requiring fprime break abstract_solver interface? 
    415     solver.Solve(func, fprime, termination=XTermination(xtol),\ 
     424    solver.Solve(func, SolutionImprovement(tolerance=xtol),\ 
    416425                 EvaluationMonitor=evalmon,StepMonitor=stepmon,\ 
    417426                 disp=disp, ExtraArgs=args, callback=callback,\ 
    418427                 epsilon=epsilon, fhess_p=fhess_p,\ 
    419                  fhess=fhess) 
     428                 fhess=fhess, fprime=fprime) 
    420429    solution = solver.Solution() 
    421430 
     
    427436    fcalls = len(evalmon.x) 
    428437    iterations = len(stepmon.x) 
    429     gcalls = iterations   # Fix me? 
     438 
     439    # Fix me? 
     440    gcalls = solver.gcalls   
    430441    hcalls = solver.hcalls 
     442 
    431443    allvecs = [] 
    432444    for i in range(iterations): 
Note: See TracChangeset for help on using the changeset viewer.