File size: 1,736 Bytes
2f8199f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Configuration loading and parsing for the ER Model.
"""
from dataclasses import dataclass
from pathlib import Path
from typing import Dict, List, Tuple, Optional
import yaml

# Assuming these dataclasses are defined in er_model.er_model or a shared types module.
# For now, let's duplicate them here or import them if they are easily accessible.
# Ideally, they'd be in a place like 'er_model.types'
# For this refactor, assuming they are in er_model.er_model and we'll import them.
from er_model_core.types import Species, ProjectConfig, CarbonConfig

def load_model_config(
    config_path: Optional[Path] = None, 
    config_dict: Optional[Dict] = None
) -> Tuple[List[Species], ProjectConfig, CarbonConfig, str, bool, Dict]:
    """
    Loads model configuration from a YAML file or a dictionary.

    Returns:
        A tuple containing:
            - List of Species objects
            - ProjectConfig object
            - CarbonConfig object
            - Growth model name (str)
            - Continuous growth flag (bool)
            - The raw config dictionary
    """
    if config_dict is not None:
        cfg = config_dict
    elif config_path is not None:
        with open(config_path) as f:
            cfg = yaml.safe_load(f)
    else:
        raise ValueError("Either config_path or config_dict must be provided.")

    species_list = [Species(**s) for s in cfg["species"]]
    project_cfg = ProjectConfig(**cfg["project"])
    carbon_cfg = CarbonConfig(**cfg["carbon"])
    
    growth_model_name = cfg.get('growth_model', 'chapman_richards') 
    continuous_growth_flag = cfg.get('continuous_growth', False)
    
    return species_list, project_cfg, carbon_cfg, growth_model_name, continuous_growth_flag, cfg