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
Exemple #2
0
    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