1 | # _________________________________________________________________________ |
---|
2 | # |
---|
3 | # Coopr: A COmmon Optimization Python Repository |
---|
4 | # Copyright (c) 2009 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 | import sys |
---|
13 | import os |
---|
14 | from optparse import OptionParser |
---|
15 | |
---|
16 | import pyutilib.services |
---|
17 | import textwrap |
---|
18 | import traceback |
---|
19 | import cProfile |
---|
20 | import pstats |
---|
21 | import gc |
---|
22 | |
---|
23 | from coopr.pysp.ef import * |
---|
24 | |
---|
25 | # |
---|
26 | # utility method to construct an option parser for ef writer arguments |
---|
27 | # |
---|
28 | |
---|
29 | def construct_ef_writer_options_parser(usage_string): |
---|
30 | |
---|
31 | parser = OptionParser() |
---|
32 | parser.add_option("--verbose", |
---|
33 | help="Generate verbose output, beyond the usual status output. Default is False.", |
---|
34 | action="store_true", |
---|
35 | dest="verbose", |
---|
36 | default=False) |
---|
37 | parser.add_option("--model-directory", |
---|
38 | help="The directory in which all model (reference and scenario) definitions are stored. Default is \".\".", |
---|
39 | action="store", |
---|
40 | dest="model_directory", |
---|
41 | type="string", |
---|
42 | default=".") |
---|
43 | parser.add_option("--instance-directory", |
---|
44 | help="The directory in which all instance (reference and scenario) definitions are stored. Default is \".\".", |
---|
45 | action="store", |
---|
46 | dest="instance_directory", |
---|
47 | type="string", |
---|
48 | default=".") |
---|
49 | parser.add_option("--generate-weighted-cvar", |
---|
50 | help="Add a weighted CVaR term to the primary objective", |
---|
51 | action="store_true", |
---|
52 | dest="generate_weighted_cvar", |
---|
53 | default=False) |
---|
54 | parser.add_option("--cvar-weight", |
---|
55 | help="The weight associated with the CVaR term in the risk-weighted objective formulation. Default is 1.0.", |
---|
56 | action="store", |
---|
57 | dest="cvar_weight", |
---|
58 | type="float", |
---|
59 | default=1.0) |
---|
60 | parser.add_option("--risk-alpha", |
---|
61 | help="The probability threshold associated with cvar (or any future) risk-oriented performance metrics. Default is 0.95.", |
---|
62 | action="store", |
---|
63 | dest="risk_alpha", |
---|
64 | type="float", |
---|
65 | default=0.95) |
---|
66 | parser.add_option("--output-file", |
---|
67 | help="Specify the name of the extensive form output file", |
---|
68 | action="store", |
---|
69 | dest="output_file", |
---|
70 | type="string", |
---|
71 | default="efout.lp") |
---|
72 | parser.add_option("--profile", |
---|
73 | help="Enable profiling of Python code. The value of this option is the number of functions that are summarized.", |
---|
74 | action="store", |
---|
75 | dest="profile", |
---|
76 | default=0) |
---|
77 | parser.add_option("--disable-gc", |
---|
78 | help="Disable the python garbage collecter. Default is False.", |
---|
79 | action="store_true", |
---|
80 | dest="disable_gc", |
---|
81 | default=False) |
---|
82 | parser.usage=usage_string |
---|
83 | |
---|
84 | return parser |
---|
85 | |
---|
86 | def run_ef_writer(options, args): |
---|
87 | |
---|
88 | # if the user enabled the addition of the weighted cvar term to the objective, |
---|
89 | # then validate the associated parameters. |
---|
90 | generate_weighted_cvar = False |
---|
91 | cvar_weight = None |
---|
92 | risk_alpha = None |
---|
93 | |
---|
94 | if options.generate_weighted_cvar is True: |
---|
95 | |
---|
96 | generate_weighted_cvar = True |
---|
97 | cvar_weight = options.cvar_weight |
---|
98 | risk_alpha = options.risk_alpha |
---|
99 | |
---|
100 | write_ef_from_scratch(os.path.expanduser(options.model_directory), |
---|
101 | os.path.expanduser(options.instance_directory), |
---|
102 | os.path.expanduser(options.output_file), |
---|
103 | options.verbose, |
---|
104 | generate_weighted_cvar, cvar_weight, risk_alpha) |
---|
105 | |
---|
106 | def run(args=None): |
---|
107 | |
---|
108 | # |
---|
109 | # Top-level command that executes the extensive form writer. |
---|
110 | # This is segregated from run_ef_writer to enable profiling. |
---|
111 | # |
---|
112 | |
---|
113 | # |
---|
114 | # Parse command-line options. |
---|
115 | # |
---|
116 | try: |
---|
117 | options_parser = construct_ef_writer_options_parser("efwriter [options]") |
---|
118 | (options, args) = options_parser.parse_args(args=args) |
---|
119 | except SystemExit: |
---|
120 | # the parser throws a system exit if "-h" is specified - catch |
---|
121 | # it to exit gracefully. |
---|
122 | return |
---|
123 | |
---|
124 | if options.disable_gc is True: |
---|
125 | gc.disable() |
---|
126 | else: |
---|
127 | gc.enable() |
---|
128 | |
---|
129 | if options.profile > 0: |
---|
130 | # |
---|
131 | # Call the main ef writer with profiling. |
---|
132 | # |
---|
133 | tfile = pyutilib.services.TempfileManager.create_tempfile(suffix=".profile") |
---|
134 | tmp = cProfile.runctx('run_ef_writer(options,args)',globals(),locals(),tfile) |
---|
135 | p = pstats.Stats(tfile).strip_dirs() |
---|
136 | p.sort_stats('time', 'cum') |
---|
137 | options.profile = eval(options.profile) |
---|
138 | p = p.print_stats(options.profile) |
---|
139 | p.print_callers(options.profile) |
---|
140 | p.print_callees(options.profile) |
---|
141 | p = p.sort_stats('cum','calls') |
---|
142 | p.print_stats(options.profile) |
---|
143 | p.print_callers(options.profile) |
---|
144 | p.print_callees(options.profile) |
---|
145 | p = p.sort_stats('calls') |
---|
146 | p.print_stats(options.profile) |
---|
147 | p.print_callers(options.profile) |
---|
148 | p.print_callees(options.profile) |
---|
149 | pyutilib.services.TempfileManager.clear_tempfiles() |
---|
150 | ans = [tmp, None] |
---|
151 | else: |
---|
152 | # |
---|
153 | # Call the main EF writer without profiling. |
---|
154 | # |
---|
155 | ans = run_ef_writer(options, args) |
---|
156 | |
---|
157 | gc.enable() |
---|
158 | |
---|
159 | return ans |
---|
160 | |
---|