in lm_human_preferences/utils/hyperparams.py [0:0]
def override_from_dict(self, flat_dict, separator='.'):
"""Overrides values from a dict like {'x.y': 1, 'name': "foobar"}.
Treats keys with dots as paths into nested HParams.
Values should be parsed already.
"""
# Parse 'on' and 'off' values.
typemap = _type_map(type(self), separator=separator)
flat_dict_parsed = {}
for flat_k, v in flat_dict.items():
cls = _type_to_class(typemap[flat_k])
if is_hparam_type(cls) and v == 'on':
parsed_v = cls()
elif is_hparam_type(cls) and v == 'off':
parsed_v = None
else:
parsed_v = v
flat_dict_parsed[flat_k] = parsed_v
# Expand implicit nested 'on' values. For instance, {'x.y': 'on'} should mean {'x': 'on', 'x.y': 'on'}.
flat_dict_expanded = {}
for flat_k, v in flat_dict_parsed.items():
flat_dict_expanded[flat_k] = v
cls = _type_to_class(typemap[flat_k])
if is_hparam_type(cls) and v is not None:
parts = flat_k.split(separator)
prefix = parts[0]
for i in range(1, len(parts)):
if prefix not in flat_dict_expanded:
flat_dict_expanded[prefix] = _type_to_class(typemap[prefix])()
prefix += separator + parts[i]
# Set all the values. The sort ensures that outer classes get initialized before their fields.
for flat_k in sorted(flat_dict_expanded.keys()):
v = flat_dict_expanded[flat_k]
*ks, f = flat_k.split(separator)
hp = self
for i, k in enumerate(ks):
try:
hp = getattr(hp, k)
except AttributeError:
raise AttributeError(f"{hp} {'(' + separator.join(ks[:i]) + ') ' if i else ''}has no field '{k}'")
try:
setattr(hp, f, v)
except AttributeError:
raise AttributeError(f"{hp} ({separator.join(ks)}) has no field '{f}'")