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