Ignore:
Timestamp:
10/12/11 18:30:10 (3 years ago)
Author:
gabeh
Message:

Small efficiency updates to piecewise.py

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.pyomo/trunk/coopr/pyomo/base/piecewise.py

    r4744 r5086  
    7070    else: 
    7171        return ( (x & (x - 1)) == 0 ) 
     72 
    7273def isIncreasing(l): 
    7374    """ 
     
    154155            return None 
    155156 
    156 class _GrayCode(object): 
    157     """ 
    158     Generates an nbit graycode which is requred for LOG branching scheme 
    159     """ 
    160  
    161     def __init__(self, nbits): 
    162         self._nbits = nbits 
    163         self._grayCode = [] 
    164         self.__generate() 
    165  
    166     def __getitem__(self, i): 
    167         return self._grayCode[i] 
    168  
    169     def __str__(self): 
    170         return str(self._grayCode) 
    171  
    172     __repr__ = __str__ 
    173  
    174     def __iter__(self):             
    175         return self._grayCode.__iter__() 
    176      
    177     def __isOdd(self,integer): 
    178         return integer % 2 == 1 
    179      
    180     def __isEven(self,integer): 
    181         return integer % 2 == 0 
    182      
    183     def __list_to_string(self,li): 
    184         return ''.join(map(str, li)) 
    185  
    186     def __generate(self): 
    187         li = [0 for i in xrange(self._nbits)] 
    188         self._grayCode.append(self.__list_to_string(li)) 
    189  
    190         for term in xrange(2, (1<<self._nbits)+1): 
    191             if self.__isOdd(term):                 
    192                 for i in xrange(-1,-(self._nbits),-1): 
    193                     if li[i]==1:                         
    194                         li[i-1]=li[i-1]^1                         
    195                         break 
    196                      
    197             if self.__isEven(term): 
    198                 li[-1]=li[-1]^1 
    199  
    200             self._grayCode.append(self.__list_to_string(li)) 
     157def _GrayCode(nbits): 
     158 
     159    bitset = [0 for i in xrange(nbits)] 
     160    graycode = [''.join(map(str,bitset))] 
     161 
     162    for i in xrange(2,(1<<nbits)+1): 
     163        if i%2: 
     164            for j in xrange(-1,-nbits,-1): 
     165                if bitset[j]: 
     166                    bitset[j-1]=bitset[j-1]^1 
     167                    break 
     168        else: 
     169            bitset[-1]=bitset[-1]^1 
     170 
     171        graycode.append(''.join(map(str,bitset))) 
     172 
     173    return graycode 
     174 
    201175 
    202176def _DLog_Branching_Scheme(L): 
     
    207181    MAX = 2**L 
    208182    mylists1 = {} 
    209     for i in range(1,L+1): 
     183    for i in xrange(1,L+1): 
    210184        mylists1[i] = [] 
    211185        start = 1 
    212186        step = MAX/(2**i) 
    213187        while(start < MAX): 
    214             mylists1[i].extend([j for j in range(start,start+step)]) 
     188            mylists1[i].extend([j for j in xrange(start,start+step)]) 
    215189            start += 2*step 
    216190         
    217     biglist = [i for i in range(1,MAX+1)] 
     191    biglist = [i for i in xrange(1,MAX+1)] 
    218192    mylists2 = {} 
    219193    for i in sorted(mylists1.keys()): 
     
    232206 
    233207    BIGL = 2**n 
    234     S = [j for j in range(1,n+1)] 
    235     code = list(_GrayCode(n)) 
    236     G = {} 
    237     for i in range(1,len(code)+1): 
    238         G[i] = [] 
    239         for j in range(len(code[i-1])): 
    240             G[i].extend([int(code[i-1][j])]) 
    241      
     208    S = [j for j in xrange(1,n+1)]     
     209    code = _GrayCode(n) 
     210    G = dict((i, [int(j) for j in code[i-1]]) for i in xrange(1,len(code)+1)) 
     211 
    242212    L = {} 
    243213    R = {} 
     
    257227    # determines convexity or concavity 
    258228    # return 1 (convex), -1 (concave), 0 (neither) 
    259  
    260     SLOPE = [] 
    261     for i in xrange(1,len(points)): 
    262         SLOPE.append( (f(model,points[i])-f(model,points[i-1]))/(points[i]-points[i-1]) ) 
    263      
    264     if isNonDecreasing(SLOPE): 
     229     
     230    SLOPES = [(f(model,points[i])-f(model,points[i-1]))/(points[i]-points[i-1]) for i in xrange(1,len(points))] 
     231     
     232    if isNonDecreasing(SLOPES): 
    265233        # convex 
    266234        return 1 
    267     elif isNonIncreasing(SLOPE): 
     235    elif isNonIncreasing(SLOPES): 
    268236        # concave 
    269237        return -1 
     
    478446        elif len(args) == 1: 
    479447            return getattr(model,name)[args[0]] 
    480         else: 
    481             return getattr(model,name) 
     448        return getattr(model,name) 
    482449         
    483450    def _getset(self,model,name,*targs): 
     
    487454        elif len(args) == 1: 
    488455            return getattr(model,name)[args[0]] 
    489         else: 
    490             return getattr(model,name) 
     456        return getattr(model,name) 
    491457         
    492458    def pprint(self, *args, **kwds): 
     
    792758        def linear_estimators_LINEAR_indices_init(model): 
    793759            if self._element_mode: 
    794                 return [i for i in xrange(len(self._grad_pts()))] 
    795             else: 
    796                 return [t+(i,) for t in INDEX_SET_TANGENT.tuplize() \ 
    797                               for i in xrange(len(self._grad_pts(t)))] 
     760                return (i for i in xrange(len(self._grad_pts()))) 
     761            else: 
     762                return (t+(i,) for t in INDEX_SET_TANGENT.tuplize() \ 
     763                              for i in xrange(len(self._grad_pts(t)))) 
    798764        tangent_indices = self._update_dicts('tangent_indices',Set(dimen=self._index_dimen+1, ordered=True, rule=linear_estimators_LINEAR_indices_init)) 
    799765 
     
    826792        def simple_bounds_indices_init(model): 
    827793            if self._element_mode: 
    828                 return [i for i in xrange(len(self._pw_pts())-1)] 
    829             else: 
    830                 return [t+(i,) for t in INDEX_SET_SIMPLE_BOUNDS.tuplize() \ 
    831                               for i in xrange(len(self._pw_pts(t))-1)] 
     794                return (i for i in xrange(len(self._pw_pts())-1)) 
     795            else: 
     796                return (t+(i,) for t in INDEX_SET_SIMPLE_BOUNDS.tuplize() \ 
     797                              for i in xrange(len(self._pw_pts(t))-1)) 
    832798        simple_bounds_indices = self._update_dicts('simplified_bounds_indices',Set(dimen=self._index_dimen+1,ordered=True, rule=simple_bounds_indices_init)) 
    833799         
     
    847813        def SOS_indices_init(*t): 
    848814            if self._element_mode: 
    849                 return [i for i in xrange(len(self._pw_pts(t)))] 
     815                return (i for i in xrange(len(self._pw_pts(t)))) 
    850816            else: 
    851817                if type(t[0]) is tuple: 
    852                     return [t[0]+(i,) for i in xrange(len(self._pw_pts(t)))] 
     818                    return (t[0]+(i,) for i in xrange(len(self._pw_pts(t)))) 
    853819                else: 
    854                     return [(t[0],i) for i in xrange(len(self._pw_pts(t)))] 
     820                    return ((t[0],i) for i in xrange(len(self._pw_pts(t)))) 
    855821        def y_indices_init(model): 
    856822            if self._element_mode: 
    857                 return [i for i in xrange(len(self._pw_pts()))] 
    858             else: 
    859                 return [t+(i,) for t in INDEX_SET_SOS2.tuplize() for i in xrange(len(self._pw_pts(t)))] 
     823                return (i for i in xrange(len(self._pw_pts()))) 
     824            else: 
     825                return (t+(i,) for t in INDEX_SET_SOS2.tuplize() for i in xrange(len(self._pw_pts(t)))) 
    860826 
    861827        SOS_indices = '' 
     
    1003969        def DCC_POLYTOPES_init(model): 
    1004970            if self._element_mode: 
    1005                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1006  
    1007             else: 
    1008                 return [t+(i,) for t in DCC_SET.tuplize() \ 
    1009                               for i in xrange(1,len(self._pw_pts(t)))] 
     971                return (i for i in xrange(1,len(self._pw_pts()))) 
     972 
     973            else: 
     974                return (t+(i,) for t in DCC_SET.tuplize() \ 
     975                              for i in xrange(1,len(self._pw_pts(t)))) 
    1010976        def DCC_poly_init(*t): 
    1011             return [i for i in xrange(1,len(self._pw_pts(t)))] 
     977            return (i for i in xrange(1,len(self._pw_pts(t)))) 
    1012978        def DCC_VERTICES_init(model): 
    1013979            if self._element_mode: 
    1014                 return [i for i in xrange(1,len(self._pw_pts())+1)] 
    1015             else: 
    1016                 return [t+(i,) for t in DCC_SET.tuplize() \ 
    1017                               for i in xrange(1,len(self._pw_pts(t))+1)] 
     980                return (i for i in xrange(1,len(self._pw_pts())+1)) 
     981            else: 
     982                return (t+(i,) for t in DCC_SET.tuplize() \ 
     983                              for i in xrange(1,len(self._pw_pts(t))+1)) 
    1018984        def DCC_vert_init(args): 
    1019985            try: 
     
    1022988            except: 
    1023989                p = args 
    1024             return [i for i in xrange(p,p+2)] 
     990            return (i for i in xrange(p,p+2)) 
    1025991        def DCC_lamba_set_init(model): 
    1026992            if self._element_mode is True: 
    1027                 return [(p,v) for p in xrange(1,len(self._pw_pts())) \ 
    1028                                 for v in xrange(1,len(self._pw_pts())+1)] 
     993                return ((p,v) for p in xrange(1,len(self._pw_pts())) \ 
     994                                for v in xrange(1,len(self._pw_pts())+1)) 
    1029995            else: 
    1030996                # BOTTLENECK: speed/memory, this set can be extremely large and time consuming to 
    1031997                #             build when number of indices and breakpoints is large. 
    1032                 return [t+(p,v) for t in DCC_SET.tuplize() \ 
     998                return (t+(p,v) for t in DCC_SET.tuplize() \ 
    1033999                                for p in xrange(1,len(self._pw_pts(t))) \ 
    1034                                 for v in xrange(1,len(self._pw_pts(t))+1)] 
     1000                                for v in xrange(1,len(self._pw_pts(t))+1)) 
    10351001         
    10361002        DCC_POLYTOPES = self._update_dicts('DCC_POLYTOPES',Set(ordered=True,dimen=self._index_dimen+1,initialize=DCC_POLYTOPES_init)) 
     
    11001066        def DLOG_POLYTOPES_init(model): 
    11011067            if self._element_mode: 
    1102                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1103  
    1104             else: 
    1105                 return [t+(i,) for t in DLOG_SET.tuplize() \ 
    1106                               for i in xrange(1,len(self._pw_pts(t)))] 
     1068                return (i for i in xrange(1,len(self._pw_pts()))) 
     1069 
     1070            else: 
     1071                return (t+(i,) for t in DLOG_SET.tuplize() \ 
     1072                              for i in xrange(1,len(self._pw_pts(t)))) 
    11071073        def DLOG_LENGTH_POLY_init(model): 
    11081074            if self._element_mode: 
    1109                 return [i for i in xrange(1,L_i+1)] 
    1110             else: 
    1111                 return [t+(i,) for t in DLOG_SET.tuplize() \ 
    1112                               for i in xrange(1,L[t]+1)] 
     1075                return (i for i in xrange(1,L_i+1)) 
     1076            else: 
     1077                return (t+(i,) for t in DLOG_SET.tuplize() \ 
     1078                              for i in xrange(1,L[t]+1)) 
    11131079        def DLOG_poly_init(*t): 
    1114             return [i for i in xrange(1,len(self._pw_pts(t)))] 
     1080            return (i for i in xrange(1,len(self._pw_pts(t)))) 
    11151081        def DLOG_poly_one_init(args): 
    11161082            if self._element_mode: 
     
    11311097        def DLOG_VERTICES_init(model): 
    11321098            if self._element_mode: 
    1133                 return [i for i in xrange(1,len(self._pw_pts())+1)] 
    1134             else: 
    1135                 return [t+(i,) for t in DLOG_SET.tuplize() \ 
    1136                               for i in xrange(1,len(self._pw_pts(t))+1)] 
     1099                return (i for i in xrange(1,len(self._pw_pts())+1)) 
     1100            else: 
     1101                return (t+(i,) for t in DLOG_SET.tuplize() \ 
     1102                              for i in xrange(1,len(self._pw_pts(t))+1)) 
    11371103        def DLOG_vert_init(args): 
    11381104            try: 
     
    11411107            except: 
    11421108                p = args 
    1143             return [i for i in xrange(p,p+2)] 
     1109            return (i for i in xrange(p,p+2)) 
    11441110        def DLOG_lamba_set_init(model): 
    11451111            if self._element_mode: 
    1146                 return [(p,v) for p in xrange(1,len(self._pw_pts())) \ 
    1147                               for v in xrange(1,len(self._pw_pts())+1)] 
     1112                return ((p,v) for p in xrange(1,len(self._pw_pts())) \ 
     1113                              for v in xrange(1,len(self._pw_pts())+1)) 
    11481114            else: 
    11491115                # BOTTLENECK: speed/memory, this set can be extremely large and time consuming to 
    11501116                #             build when number of indices and breakpoints is large. 
    1151                 return [t+(p,v) for t in DLOG_SET.tuplize() \ 
     1117                return (t+(p,v) for t in DLOG_SET.tuplize() \ 
    11521118                                for p in xrange(1,len(self._pw_pts(t))) \ 
    1153                                 for v in xrange(1,len(self._pw_pts(t))+1)] 
     1119                                for v in xrange(1,len(self._pw_pts(t))+1)) 
    11541120         
    11551121        DLOG_POLYTOPES = self._update_dicts('DLOG_POLYTOPES',Set(ordered=True,dimen=self._index_dimen+1,initialize=DLOG_POLYTOPES_init)) 
     
    12101176        def CC_POLYTOPES_init(model): 
    12111177            if self._element_mode: 
    1212                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1213             else: 
    1214                 return [t+(i,) for t in CC_SET.tuplize() \ 
    1215                               for i in xrange(1,len(self._pw_pts(t)))] 
     1178                return (i for i in xrange(1,len(self._pw_pts()))) 
     1179            else: 
     1180                return (t+(i,) for t in CC_SET.tuplize() \ 
     1181                              for i in xrange(1,len(self._pw_pts(t)))) 
    12161182        def CC_poly_init(args): 
    12171183            if self._element_mode: 
     
    12341200        def CC_VERTICES_init(model): 
    12351201            if self._element_mode: 
    1236                 return [i for i in xrange(1,len(self._pw_pts())+1)] 
    1237             else: 
    1238                 return [t+(i,) for t in CC_SET.tuplize() \ 
    1239                               for i in xrange(1,len(self._pw_pts(t))+1)] 
     1202                return (i for i in xrange(1,len(self._pw_pts())+1)) 
     1203            else: 
     1204                return (t+(i,) for t in CC_SET.tuplize() \ 
     1205                              for i in xrange(1,len(self._pw_pts(t))+1)) 
    12401206        def CC_vert_init(*t): 
    1241             return [i for i in xrange(1,len(self._pw_pts(t))+1)] 
     1207            return (i for i in xrange(1,len(self._pw_pts(t))+1)) 
    12421208        def CC_lamba_set_init(model): 
    12431209            if self._element_mode: 
    1244                 return [v for v in xrange(1,len(self._pw_pts())+1)] 
    1245             else: 
    1246                 return [t+(v,) for t in CC_SET.tuplize() \ 
    1247                               for v in xrange(1,len(self._pw_pts(t))+1)] 
     1210                return (v for v in xrange(1,len(self._pw_pts())+1)) 
     1211            else: 
     1212                return (t+(v,) for t in CC_SET.tuplize() \ 
     1213                              for v in xrange(1,len(self._pw_pts(t))+1)) 
    12481214         
    12491215        CC_VERTICES = self._update_dicts('CC_VERTICES',Set(ordered=True,dimen=self._index_dimen+1,initialize=CC_VERTICES_init)) 
     
    13171283        def LOG_POLYTOPES_init(model): 
    13181284            if self._element_mode: 
    1319                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1320             else: 
    1321                 return [t+(i,) for t in LOG_SET.tuplize() \ 
    1322                               for i in xrange(1,len(self._pw_pts(t)))] 
     1285                return (i for i in xrange(1,len(self._pw_pts()))) 
     1286            else: 
     1287                return (t+(i,) for t in LOG_SET.tuplize() \ 
     1288                              for i in xrange(1,len(self._pw_pts(t)))) 
    13231289        def LOG_poly_init(args): 
    13241290            if self._element_mode: 
     
    13421308        def LOG_VERTICES_init(model): 
    13431309            if self._element_mode: 
    1344                 return [i for i in xrange(1,len(self._pw_pts())+1)] 
    1345             else: 
    1346                 return [t+(i,) for t in LOG_SET.tuplize() \ 
    1347                               for i in xrange(1,len(self._pw_pts(t))+1)] 
     1310                return (i for i in xrange(1,len(self._pw_pts())+1)) 
     1311            else: 
     1312                return (t+(i,) for t in LOG_SET.tuplize() \ 
     1313                              for i in xrange(1,len(self._pw_pts(t))+1)) 
    13481314        def LOG_vert_init(*t): 
    1349             return [i for i in xrange(1,len(self._pw_pts(t))+1)] 
     1315            return (i for i in xrange(1,len(self._pw_pts(t))+1)) 
    13501316        def LOG_lamba_set_init(model): 
    13511317            if self._element_mode: 
    1352                 return [v for v in xrange(1,len(self._pw_pts())+1)] 
    1353             else: 
    1354                 return [t+(v,) for t in LOG_SET.tuplize() \ 
    1355                               for v in xrange(1,len(self._pw_pts(t))+1)] 
     1318                return (v for v in xrange(1,len(self._pw_pts())+1)) 
     1319            else: 
     1320                return (t+(v,) for t in LOG_SET.tuplize() \ 
     1321                              for v in xrange(1,len(self._pw_pts(t))+1)) 
    13561322        def LOG_BRANCHING_SCHEME_init(model): 
    13571323            if self._element_mode: 
    1358                 return [s for s in Si] 
    1359             else: 
    1360                 return [t+(s,) for t in LOG_SET.tuplize() \ 
    1361                               for s in S[t]] 
     1324                return (s for s in Si) 
     1325            else: 
     1326                return (t+(s,) for t in LOG_SET.tuplize() \ 
     1327                              for s in S[t]) 
    13621328        def LOG_BRANCHING_LEFT_init(args): 
    13631329            if self._element_mode: 
     
    14491415        def MC_POLYTOPES_init(model): 
    14501416            if self._element_mode: 
    1451                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1452             else: 
    1453                 return [t+(i,) for t in MC_SET.tuplize() \ 
    1454                               for i in xrange(1,len(self._pw_pts(t)))] 
     1417                return (i for i in xrange(1,len(self._pw_pts()))) 
     1418            else: 
     1419                return (t+(i,) for t in MC_SET.tuplize() \ 
     1420                              for i in xrange(1,len(self._pw_pts(t)))) 
    14551421        def MC_poly_init(*t): 
    1456             return [i for i in xrange(1,len(self._pw_pts(t)))] 
     1422            return (i for i in xrange(1,len(self._pw_pts(t)))) 
    14571423         
    14581424        MC_POLYTOPES = self._update_dicts('MC_POLYTOPES',Set(ordered=True,dimen=self._index_dimen+1,initialize=MC_POLYTOPES_init)) 
     
    15121478        def INC_POLYTOPES_init(model): 
    15131479            if self._element_mode: 
    1514                 return [i for i in xrange(1,len(self._pw_pts()))] 
    1515             else: 
    1516                 return [t+(i,) for t in INC_SET.tuplize() \ 
    1517                               for i in xrange(1,len(self._pw_pts(t)))] 
     1480                return (i for i in xrange(1,len(self._pw_pts()))) 
     1481            else: 
     1482                return (t+(i,) for t in INC_SET.tuplize() \ 
     1483                              for i in xrange(1,len(self._pw_pts(t)))) 
    15181484        def INC_poly_init(*t): 
    1519             return [i for i in xrange(1,len(self._pw_pts(t)))] 
     1485            return (i for i in xrange(1,len(self._pw_pts(t)))) 
    15201486        def INC_VERTICES_init(model): 
    15211487            if self._element_mode: 
    1522                 return [i for i in xrange(1,len(self._pw_pts())+1)] 
    1523             else: 
    1524                 return [t+(i,) for t in INC_SET.tuplize() \ 
    1525                               for i in xrange(1,len(self._pw_pts(t))+1)] 
     1488                return (i for i in xrange(1,len(self._pw_pts())+1)) 
     1489            else: 
     1490                return (t+(i,) for t in INC_SET.tuplize() \ 
     1491                              for i in xrange(1,len(self._pw_pts(t))+1)) 
    15261492        def INC_Y_init(model): 
    15271493            if self._element_mode: 
    1528                 return [i for i in xrange(1,len(self._pw_pts())-1)] 
    1529             else: 
    1530                 return [t+(i,) for t in INC_SET.tuplize() \ 
    1531                               for i in xrange(1,len(self._pw_pts(t))-1)] 
     1494                return (i for i in xrange(1,len(self._pw_pts())-1)) 
     1495            else: 
     1496                return (t+(i,) for t in INC_SET.tuplize() \ 
     1497                              for i in xrange(1,len(self._pw_pts(t))-1)) 
    15321498         
    15331499        INC_POLYTOPES = self._update_dicts('INC_POLYTOPES',Set(ordered=True,dimen=self._index_dimen+1,initialize=INC_POLYTOPES_init)) 
Note: See TracChangeset for help on using the changeset viewer.