3
__author__ = "Kristian B. Oelgaard (k.b.oelgaard@gmail.com)"
4
__date__ = "2010-01-06"
5
__copyright__ = "Copyright (C) 2010 Kristian B. Oelgaard"
6
__license__ = "GNU GPL version 3 or any later version"
8
# Last changed: 2010-02-01
15
from ffc.quadrature.symbolics import *
16
from ffc.cpp import format, set_float_formatting
17
from ffc.parameters import FFC_PARAMETERS
18
set_float_formatting(FFC_PARAMETERS['precision'])
20
class TestMixedSymbols(unittest.TestCase):
22
def testMixedSymbols(self):
24
f_0 = format["float"](0)
25
f_2 = format["float"](2)
26
f_3 = format["float"](3)
27
f_4 = format["float"](4)
28
f_6 = format["float"](6)
34
s0 = Symbol("x", BASIS)
38
p0 = Product([s0, s1])
39
p1 = Product([f1, s0, s1])
40
p2 = Product([s0, f2, s2])
41
p3 = Product([s0, f0, s1, f1, s2])
46
S3 = Sum([s0, f0, s0])
53
x = 1.2; y = 2.36; z = 6.75;
55
mpp0 = Product([p0, s0])
56
mpp1 = Product([p1, p0])
57
mpp2 = Product([p2, p3])
58
mpp3 = Product([p1, mpp1])
60
mps0 = Product([S0, s0])
61
mps1 = Product([S1, S0])
62
mps2 = Product([S2, S3])
63
mps3 = Product([S1, mps1])
65
mpf0 = Product([F1, s0])
66
mpf1 = Product([F1, F2])
67
mpf2 = Product([F2, F3])
68
mpf3 = Product([F1, mpf1])
70
# print "\nMixed Products"
71
# print "\nmpp0: %s * %s = '%s'" % (p0, s0, mpp0)
72
# print "mpp1: %s * %s = '%s'" % (p1, p0, mpp1)
73
# print "mpp2: %s * %s = '%s'" % (p2, p3, mpp2)
74
# print "mpp3: %s * %s = '%s'" % (p1, mpp1, mpp3)
75
# print "\nmps0: %s * %s = '%s'" % (S0, s0, mps0)
76
# print "mps1: %s * %s = '%s'" % (S1, S0, mps1)
77
# print "mps2: %s * %s = '%s'" % (S2, S3, mps2)
78
# print "mps3: %s * %s = '%s'" % (S1, mps1, mps3)
79
# print "\nmpf0: %s * %s = '%s'" % (F1, s0, mpf0)
80
# print "mpf1: %s * %s = '%s'" % (F1, F2, mpf1)
81
# print "mpf2: %s * %s = '%s'" % (F2, F3, mpf2)
82
# print "mpf3: %s * %s = '%s'" % (F1, mpf1, mpf3)
84
self.assertAlmostEqual(eval(str(mpp0)), eval(str(p0))*eval(str(s0)))
85
self.assertAlmostEqual(eval(str(mpp1)), eval(str(p1))*eval(str(p0)))
86
self.assertAlmostEqual(eval(str(mpp2)), eval(str(p2))*eval(str(p3)))
87
self.assertAlmostEqual(eval(str(mpp3)), eval(str(p1))*eval(str(mpp1)))
89
self.assertAlmostEqual(eval(str(mps0)), eval(str(S0))*eval(str(s0)))
90
self.assertAlmostEqual(eval(str(mps1)), eval(str(S1))*eval(str(S0)))
91
self.assertAlmostEqual(eval(str(mps2)), eval(str(S2))*eval(str(S3)))
92
self.assertAlmostEqual(eval(str(mps3)), eval(str(S1))*eval(str(mps1)))
94
self.assertAlmostEqual(eval(str(mpf0)), eval(str(F1))*eval(str(s0)))
95
self.assertAlmostEqual(eval(str(mpf1)), eval(str(F1))*eval(str(F2)))
96
self.assertAlmostEqual(eval(str(mpf2)), eval(str(F2))*eval(str(F3)))
97
self.assertAlmostEqual(eval(str(mpf3)), eval(str(F1))*eval(str(mpf1)))
99
self.assertEqual(mpp0.ops(), 2)
100
self.assertEqual(mpp1.ops(), 4)
101
self.assertEqual(mpp2.ops(), 0)
102
self.assertEqual(mpp3.ops(), 6)
104
self.assertEqual(mps0.ops(), 2)
105
self.assertEqual(mps1.ops(), 3)
106
self.assertEqual(mps2.ops(), 4)
107
self.assertEqual(mps3.ops(), 5)
109
self.assertEqual(mpf0.ops(), 2)
110
self.assertEqual(mpf1.ops(), 3)
111
self.assertEqual(mpf2.ops(), 3)
112
self.assertEqual(mpf3.ops(), 5)
114
self.assertEqual(str(mpp0), 'x*x*y')
115
self.assertEqual(str(mpp1), '%s*x*x*y*y' % f_3)
116
self.assertEqual(str(mpp2), '%s' % f_0)
117
self.assertEqual(str(mpp3), '%s*x*x*x*y*y*y' % format["float"](9))
118
self.assertEqual(str(mps0), 'x*(x + y)')
119
self.assertEqual(str(mps1), '(x + x)*(x + y)')
120
# self.assertEqual(str(mps2), '(x-2)*(x + x-2)')
121
self.assertEqual(str(mps2), '(x + x-%s)*(x-%s)' % (f_2, f_2))
122
self.assertEqual(str(mps3), '(x + x)*(x + x)*(x + y)')
123
self.assertEqual(str(mpf0), 'x*x/y')
124
self.assertEqual(str(mpf1), 'x/%s*x/y' % f_3)
125
self.assertEqual(str(mpf2), '-%s/y*x/%s' % (f_2, f_3))
126
self.assertEqual(str(mpf3), 'x/%s*x/y*x/y' % f_3)
133
msp3 = Sum([p1, msp1])
139
mss3 = Sum([S1, mps1])
144
msf3 = Sum([F1, msf1])
146
# print "\nTesting Mixed Sums"
147
# print "\nmsp0: %s + %s = '%s'" % (p0, s0, msp0)
148
# print "msp1: %s + %s = '%s'" % (p1, p0, msp1)
149
# print "msp2: %s + %s = '%s'" % (p2, p3, msp2)
150
# print "msp3: %s + %s = '%s'" % (p1, msp1, msp3)
151
# print "msp4: %s + %s = '%s'" % (f2, f2, msp4)
152
# print "\nmss0: %s + %s = '%s'" % (S0, s0, mss0)
153
# print "mss1: %s + %s = '%s'" % (S1, S0, mss1)
154
# print "mss2: %s + %s = '%s'" % (S2, S3, mss2)
155
# print "mss3: %s + %s = '%s'" % (S1, mss1, mss3)
156
# print "\nmsf0: %s + %s = '%s'" % (F1, s0, msf0)
157
# print "msf1: %s + %s = '%s'" % (F1, F2, msf1)
158
# print "msf2: %s + %s = '%s'" % (F2, F3, msf2)
159
# print "msf3: %s + %s = '%s'" % (F1, msf1, msf3)
160
# print "msf3: %s + %s = '%s'" % (F1, msf1, msf3)
162
self.assertAlmostEqual(eval(str(msp0)), eval(str(p0))+eval(str(s0)))
163
self.assertAlmostEqual(eval(str(msp1)), eval(str(p1))+eval(str(p0)))
164
self.assertAlmostEqual(eval(str(msp2)), eval(str(p2))+eval(str(p3)))
165
self.assertAlmostEqual(eval(str(msp3)), eval(str(p1))+eval(str(msp1)))
166
self.assertEqual(str(msp4), '%s' % f_0)
168
self.assertAlmostEqual(eval(str(mss0)), eval(str(S0))+eval(str(s0)))
169
self.assertAlmostEqual(eval(str(mss1)), eval(str(S1))+eval(str(S0)))
170
self.assertAlmostEqual(eval(str(mss2)), eval(str(S2))+eval(str(S3)))
171
self.assertAlmostEqual(eval(str(mss3)), eval(str(S1))+eval(str(mps1)))
173
self.assertAlmostEqual(eval(str(msf0)), eval(str(F1))+eval(str(s0)))
174
self.assertAlmostEqual(eval(str(msf1)), eval(str(F1))+eval(str(F2)))
175
self.assertAlmostEqual(eval(str(msf2)), eval(str(F2))+eval(str(F3)))
176
self.assertAlmostEqual(eval(str(msf3)), eval(str(F1))+eval(str(msf1)))
178
self.assertEqual(msp0.ops(), 2)
179
self.assertEqual(msp1.ops(), 4)
180
self.assertEqual(msp2.ops(), 3)
181
self.assertEqual(msp3.ops(), 7)
183
self.assertEqual(mss0.ops(), 2)
184
self.assertEqual(mss1.ops(), 3)
185
self.assertEqual(mss2.ops(), 3)
186
self.assertEqual(mss3.ops(), 5)
188
self.assertEqual(msf0.ops(), 2)
189
self.assertEqual(msf1.ops(), 3)
190
self.assertEqual(msf2.ops(), 3)
191
self.assertEqual(msf3.ops(), 5)
193
self.assertEqual(str(msp0), '(x + x*y)')
194
self.assertEqual(str(msp1), '(%s*x*y + x*y)' % f_3)
195
self.assertEqual(str(msp2), '-%s*x*y*z' % f_6)
196
self.assertEqual(str(msp3), '(%s*x*y + %s*x*y + x*y)' % (f_3, f_3))
197
self.assertEqual(str(mss0), '(x + x + y)')
198
self.assertEqual(str(mss1), '(x + x + x + y)')
199
self.assertEqual(str(mss2), '(x + x + x-%s)' % f_4)
200
self.assertEqual(str(mss3), '(x + x + (x + x)*(x + y))')
201
self.assertEqual(str(msf0), '(x + x/y)')
202
self.assertEqual(str(msf1), '(x/%s + x/y)' % f_3)
203
self.assertEqual(str(msf2), '(x/%s-%s/y)' % (f_3, f_2))
204
self.assertEqual(str(msf3), '(x/%s + x/y + x/y)' % f_3)
208
mfp0 = Fraction(p0, s0)
209
mfp1 = Fraction(p1, p0)
210
mfp2 = Fraction(p2, p3)
211
mfp3 = Fraction(p1, mfp1)
213
mfs0 = Fraction(S0, s0)
214
mfs1 = Fraction(S1, S0)
215
mfs2 = Fraction(S2, S3)
216
mfs3 = Fraction(S1, mfs1)
218
mff0 = Fraction(F1, s0)
219
mff1 = Fraction(F1, F2)
220
mff2 = Fraction(F2, F3)
221
mff3 = Fraction(F1, mff1)
223
# print "\nTesting Mixed Fractions"
224
# print "\nmfp0: %s / %s = '%s'" % (p0, s0, mfp0)
225
# print "mfp1: %s / %s = '%s'" % (p1, p0, mfp1)
226
# print "mfp2: %s / %s = '%s'" % (p2, p3, mfp2)
227
# print "mfp3: %s / %s = '%s'" % (p1, mfp1, mfp3)
228
# print "\nmfs0: %s / %s = '%s'" % (S0, s0, mfs0)
229
# print "mfs1: %s / %s = '%s'" % (S1, S0, mfs1)
230
# print "mfs2: %s / %s = '%s'" % (S2, S3, mfs2)
231
# print "mfs3: %s / %s = '%s'" % (S1, mfs1, mfs3)
232
# print "\nmff0: %s / %s = '%s'" % (F1, s0, mff0)
233
# print "mff1: %s / %s = '%s'" % (F1, F2, mff1)
234
# print "mff2: %s / %s = '%s'" % (F2, F3, mff2)
235
# print "mff3: %s / %s = '%s'" % (F1, mff1, mff3)
237
self.assertAlmostEqual(eval(str(mfp0)), eval(str(p0))/eval(str(s0)))
238
self.assertAlmostEqual(eval(str(mfp1)), eval(str(p1))/eval(str(p0)))
239
self.assertAlmostEqual(eval(str(mfp2)), eval(str(p2))/eval(str(p3)))
240
self.assertAlmostEqual(eval(str(mfp3)), eval(str(p1))/eval(str(mfp1)))
242
self.assertAlmostEqual(eval(str(mfs0)), eval(str(S0))/eval(str(s0)))
243
self.assertAlmostEqual(eval(str(mfs1)), eval(str(S1))/eval(str(S0)))
244
self.assertAlmostEqual(eval(str(mfs2)), eval(str(S2))/eval(str(S3)))
245
self.assertAlmostEqual(eval(str(mfs3)), eval(str(S1))/eval(str(mfs1)))
247
self.assertAlmostEqual(eval(str(mff0)), eval(str(F1))/eval(str(s0)))
248
self.assertAlmostEqual(eval(str(mff1)), eval(str(F1))/eval(str(F2)))
249
self.assertAlmostEqual(eval(str(mff2)), eval(str(F2))/eval(str(F3)))
250
self.assertAlmostEqual(eval(str(mff3)), eval(str(F1))/eval(str(mff1)))
252
self.assertEqual(mfp0.ops(), 2)
253
self.assertEqual(mfp1.ops(), 4)
254
self.assertEqual(mfp2.ops(), 0)
255
self.assertEqual(mfp3.ops(), 7)
257
self.assertEqual(mfs0.ops(), 2)
258
self.assertEqual(mfs1.ops(), 3)
259
self.assertEqual(mfs2.ops(), 4)
260
self.assertEqual(mfs3.ops(), 5)
262
self.assertEqual(mff0.ops(), 2)
263
self.assertEqual(mff1.ops(), 3)
264
self.assertEqual(mff2.ops(), 3)
265
self.assertEqual(mff3.ops(), 5)
267
self.assertEqual(str(mfp0), 'x*y/x')
268
self.assertEqual(str(mfp1), '%s*x*y/(x*y)' % f_3)
269
self.assertEqual(str(mfp2), '%s' % f_0)
270
self.assertEqual(str(mfp3), '%s*x*y/(%s*x*y/(x*y))' % (f_3, f_3))
271
self.assertEqual(str(mfs0), '(x + y)/x')
272
self.assertEqual(str(mfs1), '(x + x)/(x + y)')
273
self.assertEqual(str(mfs2), '(x-%s)/(x + x-%s)' % (f_2, f_2))
274
self.assertEqual(str(mfs3), '(x + x)/((x + x)/(x + y))')
275
self.assertEqual(str(mff0), '(x/y)/x')
276
self.assertEqual(str(mff1), '(x/y)/(x/%s)' % f_3)
277
self.assertEqual(str(mff2), '(x/%s)/(-%s/y)' % (f_3, f_2))
278
self.assertEqual(str(mff3), '(x/y)/((x/y)/(x/%s))' % f_3)
280
# Use p1 as a base expression for Symbol
281
s3 = Symbol(get_format()["cos"](p1), CONST, p1, 1)
282
self.assertEqual(str(s3), 'std::cos(%s*x*y)' % f_3)
283
self.assertEqual(s3.ops(), 3)
285
if __name__ == "__main__":
287
# Run all returned tests
288
runner = unittest.TextTestRunner()
289
runner.run(TestMixedSymbols('testMixedSymbols'))