def run(self,): """ """ if self.simus_run: log.error('Pool has already been simulated.') return False n = self.simus_path.shape[0] log.info('Run simulations for %i different set of parameters' % n) log.info('Each set of parameters runs %s simulations' % self.n_simu) sys.stdout.flush() for i, (parameters, rows) in enumerate(self.simus_path.iterrows()): if self.verbose: pprogress((i) / n * 100) sys.stdout.flush() paramtree = self.paramtree measuretree = self.measuretree if isinstance(parameters, np.ndarray): parameters = parameters.tolist() names = list(map(lambda x: x[0], self.parameters)) for i, parameter in enumerate(parameters): if self.trees[i] == 'paramtree': paramtree.change_dic(names[i], parameter) elif self.trees[i] == 'measuretree': measuretree.change_dic(names[i], parameter) simu_path = os.path.join(self.multi_pool_path, rows['relpath']) pool_params = {'load': False, 'paramtree': paramtree, 'measuretree': measuretree, 'n_simu': self.n_simu, 'simu_path': simu_path, 'parallel': self.parallel, 'verbose': False } pool = Pool(**pool_params) pool.run() del pool gc.collect() if self.verbose: pprogress(-1) self.load_pools() log.info("Simulations are done") self.simus_run = True
def run(self): """ Run simulations """ if self.simus_run: log.error("Pool has already been simulated.") return False if self.parallel: def init_worker(): import signal signal.signal(signal.SIGINT, signal.SIG_IGN) ncore = multiprocessing.cpu_count() + 1 log.info("Parallel mode enabled: %i cores will be used to run %i simulations" % (ncore, self.n_simu)) pool = multiprocessing.Pool(processes=ncore, initializer=init_worker) i = 0 # Build arguments list simu_parameters = { "paramtree": self.paramtree, "measuretree": self.measuretree, "initial_plug": self.initial_plug, "verbose": False, "reduce_p": True, } arguments = zip( itertools.repeat(simu_parameters), itertools.repeat(self.simu_path), range(self.n_simu), itertools.repeat(self.digits), ) try: # Launch simulation if self.parallel: results = pool.imap_unordered(_run_one_simulation, arguments) else: results = map(_run_one_simulation, arguments) # Get unordered results and log progress for i in range(self.n_simu): result = next(results) if self.verbose: pprogress((i + 1) / self.n_simu * 100, "(%i / %i)" % (i + 1, self.n_simu)) if self.verbose: pprogress(-1) except KeyboardInterrupt: pool.terminate() pool.join() raise CanceledByUserException("Simulation has been canceled by user") for i in range(self.n_simu): fname = "simu_%s.h5" % (str(i).zfill(self.digits)) self.metaphases_path.append(os.path.join(self.simu_path, fname)) log.info("Pool simulations are done") self.simus_run = True