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

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

Renaming TerminationStatus? to TerminationCondition?. This is a
more sensible description of this enum type.

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 range(0,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 range(0,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.