source: coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_modeldata.py @ 2285

Last change on this file since 2285 was 2285, checked in by wehart, 10 years ago

Working through more examples of the 'import' command.

File size: 14.6 KB
Line 
1#
2# Unit Tests for ModelData objects
3#
4
5import unittest
6import os
7import sys
8from os.path import abspath, dirname
9coopr_dir=dirname(dirname(abspath(__file__)))+os.sep+".."+os.sep+".."
10sys.path.insert(0, coopr_dir)
11from coopr.pyomo import *
12import coopr
13
14currdir=dirname(abspath(__file__))+os.sep
15example_dir=coopr_dir+os.sep+".."+os.sep+"examples"+os.sep+"pyomo"+os.sep+"tutorials"+os.sep+"tab"+os.sep
16
17try:
18  from win32com.client.dynamic import Dispatch
19  _win32com=True
20except:
21  _win32com=False #pragma:nocover
22
23
24class PyomoTableData(unittest.TestCase):
25
26    def run(self, result=None):
27        """ Disable the tests if win32com is not available """
28        if not _win32com:
29           return
30        unittest.TestCase.run(self,result)
31
32    def setUp(self):
33        pass
34
35    def construct(self,filename):
36        pass
37
38    def test_read_set(self):
39        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",set="X")
40        try:
41           td.open()
42           td.read()
43           td.close()
44           self.failUnlessEqual( td.data(), ['set', 'X', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
45        except coopr.ApplicationError:
46           pass
47
48    def test_read_set2(self):
49        td = TableData(range="TheRange",set="X")
50        try:
51           td.open(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls")
52           td.read()
53           td.close()
54           self.failUnlessEqual( td.data(), ['set', 'X', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
55        except coopr.ApplicationError:
56           pass
57
58    def test_read_param1(self):
59        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange")
60        try:
61          td.open()
62          td.read()
63          td.close()
64          self.failUnlessEqual( td.data(), ['param', ':', 'bb', 'cc', 'dd', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
65        except coopr.ApplicationError:
66          pass
67
68    def test_read_param2(self):
69        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",index="X")
70        try:
71          td.open()
72          td.read()
73          td.close()
74          self.failUnlessEqual( td.data(), ['param', ':', 'X', ':', 'bb', 'cc', 'dd', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
75        except coopr.ApplicationError:
76          pass
77
78    def test_read_param3(self):
79        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",index="X", param="a")
80        try:
81          td.open()
82          td.read()
83          td.close()
84          self.failUnlessEqual( td.data(), ['param', ':', 'X', ':', 'a', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
85        except coopr.ApplicationError:
86          pass
87
88    def test_read_param4(self):
89        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",index="X", param=("a","b"))
90        try:
91          td.open()
92          td.read()
93          td.close()
94          self.failUnlessEqual( td.data(), ['param', ':', 'X', ':', 'a', 'b', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
95        except coopr.ApplicationError:
96          pass
97
98    def test_read_array1(self):
99        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",param="X", format="array")
100        try:
101          td.open()
102          td.read()
103          td.close()
104          self.failUnlessEqual( td.data(), ['param', 'X', ':', 'bb', 'cc', 'dd', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
105        except coopr.ApplicationError:
106          pass
107
108    def test_read_array2(self):
109        td = TableData(filename=coopr_dir+"\\test\\acro\\unit\\Book1.xls",range="TheRange",param="X",format="transposed_array")
110        try:
111          td.open()
112          td.read()
113          td.close()
114          self.failUnlessEqual( td.data(), ['param', 'X', '(tr)',':', 'bb', 'cc', 'dd', ':=', 'A1', 2.0, 3.0, 4.0, 'A5', 6.0, 7.0, 8.0, 'A9', 10.0, 11.0, 12.0, 'A13', 14.0, 15.0, 16.0])
115        except coopr.ApplicationError:
116          pass
117
118    def test_error1(self):
119        td = TableData(filename="bad")
120        try:
121            td.open()
122            self.fail("Expected IOError because of bad file")
123        except IOError:
124            pass
125
126    def test_error2(self):
127        td = TableData()
128        try:
129            td.open()
130            self.fail("Expected IOError because no file specified")
131        except IOError:
132            pass
133
134    def test_error3(self):
135        td = TableData(filename=currdir+"display.txt")
136        try:
137            td.open()
138            self.fail("Expected IOError because of bad file type")
139        except IOError:
140            pass
141
142    def test_error4(self):
143        td = TableData(filename=currdir+"dummy")
144        try:
145            td.open()
146            self.fail("Expected IOError because of bad file type")
147        except IOError:
148            pass
149
150    def test_error5(self):
151        td = TableData(filename=example_dir+"D.tab", param="D", format="foo")
152        td.open()
153        try:
154            td.read()
155            self.fail("Expected IOError because of bad format")
156        except ValueError:
157            pass
158
159    def test_error7(self):
160        td = TableData(filename=example_dir+"D.tab", set="D", format="foo")
161        td.open()
162        try:
163            td.read()
164            self.fail("Expected IOError because of bad format")
165        except ValueError:
166            pass
167
168
169
170class PyomoModelData(unittest.TestCase):
171
172    def test_md1(self):
173        md = ModelData()
174        md.add(example_dir+"A.tab")
175        try:
176            md.read()
177            self.fail("Must specify a model")
178        except ValueError:
179            pass
180        model=Model()
181        try:
182            md.read(model)
183            self.fail("Expected IOError")
184        except IOError:
185            pass
186        model.A=Set()
187
188    def test_md2(self):
189        md = ModelData()
190        md.add(currdir+"data1.dat")
191        model=Model()
192        model.A=Set()
193        md.read(model)
194
195    def test_md3(self):
196        md = ModelData()
197        md.add(currdir+"data2.dat")
198        model=Model()
199        model.A=Set()
200        try:
201            md.read(model)
202            self.fail("Expected error because of extraneous text")
203        except IOError:
204            pass
205
206    def test_md4(self):
207        md = ModelData()
208        md.add(currdir+"data3.dat")
209        model=Model()
210        model.A=Set()
211        model.B=Set()
212        model.C=Set()
213        md.read(model)
214
215    def test_md5(self):
216        md = ModelData()
217        md.add(currdir+"data4.dat")
218        model=Model()
219        model.A=Set()
220        try:
221            md.read(model)
222        except ValueError:
223            pass
224
225    def test_md6(self):
226        md = ModelData()
227        md.add(currdir+"data5.dat")
228        model=Model()
229        model.A=Set()
230        try:
231            md.read(model)
232        except ValueError:
233            pass
234
235    def test_md7(self):
236        md = ModelData()
237        md.add(currdir+"data1.tab")
238        model=Model()
239        try:
240            md.read(model)
241            self.fail("Expected IOError")
242        except IOError:
243            pass
244
245    def test_md8(self):
246        md = ModelData()
247        md.add(currdir+"data6.dat")
248        model=Model()
249        model.A=Set()
250        try:
251            md.read(model)
252            self.fail("Expected IOError")
253        except IOError:
254            pass
255
256    def test_md9(self):
257        md = ModelData()
258        md.add(currdir+"data7.dat")
259        model=Model()
260        model.A=Set()
261        model.B=Param(model.A)
262        md.read(model)
263
264    def test_md10(self):
265        md = ModelData()
266        md.add(currdir+"data8.dat")
267        model=Model()
268        model.A=Param(within=Boolean)
269        model.B=Param(within=Boolean)
270        md.read(model)
271
272    def test_md11(self):
273        cwd = os.getcwd()
274        os.chdir(currdir)
275        md = ModelData()
276        md.add(currdir+"data11.dat")
277        model=Model()
278        model.A=Set()
279        model.B=Set()
280        model.C=Set()
281        model.D=Set()
282        md.read(model)
283        os.chdir(cwd)
284
285
286class TestImport(unittest.TestCase):
287
288    def test_tableA(self):
289        """Importing a single column of data"""
290        pyutilib.misc.setup_redirect(currdir+'importA.dat')
291        print "import "+os.path.abspath(example_dir+'A.tab')+" ;"
292        pyutilib.misc.reset_redirect()
293        model=Model()
294        model.A = Set()
295        instance = model.create(currdir+'importA.dat')
296        self.failUnlessEqual(instance.A.data(), set(['A1', 'A2', 'A3']))
297        os.remove(currdir+'importA.dat')
298
299    def test_tableB(self):
300        """Same as test_tableA"""
301        pyutilib.misc.setup_redirect(currdir+'importB.dat')
302        print "import "+os.path.abspath(example_dir+'B.tab')+" ;"
303        pyutilib.misc.reset_redirect()
304        model=Model()
305        model.B = Set()
306        instance = model.create(currdir+'importB.dat')
307        self.failUnlessEqual(instance.B.data(), set([1, 2, 3]))
308        os.remove(currdir+'importB.dat')
309
310    def test_tableC(self):
311        """Importing a multi-column table, where all columns are
312        treated as values for a set with tuple values."""
313        pyutilib.misc.setup_redirect(currdir+'importC.dat')
314        print "import "+os.path.abspath(example_dir+'C.tab')+" : C ;"
315        pyutilib.misc.reset_redirect()
316        model=Model()
317        model.C = Set(dimen=2)
318        instance = model.create(currdir+'importC.dat')
319        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
320        os.remove(currdir+'importC.dat')
321
322    def Xtest_tableD(self):
323        """Importing a 2D array of data as a set."""
324        pyutilib.misc.setup_redirect(currdir+'importD.dat')
325        print "import "+os.path.abspath(example_dir+'D.tab')+" format=set_array: C ;"
326        pyutilib.misc.reset_redirect()
327        model=Model()
328        model.C = Set(dimen=2)
329        instance = model.create(currdir+'importD.dat')
330        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
331        os.remove(currdir+'importC.dat')
332
333    def test_tableS(self):
334        """Importing a table, but only reporting the values for the non-index
335        parameter columns.  The first column is assumed to represent an
336        index column.  A missing value is represented in the column data."""
337        pyutilib.misc.setup_redirect(currdir+'importS.dat')
338        print "import "+os.path.abspath(example_dir+'S.tab')+" ;"
339        pyutilib.misc.reset_redirect()
340        model=Model()
341        model.A = Set(initialize=['A1','A2','A3','A4'])
342        model.S = Param(model.A)
343        instance = model.create(currdir+'importS.dat')
344        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
345        self.failUnlessEqual(instance.S.data(), {'A1':3.3,'A3':3.5})
346        os.remove(currdir+'importS.dat')
347
348    def test_tableXW_1(self):
349        """Importing a table, but only reporting the values for the non-index
350        parameter columns.  The first column is assumed to represent an
351        index column."""
352        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
353        print "import "+os.path.abspath(example_dir+'XW.tab')+" ;"
354        pyutilib.misc.reset_redirect()
355        model=Model()
356        model.A = Set(initialize=['A1','A2','A3','A4'])
357        model.X = Param(model.A)
358        model.W = Param(model.A)
359        instance = model.create(currdir+'importXW.dat')
360        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
361        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
362        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
363        os.remove(currdir+'importXW.dat')
364
365    def test_tableXW_2(self):
366        """Like test_tableXW_1, except that set A is not defined."""
367        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
368        print "import "+os.path.abspath(example_dir+'XW.tab')+" ;"
369        pyutilib.misc.reset_redirect()
370        model=Model()
371        model.A = Set()
372        model.X = Param(model.A)
373        model.W = Param(model.A)
374        instance = model.create(currdir+'importXW.dat')
375        self.failUnlessEqual(instance.A.data(), set())
376        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
377        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
378        os.remove(currdir+'importXW.dat')
379
380    def test_tableXW_3(self):
381        """Like test_tableXW_1, except that set A is defined in the import statment."""
382        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
383        print "import "+os.path.abspath(example_dir+'XW.tab')+" : [A] A X W;"
384        pyutilib.misc.reset_redirect()
385        model=Model()
386        model.A = Set()
387        model.X = Param(model.A)
388        model.W = Param(model.A)
389        instance = model.create(currdir+'importXW.dat')
390        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3']))
391        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
392        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
393        os.remove(currdir+'importXW.dat')
394
395    def test_tableXW_4(self):
396        """Like test_tableXW_1, except that set A is defined in the import statment and all values are mapped."""
397        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
398        print "import "+os.path.abspath(example_dir+'XW.tab')+" : [A] B:A R:X S:W;"
399        pyutilib.misc.reset_redirect()
400        model=Model()
401        model.B = Set()
402        model.R = Param(model.B)
403        model.S = Param(model.B)
404        instance = model.create(currdir+'importXW.dat')
405        self.failUnlessEqual(instance.B.data(), set(['A1','A2','A3']))
406        self.failUnlessEqual(instance.R.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
407        self.failUnlessEqual(instance.S.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
408        os.remove(currdir+'importXW.dat')
409
410    def test_tableY(self):
411        """Same as tableXW."""
412        pyutilib.misc.setup_redirect(currdir+'importY.dat')
413        print "import "+os.path.abspath(example_dir+'Y.tab')+" ;"
414        pyutilib.misc.reset_redirect()
415        model=Model()
416        model.A = Set(initialize=['A1','A2','A3','A4'])
417        model.Y = Param(model.A)
418        instance = model.create(currdir+'importY.dat')
419        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
420        self.failUnlessEqual(instance.Y.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
421        os.remove(currdir+'importY.dat')
422
423
424if __name__ == "__main__":
425   unittest.main()
426
Note: See TracBrowser for help on using the repository browser.