source: coopr.pyomo/stable/2.2/coopr/pyomo/io/ampl.py @ 2194

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

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

........

r2122 | wehart | 2010-01-02 23:44:52 -0700 (Sat, 02 Jan 2010) | 2 lines


Adding methods to clear objective/constraint data.

........

r2125 | wehart | 2010-01-03 17:00:33 -0700 (Sun, 03 Jan 2010) | 10 lines


Extended collection of linear terms to ignore identity expressions in a
ProductExpression?.


Misc documentation update in Pyomo.


If there is no rule, then Constraint.construct() does _not_ clear the constraint
set. This had the unfortunate side-effect that user-added constraints are
cleared!

........

r2128 | wehart | 2010-01-03 23:59:03 -0700 (Sun, 03 Jan 2010) | 4 lines


Adding the @set_options decorator, which can be used
to specify options for temporary sets that are defined by
index functions.

........

r2129 | jwatson | 2010-01-04 15:41:02 -0700 (Mon, 04 Jan 2010) | 7 lines


I have changed the setitem interface for the variable base class to allow invocations of the following form:


var[None] = some_value


In cases where the variable Var is a singleton, i.e., non-indexed. This slight abuse of syntax is extremely useful in PH (and anywhere else where we have automated manipulation of variable values), as it avoids the needs for around 15 if-then statements.

........

r2130 | jwatson | 2010-01-04 16:03:42 -0700 (Mon, 04 Jan 2010) | 3 lines


Mirroring previous commit for singleton (non-indexed) parameters, allowing set via param[None].

........

r2133 | wehart | 2010-01-07 08:03:46 -0700 (Thu, 07 Jan 2010) | 2 lines


A draft implementation of expressions for intrinsic functions.

........

r2142 | wehart | 2010-01-11 18:47:07 -0700 (Mon, 11 Jan 2010) | 2 lines


Bug fix. Parameter indices do not have a keys() attribute.

........

r2145 | wehart | 2010-01-11 22:03:47 -0700 (Mon, 11 Jan 2010) | 6 lines


A stab at refactoring the pyomo command-line script, to make
it easier to write related scripts.


Unfortunately, I started doing this with a Jython installation, which
has some issues running PyUtilib?. Thus, this is not well-tested.

........

r2146 | wehart | 2010-01-11 22:19:42 -0700 (Mon, 11 Jan 2010) | 2 lines


Other updates from my laptop...

........

r2147 | wehart | 2010-01-11 22:44:35 -0700 (Mon, 11 Jan 2010) | 2 lines


Fixing bugs

........

r2148 | wehart | 2010-01-11 23:16:37 -0700 (Mon, 11 Jan 2010) | 2 lines


Bug fixes and pyomo command tests.

........

r2159 | wehart | 2010-01-13 14:59:23 -0700 (Wed, 13 Jan 2010) | 2 lines


Updates to reconfigure how files are written out by Pyomo.

........

r2160 | wehart | 2010-01-13 16:09:28 -0700 (Wed, 13 Jan 2010) | 6 lines


Adding the pyomo2lp and pyomo2nl commands.
Setting up the convert.py module, which is used in these commands.
Various fixes to scripting utilities: fixed management of
traceback functions, and reworked the processing of the save_model
option.

........

r2161 | jwatson | 2010-01-13 22:38:15 -0700 (Wed, 13 Jan 2010) | 3 lines


Cut the run-time of the PyomoModel? _load_solution method by 2/3 - it's still taking too long, but even this improvement is noticeable.

........

r2163 | wehart | 2010-01-19 22:08:40 -0700 (Tue, 19 Jan 2010) | 2 lines


Adding diagnostic output.

........

r2166 | jwatson | 2010-01-24 13:51:15 -0700 (Sun, 24 Jan 2010) | 5 lines


Allowing PyomoModel? to load a solver results object with a status equal to "Warning" - the old version threw an exception if the solver status wasn't OK.


The new version does print a warning message indicating that you are loading a solver with a warning, and that the user should take a look.

........

r2170 | wehart | 2010-01-25 16:35:49 -0700 (Mon, 25 Jan 2010) | 6 lines


A rework of the NL/LP file writers. This now uses the
canonical expression representation. I'm pretty sure that the LP writer
is OK, but much less sure about the NL writer. Also, it's clear that we don't
have adequate tests of the writers to ensure that all different types of
models are written correctly.

........

