gridforge-low-code-platform.../gridforge/solver.py

33 lines
1004 B
Python

from __future__ import annotations
import numpy as np
def admm_lite(A: np.ndarray, b: np.ndarray, rho: float = 1.0, max_iter: int = 50, tol: float = 1e-4):
"""Very lightweight ADMM solver for a toy problem: minimize 0.5||Ax - b||^2 + regularization.
Returns the primal variable x. This is a minimal placeholder to demonstrate the schema.
"""
m, n = A.shape
x = np.zeros(n)
z = np.zeros(n)
u = np.zeros(n)
for _ in range(max_iter):
# x-update (least-squares step)
q = A.T @ b
x = np.linalg.solve(A.T @ A + rho * np.eye(n), q + rho * (z - u))
# z-update (soft-threshold for L1-like regularization placeholder)
z_old = z.copy()
z = _soft_threshold(x + u, rho)
# u-update
u += x - z
# Convergence check
if np.linalg.norm(z - z_old) < tol:
break
return x
def _soft_threshold(v: np.ndarray, lam: float) -> np.ndarray:
return np.sign(v) * np.maximum(np.abs(v) - lam, 0.0)