from globals import * from time import time from time import strftime as stime from support import list_to_string as ls class timer(): def __init__(self): self.origin = time() self.pred = self.origin self.curr = self.origin def lap(self): self.curr = time() elapsed = round(self.curr - self.pred,2) self.pred = time() #we don't take self.curr for more precision return str(elapsed) def empty_lap(self): self.cur = time() def print_elapsed(self): return(self.lap()+"s (global: "+str(round(time()-self.origin,2))+")") def reset(self): self = timer() def global_time(self): return time()-self.origin time_record = timer() def pprint(message): print(message) print(time_record.print_elapsed()) print() def reset_timer(): time_record.reset() def empty_time_lap(): time_record.empty_lap() def max_time_not_reached(): return time_record.global_time() < max_global_time class writer(): def __init__(self,name=None): if name==None: self.name = stime("%d")+"-"+stime("%m")+"-"+stime("%Y")+"_"+stime("%H")+'h'+stime("%M") else: self.name = name self.full = self.name+".log" def write(self,message,id=None): file = open(self.full,"a") if id==None: file.write(message+"\n") else: file.write(ls(id)+": "+message+"\n") file.close() def write_timed(self,message,id=None): file = open(self.full,"a") if id==None: file.write(message+" "+"["+time_record.print_elapsed()+"] " + "\n") else: file.write(ls(id)+": "+message+" "+"["+time_record.print_elapsed()+"] " + "\n") file.close() def write_spaced(self,message,id=None): file = open(self.full,"a") if id==None: file.write("\n") file.write(message+"\n") # file.write("\n") else: file.write("\n") file.write(ls(id)+": "+message+"\n") # file.write("\n") file.close() def write_timed_spaced(self,message,id=None): file = open(self.full,"a") if id==None: file.write("\n") file.write(message+" "+time_record.print_elapsed()+"["+time_record.print_elapsed()+"] "+"\n") # file.write("\n") else: file.write("\n") file.write(ls(id)+": "+message+" "+time_record.print_elapsed()+"["+time_record.print_elapsed()+"] " +"\n") # file.write("\n") file.close() def title(self,name): empty_time_lap() file = open(self.full,"a") file.write("\n") file.write("\n") file.write("\n") file.write("++++++++++ "+name+"\n") file.write("\n") file.close() def subtitle(self,name,id=None): empty_time_lap() file = open(self.full,"a") if id==None: file.write("\n") file.write("+++++ "+name+"\n") # file.write("\n") else: file.write("\n") file.write("+++++ "+ls(id)+": "+name+"\n") # file.write("\n") file.close() def declare(self,value,name): self.write(name+": "+str(value)) def write_globals(self): self.title("globals") self.declare(eps,"epsilon") self.declare(max_column_generation_count,"max number of column generation loops") self.declare(max_unmoving_count,"maximum number of consecutive column generation loops without significant movement of the objective function before we cut the branch") self.declare(max_depth,"max depth of search tree") self.declare(max_time_for_shrinking,"maximum time spent for graph shrinking") self.declare(max_size_for_shrinking,"maximum size of a set that can be shrunk") self.declare(max_global_time,"maximum time spent for the cvrp solving") self.declare(vals,"threshold values iteratively used for the connected components heuristic") class empty_writer(): #empty class used as a trick that will allow the main threads calling writer to not verify the state if debug boolean. def __init__(self,name=None): if name==None: self.name = stime("%d")+"-"+stime("%m")+"-"+stime("%Y")+"_"+stime("%H")+'h'+stime("%M") else: self.name = name self.full = self.name+".log" def write(self,message,id=None): return def write_timed(self,message,id=None): return def write_spaced(self,message,id=None): return def write_timed_spaced(self,message,id=None): return def title(self,name): return def subtitle(self,name,id=None): return def declare(self,value,name): return def write_globals(self): return class mixed_writer(): def __init__(self,name=None): if name==None: self.name = stime("%d")+"-"+stime("%m")+"-"+stime("%Y")+"_"+stime("%H")+'h'+stime("%M") else: self.name = name self.full = self.name+".log" def write(self,message,id=None): file = open(self.full,"a") if id==None: file.write(message+"\n") else: file.write(ls(id)+": "+message+"\n") file.close() def write_timed(self,message,id=None): file = open(self.full,"a") if id==None: file.write(message+" "+"["+time_record.print_elapsed()+"] " + "\n") else: file.write(ls(id)+": "+message+" "+"["+time_record.print_elapsed()+"] " + "\n") file.close() def write_spaced(self,message,id=None): file = open(self.full,"a") if id==None: file.write("\n") file.write(message+"\n") # file.write("\n") else: file.write("\n") file.write(ls(id)+": "+message+"\n") # file.write("\n") file.close() def write_timed_spaced(self,message,id=None): file = open(self.full,"a") if id==None: file.write("\n") file.write(message+" "+time_record.print_elapsed()+"["+time_record.print_elapsed()+"] "+"\n") # file.write("\n") else: file.write("\n") file.write(ls(id)+": "+message+" "+time_record.print_elapsed()+"["+time_record.print_elapsed()+"] " +"\n") # file.write("\n") file.close() def title(self,name): pprint("++++++++++ "+name) empty_time_lap() file = open(self.full,"a") file.write("\n") file.write("\n") file.write("\n") file.write("++++++++++ "+name+"\n") file.write("\n") file.close() def subtitle(self,name,id=None): if id==None: pprint("+++++ "+name) else: pprint("+++++ "+ls(id)+": "+name) empty_time_lap() file = open(self.full,"a") if id==None: file.write("\n") file.write("+++++ "+name+"\n") # file.write("\n")file.close() else: file.write("\n") file.write("+++++ "+ls(id)+": "+name+"\n") # file.write("\n") file.close() def declare(self,value,name): self.write(name+": "+str(value)) def write_globals(self): self.title("globals") self.declare(eps,"epsilon") self.declare(max_column_generation_count,"max number of column generation loops") self.declare(max_unmoving_count,"maximum number of consecutive column generation loops without significant movement of the objective function before we cut the branch") self.declare(max_depth,"max depth of search tree") self.declare(max_time_for_shrinking,"maximum time spent for graph shrinking") self.declare(max_size_for_shrinking,"maximum size of a set that can be shrunk") self.declare(max_global_time,"maximum time spent for the cvrp solving") self.declare(vals,"threshold values iteratively used for the connected components heuristic") class print_writer: def __init__(self,name=None): if name==None: self.name = stime("%d")+"-"+stime("%m")+"-"+stime("%Y")+"_"+stime("%H")+'h'+stime("%M") else: self.name = name self.full = self.name+".log" def write(self,message,id=None): return def write_timed(self,message,id=None): return def write_spaced(self,message,id=None): return def write_timed_spaced(self,message,id=None): return def title(self,name): pprint("++++++++++ "+name) def subtitle(self,name,id=None): if id==None: pprint("+++++ "+name) else: pprint("+++++ "+ls(id)+": "+name) empty_time_lap() def declare(self,value,name): return def write_globals(self): return if console_writing and logging : log = mixed_writer() elif not(console_writing) and logging: log = writer() elif console_writing and not(logging): log = print_writer() else: log = empty_writer()