xref: /petsc/src/binding/petsc4py/test/test_vec.py (revision aa23289ce57543214c435f7ffe49ddf22ecde234)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
3*aa23289cSDaiane Iglesia Dolciimport numpy as np
45808f684SSatish Balay
55808f684SSatish Balay# --------------------------------------------------------------------
65808f684SSatish Balay
75808f684SSatish Balay
86f336411SStefano Zampiniclass BaseTestVec:
95808f684SSatish Balay    COMM = None
105808f684SSatish Balay    TYPE = None
115808f684SSatish Balay
125808f684SSatish Balay    def setUp(self):
135808f684SSatish Balay        v = PETSc.Vec()
145808f684SSatish Balay        v.create(self.COMM)
155808f684SSatish Balay        v.setSizes(100)
165808f684SSatish Balay        v.setType(self.TYPE)
175808f684SSatish Balay        self.vec = v
185808f684SSatish Balay
195808f684SSatish Balay    def tearDown(self):
205808f684SSatish Balay        self.vec.destroy()
215808f684SSatish Balay        self.vec = None
2262e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
235808f684SSatish Balay
245808f684SSatish Balay    def testDuplicate(self):
255808f684SSatish Balay        self.vec.set(1)
265808f684SSatish Balay        vec = self.vec.duplicate()
275808f684SSatish Balay        self.assertFalse(self.vec.equal(vec))
285808f684SSatish Balay        self.assertEqual(self.vec.sizes, vec.sizes)
295808f684SSatish Balay        del vec
305808f684SSatish Balay
315808f684SSatish Balay    def testCopy(self):
325808f684SSatish Balay        self.vec.set(1)
335808f684SSatish Balay        vec = self.vec.duplicate()
345808f684SSatish Balay        self.vec.copy(vec)
355808f684SSatish Balay        self.assertTrue(self.vec.equal(vec))
365808f684SSatish Balay        del vec
375808f684SSatish Balay
385808f684SSatish Balay    def testDot(self):
395808f684SSatish Balay        self.vec.set(1)
405808f684SSatish Balay        d = self.vec.dot(self.vec)
415808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
425808f684SSatish Balay        self.vec.dotBegin(self.vec)
435808f684SSatish Balay        d = self.vec.dotEnd(self.vec)
445808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
455808f684SSatish Balay
465808f684SSatish Balay    def testNorm(self):
475808f684SSatish Balay        from math import sqrt
486f336411SStefano Zampini
495808f684SSatish Balay        self.vec.set(1)
505808f684SSatish Balay        n1 = self.vec.norm(PETSc.NormType.NORM_1)
515808f684SSatish Balay        n2 = self.vec.norm(PETSc.NormType.NORM_2)
525808f684SSatish Balay        ni = self.vec.norm(PETSc.NormType.NORM_INFINITY)
535808f684SSatish Balay        self.assertAlmostEqual(n1, self.vec.getSize())
545808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
555808f684SSatish Balay        self.assertAlmostEqual(n2, self.vec.norm())
565808f684SSatish Balay        self.assertAlmostEqual(ni, 1.0)
575808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_1)
585808f684SSatish Balay        nn1 = self.vec.normEnd(PETSc.NormType.NORM_1)
595808f684SSatish Balay        self.assertAlmostEqual(nn1, n1)
605808f684SSatish Balay        self.vec.normBegin()
615808f684SSatish Balay        nn2 = self.vec.normEnd()
625808f684SSatish Balay        self.assertAlmostEqual(nn2, n2)
635808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_INFINITY)
645808f684SSatish Balay        nni = self.vec.normEnd(PETSc.NormType.NORM_INFINITY)
655808f684SSatish Balay        self.assertAlmostEqual(nni, ni)
665808f684SSatish Balay
675808f684SSatish Balay    def testNormalize(self):
685808f684SSatish Balay        from math import sqrt
696f336411SStefano Zampini
705808f684SSatish Balay        self.vec.set(1)
715808f684SSatish Balay        n2 = self.vec.normalize()
725808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
735808f684SSatish Balay        self.assertAlmostEqual(1, self.vec.norm())
745808f684SSatish Balay
755808f684SSatish Balay    def testSumMinMax(self):
765808f684SSatish Balay        self.vec.set(1)
775808f684SSatish Balay        self.assertEqual(self.vec.sum(), self.vec.getSize())
785808f684SSatish Balay        self.vec.set(-7)
795808f684SSatish Balay        self.assertEqual(self.vec.min()[1], -7)
805808f684SSatish Balay        self.vec.set(10)
815808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 10)
825808f684SSatish Balay
835808f684SSatish Balay    def testSwap(self):
845808f684SSatish Balay        v1 = self.vec
855808f684SSatish Balay        v2 = v1.duplicate()
865808f684SSatish Balay        v1.set(1)
875808f684SSatish Balay        v2.set(2)
885808f684SSatish Balay        v1.swap(v2)
895808f684SSatish Balay        idx, _ = self.vec.getOwnershipRange()
905808f684SSatish Balay        self.assertEqual(v1[idx], 2)
915808f684SSatish Balay        self.assertEqual(v2[idx], 1)
925808f684SSatish Balay
935808f684SSatish Balay    def testBsize(self):
945808f684SSatish Balay        self.vec.setBlockSize(1)
955808f684SSatish Balay        self.assertEqual(self.vec.getBlockSize(), 1)
965808f684SSatish Balay        self.vec.setBlockSize(1)
975808f684SSatish Balay
985808f684SSatish Balay    def testGetSetVals(self):
995808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
1005808f684SSatish Balay        self.vec[start] = -7
1015808f684SSatish Balay        self.vec[end - 1] = -7
10260211e57SBarry Smith        self.vec.assemble()
1035808f684SSatish Balay        self.assertEqual(self.vec[start], -7)
1045808f684SSatish Balay        self.assertEqual(self.vec[end - 1], -7)
1056f336411SStefano Zampini        for i in range(start, end):
1066f336411SStefano Zampini            self.vec[i] = i
10760211e57SBarry Smith        self.vec.assemble()
1085808f684SSatish Balay        values = [self.vec[i] for i in range(start, end)]
1095808f684SSatish Balay        self.assertEqual(values, list(range(start, end)))
1105808f684SSatish Balay        sz = self.vec.getSize()
1115808f684SSatish Balay        self.assertEqual(self.vec.sum(), (sz - 1) / 2.0 * sz)
1125808f684SSatish Balay
1135808f684SSatish Balay    def testGetSetValsBlocked(self):
1145808f684SSatish Balay        return
1155808f684SSatish Balay        lsize, gsize = self.vec.getSizes()
1165808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
1175808f684SSatish Balay        bsizes = list(range(1, lsize + 1))
1185808f684SSatish Balay        nblocks = list(range(1, lsize + 1))
1196f336411SStefano Zampini        compat = [
1206f336411SStefano Zampini            (bs, nb)
1216f336411SStefano Zampini            for bs in bsizes
1226f336411SStefano Zampini            if not (gsize % bs or lsize % bs)
1236f336411SStefano Zampini            for nb in nblocks
1246f336411SStefano Zampini            if bs * nb <= lsize
1256f336411SStefano Zampini        ]
1265808f684SSatish Balay        for bsize, nblock in compat:
1275808f684SSatish Balay            self.vec.setBlockSize(bsize)
1285808f684SSatish Balay            bindex = [start // bsize + i for i in range(nblock)]
1295808f684SSatish Balay            bvalue = [float(i) for i in range(nblock * bsize)]
1305808f684SSatish Balay            self.vec.setValuesBlocked(bindex, bvalue)
1315808f684SSatish Balay            self.vec.assemble()
1325808f684SSatish Balay            index = [start + i for i in range(nblock * bsize)]
1335808f684SSatish Balay            value = self.vec.getValues(index)
1345808f684SSatish Balay            self.assertEqual(bvalue, list(value))
1355808f684SSatish Balay
1365808f684SSatish Balay    def testGetSetArray(self):
1375808f684SSatish Balay        self.vec.set(1)
1385808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1395808f684SSatish Balay        self.assertEqual(arr0.sum(), self.vec.getLocalSize())
1405808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1415808f684SSatish Balay        self.vec.setRandom()
1425808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1435808f684SSatish Balay        self.vec.setArray(arr1)
1445808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1455808f684SSatish Balay        arr2 = self.vec.getArray().copy()
1465808f684SSatish Balay        self.assertTrue((arr1 == arr2).all())
1475808f684SSatish Balay        import numpy
1486f336411SStefano Zampini
1495808f684SSatish Balay        refs = self.vec.getRefCount()
1505808f684SSatish Balay        arr3 = numpy.asarray(self.vec)
1515808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs + 1)
1525808f684SSatish Balay        self.assertTrue((arr1 == arr3).all())
1535808f684SSatish Balay        arr3[:] = 0
1545808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 0)
1555808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 0)
1565808f684SSatish Balay        self.assertEqual(self.vec.min()[1], 0)
1575808f684SSatish Balay        self.vec.set(1)
1585808f684SSatish Balay        self.assertAlmostEqual(abs(arr3.sum()), self.vec.getLocalSize())
1595808f684SSatish Balay        self.assertEqual(arr3.min(), 1)
1605808f684SSatish Balay        self.assertEqual(arr3.max(), 1)
1615808f684SSatish Balay        del arr3
1625808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs)
1635808f684SSatish Balay
1645808f684SSatish Balay    def testPlaceArray(self):
1655808f684SSatish Balay        self.vec.set(1)
1665808f684SSatish Balay        array = self.vec.getArray().copy()
1675808f684SSatish Balay        self.vec.placeArray(array)
1685808f684SSatish Balay        array[:] = 2
1695808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 2 * self.vec.getSize())
1705808f684SSatish Balay        self.vec.resetArray()
1715808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), self.vec.getSize())
1725808f684SSatish Balay
173df341386SStefano Zampini    def testLocalVector(self):
174df341386SStefano Zampini        rank = self.vec.getComm().Get_rank()
175df341386SStefano Zampini        self.vec.getArray()[:] = rank + 1
176df341386SStefano Zampini        ln = self.vec.getLocalSize()
177df341386SStefano Zampini        lvec = self.vec.createLocalVector()
178df341386SStefano Zampini        self.vec.getLocalVector(lvec)
179df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank + 1) * ln)
180df341386SStefano Zampini        self.vec.restoreLocalVector(lvec)
181df341386SStefano Zampini        self.vec.getLocalVector(lvec, readonly=True)
182df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank + 1) * ln)
183df341386SStefano Zampini        self.vec.restoreLocalVector(lvec, readonly=True)
184df341386SStefano Zampini        lvec.destroy()
185df341386SStefano Zampini
1865808f684SSatish Balay    def testSetOption(self):
1875808f684SSatish Balay        opt1 = PETSc.Vec.Option.IGNORE_OFF_PROC_ENTRIES
1885808f684SSatish Balay        opt2 = PETSc.Vec.Option.IGNORE_NEGATIVE_INDICES
1895808f684SSatish Balay        for opt in [opt1, opt2] * 2:
1905808f684SSatish Balay            for flag in [True, False] * 2:
1915808f684SSatish Balay                self.vec.setOption(opt, flag)
1925808f684SSatish Balay
1935808f684SSatish Balay    def testGetSetItem(self):
1945808f684SSatish Balay        v = self.vec
1955808f684SSatish Balay        w = v.duplicate()
1965808f684SSatish Balay        #
1975808f684SSatish Balay        v[...] = 7
1985808f684SSatish Balay        self.assertEqual(v.max()[1], 7)
1995808f684SSatish Balay        self.assertEqual(v.min()[1], 7)
2005808f684SSatish Balay        #
2015808f684SSatish Balay        v.setRandom()
2025808f684SSatish Balay        w[...] = v
2035808f684SSatish Balay        self.assertTrue(w.equal(v))
2045808f684SSatish Balay        #
2055808f684SSatish Balay        v.setRandom()
2065808f684SSatish Balay        w[...] = v.getArray()
2075808f684SSatish Balay        self.assertTrue(w.equal(v))
2085808f684SSatish Balay        #
2095808f684SSatish Balay        s, e = v.getOwnershipRange()
2105808f684SSatish Balay        v.setRandom()
2115808f684SSatish Balay        w[s:e] = v.getArray().copy()
21260211e57SBarry Smith        w.assemble()
2135808f684SSatish Balay        self.assertTrue(w.equal(v))
2145808f684SSatish Balay        w1, v1 = w[s], v[s]
2155808f684SSatish Balay        w2, v2 = w[e - 1], v[e - 1]
2165808f684SSatish Balay        self.assertEqual(w1, v1)
2175808f684SSatish Balay        self.assertEqual(w2, v2)
2185808f684SSatish Balay
2195808f684SSatish Balay    def testMAXPY(self):
2205808f684SSatish Balay        y = self.vec
2215808f684SSatish Balay        y.set(1)
2225808f684SSatish Balay        x = [y.copy() for _ in range(3)]
2235808f684SSatish Balay        a = [1] * len(x)
2245808f684SSatish Balay        y.maxpy(a, x)
2255808f684SSatish Balay        z = y.duplicate()
2265808f684SSatish Balay        z.set(len(x) + 1)
2276f336411SStefano Zampini        self.assertTrue(y.equal(z))
2285808f684SSatish Balay
229dda1fc56SLisandro Dalcin    def testBinOp(self):
230dda1fc56SLisandro Dalcin        x = self.vec
231dda1fc56SLisandro Dalcin        x.set(1)
232dda1fc56SLisandro Dalcin        n = x.getSize()
233dda1fc56SLisandro Dalcin        y = 2 + 2 * x + 1 - x * 3 - 1
234dda1fc56SLisandro Dalcin        self.assertEqual(y.min()[1], 1)
235dda1fc56SLisandro Dalcin        self.assertEqual(y.max()[1], 1)
236dda1fc56SLisandro Dalcin        z = (4 * x) / (2 * y)
237dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 2)
238dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 2)
239dda1fc56SLisandro Dalcin        z = z / 2
240dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 1)
241dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 1)
242dda1fc56SLisandro Dalcin        s = (+x) @ (-y)
243dda1fc56SLisandro Dalcin        self.assertEqual(s, -n)
244dda1fc56SLisandro Dalcin        #
245dda1fc56SLisandro Dalcin        M, N = n, 2 * n
246dda1fc56SLisandro Dalcin        A = PETSc.Mat().createDense((M, N), comm=self.COMM)
247dda1fc56SLisandro Dalcin        A.setUp()
248dda1fc56SLisandro Dalcin        rs, re = A.getOwnershipRange()
249dda1fc56SLisandro Dalcin        cs, ce = A.getOwnershipRangeColumn()
250dda1fc56SLisandro Dalcin        a, b = 3, 5
251dda1fc56SLisandro Dalcin        for i in range(rs, re):
252dda1fc56SLisandro Dalcin            for j in range(N):
253dda1fc56SLisandro Dalcin                A[i, j] = a * i + b * j
254dda1fc56SLisandro Dalcin        A.assemble()
255dda1fc56SLisandro Dalcin        y = x @ A
256dda1fc56SLisandro Dalcin        self.assertEqual(y.getSize(), N)
257dda1fc56SLisandro Dalcin        for i in range(cs, ce):
258dda1fc56SLisandro Dalcin            self.assertEqual(y[i], a * M * (M - 1) / 2 + b * i * M)
259dda1fc56SLisandro Dalcin        y.set(1)
260dda1fc56SLisandro Dalcin        z = A @ y
261dda1fc56SLisandro Dalcin        self.assertEqual(z.getSize(), M)
262dda1fc56SLisandro Dalcin        for i in range(rs, re):
263dda1fc56SLisandro Dalcin            self.assertEqual(z[i], b * N * (N - 1) / 2 + a * i * N)
2645808f684SSatish Balay
265*aa23289cSDaiane Iglesia Dolci    def testConcatenate(self):
266*aa23289cSDaiane Iglesia Dolci        x = self.vec
267*aa23289cSDaiane Iglesia Dolci        y = x.duplicate()
268*aa23289cSDaiane Iglesia Dolci        x.set(1)
269*aa23289cSDaiane Iglesia Dolci        y.set(2)
270*aa23289cSDaiane Iglesia Dolci        z, index_ises = PETSc.Vec.concatenate([x, y])
271*aa23289cSDaiane Iglesia Dolci        self.assertEqual(z.getLocalSize(), x.getLocalSize() + y.getLocalSize())
272*aa23289cSDaiane Iglesia Dolci        self.assertEqual(z.min()[1], x.min()[1])
273*aa23289cSDaiane Iglesia Dolci        self.assertEqual(z.max()[1], y.max()[1])
274*aa23289cSDaiane Iglesia Dolci        np.allclose(z.getArray(), np.concatenate([x.getArray(), y.getArray()]))
275*aa23289cSDaiane Iglesia Dolci        np.allclose(z.getArray()[0:x.getLocalSize()], x.getArray())
276*aa23289cSDaiane Iglesia Dolci        np.allclose(z.getArray()[x.getLocalSize():], y.getArray())
2776f336411SStefano Zampini
2785808f684SSatish Balay# --------------------------------------------------------------------
2795808f684SSatish Balay
2806f336411SStefano Zampini
2815808f684SSatish Balayclass TestVecSeq(BaseTestVec, unittest.TestCase):
2825808f684SSatish Balay    COMM = PETSc.COMM_SELF
2835808f684SSatish Balay    TYPE = PETSc.Vec.Type.SEQ
2845808f684SSatish Balay
2856f336411SStefano Zampini
2865808f684SSatish Balayclass TestVecMPI(BaseTestVec, unittest.TestCase):
2875808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2885808f684SSatish Balay    TYPE = PETSc.Vec.Type.MPI
2895808f684SSatish Balay
2906f336411SStefano Zampini
2915808f684SSatish Balayclass TestVecShared(BaseTestVec, unittest.TestCase):
2925808f684SSatish Balay    if PETSc.COMM_WORLD.getSize() == 1:
2935808f684SSatish Balay        TYPE = PETSc.Vec.Type.SHARED
2945808f684SSatish Balay    else:
2955808f684SSatish Balay        TYPE = PETSc.Vec.Type.MPI
2965808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2975808f684SSatish Balay
2986f336411SStefano Zampini
2995808f684SSatish Balay# class TestVecSieve(BaseTestVec, unittest.TestCase):
3005808f684SSatish Balay#    CLASS = PETSc.VecSieve
3015808f684SSatish Balay#    TARGS = ([],)
3025808f684SSatish Balay
3035808f684SSatish Balay# class TestVecGhost(BaseTestVec, unittest.TestCase):
3045808f684SSatish Balay#    CLASS = PETSc.VecGhost
3055808f684SSatish Balay#    TARGS = ([],)
3065808f684SSatish Balay
3075808f684SSatish Balay# --------------------------------------------------------------------
3085808f684SSatish Balay
3095808f684SSatish Balay
3106f336411SStefano Zampiniclass TestVecWithArray(unittest.TestCase):
3115808f684SSatish Balay    def testCreateSeq(self):
3125808f684SSatish Balay        import numpy
3136f336411SStefano Zampini
3145808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
3155808f684SSatish Balay
3165808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_SELF)
3175808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=5, comm=PETSc.COMM_SELF)
3185808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=3, comm=PETSc.COMM_SELF)
3195808f684SSatish Balay
3205808f684SSatish Balay        self.assertTrue(v1.size == 5)
3215808f684SSatish Balay        self.assertTrue(v2.size == 5)
3225808f684SSatish Balay        self.assertTrue(v3.size == 3)
3235808f684SSatish Balay
3246f336411SStefano Zampini        a1 = v1.getDict()['__array__']
3256f336411SStefano Zampini        self.assertTrue(a is a1)
3266f336411SStefano Zampini        a2 = v2.getDict()['__array__']
3276f336411SStefano Zampini        self.assertTrue(a is a2)
3286f336411SStefano Zampini        a3 = v3.getDict()['__array__']
3296f336411SStefano Zampini        self.assertTrue(a is a3)
3305808f684SSatish Balay
3315808f684SSatish Balay    def testCreateMPI(self):
3325808f684SSatish Balay        import numpy
3336f336411SStefano Zampini
3345808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
3355808f684SSatish Balay
3365808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_WORLD)
3375808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=(5, None), comm=PETSc.COMM_WORLD)
3385808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=(3, None), comm=PETSc.COMM_WORLD)
3395808f684SSatish Balay
3405808f684SSatish Balay        self.assertTrue(v1.local_size == 5)
3415808f684SSatish Balay        self.assertTrue(v2.local_size == 5)
3425808f684SSatish Balay        self.assertTrue(v3.local_size == 3)
3435808f684SSatish Balay
3446f336411SStefano Zampini        a1 = v1.getDict()['__array__']
3456f336411SStefano Zampini        self.assertTrue(a is a1)
3466f336411SStefano Zampini        a2 = v2.getDict()['__array__']
3476f336411SStefano Zampini        self.assertTrue(a is a2)
3486f336411SStefano Zampini        a3 = v3.getDict()['__array__']
3496f336411SStefano Zampini        self.assertTrue(a is a3)
3505808f684SSatish Balay
3515808f684SSatish Balay    def testSetMPIGhost(self):
3525808f684SSatish Balay        import numpy
3536f336411SStefano Zampini
3545808f684SSatish Balay        v = PETSc.Vec().create()
3555808f684SSatish Balay        v.setType(PETSc.Vec.Type.MPI)
3565808f684SSatish Balay        v.setSizes((5, None))
3575808f684SSatish Balay        ghosts = [i % v.size for i in range(v.owner_range[1], v.owner_range[1] + 3)]
3585808f684SSatish Balay        v.setMPIGhost(ghosts)
359e0aaf7daSStefano Zampini        v.setArray(numpy.array(range(*v.owner_range), dtype=PETSc.ScalarType))
3605808f684SSatish Balay        v.ghostUpdate()
3615808f684SSatish Balay        with v.localForm() as loc:
3625808f684SSatish Balay            self.assertTrue((loc[0 : v.local_size] == range(*v.owner_range)).all())
3635808f684SSatish Balay            self.assertTrue((loc[v.local_size :] == ghosts).all())
3645808f684SSatish Balay
3656f336411SStefano Zampini
3665808f684SSatish Balay# --------------------------------------------------------------------
3675808f684SSatish Balay
3685808f684SSatish Balayif __name__ == '__main__':
3695808f684SSatish Balay    unittest.main()
3705808f684SSatish Balay
3715808f684SSatish Balay# --------------------------------------------------------------------
372