source: coopr.opt/trunk/coopr/opt/results/results.py @ 2259

Last change on this file since 2259 was 2109, checked in by wehart, 12 years ago

Changing the API of the SolutionSet? object. Now, all variables, constraints, etc
can be indexed with 1-based integer indices (rather than 0-based). This change
makes this object consistent with the 1-based indexing API supported by Pyomo.

File size: 5.7 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__all__ = ['SolverResults']
12
13import sys
14from container import *
15from pyutilib.enum import Enum
16from pyutilib.misc import Bunch
17import copy
18
19import StringIO
20
21import problem
22import solver
23import solution
24
25
26try:
27    import yaml
28    yaml_available=True
29except ImportError:
30    yaml_available=False
31
32
33class SolverResults(MapContainer):
34
35    undefined = undefined
36    default_print_options = solution.default_print_options
37
38    def __init__(self):
39        MapContainer.__init__(self)
40        self._sections = []
41        self.symbol_map = None
42        self._descriptions = {}
43        self.add('problem', ListContainer(problem.ProblemInformation), False, "Problem Information")
44        self.add('solver', ListContainer(solver.SolverInformation), False, "Solver Information")
45        self.add('solution', solution.SolutionSet(), False, "Solution Information")
46
47    def add(self, name, value, active, description):
48        self.declare(name, value=value, active=active)
49        tmp = self._convert(name)
50        self._sections.append(tmp)
51        self._descriptions[tmp]=description
52
53    def _repn_(self, option):
54        if not option.schema and not self._active and not self._required:
55            return ignore
56        tmp = {}
57        for key in self._sections:
58            rep = dict.__getitem__(self, key)._repn_(option)
59            if not rep == ignore:
60                tmp[key] = rep
61        return tmp
62
63    def Xwrite(self, **kwds):
64        if 'ostream' in kwds:
65            ostream = kwds['ostream']
66            del kwds['ostream']
67        else:
68            ostream = sys.stdout
69        if 'filename' in kwds:
70            OUTPUT=open(kwds['filename'],"w")
71            del kwds['filename']
72            kwds['ostream']=OUTPUT
73            self.write(**kwds)
74            OUTPUT.close()
75            return
76
77        option = copy.copy(solution.default_print_options)
78        for key in kwds:
79            setattr(option,key,kwds[key])
80
81        repn = self._repn_(option)
82        print >>ostream, "# =========================================================="
83        print >>ostream, "# = Solver Results                                         ="
84        print >>ostream, "# =========================================================="
85        for item in repn:
86            key = item.keys()[0]
87            print >>ostream, "# ----------------------------------------------------------"
88            print >>ostream, "#   %s" % self._descriptions[key]
89            print >>ostream, "# ----------------------------------------------------------"
90            #print repr(item)
91            yaml.dump(item, ostream, default_flow_style=False) 
92
93    def write(self, **kwds):
94        if 'ostream' in kwds:
95            ostream = kwds['ostream']
96            del kwds['ostream']
97        else:
98            ostream = sys.stdout
99        if 'filename' in kwds:
100            OUTPUT=open(kwds['filename'],"w")
101            del kwds['filename']
102            kwds['ostream']=OUTPUT
103            self.write(**kwds)
104            OUTPUT.close()
105            return
106
107        option = copy.copy(SolverResults.default_print_options)
108        for key in kwds:
109            setattr(option,key,kwds[key])
110
111        repn = self._repn_(option)
112        print >>ostream, "# =========================================================="
113        print >>ostream, "# = Solver Results                                         ="
114        print >>ostream, "# =========================================================="
115        for i in xrange(len(self._order)):
116            key = self._order[i]
117            if not key in repn:
118                continue
119            item = dict.__getitem__(self,key)
120            print >>ostream, ""
121            print >>ostream, "# ----------------------------------------------------------"
122            print >>ostream, "#   %s" % self._descriptions[key]
123            print >>ostream, "# ----------------------------------------------------------"
124            print >>ostream, key+":",
125            if isinstance(item, ListContainer):
126                item.pprint(ostream, option, prefix="", repn=repn[key])
127            else:
128                item.pprint(ostream, option, prefix="  ", repn=repn[key])
129
130    def read(self, **kwds):
131        if not yaml_available:
132            raise IOError, "Aborting SolverResults.read() because PyYAML is not installed!"
133
134        if 'istream' in kwds:
135            istream = kwds['istream']
136            del kwds['istream']
137        else:
138            ostream = sys.stdin
139        if 'filename' in kwds:
140            INPUT=open(kwds['filename'],"r")
141            del kwds['filename']
142            kwds['istream']=INPUT
143            self.read(**kwds)
144            INPUT.close()
145            return
146
147        repn = yaml.load(istream, Loader=yaml.SafeLoader)
148        for i in xrange(len(self._order)):
149            key = self._order[i]
150            if not key in repn:
151                continue
152            item = dict.__getitem__(self,key)
153            item.load(repn[key])
154       
155    def __repr__(self):
156        return str(self._repn_(default_print_options))
157
158    def __str__(self):
159        ostream = StringIO.StringIO()
160        option=default_print_options
161        self.pprint(ostream, option, repn=self._repn_(option))
162        return ostream.getvalue()
163
164 
165
166       
167
168
169if __name__ == '__main__':
170    results = SolverResults()
171    results.write(schema=True)
172    #print results
Note: See TracBrowser for help on using the repository browser.