Source code for ellalgo.oracles.lmi0_oracle
from typing import Optional, Tuple
import numpy as np
from ellalgo.oracles.ldlt_mgr import LDLTMgr
Cut = Tuple[np.ndarray, float]
[docs]
class LMI0Oracle:
"""Oracle for Linear Matrix Inequality constraint
find x
s.t. F * x ⪰ 0
"""
def __init__(self, mat_f):
"""[summary]
Arguments:
mat_f (List[np.ndarray]): [description]
"""
self.mat_f = mat_f
self.ldlt_mgr = LDLTMgr(len(mat_f[0]))
[docs]
def assess_feas(self, x: np.ndarray) -> Optional[Cut]:
"""[summary]
Arguments:
x (np.ndarray): [description]
Returns:
Optional[Cut]: [description]
"""
def get_elem(i, j):
n = len(x)
return sum(self.mat_f[k][i, j] * x[k] for k in range(n))
if not self.ldlt_mgr.factor(get_elem):
ep = self.ldlt_mgr.witness()
g = np.array([-self.ldlt_mgr.sym_quad(Fk) for Fk in self.mat_f])
return g, ep
return None