15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 56f336411SStefano Zampiniimport numpy 66f336411SStefano Zampini 75808f684SSatish Balay 85808f684SSatish Balay# -------------------------------------------------------------------- 95971bccaSStefano Zampiniclass Objective: 105971bccaSStefano Zampini def __call__(self, tao, x): 115971bccaSStefano Zampini return (x[0] - 2.0) ** 2 + (x[1] - 2.0) ** 2 - 2.0 * (x[0] + x[1]) 125971bccaSStefano Zampini 136f336411SStefano Zampini 145971bccaSStefano Zampiniclass Gradient: 155971bccaSStefano Zampini def __call__(self, tao, x, g): 165971bccaSStefano Zampini g[0] = 2.0 * (x[0] - 2.0) - 2.0 175971bccaSStefano Zampini g[1] = 2.0 * (x[1] - 2.0) - 2.0 185971bccaSStefano Zampini g.assemble() 195971bccaSStefano Zampini 206f336411SStefano Zampini 215971bccaSStefano Zampiniclass EqConstraints: 225971bccaSStefano Zampini def __call__(self, tao, x, c): 235971bccaSStefano Zampini c[0] = x[0] ** 2 + x[1] - 2.0 245971bccaSStefano Zampini c.assemble() 255971bccaSStefano Zampini 266f336411SStefano Zampini 275971bccaSStefano Zampiniclass EqJacobian: 285971bccaSStefano Zampini def __call__(self, tao, x, J, P): 295971bccaSStefano Zampini P[0, 0] = 2.0 * x[0] 305971bccaSStefano Zampini P[0, 1] = 1.0 315971bccaSStefano Zampini P.assemble() 326f336411SStefano Zampini if J != P: 336f336411SStefano Zampini J.assemble() 345808f684SSatish Balay 355808f684SSatish Balay 362944e117SPaul T. Kühnerclass InEqConstraints: 372944e117SPaul T. Kühner def __call__(self, tao, x, c): 382944e117SPaul T. Kühner c[0] = x[1] - x[0] ** 2 392944e117SPaul T. Kühner c.assemble() 402944e117SPaul T. Kühner 412944e117SPaul T. Kühner 422944e117SPaul T. Kühnerclass InEqJacobian: 432944e117SPaul T. Kühner def __call__(self, tao, x, J, P): 442944e117SPaul T. Kühner P[0, 0] = -2.0 * x[0] 452944e117SPaul T. Kühner P[0, 1] = 1.0 462944e117SPaul T. Kühner P.assemble() 472944e117SPaul T. Kühner if J != P: 482944e117SPaul T. Kühner J.assemble() 492944e117SPaul T. Kühner 502944e117SPaul T. Kühner 516f336411SStefano Zampiniclass BaseTestTAO: 525808f684SSatish Balay COMM = None 535808f684SSatish Balay 545808f684SSatish Balay def setUp(self): 555808f684SSatish Balay self.tao = PETSc.TAO().create(comm=self.COMM) 565808f684SSatish Balay 575808f684SSatish Balay def tearDown(self): 585808f684SSatish Balay self.tao = None 5962e5d2d2SJDBetteridge PETSc.garbage_cleanup() 605808f684SSatish Balay 615808f684SSatish Balay def testSetRoutinesToNone(self): 625808f684SSatish Balay tao = self.tao 635808f684SSatish Balay objective, gradient, objgrad = None, None, None 645808f684SSatish Balay constraint, varbounds = None, None 655808f684SSatish Balay hessian, jacobian = None, None 665808f684SSatish Balay tao.setObjective(objective) 67a82e8c82SStefano Zampini tao.setGradient(gradient, None) 685808f684SSatish Balay tao.setVariableBounds(varbounds) 69a82e8c82SStefano Zampini tao.setObjectiveGradient(objgrad, None) 705808f684SSatish Balay tao.setConstraints(constraint) 715808f684SSatish Balay tao.setHessian(hessian) 725808f684SSatish Balay tao.setJacobian(jacobian) 735808f684SSatish Balay 745808f684SSatish Balay def testGetVecsAndMats(self): 755808f684SSatish Balay tao = self.tao 765808f684SSatish Balay x = tao.getSolution() 77a82e8c82SStefano Zampini (g, _) = tao.getGradient() 786f336411SStefano Zampini low, up = tao.getVariableBounds() 795808f684SSatish Balay r = None # tao.getConstraintVec() 805808f684SSatish Balay H, HP = None, None # tao.getHessianMat() 815808f684SSatish Balay J, JP = None, None # tao.getJacobianMat() 826f336411SStefano Zampini for o in [ 836f336411SStefano Zampini x, 846f336411SStefano Zampini g, 856f336411SStefano Zampini r, 866f336411SStefano Zampini low, 876f336411SStefano Zampini up, 886f336411SStefano Zampini H, 896f336411SStefano Zampini HP, 906f336411SStefano Zampini J, 916f336411SStefano Zampini JP, 926f336411SStefano Zampini ]: 935808f684SSatish Balay self.assertFalse(o) 945808f684SSatish Balay 955808f684SSatish Balay def testGetKSP(self): 965808f684SSatish Balay ksp = self.tao.getKSP() 975808f684SSatish Balay self.assertFalse(ksp) 985808f684SSatish Balay 995971bccaSStefano Zampini def testEqualityConstraints(self): 1005971bccaSStefano Zampini if self.tao.getComm().Get_size() > 1: 1015971bccaSStefano Zampini return 1025971bccaSStefano Zampini tao = self.tao 1035971bccaSStefano Zampini 1045971bccaSStefano Zampini x = PETSc.Vec().create(tao.getComm()) 1055971bccaSStefano Zampini x.setType('standard') 1065971bccaSStefano Zampini x.setSizes(2) 1075971bccaSStefano Zampini c = PETSc.Vec().create(tao.getComm()) 1085971bccaSStefano Zampini c.setSizes(1) 1095971bccaSStefano Zampini c.setType(x.getType()) 1105971bccaSStefano Zampini J = PETSc.Mat().create(tao.getComm()) 1115971bccaSStefano Zampini J.setSizes([1, 2]) 1125971bccaSStefano Zampini J.setType(PETSc.Mat.Type.DENSE) 1135971bccaSStefano Zampini J.setUp() 1145971bccaSStefano Zampini 1155971bccaSStefano Zampini tao.setObjective(Objective()) 116a82e8c82SStefano Zampini tao.setGradient(Gradient(), None) 1175971bccaSStefano Zampini tao.setEqualityConstraints(EqConstraints(), c) 1185971bccaSStefano Zampini tao.setJacobianEquality(EqJacobian(), J, J) 119a82e8c82SStefano Zampini tao.setSolution(x) 1205971bccaSStefano Zampini tao.setType(PETSc.TAO.Type.ALMM) 1216f336411SStefano Zampini tao.setTolerances(gatol=1.0e-4) 1225971bccaSStefano Zampini tao.setFromOptions() 1235971bccaSStefano Zampini tao.solve() 1245971bccaSStefano Zampini self.assertAlmostEqual(abs(x[0] ** 2 + x[1] - 2.0), 0.0, places=4) 1255971bccaSStefano Zampini 1262944e117SPaul T. Kühner def testInequlityConstraints(self): 1272944e117SPaul T. Kühner if self.tao.getComm().Get_size() > 1: 1282944e117SPaul T. Kühner return 1292944e117SPaul T. Kühner tao = self.tao 1302944e117SPaul T. Kühner 1312944e117SPaul T. Kühner x = PETSc.Vec().create(tao.getComm()) 1322944e117SPaul T. Kühner x.setType('standard') 1332944e117SPaul T. Kühner x.setSizes(2) 1342944e117SPaul T. Kühner c = PETSc.Vec().create(tao.getComm()) 1352944e117SPaul T. Kühner c.setSizes(1) 1362944e117SPaul T. Kühner c.setType(x.getType()) 1372944e117SPaul T. Kühner J = PETSc.Mat().create(tao.getComm()) 1382944e117SPaul T. Kühner J.setSizes([1, 2]) 1392944e117SPaul T. Kühner J.setType(PETSc.Mat.Type.DENSE) 1402944e117SPaul T. Kühner J.setUp() 1412944e117SPaul T. Kühner 1422944e117SPaul T. Kühner tao.setObjective(Objective()) 1432944e117SPaul T. Kühner tao.setGradient(Gradient(), None) 1442944e117SPaul T. Kühner tao.setInequalityConstraints(InEqConstraints(), c) 1452944e117SPaul T. Kühner tao.setJacobianInequality(InEqJacobian(), J, J) 1462944e117SPaul T. Kühner tao.setSolution(x) 1472944e117SPaul T. Kühner tao.setType(PETSc.TAO.Type.ALMM) 1482944e117SPaul T. Kühner tao.setTolerances(gatol=1.0e-4) 1492944e117SPaul T. Kühner tao.setFromOptions() 1502944e117SPaul T. Kühner tao.solve() 1512944e117SPaul T. Kühner self.assertTrue(x[1] - x[0] ** 2 >= -1.0e-4) 1522944e117SPaul T. Kühner 153d6e07cdcSHong Zhang def testBNCG(self): 154d6e07cdcSHong Zhang if self.tao.getComm().Get_size() > 1: 155d6e07cdcSHong Zhang return 156d6e07cdcSHong Zhang tao = self.tao 157d6e07cdcSHong Zhang 158d6e07cdcSHong Zhang x = PETSc.Vec().create(tao.getComm()) 159d6e07cdcSHong Zhang x.setType('standard') 160d6e07cdcSHong Zhang x.setSizes(2) 161d6e07cdcSHong Zhang xl = PETSc.Vec().create(tao.getComm()) 162d6e07cdcSHong Zhang xl.setType('standard') 163d6e07cdcSHong Zhang xl.setSizes(2) 164d6e07cdcSHong Zhang xl.set(0.0) 165d6e07cdcSHong Zhang xu = PETSc.Vec().create(tao.getComm()) 166d6e07cdcSHong Zhang xu.setType('standard') 167d6e07cdcSHong Zhang xu.setSizes(2) 168d6e07cdcSHong Zhang xu.set(2.0) 169d6e07cdcSHong Zhang tao.setVariableBounds((xl, xu)) 170d6e07cdcSHong Zhang tao.setObjective(Objective()) 171d6e07cdcSHong Zhang tao.setGradient(Gradient(), None) 172d6e07cdcSHong Zhang tao.setSolution(x) 173d6e07cdcSHong Zhang tao.setType(PETSc.TAO.Type.BNCG) 1746f336411SStefano Zampini tao.setTolerances(gatol=1.0e-4) 175d6e07cdcSHong Zhang ls = tao.getLineSearch() 176d6e07cdcSHong Zhang ls.setType(PETSc.TAOLineSearch.Type.UNIT) 177d6e07cdcSHong Zhang tao.setFromOptions() 178d6e07cdcSHong Zhang tao.solve() 179d6e07cdcSHong Zhang self.assertAlmostEqual(x[0], 2.0, places=4) 180d6e07cdcSHong Zhang self.assertAlmostEqual(x[1], 2.0, places=4) 181d6e07cdcSHong Zhang 182*8a612f1bSpaul.kuehner def testBQNLS(self): 183*8a612f1bSpaul.kuehner if self.tao.getComm().Get_size() > 1: 184*8a612f1bSpaul.kuehner return 185*8a612f1bSpaul.kuehner tao = self.tao 186*8a612f1bSpaul.kuehner 187*8a612f1bSpaul.kuehner x = PETSc.Vec().create(tao.getComm()) 188*8a612f1bSpaul.kuehner x.setType('standard') 189*8a612f1bSpaul.kuehner x.setSizes(2) 190*8a612f1bSpaul.kuehner xl = PETSc.Vec().create(tao.getComm()) 191*8a612f1bSpaul.kuehner xl.setType('standard') 192*8a612f1bSpaul.kuehner xl.setSizes(2) 193*8a612f1bSpaul.kuehner xl.set(0.0) 194*8a612f1bSpaul.kuehner xu = PETSc.Vec().create(tao.getComm()) 195*8a612f1bSpaul.kuehner xu.setType('standard') 196*8a612f1bSpaul.kuehner xu.setSizes(2) 197*8a612f1bSpaul.kuehner xu.set(2.0) 198*8a612f1bSpaul.kuehner tao.setVariableBounds((xl, xu)) 199*8a612f1bSpaul.kuehner tao.setObjective(Objective()) 200*8a612f1bSpaul.kuehner tao.setGradient(Gradient(), None) 201*8a612f1bSpaul.kuehner tao.setSolution(x) 202*8a612f1bSpaul.kuehner tao.setType(PETSc.TAO.Type.BQNLS) 203*8a612f1bSpaul.kuehner tao.setTolerances(gatol=1.0e-4) 204*8a612f1bSpaul.kuehner H = PETSc.Mat().createDense((2, 2), comm=tao.getComm()) 205*8a612f1bSpaul.kuehner H[0, 0] = 2 206*8a612f1bSpaul.kuehner H[0, 1] = 0 207*8a612f1bSpaul.kuehner H[1, 0] = 0 208*8a612f1bSpaul.kuehner H[1, 1] = 2 209*8a612f1bSpaul.kuehner H.assemble() 210*8a612f1bSpaul.kuehner tao.getLMVMMat().setLMVMJ0(H) 211*8a612f1bSpaul.kuehner tao.setFromOptions() 212*8a612f1bSpaul.kuehner tao.solve() 213*8a612f1bSpaul.kuehner self.assertEqual(tao.getIterationNumber(), 1) 214*8a612f1bSpaul.kuehner self.assertAlmostEqual(x[0], 2.0, places=4) 215*8a612f1bSpaul.kuehner self.assertAlmostEqual(x[1], 2.0, places=4) 216*8a612f1bSpaul.kuehner self.assertTrue(tao.getLMVMMat().getLMVMJ0().equal(H)) 217*8a612f1bSpaul.kuehner 2186f336411SStefano Zampini 2195808f684SSatish Balay# -------------------------------------------------------------------- 2205808f684SSatish Balay 2216f336411SStefano Zampini 2225808f684SSatish Balayclass TestTAOSelf(BaseTestTAO, unittest.TestCase): 2235808f684SSatish Balay COMM = PETSc.COMM_SELF 2245808f684SSatish Balay 2256f336411SStefano Zampini 2265808f684SSatish Balayclass TestTAOWorld(BaseTestTAO, unittest.TestCase): 2275808f684SSatish Balay COMM = PETSc.COMM_WORLD 2285808f684SSatish Balay 2296f336411SStefano Zampini 2305808f684SSatish Balay# -------------------------------------------------------------------- 2315808f684SSatish Balay 2326f336411SStefano Zampini 2335808f684SSatish Balayif numpy.iscomplexobj(PETSc.ScalarType()): 2345808f684SSatish Balay del BaseTestTAO 2355808f684SSatish Balay del TestTAOSelf 2365808f684SSatish Balay del TestTAOWorld 2375808f684SSatish Balay 2385808f684SSatish Balayif __name__ == '__main__': 2395808f684SSatish Balay unittest.main() 240