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)
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
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)
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]])