source: trunk/test/pyomo/unit/test_param.py @ 1768

Last change on this file since 1768 was 1768, checked in by wehart, 11 years ago

Rework of Coopr to use the new PyUtilib? package decomposition.

NOTE: to use Coopr with this update, we need to work with a new version of coopr_install.

File size: 14.8 KB
Line 
1#
2# Unit Tests for Param() Objects
3#
4# PyomoModel                Base test class
5# SimpleParam                Test singleton parameter
6# ArrayParam1                Test arrays of parameters
7# ArrayParam2                Test arrays of parameter with explicit zero default
8# ArrayParam3                Test arrays of parameter with nonzero default
9# TestIO                Test initialization from an AMPL *.dat file
10#
11
12import unittest
13import os
14import sys
15from os.path import abspath, dirname
16sys.path.insert(0, dirname(dirname(abspath(__file__)))+"/../..")
17from coopr.pyomo import *
18
19class PyomoModel(unittest.TestCase):
20
21    def setUp(self):
22        self.model = Model()
23
24    def construct(self,filename):
25        self.instance = self.model.create(filename)
26
27
28class SimpleParam(PyomoModel):
29
30    def setUp(self):
31        #
32        # Create Model
33        #
34        PyomoModel.setUp(self)
35        #
36        # Create model instance
37        #
38        self.model.A = Param(initialize=3.3)
39        self.instance = self.model.create()
40
41    def tearDown(self):
42        if os.path.exists("param.dat"):
43           os.remove("param.dat")
44
45    def test_simplify(self):
46        """Check the parameter can be simplified"""
47        tmp = self.instance.A.simplify(self.instance)
48        self.failUnlessEqual( isinstance(tmp,NumericConstant), True)
49        self.failUnlessEqual( tmp.value, 3.3 )
50
51    def test_value(self):
52        """Check the value of the parameter"""
53        tmp = value(self.instance.A)
54        self.failUnlessEqual( type(tmp), float)
55        self.failUnlessEqual( tmp, 3.3 )
56        tmp = float(self.instance.A)
57        self.failUnlessEqual( type(tmp), float)
58        self.failUnlessEqual( tmp, 3.3 )
59        tmp = int(self.instance.A)
60        self.failUnlessEqual( type(tmp), int)
61        self.failUnlessEqual( tmp, 3 )
62
63    def test_getattr(self):
64        """Check the use of the __getattr__ method"""
65        self.failUnlessEqual( self.instance.A.value, 3.3)
66
67    def test_setattr_value(self):
68        """Check the use of the __setattr__ method"""
69        self.instance.A = 3.3
70        self.failUnlessEqual( self.instance.A.value, 3.3)
71        self.instance.A.value = 4.3
72        self.failUnlessEqual( self.instance.A.value, 4.3)
73        try:
74          self.instance.A.value = 'A'
75        except ValueError:
76          self.fail("fail test_setattr_value")
77        else:
78          #
79          # NOTE: we can set bad values into a NumericValue object
80          #
81          pass
82
83    def test_setattr_default(self):
84        """Check the use of the __setattr__ method"""
85        self.model.A = Param()
86        self.model.A.default = 4.3
87        self.instance = self.model.create()
88        self.failUnlessEqual( self.instance.A.value, 4.3)
89
90    def test_dim(self):
91        """Check the use of dim"""
92        self.failUnlessEqual( self.instance.A.dim(), 0)
93
94    def test_keys(self):
95        """Check the use of keys"""
96        self.failUnlessEqual( len(self.instance.A.keys()), 1)
97
98    def test_len(self):
99        """Check the use of len"""
100        self.failUnlessEqual( len(self.instance.A), 1)
101
102    def test_getitem(self):
103        """Check the use of getitem"""
104        import coopr.pyomo.base.param
105        self.failUnless(isinstance(self.instance.A[None], coopr.pyomo.base.param._ParamValue))
106        self.failUnlessEqual( self.instance.A[None], 3.3)
107
108    def test_check_values(self):
109        """Check the use of check_values"""
110        self.instance.A.check_values()
111
112
113class ArrayParam1(SimpleParam):
114
115    def setUp(self):
116        #
117        # Create Model
118        #
119        PyomoModel.setUp(self)
120        #
121        # Create model instance
122        #
123        self.model.Z = Set(initialize=[1,3])
124        self.model.A = Param(self.model.Z, initialize={1:1.3})
125        self.instance = self.model.create()
126
127    def test_simplify(self):
128        """Check the parameter can be simplified"""
129        try:
130          tmp = self.instance.A.simplify(self.instance)
131        except ValueError:
132          pass
133        else:
134          self.fail("test_simplify")
135
136    def test_value(self):
137        try:
138          tmp = value(self.instance.A)
139        except ValueError:
140          pass
141        else:
142          self.fail("test_value")
143        try:
144          tmp = float(self.instance.A)
145        except ValueError:
146          pass
147        else:
148          self.fail("test_value")
149        try:
150          tmp = int(self.instance.A)
151        except ValueError:
152          pass
153        else:
154          self.fail("test_value")
155        tmp = value(self.instance.A[1])
156        self.failUnlessEqual( type(tmp), float)
157        self.failUnlessEqual( tmp, 1.3 )
158        tmp = float(self.instance.A[1])
159        self.failUnlessEqual( type(tmp), float)
160        self.failUnlessEqual( tmp, 1.3 )
161        tmp = int(self.instance.A[1])
162        self.failUnlessEqual( type(tmp), int)
163        self.failUnlessEqual( tmp, 1 )
164
165    def test_call(self):
166        """Check the use of the __call__ method"""
167        try:
168          tmp = self.instance.A()
169        except TypeError:
170          pass
171        else:
172          self.fail("test_call")
173
174    def test_getattr(self):
175        """Check the use of the __getattr__ method"""
176        try:
177          tmp = self.instance.A.value
178        except AttributeError:
179          pass
180        else:
181          self.fail("test_call")
182
183    def test_setattr_value(self):
184        """Check the use of the __setattr__ method"""
185        import coopr.pyomo.base.param
186        self.instance.A.value = 4.3
187        self.instance.A = 4.3
188        self.instance.A[1].value = 4.3
189        self.failUnlessEqual( type(self.instance.A[1]), coopr.pyomo.base.param._ParamValue)
190        self.instance.A[1] = 4.3
191        self.failUnlessEqual( type(self.instance.A[1]), coopr.pyomo.base.param._ParamValue)
192
193    def test_setitem(self):
194        """Check the use of the __setattr__ method"""
195        self.instance.A[3] = 4.3
196        self.failUnlessEqual( self.instance.A[3], 4.3)
197        self.instance.A[1] = 4.3
198        self.failUnlessEqual( self.instance.A[1], 4.3)
199        try:
200          self.instance.A[3] = 'A'
201        except ValueError:
202          self.fail("fail test_setitem")
203
204    def test_keys(self):
205        """Check the use of keys"""
206        self.failUnlessEqual( len(self.instance.A.keys()), 1)
207
208    def test_dim(self):
209        """Check the use of dim"""
210        self.failUnlessEqual( self.instance.A.dim(), 1)
211
212    def test_len(self):
213        """Check the use of len"""
214        self.instance.A[3] = 4.3
215        self.failUnlessEqual( len(self.instance.A), 2)
216
217    def test_getitem(self):
218        """Check the use of getitem"""
219        import coopr.pyomo.base.param
220        try:
221          self.failUnlessEqual( self.instance.A[None], 1.3)
222        except KeyError:
223          pass
224        else:
225          self.fail("test_getitem")
226        self.failUnlessEqual(type(self.instance.A[1]), coopr.pyomo.base.param._ParamValue)
227        self.failUnlessEqual( self.instance.A[1], 1.3)
228        try:
229          self.failUnlessEqual( self.instance.A[3], 0)
230        except KeyError:
231          pass
232        else:
233          self.fail("test_getitem")
234
235
236class ArrayParam2(ArrayParam1):
237
238    def setUp(self):
239        #
240        # Create Model
241        #
242        PyomoModel.setUp(self)
243        #
244        # Create model instance
245        #
246        self.model.Z = Set(initialize=[1,3])
247        self.model.A = Param(self.model.Z, initialize={1:1.3},default=0.0)
248        self.instance = self.model.create()
249
250    def test_setattr_default(self):
251        """Check the use of the __setattr__ method"""
252        self.model.Z = Set(initialize=[1,3])
253        self.model.A = Param(self.model.Z)
254        self.model.A.default = 4.3
255        self.instance = self.model.create()
256        self.failUnlessEqual( self.instance.A[3], 4.3)
257
258    def test_len(self):
259        """Check the use of len"""
260        self.failUnlessEqual( len(self.instance.A), 2)
261
262    def test_getitem(self):
263        """Check the use of getitem"""
264        try:
265          self.failUnlessEqual( self.instance.A[None], 0.0)
266        except KeyError:
267          pass
268        else:
269          self.fail("test_getitem")
270        self.failUnlessEqual( self.instance.A[1], 1.3)
271        self.failUnlessEqual( self.instance.A[3], 0)
272
273
274class ArrayParam3(ArrayParam2):
275
276    def setUp(self):
277        #
278        # Create Model
279        #
280        PyomoModel.setUp(self)
281        #
282        # Create model instance
283        #
284        self.model.Z = Set(initialize=[1,3])
285        self.model.A = Param(self.model.Z, initialize={1:1.3},default=99.0)
286        self.instance = self.model.create()
287
288    def test_len(self):
289        """Check the use of len"""
290        self.failUnlessEqual( len(self.instance.A), 2)
291
292    def test_getitem(self):
293        """Check the use of getitem"""
294        try:
295          self.failUnlessEqual( self.instance.A[None], 0.0)
296        except AssertionError:
297          print self.instance.A._paramval
298        except KeyError:
299          pass
300        else:
301          self.fail("test_getitem")
302        self.failUnlessEqual( self.instance.A[1], 1.3)
303        self.failUnlessEqual( self.instance.A[3], 99.0)
304
305
306class ArrayParam4(ArrayParam3):
307
308    def setUp(self):
309        #
310        # Create Model
311        #
312        PyomoModel.setUp(self)
313        #
314        # Create model instance
315        #
316        self.model.Z = Set(initialize=[1,3])
317        self.model.A = Param(self.model.Z, initialize=1.3)
318        self.instance = self.model.create()
319
320    def test_len(self):
321        """Check the use of len"""
322        self.failUnlessEqual( len(self.instance.A), 2)
323
324    def test_getitem(self):
325        """Check the use of getitem"""
326        try:
327          self.failUnlessEqual( self.instance.A[None], 0.0)
328        except KeyError:
329          pass
330        else:
331          self.fail("test_getitem")
332        self.failUnlessEqual( self.instance.A[1], 1.3)
333        self.failUnlessEqual( self.instance.A[3], 1.3)
334
335    def test_keys(self):
336        """Check the use of keys"""
337        self.failUnlessEqual( len(self.instance.A.keys()), 2)
338
339
340class ArrayParam5(ArrayParam4):
341
342    def setUp(self):
343        #
344        # Create Model
345        #
346        PyomoModel.setUp(self)
347        #
348        # Create model instance
349        #
350        self.model.Z = Set(initialize=[1,3])
351        def A_init(i,model):
352          return 1.3
353        self.model.A = Param(self.model.Z, initialize=A_init)
354        self.instance = self.model.create()
355
356
357class TestIO(PyomoModel):
358
359    def setUp(self):
360        #
361        # Create Model
362        #
363        PyomoModel.setUp(self)
364
365    def tearDown(self):
366        if os.path.exists("param.dat"):
367           os.remove("param.dat")
368
369    def test_io1(self):
370        OUTPUT=open("param.dat","w")
371        print >>OUTPUT, "data;"
372        print >>OUTPUT, "param A := 3.3;"
373        print >>OUTPUT, "end;"
374        OUTPUT.close()
375        self.model.A=Param()
376        self.instance = self.model.create("param.dat")
377        self.failUnlessEqual( self.instance.A, 3.3 )
378
379    def test_io2(self):
380        OUTPUT=open("param.dat","w")
381        print >>OUTPUT, "data;"
382        print >>OUTPUT, "set Z := 1 3 5;"
383        print >>OUTPUT, "param A :="
384        print >>OUTPUT, "1 2.2"
385        print >>OUTPUT, "3 2.3"
386        print >>OUTPUT, "5 2.5;"
387        print >>OUTPUT, "end;"
388        OUTPUT.close()
389        self.model.Z=Set()
390        self.model.A=Param(self.model.Z)
391        self.instance = self.model.create("param.dat")
392        self.failUnlessEqual( len(self.instance.A), 3 )
393
394    def test_io3(self):
395        OUTPUT=open("param.dat","w")
396        print >>OUTPUT, "data;"
397        print >>OUTPUT, "set Z := 1 3 5;"
398        print >>OUTPUT, "param : A B :="
399        print >>OUTPUT, "1 2.2 3.3"
400        print >>OUTPUT, "3 2.3 3.4"
401        print >>OUTPUT, "5 2.5 3.5;"
402        print >>OUTPUT, "end;"
403        OUTPUT.close()
404        self.model.Z=Set()
405        self.model.A=Param(self.model.Z)
406        self.model.B=Param(self.model.Z)
407        self.instance = self.model.create("param.dat")
408        self.failUnlessEqual( len(self.instance.A), 3 )
409        self.failUnlessEqual( len(self.instance.B), 3 )
410        self.failUnlessEqual( self.instance.B[5], 3.5 )
411
412    def test_io4(self):
413        OUTPUT=open("param.dat","w")
414        print >>OUTPUT, "data;"
415        print >>OUTPUT, "set Z := A1 A2 A3;"
416        print >>OUTPUT, "set Y := 1 2 3;"
417        print >>OUTPUT, "param A: A1 A2 A3 :="
418        print >>OUTPUT, "1 1.3 2.3 3.3"
419        print >>OUTPUT, "2 1.4 2.4 3.4"
420        print >>OUTPUT, "3 1.5 2.5 3.5"
421        print >>OUTPUT, ";"
422        print >>OUTPUT, "end;"
423        OUTPUT.close()
424        self.model.Z=Set()
425        self.model.Y=Set()
426        self.model.A=Param(self.model.Y,self.model.Z)
427        self.instance = self.model.create("param.dat")
428        self.failUnlessEqual( len(self.instance.Y), 3 )
429        self.failUnlessEqual( len(self.instance.Z), 3 )
430        self.failUnlessEqual( len(self.instance.A), 9 )
431        self.failUnlessEqual( self.instance.A[1, 'A2'], 2.3 )
432
433    def test_io5(self):
434        OUTPUT=open("param.dat","w")
435        print >>OUTPUT, "data;"
436        print >>OUTPUT, "set Z := A1 A2 A3;"
437        print >>OUTPUT, "set Y := 1 2 3;"
438        print >>OUTPUT, "param A (tr): A1 A2 A3 :="
439        print >>OUTPUT, "1 1.3 2.3 3.3"
440        print >>OUTPUT, "2 1.4 2.4 3.4"
441        print >>OUTPUT, "3 1.5 2.5 3.5"
442        print >>OUTPUT, ";"
443        print >>OUTPUT, "end;"
444        OUTPUT.close()
445        self.model.Z=Set()
446        self.model.Y=Set()
447        self.model.A=Param(self.model.Z,self.model.Y)
448        self.instance = self.model.create("param.dat")
449        self.failUnlessEqual( len(self.instance.Y), 3 )
450        self.failUnlessEqual( len(self.instance.Z), 3 )
451        self.failUnlessEqual( len(self.instance.A), 9 )
452        self.failUnlessEqual( self.instance.A['A2',1], 2.3 )
453
454    def test_io6(self):
455        OUTPUT=open("param.dat","w")
456        print >>OUTPUT, "data;"
457        print >>OUTPUT, "set Z := 1 3 5;"
458        print >>OUTPUT, "param A default 0.0 :="
459        print >>OUTPUT, "1 2.2"
460        print >>OUTPUT, "3 ."
461        print >>OUTPUT, "5 2.5;"
462        print >>OUTPUT, "end;"
463        OUTPUT.close()
464        self.model.Z=Set()
465        self.model.A=Param(self.model.Z)
466        self.instance = self.model.create("param.dat")
467        self.failUnlessEqual( len(self.instance.A), 3 )
468        self.failUnlessEqual( self.instance.A[3], 0.0 )
469
470    def test_io7(self):
471        OUTPUT=open("param.dat","w")
472        print >>OUTPUT, "data;"
473        print >>OUTPUT, "param A := True;"
474        print >>OUTPUT, "param B := False;"
475        print >>OUTPUT, "end;"
476        OUTPUT.close()
477        self.model.A=Param(within=Boolean)
478        self.model.B=Param(within=Boolean)
479        self.instance = self.model.create("param.dat")
480        self.failUnlessEqual( self.instance.A.value, True )
481        self.failUnlessEqual( self.instance.B.value, False )
482
483
484class TestParamError(PyomoModel):
485
486    def test_value(self):
487        p = Param()
488        try:
489            value(p)
490            self.fail("expected ValueError")
491        except ValueError:
492            pass
493        self.failUnlessEqual(p.value,None)
494
495if __name__ == "__main__":
496   unittest.main()
Note: See TracBrowser for help on using the repository browser.