from typing import Dict, Any from .models import LocalProblem from .adapters import BaseAdapter from .privacy import PrivacyBudget, laplace_noise class Simulator: def __init__(self, adapter: BaseAdapter, privacy_budget: PrivacyBudget = None): self.adapter = adapter self.privacy_budget = privacy_budget or PrivacyBudget(1.0) def simple_dispatch(self, lp: LocalProblem, plan_delta: Dict[str, Any]) -> Dict[str, Any]: # Very small toy solver: use delta to adjust demand vs pv with noise if budget allows raw = { "neighborhood": lp.neighborhood_id, "base_demand_kw": lp.demand_kw, "base_pv_kw": lp.pv_kw, "delta": plan_delta, } # If privacy budget allows, add Laplace noise to simulate DP signal if self.privacy_budget and self.privacy_budget.remaining() > 0: noise = laplace_noise(scale=0.1) self.privacy_budget.spend(0.1) raw["noise"] = noise return raw