source: coopr.pyomo/stable/2.3/coopr/pyomo/tests/unit/test_modeldata.py @ 2433

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

Merged revisions 2388-2432 via svnmerge from
https://software.sandia.gov/svn/public/coopr/coopr.pyomo/trunk

........

r2399 | wehart | 2010-02-24 11:36:56 -0700 (Wed, 24 Feb 2010) | 2 lines


Adding a work-around when pstats cannot be imported.

........

r2400 | wehart | 2010-02-24 14:51:08 -0700 (Wed, 24 Feb 2010) | 2 lines


Misc documentation updates.

........

r2408 | wehart | 2010-02-28 05:41:04 -0700 (Sun, 28 Feb 2010) | 3 lines


Allow an earlier version of Python. I'm still not sure this is a good idea,
but it's necessary for Jython.

........

r2409 | wehart | 2010-02-28 05:42:33 -0700 (Sun, 28 Feb 2010) | 7 lines


Rework of profiling imports.


Refinement of Pyomo command-line parsing, which is more
specific now.


Adding automatic import of pyomo to package.

........

r2415 | jwatson | 2010-03-08 20:53:13 -0700 (Mon, 08 Mar 2010) | 3 lines


Significantly improved performance of PyomoModel? _clear_attribute method, mainly by eliminate unnecessary calls to it through _setattr_exec_.

........

r2416 | jwatson | 2010-03-09 16:45:22 -0700 (Tue, 09 Mar 2010) | 5 lines


Modified the AMPL dat file parser to instantiate the lexer and yaccer objects only once, for the lifetime of the module.


They were being inadvertently created at each invocation, which pyomo users wouldn't notice. But PySP users, who can be creating 1K or more instances, do!

........

r2422 | wehart | 2010-03-11 16:01:09 -0700 (Thu, 11 Mar 2010) | 3 lines


Rework of unit tests to (a) import pyutilib.th as 'unittest' and
(b) employ test skipping.

........

r2430 | wehart | 2010-03-11 23:38:22 -0700 (Thu, 11 Mar 2010) | 2 lines


Reworking class decorators.

........

