import numpy as np
from typing import Dict, Any
from ..privacy_mechanism import PrivacyMechanism


class LaplaceMechanism(PrivacyMechanism):
    """
    拉普拉斯机制（适用于数值数据）。
    参数:
        - epsilon: float, 隐私预算，噪声尺度 = sensitivity / epsilon
        - sensitivity: float, 全局敏感度（可通过 FeatureAnalyzer 计算）
    """

    def apply(self, data: np.ndarray, params: Dict[str, Any]) -> np.ndarray:
        """
        对数据添加拉普拉斯噪声。

        Parameters
        ----------
        data : np.ndarray
            原始数据，假设全部为数值列。
        params : Dict[str, Any]
            必须包含:
                - epsilon: float
                - sensitivity: float (可选，默认为1.0)

        Returns
        -------
        np.ndarray
            添加噪声后的数据。
        """
        epsilon = params.get('epsilon')
        if epsilon is None:
            raise ValueError("必须提供 epsilon 参数")

        sensitivity = params.get('sensitivity', 1.0)
        scale = sensitivity / epsilon

        # 对每个元素独立添加拉普拉斯噪声
        noise = np.random.laplace(0, scale, size=data.shape)
        return data + noise