Changeset 3019


Ignore:
Timestamp:
Sep 18, 2010 12:34:45 PM (11 years ago)
Author:
wehart
Message:

Changing *.dat parser to recognize filenames that start with
<string>:

Adding ability to specify slices of parameter indices.

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

Legend:

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

    r2922 r3019  
    8989            msg = "Unknown keyword to Param constructor: '%s'"
    9090            raise ValueError, msg % kwd.values()[0]
     91
     92
     93    def initialize(self, data):
     94        self._initialize = data
    9195
    9296
  • coopr.pyomo/trunk/coopr/pyomo/data/parse_datacmds.py

    r3017 r3019  
    5656    "WORDWITHINDEX",
    5757    "WORDWITHSQUOTEDINDEX",
    58     "WORDWITHDQUOTEDINDEX",
    5958    "STRING",
    6059    "QUOTEDSTRING",
     
    9695
    9796def t_WORDWITHSQUOTEDINDEX(t):
    98     r'[a-zA-Z_0-9][a-zA-Z_0-9\.\-]*\[\'[a-zA-Z_0-9\.\-,\* ]*\'\]'
     97    r'[a-zA-Z_0-9][a-zA-Z_0-9\.\-]*\[[\'\"a-zA-Z_0-9\.\-,\* ]*\]'
    9998    t.type = reserved.get(t.value,'WORDWITHSQUOTEDINDEX')    # Check for reserved words
    100     return t
    101 
    102 def t_WORDWITHDQUOTEDINDEX(t):
    103     r'[a-zA-Z_0-9][a-zA-Z_0-9\.\-]*\["[a-zA-Z_0-9\.\-,\* ]*"\]'
    104     t.type = reserved.get(t.value,'WORDWITHDQUOTEDINDEX')    # Check for reserved words
    10599    return t
    106100
     
    121115
    122116def t_FILENAME(t):
    123     r'[a-zA-Z_0-9\./\\]*(/|\\)[a-zA-Z_0-9\-\./\\]*'
     117    r'[a-zA-Z]+:[a-zA-Z_0-9\./\\]*(/|\\)[a-zA-Z_0-9\-\./\\]*|[a-zA-Z_0-9\./\\]*(/|\\)[a-zA-Z_0-9\-\./\\]*'
    124118    t.type = reserved.get(t.value,'FILENAME')    # Check for reserved words
    125119    return t
     
    198192                 | SET WORDWITHSQUOTEDINDEX COLONEQ setdecl SEMICOLON
    199193                 | SET WORDWITHSQUOTEDINDEX COLONEQ SEMICOLON
    200                  | SET WORDWITHDQUOTEDINDEX COLONEQ setdecl SEMICOLON
    201                  | SET WORDWITHDQUOTEDINDEX COLONEQ SEMICOLON
    202194                 | PARAM items COLONEQ paramdecl SEMICOLON
    203195                 | IMPORT importdecl SEMICOLON
     
    316308        p[0] = [p[2]]
    317309
    318 def p_template(p):
    319     '''template : LPAREN WORD index_list RPAREN
     310def p_set_template(p):
     311    '''set_template : LPAREN WORD index_list RPAREN
    320312                | LPAREN ASTERISK index_list RPAREN
    321313                | LPAREN WORD RPAREN
    322314                | LPAREN ASTERISK RPAREN
     315    '''
     316    if len(p) == 5:
     317        p[0] = p[1]+",".join([p[2]]+p[3])+p[4]
     318    else:
     319        p[0] = p[1]+p[2]+p[3]
     320
     321def p_param_template(p):
     322    '''param_template : LBRACKET WORD index_list RBRACKET
     323                | LBRACKET ASTERISK index_list RBRACKET
     324                | LBRACKET WORD RBRACKET
     325                | LBRACKET ASTERISK RBRACKET
    323326    '''
    324327    if len(p) == 5:
     
    339342            | WORDWITHINDEX
    340343            | WORDWITHSQUOTEDINDEX
    341             | WORDWITHDQUOTEDINDEX
    342344            | NONWORD
    343345            | STRING
     
    353355            | RPAREN
    354356            | ASTERISK
    355             | template
     357            | set_template
     358            | param_template
    356359    '''
    357360    if p[1][0] == '"' and len(p[1]) > 2 and p[1][-1] == '"' and not ' ' in p[1]:
     
    365368                | QUOTEDSTRING
    366369                | FILENAME
    367                 | WORD COLON FILENAME
    368370    '''
    369371    if len(p) == 2:
  • coopr.pyomo/trunk/coopr/pyomo/data/process_data.py

    r3017 r3019  
    154154        Called by _process_data to process data for a Parameter declaration
    155155        """
     156        #print 'x',cmd,_data
    156157        if pyomo.debug("reader"):               #pragma:nocover
    157158           print "DEBUG: _process_param(start)",cmd
     
    185186              if pyomo.debug("reader"):             #pragma:nocover
    186187                 print "DEBUG: _process_param (singledef without :...:=)",cmd
     188              cmd = _apply_templates(cmd)
     189              #print 'cmd',cmd
    187190              if not transpose:
    188191                 if pname not in _data:
     
    323326
    324327
     328def _apply_templates(cmd):
     329    cmd = _data_eval(cmd)
     330    template = []
     331    ilist = set()
     332    ans = []
     333    i = 0
     334    while i < len(cmd):
     335        #print i, len(cmd), cmd[i], ilist, template, ans
     336        if type(cmd[i]) is tuple and '*' in cmd[i]:
     337            j = i
     338            tmp=list(cmd[j])
     339            nindex = len(tmp)
     340            template=tmp
     341            ilist = set()
     342            for kk in range(len(tmp)):
     343                if tmp[kk] == '*':
     344                    ilist.add(kk)
     345        elif len(ilist) == 0:
     346            ans.append(cmd[i])
     347        else:
     348            for kk in range(len(template)):
     349                if kk in ilist:
     350                    ans.append(cmd[i])
     351                    i += 1
     352                else:
     353                    ans.append(template[kk])
     354            ans.append(cmd[i])
     355        i += 1
     356    return ans
     357                   
     358           
     359           
     360
    325361def _process_data_list(dim, cmd):
    326362        """
     
    365401             continue
    366402          tmp = None
    367           if "(" in val and ")" in val:
     403          tval = val.strip()
     404          if (tval[0] == "(" and tval[-1] == ")") or (tval[0] == '[' and tval[-1] == ']'):
    368405             vals = []
    369              tval = val[1:-1]
     406             tval = tval[1:-1]
    370407             for item in tval.split(","):
    371408               tmp=_data_eval([item])
     
    541578        raise e
    542579    data.close()
    543     print "Y",_data
    544580    data.process(_model, _data, _default)
    545     #print "Y",_data
    546581       
    547582   
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/data8.dat

    r2310 r3019  
    11param A := False;
    22param B := True;
    3 set Z := foo[*] bar [ * ] bar[1,*,a,*] foo-bar hello-goodbye ;
    4 set Z[A] := foo[*] bar [ * ] bar[1,*,a,*] foo-bar hello-goodbye ;
     3set Z := foo[*] bar[ * ] bar[1,*,a,*] foo-bar hello-goodbye ;
     4set Z[A] := foo[*] bar[ * ] bar[1,*,a,*] foo-bar hello-goodbye ;
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_param.py

    r2998 r3019  
    615615        self.failUnlessEqual( self.instance.B['dd'], -14)
    616616
     617    def test_io10(self):
     618        OUTPUT=open("param.dat","w")
     619        print >>OUTPUT, "data;"
     620        print >>OUTPUT, "set A1 := a b c d e f g h i j k l ;"
     621        print >>OUTPUT, "set A2 := 2 4 6 ;"
     622        print >>OUTPUT, "param B :="
     623        print >>OUTPUT, " [*,2,*] a b 1 c d 2 e f 3"
     624        print >>OUTPUT, " [*,4,*] g h 4 i j 5"
     625        print >>OUTPUT, " [*,6,*] k l 6"
     626        print >>OUTPUT, ";"
     627        print >>OUTPUT, "end;"
     628        OUTPUT.close()
     629        self.model.A1=Set()
     630        self.model.A2=Set()
     631        self.model.B=Param(self.model.A1,self.model.A2,self.model.A1)
     632        self.instance = self.model.create("param.dat")
     633        self.failUnlessEqual( set(self.instance.B.keys()), set([('e', 2, 'f'), ('c', 2, 'd'), ('a', 2, 'b'), ('i', 4, 'j'), ('g', 4, 'h'), ('k', 6, 'l')]))
     634
    617635
    618636class TestParamError(PyomoModel):
Note: See TracChangeset for help on using the changeset viewer.