File size: 47.6 KB
Line 
1#
2# Unit Tests for ModelData objects
3#
4
5import os
6import sys
7from os.path import abspath, dirname
8coopr_dir=dirname(dirname(abspath(__file__)))+os.sep+".."+os.sep+".."
9sys.path.insert(0, coopr_dir)
10from coopr.pyomo import *
11import coopr
12import pyutilib.common
13import pyutilib.th as unittest
14
15currdir=dirname(abspath(__file__))+os.sep
16example_dir=coopr_dir+os.sep+".."+os.sep+"examples"+os.sep+"pyomo"+os.sep+"tutorials"+os.sep+"tab"+os.sep
17csv_dir=coopr_dir+os.sep+".."+os.sep+"examples"+os.sep+"pyomo"+os.sep+"tutorials"+os.sep+"csv"+os.sep
18tutorial_dir=coopr_dir+os.sep+".."+os.sep+"examples"+os.sep+"pyomo"+os.sep+"tutorials"+os.sep
19
20try:
21  from win32com.client.dynamic import Dispatch
22  _win32com=True
23except:
24  _win32com=False #pragma:nocover
25
26
27class PyomoTableData(unittest.TestCase):
28
29    def setUp(self):
30        pass
31
32    def construct(self,filename):
33        pass
34
35    def test_read_set(self):
36        td = DataManagerFactory('xls')
37        td.initialize(currdir+"Book1.xls", range="TheRange", format='set', set="X")
38        try:
39           td.open()
40           td.read()
41           td.close()
42           self.failUnlessEqual( td._info, ['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])
43        except pyutilib.common.ApplicationError:
44           pass
45
46    def test_read_param1(self):
47        td = DataManagerFactory('xls')
48        td.initialize(currdir+"Book1.xls", range="TheRange", index=['aa'], param=['bb','cc','dd'])
49        try:
50          td.open()
51          td.read()
52          td.close()
53          self.failUnlessEqual( td._info, ['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])
54        except pyutilib.common.ApplicationError:
55          pass
56
57    def test_read_param2(self):
58        td = DataManagerFactory('xls')
59        td.initialize(currdir+"Book1.xls",range="TheRange", index_name="X", index=['aa'], param=['bb','cc','dd'])
60        try:
61          td.open()
62          td.read()
63          td.close()
64          self.failUnlessEqual( td._info, ['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])
65        except pyutilib.common.ApplicationError:
66          pass
67
68    def test_read_param3(self):
69        td = DataManagerFactory('xls')
70        td.initialize(currdir+"Book1.xls",range="TheRange", index_name="X", index=['aa','bb','cc'], param=["dd"], param_name={'dd':'a'})
71        try:
72          td.open()
73          td.read()
74          td.close()
75          self.failUnlessEqual( td._info, ['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])
76        except pyutilib.common.ApplicationError:
77          pass
78
79    def test_read_param4(self):
80        td = DataManagerFactory('xls')
81        td.initialize(currdir+"Book1.xls",range="TheRange", index_name="X", index=['aa','bb'], param=['cc','dd'], param_name={'cc':'a', 'dd':'b'})
82        try:
83          td.open()
84          td.read()
85          td.close()
86          self.failUnlessEqual( td._info, ['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])
87        except pyutilib.common.ApplicationError:
88          pass
89
90    def test_read_array1(self):
91        td = DataManagerFactory('xls')
92        td.initialize(currdir+"Book1.xls",range="TheRange", param="X", format="array")
93        try:
94          td.open()
95          td.read()
96          td.close()
97          self.failUnlessEqual( td._info, ['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])
98        except pyutilib.common.ApplicationError:
99          pass
100
101    def test_read_array2(self):
102        td = DataManagerFactory('xls')
103        td.initialize(currdir+"Book1.xls",range="TheRange",param="X",format="transposed_array")
104        try:
105          td.open()
106          td.read()
107          td.close()
108          self.failUnlessEqual( td._info, ['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])
109        except pyutilib.common.ApplicationError:
110          pass
111
112    def test_error1(self):
113        td = DataManagerFactory('xls')
114        td.initialize("bad")
115        try:
116            td.open()
117            self.fail("Expected IOError because of bad file")
118        except IOError:
119            pass
120
121    def test_error2(self):
122        td = DataManagerFactory('xls')
123        try:
124            td.open()
125            self.fail("Expected IOError because no file specified")
126        except (IOError,AttributeError):
127            pass
128
129    def test_error3(self):
130        td = DataManagerFactory('txt')
131        try:
132            td.initialize(currdir+"display.txt")
133            td.open()
134            self.fail("Expected IOError because of bad file type")
135        except (IOError, AttributeError):
136            pass
137
138    def test_error4(self):
139        td = DataManagerFactory('txt')
140        try:
141            td.initialize(filename=currdir+"dummy")
142            td.open()
143            self.fail("Expected IOError because of bad file type")
144        except (IOError, AttributeError):
145            pass
146
147    def test_error5(self):
148        td = DataManagerFactory('tab')
149        td.initialize(example_dir+"D.tab", param="D", format="foo")
150        td.open()
151        try:
152            td.read()
153            self.fail("Expected IOError because of bad format")
154        except ValueError:
155            pass
156
157PyomoTableData = unittest.skipIf(not _win32com, "Cannot import 'win32com'")(PyomoTableData)
158
159class PyomoModelData(unittest.TestCase):
160
161    def test_md1(self):
162        md = ModelData()
163        md.add(example_dir+"A.tab")
164        try:
165            md.read()
166            self.fail("Must specify a model")
167        except ValueError:
168            pass
169        model=Model()
170        try:
171            md.read(model)
172            self.fail("Expected IOError")
173        except IOError:
174            pass
175        model.A=Set()
176
177    def test_md2(self):
178        md = ModelData()
179        md.add(currdir+"data1.dat")
180        model=Model()
181        model.A=Set()
182        md.read(model)
183
184    def test_md3(self):
185        md = ModelData()
186        md.add(currdir+"data2.dat")
187        model=Model()
188        model.A=Set()
189        try:
190            md.read(model)
191            self.fail("Expected error because of extraneous text")
192        except IOError:
193            pass
194
195    def test_md4(self):
196        md = ModelData()
197        md.add(currdir+"data3.dat")
198        model=Model()
199        model.A=Set()
200        model.B=Set()
201        model.C=Set()
202        md.read(model)
203
204    def test_md5(self):
205        md = ModelData()
206        md.add(currdir+"data4.dat")
207        model=Model()
208        model.A=Set()
209        try:
210            md.read(model)
211        except (ValueError,IOError):
212            pass
213
214    def test_md6(self):
215        md = ModelData()
216        md.add(currdir+"data5.dat")
217        model=Model()
218        model.A=Set()
219        try:
220            md.read(model)
221        except ValueError:
222            pass
223
224    def test_md7(self):
225        md = ModelData()
226        md.add(currdir+"data1.tab")
227        model=Model()
228        try:
229            md.read(model)
230            self.fail("Expected IOError")
231        except IOError:
232            pass
233
234    def test_md8(self):
235        md = ModelData()
236        md.add(currdir+"data6.dat")
237        model=Model()
238        model.A=Set()
239        try:
240            md.read(model)
241            self.fail("Expected IOError")
242        except IOError:
243            pass
244
245    def test_md9(self):
246        md = ModelData()
247        md.add(currdir+"data7.dat")
248        model=Model()
249        model.A=Set()
250        model.B=Param(model.A)
251        md.read(model)
252
253    def test_md10(self):
254        md = ModelData()
255        md.add(currdir+"data8.dat")
256        model=Model()
257        model.A=Param(within=Boolean)
258        model.B=Param(within=Boolean)
259        model.Z=Set()
260        md.read(model)
261        instance = model.create(md)
262        #self.failUnlessEqual(instance.Z.data(), set(['foo[*]' 'bar' '[' '*' ']' 'bar[1,*,a,*]' 'foo-bar' 'hello-goodbye']))
263
264    def test_md11(self):
265        cwd = os.getcwd()
266        os.chdir(currdir)
267        md = ModelData()
268        md.add(currdir+"data11.dat")
269        model=Model()
270        model.A=Set()
271        model.B=Set()
272        model.C=Set()
273        model.D=Set()
274        md.read(model)
275        os.chdir(cwd)
276
277
278class TestTextImport(unittest.TestCase):
279
280    def test_tableA1(self):
281        """Importing a single column of data"""
282        pyutilib.misc.setup_redirect(currdir+'importA1.dat')
283        print "import "+os.path.abspath(example_dir+'A.tab')+" format=set: A;"
284        pyutilib.misc.reset_redirect()
285        model=Model()
286        model.A = Set()
287        instance = model.create(currdir+'importA1.dat')
288        self.failUnlessEqual(instance.A.data(), set(['A1', 'A2', 'A3']))
289        os.remove(currdir+'importA1.dat')
290
291    def test_tableA2(self):
292        """Importing a single column of data"""
293        pyutilib.misc.setup_redirect(currdir+'importA2.dat')
294        print "import "+os.path.abspath(example_dir+'A.tab')+" ;"
295        pyutilib.misc.reset_redirect()
296        model=Model()
297        model.A = Set()
298        try:
299            instance = model.create(currdir+'importA2.dat')
300            self.fail("Should fail because no set name is specified")
301        except IOError:
302            pass
303        os.remove(currdir+'importA2.dat')
304
305    def test_tableA3(self):
306        """Importing a single column of data"""
307        pyutilib.misc.setup_redirect(currdir+'importA3.dat')
308        print "import "+os.path.abspath(example_dir+'A.tab')+" : A ;"
309        pyutilib.misc.reset_redirect()
310        model=Model()
311        model.A = Set()
312        try:
313            instance = model.create(currdir+'importA3.dat')
314            self.fail("Should fail because no index is specified")
315        except IOError:
316            pass
317        os.remove(currdir+'importA3.dat')
318
319    def test_tableB(self):
320        """Same as test_tableA"""
321        pyutilib.misc.setup_redirect(currdir+'importB.dat')
322        print "import "+os.path.abspath(example_dir+'B.tab')+" format=set:B;"
323        pyutilib.misc.reset_redirect()
324        model=Model()
325        model.B = Set()
326        instance = model.create(currdir+'importB.dat')
327        self.failUnlessEqual(instance.B.data(), set([1, 2, 3]))
328        os.remove(currdir+'importB.dat')
329
330    def test_tableC(self):
331        """Importing a multi-column table, where all columns are
332        treated as values for a set with tuple values."""
333        pyutilib.misc.setup_redirect(currdir+'importC.dat')
334        print "import "+os.path.abspath(example_dir+'C.tab')+" format=set: C ;"
335        pyutilib.misc.reset_redirect()
336        model=Model()
337        model.C = Set(dimen=2)
338        instance = model.create(currdir+'importC.dat')
339        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
340        os.remove(currdir+'importC.dat')
341
342    def test_tableD(self):
343        """Importing a 2D array of data as a set."""
344        pyutilib.misc.setup_redirect(currdir+'importD.dat')
345        print "import "+os.path.abspath(example_dir+'D.tab')+" format=set_array: C ;"
346        pyutilib.misc.reset_redirect()
347        model=Model()
348        model.C = Set(dimen=2)
349        instance = model.create(currdir+'importD.dat')
350        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A2',2), ('A3',3)]))
351        os.remove(currdir+'importD.dat')
352
353    def test_tableZ(self):
354        """Importing a single parameter"""
355        pyutilib.misc.setup_redirect(currdir+'importZ.dat')
356        print "import "+os.path.abspath(example_dir+'Z.tab')+" format=param: Z ;"
357        pyutilib.misc.reset_redirect()
358        model=Model()
359        model.Z = Param(default=99.0)
360        instance = model.create(currdir+'importZ.dat')
361        self.failUnlessEqual(instance.Z.value, 1.1)
362        os.remove(currdir+'importZ.dat')
363
364    def test_tableY(self):
365        """Same as tableXW."""
366        pyutilib.misc.setup_redirect(currdir+'importY.dat')
367        print "import "+os.path.abspath(example_dir+'Y.tab')+" : [A] Y;"
368        pyutilib.misc.reset_redirect()
369        model=Model()
370        model.A = Set(initialize=['A1','A2','A3','A4'])
371        model.Y = Param(model.A)
372        instance = model.create(currdir+'importY.dat')
373        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
374        self.failUnlessEqual(instance.Y.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
375        os.remove(currdir+'importY.dat')
376
377    def test_tableXW_1(self):
378        """Importing a table, but only reporting the values for the non-index
379        parameter columns.  The first column is assumed to represent an
380        index column."""
381        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
382        print "import "+os.path.abspath(example_dir+'XW.tab')+": [A] X W;"
383        pyutilib.misc.reset_redirect()
384        model=Model()
385        model.A = Set(initialize=['A1','A2','A3','A4'])
386        model.X = Param(model.A)
387        model.W = Param(model.A)
388        instance = model.create(currdir+'importXW.dat')
389        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
390        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
391        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
392        os.remove(currdir+'importXW.dat')
393
394    def test_tableXW_2(self):
395        """Like test_tableXW_1, except that set A is not defined."""
396        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
397        print "import "+os.path.abspath(example_dir+'XW.tab')+": [A] X W;"
398        pyutilib.misc.reset_redirect()
399        model=Model()
400        model.A = Set()
401        model.X = Param(model.A)
402        model.W = Param(model.A)
403        instance = model.create(currdir+'importXW.dat')
404        self.failUnlessEqual(instance.A.data(), set())
405        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
406        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
407        os.remove(currdir+'importXW.dat')
408
409    def test_tableXW_3(self):
410        """Like test_tableXW_1, except that set A is defined in the import statment."""
411        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
412        print "import "+os.path.abspath(example_dir+'XW.tab')+": A=[A] X W;"
413        pyutilib.misc.reset_redirect()
414        model=Model()
415        model.A = Set()
416        model.X = Param(model.A)
417        model.W = Param(model.A)
418        instance = model.create(currdir+'importXW.dat')
419        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3']))
420        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
421        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
422        os.remove(currdir+'importXW.dat')
423
424    def test_tableXW_4(self):
425        """Like test_tableXW_1, except that set A is defined in the import statment and all values are mapped."""
426        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
427        print "import "+os.path.abspath(example_dir+'XW.tab')+": B=[A] R=X S=W;"
428        pyutilib.misc.reset_redirect()
429        model=Model()
430        model.B = Set()
431        model.R = Param(model.B)
432        model.S = Param(model.B)
433        instance = model.create(currdir+'importXW.dat')
434        self.failUnlessEqual(instance.B.data(), set(['A1','A2','A3']))
435        self.failUnlessEqual(instance.R.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
436        self.failUnlessEqual(instance.S.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
437        os.remove(currdir+'importXW.dat')
438
439    def test_tableT(self):
440        """Importing a 2D array of parameters that are transposed."""
441        pyutilib.misc.setup_redirect(currdir+'importT.dat')
442        print "import "+os.path.abspath(example_dir+'T.tab')+" format=transposed_array : T;"
443        pyutilib.misc.reset_redirect()
444        model=Model()
445        model.A = Set()
446        model.B = Set()
447        model.T = Param(model.A, model.B)
448        instance = model.create(currdir+'importT.dat')
449        self.failUnlessEqual(instance.T.data(), {('A2', 'I1'): 2.3, ('A1', 'I2'): 1.4, ('A1', 'I3'): 1.5, ('A1', 'I4'): 1.6, ('A1', 'I1'): 1.3, ('A3', 'I4'): 3.6, ('A2', 'I4'): 2.6, ('A3', 'I1'): 3.3, ('A2', 'I3'): 2.5, ('A3', 'I2'): 3.4, ('A2', 'I2'): 2.4, ('A3', 'I3'): 3.5})
450        os.remove(currdir+'importT.dat')
451
452    def test_tableU(self):
453        """Importing a 2D array of parameters."""
454        pyutilib.misc.setup_redirect(currdir+'importU.dat')
455        print "import "+os.path.abspath(example_dir+'U.tab')+" format=array : U;"
456        pyutilib.misc.reset_redirect()
457        model=Model()
458        model.A = Set()
459        model.B = Set()
460        model.U = Param(model.A, model.B)
461        instance = model.create(currdir+'importU.dat')
462        self.failUnlessEqual(instance.U.data(), {('I2', 'A1'): 1.4, ('I3', 'A1'): 1.5, ('I3', 'A2'): 2.5, ('I4', 'A1'): 1.6, ('I3', 'A3'): 3.5, ('I1', 'A2'): 2.3, ('I4', 'A3'): 3.6, ('I1', 'A3'): 3.3, ('I4', 'A2'): 2.6, ('I2', 'A3'): 3.4, ('I1', 'A1'): 1.3, ('I2', 'A2'): 2.4})
463        os.remove(currdir+'importU.dat')
464
465    def test_tableS(self):
466        """Importing a table, but only reporting the values for the non-index
467        parameter columns.  The first column is assumed to represent an
468        index column.  A missing value is represented in the column data."""
469        pyutilib.misc.setup_redirect(currdir+'importS.dat')
470        print "import "+os.path.abspath(example_dir+'S.tab')+": [A] S ;"
471        pyutilib.misc.reset_redirect()
472        model=Model()
473        model.A = Set(initialize=['A1','A2','A3','A4'])
474        model.S = Param(model.A)
475        instance = model.create(currdir+'importS.dat')
476        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
477        self.failUnlessEqual(instance.S.data(), {'A1':3.3,'A3':3.5})
478        os.remove(currdir+'importS.dat')
479
480    def test_tablePO(self):
481        """Importing a table that has multiple indexing columns"""
482        pyutilib.misc.setup_redirect(currdir+'importPO.dat')
483        print "import "+os.path.abspath(example_dir+'PO.tab')+" : J=[A,B] P O;"
484        pyutilib.misc.reset_redirect()
485        model=Model()
486        model.J = Set(dimen=2)
487        model.P = Param(model.J)
488        model.O = Param(model.J)
489        instance = model.create(currdir+'importPO.dat')
490        self.failUnlessEqual(instance.J.data(), set([('A3', 'B3'), ('A1', 'B1'), ('A2', 'B2')]) )
491        self.failUnlessEqual(instance.P.data(), {('A3', 'B3'): 4.5, ('A1', 'B1'): 4.3, ('A2', 'B2'): 4.4} )
492        self.failUnlessEqual(instance.O.data(), {('A3', 'B3'): 5.5, ('A1', 'B1'): 5.3, ('A2', 'B2'): 5.4})
493        os.remove(currdir+'importPO.dat')
494
495
496class TestCsvImport(unittest.TestCase):
497
498    def test_tableA1(self):
499        """Importing a single column of data"""
500        pyutilib.misc.setup_redirect(currdir+'importA1.dat')
501        print "import "+os.path.abspath(csv_dir+'A.csv')+" format=set: A;"
502        pyutilib.misc.reset_redirect()
503        model=Model()
504        model.A = Set()
505        instance = model.create(currdir+'importA1.dat')
506        self.failUnlessEqual(instance.A.data(), set(['A1', 'A2', 'A3']))
507        os.remove(currdir+'importA1.dat')
508
509    def test_tableA2(self):
510        """Importing a single column of data"""
511        pyutilib.misc.setup_redirect(currdir+'importA2.dat')
512        print "import "+os.path.abspath(csv_dir+'A.csv')+" ;"
513        pyutilib.misc.reset_redirect()
514        model=Model()
515        model.A = Set()
516        try:
517            instance = model.create(currdir+'importA2.dat')
518            self.fail("Should fail because no set name is specified")
519        except IOError:
520            pass
521        os.remove(currdir+'importA2.dat')
522
523    def test_tableA3(self):
524        """Importing a single column of data"""
525        pyutilib.misc.setup_redirect(currdir+'importA3.dat')
526        print "import "+os.path.abspath(csv_dir+'A.csv')+" : A ;"
527        pyutilib.misc.reset_redirect()
528        model=Model()
529        model.A = Set()
530        try:
531            instance = model.create(currdir+'importA3.dat')
532            self.fail("Should fail because no index is specified")
533        except IOError:
534            pass
535        os.remove(currdir+'importA3.dat')
536
537    def test_tableB(self):
538        """Same as test_tableA"""
539        pyutilib.misc.setup_redirect(currdir+'importB.dat')
540        print "import "+os.path.abspath(csv_dir+'B.csv')+" format=set:B;"
541        pyutilib.misc.reset_redirect()
542        model=Model()
543        model.B = Set()
544        instance = model.create(currdir+'importB.dat')
545        self.failUnlessEqual(instance.B.data(), set([1, 2, 3]))
546        os.remove(currdir+'importB.dat')
547
548    def test_tableC(self):
549        """Importing a multi-column table, where all columns are
550        treated as values for a set with tuple values."""
551        pyutilib.misc.setup_redirect(currdir+'importC.dat')
552        print "import "+os.path.abspath(csv_dir+'C.csv')+" format=set: C ;"
553        pyutilib.misc.reset_redirect()
554        model=Model()
555        model.C = Set(dimen=2)
556        instance = model.create(currdir+'importC.dat')
557        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
558        os.remove(currdir+'importC.dat')
559
560    def test_tableD(self):
561        """Importing a 2D array of data as a set."""
562        pyutilib.misc.setup_redirect(currdir+'importD.dat')
563        print "import "+os.path.abspath(csv_dir+'D.csv')+" format=set_array: C ;"
564        pyutilib.misc.reset_redirect()
565        model=Model()
566        model.C = Set(dimen=2)
567        instance = model.create(currdir+'importD.dat')
568        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A2',2), ('A3',3)]))
569        os.remove(currdir+'importD.dat')
570
571    def test_tableZ(self):
572        """Importing a single parameter"""
573        pyutilib.misc.setup_redirect(currdir+'importZ.dat')
574        print "import "+os.path.abspath(csv_dir+'Z.csv')+" format=param: Z ;"
575        pyutilib.misc.reset_redirect()
576        model=Model()
577        model.Z = Param(default=99.0)
578        instance = model.create(currdir+'importZ.dat')
579        self.failUnlessEqual(instance.Z.value, 1.1)
580        os.remove(currdir+'importZ.dat')
581
582    def test_tableY(self):
583        """Same as tableXW."""
584        pyutilib.misc.setup_redirect(currdir+'importY.dat')
585        print "import "+os.path.abspath(csv_dir+'Y.csv')+" : [A] Y;"
586        pyutilib.misc.reset_redirect()
587        model=Model()
588        model.A = Set(initialize=['A1','A2','A3','A4'])
589        model.Y = Param(model.A)
590        instance = model.create(currdir+'importY.dat')
591        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
592        self.failUnlessEqual(instance.Y.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
593        os.remove(currdir+'importY.dat')
594
595    def test_tableXW_1(self):
596        """Importing a table, but only reporting the values for the non-index
597        parameter columns.  The first column is assumed to represent an
598        index column."""
599        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
600        print "import "+os.path.abspath(csv_dir+'XW.csv')+": [A] X W;"
601        pyutilib.misc.reset_redirect()
602        model=Model()
603        model.A = Set(initialize=['A1','A2','A3','A4'])
604        model.X = Param(model.A)
605        model.W = Param(model.A)
606        instance = model.create(currdir+'importXW.dat')
607        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
608        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
609        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
610        os.remove(currdir+'importXW.dat')
611
612    def test_tableXW_2(self):
613        """Like test_tableXW_1, except that set A is not defined."""
614        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
615        print "import "+os.path.abspath(csv_dir+'XW.csv')+": [A] X W;"
616        pyutilib.misc.reset_redirect()
617        model=Model()
618        model.A = Set()
619        model.X = Param(model.A)
620        model.W = Param(model.A)
621        instance = model.create(currdir+'importXW.dat')
622        self.failUnlessEqual(instance.A.data(), set())
623        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
624        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
625        os.remove(currdir+'importXW.dat')
626
627    def test_tableXW_3(self):
628        """Like test_tableXW_1, except that set A is defined in the import statment."""
629        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
630        print "import "+os.path.abspath(csv_dir+'XW.csv')+": A=[A] X W;"
631        pyutilib.misc.reset_redirect()
632        model=Model()
633        model.A = Set()
634        model.X = Param(model.A)
635        model.W = Param(model.A)
636        instance = model.create(currdir+'importXW.dat')
637        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3']))
638        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
639        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
640        os.remove(currdir+'importXW.dat')
641
642    def test_tableXW_4(self):
643        """Like test_tableXW_1, except that set A is defined in the import statment and all values are mapped."""
644        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
645        print "import "+os.path.abspath(csv_dir+'XW.csv')+": B=[A] R=X S=W;"
646        pyutilib.misc.reset_redirect()
647        model=Model()
648        model.B = Set()
649        model.R = Param(model.B)
650        model.S = Param(model.B)
651        instance = model.create(currdir+'importXW.dat')
652        self.failUnlessEqual(instance.B.data(), set(['A1','A2','A3']))
653        self.failUnlessEqual(instance.R.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
654        self.failUnlessEqual(instance.S.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
655        os.remove(currdir+'importXW.dat')
656
657    def test_tableT(self):
658        """Importing a 2D array of parameters that are transposed."""
659        pyutilib.misc.setup_redirect(currdir+'importT.dat')
660        print "import "+os.path.abspath(csv_dir+'T.csv')+" format=transposed_array : T;"
661        pyutilib.misc.reset_redirect()
662        model=Model()
663        model.A = Set()
664        model.B = Set()
665        model.T = Param(model.A, model.B)
666        instance = model.create(currdir+'importT.dat')
667        self.failUnlessEqual(instance.T.data(), {('A2', 'I1'): 2.3, ('A1', 'I2'): 1.4, ('A1', 'I3'): 1.5, ('A1', 'I4'): 1.6, ('A1', 'I1'): 1.3, ('A3', 'I4'): 3.6, ('A2', 'I4'): 2.6, ('A3', 'I1'): 3.3, ('A2', 'I3'): 2.5, ('A3', 'I2'): 3.4, ('A2', 'I2'): 2.4, ('A3', 'I3'): 3.5})
668        os.remove(currdir+'importT.dat')
669
670    def test_tableU(self):
671        """Importing a 2D array of parameters."""
672        pyutilib.misc.setup_redirect(currdir+'importU.dat')
673        print "import "+os.path.abspath(csv_dir+'U.csv')+" format=array : U;"
674        pyutilib.misc.reset_redirect()
675        model=Model()
676        model.A = Set()
677        model.B = Set()
678        model.U = Param(model.A, model.B)
679        instance = model.create(currdir+'importU.dat')
680        self.failUnlessEqual(instance.U.data(), {('I2', 'A1'): 1.4, ('I3', 'A1'): 1.5, ('I3', 'A2'): 2.5, ('I4', 'A1'): 1.6, ('I3', 'A3'): 3.5, ('I1', 'A2'): 2.3, ('I4', 'A3'): 3.6, ('I1', 'A3'): 3.3, ('I4', 'A2'): 2.6, ('I2', 'A3'): 3.4, ('I1', 'A1'): 1.3, ('I2', 'A2'): 2.4})
681        os.remove(currdir+'importU.dat')
682
683    def test_tableS(self):
684        """Importing a table, but only reporting the values for the non-index
685        parameter columns.  The first column is assumed to represent an
686        index column.  A missing value is represented in the column data."""
687        pyutilib.misc.setup_redirect(currdir+'importS.dat')
688        print "import "+os.path.abspath(csv_dir+'S.csv')+": [A] S ;"
689        pyutilib.misc.reset_redirect()
690        model=Model()
691        model.A = Set(initialize=['A1','A2','A3','A4'])
692        model.S = Param(model.A)
693        instance = model.create(currdir+'importS.dat')
694        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
695        self.failUnlessEqual(instance.S.data(), {'A1':3.3,'A3':3.5})
696        os.remove(currdir+'importS.dat')
697
698    def test_tablePO(self):
699        """Importing a table that has multiple indexing columns"""
700        pyutilib.misc.setup_redirect(currdir+'importPO.dat')
701        print "import "+os.path.abspath(csv_dir+'PO.csv')+" : J=[A,B] P O;"
702        pyutilib.misc.reset_redirect()
703        model=Model()
704        model.J = Set(dimen=2)
705        model.P = Param(model.J)
706        model.O = Param(model.J)
707        instance = model.create(currdir+'importPO.dat')
708        self.failUnlessEqual(instance.J.data(), set([('A3', 'B3'), ('A1', 'B1'), ('A2', 'B2')]) )
709        self.failUnlessEqual(instance.P.data(), {('A3', 'B3'): 4.5, ('A1', 'B1'): 4.3, ('A2', 'B2'): 4.4} )
710        self.failUnlessEqual(instance.O.data(), {('A3', 'B3'): 5.5, ('A1', 'B1'): 5.3, ('A2', 'B2'): 5.4})
711        os.remove(currdir+'importPO.dat')
712
713
714
715class TestSpreadsheet(unittest.TestCase):
716
717    def test_tableA1(self):
718        """Importing a single column of data"""
719        pyutilib.misc.setup_redirect(currdir+'importA1.dat')
720        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Atable format=set: A;"
721        pyutilib.misc.reset_redirect()
722        model=Model()
723        model.A = Set()
724        instance = model.create(currdir+'importA1.dat')
725        self.failUnlessEqual(instance.A.data(), set(['A1', 'A2', 'A3']))
726        os.remove(currdir+'importA1.dat')
727
728    def test_tableA2(self):
729        """Importing a single column of data"""
730        pyutilib.misc.setup_redirect(currdir+'importA2.dat')
731        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Atable ;"
732        pyutilib.misc.reset_redirect()
733        model=Model()
734        model.A = Set()
735        try:
736            instance = model.create(currdir+'importA2.dat')
737            self.fail("Should fail because no set name is specified")
738        except IOError:
739            pass
740        os.remove(currdir+'importA2.dat')
741
742    def test_tableA3(self):
743        """Importing a single column of data"""
744        pyutilib.misc.setup_redirect(currdir+'importA3.dat')
745        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Atable : A ;"
746        pyutilib.misc.reset_redirect()
747        model=Model()
748        model.A = Set()
749        try:
750            instance = model.create(currdir+'importA3.dat')
751            self.fail("Should fail because no index is specified")
752        except IOError:
753            pass
754        os.remove(currdir+'importA3.dat')
755
756    def test_tableB(self):
757        """Same as test_tableA"""
758        pyutilib.misc.setup_redirect(currdir+'importB.dat')
759        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Btable format=set:B;"
760        pyutilib.misc.reset_redirect()
761        model=Model()
762        model.B = Set()
763        instance = model.create(currdir+'importB.dat')
764        self.failUnlessEqual(instance.B.data(), set([1, 2, 3]))
765        os.remove(currdir+'importB.dat')
766
767    def test_tableC(self):
768        """Importing a multi-column table, where all columns are
769        treated as values for a set with tuple values."""
770        pyutilib.misc.setup_redirect(currdir+'importC.dat')
771        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Ctable format=set: C ;"
772        pyutilib.misc.reset_redirect()
773        model=Model()
774        model.C = Set(dimen=2)
775        instance = model.create(currdir+'importC.dat')
776        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
777        os.remove(currdir+'importC.dat')
778
779    def test_tableD(self):
780        """Importing a 2D array of data as a set."""
781        pyutilib.misc.setup_redirect(currdir+'importD.dat')
782        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Dtable format=set_array: C ;"
783        pyutilib.misc.reset_redirect()
784        model=Model()
785        model.C = Set(dimen=2)
786        instance = model.create(currdir+'importD.dat')
787        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A2',2), ('A3',3)]))
788        os.remove(currdir+'importD.dat')
789
790    def test_tableZ(self):
791        """Importing a single parameter"""
792        pyutilib.misc.setup_redirect(currdir+'importZ.dat')
793        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Zparam format=param: Z ;"
794        pyutilib.misc.reset_redirect()
795        model=Model()
796        model.Z = Param(default=99.0)
797        instance = model.create(currdir+'importZ.dat')
798        self.failUnlessEqual(instance.Z.value, 1.1)
799        os.remove(currdir+'importZ.dat')
800
801    def test_tableY(self):
802        """Same as tableXW."""
803        pyutilib.misc.setup_redirect(currdir+'importY.dat')
804        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Ytable : [A] Y;"
805        pyutilib.misc.reset_redirect()
806        model=Model()
807        model.A = Set(initialize=['A1','A2','A3','A4'])
808        model.Y = Param(model.A)
809        instance = model.create(currdir+'importY.dat')
810        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
811        self.failUnlessEqual(instance.Y.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
812        os.remove(currdir+'importY.dat')
813
814    def test_tableXW_1(self):
815        """Importing a table, but only reporting the values for the non-index
816        parameter columns.  The first column is assumed to represent an
817        index column."""
818        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
819        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=XWtable : [A] X W;"
820        pyutilib.misc.reset_redirect()
821        model=Model()
822        model.A = Set(initialize=['A1','A2','A3','A4'])
823        model.X = Param(model.A)
824        model.W = Param(model.A)
825        instance = model.create(currdir+'importXW.dat')
826        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
827        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
828        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
829        os.remove(currdir+'importXW.dat')
830
831    def test_tableXW_2(self):
832        """Like test_tableXW_1, except that set A is not defined."""
833        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
834        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=XWtable : [A] X W;"
835        pyutilib.misc.reset_redirect()
836        model=Model()
837        model.A = Set()
838        model.X = Param(model.A)
839        model.W = Param(model.A)
840        instance = model.create(currdir+'importXW.dat')
841        self.failUnlessEqual(instance.A.data(), set())
842        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
843        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
844        os.remove(currdir+'importXW.dat')
845
846    def test_tableXW_3(self):
847        """Like test_tableXW_1, except that set A is defined in the import statment."""
848        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
849        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=XWtable: A=[A] X W;"
850        pyutilib.misc.reset_redirect()
851        model=Model()
852        model.A = Set()
853        model.X = Param(model.A)
854        model.W = Param(model.A)
855        instance = model.create(currdir+'importXW.dat')
856        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3']))
857        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
858        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
859        os.remove(currdir+'importXW.dat')
860
861    def test_tableXW_4(self):
862        """Like test_tableXW_1, except that set A is defined in the import statment and all values are mapped."""
863        pyutilib.misc.setup_redirect(currdir+'importXW.dat')
864        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=XWtable: B=[A] R=X S=W;"
865        pyutilib.misc.reset_redirect()
866        model=Model()
867        model.B = Set()
868        model.R = Param(model.B)
869        model.S = Param(model.B)
870        instance = model.create(currdir+'importXW.dat')
871        self.failUnlessEqual(instance.B.data(), set(['A1','A2','A3']))
872        self.failUnlessEqual(instance.R.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
873        self.failUnlessEqual(instance.S.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
874        os.remove(currdir+'importXW.dat')
875
876    def test_tableT(self):
877        """Importing a 2D array of parameters that are transposed."""
878        pyutilib.misc.setup_redirect(currdir+'importT.dat')
879        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Ttable format=transposed_array : T;"
880        pyutilib.misc.reset_redirect()
881        model=Model()
882        model.A = Set()
883        model.B = Set()
884        model.T = Param(model.A, model.B)
885        instance = model.create(currdir+'importT.dat')
886        self.failUnlessEqual(instance.T.data(), {('A2', 'I1'): 2.3, ('A1', 'I2'): 1.4, ('A1', 'I3'): 1.5, ('A1', 'I4'): 1.6, ('A1', 'I1'): 1.3, ('A3', 'I4'): 3.6, ('A2', 'I4'): 2.6, ('A3', 'I1'): 3.3, ('A2', 'I3'): 2.5, ('A3', 'I2'): 3.4, ('A2', 'I2'): 2.4, ('A3', 'I3'): 3.5})
887        os.remove(currdir+'importT.dat')
888
889    def test_tableU(self):
890        """Importing a 2D array of parameters."""
891        pyutilib.misc.setup_redirect(currdir+'importU.dat')
892        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Utable format=array : U;"
893        pyutilib.misc.reset_redirect()
894        model=Model()
895        model.A = Set()
896        model.B = Set()
897        model.U = Param(model.A, model.B)
898        instance = model.create(currdir+'importU.dat')
899        self.failUnlessEqual(instance.U.data(), {('I2', 'A1'): 1.4, ('I3', 'A1'): 1.5, ('I3', 'A2'): 2.5, ('I4', 'A1'): 1.6, ('I3', 'A3'): 3.5, ('I1', 'A2'): 2.3, ('I4', 'A3'): 3.6, ('I1', 'A3'): 3.3, ('I4', 'A2'): 2.6, ('I2', 'A3'): 3.4, ('I1', 'A1'): 1.3, ('I2', 'A2'): 2.4})
900        os.remove(currdir+'importU.dat')
901
902    def test_tableS(self):
903        """Importing a table, but only reporting the values for the non-index
904        parameter columns.  The first column is assumed to represent an
905        index column.  A missing value is represented in the column data."""
906        pyutilib.misc.setup_redirect(currdir+'importS.dat')
907        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=Stable : [A] S ;"
908        pyutilib.misc.reset_redirect()
909        model=Model()
910        model.A = Set(initialize=['A1','A2','A3','A4'])
911        model.S = Param(model.A)
912        instance = model.create(currdir+'importS.dat')
913        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
914        self.failUnlessEqual(instance.S.data(), {'A1':3.3,'A3':3.5})
915        os.remove(currdir+'importS.dat')
916
917    def test_tablePO(self):
918        """Importing a table that has multiple indexing columns"""
919        pyutilib.misc.setup_redirect(currdir+'importPO.dat')
920        print "import "+os.path.abspath(tutorial_dir+'excel.xls')+" range=POtable : J=[A,B] P O;"
921        pyutilib.misc.reset_redirect()
922        model=Model()
923        model.J = Set(dimen=2)
924        model.P = Param(model.J)
925        model.O = Param(model.J)
926        instance = model.create(currdir+'importPO.dat')
927        self.failUnlessEqual(instance.J.data(), set([('A3', 'B3'), ('A1', 'B1'), ('A2', 'B2')]) )
928        self.failUnlessEqual(instance.P.data(), {('A3', 'B3'): 4.5, ('A1', 'B1'): 4.3, ('A2', 'B2'): 4.4} )
929        self.failUnlessEqual(instance.O.data(), {('A3', 'B3'): 5.5, ('A1', 'B1'): 5.3, ('A2', 'B2'): 5.4})
930        os.remove(currdir+'importPO.dat')
931
932TestSpreadsheet = unittest.skipIf(not _win32com, "Cannot import 'win32com'")(TestSpreadsheet)
933
934
935class TestModelData(unittest.TestCase):
936
937    def test_tableA1(self):
938        """Importing a single column of data"""
939        md = ModelData()
940        md.add(os.path.abspath(example_dir+'A.tab'), format='set', set='A')
941        model=Model()
942        model.A = Set()
943        md.read(model)
944        instance = model.create(md)
945        self.failUnlessEqual(instance.A.data(), set(['A1', 'A2', 'A3']))
946
947    def test_tableA2(self):
948        """Importing a single column of data"""
949        md = ModelData()
950        md.add(os.path.abspath(example_dir+'A.tab'))
951        model=Model()
952        model.A = Set()
953        try:
954            md.read(model)
955            instance = model.create(md)
956            self.fail("Should fail because no set name is specified")
957        except IOError:
958            pass
959
960    def test_tableA3(self):
961        """Importing a single column of data"""
962        md = ModelData()
963        md.add(os.path.abspath(example_dir+'A.tab'), set='A')
964        model=Model()
965        model.A = Set()
966        try:
967            md.read(model)
968            instance = model.create(md)
969            self.fail("Should fail because no index is specified")
970        except IOError:
971            pass
972
973    def test_tableB(self):
974        """Same as test_tableA"""
975        md = ModelData()
976        md.add(os.path.abspath(example_dir+'B.tab'), format='set', set='B')
977        model=Model()
978        model.B = Set()
979        md.read(model)
980        instance = model.create(md)
981        self.failUnlessEqual(instance.B.data(), set([1, 2, 3]))
982
983    def test_tableC(self):
984        """Importing a multi-column table, where all columns are
985        treated as values for a set with tuple values."""
986        md = ModelData()
987        md.add(os.path.abspath(example_dir+'C.tab'), format='set', set='C')
988        model=Model()
989        model.C = Set(dimen=2)
990        md.read(model)
991        instance = model.create(md)
992        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A1',2), ('A1',3), ('A2',1), ('A2',2), ('A2',3), ('A3',1), ('A3',2), ('A3',3)]))
993
994    def test_tableD(self):
995        """Importing a 2D array of data as a set."""
996        md = ModelData()
997        md.add(os.path.abspath(example_dir+'D.tab'), format='set_array', set='C')
998        model=Model()
999        model.C = Set(dimen=2)
1000        md.read(model)
1001        instance = model.create(md)
1002        self.failUnlessEqual(instance.C.data(), set([('A1',1), ('A2',2), ('A3',3)]))
1003
1004    def test_tableZ(self):
1005        """Importing a single parameter"""
1006        md = ModelData()
1007        md.add(os.path.abspath(example_dir+'Z.tab'), format='param', param='Z')
1008        model=Model()
1009        model.Z = Param(default=99.0)
1010        md.read(model)
1011        instance = model.create(md)
1012        self.failUnlessEqual(instance.Z.value, 1.1)
1013
1014    def test_tableY(self):
1015        """Same as tableXW."""
1016        md = ModelData()
1017        md.add(os.path.abspath(example_dir+'Y.tab'), index=['A'], param=['Y'])
1018        model=Model()
1019        model.A = Set(initialize=['A1','A2','A3','A4'])
1020        model.Y = Param(model.A)
1021        md.read(model)
1022        instance = model.create(md)
1023        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
1024        self.failUnlessEqual(instance.Y.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
1025
1026    def test_tableXW_1(self):
1027        """Importing a table, but only reporting the values for the non-index
1028        parameter columns.  The first column is assumed to represent an
1029        index column."""
1030        md = ModelData()
1031        md.add(os.path.abspath(example_dir+'XW.tab'), index=['A'], param=['X','W'])
1032        model=Model()
1033        model.A = Set(initialize=['A1','A2','A3','A4'])
1034        model.X = Param(model.A)
1035        model.W = Param(model.A)
1036        md.read(model)
1037        instance = model.create(md)
1038        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
1039        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
1040        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
1041
1042    def test_tableXW_2(self):
1043        """Like test_tableXW_1, except that set A is not defined."""
1044        md = ModelData()
1045        md.add(os.path.abspath(example_dir+'XW.tab'), index=['A'], param=['X','W'])
1046        model=Model()
1047        model.A = Set()
1048        model.X = Param(model.A)
1049        model.W = Param(model.A)
1050        md.read(model)
1051        instance = model.create(md)
1052        self.failUnlessEqual(instance.A.data(), set())
1053        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
1054        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
1055
1056    def test_tableXW_3(self):
1057        """Like test_tableXW_1, except that set A is defined in the import statment."""
1058        md = ModelData()
1059        md.add(os.path.abspath(example_dir+'XW.tab'), index_name='A', index=['A'], param=['X','W'])
1060        model=Model()
1061        model.A = Set()
1062        model.X = Param(model.A)
1063        model.W = Param(model.A)
1064        md.read(model)
1065        instance = model.create(md)
1066        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3']))
1067        self.failUnlessEqual(instance.X.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
1068        self.failUnlessEqual(instance.W.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
1069
1070    def test_tableXW_4(self):
1071        """Like test_tableXW_1, except that set A is defined in the import statment and all values are mapped."""
1072        md = ModelData()
1073        md.add(os.path.abspath(example_dir+'XW.tab'), index_name='B', index=['A'], param=['X','W'], param_name={'X':'R', 'W':'S'})
1074        model=Model()
1075        model.B = Set()
1076        model.R = Param(model.B)
1077        model.S = Param(model.B)
1078        md.read(model)
1079        instance = model.create(md)
1080        self.failUnlessEqual(instance.B.data(), set(['A1','A2','A3']))
1081        self.failUnlessEqual(instance.R.data(), {'A1':3.3,'A2':3.4,'A3':3.5})
1082        self.failUnlessEqual(instance.S.data(), {'A1':4.3,'A2':4.4,'A3':4.5})
1083
1084    def test_tableT(self):
1085        """Importing a 2D array of parameters that are transposed."""
1086        md = ModelData()
1087        md.add(os.path.abspath(example_dir+'T.tab'), format='transposed_array', param='T')
1088        model=Model()
1089        model.A = Set()
1090        model.B = Set()
1091        model.T = Param(model.A, model.B)
1092        md.read(model)
1093        instance = model.create(md)
1094        self.failUnlessEqual(instance.T.data(), {('A2', 'I1'): 2.3, ('A1', 'I2'): 1.4, ('A1', 'I3'): 1.5, ('A1', 'I4'): 1.6, ('A1', 'I1'): 1.3, ('A3', 'I4'): 3.6, ('A2', 'I4'): 2.6, ('A3', 'I1'): 3.3, ('A2', 'I3'): 2.5, ('A3', 'I2'): 3.4, ('A2', 'I2'): 2.4, ('A3', 'I3'): 3.5})
1095
1096    def test_tableU(self):
1097        """Importing a 2D array of parameters."""
1098        md = ModelData()
1099        md.add(os.path.abspath(example_dir+'T.tab'), format='array', param='U')
1100        model=Model()
1101        model.A = Set()
1102        model.B = Set()
1103        model.U = Param(model.A, model.B)
1104        md.read(model)
1105        instance = model.create(md)
1106        self.failUnlessEqual(instance.U.data(), {('I2', 'A1'): 1.4, ('I3', 'A1'): 1.5, ('I3', 'A2'): 2.5, ('I4', 'A1'): 1.6, ('I3', 'A3'): 3.5, ('I1', 'A2'): 2.3, ('I4', 'A3'): 3.6, ('I1', 'A3'): 3.3, ('I4', 'A2'): 2.6, ('I2', 'A3'): 3.4, ('I1', 'A1'): 1.3, ('I2', 'A2'): 2.4})
1107
1108    def test_tableS(self):
1109        """Importing a table, but only reporting the values for the non-index
1110        parameter columns.  The first column is assumed to represent an
1111        index column.  A missing value is represented in the column data."""
1112        md = ModelData()
1113        md.add(os.path.abspath(example_dir+'S.tab'), index=['A'], param=['S'])
1114        model=Model()
1115        model.A = Set(initialize=['A1','A2','A3','A4'])
1116        model.S = Param(model.A)
1117        md.read(model)
1118        instance = model.create(md)
1119        self.failUnlessEqual(instance.A.data(), set(['A1','A2','A3','A4']))
1120        self.failUnlessEqual(instance.S.data(), {'A1':3.3,'A3':3.5})
1121
1122    def test_tablePO(self):
1123        """Importing a table that has multiple indexing columns"""
1124        pyutilib.misc.setup_redirect(currdir+'importPO.dat')
1125        print "import "+os.path.abspath(example_dir+'PO.tab')+" : J=[A,B] P O;"
1126        pyutilib.misc.reset_redirect()
1127        md = ModelData()
1128        md.add(os.path.abspath(example_dir+'PO.tab'), index_name='J', index=['A','B'], param=['P','O'])
1129        model=Model()
1130        model.J = Set(dimen=2)
1131        model.P = Param(model.J)
1132        model.O = Param(model.J)
1133        md.read(model)
1134        instance = model.create(md)
1135        self.failUnlessEqual(instance.J.data(), set([('A3', 'B3'), ('A1', 'B1'), ('A2', 'B2')]) )
1136        self.failUnlessEqual(instance.P.data(), {('A3', 'B3'): 4.5, ('A1', 'B1'): 4.3, ('A2', 'B2'): 4.4} )
1137        self.failUnlessEqual(instance.O.data(), {('A3', 'B3'): 5.5, ('A1', 'B1'): 5.3, ('A2', 'B2'): 5.4})
1138
1139
1140if __name__ == "__main__":
1141   unittest.main()
1142
Note: See TracBrowser for help on using the repository browser.