38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
"""ADMM-lite node stub.
|
|
|
|
This file contains a very small ADMM-like iterative collaborator that exchanges
|
|
dual updates and tries to improve a local objective. The real system would
|
|
use network transport and privacy-preserving aggregation; this stub focuses on
|
|
the local update loop and simple utility computation for tests.
|
|
"""
|
|
from typing import Any, Dict
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
@dataclass
|
|
class ADMMNode:
|
|
node_id: str
|
|
local_x: float = 0.0
|
|
dual: float = 0.0
|
|
rho: float = 1.0
|
|
|
|
def local_objective(self, x: float) -> float:
|
|
# simple quadratic objective with a local preferred point
|
|
preferred = 10.0
|
|
return (x - preferred) ** 2
|
|
|
|
def step(self, global_avg: float) -> float:
|
|
# ADMM-style proximal step: minimize 0.5*(x - preferred)^2 + (rho/2)*(x - z + u)^2
|
|
# here we do a single closed-form proximal update for a quadratic
|
|
preferred = 10.0
|
|
z = global_avg
|
|
u = self.dual
|
|
# minimize (x-pref)^2 + rho*(x - z + u)^2
|
|
denom = 1.0 + self.rho
|
|
num = 2 * preferred + 2 * self.rho * (z - u)
|
|
x_new = num / (2 * denom)
|
|
self.local_x = x_new
|
|
# update dual as simple gradient step
|
|
self.dual = u + (x_new - z)
|
|
return x_new
|