15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 55808f684SSatish Balay 65808f684SSatish Balay# -------------------------------------------------------------------- 7*5971bccaSStefano Zampiniclass Objective: 8*5971bccaSStefano Zampini def __call__(self, tao, x): 9*5971bccaSStefano Zampini return (x[0] - 2.0)**2 + (x[1] - 2.0)**2 - 2.0*(x[0] + x[1]) 10*5971bccaSStefano Zampini 11*5971bccaSStefano Zampiniclass Gradient: 12*5971bccaSStefano Zampini def __call__(self, tao, x, g): 13*5971bccaSStefano Zampini g[0] = 2.0*(x[0] - 2.0) - 2.0 14*5971bccaSStefano Zampini g[1] = 2.0*(x[1] - 2.0) - 2.0 15*5971bccaSStefano Zampini g.assemble() 16*5971bccaSStefano Zampini 17*5971bccaSStefano Zampiniclass EqConstraints: 18*5971bccaSStefano Zampini def __call__(self, tao, x, c): 19*5971bccaSStefano Zampini c[0] = x[0]**2 + x[1] - 2.0 20*5971bccaSStefano Zampini c.assemble() 21*5971bccaSStefano Zampini 22*5971bccaSStefano Zampiniclass EqJacobian: 23*5971bccaSStefano Zampini def __call__(self, tao, x, J, P): 24*5971bccaSStefano Zampini P[0,0] = 2.0*x[0] 25*5971bccaSStefano Zampini P[0,1] = 1.0 26*5971bccaSStefano Zampini P.assemble() 27*5971bccaSStefano Zampini if J != P: J.assemble() 285808f684SSatish Balay 295808f684SSatish Balayclass BaseTestTAO(object): 305808f684SSatish Balay 315808f684SSatish Balay COMM = None 325808f684SSatish Balay 335808f684SSatish Balay def setUp(self): 345808f684SSatish Balay self.tao = PETSc.TAO().create(comm=self.COMM) 355808f684SSatish Balay 365808f684SSatish Balay def tearDown(self): 375808f684SSatish Balay self.tao = None 385808f684SSatish Balay 395808f684SSatish Balay def testSetRoutinesToNone(self): 405808f684SSatish Balay tao = self.tao 415808f684SSatish Balay objective, gradient, objgrad = None, None, None 425808f684SSatish Balay constraint, varbounds = None, None 435808f684SSatish Balay hessian, jacobian = None, None 445808f684SSatish Balay tao.setObjective(objective) 455808f684SSatish Balay tao.setGradient(gradient) 465808f684SSatish Balay tao.setVariableBounds(varbounds) 475808f684SSatish Balay tao.setObjectiveGradient(objgrad) 485808f684SSatish Balay tao.setConstraints(constraint) 495808f684SSatish Balay tao.setHessian(hessian) 505808f684SSatish Balay tao.setJacobian(jacobian) 515808f684SSatish Balay 525808f684SSatish Balay def testGetVecsAndMats(self): 535808f684SSatish Balay tao = self.tao 545808f684SSatish Balay x = tao.getSolution() 555808f684SSatish Balay g = tao.getGradient() 565808f684SSatish Balay l, u = tao.getVariableBounds() 575808f684SSatish Balay r = None#tao.getConstraintVec() 585808f684SSatish Balay H, HP = None,None#tao.getHessianMat() 595808f684SSatish Balay J, JP = None,None#tao.getJacobianMat() 605808f684SSatish Balay for o in [x, g, r, l, u ,H, HP, J, JP,]: 615808f684SSatish Balay self.assertFalse(o) 625808f684SSatish Balay 635808f684SSatish Balay def testGetKSP(self): 645808f684SSatish Balay ksp = self.tao.getKSP() 655808f684SSatish Balay self.assertFalse(ksp) 665808f684SSatish Balay 67*5971bccaSStefano Zampini def testEqualityConstraints(self): 68*5971bccaSStefano Zampini if self.tao.getComm().Get_size() > 1: 69*5971bccaSStefano Zampini return 70*5971bccaSStefano Zampini tao = self.tao 71*5971bccaSStefano Zampini 72*5971bccaSStefano Zampini x = PETSc.Vec().create(tao.getComm()) 73*5971bccaSStefano Zampini x.setType('standard') 74*5971bccaSStefano Zampini x.setSizes(2) 75*5971bccaSStefano Zampini c = PETSc.Vec().create(tao.getComm()) 76*5971bccaSStefano Zampini c.setSizes(1) 77*5971bccaSStefano Zampini c.setType(x.getType()) 78*5971bccaSStefano Zampini J = PETSc.Mat().create(tao.getComm()) 79*5971bccaSStefano Zampini J.setSizes([1, 2]) 80*5971bccaSStefano Zampini J.setType(PETSc.Mat.Type.DENSE) 81*5971bccaSStefano Zampini J.setUp() 82*5971bccaSStefano Zampini 83*5971bccaSStefano Zampini tao.setObjective(Objective()) 84*5971bccaSStefano Zampini tao.setGradient(Gradient()) 85*5971bccaSStefano Zampini tao.setEqualityConstraints(EqConstraints(),c) 86*5971bccaSStefano Zampini tao.setJacobianEquality(EqJacobian(),J,J) 87*5971bccaSStefano Zampini tao.setInitial(x) 88*5971bccaSStefano Zampini tao.setType(PETSc.TAO.Type.ALMM) 89*5971bccaSStefano Zampini tao.setTolerances(gatol=1.e-4) 90*5971bccaSStefano Zampini tao.setFromOptions() 91*5971bccaSStefano Zampini tao.solve() 92*5971bccaSStefano Zampini self.assertAlmostEqual(abs(x[0]**2 + x[1] - 2.0), 0.0, places=4) 93*5971bccaSStefano Zampini 945808f684SSatish Balay# -------------------------------------------------------------------- 955808f684SSatish Balay 965808f684SSatish Balayclass TestTAOSelf(BaseTestTAO, unittest.TestCase): 975808f684SSatish Balay COMM = PETSc.COMM_SELF 985808f684SSatish Balay 995808f684SSatish Balayclass TestTAOWorld(BaseTestTAO, unittest.TestCase): 1005808f684SSatish Balay COMM = PETSc.COMM_WORLD 1015808f684SSatish Balay 1025808f684SSatish Balay# -------------------------------------------------------------------- 1035808f684SSatish Balay 1045808f684SSatish Balayimport numpy 1055808f684SSatish Balayif numpy.iscomplexobj(PETSc.ScalarType()): 1065808f684SSatish Balay del BaseTestTAO 1075808f684SSatish Balay del TestTAOSelf 1085808f684SSatish Balay del TestTAOWorld 1095808f684SSatish Balay 1105808f684SSatish Balayif __name__ == '__main__': 1115808f684SSatish Balay unittest.main() 112