Source code for ellalgo.oracles.lmi_old_oracle
from typing import Optional, Tuple
import numpy as np
from ellalgo.cutting_plane import OracleFeas
from ellalgo.oracles.ldlt_mgr import LDLTMgr
Cut = Tuple[np.ndarray, float]
[docs]
class LMIOldOracle(OracleFeas):
"""Oracle for Linear Matrix Inequality constraint.
This oracle solves the following feasibility problem:
find x
s.t. (B − F * x) ⪰ 0
"""
def __init__(self, mat_f, mat_b):
"""
The function initializes the class with two matrices and creates an instance of the LDLTMgr class.
:param mat_f: A list of numpy arrays representing the matrix F
:param mat_b: A numpy array representing the matrix B
"""
self.mat_f = mat_f
self.mat_f0 = mat_b
self.ldlt_mgr = LDLTMgr(len(mat_b))
[docs]
def assess_feas(self, xc: np.ndarray) -> Optional[Cut]:
"""
The `assess_feas` function assesses the feasibility of a given input array `x` and returns a `Cut`
object if the feasibility is violated, otherwise it returns `None`.
:param x: An array of values that will be used in the calculation
:type x: np.ndarray
:return: The function `assess_feas` returns an `Optional[Cut]`.
"""
n = len(xc)
A = self.mat_f0.copy()
A -= sum(self.mat_f[k] * xc[k] for k in range(n))
if not self.ldlt_mgr.factorize(A):
ep = self.ldlt_mgr.witness()
g = np.array([self.ldlt_mgr.sym_quad(self.mat_f[i]) for i in range(n)])
return g, ep
return None