from util.logging import setupLogging, shutdownLogging
#from IPython.display import clear_output
from util.worker import worker

MKL_ENABLED = False
try:
    import mkl  #to limit multiprocessing (to get better control)
    MKL_ENABLED = True
except ModuleNotFoundError as error:
    MKL_ENABLED = False

#Experimental Setup
if __name__ == '__main__':
    logger = setupLogging()
    db = Database()
    db.loadFromJson(config.DATABASE_PATH)
    if (MKL_ENABLED):
        mkl.set_num_threads(
            1
        )  #disable mkl multiprocessing to get more control over the number of cores being used.
    taskList = []
    logger.info("Collect tasks that needs to be calculated")
    for optimizer in config.LIST_OF_OPTIMIZERS:
        for problem in config.LIST_OF_PROBLEMS:
            optimizerId = str(optimizer.__name__)
            problemId = str(problem.__name__)
            for k in range(config.K):
                if not db.exists(optimizerId, problemId, str(k)):
                    #optimizer().apply(problem(), config.MAX_EVALUATIONS)
                    taskList.append({
                        'optimizer': optimizer,