Changeset 2461


Ignore:
Timestamp:
Mar 26, 2010 6:23:43 PM (9 years ago)
Author:
jwatson
Message:

Tweaks to PH output to optionally suppress (via the --report-only-statistics option) individual scenario solution values - just report summary statistics. Immensely useful when running problems with hundreds of scenarios.

Location:
coopr.pysp/trunk/coopr/pysp
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • coopr.pysp/trunk/coopr/pysp/ef.py

    r2458 r2461  
    512512   scenario_data_directory_name = instance_directory
    513513
    514    if verbose_output is True:
    515       print "Initializing extensive form writer"
    516       print ""
     514   print "Loading scenario and instance data"
    517515
    518516   #
     
    575573   # validate the tree prior to doing anything serious
    576574   #
    577    print ""
    578575   if scenario_tree.validate() is False:
    579576      print "***Scenario tree is invalid****"
     
    582579      if verbose_output is True:
    583580         print "Scenario tree is valid!"
    584    print ""
    585581
    586582   #
     
    614610      scenario_instance = None
    615611
    616       print "Creating instance for scenario=" + scenario._name
     612      if verbose_output is True:
     613         print "Creating instance for scenario=" + scenario._name
    617614
    618615      try:
     
    645642      gc.enable()
    646643
    647    print ""
     644   print "Creating extensive form binding instance"
    648645
    649646   binding_instance = create_ef_instance(scenario_tree, scenario_instances,
     
    653650                                         risk_alpha = risk_alpha)   
    654651
    655    print ""
    656652   print "Starting to write extensive form"
    657653
    658654   write_ef(binding_instance, scenario_instances, output_filename)   
    659655
    660    print ""
    661656   print "Output file written to file=",output_filename
    662657
    663    print ""
    664    print "Done..."
    665 
    666658   end_time = time.time()
    667659
    668    print ""
    669660   print "Total execution time=%8.2f seconds" %(end_time - start_time)
    670    print ""
    671661
    672662   return scenario_tree, binding_instance, scenario_instances
     
    678668   binding_instance = create_ef_instance(scenario_tree, scenario_instances)
    679669
    680    print ""
    681670   print "Starting to write extensive form"
    682671
    683672   write_ef(binding_instance, scenario_instances, output_filename)
    684673
    685    print ""
    686674   print "Output file written to file=",output_filename
    687675
    688    print ""
    689    print "Done..."
    690 
    691676   end_time = time.time()
    692677
    693    print ""
    694678   print "Total execution time=%8.2f seconds" %(end_time - start_time)
    695    print ""
    696679
    697680#
  • coopr.pysp/trunk/coopr/pysp/ph.py

    r2446 r2461  
    369369      self._report_solutions = False # do I report solutions after each PH iteration?
    370370      self._report_weights = False # do I report PH weights prior to each PH iteration?
     371      self._report_only_statistics = False # do I report only variable statistics when outputting solutions and weights?
    371372      self._output_continuous_variable_stats = True # when in verbose mode, do I output weights/averages for continuous variables?
    372373      self._output_solver_results = False
     
    485486            self._report_solutions = kwds[key]
    486487         elif key == "report_weights":
    487             self._report_weights = kwds[key]                       
     488            self._report_weights = kwds[key]
     489         elif key == "report_only_statistics":
     490            self._report_only_statistics = kwds[key]                                   
    488491         elif key == "output_times":
    489492            self._output_times = kwds[key]
     
    11511154      if (self._verbose is True) or (self._report_solutions is True):
    11521155         print "Variable values following scenario solves:"
    1153          self.pprint(False,False,True,False)
     1156         self.pprint(False, False, True, False, output_only_statistics=self._report_only_statistics)
    11541157
    11551158      # let plugins know if they care.
     
    12031206         if (self._verbose is True) or (self._report_weights is True):
    12041207            print "Variable averages and weights prior to scenario solves:"
    1205             self.pprint(True,True,False,False)
     1208            self.pprint(True, True, False, False, output_only_statistics=self._report_only_statistics)
    12061209
    12071210         # with the introduction of piecewise linearization, the form of the
     
    12221225         if (self._verbose is True) or (self._report_solutions is True):
    12231226            print "Variable values following scenario solves:"
    1224             self.pprint(False,False,True,False)
     1227            self.pprint(False, False, True, False, output_only_statistics=self._report_only_statistics)
    12251228
    12261229         # we don't technically have to do this at the last iteration,
     
    12991302
    13001303      print "Final variable values:"
    1301       self.pprint(False,False,True,True)         
     1304      self.pprint(False, False, True, True, output_only_statistics=self._report_only_statistics)         
    13021305
    13031306      print "Final costs:"
     
    13521355   # inputs are booleans indicating which components should be output.
    13531356   #
    1354    def pprint(self, output_averages, output_weights, output_values, output_fixed):
     1357   def pprint(self, output_averages, output_weights, output_values, output_fixed, output_only_statistics=False):
    13551358
    13561359      if self._initialized is False:
     
    14301433                                    print "\t\t\tIndex:", indexToString(index)                             
    14311434
    1432                               print "\t\t\t\tTree Node="+tree_node._name+"\t\t (Scenarios: ",                             
    1433                               for scenario in tree_node._scenarios:
    1434                                  print scenario._name," ",
    1435                                  if scenario == tree_node._scenarios[-1]:
    1436                                     print ")"
     1435                              print "\t\t\t\tTree Node="+tree_node._name,
     1436                              if output_only_statistics is False:
     1437                                 print "\t\t (Scenarios: ",                             
     1438                                 for scenario in tree_node._scenarios:
     1439                                    print scenario._name," ",
     1440                                    if scenario == tree_node._scenarios[-1]:
     1441                                       print ")"
    14371442                           
    14381443                              if output_values is True:
    14391444                                 average_value = tree_node._averages[variable_name][index]()
    1440                                  print "\t\t\t\tValues: ",                       
     1445                                 if output_only_statistics is False:
     1446                                    print "\t\t\t\tValues: ",                       
    14411447                                 for scenario in tree_node._scenarios:
    14421448                                    instance = self._instances[scenario._name]
    14431449                                    this_value = getattr(instance,variable_name)[index].value
    1444                                     print "%12.4f" % this_value,
     1450                                    if output_only_statistics is False:
     1451                                       print "%12.4f" % this_value,
    14451452                                    if scenario == tree_node._scenarios[-1]:
    1446                                        print "    Max-Min=%12.4f" % (maximum_value-minimum_value),
    1447                                        print "    Avg=%12.4f" % (average_value),
     1453                                       if output_only_statistics is True:
     1454                                          # there technically isn't any good reason not to always report
     1455                                          # the min and max; the only reason we're not doing this currently
     1456                                          # is to avoid updating our regression test baseline output.
     1457                                          print "    Min=%12.4f" % (minimum_value),
     1458                                          print "    Avg=%12.4f" % (average_value),                                         
     1459                                          print "    Max=%12.4f" % (maximum_value),
     1460                                       else:
     1461                                          print "    Max-Min=%12.4f" % (maximum_value-minimum_value),
     1462                                          print "    Avg=%12.4f" % (average_value),
    14481463                                       print ""
    14491464                              if output_weights:
     
    14701485            print "\t\tCost Variable=" + cost_variable_name + indexToString(cost_variable_index)           
    14711486         for tree_node in stage._tree_nodes:
    1472             print "\t\t\tTree Node=" + tree_node._name + "\t\t (Scenarios: ",
    1473             for scenario in tree_node._scenarios:
    1474                print scenario._name," ",
    1475                if scenario == tree_node._scenarios[-1]:
    1476                   print ")"
     1487            print "\t\t\tTree Node=" + tree_node._name,
     1488            if output_only_statistics is False:
     1489               print "\t\t (Scenarios: ",
     1490               for scenario in tree_node._scenarios:
     1491                  print scenario._name," ",
     1492                  if scenario == tree_node._scenarios[-1]:
     1493                     print ")"
    14771494            maximum_value = 0.0
    14781495            minimum_value = 0.0
     
    14801497            num_values = 0
    14811498            first_time = True
    1482             print "\t\t\tValues: ",                       
     1499            if output_only_statistics is False:
     1500               print "\t\t\tValues: ",
     1501            else:
     1502               print "\t\t\t",
    14831503            for scenario in tree_node._scenarios:
    14841504                instance = self._instances[scenario._name]
    14851505                this_value = getattr(instance,cost_variable_name)[cost_variable_index].value
    1486                 print "%12.4f" % this_value,
     1506                if output_only_statistics is False:
     1507                   print "%12.4f" % this_value,
    14871508                num_values += 1
    14881509                sum_values += this_value
     
    14971518                      minimum_value = this_value
    14981519                if scenario == tree_node._scenarios[-1]:
    1499                    print "    Max-Min=%12.4f" % (maximum_value-minimum_value),
    1500                    print "    Avg=%12.4f" % (sum_values/num_values),
     1520                   if output_only_statistics is True:
     1521                      print "    Min=%12.4f" % (minimum_value),
     1522                      print "    Avg=%12.4f" % (sum_values/num_values),                                         
     1523                      print "    Max=%12.4f" % (maximum_value),
     1524                   else:
     1525                      print "    Max-Min=%12.4f" % (maximum_value-minimum_value),
     1526                      print "    Avg=%12.4f" % (sum_values/num_values),
    15011527                   print ""
    15021528           
  • coopr.pysp/trunk/coopr/pysp/phinit.py

    r2446 r2461  
    5454                     dest="report_solutions",
    5555                     default=False)
     56   parser.add_option("--report-weights",
     57                     help="Always report PH weights prior to each iteration. Enabled if --verbose is enabled. Default is False.",
     58                     action="store_true",
     59                     dest="report_weights",
     60                     default=False)
     61   parser.add_option("--report-only-statistics",
     62                     help="When reporting solutions (if enabled), only output per-variable statistics - not the individual scenario values. Default is False.",
     63                     action="store_true",
     64                     dest="report_only_statistics",
     65                     default=False)
    5666   parser.add_option("--output-scenario-tree-solution",
    5767                     help="Report the full solution (even leaves) in scenario tree format upon termination. Values represent averages, so convergence is not an issue. Default is False.",
    5868                     action="store_true",
    5969                     dest="output_scenario_tree_solution",
    60                      default=False)
    61    parser.add_option("--report-weights",
    62                      help="Always report PH weights prior to each iteration. Enabled if --verbose is enabled. Default is False.",
    63                      action="store_true",
    64                      dest="report_weights",
    6570                     default=False)
    6671   parser.add_option("--model-directory",
     
    487492                           report_solutions=options.report_solutions, \
    488493                           report_weights=options.report_weights, \
     494                           report_only_statistics=options.report_only_statistics, \
    489495                           output_times=options.output_times, \
    490496                           disable_warmstarts=options.disable_warmstarts,
  • coopr.pysp/trunk/coopr/pysp/scenariotree.py

    r2454 r2461  
    1414import os.path
    1515import traceback
     16
     17from math import fabs
    1618
    1719from coopr.pyomo import *
     
    737739   #
    738740
    739    def pprintSolution(self):
     741   def pprintSolution(self, epsilon=1.0e-5):
    740742
    741743      print "----------------------------------------------------"         
     
    759761               # if this is a singleton variable, then it should necessarily be active -
    760762               # otherwise, it wouldn't be referenced in the stage!!!
    761                print "\t\t"+variable.name+"="+str(solution_variable[None]())
     763               value = solution_variable[None]()
     764               if fabs(value) > epsilon:
     765                  print "\t\t"+variable.name+"="+str(value)
    762766            else:
    763767               for index in indices:
    764768                  if solution_variable[index].active is True:
    765                      print "\t\t"+variable.name+indexToString(index)+"="+str(solution_variable[index]())
     769                     value = solution_variable[index]()
     770                     if fabs(value) > epsilon:
     771                        print "\t\t"+variable.name+indexToString(index)+"="+str(value)
    766772         print ""           
    767773
Note: See TracChangeset for help on using the changeset viewer.