Changeset 2217


Ignore:
Timestamp:
Jan 31, 2010 11:48:34 PM (10 years ago)
Author:
wehart
Message:

Update to NL file writer, after recent changes in the canonical representation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.pyomo/trunk/coopr/pyomo/io/ampl.py

    r2170 r2217  
    4444           return None
    4545
    46     def _print_model_NL(self,model, OUTPUT, verbose=False):
     46    def _print_model_NL(self, model, OUTPUT, verbose=False):
    4747
    4848        # maps NL variables to the "real" variable names in the problem.
     
    5858        Obj = model.active_components(Objective)
    5959        Con = model.active_components(Constraint)
    60         Vars = model.active_components(Var)
     60        Var = {}   # Dictionary of all variables used in all expressions in this model
    6161        #
    6262        # Count number of objectives
     
    6767            for i in Obj[obj]:
    6868                if not is_constant(Obj[obj][i].repn):
     69                    # Merge variables from this expression
     70                    Var.update( Obj[obj][i].repn[-1] )
    6971                    no += 1
    7072        #
     
    7880                if is_constant(C[i].repn):
    7981                    continue
     82                # Merge variables from this expression
     83                Var.update( C[i].repn[-1] )
    8084                nc += 1
    8185                if C[i].lower is not None:
     
    9195                    nrange += 1
    9296        #
    93         icv = 0
     97        niv = nbv = 0
    9498        Ilist = []
    9599        Blist = []
    96100        Vlist = []
    97         for var in Vars.values():
    98                 Vv = var._varval
    99                 if isinstance(var.domain, IntegerSet):
    100                   # print "Domain of", var._name, "= Integers"
    101                   for ndx in Vv:
    102                            if Vv[ndx].id >= 0:
    103                                     Ilist.append((var,ndx))
    104                 elif isinstance(var.domain, BooleanSet):
    105                   # print "Domain of", var._name, "= Boolean"
    106                   for ndx in Vv:
    107                            if Vv[ndx].id >= 0:
    108                               L = Vv[ndx].lb
    109                               U = Vv[ndx].ub
    110                               if L is not None and value(L) == 0 \
    111                                  and U is not None and value(U) == 1:
    112                                         Blist.append((var,ndx))
    113                               else:
    114                                         Ilist.append((var,ndx))
    115                 else:
    116                   # print "Domain of", var_.name, "is not discrete."
    117                   for ndx in Vv:
    118                            Vi = Vv[ndx]
    119                            if Vi.id >= 0:
    120                                     Vi.id = icv
    121                                     icv += 1
    122                                     Vlist.append((var,ndx))
    123         for x in Blist:
    124                 x[0][x[1]].id = icv
    125                 icv += 1
    126                 Vlist.append((x[0],x[1]))
    127         for x in Ilist:
    128                 x[0]._varval[x[1]].id = icv
    129                 icv += 1
    130                 Vlist.append((x[0],x[1]))
     101        keys = Var.keys()
     102        keys.sort()
     103        for ndx in keys:
     104            var = Var[ndx].var
     105            if isinstance(var.domain, IntegerSet):
     106                Ilist.append(ndx)
     107            elif isinstance(var.domain, BooleanSet):
     108                L = Var[ndx].lb
     109                U = Var[ndx].ub
     110                if L is not None and value(L) == 0 \
     111                    and U is not None and value(U) == 1:
     112                    Blist.append(ndx)
     113                else:
     114                    Ilist.append(ndx)
     115            else:
     116                Vlist.append(ndx)
     117        for ndx in Blist:
     118            nbv += 1
     119            Vlist.append(ndx)
     120        for ndxx in Ilist:
     121            niv += 1
     122            Vlist.append(ndx)
     123        #
     124        vctr=0
     125        var_id = {}
     126        for ndx in Vlist:
     127            var_id[ndx] = vctr
     128            vctr += 1
    131129        #
    132130        # Print Header
     
    138136        # LINE 2
    139137        #
    140         print >>OUTPUT, " " + str(model.statistics.number_of_variables), nc, no, nrange, str(neqn) +\
     138        print >>OUTPUT, " ",len(Var), nc, no, nrange, str(neqn) +\
    141139                "\t# vars, constraints, objectives, ranges, eqns"
    142140        #
     
    159157        # LINE 7
    160158        #
    161         niv = nbv = 0
    162         for var in Vars.values():
    163                 Vv = var._varval
    164                 if isinstance(var.domain, IntegerSet):
    165                   for i in Vv.keys():
    166                            if Vv[i].id >= 0:
    167                                     niv += 1
    168                 elif isinstance(var.domain, BooleanSet):
    169                   for i in Vv.keys():
    170                            if Vv[i].id >= 0:
    171                                     nbv += 1
    172159        print >>OUTPUT, " " + str(nbv), niv, 0, 0,\
    173160                "0\t# discrete variables: binary, integer, nonlinear (b,c,o)"
     
    175162        # LINE 8
    176163        #
    177         nsno = model.statistics.number_of_variables
     164        nsno = len(Var)
    178165        ngc = ngo = 0
    179166        # Compute # of nonzeros in gradient
     
    186173        cu = {}
    187174        for i in xrange(nsno):
    188                 cu[i] = 0
     175            cu[i] = 0
    189176        for key in Con:
    190177            C = Con[key]
     
    194181                for d in C[cndx].repn.get(1,{}):
    195182                    ngc += 1
    196                     cu[d.keys()[0]] += 1
    197                   #LT = C._linterm[cndx]
    198                   #print "HERE",LT.keys()
    199                   #for i in LT:
    200                            #print "HERE",i,type(LT[i]),LT[i],type(LT[i][1]),LT[i][1]
    201                            #if i != '0':
    202                               #ngc += 1
    203                               #cu[LT[i][1].id] += 1
     183                    cu[var_id[d.keys()[0]]] += 1
    204184        print >>OUTPUT, " " + str(ngc), str(ngo) + "\t# nonzeros in Jacobian, gradients"
    205185        #
     
    280260        print >>OUTPUT, "b"
    281261        nv=0
    282         for i in xrange(len(Vlist)):
    283                 vi = Vlist[i]
    284                 var = vi[0]
    285                 ndx = vi[1]
    286                 if isinstance(var.domain, BooleanSet):
    287                         print >>OUTPUT, "0 0 1",
    288                         print >>OUTPUT, " # v"+str(nv)+"  "+str(var)+"["+str(ndx)+"]"
    289                         nv += 1
    290                         continue
    291                 vv = var._varval[ndx]
    292                 L = vv.lb
    293                 U = vv.ub
    294                 if L is not None:
    295                   Lv = str(value(L))
    296                   if U is not None:
    297                            Uv = str(value(U))
    298                            if Lv == Uv:
    299                                     print >>OUTPUT, "4" , Lv,
    300                            else:
    301                                     print >>OUTPUT, "0", Lv, Uv,
    302                   else:
    303                            print >>OUTPUT, "2", Lv,
    304                 elif U is not None:
    305                   print >>OUTPUT, "1", str(value(U)),
    306                 else:
    307                   print >>OUTPUT, "3",
    308                 if ndx is not None:
    309                    print >>OUTPUT, " # v"+str(nv)+"  "+str(var)+"["+str(ndx)+"]"
    310                    symbol_map["v"+str(nv)] = (str(var)+"["+str(ndx)+"]")                   
    311                 else:
    312                    print >>OUTPUT, " # v"+str(nv)+"  "+str(var)
    313                    symbol_map["v"+str(nv)] = str(var)
    314 
     262        for ndx in Vlist:
     263            vv = Var[ndx]
     264            #vi = Vlist[i]
     265            var = vv.var
     266            #ndx = vi[1]
     267            if isinstance(var.domain, BooleanSet):
     268                print >>OUTPUT, "0 0 1",
     269                print >>OUTPUT, " # v"+str(nv)+"  "+vv.label
    315270                nv += 1
     271                continue
     272            L = vv.lb
     273            U = vv.ub
     274            if L is not None:
     275                Lv = str(value(L))
     276                if U is not None:
     277                    Uv = str(value(U))
     278                    if Lv == Uv:
     279                        print >>OUTPUT, "4" , Lv,
     280                    else:
     281                        print >>OUTPUT, "0", Lv, Uv,
     282                else:
     283                    print >>OUTPUT, "2", Lv,
     284            elif U is not None:
     285                print >>OUTPUT, "1", str(value(U)),
     286            else:
     287                print >>OUTPUT, "3",
     288            print >>OUTPUT, " # v"+str(nv)+"  "+vv.label
     289            symbol_map["v"+str(nv)] = vv.label
     290
     291            nv += 1
    316292        #
    317293        # "k" lines
    318294        #
    319         n1 = model.statistics.number_of_variables - 1
     295        n1 = len(Var) - 1
    320296        print >>OUTPUT, "k" + str(n1)
    321297        ktot = 0
     
    335311                    continue
    336312                linear = con[ndx].repn.get(1,{})
    337                 for id in linear:
    338                     print >>OUTPUT, id, linear[id]
    339                 #LT = C._linterm[cndx]
    340                 #LT_len = len(LT) - ('0' in LT)
    341                 #print >>OUTPUT, "J" + str(nc), LT_len
    342                 #nc += 1
    343                 #for x in LT:
    344                     #if x != '0':
    345                         #p = LT[x]
    346                         #print >>OUTPUT, p[1].id, p[0]
     313                print >>OUTPUT, "J" + str(nc), len(linear)
     314                nc += 1
     315
     316                for d in linear:
     317                    for id in d:
     318                        print >>OUTPUT, var_id[id], linear[d]
    347319        #
    348320        # "G" lines
     
    357329                print >>OUTPUT, "G" + str(no), len(linear)
    358330                no += 1
    359                 for id in linear:
    360                     print >>OUTPUT, id, linear[id]
    361                 #for j in OLT:
    362                     #LT = OLT[j]
    363                     #for x in LT:
    364                         #if x != '0':
    365                             #p = LT[x]
    366                             #print >>OUTPUT, p[1].id, p[0]
     331                for d in linear:
     332                    for id in d:
     333                        print >>OUTPUT, var_id[id], linear[d]
    367334
    368335        return symbol_map
Note: See TracChangeset for help on using the changeset viewer.