Changeset 2128


Ignore:
Timestamp:
Jan 4, 2010 1:59:03 AM (11 years ago)
Author:
wehart
Message:

Adding the @set_options decorator, which can be used
to specify options for temporary sets that are defined by
index functions.

Location:
coopr.pyomo/trunk/coopr/pyomo
Files:
4 edited

Legend:

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

    r2046 r2128  
    11
    22from component import Component
    3 from sets import _BaseSet, Set
     3from sets import _BaseSet, Set, set_options
     4
     5def set_options(**kwds):
     6    def decorator(func):
     7        func.set_options = kwds
     8        return func
     9    return decorator
    410
    511
     
    2127                    raise ValueError, "Cannot index a component with a non-set component"
    2228            else:
    23                 self._index=Set(initialize=args[0])
     29                try:
     30                    options = getattr(args[0],'set_options')
     31                    options['initialize'] = args[0]
     32                    self._index=Set(**options)
     33                except:
     34                    self._index=Set(initialize=args[0])
    2435        else:
    2536            tmp = []
     
    3041                    raise ValueError, "Cannot index a component with a non-set component"
    3142                else:
    32                     tmp.append( Set(initialize=arg) )
     43                    try:
     44                        options = getattr(arg,'set_options')
     45                        options['initialize'] = arg
     46                        tmp.append( Set(**options) )
     47                    except:
     48                        tmp.append( Set(initialize=arg) )
    3349            self._index_set=tuple(tmp)
    3450        self._compute_dim()
  • coopr.pyomo/trunk/coopr/pyomo/base/sets.py

    r2025 r2128  
    99#  _________________________________________________________________________
    1010
    11 __all__ = ['Set', '_BaseSet', '_SetContainer', '_SetArray', '_ProductSet']
     11__all__ = ['Set', '_BaseSet', '_SetContainer', '_SetArray', '_ProductSet', 'set_options']
    1212
    1313import pyutilib.plugin.core
     
    2020
    2121log = pyutilib.plugin.core.PluginGlobals.env().log
     22
     23#
     24# Decorator for set initializer functions
     25#
     26def set_options(**kwds):
     27    def decorator(func):
     28        func.set_options = kwds
     29        return func
     30    return decorator
     31
    2232
    2333##------------------------------------------------------------------------
     
    606616                self._index=args[0]
    607617            else:
    608                 self._index=Set(initialize=args[0])
     618                try:
     619                    options = getattr(args[0],'set_options')
     620                    options['initialize'] = args[0]
     621                    self._index=Set(**options)
     622                except:
     623                    self._index=Set(initialize=args[0])
    609624        else:
    610625            self._index=None
     
    614629                    tmp.append(arg)
    615630                else:
    616                     tmp.append( Set(initialize=arg) )
     631                    try:
     632                        options = getattr(arg,'set_options')
     633                        options['initialize'] = arg
     634                        tmp.append( Set(**options) )
     635                    except:
     636                        tmp.append( Set(initialize=arg) )
    617637            self._index_set=tuple(tmp)
    618638        _BaseSet.__init__(self,**kwds)
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_param.py

    r2046 r2128  
    376376        self.failUnlessEqual(self.instance.B[2,False],-4)
    377377
     378    def test_index2(self):
     379        self.model.A = Set(initialize=range(0,4))
     380        @set_options(dimen=3)
     381        def B_index(model):
     382            return [(i,2*i,i*i) for i in model.A if i%2 == 0]
     383        def B_init(i,ii,iii,j,model):
     384            if j:
     385                return 2+i
     386            return -(2+i)
     387        self.model.B = Param(B_index, [True,False], initialize=B_init)
     388        self.instance = self.model.create()
     389        #self.instance.pprint()
     390        self.failUnlessEqual(set(self.instance.B.keys()),set([(0,0,0,True),(2,4,4,True),(0,0,0,False),(2,4,4,False)]))
     391        self.failUnlessEqual(self.instance.B[0,0,0,True],2)
     392        self.failUnlessEqual(self.instance.B[0,0,0,False],-2)
     393        self.failUnlessEqual(self.instance.B[2,4,4,True],4)
     394        self.failUnlessEqual(self.instance.B[2,4,4,False],-4)
     395
     396    def test_index3(self):
     397        self.model.A = Set(initialize=range(0,4))
     398        def B_index(model):
     399            return [(i,2*i,i*i) for i in model.A if i%2 == 0]
     400        def B_init(i,ii,iii,j,model):
     401            if j:
     402                return 2+i
     403            return -(2+i)
     404        self.model.B = Param(B_index, [True,False], initialize=B_init)
     405        try:
     406            self.instance = self.model.create()
     407            self.fail("Expected ValueError because B_index returns a tuple")
     408        except ValueError:
     409            pass
     410
     411    def test_index4(self):
     412        self.model.A = Set(initialize=range(0,4))
     413        @set_options(within=Integers)
     414        def B_index(model):
     415            return [i/2.0 for i in model.A]
     416        def B_init(i,j,model):
     417            if j:
     418                return 2+i
     419            return -(2+i)
     420        self.model.B = Param(B_index, [True,False], initialize=B_init)
     421        try:
     422            self.instance = self.model.create()
     423            self.fail("Expected ValueError because B_index returns invalid index values")
     424        except ValueError:
     425            pass
     426
    378427    def test_dimen1(self):
    379428        model=Model()
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_set.py

    r2025 r2128  
    14131413        self.failUnlessEqual(self.instance.B[0,True].data(),set([0,1]))
    14141414        self.failUnlessEqual(self.instance.B[2,True].data(),set([2,3]))
     1415
     1416    def test_initialize7(self):
     1417        self.model.A = Set(initialize=range(0,3))
     1418        @set_options(dimen=3)
     1419        def B_index(model):
     1420            return [(i,i+1,i*i) for i in model.A]
     1421        def B_init(i,ii,iii,j,model):
     1422            if j:
     1423                return range(i,2+i)
     1424            return []
     1425        self.model.B = Set(B_index, [True,False], initialize=B_init)
     1426        self.instance = self.model.create()
     1427        #self.instance.pprint()
     1428        self.failUnlessEqual(set(self.instance.B.keys()),set([(0,1,0,True),(1,2,1,True),(2,3,4,True),(0,1,0,False),(1,2,1,False),(2,3,4,False)]))
     1429        self.failUnlessEqual(self.instance.B[0,1,0,True].data(),set([0,1]))
     1430        self.failUnlessEqual(self.instance.B[2,3,4,True].data(),set([2,3]))
     1431
     1432    def test_initialize8(self):
     1433        self.model.A = Set(initialize=range(0,3))
     1434        def B_index(model):
     1435            return [(i,i+1,i*i) for i in model.A]
     1436        def B_init(i,ii,iii,j,model):
     1437            if j:
     1438                return range(i,2+i)
     1439            return []
     1440        self.model.B = Set(B_index, [True,False], initialize=B_init)
     1441        try:
     1442            self.instance = self.model.create()
     1443            self.fail("Expected ValueError because B_index returns a tuple")
     1444        except ValueError:
     1445            pass
     1446
     1447    def test_initialize9(self):
     1448        self.model.A = Set(initialize=range(0,3))
     1449        @set_options(domain=Integers)
     1450        def B_index(model):
     1451            return [i/2.0 for i in model.A]
     1452        def B_init(i,j,model):
     1453            if j:
     1454                return range(int(i),int(2+i))
     1455            return []
     1456        self.model.B = Set(B_index, [True,False], initialize=B_init)
     1457        self.instance = self.model.create()
     1458        try:
     1459            self.instance = self.model.create()
     1460            self.fail("Expected ValueError because B_index returns invalid set values")
     1461        except AssertionError:
     1462            pass
    14151463
    14161464    def test_dimen1(self):
Note: See TracChangeset for help on using the changeset viewer.