File size: 2,061 Bytes
747451d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# /*---------------------------------------------------------------------------------------------
#  * Copyright (c) 2025 STMicroelectronics.
#  * All rights reserved.
#  *
#  * This software is licensed under terms that can be found in the LICENSE file in
#  * the root directory of this software component.
#  * If no LICENSE file comes with this software, it is provided AS-IS.
#  *--------------------------------------------------------------------------------------------*/
import logging 
from .defaults import  DEFAULT_MODEL_CFG, DEFAULT_DATASET_CFG, DEFAULT_TRAINING_CFG
from types import SimpleNamespace


def merge_cfg(defaults: dict, user_cfg: dict, prefix=""):
    merged = {}
    used_defaults = {}

    for k, v in defaults.items():
        if k not in user_cfg or user_cfg[k] in [None, "", []]:
            merged[k] = v
            used_defaults[k] = v
        else:
            merged[k] = user_cfg[k]

    # keep extra user keys
    for k, v in user_cfg.items():
        if k not in merged:
            merged[k] = v

    return merged, used_defaults

def normalize_cfg(cfg):
    cfg.model, model_defaults = merge_cfg(
        DEFAULT_MODEL_CFG, getattr(cfg, "model", {})
    )
    cfg.dataset, dataset_defaults = merge_cfg(
        DEFAULT_DATASET_CFG, getattr(cfg, "dataset", {})
    )
    cfg.training, training_defaults = merge_cfg(
        DEFAULT_TRAINING_CFG, getattr(cfg, "training", {})
    )

    return cfg, {
        "model": model_defaults,
        "dataset": dataset_defaults,
        "training": training_defaults,
    }
def log_used_defaults(defaults_dict):
    for section, values in defaults_dict.items():
        if not values:
            continue
        logging.info(f"[Config] Using default values for `{section}`:")
        for k, v in values.items():
            logging.info(f"    {section}.{k} = {v}")

def dict_to_ns(d):
    if isinstance(d, dict):
        return SimpleNamespace(**{k: dict_to_ns(v) for k, v in d.items()})
    if isinstance(d, list):
        return [dict_to_ns(x) for x in d]
    return d