Configuration System v2.0 Architecture
Overview
The configuration system has been completely redesigned in v2.0 to provide a modern, flexible, and maintainable approach to managing simulation parameters.
Architecture Diagram
graph TB %% Main Components subgraph ConfigSystem["Configuration System v2.0"] CM["ConfigManager<br/>Main Interface"] CV2["ConfigV2<br/>Pydantic Models"] COMPAT["ConfigCompat<br/>Legacy Support"] end %% File Structure subgraph FileSystem["File System"] subgraph Profiles["Profiles/"] DEFAULT["default.yaml"] CONSERV["conservative.yaml"] AGGRESS["aggressive.yaml"] CUSTOM["custom/*.yaml"] end subgraph Modules["Modules/"] MOD_INS["insurance.yaml"] MOD_LOSS["losses.yaml"] MOD_STOCH["stochastic.yaml"] MOD_BUS["business.yaml"] end subgraph Presets["Presets/"] PRE_MARKET["market_conditions.yaml"] PRE_LAYER["layer_structures.yaml"] PRE_RISK["risk_scenarios.yaml"] end end %% Data Models subgraph Models["Configuration Models"] PROF_META["ProfileMetadata"] MANU_CFG["ManufacturerConfig"] INS_CFG["InsuranceConfig"] SIM_CFG["SimulationConfig"] LOSS_CFG["LossConfig"] GROWTH_CFG["GrowthConfig"] end %% Relationships CM --> CV2 CM --> COMPAT CM --> Profiles Profiles --> DEFAULT Profiles --> CONSERV Profiles --> AGGRESS Profiles --> CUSTOM DEFAULT -.includes.-> Modules CONSERV -.includes.-> Modules AGGRESS -.includes.-> Modules Modules --> MOD_INS Modules --> MOD_LOSS Modules --> MOD_STOCH Modules --> MOD_BUS DEFAULT -.applies.-> Presets CONSERV -.applies.-> Presets AGGRESS -.applies.-> Presets CV2 --> Models Models --> PROF_META Models --> MANU_CFG Models --> INS_CFG Models --> SIM_CFG Models --> LOSS_CFG Models --> GROWTH_CFG %% Styling classDef manager fill:#e3f2fd,stroke:#1565c0,stroke-width:3px classDef profiles fill:#fff3e0,stroke:#ef6c00,stroke-width:2px classDef modules fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px classDef presets fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px classDef models fill:#ffebee,stroke:#c62828,stroke-width:2px class CM manager class DEFAULT,CONSERV,AGGRESS,CUSTOM profiles class MOD_INS,MOD_LOSS,MOD_STOCH,MOD_BUS modules class PRE_MARKET,PRE_LAYER,PRE_RISK presets class PROF_META,MANU_CFG,INS_CFG,SIM_CFG,LOSS_CFG,GROWTH_CFG models
Three-Tier Configuration Architecture
graph LR %% Tier 1: Profiles subgraph Tier1["Tier 1: Profiles"] P1["Complete Configuration Sets"] P2["Default Profile"] P3["Conservative Profile"] P4["Aggressive Profile"] P5["Custom Profiles"] end %% Tier 2: Modules subgraph Tier2["Tier 2: Modules"] M1["Reusable Components"] M2["Insurance Module"] M3["Loss Module"] M4["Stochastic Module"] M5["Business Module"] end %% Tier 3: Presets subgraph Tier3["Tier 3: Presets"] PR1["Quick-Apply Templates"] PR2["Market Conditions"] PR3["Layer Structures"] PR4["Risk Scenarios"] end %% Relationships P1 --> P2 P1 --> P3 P1 --> P4 P1 --> P5 P2 -.includes.-> M1 P3 -.includes.-> M1 P4 -.includes.-> M1 M1 --> M2 M1 --> M3 M1 --> M4 M1 --> M5 P2 -.applies.-> PR1 P3 -.applies.-> PR1 P4 -.applies.-> PR1 PR1 --> PR2 PR1 --> PR3 PR1 --> PR4 %% Styling classDef tier1 fill:#e3f2fd,stroke:#1565c0,stroke-width:2px classDef tier2 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px classDef tier3 fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px class P1,P2,P3,P4,P5 tier1 class M1,M2,M3,M4,M5 tier2 class PR1,PR2,PR3,PR4 tier3
Component Descriptions
ConfigManager
The main interface for configuration management:
class ConfigManager:
"""Manages configuration loading with profiles, modules, and presets."""
def load_profile(
self,
profile_name: str = "default",
use_cache: bool = True,
**overrides
) -> ConfigV2:
"""Load a configuration profile with optional overrides."""
Key Features:
Profile inheritance resolution
Module composition
Preset application
Runtime overrides
LRU caching for performance
Validation at load time
ConfigV2 Models
Enhanced Pydantic v2 models with strict validation:
class ConfigV2(BaseModel):
"""Main configuration model with all settings."""
profile: ProfileMetadata
manufacturer: ManufacturerConfig
working_capital: WorkingCapitalConfig
growth: GrowthConfig
debt: DebtConfig
simulation: SimulationConfig
insurance: Optional[InsuranceConfig]
losses: Optional[LossDistributionConfig]
stochastic: Optional[StochasticConfig]
business: Optional[BusinessOptimizationConfig]
Enhancements:
Type safety with Pydantic v2
Optional module support
Nested configuration validation
Runtime override methods
JSON schema generation
Profile System
Profiles provide complete configuration sets:
# profiles/default.yaml
name: default
description: "Standard baseline configuration"
version: "2.0.0"
modules:
- insurance
- losses
manufacturer:
initial_assets: 10_000_000
base_operating_margin: 0.10
tax_rate: 0.25
Inheritance:
# profiles/conservative.yaml
extends: default
description: "Conservative risk parameters"
overrides:
manufacturer:
base_operating_margin: 0.06
growth:
annual_growth_rate: 0.03
Module System
Modules are optional, reusable components:
# modules/insurance.yaml
insurance:
use_program: true
layers:
- name: "Primary"
attachment: 0
limit: 5_000_000
base_premium_rate: 0.015
- name: "Excess"
attachment: 5_000_000
limit: 20_000_000
base_premium_rate: 0.008
Benefits:
Selective inclusion
Reusability across profiles
Clean separation of concerns
Easy testing in isolation
Preset System
Presets are quick-apply templates:
# presets/market_conditions.yaml
presets:
hard_market:
insurance:
layers:
- base_premium_rate: 0.025 # Higher rates
- base_premium_rate: 0.015
soft_market:
insurance:
layers:
- base_premium_rate: 0.010 # Lower rates
- base_premium_rate: 0.005
Usage:
config = manager.load_profile(
"default",
presets=["hard_market", "high_volatility"]
)
Migration Path
Backward Compatibility
The system maintains full backward compatibility through ConfigCompat
:
class LegacyConfigAdapter:
"""Adapter for old ConfigLoader interface."""
def load(self, config_name: str, **overrides) -> Config:
"""Load config using old interface."""
# Maps to new system internally
profile_name = self._map_legacy_name(config_name)
config_v2 = self.config_manager.load_profile(profile_name)
return self._convert_to_legacy(config_v2)
Migration Tool
Automated migration from 12 YAML files to 3-tier:
class ConfigMigrator:
"""Migrates legacy configurations to new system."""
def run_migration(self) -> bool:
"""Execute full migration."""
# 1. Convert baseline → default profile
# 2. Extract modules from multiple files
# 3. Create preset libraries
# 4. Validate migrated configs
Performance Considerations
Caching Strategy
@lru_cache(maxsize=32)
def _load_with_inheritance(self, profile_path: Path) -> dict:
"""Load profile with inheritance chain resolution."""
# Cached to avoid repeated file I/O
Optimization Techniques
Lazy Loading: Modules loaded only when needed
Deep Merging: Efficient nested dictionary merging
Validation Caching: Pydantic model validation results cached
File Watch: Optional file system watching for development
Best Practices
Creating Custom Profiles
# profiles/custom/client_abc.yaml
extends: conservative
description: "Custom configuration for Client ABC"
modules:
- insurance
- stochastic
presets:
- steady_market
overrides:
manufacturer:
initial_assets: 50_000_000
simulation:
time_horizon_years: 30
Runtime Overrides
# Override specific parameters at runtime
config = manager.load_profile(
"default",
manufacturer={"base_operating_margin": 0.12},
simulation={"random_seed": 42}
)
Testing Configurations
def test_profile_loads():
"""Test that all profiles load successfully."""
manager = ConfigManager()
for profile in manager.list_profiles():
config = manager.load_profile(profile)
assert isinstance(config, ConfigV2)
assert config.manufacturer.initial_assets > 0
Security Considerations
Path Traversal Protection: Profile names sanitized
YAML Safe Loading: Only safe constructors allowed
Validation: All inputs validated through Pydantic
Access Control: Custom profiles in separate directory
Future Enhancements
Planned Features
Hot Reloading: Automatic reload on file changes
Schema Versioning: Automatic migration between versions
Remote Configs: Load from S3/HTTP endpoints
Config Diffing: Compare configurations
A/B Testing: Built-in experiment configuration
API Stability
The configuration API is considered stable as of v2.0:
ConfigManager.load_profile()
- StableConfigV2
models - StableProfile YAML format - Stable
Module/Preset format - Stable
Conclusion
The v2.0 configuration system provides a modern, flexible, and maintainable approach to managing complex simulation parameters while maintaining full backward compatibility. The 3-tier architecture enables both simplicity for basic use cases and power for advanced scenarios.