import numpy as np
from kona.user import UserSolver
[docs]class Constrained2x2(UserSolver):
def __init__(self):
super(Constrained2x2, self).__init__(
num_design=2,
num_state=2,
num_eq=1,
num_ineq=0)
self.dRdX = -1*np.eye(2)
self.dRdU = np.array([[1,1],[0,1]])
[docs] def eval_obj(self, at_design, at_state):
return np.sum(at_state.data**2) + np.sum(at_design**2) - 3
[docs] def eval_residual(self, at_design, at_state, store_here):
p = at_design
u = at_state.data
store_here.data[:] = self.dRdU.dot(u) - p
[docs] def eval_eq_cnstr(self, at_design, at_state):
x = at_design[0]
y = at_design[1]
return np.array([x**2 + y**2])
[docs] def multiply_dRdX(self, at_design, at_state, in_vec, out_vec):
out_vec.data[:] = self.dRdX.dot(in_vec)
[docs] def multiply_dRdU(self, at_design, at_state, in_vec, out_vec):
out_vec.data[:] = self.dRdU.dot(in_vec.data)
[docs] def multiply_dRdX_T(self, at_design, at_state, in_vec):
return self.dRdX.T.dot(in_vec.data)
[docs] def multiply_dRdU_T(self, at_design, at_state, in_vec, out_vec):
out_vec.data[:] = self.dRdU.T.dot(in_vec.data)
[docs] def multiply_dCEQdX(self, at_design, at_state, in_vec):
x = at_design[0]
y = at_design[1]
return np.array([2*(x*in_vec[0] + y*in_vec[1])])
[docs] def multiply_dCEQdX_T(self, at_design, at_state, in_vec):
x = at_design[0]
y = at_design[1]
return np.array([2*x*in_vec[0], 2*y*in_vec[0]])
[docs] def multiply_dCEQdU(self, at_design, at_state, in_vec):
return np.zeros(self.num_eq)
[docs] def multiply_dCEQdU_T(self, at_design, at_state, in_vec, out_vec):
out_vec.data[:] = 0.0
[docs] def eval_dFdX(self, at_design, at_state):
return np.array([2*at_design[0], 2*at_design[1]])
[docs] def eval_dFdU(self, at_design, at_state, store_here):
U = at_state.data
store_here.data[:] = np.array([2*U[0], 2*U[1]])
[docs] def init_design(self):
return np.array([10., 10.])
[docs] def solve_nonlinear(self, at_design, result):
result.data[:] = np.linalg.solve(self.dRdU, at_design)
return 1
[docs] def solve_linear(self, at_design, at_state, rhs_vec, rel_tol, result):
result.data[:] = np.linalg.solve(self.dRdU, rhs_vec.data)
return 1
[docs] def solve_adjoint(self, at_design, at_state, rhs_vec, rel_tol, result):
result.data[:] = np.linalg.solve(self.dRdU.T, rhs_vec.data)
return 1