-
Notifications
You must be signed in to change notification settings - Fork 34
Description
I would like to assess a cosmological model (implemented into CLASS) using Cobaya and PolyChord. Eventually, it should run on a cluster, but for initial testing I was hoping to use my MacBook Air (M4).
When I run Cobaya with
sampler:
polychord: {}it should use the default values
write_resume: True
read_resume: True
write_stats: True
write_live: True
write_dead: True
write_prior: Trueyet, the only output that gets created are the following files/folders:
.updated.yaml.input.yaml_clusters/an empty folder_polychord_raw/a folder containing an empty folderclusters/and the file_phys_live.txt
Would the other files (stats, resume, dead, prior) only get created when a specific threshold with live points is found or should those get created right on launching the run? How could I investigate what prevents the creation? I doubt it's a permission issue, since two folders and one file are successfully created.
I had some issues installing PolyChord and solved them by just hard-coding the correct compiler into setup.py. Maybe this broke something?
I manually added
env["HOME"] = os.environ.get("HOME", os.path.expanduser("~"))to CustomBuildPy and forced check_compiler to return gcc-15, as this is the gcc version I used to compile MPI.
"""
Python interface to PolyChord
Polychord is a tool to solve high dimensional problems.
"""
from setuptools import setup, Extension, find_packages, Distribution
from setuptools.command.build_py import build_py as _build_py
from distutils.command.clean import clean as _clean
import os, sys, subprocess, shutil
import numpy
def check_compiler(default_CC="gcc"):
"""Checks what compiler is being used (clang, intel, or gcc)."""
CC = default_CC if "CC" not in os.environ else os.environ["CC"]
CC_version = (
subprocess.check_output([CC, "-v"], stderr=subprocess.STDOUT)
.decode("utf-8")
.lower()
)
if "clang" in CC_version:
CC_family = "clang"
elif "icc" in CC_version:
CC_family = "intel"
elif "gcc" in CC_version:
CC_family = "gcc"
else:
print("Warning: unrecognised compiler: {}".format(CC_version))
CC_family = ""
CC_family = "gcc-15"
return CC_family
NAME = "pypolychord"
DOCLINES = (__doc__ or "").split("\n")
# Deal with annoying differences between clang and the other compilers
CC_FAMILY = check_compiler()
CPPRUNTIMELIB_FLAG = []
RPATH_FLAG = []
if CC_FAMILY == "clang":
CPPRUNTIMELIB_FLAG += ["-stdlib=libc++"]
if sys.platform == "darwin":
# macOS idiosyncrasies
CPPRUNTIMELIB_FLAG += ["-mmacosx-version-min=10.9"]
if sys.platform != "darwin":
# Set RPATH on Linux machines
RPATH_FLAG += ["-Wl,-rpath,$ORIGIN/pypolychord/lib"]
def readme():
with open("pypolychord_README.rst") as f:
return f.read()
def get_version(short=False):
with open("src/polychord/feedback.f90") as f:
for line in f:
if "version" in line:
return line[44:50]
class DistributionWithOption(Distribution, object):
def __init__(self, *args, **kwargs):
self.global_options = self.global_options + [
("no-mpi", None, "Don't compile with MPI support."),
("debug-flags", None, "Compile in debug mode."),
]
self.no_mpi = None
self.debug_flags = None
super(DistributionWithOption, self).__init__(*args, **kwargs)
class CustomBuildPy(_build_py, object):
def run(self):
env = {}
env["HOME"] = os.environ.get("HOME", os.path.expanduser("~"))
env["PATH"] = os.environ["PATH"]
if self.distribution.no_mpi is None:
env["MPI"] = "1"
# These need to be set so that build_ext uses the right compilers
cc_compiler = (
subprocess.check_output(["make", "print_CC"]).decode("utf-8").strip()
)
os.environ["CC"] = cc_compiler
cxx_compiler = (
subprocess.check_output(["make", "print_CXX"]).decode("utf-8").strip()
)
os.environ["CXX"] = cxx_compiler
else:
env["MPI"] = "0"
if self.distribution.debug_flags is not None:
self.distribution.ext_modules[0].extra_compile_args += ["-g", "-O0"]
env["DEBUG"] = "1"
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
env["PWD"] = BASE_PATH
env.update({k: os.environ[k] for k in ["CC", "CXX", "FC"] if k in os.environ})
subprocess.check_call(["make", "-e", "libchord.so"], env=env, cwd=BASE_PATH)
if not os.path.isdir("pypolychord/lib/"):
os.makedirs(os.path.join(BASE_PATH, "pypolychord/lib/"))
shutil.copy(
os.path.join(BASE_PATH, "lib/libchord.so"),
os.path.join(BASE_PATH, "pypolychord/lib/"),
)
self.run_command("build_ext")
return super(CustomBuildPy, self).run()
class CustomClean(_clean):
def run(self):
subprocess.run(["make", "veryclean"], check=True, env=os.environ)
return super().run()
if "--no-mpi" in sys.argv:
NAME += "_nompi"
DOCLINES[1] = DOCLINES[1] + " (cannot be used with MPI)"
pypolychord_module = Extension(
name="_pypolychord",
library_dirs=["lib"],
include_dirs=["src/polychord", numpy.get_include()],
libraries=[
"chord",
],
extra_link_args=RPATH_FLAG + CPPRUNTIMELIB_FLAG,
extra_compile_args=["-std=c++11"] + RPATH_FLAG + CPPRUNTIMELIB_FLAG,
runtime_library_dirs=["lib"],
sources=["pypolychord/_pypolychord.cpp"],
)
setup(
name=NAME,
version=get_version(),
description="Python interface to PolyChord " + get_version(),
url="https://ccpforge.cse.rl.ac.uk/gf/project/polychord/",
author="Will Handley",
author_email="wh260@cam.ac.uk",
license="PolyChord",
packages=find_packages(),
install_requires=["numpy", "scipy"],
extras_require={"plotting": "getdist"},
distclass=DistributionWithOption,
ext_modules=[pypolychord_module],
cmdclass={"build_py": CustomBuildPy, "clean": CustomClean},
package_data={"": ["lib/libchord.so"]},
include_package_data=True,
zip_safe=False,
)