def solve(self, A, b):
epsilon = self.epsilon
force = self.force
while True:
try:
rtn = super(InsufficientRankSolver, self).solve(A, b)
break;
except LinAlgError as e:
if epsilon is None and force is None:
raise RuntimeError("Did not provide a way to resolve sigular matrix")
if epsilon is not None:
diagval = np.sum(np.diagonal(A))
E = np.ones(A.shape, A.dtype)*epsilon
if diagval==0:
E-=np.diag(np.diag(E))
A+=E
epsilon = None
else:
A[-1,:] = np.ones(A.shape[0], A.dtype)
b[-1] = 0
force = None
return rtn;
评论列表
文章目录