1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
from __future__ import division
import unittest
from fractions import Fraction
import schedcat.util.iter as iter
import schedcat.util.math as m
class Iters(unittest.TestCase):
def setUp(self):
self.s1 = xrange(1, 1000, 3)
self.s2 = xrange(4, 1000, 5)
self.s3 = [-3, 6000]
self.s1b = xrange(1, 1000, 3)
self.s1c = xrange(1, 1000, 3)
def test_imerge(self):
s = iter.imerge(lambda x, y: x < y, self.s1, self.s2, self.s3)
self.assertEqual(list(s)[:10],
[-3, 1, 4, 4, 7, 9, 10, 13, 14, 16])
def test_imerge2(self):
a = range(10)
b = range(1, 6)
c = range(3, 14)
a.reverse()
b.reverse()
c.reverse()
self.assertEqual(list(iter.imerge(lambda a,b: a >= b, a, b, c)),
[13, 12,11, 10,
9, 9, 8, 8, 7, 7, 6, 6,
5, 5, 5, 4, 4, 4, 3, 3, 3,
2, 2, 1, 1,
0])
def test_uniq(self):
s = iter.uniq(iter.imerge(lambda x, y: x < y, self.s1, self.s2, self.s3))
self.assertEqual(list(s)[:10],
[-3, 1, 4, 7, 9, 10, 13, 14, 16, 19])
class Math(unittest.TestCase):
def test_integral(self):
self.assertTrue(m.is_integral(int(1)))
self.assertTrue(m.is_integral(long(1)))
self.assertFalse(m.is_integral("foo"))
self.assertFalse(m.is_integral(1.0))
self.assertFalse(m.is_integral(20 / 1))
self.assertFalse(m.is_integral(Fraction(100, 10)))
def test_gcd(self):
self.assertEqual(m.gcd(10, 3), 1)
self.assertEqual(m.gcd(10, 2), 2)
self.assertEqual(m.gcd(15, 27), 3)
self.assertEqual(m.gcd(-10, 2), 2)
self.assertEqual(m.gcd(-20, -1930), 10)
self.assertEqual(m.gcd(10, 0), 10)
self.assertEqual(m.gcd(0, 10), 10)
self.assertEqual(m.gcd(10, 20), 10)
self.assertEqual(m.gcd(113, 17), 1)
self.assertEqual(m.gcd(-23, 17), 1)
self.assertEqual(m.gcd(-23, -54), 1)
def test_lcm(self):
self.assertEqual(m.lcm(), 0)
self.assertEqual(m.lcm(99), 99)
self.assertEqual(m.lcm(10, 20, 3), 60)
self.assertEqual(m.lcm(10, 20), 20)
self.assertEqual(m.lcm(3, 4), 12)
def test_topsum(self):
vals = [30, 60, 10, 40, 50, 20]
self.assertEqual(m.topsum(vals, lambda x: x * 2, 3), 2 * (40 + 50 + 60))
self.assertEqual(m.lcm(99), 99)
self.assertEqual(m.lcm(10, 20, 3), 60)
class LinEqs(unittest.TestCase):
def setUp(self):
self.f = m.lin(1, 3)
self.c = m.const(123)
self.pwlin = m.monotonic_pwlin([(0, 1), (1, 0), (1, 4), (2, 5)])
def test_const(self):
for x in xrange(1000):
self.assertAlmostEqual(self.c(x), 123)
def test_lin(self):
for x in xrange(1000):
self.assertAlmostEqual(self.f(x), 1 + x * 3.0)
def test_pwlin(self):
for x in xrange(1000):
self.assertAlmostEqual(self.pwlin(-x), 1)
self.assertAlmostEqual(self.pwlin(1), 1)
for x in xrange(1000):
x = x + 2
self.assertAlmostEqual(self.pwlin(x), x + 3)
|