def testThreadedSort(self):
        N_ITEMS = 100000
        N_SORTS = 32
        p = []
        p_ = pointless.PointlessPrimVector('u32', allow_print=False)

        for i in six.moves.range(N_ITEMS):
            v = random.randint(0, 100000)
            p_.append(v)

        for i in six.moves.range(N_SORTS):
            p.append(
                pointless.PointlessPrimVector('u32',
                                              sequence=p_,
                                              allow_print=False))

        d_list = []

        def sort_wrapper(P):
            P.sort()

        THREAD = True

        for i in six.moves.range(N_SORTS):
            if THREAD:
                d = threads.deferToThread(sort_wrapper, p[i])
                d_list.append(d)
            else:
                yield threads.deferToThread(sort_wrapper, p[i])

        if THREAD:
            yield defer.DeferredList(d_list)
示例#2
0
def RandomPrimVector(n, tc):
    ranges = {
        'i8': [-128, 127],
        'u8': [0, 255],
        'i16': [-600, 600],
        'u16': [0, 1200],
        'i32': [-2**31, 2**31 - 1],
        'u32': [0, 2**32 - 1],
        'i64': [-2**63, 2**63 - 1],
        'u64': [0, 2**64 - 1],
        'f': [None, None]
    }

    if tc == None:
        tc = random.choice(list(ranges.keys()))

    i_min, i_max = ranges[tc]

    if tc == 'f':
        return pointless.PointlessPrimVector(
            tc,
            sequence=(random.uniform(-10000.0, 10000.0)
                      for i in six.moves.range(n)))

    return pointless.PointlessPrimVector(
        tc,
        sequence=(random.randint(i_min, i_max) for i in six.moves.range(n)))
示例#3
0
    def testSort(self):
        random.seed(0)

        i_limits = [
            ('i8', -128, 127),
            ('u8', 0, 255),
            ('i16', -600, 600),
            ('u16', 0, 1200),
            ('i32', -1, 33000),
            ('u32', 0, 66000),
            ('i64', -2**63, 2**63 - 1),
            ('u64', 0, 2**64 - 1),
        ]

        def close_enough(v_a, v_b):
            return (abs(v_a - v_b) < 0.001)

        for i in six.moves.range(100):
            for tc, i_min, i_max in i_limits:
                for n_min in [0, 1000, 10000, 10000]:
                    n = random.randint(0, n_min)
                    py_v = [i_min, i_max]
                    py_v += [
                        random.randint(i_min, i_max)
                        for i in six.moves.range(n)
                    ]
                    random.shuffle(py_v)

                    pr_v = pointless.PointlessPrimVector(tc, sequence=py_v)

                    py_v.sort()
                    pr_v.sort()

                    self.assert_(len(py_v) == len(pr_v))
                    self.assert_(
                        all(a == b for a, b in six.moves.zip(py_v, pr_v)))

                    py_v = [
                        random.uniform(-10000.0, +10000.0)
                        for i in six.moves.range(n)
                    ]
                    random.shuffle(py_v)
                    pr_v = pointless.PointlessPrimVector('f', sequence=py_v)

                    py_v.sort()
                    pr_v.sort()

                    self.assert_(len(py_v) == len(pr_v))
                    self.assert_(
                        all(
                            close_enough(a, b)
                            for a, b in six.moves.zip(py_v, pr_v)))
示例#4
0
    def testPop(self):
        w = pointless.PointlessPrimVector('u32')
        self.assertRaises(IndexError, w.pop)

        w = pointless.PointlessPrimVector('u32',
                                          sequence=six.moves.range(1000))

        self.assert_(len(w) == 1000)

        for i in six.moves.range(1000):
            n = w.pop()
            self.assert_(n == 1000 - i - 1)

        self.assert_(len(w) == 0)
        self.assertRaises(IndexError, w.pop)
示例#5
0
    def testTypeCode(self):
        t = ['i8', 'u8', 'i16', 'u16', 'i32', 'u32', 'f']

        for tc in t:
            r = range(0, 10) if tc != 'f' else [0.0, 1.0, 2.0, 3.0]
            v = pointless.PointlessPrimVector(tc, sequence=r)
            self.assert_(v.typecode == tc)
