def get_final_paretos(self): # pull all non-expanded models in queue out and push into final # could also use spea2_list here, they should have same contents final = self.final + self.nsga2_list # generate final pareto fronts self.fitness_calc(final) final_list = selection.sortLogNondominated(final, len(final)) return final_list
def heap_select(self, heap_list, pop_count, fitness_calc): fitness_calc(heap_list) if self.use_nsga2: selected = selection.selNSGA2(heap_list, pop_count, nd='log') else: selected = selection.sortLogNondominated(heap_list, pop_count, True) selected = [ s for slist in selected for s in slist] # print("selected", selected) return selected
def heap_pop(self, heap_list, pop_count, fitness_calc): fitness_calc(heap_list) if self.use_nsga2: popped = selection.selNSGA2(heap_list, pop_count, nd='log') else: popped = selection.sortLogNondominated(heap_list, pop_count, True) popped = [ p for plist in popped for p in plist] # print("popped", popped) heap_list = [m for m in heap_list if not m in popped] if self.max_heap_size > 0 and len(heap_list) > self.max_heap_size: heap_list = heap_list[:self.max_heap_size] return popped, heap_list
def print_best(self, count, file=sys.stdout): print ("Best " + str(count) + " of " + str(len(self.final)), file=file) # self.fitness_calc(self.final) models = self.heap_select(self.final, count, self.fitness_calc) best = selection.sortLogNondominated(models, count) print (best[0][0].print_long_columns(), file=file) print ("-----------------------------------------------------------------------------------", file=file) cnt = 0 self.best_size = 0 self.best_err = 10000000000 self.best_r2 = 0 self.best_vari = 0 self.ave_size = 0 self.ave_err = 0 self.ave_r2 = 0 self.ave_vari = 0 for front in best: for m in front: if cnt >= count: break cnt += 1 print (" ", m.print_long(), file=file) if m.score < self.best_err: self.best_size = m.size() self.best_err = m.score self.best_r2 = m.r2 self.best_vari = m.evar self.ave_size += m.size() self.ave_err += m.score self.ave_r2 += m.r2 self.ave_vari += m.evar print ("", file=file) if cnt >= count: break self.ave_size /= float(count) self.ave_err /= float(count) self.ave_r2 /= float(count) self.ave_vari /= float(count) print ("-----------------------------------------------------------------------------------", file=file)
def finalize(self, nfronts=4): # finalization print ("\n\nFinalizing\n\n") # pull all non-expanded models in queue out and push into final # could also use spea2_list here, they should have same contents final = self.final + self.nsga2_list # generate final pareto fronts self.fitness_calc(final) final_list = selection.sortLogNondominated(final, len(final)) self.print_final_models(final_list, 128, self.logs["final"]) # print first 4 pareto fronts print ("Final Results") print (final_list[0][0].print_columns()) print ("-----------------------------------------------------------------------------------") for front in final_list[:nfronts]: for m in front: print (" ", m) print ("") print ("\n") print ("num peekd models: ", self.peekd_models) print ("num evald models: ", self.evald_models) print ("num peek evals: ", self.peek_nfev, self.peek_nfev * self.peek_npts) print ("num eval evals: ", self.eval_nfev, self.eval_nfev * self.eval_npts) print ("num total evals: ", self.peek_nfev * self.peek_npts + self.eval_nfev * self.eval_npts) # print ("\n\n", nx.info(self.GRAPH), "\n\n") # handle issue with extra stray node with parent_id == -2 (at end of nodes list) # del_n = [] # for n in nx.nodes_iter(self.GRAPH): # modl = self.memoizer.get_by_id(n) # if modl.score is None: # del_n.append(n) # for n in del_n: # self.GRAPH.remove_node(n) if self.workers > 0: print ("\n\nstopping workers") for proc in self.peek_procs: self.peek_in_queue.put(None) for proc in self.eval_procs: self.eval_in_queue.put(None) for proc in self.alge_procs: self.alge_in_queue.put(None) for proc in self.expd_procs: self.expd_in_queue.put(None) for proc in self.peek_procs: proc.join() for proc in self.eval_procs: proc.join() for proc in self.alge_procs: proc.join() for proc in self.expd_procs: proc.join() if self.remote_eval == True: self.ws.close() print ("\n\ndone\n\n") if self.log_details: for name, file_obj in self.logs.items(): if file_obj is not sys.stdout: file_obj.close()