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 36*2944e117SPaul T. Kühnerclass InEqConstraints: 37*2944e117SPaul T. Kühner def __call__(self, tao, x, c): 38*2944e117SPaul T. Kühner c[0] = x[1] - x[0] ** 2 39*2944e117SPaul T. Kühner c.assemble() 40*2944e117SPaul T. Kühner 41*2944e117SPaul T. Kühner 42*2944e117SPaul T. Kühnerclass InEqJacobian: 43*2944e117SPaul T. Kühner def __call__(self, tao, x, J, P): 44*2944e117SPaul T. Kühner P[0, 0] = -2.0 * x[0] 45*2944e117SPaul T. Kühner P[0, 1] = 1.0 46*2944e117SPaul T. Kühner P.assemble() 47*2944e117SPaul T. Kühner if J != P: 48*2944e117SPaul T. Kühner J.assemble() 49*2944e117SPaul T. Kühner 50*2944e117SPaul 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 126*2944e117SPaul T. Kühner def testInequlityConstraints(self): 127*2944e117SPaul T. Kühner if self.tao.getComm().Get_size() > 1: 128*2944e117SPaul T. Kühner return 129*2944e117SPaul T. Kühner tao = self.tao 130*2944e117SPaul T. Kühner 131*2944e117SPaul T. Kühner x = PETSc.Vec().create(tao.getComm()) 132*2944e117SPaul T. Kühner x.setType('standard') 133*2944e117SPaul T. Kühner x.setSizes(2) 134*2944e117SPaul T. Kühner c = PETSc.Vec().create(tao.getComm()) 135*2944e117SPaul T. Kühner c.setSizes(1) 136*2944e117SPaul T. Kühner c.setType(x.getType()) 137*2944e117SPaul T. Kühner J = PETSc.Mat().create(tao.getComm()) 138*2944e117SPaul T. Kühner J.setSizes([1, 2]) 139*2944e117SPaul T. Kühner J.setType(PETSc.Mat.Type.DENSE) 140*2944e117SPaul T. Kühner J.setUp() 141*2944e117SPaul T. Kühner 142*2944e117SPaul T. Kühner tao.setObjective(Objective()) 143*2944e117SPaul T. Kühner tao.setGradient(Gradient(), None) 144*2944e117SPaul T. Kühner tao.setInequalityConstraints(InEqConstraints(), c) 145*2944e117SPaul T. Kühner tao.setJacobianInequality(InEqJacobian(), J, J) 146*2944e117SPaul T. Kühner tao.setSolution(x) 147*2944e117SPaul T. Kühner tao.setType(PETSc.TAO.Type.ALMM) 148*2944e117SPaul T. Kühner tao.setTolerances(gatol=1.0e-4) 149*2944e117SPaul T. Kühner tao.setFromOptions() 150*2944e117SPaul T. Kühner tao.solve() 151*2944e117SPaul T. Kühner self.assertTrue(x[1] - x[0] ** 2 >= -1.0e-4) 152*2944e117SPaul 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 1826f336411SStefano Zampini 1835808f684SSatish Balay# -------------------------------------------------------------------- 1845808f684SSatish Balay 1856f336411SStefano Zampini 1865808f684SSatish Balayclass TestTAOSelf(BaseTestTAO, unittest.TestCase): 1875808f684SSatish Balay COMM = PETSc.COMM_SELF 1885808f684SSatish Balay 1896f336411SStefano Zampini 1905808f684SSatish Balayclass TestTAOWorld(BaseTestTAO, unittest.TestCase): 1915808f684SSatish Balay COMM = PETSc.COMM_WORLD 1925808f684SSatish Balay 1936f336411SStefano Zampini 1945808f684SSatish Balay# -------------------------------------------------------------------- 1955808f684SSatish Balay 1966f336411SStefano Zampini 1975808f684SSatish Balayif numpy.iscomplexobj(PETSc.ScalarType()): 1985808f684SSatish Balay del BaseTestTAO 1995808f684SSatish Balay del TestTAOSelf 2005808f684SSatish Balay del TestTAOWorld 2015808f684SSatish Balay 2025808f684SSatish Balayif __name__ == '__main__': 2035808f684SSatish Balay unittest.main() 204