示例#6
0
    def testProjSort(self):
        # pure python projection sort
        def my_proj_sort(proj, v):
            proj.sort(key=lambda i: tuple(
                v[index][i] for index in six.moves.range(len(v))))

        random.seed(0)

        # run some number of iterations
        for i in six.moves.range(10):
            # generate projection with indices in the range [i_min, i_max[
            i_min = random.randint(0, 1000)
            i_max = random.randint(i_min, i_min + 60000)
            py_proj = list(range(i_min, i_max))

            tc = ['i64', 'u64']

            if i_max < 2**32:
                tc.append('u32')
            if i_max < 2**31:
                tc.append('i32')
            if i_max < 2**16:
                tc.append('u16')
            if i_max < 2**15:
                tc.append('i16')
            if i_max < 2**8:
                tc.append('u8')
            if i_max < 2**7:
                tc.append('i8')

            # create an equivalent primary vector projection, using any of the possible primitive range types
            # since it is important to test them all
            tc = random.choice(tc)
            pp_proj = pointless.PointlessPrimVector(tc, sequence=py_proj)

            # create 1 to 16 value vectors
            n_attributes = random.randint(1, 16)
            pp_vv = [
                RandomPrimVector(i_max, None)
                for i in six.moves.range(n_attributes)
            ]
            py_vv = [list(pp_vv[i]) for i in six.moves.range(n_attributes)]

            # run both python and pointless projection sorts
            my_proj_sort(py_proj, py_vv)
            pp_proj.sort_proj(*pp_vv)

            self.assert_(len(py_proj) == len(pp_proj))

            for a, b in six.moves.zip(py_proj, pp_proj):
                if a != b:
                    t_a = [pp_vv[i][a] for i in six.moves.range(n_attributes)]
                    t_b = [py_vv[i][b] for i in six.moves.range(n_attributes)]

                    # since the pointless sort is not stable, we have to account for equivalence
                    if t_a == t_b:
                        continue

                    self.assert_(False)
    def testThreadedProjSort(self):
        N_DOMAIN = 1000
        N_ITEMS = 1000000
        N_SORTS = 32
        v = []

        for i in six.moves.range(10):
            v_ = pointless.PointlessPrimVector(
                'u32',
                sequence=(random.randint(0, 100)
                          for i in six.moves.range(N_DOMAIN)),
                allow_print=False)
            v.append(v_)

        t = pointless.PointlessPrimVector(
            'u32',
            sequence=(random.randint(0, N_DOMAIN - 1)
                      for i in six.moves.range(N_ITEMS)),
            allow_print=False)
        p = []

        for i in six.moves.range(N_SORTS):
            p_ = pointless.PointlessPrimVector('u32',
                                               sequence=t,
                                               allow_print=False)
            p.append(p_)

        THREADED = True
        d_list = []

        for i in six.moves.range(N_SORTS):
            if THREADED:
                d = threads.deferToThread(p[i].sort_proj, *v)
                d_list.append(d)
            else:
                yield threads.deferToThread(p[i].sort_proj, *v)

        if THREADED:
            yield defer.DeferredList(d_list)
示例#8
0
    def testPrimVector(self):
        # integer types, and their ranges
        int_info = [['i8', -2**7, 2**7 - 1], ['u8', 0, 2**8 - 1],
                    ['i16', -2**15, 2**15 - 1], ['u16', 0, 2**16 - 1],
                    ['i32', -2**31, 2**31 - 1], ['u32', 0, 2**32 - 1]]

        # legal values, and their output, plus an iterator based creation, and item-by-item comparison
        for v_type, v_min, v_max in int_info:
            v = pointless.PointlessPrimVector(v_type)
            v.append(v_min)
            v.append(0)
            v.append(v_max)

            a, b, c = v

            self.assert_(a == v_min and b == 0 and c == v_max)

            vv = pointless.PointlessPrimVector(v_type, sequence=v)

            self.assert_(len(v) == len(vv))

            a, b, c = vv

            self.assert_(a == v_min and b == 0 and c == v_max)

            for aa, bb in six.moves.zip(v, vv):
                self.assert_(aa == bb)

        # illegal values, which must fail
        for v_type, v_min, v_max in int_info:
            v = pointless.PointlessPrimVector(v_type)

            self.assertRaises(ValueError, v.append, v_min - 1)
            self.assertRaises(ValueError, v.append, v_max + 1)

        # floating point
        if True:
            v = pointless.PointlessPrimVector('f')
            v.append(-100.0)
            v.append(-0.5)
            v.append(0.0)
            v.append(+100.0)
            v.append(+0.5)

            vv = pointless.PointlessPrimVector('f', sequence=v)

            self.assert_(len(v) == len(vv))

            for aa, bb in six.moves.zip(v, vv):
                self.assert_(aa == bb)

            v = pointless.PointlessPrimVector('f')

            self.assertRaises(TypeError, v.append, 0)
