def calculateIntegrals(self): """ Calculate and store primal and dual integral values ... for every problem under 'PrimalIntegral' and 'DualIntegral' """ dualargs = dict(historytouse = Key.DualBoundHistory, boundkey = Key.DualBound) for testrun in self.getTestRuns(): # go through problems and calculate both primal and dual integrals for problemid in testrun.getProblemIds(): processplotdata = getProcessPlotData(testrun, problemid) # check for well defined data (may not exist sometimes) if processplotdata: try: testrun.addDataById(Key.PrimalIntegral, calcIntegralValue(processplotdata), problemid) logging.debug("Computed primal integral %.1f for problem %s, data %s" % (testrun.getProblemDataById(problemid, 'PrimalIntegral'), problemid, repr(processplotdata))) except AssertionError as e: logging.error("Error for primal bound on problem %s, list: %s" % (problemid, processplotdata)) processplotdata = getProcessPlotData(testrun, problemid, **dualargs) # check for well defined data (may not exist sometimes) if processplotdata: try: testrun.addDataById(Key.DualIntegral, calcIntegralValue(processplotdata, pwlinear = True), problemid) logging.debug("Computed dual integral %.1f for problem %s, data %s" % (testrun.getProblemDataById(problemid, 'DualIntegral'), problemid, repr(processplotdata))) except AssertionError as e: logging.error("Error for dual bound on problem %s, list: %s " % (problemid, processplotdata))
def calculateIntegrals(self,scale=False, lim=(None,None)): """ Calculate and store primal and dual integral values ... for every problem under 'PrimalIntegral' and 'DualIntegral' """ dualargs = dict(historytouse = Key.DualBoundHistory, xaftersolvekey = Key.DualBound) if self.validation is None: return for testrun in self.getTestRuns(): # go through problems and calculate both primal and dual integrals for problemid in testrun.getProblemIds(): problemname = testrun.getProblemDataById(problemid, Key.ProblemName) processplotdata = getProcessPlotData(testrun, problemid, reference = self.validation.getReferencePb(problemname),scale=scale, lim=lim) # check for well defined data (may not exist sometimes) if processplotdata: try: testrun.addDataById(Key.PrimalIntegral, calcIntegralValue(processplotdata), problemid) logger.debug("Computed primal integral %.1f for problem %s, data %s" % (testrun.getProblemDataById(problemid, 'PrimalIntegral'), problemid, repr(processplotdata))) except AssertionError: logger.error("Error for primal bound on problem %s, list: %s" % (problemid, processplotdata)) processplotdata = getProcessPlotData(testrun, problemid, reference = self.validation.getReferenceDb(problemname), scale=scale, lim=lim, **dualargs) # check for well defined data (may not exist sometimes) if processplotdata: try: testrun.addDataById(Key.DualIntegral, calcIntegralValue(processplotdata, pwlinear = True), problemid) logger.debug("Computed dual integral %.1f for problem %s, data %s" % (testrun.getProblemDataById(problemid, 'DualIntegral'), problemid, repr(processplotdata))) except AssertionError: logger.error("Error for dual bound on problem %s, list: %s " % (problemid, processplotdata))
def update_Axis(self, probnames, testruns): """ update method called every time a new instance was selected """ #self.resetAxis() # make up data for plotting method x = {} y = {} z = {} zx = {} kws = {} duallinekws = {} dualbarkws = {} baseline = 0 if len(probnames) == 1: self.updateStatus("Showing problem %s on %d test runs" % (probnames[0], len(testruns))) else: self.updateStatus("Showing mean over %d problems on %d test runs" % (len(probnames), len(testruns))) self.resetAxis() usenormalization = True showdualbound = True xmax = xmin = ymax = ymin = 0 labelorder = [] for testrun in testruns: testrunname = self.getTestrunName(testrun) if len(probnames) == 1: x[testrunname], y[testrunname] = getProcessPlotData( testrun, probnames[0], usenormalization, access="name") else: x[testrunname], y[testrunname] = getMeanIntegral(testrun, probnames, access="name") if not usenormalization and len(probnames) == 1: baseline = testrun.problemGetOptimalSolution(probnames[0]) y[testrunname] -= baseline xmax = max(xmax, max(x[testrunname])) ymax = max(ymax, max(y[testrunname])) ymin = min(ymin, min(y[testrunname])) print(y[testrunname]) print(y[testrunname][1:] - y[testrunname][:-1] > 0) if numpy.any(y[testrunname][1:] - y[testrunname][:-1] > 0): logging.warn( "Error: Increasing primal gap function on problems {}". format(probnames)) if showdualbound: arguments = { "historytouse": Key.DualBoundHistory, "boundkey": Key.DualBound } if len(probnames) == 1: zx[testrunname], z[testrunname] = getProcessPlotData( testrun, probnames[0], usenormalization, access="name", **arguments) else: zx[testrunname], z[testrunname] = getMeanIntegral( testrun, probnames, access="name", **arguments) # normalization requires negative dual gap if usenormalization: z[testrunname] = -numpy.array(z[testrunname]) ymin = min(ymin, min(z[testrunname])) duallinekws[testrunname] = dict(linestyle='dashed') dualbarkws = dict(alpha=0.1) # set special key words for the testrun kws[testrunname] = dict(alpha=0.1) labelorder.append(testrunname) # for now, only one color cycle exists #colormap = cm.get_cmap(name='spectral', lut=128) #self.axes.set_color_cycle([colormap(i) for i in numpy.linspace(0.1, 0.9, len(self.gui.getTestrunList()))]) # call the plot on the collected data self.primalpatches, self.primallines, _ = self.axisPlotForTestrunData( x, y, baseline=baseline, legend=False, labelsuffix=" (primal)", plotkw=kws, barkw=kws, labelorder=labelorder) if showdualbound: __, self.duallines, _ = self.axisPlotForTestrunData( zx, z, step=False, baseline=0, legend=False, labelsuffix=" (dual)", plotkw=duallinekws, barkw=dualbarkws, labelorder=labelorder) # set a legend and limits self.sc.axes.legend(fontsize=8) self.sc.axes.set_xlim( (xmin - 0.05 * (xmax - xmin), xmax + 0.05 * (xmax - xmin))) self.sc.axes.set_ylim( (ymin - 0.1 * (ymax - ymin), ymax + 0.1 * (ymax - ymin)), emit=True) self.sc.draw()