def get_citation_info(module, kind): folder = get_folder(module, kind, absolute=True) filename = os.path.join(folder, module + ".bibtex") try: with open(filename, "r") as f: lines = "".join(f.readlines()) except IOError: if not os.path.isdir(folder): lines = "[Module '%s.%s' not known.]" % (kind, module) else: lines = "[no citation information found]" return lines + "\n"
def get_default_info(module, kind): path_to_defaults = os.path.join(get_folder(module, kind), module + ".yaml") try: default_module_info = yaml_load_file(path_to_defaults) except IOError: # probably an external module default_module_info = {kind: {module: {}}} log.debug("Module %s:%s does not have a defaults file. " % (kind, module) + "Maybe it is an external module.") try: default_module_info[kind][module] except KeyError: log.error("The defaults file for '%s' should be structured " "as %s:%s:{[options]}.", module, kind, module) raise HandledException return default_module_info
def is_equal_info(info1, info2, strict=True, print_not_log=False): """ Compares two information dictionaries. Set ``strict=False`` (default: ``True``) to ignore options that would not affect the statistics of a posterior sample, including order of params/priors/likelihoods. """ if print_not_log: myprint = print else: myprint = log.info myname = inspect.stack()[0][3] ignore = set([]) if strict else set( [_debug, _debug_file, _resume, _path_install, _force_reproducible]) ignore_params = (set([]) if strict else set( [_p_label, _p_renames, _p_ref, _p_proposal, "min", "max"])) if set(info1).difference(ignore) != set(info2).difference(ignore): myprint(myname + ": different blocks or options: %r (old) vs %r (new)" % (set(info1).difference(ignore), set(info2).difference(ignore))) return False for block_name in info1: if block_name in ignore: continue block1, block2 = info1[block_name], info2[block_name] if not hasattr(block1, "keys"): if block1 != block2: myprint(myname + ": different option '%s'" % block_name) return False if block_name in [_sampler, _theory]: # Internal order does NOT matter if set(block1) != set(block2): myprint(myname + ": different [%s]" % block_name) return False # Anything to ignore? for k in block1: module_folder = get_folder(k, block_name, sep=".", absolute=False) try: ignore_k = getattr( import_module(module_folder, package=_package), "ignore_at_resume", {}) except ImportError: ignore_k = {} block1k, block2k = deepcopy(block1[k]), deepcopy(block2[k]) if not strict: for kignore in ignore_k: try: block1k.pop(kignore, None) block2k.pop(kignore, None) except: pass if recursive_odict_to_dict(block1k) != recursive_odict_to_dict( block2k): myprint(myname + ": different content of [%s:%s]" % (block_name, k)) return False elif block_name in [_params, _likelihood, _prior]: # Internal order DOES matter, but just up to 1st level f = list if strict else set if f(block1) != f(block2): myprint( myname + ": different [%s] or different order of them: %r vs %r" % (block_name, list(block1), list(block2))) return False for k in block1: block1k, block2k = deepcopy(block1[k]), deepcopy(block2[k]) if block_name == _params: # Unify notation block1k = expand_info_param(block1k) block2k = expand_info_param(block2k) if not strict: for kignore in ignore_params: try: block1k.pop(kignore, None) block2k.pop(kignore, None) except: pass # Fixed params, it doesn't matter if they are saved as derived for b in [block1k, block2k]: if _p_value in b: b.pop(_p_derived, None) if (recursive_odict_to_dict(block1k) != recursive_odict_to_dict(block2k)): myprint(myname + ": different content of [%s:%s]" % (block_name, k)) return False return True
def install(*infos, **kwargs): if not log.root.handlers: logger_setup() path = kwargs.get("path", ".") if not path: # See if we can get one (and only one) from infos paths = set( [p for p in [info.get(_path_install) for info in infos] if p]) if len(paths) == 1: path = paths[0] else: print("logging?") log.error( "No 'path' argument given and could not extract one (and only one) " "from the infos.") raise HandledException abspath = os.path.abspath(path) log.info("Installing modules at '%s'\n", abspath) kwargs_install = { "force": kwargs.get("force", False), "no_progress_bars": kwargs.get("no_progress_bars") } for what in (_code, _data): kwargs_install[what] = kwargs.get(what, True) spath = os.path.join(abspath, what) if kwargs_install[what] and not os.path.exists(spath): try: os.makedirs(spath) except OSError: log.error( "Could not create the desired installation folder '%s'", spath) raise HandledException failed_modules = [] for kind, modules in get_modules(*infos).items(): for module in modules: print(make_header(kind, module)) module_folder = get_folder(module, kind, sep=".", absolute=False) try: imported_module = import_module(module_folder, package=_package) except ImportError: if kind == _likelihood: info = (next(info for info in infos if module in info.get( _likelihood, {}))[_likelihood][module]) or {} if isinstance(info, string_types) or _external in info: log.warning( "Module '%s' is a custom likelihood. " "Nothing to do.\n", module) flag = False else: log.error("Module '%s' not recognized.\n" % module) failed_modules += ["%s:%s" % (kind, module)] continue is_installed = getattr(imported_module, "is_installed", None) if is_installed is None: log.info("Built-in module: nothing to do.\n") continue if is_installed(path=abspath, **kwargs_install): log.info("External module already installed.\n") if kwargs_install["force"]: log.info("Forcing re-installation, as requested.") else: log.info("Doing nothing.\n") continue try: success = imported_module.install(path=abspath, **kwargs_install) except: traceback.print_exception(*sys.exc_info(), file=sys.stdout) log.error( "An unknown error occurred. Delete the modules folder and try " "again. Notify the developers if this error persists.") success = False if success: log.info("Successfully installed!\n") else: log.error( "Installation failed! Look at the error messages above. " "Solve them and try again, or, if you are unable to solve, " "install this module manually.") failed_modules += ["%s:%s" % (kind, module)] continue # test installation if not is_installed(path=abspath, **kwargs_install): log.error( "Installation apparently worked, " "but the subsequent installation test failed! " "Look at the error messages above. " "Solve them and try again, or, if you are unable to solve, " "install this module manually.") failed_modules += ["%s:%s" % (kind, module)] if failed_modules: bullet = "\n - " log.error( "The installation (or installation test) of some module(s) has failed: " "%s\nCheck output of the installer of each module above " "for precise error info.\n", bullet + bullet.join(failed_modules)) raise HandledException
def install(*infos, **kwargs): path = kwargs.get("path", ".") abspath = os.path.abspath(path) kwargs_install = { "force": kwargs.get("force", False), "no_progress_bars": kwargs.get("no_progress_bars") } for what in (_code, _data): kwargs_install[what] = kwargs.get(what, True) spath = os.path.join(abspath, what) if kwargs_install[what] and not os.path.exists(spath): try: os.makedirs(spath) except OSError: log.error( "Could not create the desired installation folder '%s'", spath) raise HandledException failed_modules = [] for kind, modules in get_modules(*infos).items(): for module in modules: print(make_header(kind, module)) module_folder = get_folder(module, kind, sep=".", absolute=False) try: imported_module = import_module(module_folder, package=package) except ImportError: if kind == _likelihood: log.warn( "Module '%s' not recognised. Assuming it's a custom " "likelihood. Nothing to do.\n", module) else: log.error("Module '%s' not recognised.\n" % module) failed_modules += ["%s:%s" % (kind, module)] continue is_installed = getattr(imported_module, "is_installed", None) if is_installed is None: log.info("Built-in module: nothing to do.\n") continue if is_installed(path=abspath, **kwargs_install): log.info("External module already installed.\n") if kwargs_install["force"]: log.info("Forcing re-installation, as requested.") else: log.info("Doing nothing.\n") continue try: success = imported_module.install(path=abspath, **kwargs_install) except: traceback.print_exception(*sys.exc_info(), file=sys.stdout) log.error( "An unknown error occurred. Delete the modules folder and try " "again. Notify the developers if this error persists.") success = False if success: log.info("Successfully installed!\n") else: log.error( "Installation failed! Look at the error messages above. " "Solve them and try again, or, if you are unable to solve, " "install this module manually.") failed_modules += ["%s:%s" % (kind, module)] continue # test installation if not is_installed(path=abspath, **kwargs_install): log.error( "Installation apparently worked, " "but the subsequent installation test failed! " "Look at the error messages above. " "Solve them and try again, or, if you are unable to solve, " "install this module manually.") failed_modules += ["%s:%s" % (kind, module)] if failed_modules: log.error( "The instalation (or installation test) of some module(s) has failed: " "%r. Check output above.\n", failed_modules) raise HandledException