15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 55808f684SSatish Balay 65808f684SSatish Balay# -------------------------------------------------------------------- 75971bccaSStefano Zampiniclass Objective: 85971bccaSStefano Zampini def __call__(self, tao, x): 95971bccaSStefano Zampini return (x[0] - 2.0)**2 + (x[1] - 2.0)**2 - 2.0*(x[0] + x[1]) 105971bccaSStefano Zampini 115971bccaSStefano Zampiniclass Gradient: 125971bccaSStefano Zampini def __call__(self, tao, x, g): 135971bccaSStefano Zampini g[0] = 2.0*(x[0] - 2.0) - 2.0 145971bccaSStefano Zampini g[1] = 2.0*(x[1] - 2.0) - 2.0 155971bccaSStefano Zampini g.assemble() 165971bccaSStefano Zampini 175971bccaSStefano Zampiniclass EqConstraints: 185971bccaSStefano Zampini def __call__(self, tao, x, c): 195971bccaSStefano Zampini c[0] = x[0]**2 + x[1] - 2.0 205971bccaSStefano Zampini c.assemble() 215971bccaSStefano Zampini 225971bccaSStefano Zampiniclass EqJacobian: 235971bccaSStefano Zampini def __call__(self, tao, x, J, P): 245971bccaSStefano Zampini P[0,0] = 2.0*x[0] 255971bccaSStefano Zampini P[0,1] = 1.0 265971bccaSStefano Zampini P.assemble() 275971bccaSStefano 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) 45*a82e8c82SStefano Zampini tao.setGradient(gradient,None) 465808f684SSatish Balay tao.setVariableBounds(varbounds) 47*a82e8c82SStefano Zampini tao.setObjectiveGradient(objgrad,None) 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() 55*a82e8c82SStefano Zampini (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 675971bccaSStefano Zampini def testEqualityConstraints(self): 685971bccaSStefano Zampini if self.tao.getComm().Get_size() > 1: 695971bccaSStefano Zampini return 705971bccaSStefano Zampini tao = self.tao 715971bccaSStefano Zampini 725971bccaSStefano Zampini x = PETSc.Vec().create(tao.getComm()) 735971bccaSStefano Zampini x.setType('standard') 745971bccaSStefano Zampini x.setSizes(2) 755971bccaSStefano Zampini c = PETSc.Vec().create(tao.getComm()) 765971bccaSStefano Zampini c.setSizes(1) 775971bccaSStefano Zampini c.setType(x.getType()) 785971bccaSStefano Zampini J = PETSc.Mat().create(tao.getComm()) 795971bccaSStefano Zampini J.setSizes([1, 2]) 805971bccaSStefano Zampini J.setType(PETSc.Mat.Type.DENSE) 815971bccaSStefano Zampini J.setUp() 825971bccaSStefano Zampini 835971bccaSStefano Zampini tao.setObjective(Objective()) 84*a82e8c82SStefano Zampini tao.setGradient(Gradient(),None) 855971bccaSStefano Zampini tao.setEqualityConstraints(EqConstraints(),c) 865971bccaSStefano Zampini tao.setJacobianEquality(EqJacobian(),J,J) 87*a82e8c82SStefano Zampini tao.setSolution(x) 885971bccaSStefano Zampini tao.setType(PETSc.TAO.Type.ALMM) 895971bccaSStefano Zampini tao.setTolerances(gatol=1.e-4) 905971bccaSStefano Zampini tao.setFromOptions() 915971bccaSStefano Zampini tao.solve() 925971bccaSStefano Zampini self.assertAlmostEqual(abs(x[0]**2 + x[1] - 2.0), 0.0, places=4) 935971bccaSStefano 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