Changeset 439

Show
Ignore:
Timestamp:
02/21/10 18:52:04 (2 weeks ago)
Author:
dmitrey
Message:

some changes for ralg

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • PythonPackages/OpenOpt/openopt/solvers/UkrOpt/ralg_oo.py

    r418 r439  
    124 124         prevIter_best_ls_point = bestPoint 
    125 125         previter_pointForDilation = bestPoint 
      126         prevIter_bestPointBeforeTurn = bestPoint 
    126 127  
    127 128         g = bestPoint.__getDirection__(self.approach) 
     
    145 146 #        else: b = B_constr 
    146 147  
      148 #        if p.debug and hasattr(p, 'x_opt'): 
      149 #            import scipy 
      150 #            exactDirection = x0-p.x_opt 
      151 #            asdf_0 = exactDirection * (0.2+scipy.rand(n)) 
      152 #            #asdf = asdf_0.copy() 
      153  
    147 154         """                           Ralg main cycle                                    """ 
    148 155  
     
    155 162             g1 = p.matmult(b, g_tmp) 
    156 163  
      164 #            if p.debug and hasattr(p, 'x_opt'): 
      165 #                cos_phi_0 = p.matmult(moveDirection,  prevIter_best_ls_point.x - p.x_opt)/p.norm(moveDirection)/p.norm(prevIter_best_ls_point.x - p.x_opt) 
      166 #                cos_phi_1 = p.matmult(g1,  prevIter_best_ls_point.x - p.x_opt)/p.norm(g1)/p.norm(prevIter_best_ls_point.x - p.x_opt) 
      167 #                print('beforeDilation: %f  afterDilation: %f' % (cos_phi_0, cos_phi_1) ) 
      168 #                asdf = asdf_0.copy() 
      169 #                g_tmp = economyMult(b.T, asdf) 
      170 #                 
      171 #                #g_tmp = p.matmult(b.T, asdf) 
      172 #                 
      173 #                if any(g_tmp): g_tmp /= p.norm(g_tmp) 
      174 #                asdf = p.matmult(b, g_tmp) 
      175 #                cos_phi = dot(asdf, exactDirection) / p.norm(asdf) / p.norm(exactDirection) 
      176 #                p.debugmsg('cos_phi:%f' % cos_phi) 
      177 #                assert cos_phi >0 
      178  
    157 179  
    158 180             """                           Forward line search                          """ 
    159 181  
    160 182             #x = prevIterPoint.x.copy() 
      183             bestPointBeforeTurn = prevIter_best_ls_point 
    161 184             x = prevIter_best_ls_point.x.copy() 
    162 185              
     
    192 215                     oldPoint, newPoint = newPoint,  None 
    193 216                 else: 
      217                     if not oldPoint.isFeas(): bestPointBeforeTurn = oldPoint 
    194 218                     if not itn % 4:  
    195 219                         for fn in ['_lin_ineq', '_lin_eq']: 
     
    238 262              
    239 263             best_ls_point = PointForDilation 
    240                
      264             if hasattr(p, '_df'): delattr(p, '_df') 
      265             if best_ls_point.isFeas(altLinInEq=False) and hasattr(best_ls_point, '_df'):  
      266                 p._df = best_ls_point.df().copy()             
    241 267  
    242 268             directionForDilation = PointForDilation.__getDirection__(self.approach)  
     
    276 302             prevIterPointIsFeasible = previter_pointForDilation.isFeas(altLinInEq=True) 
    277 303             currIterPointIsFeasible = PointForDilation.isFeas(altLinInEq=True) 
      304  
      305                      
      306             # CHANGES 
      307             #use_dilated = True 
      308             if prevIterPointIsFeasible and not currIterPointIsFeasible: 
      309                 #doDilation = False 
      310                 alp_addition -= 0.5 
      311             elif currIterPointIsFeasible and not prevIterPointIsFeasible: 
      312                 alp_addition += 0.5 
      313                 #alp_addition += 1.0 
      314                 #use_dilated = False 
      315             # CHANGES END 
      316              
    278 317             r_p, ind_p, fname_p = prevIter_best_ls_point.mr(1) 
    279 318             r_, ind_, fname_ = PointForDilation.mr(1) 
     
    324 363             else: 
    325 364                 g1 = G.copy() 
      365                  
    326 366                 #g1 = -G.copy() # signum doesn't matter here 
    327 367  
     
    360 400             # DEBUG END 
    361 401  
    362               g = economyMult(b.T, g1) 
      402  
      403             # DEBUG! 
      404 #            if hasattr(p, 'x_opt'): 
      405 #                dx = PointForDilation.x - p.x_opt 
      406 #                rr = p.matmult(dx, moveDirection) / p.norm(moveDirection) / p.norm(dx) 
      407 #                print('cos_phi_delta:%f'%rr) 
      408             # DEBUG END 
      409  
      410  
      411              
    363 412              
    364 413              
    365 414             # CHANGES 
      415 #            g = economyMult(b.T, g1) 
    366 416 #            gn = g/norm(g) 
    367 417 #            if len(directionVectorsList) == 0 or n < 3 or norm(g1) < 1e-20: pass 
     
    395 445             # CHANGES END 
    396 446  
    397                
    398                
    399               ng = p.norm(g) 
    400               if hasattr(p, '_df'): delattr(p, '_df') 
    401               if best_ls_point.isFeas(altLinInEq=True) and hasattr(best_ls_point, '_df'):  
    402                   p._df = best_ls_point.df().copy() 
    403                    
    404               #if p.iter>500: p.debugmsg(str(g2)) 
    405    
    406               if self.needRej(p, b, g1, g): 
    407                   if self.showRej or p.debug: 
    408                       p.info('debug msg: matrix B restoration in ralg solver') 
    409                   b = B0.copy() 
    410                   hs = 0.5*p.norm(prevIter_best_ls_point.x - best_ls_point.x) 
    411                   # TODO: iterPoint = projection(iterPoint,Aeq) if res_Aeq > 0.75*contol 
    412                    
    413               #p.debugmsg('ng:%e  ng1:%e' % (ng, p.norm(g1))) 
    414               if ng < 1e-40:  
    415                   #raise 0 
    416                   hs *= 0.9 
    417                   p.debugmsg('small dilation direction norm (%e), skipping' % ng) 
    418               #p.debugmsg('dilation direction norm:%e' % ng) 
    419               if all(isfinite(g)) and ng > 1e-50 and doDilation: 
    420                   g = (g / ng).reshape(-1,1) 
    421                   vec1 = economyMult(b, g).reshape(-1,1)# TODO: remove economyMult, use dot? 
    422                   #if alp_addition != 0: p.debugmsg('alp_addition:' + str(alp_addition)) 
    423                   w = T(1.0/(alp+alp_addition)-1.0)  
    424                   vec2 = w * g.T 
    425                   b += p.matmult(vec1, vec2) 
      447             #doDilation = 1 
      448             if doDilation: 
      449 #                if use_dilated: 
      450                 g = economyMult(b.T, g1) 
      451                 ng = p.norm(g) 
      452                 #if p.iter>500: p.debugmsg(str(g2)) 
      453  
      454                 if self.needRej(p, b, g1, g): 
      455                     if self.showRej or p.debug: 
      456                         p.info('debug msg: matrix B restoration in ralg solver') 
      457                     b = B0.copy() 
      458                     hs = 0.5*p.norm(prevIter_best_ls_point.x - best_ls_point.x) 
      459                     # TODO: iterPoint = projection(iterPoint,Aeq) if res_Aeq > 0.75*contol 
      460 #                else: 
      461 #                    g = g1 
      462 #                    ng = p.norm(g) 
      463  
      464  
      465                 #p.debugmsg('ng:%e  ng1:%e' % (ng, p.norm(g1))) 
      466                 if ng < 1e-40:  
      467                     #raise 0 
      468                     hs *= 0.9 
      469                     p.debugmsg('small dilation direction norm (%e), skipping' % ng) 
      470                 #p.debugmsg('dilation direction norm:%e' % ng) 
      471                 if all(isfinite(g)) and ng > 1e-50 and doDilation: 
      472                     g = (g / ng).reshape(-1,1) 
      473                     vec1 = economyMult(b, g).reshape(-1,1)# TODO: remove economyMult, use dot? 
      474                     #if alp_addition != 0: p.debugmsg('alp_addition:' + str(alp_addition)) 
      475                     w = T(1.0/(alp+alp_addition)-1.0)  
      476                     vec2 = w * g.T 
      477                     b += p.matmult(vec1, vec2) 
    426 478              
    427 479  
     
    497 549             previter_pointForDilation = best_ls_point 
    498 550             prevDirectionForDilation = best_ls_point.__getDirection__(self.approach) 
      551             prevIter_bestPointBeforeTurn = bestPointBeforeTurn 
    499 552  
    500 553