def satisfied(self, sp): from optTune.MOTA_code import MOTA_subproblem assert isinstance(sp, MOTA_subproblem) sp_int = len(sp.PFA_history.gamma_hist) if sp_int <= self.averagingIterations: return False else: PFA_c = paretoArchive2D() for d in sp.PFA.designs: f1 = self.f1_transform(d.fv[0]) f2 = self.f2_transform(d.fv[1]) PFA_c.inspect_design( None, numpy.array([f1,f2]) ) PFA_prev = paretoArchive2D() PFA_prev_untransformed = sp.PFA_history.get_PFA_index(sp_int-self.averagingIterations-1, sp.PFA.__class__ ) f1_org = [ d.f1_val for d in PFA_prev_untransformed.designs] U_org = [ d.U_i for d in PFA_prev_untransformed.designs] for f1, U_i in zip(f1_org, U_org): f2 = sp.scalarize_utility_values(U_i).mean() PFA_prev.inspect_design( None, numpy.array([self.f1_transform(f1),self.f2_transform(f2)]) ) HV_ref = PFA_c.upper_bounds() HV_curr = PFA_c.hyper_volume(HV_ref) HV_prev = PFA_prev.hyper_volume(HV_ref) ratio = (HV_curr - HV_prev) / HV_curr if ratio < 0: print("ratio of HV improvement negative! pickle.dumps follows") print("PFA_c", pickle.dumps(PFA_c) ) print("self.PFAs[0]", pickle.dumps(self.PFAs[0]) ) raise RuntimeError, "ratio of HV improvement negative!" if ratio <= self.ratioThreshold: self.msg = "hyperVolume stagation occured : ratio %1.3f ( < %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False
def satisfied(self, opt): assert len(self.PFAs) <= opt.it PFA_c = paretoArchive2D() for d in opt.PFA.designs: f1 = self.f1_transform(d.fv[0]) f2 = self.f2_transform(d.fv[1]) PFA_c.inspect_design(None, numpy.array([f1, f2])) self.PFAs.append(PFA_c) if len(self.PFAs) > self.averagingIterations: del self.PFAs[0] if len(self.PFAs) < self.averagingIterations: return False else: HV_ref = PFA_c.upper_bounds() HV_curr = PFA_c.hyper_volume(HV_ref) HV_prev = self.PFAs[0].hyper_volume(HV_ref) ratio = (HV_curr - HV_prev) / HV_curr if ratio < 0: print("ratio of HV improvement negative! pickle.dumps follows") print("PFA_c", pickle.dumps(PFA_c)) print("self.PFAs[0]", pickle.dumps(self.PFAs[0])) raise RuntimeError, "ratio of HV improvement negative!" if ratio <= self.ratioThreshold: self.msg = "hyperVolume stagation occured : ratio %1.3f ( < %1.3f ) over %i iterations" % ( ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False
def satisfied(self, opt): assert len(self.PFAs) <= opt.it PFA_c = paretoArchive2D() for d in opt.PFA.designs: f1 = self.f1_transform(d.fv[0]) f2 = self.f2_transform(d.fv[1]) PFA_c.inspect_design( None, numpy.array([f1,f2]) ) self.PFAs.append(PFA_c) if len(self.PFAs) > self.averagingIterations: del self.PFAs[0] if len(self.PFAs) < self.averagingIterations: return False else: HV_ref = PFA_c.upper_bounds() HV_curr = PFA_c.hyper_volume(HV_ref) HV_prev = self.PFAs[0].hyper_volume(HV_ref) ratio = (HV_curr - HV_prev) / HV_curr if ratio < 0: print("ratio of HV improvement negative! pickle.dumps follows") print("PFA_c", pickle.dumps(PFA_c) ) print("self.PFAs[0]", pickle.dumps(self.PFAs[0]) ) raise RuntimeError, "ratio of HV improvement negative!" if ratio <= self.ratioThreshold: self.msg = "hyperVolume stagation occured : ratio %1.3f ( < %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False
def satisfied(self, sp): from optTune.MOTA_code import MOTA_subproblem assert isinstance(sp, MOTA_subproblem) sp_int = len(sp.PFA_history.gamma_hist) if sp_int <= self.averagingIterations: return False else: PFA_c = paretoArchive2D() for d in sp.PFA.designs: f1 = self.f1_transform(d.fv[0]) f2 = self.f2_transform(d.fv[1]) PFA_c.inspect_design(None, numpy.array([f1, f2])) PFA_prev = paretoArchive2D() PFA_prev_untransformed = sp.PFA_history.get_PFA_index( sp_int - self.averagingIterations - 1, sp.PFA.__class__) f1_org = [d.f1_val for d in PFA_prev_untransformed.designs] U_org = [d.U_i for d in PFA_prev_untransformed.designs] for f1, U_i in zip(f1_org, U_org): f2 = sp.scalarize_utility_values(U_i).mean() PFA_prev.inspect_design( None, numpy.array([self.f1_transform(f1), self.f2_transform(f2)])) HV_ref = PFA_c.upper_bounds() HV_curr = PFA_c.hyper_volume(HV_ref) HV_prev = PFA_prev.hyper_volume(HV_ref) ratio = (HV_curr - HV_prev) / HV_curr if ratio < 0: print("ratio of HV improvement negative! pickle.dumps follows") print("PFA_c", pickle.dumps(PFA_c)) print("self.PFAs[0]", pickle.dumps(self.PFAs[0])) raise RuntimeError, "ratio of HV improvement negative!" if ratio <= self.ratioThreshold: self.msg = "hyperVolume stagation occured : ratio %1.3f ( < %1.3f ) over %i iterations" % ( ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False
ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False if __name__ == '__main__': print('Testing optTune termination critera') terminator = hyperVolume_stagation(0.1, 5) class optClass: pass opt = optClass() opt.PFA = paretoArchive2D() PFA_hist = [] opt.it = 0 N = 5 while True: for i in range(N): f1 = numpy.random.rand() f2 = numpy.random.rand() if f1 + f2 < 0.5: f1 = 1 - f1 f2 = 1 - f2 opt.PFA.inspect_design(None, numpy.array([f1, f2])) opt.it = opt.it + 1 print(' it %i complete, HV(opt.PFA) %f' % (opt.it, opt.PFA.hyper_volume(numpy.array([1, 1]))))
print("self.PFAs[0]", pickle.dumps(self.PFAs[0]) ) raise RuntimeError, "ratio of HV improvement negative!" if ratio <= self.ratioThreshold: self.msg = "hyperVolume stagation occured : ratio %1.3f ( < %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations) return True else: #print(" hyperVolume yet to occur : ratio %1.3f ( limit %1.3f ) over %i iterations" % (ratio, self.ratioThreshold, self.averagingIterations ) ) return False if __name__ == '__main__': print('Testing optTune termination critera') terminator = hyperVolume_stagation(0.1, 5) class optClass: pass opt = optClass() opt.PFA = paretoArchive2D() PFA_hist = [] opt.it = 0 N = 5 while True: for i in range(N): f1 = numpy.random.rand() f2 = numpy.random.rand() if f1 + f2 < 0.5: f1 = 1 - f1 f2 = 1 - f2 opt.PFA.inspect_design( None, numpy.array([f1,f2]) ) opt.it = opt.it + 1 print(' it %i complete, HV(opt.PFA) %f' % (opt.it,opt.PFA.hyper_volume(numpy.array([1,1])) )) PFA_hist.append(opt.PFA.copy())