xref: /petsc/src/binding/petsc4py/test/test_tao.py (revision 8a612f1b888df068442f7dd0662f57f8d2de1c4c)
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