xref: /petsc/src/binding/petsc4py/test/test_optdb.py (revision 552edb6364df478b294b3111f33a8f37ca096b20)
15808f684SSatish Balayimport unittest
25808f684SSatish Balayfrom petsc4py import PETSc
35808f684SSatish Balayfrom sys import getrefcount
4*6f336411SStefano Zampiniimport numpy as np
55808f684SSatish Balay
65808f684SSatish Balay# --------------------------------------------------------------------
75808f684SSatish Balay
85808f684SSatish Balay
9*6f336411SStefano Zampiniclass TestOptions(unittest.TestCase):
105808f684SSatish Balay    PREFIX = 'myopts-'
11*6f336411SStefano Zampini    OPTLIST = [
12*6f336411SStefano Zampini        ('bool', True),
135808f684SSatish Balay        ('int', -7),
145808f684SSatish Balay        ('real', 5),
155808f684SSatish Balay        ('scalar', 3),
165808f684SSatish Balay        ('string', 'petsc4py'),
175808f684SSatish Balay    ]
185808f684SSatish Balay
195808f684SSatish Balay    def _putopts(self, opts=None, OPTLIST=None):
205808f684SSatish Balay        if opts is None:
215808f684SSatish Balay            opts = self.opts
225808f684SSatish Balay        if OPTLIST is None:
235808f684SSatish Balay            OPTLIST = self.OPTLIST
245808f684SSatish Balay        for k, v in OPTLIST:
255808f684SSatish Balay            opts[k] = v
26*6f336411SStefano Zampini
275808f684SSatish Balay    def _delopts(self, opts=None, OPTLIST=None):
285808f684SSatish Balay        if opts is None:
295808f684SSatish Balay            opts = self.opts
305808f684SSatish Balay        if OPTLIST is None:
315808f684SSatish Balay            OPTLIST = self.OPTLIST
32*6f336411SStefano Zampini        for k, _ in OPTLIST:
335808f684SSatish Balay            del opts[k]
345808f684SSatish Balay
355808f684SSatish Balay    def setUp(self):
365808f684SSatish Balay        self.opts = PETSc.Options(self.PREFIX)
375808f684SSatish Balay
385808f684SSatish Balay    def tearDown(self):
395808f684SSatish Balay        self.opts = None
4062e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
415808f684SSatish Balay
425808f684SSatish Balay    def testHasOpts(self):
435808f684SSatish Balay        self._putopts()
44*6f336411SStefano Zampini        for k, _ in self.OPTLIST:
455808f684SSatish Balay            self.assertTrue(self.opts.hasName(k))
465808f684SSatish Balay            self.assertTrue(k in self.opts)
475808f684SSatish Balay            missing = k + '-missing'
485808f684SSatish Balay            self.assertFalse(self.opts.hasName(missing))
495808f684SSatish Balay            self.assertFalse(missing in self.opts)
505808f684SSatish Balay        self._delopts()
515808f684SSatish Balay
525808f684SSatish Balay    def testGetOpts(self):
535808f684SSatish Balay        self._putopts()
545808f684SSatish Balay        for k, v in self.OPTLIST:
555808f684SSatish Balay            getopt = getattr(self.opts, 'get' + k.title())
565808f684SSatish Balay            self.assertEqual(getopt(k), v)
575808f684SSatish Balay        self._delopts()
585808f684SSatish Balay
595808f684SSatish Balay    def testGetAll(self):
605808f684SSatish Balay        self._putopts()
615808f684SSatish Balay        allopts = self.opts.getAll()
62*6f336411SStefano Zampini        self.assertTrue(isinstance(allopts, dict))
63*6f336411SStefano Zampini        optlist = [(k, str(v).lower()) for (k, v) in self.OPTLIST]
645808f684SSatish Balay        for k, v in allopts.items():
655808f684SSatish Balay            self.assertTrue((k, v) in optlist)
665808f684SSatish Balay        self._delopts()
675808f684SSatish Balay
685808f684SSatish Balay    def testGetAllQuoted(self):
69*6f336411SStefano Zampini        dct = {
70*6f336411SStefano Zampini            'o0': '"0 1 2"',
715808f684SSatish Balay            'o1': '"a b c"',
72*6f336411SStefano Zampini            'o2': '"x y z"',
73*6f336411SStefano Zampini        }
745808f684SSatish Balay        for k in dct:
755808f684SSatish Balay            self.opts[k] = dct[k]
765808f684SSatish Balay        allopts = self.opts.getAll()
775808f684SSatish Balay        for k in dct:
785808f684SSatish Balay            self.assertEqual(allopts[k], dct[k][1:-1])
795808f684SSatish Balay            del self.opts[k]
805808f684SSatish Balay
81*6f336411SStefano Zampini    def testType(self):
82*6f336411SStefano Zampini        types = [
83*6f336411SStefano Zampini            (bool, bool, self.opts.getBool, self.opts.getBoolArray),
84*6f336411SStefano Zampini            (int, PETSc.IntType, self.opts.getInt, self.opts.getIntArray),
85*6f336411SStefano Zampini            (float, PETSc.RealType, self.opts.getReal, self.opts.getRealArray),
86*6f336411SStefano Zampini        ]
87*6f336411SStefano Zampini        if PETSc.ScalarType is PETSc.ComplexType:
88*6f336411SStefano Zampini            types.append(
89*6f336411SStefano Zampini                (
90*6f336411SStefano Zampini                    complex,
91*6f336411SStefano Zampini                    PETSc.ScalarType,
92*6f336411SStefano Zampini                    self.opts.getScalar,
93*6f336411SStefano Zampini                    self.opts.getScalarArray,
94*6f336411SStefano Zampini                )
95*6f336411SStefano Zampini            )
96*6f336411SStefano Zampini        else:
97*6f336411SStefano Zampini            types.append(
98*6f336411SStefano Zampini                (
99*6f336411SStefano Zampini                    float,
100*6f336411SStefano Zampini                    PETSc.ScalarType,
101*6f336411SStefano Zampini                    self.opts.getScalar,
102*6f336411SStefano Zampini                    self.opts.getScalarArray,
103*6f336411SStefano Zampini                )
104*6f336411SStefano Zampini            )
105*6f336411SStefano Zampini        toval = (lambda x: x, lambda x: np.array(x).tolist(), lambda x: np.array(x))
106*6f336411SStefano Zampini        sv = 1
107*6f336411SStefano Zampini        av = (1, 0, 1)
108*6f336411SStefano Zampini        defv = 0
109*6f336411SStefano Zampini        defarrayv = (0, 0, 1, 0)
110*6f336411SStefano Zampini        for pyt, pat, pget, pgetarray in types:
111*6f336411SStefano Zampini            for tov in toval:
112*6f336411SStefano Zampini                self.opts.setValue('sv', tov(sv))
113*6f336411SStefano Zampini                self.opts.setValue('av', tov(av))
114*6f336411SStefano Zampini
115*6f336411SStefano Zampini                v = pget('sv')
116*6f336411SStefano Zampini                self.assertTrue(isinstance(v, pyt))
117*6f336411SStefano Zampini                self.assertEqual(v, pyt(sv))
118*6f336411SStefano Zampini
119*6f336411SStefano Zampini                v = pget('sv', defv)
120*6f336411SStefano Zampini                self.assertTrue(isinstance(v, pyt))
121*6f336411SStefano Zampini                self.assertEqual(v, pyt(sv))
122*6f336411SStefano Zampini
123*6f336411SStefano Zampini                v = pget('missing', defv)
124*6f336411SStefano Zampini                self.assertTrue(isinstance(v, pyt))
125*6f336411SStefano Zampini                self.assertEqual(v, pyt(defv))
126*6f336411SStefano Zampini
127*6f336411SStefano Zampini                if pgetarray is not None:
128*6f336411SStefano Zampini                    arrayv = pgetarray('av')
129*6f336411SStefano Zampini                    self.assertEqual(arrayv.dtype, pat)
130*6f336411SStefano Zampini                    self.assertEqual(len(arrayv), len(av))
131*6f336411SStefano Zampini                    for v1, v2 in zip(arrayv, av):
132*6f336411SStefano Zampini                        self.assertTrue(isinstance(v1.item(), pyt))
133*6f336411SStefano Zampini                        self.assertEqual(v1.item(), pyt(v2))
134*6f336411SStefano Zampini
135*6f336411SStefano Zampini                    arrayv = pgetarray('av', defarrayv)
136*6f336411SStefano Zampini                    self.assertEqual(arrayv.dtype, pat)
137*6f336411SStefano Zampini                    self.assertEqual(len(arrayv), len(av))
138*6f336411SStefano Zampini                    for v1, v2 in zip(arrayv, av):
139*6f336411SStefano Zampini                        self.assertTrue(isinstance(v1.item(), pyt))
140*6f336411SStefano Zampini                        self.assertEqual(v1.item(), pyt(v2))
141*6f336411SStefano Zampini
142*6f336411SStefano Zampini                    arrayv = pgetarray('missing', defarrayv)
143*6f336411SStefano Zampini                    self.assertEqual(arrayv.dtype, pat)
144*6f336411SStefano Zampini                    self.assertEqual(len(arrayv), len(defarrayv))
145*6f336411SStefano Zampini                    for v1, v2 in zip(arrayv, defarrayv):
146*6f336411SStefano Zampini                        self.assertTrue(isinstance(v1.item(), pyt))
147*6f336411SStefano Zampini                        self.assertEqual(v1.item(), pyt(v2))
148*6f336411SStefano Zampini
149*6f336411SStefano Zampini                self.opts.delValue('sv')
150*6f336411SStefano Zampini                self.opts.delValue('av')
151*6f336411SStefano Zampini
1525808f684SSatish Balay    def testMonitor(self):
1535808f684SSatish Balay        optlist = []
1545808f684SSatish Balay        mon = lambda n, v: optlist.append((n, v))
1555808f684SSatish Balay        self.opts.setMonitor(mon)
1565808f684SSatish Balay        self.assertEqual(getrefcount(mon) - 1, 2)
1575808f684SSatish Balay        self._putopts()
158*6f336411SStefano Zampini        target = [(self.PREFIX + k, str(v).lower()) for k, v in self.OPTLIST]
1595808f684SSatish Balay        self.assertEqual(optlist, target)
1605808f684SSatish Balay        self.opts.cancelMonitor()
1615808f684SSatish Balay        self.assertEqual(getrefcount(mon) - 1, 1)
1625808f684SSatish Balay        self._delopts()
1635808f684SSatish Balay
164*6f336411SStefano Zampini
1655808f684SSatish Balay# --------------------------------------------------------------------
1665808f684SSatish Balay
1675808f684SSatish Balaydel TestOptions.testMonitor  # XXX
1685808f684SSatish Balay
1695808f684SSatish Balayif __name__ == '__main__':
1705808f684SSatish Balay    unittest.main()
171