Source code for pytwinnet.optimization.grid_search
from __future__ import annotations
from dataclasses import dataclass
from itertools import product
from typing import Dict, Iterable, Any, List, Tuple
from ..core.digital_twin import DigitalTwin
from .objective import Objective
from .optimizer import Optimizer
[docs]
@dataclass
class GridSearchOptimizer(Optimizer):
param_grid: Dict[str, Iterable[float]]
copy_twin: bool = True
[docs]
def optimize(self, twin: DigitalTwin, objective: Objective) -> Dict[str, Any]:
node_ids = list(self.param_grid.keys())
candidates = list(product(*[list(self.param_grid[n]) for n in node_ids]))
best_score = float("-inf")
best_combo: List[Tuple[str, float]] = []
for combo in candidates:
sim_twin = twin.snapshot() if self.copy_twin else twin
for nid, pw in zip(node_ids, combo):
node = sim_twin.network.get_node_by_id(nid)
if node:
node.transceiver_properties.transmit_power_dbm = float(pw)
score = objective.evaluate(sim_twin)
if score > best_score:
best_score = score
best_combo = list(zip(node_ids, map(float, combo)))
return {"best_score": best_score, "best_params": best_combo, "evaluations": len(candidates)}