Changeset 2463


Ignore:
Timestamp:
Mar 27, 2010 7:51:41 PM (9 years ago)
Author:
wehart
Message:

Fixing problems with namespace data management. Our unit tests pass,
which suggests that the data is being parsed as expected.

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

Legend:

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

    r2459 r2463  
    240240
    241241
    242     def create(self, filename=None, name=None, scenario=None):
     242    def create(self, filename=None, name=None, namespace=None, namespaces=None):
    243243        """
    244244        Create a concrete instance of this Model, possibly using data
     
    247247        if self._defer_construction:
    248248            instance = self.clone()
    249             instance.load(filename, scenario=scenario)
     249            if namespaces is None:
     250                instance.load(filename, namespaces=[namespace])
     251            else:
     252                instance.load(filename, namespaces=namespaces)
    250253        else:
    251254            instance = self
     
    287290
    288291
    289     def load(self, arg, scenario=None):
     292    def load(self, arg, namespaces=[None]):
    290293        """ Load the model with data from a file or a Solution object """
    291294        if arg is None or type(arg) is str:
    292            self._load_model_data(ModelData(filename=arg,model=self), scenario)
     295           self._load_model_data(ModelData(filename=arg,model=self), namespaces)
    293296           return True
    294297        elif type(arg) is ModelData:
    295            self._load_model_data(arg, scenario)
     298           self._load_model_data(arg, namespaces)
    296299           return True
    297300        elif type(arg) is coopr.opt.SolverResults:
     
    340343
    341344
    342     def _load_model_data(self, modeldata, scenario):
     345    def _load_model_data(self, modeldata, namespaces):
    343346        """
    344347        Load declarations from a ModelData object.
    345348        """
     349        #
     350        # Do some error checking
     351        #
     352        for namespace in namespaces:
     353            if not namespace is None and not namespace in modeldata._data:
     354                raise IOError, "Cannot access undefined namespace: '%s'" % namespace
    346355        #print "HERE _load_model_data",self._declarations
    347356        for declaration in self._declarations:
     
    354363                else:
    355364                    declaration.default = modeldata._default[tmp]
    356             if tmp in modeldata._data.get(scenario,{}).keys():
    357                 #print "HERE", declaration.name, str(declaration.dimen),modeldata._data[scenario][tmp]
    358                 if declaration.type() is Set:
    359                     data = self._tuplize(modeldata._data[scenario][tmp],declaration)
    360                 else:
    361                     data = modeldata._data[scenario][tmp]
    362             else:
    363                 data = None
     365            data = None
     366            for namespace in namespaces:
     367                #print "HERE", declaration.name, namespace, modeldata._data
     368                if tmp in modeldata._data.get(namespace,{}).keys():
     369                    #print "HERE", declaration.name, str(declaration.dimen),modeldata._data[namespace][tmp]
     370                    if declaration.type() is Set:
     371                        data = self._tuplize(modeldata._data[namespace][tmp],declaration)
     372                    else:
     373                        data = modeldata._data[namespace][tmp]
     374                #print "HERE X", data
     375                if not data is None:
     376                    break
    364377            if pyomo.debug("generate"):           #pragma:nocover
    365378                print "About to generate '"+declaration.name+"' with data: "+str(data)
  • coopr.pyomo/trunk/coopr/pyomo/data/parse_datacmds.py

    r2459 r2463  
    130130    '''expr : statements
    131131            | '''
     132    if len(p) == 2:
     133        #print "STMTS",p[1]
     134        for stmt in p[1]:
     135            if type(stmt) is list:
     136                _parse_info[None].append(stmt)
     137            else:
     138                for key in stmt:
     139                    if key in _parse_info:
     140                        _parse_info[key].append(stmt[key])
     141                    else:
     142                        _parse_info[key] = stmt[key]
    132143
    133144def p_statements(p):
    134145    '''statements : statement statements
    135146                  | statement
    136                   | NAMESPACE WORD LBRACE statement RBRACE statements
    137                   | NAMESPACE WORD LBRACE statement RBRACE '''
    138     global _parse_info
    139     if len(p) in [2,3]:
    140         if not p[1] is None:
    141             _parse_info[None].append(p[1])
    142     else:
    143         if not p[3] is None:
    144             _parse_info[p[1]].append(p[3])
     147                  | NAMESPACE WORD LBRACE statements RBRACE statements
     148                  | NAMESPACE WORD LBRACE statements RBRACE '''
     149    #print "STMT X",p[1:],p[1]
     150    if len(p) == 2:
     151        if p[1] is None:
     152            p[0] = []
     153        else:
     154            p[0] = [p[1]]
     155    elif len(p) == 3:
     156        if p[2] is None:
     157            if p[1] is None:
     158                p[0] = []
     159            else:
     160                p[0] = [p[1]]
     161        else:
     162            if p[1] is None:
     163                p[0] = p[2]
     164            else:
     165                p[0] = [p[1]]+p[2]
     166    else:
     167        if p[4] is None:
     168            if len(p) == 6:
     169                p[0] = []
     170            else:
     171                p[0] = p[6]
     172        else:
     173            ns = {p[2]:p[4]}
     174            if len(p) == 6:
     175                p[0] = [ns]
     176            else:
     177                p[0] = [ns]+p[6]
    145178
    146179def p_statement(p):
     
    375408        ply_init(_parsedata)
    376409        ampl_dat_yaccer.parse(data, lexer=ampl_dat_lexer, debug=debug)
    377         #print "HERE X",_parse_info
    378410    elif not filename is None:
    379411        f = open(filename)
     
    383415        ply_init(_parsedata)
    384416        ampl_dat_yaccer.parse(data, lexer=ampl_dat_lexer, debug=debug)
    385         #print "HERE Y",_parse_info
    386     else:
    387         #print "HERE Z",_parse_info
     417    else:
    388418        _parse_info = None
    389419    #
  • coopr.pyomo/trunk/coopr/pyomo/data/tester

    r2287 r2463  
    22
    33import sys
    4 from parse_datacmds import *
     4import parse_datacmds
    55
     6parse_datacmds.debugging=True
    67debug=int(sys.argv[2])
    7 print parse_data_commands(filename=sys.argv[1], debug=debug)
     8print parse_datacmds.parse_data_commands(filename=sys.argv[1], debug=debug)
    89
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_modeldata.py

    r2430 r2463  
    275275        os.chdir(cwd)
    276276
     277    def test_md11(self):
     278        cwd = os.getcwd()
     279        os.chdir(currdir)
     280        model=Model()
     281        model.a=Param()
     282        model.b=Param()
     283        model.c=Param()
     284        model.d=Param()
     285        # Test 1
     286        instance = model.create(currdir+'data14.dat', namespaces=['ns1','ns2'])
     287        self.failUnlessEqual( value(instance.a), 1)
     288        self.failUnlessEqual( value(instance.b), 2)
     289        self.failUnlessEqual( value(instance.c), 2)
     290        self.failUnlessEqual( value(instance.d), 2)
     291        # Test 2
     292        instance = model.create(currdir+'data14.dat', namespaces=['ns1','ns3','nsX'])
     293        self.failUnlessEqual( value(instance.a), 1)
     294        self.failUnlessEqual( value(instance.b), 100)
     295        self.failUnlessEqual( value(instance.c), 3)
     296        self.failUnlessEqual( value(instance.d), 100)
     297        # Test None
     298        instance = model.create(currdir+'data14.dat')
     299        self.failUnlessEqual( value(instance.a), -1)
     300        self.failUnlessEqual( value(instance.b), -2)
     301        self.failUnlessEqual( value(instance.c), -3)
     302        self.failUnlessEqual( value(instance.d), -4)
     303        #
     304        os.chdir(cwd)
     305
    277306
    278307class TestTextImport(unittest.TestCase):
Note: See TracChangeset for help on using the changeset viewer.