# Copyright (c) 2025 ByteDance Ltd. and/or its affiliates # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Adapted from [VGGT-Long](https://github.com/DengKaiCQ/VGGT-Long) import yaml def load_config(path, default_path=None): """ Loads config file. Args: path (str): path to config file. default_path (str, optional): whether to use default path. Defaults to None. Returns: cfg (dict): config dict. """ # load configuration from per scene/dataset cfg. with open(path) as f: cfg_special = yaml.full_load(f) inherit_from = cfg_special.get("inherit_from") if inherit_from is not None: cfg = load_config(inherit_from, default_path) elif default_path is not None: with open(default_path) as f: cfg = yaml.full_load(f) else: cfg = dict() # merge per dataset cfg. and main cfg. update_recursive(cfg, cfg_special) return cfg def update_recursive(dict1, dict2): """ Update two config dictionaries recursively. dict1 get masked by dict2, and we retuen dict1. Args: dict1 (dict): first dictionary to be updated. dict2 (dict): second dictionary which entries should be used. """ for k, v in dict2.items(): if k not in dict1: dict1[k] = dict() if isinstance(v, dict): update_recursive(dict1[k], v) else: dict1[k] = v