示例#9
0
    def testSerialize(self):
        random.seed(0)

        tcs = ['i8', 'u8', 'i16', 'u16', 'i32', 'u32', 'i64', 'u64', 'f']

        for tc in tcs:
            n_random = list(range(100))

            for i in six.moves.range(100):
                n_random.append(random.randint(101, 10000))

            for n in n_random:
                v_in = RandomPrimVector(n, tc)
                buffer = v_in.serialize()
                v_out = pointless.PointlessPrimVector(buffer=buffer)

                self.assert_(v_in.typecode == v_out.typecode)
                self.assert_(len(v_in) == len(v_out))
                self.assert_(a == b for a, b in six.moves.zip(v_in, v_out))
示例#10
0
    def testSlice(self):
        # vector types, and their ranges
        v_info = [['i8', -2**7, 2**7 - 1], ['u8', 0, 2**8 - 1],
                  ['i16', -2**15, 2**15 - 1], ['u16', 0, 2**16 - 1],
                  ['i32', -2**31, 2**31 - 1], ['u32', 0, 2**32 - 1],
                  ['i64', -2**63, 2**63 - 1], ['u64', 0, 2**64 - 1],
                  ['f', None, None]]

        random.seed(0)

        def v_eq(v_a, v_b):
            if len(v_a) != len(v_b):
                return False

            for a, b in six.moves.zip(v_a, v_b):
                if isinstance(a, float) and isinstance(b, float):
                    if not (abs(a - b) < 0.001):
                        return False
                elif a != b:
                    return False

            return True

        # we do multiple iterations
        for i in six.moves.range(100):
            # select type and range
            v_type, v_min, v_max = random.choice(v_info)

            n = random.randint(0, 1000)

            v_a = pointless.PointlessPrimVector(v_type)
            v_b = []

            for j in six.moves.range(n):
                if v_type == 'f':
                    v = random.uniform(-10000.0, 10000.0)
                else:
                    v = random.randint(v_min, v_max)

                v_a.append(v)
                v_b.append(v)

            for j in six.moves.range(100):
                i_min = random.randint(-1000, 1000)
                i_max = random.randint(1000, 1000)

                s_a = v_a[:]
                s_b = v_b[:]

                self.assert_(v_eq(s_a, s_b))

                s_a = v_a[i_min:]
                s_b = v_b[i_min:]

                self.assert_(v_eq(s_a, s_b))

                s_a = v_a[:i_max]
                s_b = v_b[:i_max]

                self.assert_(v_eq(s_a, s_b))

                s_a = v_a[i_min:i_max]
                s_b = v_b[i_min:i_max]

                self.assert_(v_eq(s_a, s_b))

                try:
                    s_a = [v_a[i_min]]
                except IndexError:
                    s_a = None

                try:
                    s_b = [v_b[i_min]]
                except IndexError:
                    s_b = None

                self.assert_((s_a == None) == (s_b == None))
                self.assert_(s_a == None or v_eq(s_a, s_b))

                try:
                    s_a = [v_a[i_max]]
                except IndexError:
                    s_a = None

                try:
                    s_b = [v_b[i_max]]
                except IndexError:
                    s_b = None

                self.assert_((s_a == None) == (s_b == None))
                self.assert_(s_a == None or v_eq(s_a, s_b))