Beispiel #1
0
 def check_force_resume(cls, output, info=None):
     """
     Performs the necessary checks on existing files if resuming or forcing
     (including deleting some output files when forcing).
     """
     if not output:
         return
     resuming: Optional[bool]
     if mpi.is_main_process():
         resuming = False
         if output.force:
             cls.delete_output_files(output, info=info)
         elif any(find_with_regexp(regexp, root or output.folder) for (regexp, root)
                  in cls.output_files_regexps(output=output, info=info, minimal=True)):
             if output.is_resuming():
                 output.log.info("Found an old sample. Resuming.")
                 resuming = True
             else:
                 raise LoggedError(
                     output.log, "Delete the previous output manually, automatically "
                                 "('-%s', '--%s', '%s: True')" % (
                                     "force"[0], "force", "force") +
                                 " or request resuming ('-%s', '--%s', '%s: True')" % (
                                     "resume"[0], "resume", "resume"))
         else:
             if output.is_resuming():
                 output.log.info(
                     "Did not find an old sample. Cleaning up and starting anew.")
             # Clean up old files, and set resuming=False,
             # regardless of requested value
             cls.delete_output_files(output, info=info)
     else:
         resuming = None
     output.set_resuming(resuming)
Beispiel #2
0
    def delete_with_regexp(self, regexp, root=None):
        """
        Deletes all files compatible with the given `regexp`.

        If `regexp` is `None` and `root` is defined, deletes the `root` folder.
        """
        if root is None:
            root = self.folder
        if regexp is not None:
            file_names = find_with_regexp(regexp, root)
            if file_names:
                self.log.debug(
                    "From regexp %r in folder %r, deleting files %r",
                    regexp.pattern, root, file_names)
        else:
            file_names = [root]
            self.log.debug("Deleting folder %r", root)
        for f in file_names:
            try:
                os.remove(f)
            except IsADirectoryError:
                try:
                    shutil.rmtree(f)
                except:
                    raise
            except OSError:
                pass
Beispiel #3
0
    def delete_with_regexp(self, regexp, root=None):
        """
        Deletes all files compatible with the given `regexp`.

        If `regexp` is `None` and `root` is defined, deletes the `root` folder.
        """
        if root is None:
            root = self.folder
        if regexp is not None:
            file_names = find_with_regexp(regexp, root)
            if file_names:
                self.log.debug(
                    "From regexp %r in folder %r, deleting files %r", regexp.pattern,
                    root, file_names)
        else:
            file_names = [root]
            self.log.debug("Deleting folder %r", root)
        for f in file_names:
            self.delete_file_or_folder(f)
Beispiel #4
0
 def process_raw_output(self):
     """
     Loads the sample of live points from ``PolyChord``'s raw output and writes it
     (if ``txt`` output requested).
     """
     if is_main_process():
         self.log.info(
             "Loading PolyChord's results: samples and evidences.")
         self.dump_paramnames(self.raw_prefix)
         self.collection = self.save_sample(self.raw_prefix + ".txt", "1")
         # Load clusters, and save if output
         if self.pc_settings.do_clustering:
             self.clusters = {}
             clusters_raw_regexp = re.compile(
                 re.escape(self.pc_settings.file_root + "_") + r"\d+\.txt")
             cluster_raw_files = sorted(
                 find_with_regexp(clusters_raw_regexp,
                                  os.path.join(self.pc_settings.base_dir,
                                               self._clusters_dir),
                                  walk_tree=True))
             for f in cluster_raw_files:
                 i = int(f[f.rfind("_") + 1:-len(".txt")])
                 if self.output:
                     old_folder = self.output.folder
                     self.output.folder = self.clusters_folder
                 sample = self.save_sample(f, str(i))
                 if self.output:
                     self.output.folder = old_folder
                 self.clusters[i] = {"sample": sample}
         # Prepare the evidence(s) and write to file
         pre = "log(Z"
         active = "(Still active)"
         with open(self.raw_prefix + ".stats", "r",
                   encoding="utf-8-sig") as statsfile:
             lines = [l for l in statsfile.readlines() if l.startswith(pre)]
         for l in lines:
             logZ, logZstd = [
                 float(n.replace(active, ""))
                 for n in l.split("=")[-1].split("+/-")
             ]
             component = l.split("=")[0].lstrip(pre + "_").rstrip(") ")
             if not component:
                 self.logZ, self.logZstd = logZ, logZstd
             elif self.pc_settings.do_clustering:
                 i = int(component)
                 self.clusters[i]["logZ"], self.clusters[i][
                     "logZstd"] = logZ, logZstd
         self.log.debug(
             "RAW log(Z) = %g +/- %g ; RAW Z in [%.8g, %.8g] (68%% C.L. log-gaussian)",
             self.logZ, self.logZstd,
             *[np.exp(self.logZ + n * self.logZstd) for n in [-1, 1]])
         self._correct_unphysical_fraction()
         if self.output:
             out_evidences = dict(logZ=self.logZ, logZstd=self.logZstd)
             if getattr(self, "clusters", None):
                 out_evidences["clusters"] = {}
                 for i in sorted(list(self.clusters)):
                     out_evidences["clusters"][i] = dict(
                         logZ=self.clusters[i]["logZ"],
                         logZstd=self.clusters[i]["logZstd"])
             fname = os.path.join(self.output.folder,
                                  self.output.prefix + _evidence_extension)
             yaml_dump_file(fname,
                            out_evidences,
                            comment="log-evidence",
                            error_if_exists=False)
     # TODO: try to broadcast the collections
     # if get_mpi():
     #     bcast_from_0 = lambda attrname: setattr(self,
     #         attrname, get_mpi_comm().bcast(getattr(self, attrname, None), root=0))
     #     map(bcast_from_0, ["collection", "logZ", "logZstd", "clusters"])
     if is_main_process():
         self.log.info(
             "Finished! Raw PolyChord output stored in '%s', "
             "with prefix '%s'", self.pc_settings.base_dir,
             self.pc_settings.file_root)
         self.log.info(
             "log(Z) = %g +/- %g ; Z in [%.8g, %.8g] (68%% C.L. log-gaussian)",
             self.logZ, self.logZstd,
             *[np.exp(self.logZ + n * self.logZstd) for n in [-1, 1]])