"""ML algorithms — ensemble prediction, regime detection, risk management.

v2: Full ML pipeline with 4-model ensemble, direction classifier,
    feature selection, hyperparameter optimization, regime detection,
    cross-asset correlation, multi-timeframe confirmation, and backtesting.
"""
from app.engine.ml.predictor import MLPredictorAlgorithm

ALL_ML = [MLPredictorAlgorithm]

# Lazy imports — these are used internally by the predictor and scorer,
# but exported here for external/admin/API usage.
__all__ = [
    'MLPredictorAlgorithm',
    'ALL_ML',
    # Convenience re-exports
    'EnsemblePredictor',
    'RegimeDetector',
    'WalkForwardBacktester',
    'RiskManager',
    'MultiTimeframeAnalyzer',
    'HyperOptimizer',
    'FeatureSelector',
    'CrossAssetFeatures',
    'FeatureEngineer',
]


def __getattr__(name):
    """Lazy import for non-critical modules (avoids startup overhead)."""
    _lazy_map = {
        'EnsemblePredictor': 'app.engine.ml.ensemble',
        'RegimeDetector': 'app.engine.ml.regime',
        'WalkForwardBacktester': 'app.engine.ml.backtester',
        'RiskManager': 'app.engine.ml.risk_manager',
        'MultiTimeframeAnalyzer': 'app.engine.ml.multi_timeframe',
        'HyperOptimizer': 'app.engine.ml.hyperopt',
        'FeatureSelector': 'app.engine.ml.feature_selection',
        'CrossAssetFeatures': 'app.engine.ml.cross_asset',
        'FeatureEngineer': 'app.engine.ml.feature_eng',
    }
    if name in _lazy_map:
        import importlib
        mod = importlib.import_module(_lazy_map[name])
        return getattr(mod, name)
    raise AttributeError(f"module 'app.engine.ml' has no attribute {name!r}")
