diff --git a/cpu/cpujit.py b/cpu/cpujit.py index 36edade180a63153577376cf40e33f1ee2c2f610..42d5caa10aac83b3b6e71582e722da62955f6646 100644 --- a/cpu/cpujit.py +++ b/cpu/cpujit.py @@ -72,10 +72,11 @@ import numpy as np from appdirs import user_config_dir, user_cache_dir from ctypes import cdll from pystencils.backends.cbackend import generate_c, get_headers -from collections import OrderedDict, Mapping +from collections import OrderedDict from pystencils.transformations import symbol_name_to_variable_name from pystencils.data_types import to_ctypes, get_base_type, StructType from pystencils.field import FieldType +from pystencils.utils import recursive_dict_update def make_python_function(kernel_function_node, argument_dict={}): @@ -133,16 +134,6 @@ def set_compiler_config(config): _config = config.copy() -def _recursive_dict_update(d, u): - for k, v in u.items(): - if isinstance(v, Mapping): - r = _recursive_dict_update(d.get(k, {}), v) - d[k] = r - else: - d[k] = u[k] - return d - - def get_configuration_file_path(): config_path_in_home = os.path.join(user_config_dir('pystencils'), 'config.json') @@ -200,7 +191,7 @@ def read_config(): if config_exists: with open(config_path, 'r') as jsonConfigFile: loaded_config = json.load(jsonConfigFile) - config = _recursive_dict_update(config, loaded_config) + config = recursive_dict_update(config, loaded_config) else: create_folder(config_path, True) json.dump(config, open(config_path, 'w'), indent=4) diff --git a/utils.py b/utils.py index 439cc944e91a1018656d01895b30d5c9ac4ff09b..57abda2630ec6023d8594c58e6aed052a3888399 100644 --- a/utils.py +++ b/utils.py @@ -1,3 +1,5 @@ +from typing import Mapping + class DotDict(dict): """Normal dict with additional dot access for all keys""" @@ -13,3 +15,22 @@ def all_equal(iterator): except StopIteration: return True return all(first == rest for rest in iterator) + + +def recursive_dict_update(d, u): + """Updates the first dict argument, using second dictionary recursively. + + Examples: + >>> d = {'sub_dict': {'a': 1, 'b': 2}, 'outer': 42} + >>> u = {'sub_dict': {'a': 5, 'c': 10}, 'outer': 41, 'outer2': 43} + >>> recursive_dict_update(d, u) + {'sub_dict': {'a': 5, 'b': 2, 'c': 10}, 'outer': 41, 'outer2': 43} + """ + d = d.copy() + for k, v in u.items(): + if isinstance(v, Mapping): + r = recursive_dict_update(d.get(k, {}), v) + d[k] = r + else: + d[k] = u[k] + return d