File size: 12.9 KB
Line 
1#  _________________________________________________________________________
2#
3#  Coopr: A COmmon Optimization Python Repository
4#  Copyright (c) 2008 Sandia Corporation.
5#  This software is distributed under the BSD License.
6#  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
7#  the U.S. Government retains certain rights in this software.
8#  For more information, see the Coopr README.txt file.
9#  _________________________________________________________________________
10
11#
12# AMPL Problem Writer Plugin
13#
14
15from coopr.opt import ProblemFormat, WriterFactory
16from coopr.pyomo.base.numtypes import minimize, maximize
17from coopr.pyomo.base import *
18from coopr.opt.base import *
19from coopr.pyomo.base.param import _ParamValue
20from coopr.pyomo.base.var import _VarBase
21
22class ProblemWriter_nl(AbstractProblemWriter):
23
24    def __init__(self):
25        AbstractProblemWriter.__init__(self,ProblemFormat.nl)
26
27    def __call__(self, model, filename):
28        if filename is None:
29           filename = model.name + ".nl"
30        OUTPUT=open(filename,"w")
31        symbol_map = self._print_model_NL(model,OUTPUT)
32        OUTPUT.close()
33        return filename, symbol_map
34
35    def _get_bound(self, exp):
36        if isinstance(exp,expr._IdentityExpression):
37           return self._get_bound(exp._args[0])
38        elif isinstance(exp,NumericConstant):
39           return exp.value
40        elif isinstance(exp,_ParamValue):
41           return exp.value
42        else:
43           raise ValueError, "ERROR: nonconstant bound: " + str(exp)
44           return None
45
46    def _print_model_NL(self,model, OUTPUT, verbose=False):
47
48        # maps NL variables to the "real" variable names in the problem.
49        # it's really NL variable ordering, as there are no variable names
50        # in the NL format. however, we by convention make them go from
51        # x0 upward.
52        symbol_map = {}
53
54        #
55        # Collect statistics
56        #
57        nc = no = neqn = nrange = 0
58        Obj = model.active_components(Objective)
59        Con = model.active_components(Constraint)
60        Vars = model.active_components(Var)
61        #
62        # Count number of objectives
63        #
64        for obj in Obj:
65            if Obj[obj].trivial:
66                continue
67            for i in Obj[obj]:
68                if not is_constant(Obj[obj][i].repn):
69                    no += 1
70        #
71        # Count number of constraints
72        #
73        for con in Con:
74            C = Con[con]
75            if C.trivial:
76                continue
77            for i in C:
78                if is_constant(C[i].repn):
79                    continue
80                nc += 1
81                if C[i].lower is not None:
82                    L = self._get_bound(C[i].lower) if C[i].lower is not None else -inf
83                    U = self._get_bound(C[i].upper) if C[i].upper is not None else inf
84                    if (L == U):
85                        neqn += 1
86                elif L > U:
87                    raise ValueError, "Constraint " + str(con) +\
88                                             "[" + str(i) + "]: lower bound = " + str(L) +\
89                                             " > upper bound = " + str(U)
90                elif C[i].lower is not None and C[i].upper is not None:
91                    nrange += 1
92        #
93        icv = 0
94        Ilist = []
95        Blist = []
96        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]))
131        #
132        # Print Header
133        #
134        # LINE 1
135        #
136        print >>OUTPUT,"g3 1 1 0\t# problem",model.name
137        #
138        # LINE 2
139        #
140        print >>OUTPUT, " " + str(model.statistics.number_of_variables), nc, no, nrange, str(neqn) +\
141                "\t# vars, constraints, objectives, ranges, eqns"
142        #
143        # LINE 3
144        #
145        print >>OUTPUT, " 0 0\t# nonlinear constraints, objectives"
146        #
147        # LINE 4
148        #
149        print >>OUTPUT, " 0 0\t# network constraints: nonlinear, linear"
150        #
151        # LINE 5
152        #
153        print >>OUTPUT, " 0 0 0\t# nonlinear vars in constraints, objectives, both"
154        #
155        # LINE 6
156        #
157        print >>OUTPUT, " 0 0 0 1\t# linear network variables; functions; arith, flags"
158        #
159        # LINE 7
160        #
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
172        print >>OUTPUT, " " + str(nbv), niv, 0, 0,\
173                "0\t# discrete variables: binary, integer, nonlinear (b,c,o)"
174        #
175        # LINE 8
176        #
177        nsno = model.statistics.number_of_variables
178        ngc = ngo = 0
179        # Compute # of nonzeros in gradient
180        for key in Obj:
181            if Obj[key].trivial:
182                continue
183            for ondx in Obj[key]:
184                ngo += len(Obj[key][ondx].repn.get(1,{}))
185        # Compute # of nonzeros in Jacobian
186        cu = {}
187        for i in xrange(nsno):
188                cu[i] = 0
189        for key in Con:
190            C = Con[key]
191            if C.trivial:
192                continue
193            for cndx in C:
194                for d in C[cndx].repn.get(1,{}):
195                    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
204        print >>OUTPUT, " " + str(ngc), str(ngo) + "\t# nonzeros in Jacobian, gradients"
205        #
206        # LINE 9
207        #
208        print >>OUTPUT, " 0 0\t# max name lengths: constraints, variables"
209        #
210        # LINE 10
211        #
212        print >>OUTPUT, " 0 0 0 0 0\t# common exprs: b,c,o,c1,o1"
213        #
214        # "C" lines
215        #
216        nc = 0
217        for key in Con:
218            if Con[key].trivial:
219                continue
220            for ndx in Con[key]:
221                if is_constant(Con[key][ndx].repn):
222                    continue
223                print >>OUTPUT, "C" + str(nc) + "\t#" + str(key) + "[" + str(ndx) + "]"
224                nc += 1
225                print >>OUTPUT, "n0"
226        #
227        # "O" lines
228        #
229        no = 0
230        for key in Obj:
231            k = 0
232            if Obj[key].sense == maximize:
233                k = 1
234            for ndx in Obj[key]:
235                if is_constant(Obj[key][ndx].repn):
236                    continue
237                print >>OUTPUT, "O" + str(no) + " "+str(k)+"\t#" + str(key) + "[" + str(ndx) + "]"
238                no += 1
239                if 0 in Obj[key][ndx].repn:
240                    print >>OUTPUT, "n" + str(Obj[key][ndx].repn[0][None])
241                else:
242                    print >>OUTPUT, "n0"
243        #
244        # "r" lines
245        #
246        print >>OUTPUT, "r"
247        nc=0
248        for key in Con:
249            if Con[key].trivial:
250                continue
251            C = Con[key]
252            for ndx in C:
253                if is_constant(C[ndx].repn):
254                    continue
255                if 0 in C[ndx].repn:
256                    offset=C[ndx].repn[0][None]
257                else:
258                    offset=0
259                if C[ndx]._equality:
260                    print >>OUTPUT, "4", self._get_bound(C[ndx].lower)-offset,
261                else:
262                    if C[ndx].lower is None:
263                        if C[ndx].upper is None:
264                            print >>OUTPUT,"3",
265                        else:
266                            print >>OUTPUT,"1", self._get_bound(C[ndx].upper)-offset,
267                    else:
268                        if C[ndx].upper is None:
269                            print >>OUTPUT,"2", self._get_bound(C[ndx].lower)-offset,
270                        else:
271                            print >>OUTPUT,"0",\
272                                    self._get_bound(C[ndx].lower)-offset,\
273                                    self._get_bound(C[ndx].upper)-offset,
274                print >>OUTPUT, " # c"+ str(nc)+"  "+str(key) + "[" + str(ndx) + "]"
275                symbol_map["c" + str(nc)] = str(key) + "[" + str(ndx) + "]"
276                nc += 1
277        #
278        # "b" lines
279        #
280        print >>OUTPUT, "b"
281        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
315                nv += 1
316        #
317        # "k" lines
318        #
319        n1 = model.statistics.number_of_variables - 1
320        print >>OUTPUT, "k" + str(n1)
321        ktot = 0
322        for i in xrange(n1):
323                ktot += cu[i]
324                print >>OUTPUT, ktot
325        #
326        # "J" lines
327        #
328        nc = 0
329        for key in Con:
330            if Con[key].trivial:
331                continue
332            con = Con[key]
333            for ndx in con:
334                if is_constant(con[ndx].repn):
335                    continue
336                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]
347        #
348        # "G" lines
349        #
350        no = 0
351        for key in Obj:
352            if Obj[key].trivial:
353                continue
354            obj = Obj[key]
355            for ndx in obj:
356                linear = obj[ndx].repn.get(1,{})
357                print >>OUTPUT, "G" + str(no), len(linear)
358                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]
367
368        return symbol_map
369
370problem.WriterRegistration(str(ProblemFormat.nl), ProblemWriter_nl)
371
Note: See TracBrowser for help on using the repository browser.