Changeset 1021

Show
Ignore:
Timestamp:
06/15/08 06:35:08 (4 years ago)
Author:
dmitrey.kroshko
Message:

major changes for ralg, some updates in docstrings, some changes, implementation of prob.point

Location:
trunk/openopt/scikits/openopt
Files:
1 added
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/openopt/scikits/openopt/Kernel/BaseProblem.py

    r1008 r1021  
    77from Residuals import Residuals 
    88from ooIter import ooIter 
     9from Point import Point 
    910from ooCheckGradient import ooCheckGradient 
    1011from ooIterPrint import ooTextOutput 
     12 
    1113ProbDefaults = {'diffInt': 1e-7,  'xtol': 1e-6,  'noise': 0} 
    1214 
     
    7779 
    7880        self.F = lambda x: self.objFuncMultiple2Single(self.objFunc(x)) # TODO: should be changes for LP, MILP, QP classes! 
     81 
     82        self.point = lambda *args,  **kwargs: Point(self, *args,  **kwargs) 
    7983 
    8084        #you can redirect these ones 
  • trunk/openopt/scikits/openopt/Kernel/runProbSolver.py

    r1020 r1021  
    1010from BaseProblem import ProbDefaults 
    1111from scikits.openopt.Kernel.ooMisc import __solverPaths__ 
    12 ConTolMultiplier = 0.9999 
     12ConTolMultiplier = 0.8 
    1313 
    1414if __solverPaths__ is None: 
     
    2323                __solverPaths__[file[:-6]] = 'scikits.openopt.solvers.' + string.join(rd,'.') + '.'+file[:-3] 
    2424 
    25  
    26 def my_import(name): 
    27     mod = __import__(name) 
    28     components = name.split('.') 
    29     for comp in components[1:]: 
    30         mod = getattr(mod, comp) 
    31     return mod 
    32  
    33 class EmptyClass: pass 
    34 class OpenOptResult: pass 
    3525 
    3626def runProbSolver(p_, solver_str, *args, **kwargs): 
     
    128118 
    129119 
    130     p.stopdict = dict() 
     120    p.stopdict = {} 
    131121 
    132122    for s in ('f', 'df', 'd2f', 'c', 'dc', 'd2c', 'h', 'dh', 'd2h', 'l', 'dl', 'd2l'): 
     
    136126                p.nEvals[s] = 0 
    137127                A = getattr(p,s) 
     128 
    138129                if callable(A): #TODO: add or ndarray(A)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    139130                    A = (A,)#make tuple 
     
    205196        if not hasattr(p,  'fk'): p.fk = p.f(p.xk) 
    206197 
    207     if p.invertObjFunc: p.fk, p.ff = -p.fk, -p.ff 
     198    if p.invertObjFunc:  p.fk, p.ff = -p.fk, -p.ff 
     199 
    208200    p.ff = p.objFuncMultiple2Single(p.ff) 
    209201    #if not hasattr(p, 'xf'): p.xf = p.xk 
     
    215207    p.stopcase = stopcase(p) 
    216208 
    217  
    218  
    219  
    220  
    221 ##    #for more safety 
    222 ##    p.ff = p.f(p.xf) 
    223  
    224209    if p.invertObjFunc: p.iterfcn(p.xf, -p.ff) 
    225210    else: p.iterfcn(p.xf, p.ff) 
     
    267252    r.evals = p.nEvals 
    268253    r.evals['iter'] = p.iter 
     254 
     255    p.invertObjFunc = False 
    269256 
    270257    if p.iprint < 0: 
     
    293280 
    294281 
     282################################################################## 
     283def my_import(name): 
     284    mod = __import__(name) 
     285    components = name.split('.') 
     286    for comp in components[1:]: 
     287        mod = getattr(mod, comp) 
     288    return mod 
     289 
     290class EmptyClass: pass 
     291class OpenOptResult: pass 
  • trunk/openopt/scikits/openopt/__init__.py

    r787 r1021  
    33 
    44#from info import __doc__, __version__ 
    5  
    65 
    76from oo import LP, NLP, NSP, MILP, QP, NLSP, LSP, GLP, LLSP,  MMP 
     
    1211test = NumpyTest().test 
    1312 
    14      
     13 
  • trunk/openopt/scikits/openopt/solvers/CoinOr/ipopt_oo.py

    r1019 r1021  
    99    __name__ = 'ipopt' 
    1010    __license__ = "CPL" 
    11     #__authors__ = '' 
    12     #__alg__ = "" 
     11    __authors__ = 'Carl Laird (Carnegie Mellon University) and Andreas Wachter' 
     12    __alg__ = "A. Wachter and L. T. Biegler, On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming, Mathematical Programming 106(1), pp. 25-57, 2006 " 
    1313    __homepage__ = 'http://www.coin-or.org/' 
    14     #__info__ = "" 
     14    __info__ = "requires pyipopt made by Eric Xu You" 
    1515    __constraintsThatCannotBeHandled__ = [] # empty list means the solver can handle all constraints 
    1616 
  • trunk/openopt/scikits/openopt/solvers/UkrOpt/ralg_oo.py

    r1004 r1021  
    22from numpy.linalg import norm 
    33from scikits.openopt.Kernel.BaseAlg import * 
     4from scikits.openopt.Kernel.Point import Point 
    45from scikits.openopt.Kernel.setDefaultIterFuncs import SMALL_DELTA_X,  SMALL_DELTA_F,  SMALL_DF,  IS_LINE_SEARCH_FAILED 
    56from UkrOptMisc import getConstrDirection 
     
    1718    hmult = 0.5 
    1819    T = float64 
    19     needRej = lambda self, p, b, g: norm(b.flatten(), 1)  < min(1e-10, 1e-5*p.gradtol) 
     20    needRej = lambda self, p, b, g_dilated, g: norm(g_dilated)  < 1e-10*norm(g) 
    2021    #checkTurnByGradient = True 
    2122 
     
    9899                    ls1 = 0 
    99100 
    100                 f = p.f(x) 
    101                 mr = p.getMaxResidual(x) 
    102  
    103                 if ls == 0: fprev, mrprev,  xprev = p.fk,  p.rk,  p.xk.copy() 
     101                newPoint = p.point(x) 
     102 
     103                if ls == 0: 
     104                    oldPoint = p.point(p.xk, f = p.fk, mr = p.rk) 
    104105 
    105106                #if not self.checkTurnByGradient: 
    106                 if p.__1stBetterThan2nd__(fprev,  f,  mrprev,  mr): 
    107                     if p.noise==0 or p.__1stCertainlyBetterThan2ndTakingIntoAcoountNoise__(fprev,  f,  mrprev,  mr): 
    108                         pass# and go to label "Line Search Finished" 
    109                     else: continue 
    110                 else: 
    111                     if fprev ==  f and   mrprev ==  mr: pass # and go to label "Line Search Finished" 
    112                     elif ls>10: 
    113                         if fprev >=  f  and max(mrprev, p.contol) >=  mr:continue 
     107                if newPoint.betterThan(oldPoint): 
     108                    #TODO: handle possible noise here 
     109                    if ls>10: 
     110                        if oldPoint.f() >=  newPoint.f()  and max(oldPoint.mr(), p.contol) >=  newPoint.mr(): 
     111                            oldPoint, newPoint = newPoint,  None 
     112                            continue 
    114113                        else: 
    115114                            doDilation = False 
    116115                            # and go to label "Line Search Finished" 
    117116                    else: 
    118                         fprev, mrprev,  xprev = f,  mr,  x.copy() 
     117                        oldPoint, newPoint = newPoint,  None 
    119118                        continue 
    120119 
    121120                #Label "Line Search Finished" 
    122                 g2 = self.__getRalgDirection__(x, p) 
    123                 fk,  xk,  rk = f,  x.copy(),  mr 
    124121                break 
    125122 
     123            iterPoint = newPoint 
     124            x = iterPoint.x 
     125 
     126            doBackwardSearch = 1 
    126127            if ls == p.maxLineSearch: 
    127128                p.istop,  p.msg = IS_LINE_SEARCH_FAILED,  'maxLineSearch (' + str(p.maxLineSearch) + ') has been exceeded' 
    128129                return 
    129130            elif ls == 0 and doBackwardSearch: 
    130                if p.__1stBetterThan2nd__(p.fk,  f,  p.rk,  rk): 
    131                     x_no_backward = x.copy() 
    132                     f_no_backward = p.f(x_no_backward) 
    133                     mr_no_backward = p.getMaxResidual(x_no_backward) 
     131                if oldPoint.betterThan(newPoint): 
     132                    PrevPoint = iterPoint 
    134133                    while 1: 
    135134                        hs *= self.hmult 
    136  
    137                         x_prev, hs_prev, g2_prev = x.copy(), hs, g2.copy() 
    138                         f_prev = p.f(x_prev) 
    139                         mr_prev = max(p.getMaxResidual(x), p.contol) 
     135                        hs_prev = hs 
    140136 
    141137                        if itn == 0: 
     
    145141                            hs /= self.hmult 
    146142 
    147                         mr_new = p.getMaxResidual(x) 
    148                         f_new = p.f(x) 
    149  
    150 #                        if p.__1stBetterThan2nd__(f_new,  f_prev,  mr_new,  mr_prev): 
    151 #                            bestIterPoint,  bestIterPointF,  bestIterPointDirection,  bestIterPointResidual = x.copy(),  f_new,  g2.copy(),  mr_new 
    152  
    153                         g2 = self.__getRalgDirection__(x, p) 
    154  
    155                         if sum(p.dotmult(g1,g2))>0 or mr_new > mr_prev or f_new > f_prev or \ 
    156                         abs(f_new - f_no_backward) < 15 * p.ftol or p.norm(x - x_no_backward) < 15 * p.xtol: 
    157                             x, hs, g2 = x_prev, hs_prev, g2_prev 
     143                        newPoint = p.point(x) 
     144 
     145                        if newPoint.mr() > PrevPoint.mr() or newPoint.f() > PrevPoint.f() or abs(newPoint.f() - iterPoint.f()) < 15 * p.ftol or p.norm(newPoint.x - iterPoint.x) < 15 * p.xtol: 
     146                            iterPoint, hs = PrevPoint, hs_prev 
    158147                            break 
     148 
     149                        PrevPoint = newPoint 
     150 
    159151                        ls -= 1 
    160                         if itn != 0: break 
    161  
    162                     xk, fk = x.copy(), p.f(x) 
     152                        if itn != 0: 
     153                            break 
     154                    iterPoint = PrevPoint 
     155 
     156            x = iterPoint.x.copy() 
     157            fk,  xk,  rk = iterPoint.f(),  x.copy(),  iterPoint.mr() 
    163158 
    164159            if ls <= 0: hs *= q1 
    165160 
    166161            prevIterPointIsFeasible = p.iterValues.r[-1] <= p.contol # p.iterValues.r is max residual defined in ooIter.py 
    167             currIterPointIsFeasible = p.getMaxResidual(x) <= p.contol 
    168  
     162            currIterPointIsFeasible = p.isFeas(x) 
     163 
     164            g2 = self.__getRalgDirection__(x, p) 
    169165            if prevIterPointIsFeasible == currIterPointIsFeasible == True: 
    170166                g1 = g2 - g 
     
    197193            p._df = g2.copy() 
    198194 
    199             if not self.needRej(p, b, g): 
     195            if not self.needRej(p, b, g1, g): 
    200196                if all(isfinite(g)) and ng > 1e-50 and doDilation: 
    201197                    g = (g / ng).reshape((-1,1)) 
     
    209205                #hs = max(p.norm(xPrevIter - x), hsmin) 
    210206 
     207            #xk, fk, rk = iterPoint.x, iterPoint.f(), iterPoint.mr() 
    211208            p.iterfcn(xk,  fk) 
    212209 
     
    233230 
    234231            if p.istop: 
    235 #                p.xf = bestIterPoint 
    236 #                p.ff = bestIterPointF 
    237                 #p.advanced.ralg.hs = max(norm(xPrevIter - x), hsmin) 
    238                 #p._df = _df 
    239232                return 
    240 #            x = bestIterPoint.copy() 
    241 #            g = bestIterPointDirection.copy() 
    242 #            if p.norm(x-bestIterPoint) < p.norm(bestIterPoint-xPrevIter): 
    243 #                x = bestIterPoint.copy() 
    244 #                ####g = bestIterPointDirection.copy() 
    245 #                #g,  fname,  ind = self.__getRalgDirection__(x,  p) 
    246 #            else: 
    247 #                x = (x+xPrevIter) / 2.0 
    248                 #g,  fname,  ind = self.__getRalgDirection__(x,  p) 
    249 #            if dot(g2,  bestIterPointDirection) > 0: 
    250 #                g = bestIterPointDirection.copy() 
    251 #            else: 
    252 #                g = g2.copy() 
     233 
    253234            g = g2.copy() 
    254235            xPrevIter = x.copy()