47 lines
1.5 KiB
Python
Executable File
47 lines
1.5 KiB
Python
Executable File
import os
|
|
import yaml
|
|
from typing import Dict, Any, Optional
|
|
|
|
class EnsembleConfig:
|
|
_instance: Optional['EnsembleConfig'] = None
|
|
_config: Dict[str, Any] = {}
|
|
|
|
def __new__(cls):
|
|
if cls._instance is None:
|
|
cls._instance = super(EnsembleConfig, cls).__new__(cls)
|
|
cls._instance._load_config()
|
|
return cls._instance
|
|
|
|
def _load_config(self):
|
|
"""Load configuration from YAML file."""
|
|
config_path = os.path.join(os.path.dirname(__file__), 'ensemble_config.yaml')
|
|
try:
|
|
with open(config_path, 'r', encoding='utf-8') as f:
|
|
self._config = yaml.safe_load(f)
|
|
# print(f"✅ Loaded ensemble config from {config_path}")
|
|
except Exception as e:
|
|
print(f"❌ Failed to load ensemble config: {e}")
|
|
self._config = {}
|
|
|
|
def get(self, key: str, default: Any = None) -> Any:
|
|
"""Get configuration value by key (supports dot notation for nested keys)."""
|
|
keys = key.split('.')
|
|
value = self._config
|
|
|
|
try:
|
|
for k in keys:
|
|
value = value[k]
|
|
return value
|
|
except (KeyError, TypeError):
|
|
return default
|
|
|
|
# Singleton accessor
|
|
def get_config() -> EnsembleConfig:
|
|
return EnsembleConfig()
|
|
|
|
if __name__ == "__main__":
|
|
# Test
|
|
cfg = get_config()
|
|
print(f"Weights: {cfg.get('engine_weights')}")
|
|
print(f"Team Weight: {cfg.get('engine_weights.team')}")
|