
    9i                    @    S r SSKJr  SSKJr  SSKJr   " S S5      rg)zEnsemble model combining Elo ratings with ML predictions.

The EnsembleModel takes Elo-based probabilities from the rating engine
and blends them with additional ML predictions (from feature-engineered
models) to produce a final probability estimate.
    )annotations)Any)Sessionc                      \ rS rSrSr S     SS jjr      SS jr    SS jr      SS jrSS jr	SS jr
S	rg
)EnsembleModel   a+  Combines Elo ratings with ML predictions for improved accuracy.

Supports multiple blending strategies:
- Weighted average (fixed weights learned offline)
- Logistic calibration (train a logistic regression on top of
  Elo + ML features)
- Stacking (use ML predictions as features for a meta-model)
c                *    Xl         X l        0 U l        g)u   Initialize the ensemble model.

Args:
    session: Database session for loading data.
    blend_mode: Blending strategy — "weighted", "logistic",
        or "stacking".
N)_session
blend_mode_weights)selfsessionr   s      9/root/tipsharks/tipsharks-elo-api/packages/ml/ensemble.py__init__EnsembleModel.__init__   s      $*,    c                    [         e)zTrain the ensemble (e.g., learn blend weights).

Args:
    date_from: Start date string (YYYY-MM-DD).
    date_to: End date string (YYYY-MM-DD).

Returns:
    Training metrics dict.
NotImplementedErrorr   	date_fromdate_tos      r   trainEnsembleModel.train)   s
     "!r   c                    [         e)ai  Predict win/place probabilities for all starters in a race.

Combines Elo ratings with ML feature predictions.

Args:
    race_id: The race ID.

Returns:
    List of prediction dicts, one per starter, with keys:
    - starter_id: int
    - win_probability: float
    - place_probability: float
    - elo_win_prob: float
    - ml_win_prob: float (if applicable)
r   )r   race_ids     r   predictEnsembleModel.predict9   s
    & "!r   c                    [         e)zEvaluate ensemble performance on a test window.

Args:
    date_from: Start date string (YYYY-MM-DD).
    date_to: End date string (YYYY-MM-DD).

Returns:
    Dict of evaluation metrics (accuracy, Brier score, log loss,
    top-3 rate, etc.).
r   r   s      r   evaluateEnsembleModel.evaluateN   s
     "!r   c                    [         e)zdPersist learned blend weights to disk.

Args:
    path: File path to save weights to (JSON format).
r   r   paths     r   save_weightsEnsembleModel.save_weights_   
     "!r   c                    [         e)zeLoad learned blend weights from disk.

Args:
    path: File path to load weights from (JSON format).
r   r#   s     r   load_weightsEnsembleModel.load_weightsg   r'   r   )r
   r   r   N)weighted)r   r   r   strreturnNone)r   r,   r   r,   r-   zdict[str, Any])r   intr-   zlist[dict[str, Any]])r$   r,   r-   r.   )__name__
__module____qualname____firstlineno____doc__r   r   r   r    r%   r)   __static_attributes__ r   r   r   r      s     %-- - 
	- "" " 
	" "" 
"*"" " 
	""""r   r   N)r4   
__future__r   typingr   sqlalchemy.ormr   r   r6   r   r   <module>r:      s!    #  "^" ^"r   