from abc import ABC, abstractmethod
from typing import Dict, Any, Tuple
import numpy as np
from .privacy_mechanism import PrivacyMechanism
from .risk_meter import RiskMeter
from .utility_evaluator import UtilityEvaluator

class Optimizer(ABC):
    @abstractmethod
    def search(self,
               original_data: np.ndarray,
               mechanism: PrivacyMechanism,
               risk_meter: RiskMeter,
               utility_evaluator: UtilityEvaluator,
               param_space: Dict[str, Any],
               risk_constraint: Tuple[float, float],
               max_iter: int = 100) -> Tuple[Dict[str, Any], float, float]:
        """
        在给定参数空间中搜索最优参数组合。

        Parameters
        ----------
        original_data : np.ndarray
            原始数据，用于隐私机制和风险/效用评估。
        mechanism : PrivacyMechanism
            隐私机制实例。
        risk_meter : RiskMeter
            风险度量器。
        utility_evaluator : UtilityEvaluator
            效用评估器。
        param_space : Dict[str, Any]
            参数空间定义。
        risk_constraint : Tuple[float, float]
            风险约束范围 (min_risk, max_risk)。
        max_iter : int
            最大迭代次数。

        Returns
        -------
        Tuple[Dict[str, Any], float, float]
            (最优参数, 对应的效用值, 对应的风险值)
        """
        pass