Changeset 2369


Ignore:
Timestamp:
Feb 17, 2010 8:11:43 PM (10 years ago)
Author:
wehart
Message:

Adding functionality for ordered sets.

Location:
coopr.pyomo/trunk
Files:
3 edited

Legend:

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

    r2359 r2369  
    1818import types
    1919import copy
     20import bidict
    2021
    2122log = pyutilib.component.core.PluginGlobals.env().log
     
    7071        self.ordered=False
    7172        self.order=[]
     73        self.order_dict = bidict.bidict()
    7274        self.domain=None
    7375        self.dimen = None
     
    235237              # Using a rule of the form f(z,model) -> element
    236238              #
    237               ctr=0
     239              ctr=1
    238240              val = self.initialize(ctr,self.model)
    239241              if self.dimen is None:
     
    288290           raise TypeError, "Cannot clear virtual Set object `"+self.name+"'"
    289291        self.value.clear()
    290         self.order=[]
     292        self.order_dict=bidict.bidict()
    291293
    292294    def check_values(self):
     
    297299        for val in self.value:
    298300          self._verify(val)
    299 
    300     def first(self):
    301         if self.virtual:
    302            raise TypeError, "Cannot access the first element of virtual set `"+self.name+"'"
    303         if len(self.order) > 0:
    304            return self.order[0]
    305         else:
    306            for val in self.value:
    307              return val
    308301
    309302    def add(self, *args):
     
    319312            self.value.add(tmp)
    320313            if self.ordered:
     314               if tmp in self.order_dict:
     315                    raise ValueError, "Element "+str(tmp)+" already exists in ordered set "+self.name
    321316               self.order.append(tmp)
     317               self.order_dict[tmp:] = len(self.order)
     318               
     319
    322320          except TypeError:
    323321            raise TypeError, "Problem inserting "+str(tmp)+" into set "+self.name
     
    328326        """
    329327        if self.virtual:
    330            raise KeyError, "Cannot remove element `"+str(element)+"' from virtual set "+str(self.name)
     328            raise KeyError, "Cannot remove element `"+str(element)+"' from virtual set "+str(self.name)
    331329        if element not in self.value:
    332            raise KeyError, "Cannot remove element `"+str(element)+"' from set "+str(self.name)
     330            raise KeyError, "Cannot remove element `"+str(element)+"' from set "+str(self.name)
    333331        self.value.remove(element)
    334332        if self.ordered:
    335            self.order.remove(element)
     333            id = self.order_dict[element]-1
     334            for i in xrange(id+1,len(self.order)):
     335                self.order_dict[self.order[i]] = i-1
     336            del self.order[id]
    336337
    337338    def discard(self, element):
     
    344345           self.order.remove(element)
    345346        self.value.discard(element)
     347
     348    def first(self):
     349        if self.virtual:
     350            raise TypeError, "Cannot access the first element of virtual set `"+self.name+"'"
     351        return self.member(1)
     352
     353    def last(self):
     354        if self.virtual:
     355            raise TypeError, "Cannot access the last element of virtual set `"+self.name+"'"
     356        return self.member(-1)
     357
     358    def __getitem__(self, key):
     359        return self.member(key)
     360
     361    def member(self, key):
     362        if self.ordered:
     363            return self.order_dict.inv[key]
     364        #
     365        # If the set is not ordered, then we use the intrinsic ordering imposed by the set.
     366        # We convert the set to a list and return the specified value.
     367        #
     368        if key >= 1:
     369            return list(self.value)[key-1]
     370        elif key < 0:
     371            return list(self.value)[key]
     372        else:
     373            raise IndexError, "Valid index values for sets are 1 ... len(set) or -1 ... -len(set)"
    346374
    347375    def ord(self, match_element):
     
    350378        """
    351379        if self.ordered is False:
    352            raise AttributeError, "Cannot invoke ord method for an unordered set!"
    353         # linear, but the only way given the current representation/attributes of a set.
    354         i=1
    355         for element in self.order:
    356            if match_element == element:
    357               return i
    358            i=i+1
    359         raise ValueError, "Unknown input element="+str(match_element)+" provided as input to ord() method for set="+str(self.name)
     380           raise AttributeError, "Cannot invoke ord() method for unordered set="+str(self.name)
     381        try:
     382            return self.order[match_element]
     383        except IndexError:
     384            raise IndexError, "Unknown input element="+str(match_element)+" provided as input to ord() method for set="+str(self.name)
     385
     386    def next(self, match_element, k=1):
     387        return self.order[self.order_dict[element]+k]
     388
     389    def nextw(self, match_element, k=1):
     390        ndx = self.order_dict[match_element]+k
     391        total = len(self.order)
     392        if ndx > total:
     393            ndx -= total
     394        if ndx <= 0:
     395            ndx += total
     396        return self.order.inv[ndx]
     397
     398    def prev(self, match_element, k=1):
     399        return self.next(match_element, k=-k)
     400
     401    def prevw(self, match_element, k=1):
     402        return self.nextw(match_element, k=-k)
    360403
    361404    def pprint(self, ostream=None):
     
    383426           else:
    384427              tmp = copy.copy(list(self.value))
    385            tmp.sort()
     428              tmp.sort()
    386429           print >>ostream, "\t  ",tmp
    387 
    388     def __getitem__(self, key):
    389         if not self.ordered:
    390            raise IndexError, "Cannot get an item in unordered set "+self.name
    391         return self.order[key]
    392430
    393431    def __len__(self):
     
    758796             else:
    759797                rule_list=[]
    760                 ctr=0
     798                ctr=1
    761799                args = tuple(tmp+[ctr,self.model])
    762800                val = self.initialize(*args)
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_set.py

    r2359 r2369  
    15251525        OUTPUT.close()
    15261526        def tmp_init(z,model):
    1527             if z==value(model.n) or z == 10:
     1527            if z>value(model.n) or z == 11:
    15281528               return None
    15291529            return z
     
    17371737        OUTPUT.close()
    17381738        def tmp_init(i,z,model):
    1739             if z==value(model.n):
     1739            if z>value(model.n):
    17401740               return None
    17411741            return z
  • coopr.pyomo/trunk/examples/pyomo/tutorials/set.py

    r909 r2369  
    172172#
    173173def U_init(z, model):
    174     if z==5:
     174    if z==6:
    175175       return None
    176     if z==0:
     176    if z==1:
    177177       return 1
    178178    else:
    179        return model.U[z-1]*(z+1)
     179       return model.U[z-1]*z
    180180model.U = Set(ordered=True, initialize=U_init)
    181181#
     
    187187#
    188188def V_init(i, z, model):
    189     if z==5:
     189    if z==6:
    190190       return None
    191191    if i==1:
    192        if z==0:
     192       if z==1:
    193193          return 1
    194194       else:
    195           return (z+1)
    196     return model.V[i-1][z]+z
     195          return z
     196    return model.V[i-1][z]+z-1
    197197model.V = Set(RangeSet(1,4), initialize=V_init, ordered=True)
    198198
Note: See TracChangeset for help on using the changeset viewer.