metrolopy 0.6.3__py3-none-any.whl → 0.6.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@
2
2
 
3
3
  # module test_operations
4
4
 
5
- # Copyright (C) 2019 National Research Council Canada
5
+ # Copyright (C) 2025 National Research Council Canada
6
6
  # Author: Harold Parks
7
7
 
8
8
  # This file is part of MetroloPy.
@@ -22,351 +22,358 @@
22
22
 
23
23
  import metrolopy as uc
24
24
  import numpy as np
25
+ import unittest
25
26
 
26
27
  from metrolopy.tests.common import rand,make_gummy,make_number
27
28
 
28
- def binary_func(f,df,sim=False,exp=None,fionly=False,uexp=-6,allowazero=True,
29
- allowbzero=True,allowlargeu=True):
30
- if sim:
31
- dof = dof=float('inf')
32
- else:
33
- dof = None
34
- a,ax,au,adof,_,_ = make_gummy(unit=1,dof=dof,exp=exp,mpf=(not fionly),
35
- uexp=uexp,allowzero=allowazero,
36
- allowlargeu=allowlargeu)
37
- if rand.randint(2):
38
- b = make_number(exp=exp,fionly=fionly,allowzero=allowbzero)
39
- if isinstance(b,uc.gummy):
40
- bx = b.x
29
+
30
+ class TestOperations(unittest.TestCase):
31
+ def binary_func(self,f,df,sim=False,exp=None,fionly=False,uexp=-6,allowazero=True,
32
+ allowbzero=True,allowlargeu=True):
33
+ if sim:
34
+ dof = dof=float('inf')
41
35
  else:
42
- bx = b
43
- bu = 0
44
- bdof = float('inf')
45
- else:
46
- b,bx,bu,bdof,_,_ = make_gummy(unit=1,dof=dof,exp=exp,mpf=(not fionly),
47
- uexp=uexp,allowzero=allowbzero,
36
+ dof = None
37
+ a,ax,au,adof,_,_ = make_gummy(unit=1,dof=dof,exp=exp,mpf=(not fionly),
38
+ uexp=uexp,allowzero=allowazero,
48
39
  allowlargeu=allowlargeu)
49
-
50
- ax = float(ax)
51
- bx = float(bx)
52
- au = float(au)
53
- bu = float(bu)
54
- x = f(ax,bx)
55
- d = df(ax,bx)
56
- da = float(d[0])
57
- db = float(d[1])
58
- u = np.sqrt((da*au)**2 + (db*bu)**2)
59
- if dof is None:
60
- dof = ((da*au)**4/adof + (db*bu)**4/bdof)
61
- if dof == 0:
62
- dof = float('inf')
40
+ if rand.randint(2):
41
+ b = make_number(exp=exp,fionly=fionly,allowzero=allowbzero)
42
+ if isinstance(b,uc.gummy):
43
+ bx = b.x
44
+ else:
45
+ bx = b
46
+ bu = 0
47
+ bdof = float('inf')
63
48
  else:
64
- dof = u**4/dof
65
-
66
- if dof > uc.gummy.max_dof:
67
- dof = float('inf')
68
- if dof < 1:
69
- dof = 1
49
+ b,bx,bu,bdof,_,_ = make_gummy(unit=1,dof=dof,exp=exp,mpf=(not fionly),
50
+ uexp=uexp,allowzero=allowbzero,
51
+ allowlargeu=allowlargeu)
70
52
 
71
- dof = float(dof)
72
-
73
- g = f(a,b)
74
-
75
- if x == 0:
76
- assert abs(g.x) < 1e-15
77
- else:
78
- assert abs((g.x - x)/x) < 1e-14
79
-
80
- if u == 0:
81
- assert abs(u) < 1e-6
82
- else:
83
- assert abs((g.u - u)/u) < 1e-3
84
-
85
- if dof is not None and not np.isinf(dof):
86
- assert abs((g.dof - dof)/dof) < 0.01
87
-
88
- assert a.correlation(b) == 0
89
-
90
- if sim and x != 0 and abs(u/x) > 1e-10:
91
- uc.gummy.simulate([a,b,g])
92
-
93
- assert abs((g.xsim - x)/(g.u/np.sqrt(1e5))) < 5
94
- assert abs((g.u - g.usim)/g.u) < 0.1
95
-
96
- if g.correlation(a) > 0.1:
97
- assert abs((g.correlation_sim(a)-g.correlation(a))/g.correlation(a)) < 0.1
98
-
99
- if isinstance(b,uc.gummy) and g.correlation(b) > 0.1:
100
- assert abs((g.correlation_sim(b)-g.correlation(b))/g.correlation(b)) < 0.1
101
-
102
- def test_add(n=1000,sim=False):
103
- def f(a,b):
104
- return a + b
105
- def df(ax,bx):
106
- return (1,1)
107
- for i in range(n):
108
- binary_func(f,df,sim=sim)
109
-
110
- def test_sub(n=1000,sim=False):
111
- def f(a,b):
112
- return a - b
113
- def df(ax,bx):
114
- return (1,-1)
115
- for i in range(n):
116
- binary_func(f,df,sim=sim)
117
-
118
- def test_mul(n=1000,sim=False):
119
- def f(a,b):
120
- return a*b
121
- def df(ax,bx):
122
- return (bx,ax)
123
- for i in range(n):
124
- binary_func(f,df,sim=sim)
125
-
126
- def test_div(n=1000,sim=False):
127
- def f(a,b):
128
- return a/b
129
- def df(ax,bx):
130
- return (1/bx,-ax/bx**2)
131
- if sim:
132
- lu = False
133
- else:
134
- lu = True
135
- for i in range(n):
136
- binary_func(f,df,sim=sim,allowbzero=False,allowlargeu=lu)
137
-
138
- def test_pow(n=1000,sim=False):
139
- def f(a,b):
140
- return abs(a)**b
141
- def df(ax,bx):
142
- ax = abs(ax)
143
- return (bx*ax**(bx-1),np.log(ax)*ax**bx)
144
- if sim:
145
- lu = False
146
- else:
147
- lu = True
148
- for i in range(n):
149
- binary_func(f,df,sim=sim,exp=0,allowazero=False,allowlargeu=lu)
150
-
151
- def test_mod(n=1000,sim=False):
152
- def f(a,b):
153
- return a%b
154
- def df(ax,bx):
155
- return (1,np.sign(bx)*abs(ax//bx))
156
- for i in range(n):
157
- binary_func(f,df,sim=sim,fionly=True,allowazero=False)
158
-
159
- def test_abs(n=1000,sim=False):
160
- def f(a,b):
161
- return abs(a)*abs(b)
162
- def df(ax,bx):
163
- return (abs(bx),abs(ax))
164
- if sim:
165
- lu = False
166
- else:
167
- lu = True
168
- for i in range(n):
169
- binary_func(f,df,sim=sim,allowlargeu=lu,allowazero=lu,
170
- allowbzero=lu)
171
-
172
- def test_neg(n=1000,sim=False):
173
- def f(a,b):
174
- return (-a)*b
175
- def df(ax,bx):
176
- return (-bx,-ax)
177
- for i in range(n):
178
- binary_func(f,df,sim=sim)
179
-
180
- def test_pos(n=1000,sim=False):
181
- def f(a,b):
182
- return (+a)*b
183
- def df(ax,bx):
184
- return (bx,ax)
185
- for i in range(n):
186
- binary_func(f,df,sim=sim)
53
+ ax = float(ax)
54
+ bx = float(bx)
55
+ au = float(au)
56
+ bu = float(bu)
57
+ x = f(ax,bx)
58
+ d = df(ax,bx)
59
+ da = float(d[0])
60
+ db = float(d[1])
61
+ u = np.sqrt((da*au)**2 + (db*bu)**2)
62
+ if dof is None:
63
+ dof = ((da*au)**4/adof + (db*bu)**4/bdof)
64
+ if dof == 0:
65
+ dof = float('inf')
66
+ else:
67
+ dof = u**4/dof
68
+
69
+ if dof > uc.gummy.max_dof:
70
+ dof = float('inf')
71
+ if dof < 1:
72
+ dof = 1
73
+
74
+ dof = float(dof)
75
+
76
+ g = f(a,b)
187
77
 
188
- def test_sincos(n=1000,sim=False):
189
- def f(a,b):
190
- return uc.sin(a) + uc.cos(b)
191
- def df(ax,bx):
192
- return (uc.cos(ax),-uc.sin(bx))
193
- for i in range(n):
194
- binary_func(f,df,sim=sim)
195
-
196
- def test_npsincos(n=1000,sim=False):
197
- def f(a,b):
198
- return np.sin(a) + np.cos(b)
199
- def df(ax,bx):
200
- return (np.cos(ax),-np.sin(bx))
201
- for i in range(n):
202
- binary_func(f,df,sim=sim,fionly=True)
203
-
204
- def test_ap1sincos(n=1000,sim=False):
205
- def f(a,b):
206
- return uc.gummy.apply(np.sin,np.cos,a) + uc.gummy.napply(np.cos,b)
207
- def df(ax,bx):
208
- return (np.cos(ax),-np.sin(bx))
209
- for i in range(n):
210
- binary_func(f,df,sim=sim,fionly=True,exp=0,allowlargeu=False)
211
-
212
- def test_ap2sincos(n=1000,sim=False):
213
- def ff(a,b):
214
- return np.sin(a) + np.cos(b)
215
- def df(ax,bx):
216
- return (np.cos(ax),-np.sin(bx))
217
- def f(a,b):
218
- return uc.gummy.apply(ff,df,a,b)
219
-
220
- for i in range(n):
221
- binary_func(f,df,sim=sim,fionly=True)
222
-
223
- def test_apnsincos(n=1000,sim=False):
224
- def ff(a,b):
225
- return np.sin(a) + np.cos(b)
226
- def df(ax,bx):
227
- return (np.cos(ax),-np.sin(bx))
228
- def f(a,b):
229
- return uc.gummy.napply(ff,a,b)
230
-
231
- for i in range(n):
232
- binary_func(f,df,sim=sim,fionly=True,exp=0,allowlargeu=False)
233
-
234
- def test_addxmul(n=1000):
235
- def f(*x):
236
- r = x[0]
237
- for i in range(len(x)-1):
238
- r += x[i+1]
239
- return r
240
-
241
- for j in range(n):
242
- k = rand.randint(10) + 2
243
- x = make_gummy(unit=1)[0]
244
- a = f(*(k*[x]))
245
- b = k*x
246
- c = uc.gummy.apply(f,lambda *x: len(x)*[1],*(k*[x]))
247
- d = uc.gummy.napply(f,*(k*[x]))
248
-
249
- if b.x == 0:
250
- assert abs(a.x - b.x) < 1e-14
251
- else:
252
- assert abs((a.x - b.x)/b.x) < 1e-14
253
- if x.u == 0:
254
- assert a.u == 0
255
- assert b.u == 0
256
- else:
257
- assert (a.u - b.u)/b.u < 1e-3
258
- assert a.correlation(b) == 1
259
- assert a.correlation(x) == 1
260
-
261
- if b.x == 0:
262
- assert abs(c.x - b.x) < 1e-14
263
- else:
264
- assert abs((c.x - b.x)/b.x) < 1e-14
265
- if x.u == 0:
266
- assert c.u == 0
267
- else:
268
- assert (c.u - b.u)/b.u < 1e-3
269
- assert c.correlation(b) == 1
270
-
271
- if b.x == 0:
272
- assert abs(d.x - b.x) < 1e-14
273
- else:
274
- assert abs((d.x - b.x)/b.x) < 1e-14
275
- if x.u == 0:
276
- assert d.u == 0
277
- else:
278
- assert abs((d.u - b.u)/b.u) < 1e-3
279
- assert abs(d.correlation(b) - 1) < 1e-14
280
-
281
- def test_mulxpow(n=1000):
282
- def f(*x):
283
- r = x[0]
284
- for i in range(len(x)-1):
285
- r *= x[i+1]
286
- return r
287
-
288
- for j in range(n):
289
- k = rand.randint(10) + 2
290
- x = make_gummy(unit=1)[0]
291
- a = f(*(k*[x]))
292
- b = x**k
293
- xx = x.x
294
- c = uc.gummy.apply(f,lambda *x: len(x)*[xx**(k-1)],*(k*[x]))
295
- d = uc.gummy.napply(f,*(k*[x]))
296
-
297
- if b.x == 0:
298
- assert abs(a.x - b.x) < 1e-14
299
- else:
300
- assert abs((a.x - b.x)/b.x) < 1e-14
301
- if x.u == 0:
302
- assert a.u == 0
303
- assert b.u == 0
78
+ if x == 0:
79
+ self.assertTrue(abs(g.x) < 1e-15)
304
80
  else:
305
- assert abs((a.u - b.u)/b.u) < 1e-3
306
- assert a.correlation(b) == 1
307
-
308
- if k%2 == 0 and x.x < 0:
309
- assert a.correlation(x) == -1
310
- else:
311
- assert a.correlation(x) == 1
81
+ self.assertTrue(abs((g.x - x)/x) < 1e-14)
312
82
 
313
- if b.x == 0:
314
- assert abs(c.x - b.x) < 1e-14
315
- else:
316
- assert abs((c.x - b.x)/b.x) < 1e-14
317
- if x.u == 0:
318
- assert c.u == 0
83
+ if u == 0:
84
+ self.assertTrue(abs(u) < 1e-6)
319
85
  else:
320
- assert abs((c.u - b.u)/b.u) < 1e-3
321
- assert c.correlation(b) == 1
86
+ self.assertTrue(abs((g.u - u)/u) < 1e-3)
322
87
 
323
- if b.x == 0:
324
- assert abs(d.x - b.x) < 1e-14
325
- else:
326
- assert abs((d.x - b.x)/b.x) < 1e-14
327
- if x.u == 0:
328
- assert d.u == 0
329
- else:
330
- assert abs((d.u - b.u)/b.u) < 1e-3
331
- assert d.correlation(b) == 1
332
-
88
+ if dof is not None and not np.isinf(dof):
89
+ self.assertTrue(abs((g.dof - dof)/dof) < 0.01)
333
90
 
334
- def test_mulxnpow(n=1000):
335
- def f(*x):
336
- r = 1/x[0]
337
- for i in range(len(x)-1):
338
- r *= 1/x[i+1]
339
- return r
91
+ self.assertTrue(a.correlation(b) == 0)
340
92
 
341
- for j in range(n):
342
- k = rand.randint(10) + 2
343
- x = make_gummy(unit=1,allowzero=False,allowlargeu=False)[0]
344
- a = f(*(k*[x]))
345
- b = x**-k
346
- d = uc.gummy.napply(f,*(k*[x]))
93
+ if sim and x != 0 and abs(u/x) > 1e-10:
94
+ uc.gummy.simulate([a,b,g])
95
+
96
+ self.assertTrue(abs((g.xsim - x)/(g.u/np.sqrt(1e5))) < 5)
97
+ self.assertTrue(abs((g.u - g.usim)/g.u) < 0.1)
98
+
99
+ if g.correlation(a) > 0.1:
100
+ self.assertTrue(abs((g.correlation_sim(a)-g.correlation(a))/g.correlation(a)) < 0.1)
101
+
102
+ if isinstance(b,uc.gummy) and g.correlation(b) > 0.1:
103
+ self.assertTrue(abs((g.correlation_sim(b)-g.correlation(b))/g.correlation(b)) < 0.1)
347
104
 
348
- if b.x == 0:
349
- assert abs(a.x - b.x) < 1e-14
350
- else:
351
- assert abs((a.x - b.x)/b.x) < 1e-14
352
- if x.u == 0:
353
- assert a.u == 0
354
- assert b.u == 0
105
+ def test_add(self,n=1000,sim=False):
106
+ def f(a,b):
107
+ return a + b
108
+ def df(ax,bx):
109
+ return (1,1)
110
+ for i in range(n):
111
+ self.binary_func(f,df,sim=sim)
112
+
113
+ def test_sub(self,n=1000,sim=False):
114
+ def f(a,b):
115
+ return a - b
116
+ def df(ax,bx):
117
+ return (1,-1)
118
+ for i in range(n):
119
+ self.binary_func(f,df,sim=sim)
120
+
121
+ def test_mul(self,n=1000,sim=False):
122
+ def f(a,b):
123
+ return a*b
124
+ def df(ax,bx):
125
+ return (bx,ax)
126
+ for i in range(n):
127
+ self.binary_func(f,df,sim=sim)
128
+
129
+ def test_div(self,n=1000,sim=False):
130
+ def f(a,b):
131
+ return a/b
132
+ def df(ax,bx):
133
+ return (1/bx,-ax/bx**2)
134
+ if sim:
135
+ lu = False
355
136
  else:
356
- assert abs((a.u - b.u)/b.u) < 1e-3
357
- assert a.correlation(b) == 1
358
-
359
- if k%2 == 0 and x.x < 0:
360
- assert a.correlation(x) == 1
137
+ lu = True
138
+ for i in range(n):
139
+ self.binary_func(f,df,sim=sim,allowbzero=False,allowlargeu=lu)
140
+
141
+ def test_pow(self,n=1000,sim=False):
142
+ def f(a,b):
143
+ return abs(a)**b
144
+ def df(ax,bx):
145
+ ax = abs(ax)
146
+ return (bx*ax**(bx-1),np.log(ax)*ax**bx)
147
+ if sim:
148
+ lu = False
361
149
  else:
362
- assert a.correlation(x) == -1
150
+ lu = True
151
+ for i in range(n):
152
+ self.binary_func(f,df,sim=sim,exp=0,allowazero=False,allowlargeu=lu)
153
+
154
+ def test_mod(self,n=1000,sim=False):
155
+ def f(a,b):
156
+ return a%b
157
+ def df(ax,bx):
158
+ return (1,np.sign(bx)*abs(ax//bx))
159
+ for i in range(n):
160
+ self.binary_func(f,df,sim=sim,fionly=True,allowazero=False)
363
161
 
364
- if b.x == 0:
365
- assert abs(d.x - b.x) < 1e-14
366
- else:
367
- assert abs((d.x - b.x)/b.x) < 1e-14
368
- if x.u == 0:
369
- assert d.u == 0
162
+ def test_abs(self,n=1000,sim=False):
163
+ def f(a,b):
164
+ return abs(a)*abs(b)
165
+ def df(ax,bx):
166
+ return (abs(bx),abs(ax))
167
+ if sim:
168
+ lu = False
370
169
  else:
371
- assert abs((d.u - b.u)/b.u) < 1e-3
372
- assert d.correlation(b) == 1
170
+ lu = True
171
+ for i in range(n):
172
+ self.binary_func(f,df,sim=sim,allowlargeu=lu,allowazero=lu,
173
+ allowbzero=lu)
174
+
175
+ def test_neg(self,n=1000,sim=False):
176
+ def f(a,b):
177
+ return (-a)*b
178
+ def df(ax,bx):
179
+ return (-bx,-ax)
180
+ for i in range(n):
181
+ self.binary_func(f,df,sim=sim)
182
+
183
+ def test_pos(self,n=1000,sim=False):
184
+ def f(a,b):
185
+ return (+a)*b
186
+ def df(ax,bx):
187
+ return (bx,ax)
188
+ for i in range(n):
189
+ self.binary_func(f,df,sim=sim)
190
+
191
+ def test_sincos(self,n=1000,sim=False):
192
+ def f(a,b):
193
+ return uc.sin(a) + uc.cos(b)
194
+ def df(ax,bx):
195
+ return (uc.cos(ax),-uc.sin(bx))
196
+ for i in range(n):
197
+ self.binary_func(f,df,sim=sim)
198
+
199
+ def test_npsincos(self,n=1000,sim=False):
200
+ def f(a,b):
201
+ return np.sin(a) + np.cos(b)
202
+ def df(ax,bx):
203
+ return (np.cos(ax),-np.sin(bx))
204
+ for i in range(n):
205
+ self.binary_func(f,df,sim=sim,fionly=True)
206
+
207
+ def test_ap1sincos(self,n=1000,sim=False):
208
+ def f(a,b):
209
+ return uc.gummy.apply(np.sin,np.cos,a) + uc.gummy.napply(np.cos,b)
210
+ def df(ax,bx):
211
+ return (np.cos(ax),-np.sin(bx))
212
+ for i in range(n):
213
+ self.binary_func(f,df,sim=sim,fionly=True,exp=0,allowlargeu=False)
214
+
215
+ def test_ap2sincos(self,n=1000,sim=False):
216
+ def ff(a,b):
217
+ return np.sin(a) + np.cos(b)
218
+ def df(ax,bx):
219
+ return (np.cos(ax),-np.sin(bx))
220
+ def f(a,b):
221
+ return uc.gummy.apply(ff,df,a,b)
222
+
223
+ for i in range(n):
224
+ self.binary_func(f,df,sim=sim,fionly=True)
225
+
226
+ def test_apnsincos(self,n=1000,sim=False):
227
+ def ff(a,b):
228
+ return np.sin(a) + np.cos(b)
229
+ def df(ax,bx):
230
+ return (np.cos(ax),-np.sin(bx))
231
+ def f(a,b):
232
+ return uc.gummy.napply(ff,a,b)
233
+
234
+ for i in range(n):
235
+ self.binary_func(f,df,sim=sim,fionly=True,exp=0,allowlargeu=False)
236
+
237
+ def test_addxmul(self,n=1000):
238
+ def f(*x):
239
+ r = x[0]
240
+ for i in range(len(x)-1):
241
+ r += x[i+1]
242
+ return r
243
+
244
+ for j in range(n):
245
+ k = rand.randint(10) + 2
246
+ x = make_gummy(unit=1)[0]
247
+ a = f(*(k*[x]))
248
+ b = k*x
249
+ c = uc.gummy.apply(f,lambda *x: len(x)*[1],*(k*[x]))
250
+ d = uc.gummy.napply(f,*(k*[x]))
251
+
252
+ if b.x == 0:
253
+ self.assertTrue(abs(a.x - b.x) < 1e-14)
254
+ else:
255
+ self.assertTrue(abs((a.x - b.x)/b.x) < 1e-14)
256
+ if x.u == 0:
257
+ self.assertTrue(a.u == 0)
258
+ self.assertTrue(b.u == 0)
259
+ else:
260
+ self.assertTrue((a.u - b.u)/b.u < 1e-3)
261
+ self.assertTrue(a.correlation(b) == 1)
262
+ self.assertTrue(a.correlation(x) == 1)
263
+
264
+ if b.x == 0:
265
+ self.assertTrue(abs(c.x - b.x) < 1e-14)
266
+ else:
267
+ self.assertTrue(abs((c.x - b.x)/b.x) < 1e-14)
268
+ if x.u == 0:
269
+ self.assertTrue(c.u == 0)
270
+ else:
271
+ self.assertTrue((c.u - b.u)/b.u < 1e-3)
272
+ self.assertTrue(c.correlation(b) == 1)
273
+
274
+ if b.x == 0:
275
+ self.assertTrue(abs(d.x - b.x) < 1e-14)
276
+ else:
277
+ self.assertTrue(abs((d.x - b.x)/b.x) < 1e-14)
278
+ if x.u == 0:
279
+ self.assertTrue(d.u == 0)
280
+ else:
281
+ self.assertTrue(abs((d.u - b.u)/b.u) < 1e-3)
282
+ self.assertTrue(abs(d.correlation(b) - 1) < 1e-14)
283
+
284
+ def test_mulxpow(self,n=1000):
285
+ def f(*x):
286
+ r = x[0]
287
+ for i in range(len(x)-1):
288
+ r *= x[i+1]
289
+ return r
290
+
291
+ for j in range(n):
292
+ k = rand.randint(10) + 2
293
+ x = make_gummy(unit=1)[0]
294
+ a = f(*(k*[x]))
295
+ b = x**k
296
+ xx = x.x
297
+ c = uc.gummy.apply(f,lambda *x: len(x)*[xx**(k-1)],*(k*[x]))
298
+ d = uc.gummy.napply(f,*(k*[x]))
299
+
300
+ if b.x == 0:
301
+ self.assertTrue(abs(a.x - b.x) < 1e-14)
302
+ else:
303
+ self.assertTrue(abs((a.x - b.x)/b.x) < 1e-14)
304
+ if x.u == 0:
305
+ self.assertTrue(a.u == 0)
306
+ self.assertTrue(b.u == 0)
307
+ else:
308
+ self.assertTrue(abs((a.u - b.u)/b.u) < 1e-3)
309
+ self.assertTrue(a.correlation(b) == 1)
310
+
311
+ if k%2 == 0 and x.x < 0:
312
+ self.assertTrue(a.correlation(x) == -1)
313
+ else:
314
+ self.assertTrue(a.correlation(x) == 1)
315
+
316
+ if b.x == 0:
317
+ self.assertTrue(abs(c.x - b.x) < 1e-14)
318
+ else:
319
+ self.assertTrue(abs((c.x - b.x)/b.x) < 1e-14)
320
+ if x.u == 0:
321
+ self.assertTrue(c.u == 0)
322
+ else:
323
+ self.assertTrue(abs((c.u - b.u)/b.u) < 1e-3)
324
+ self.assertTrue(c.correlation(b) == 1)
325
+
326
+ if b.x == 0:
327
+ self.assertTrue(abs(d.x - b.x) < 1e-14)
328
+ else:
329
+ self.assertTrue(abs((d.x - b.x)/b.x) < 1e-14)
330
+ if x.u == 0:
331
+ self.assertTrue(d.u == 0)
332
+ else:
333
+ self.assertTrue(abs((d.u - b.u)/b.u) < 1e-3)
334
+ self.assertTrue(d.correlation(b) == 1)
335
+
336
+
337
+ def test_mulxnpow(self,n=1000):
338
+ def f(*x):
339
+ r = 1/x[0]
340
+ for i in range(len(x)-1):
341
+ r *= 1/x[i+1]
342
+ return r
343
+
344
+ for j in range(n):
345
+ k = rand.randint(10) + 2
346
+ x = make_gummy(unit=1,allowzero=False,allowlargeu=False)[0]
347
+ a = f(*(k*[x]))
348
+ b = x**-k
349
+ d = uc.gummy.napply(f,*(k*[x]))
350
+
351
+ if b.x == 0:
352
+ self.assertTrue(abs(a.x - b.x) < 1e-14)
353
+ else:
354
+ self.assertTrue(abs((a.x - b.x)/b.x) < 1e-14)
355
+ if x.u == 0:
356
+ self.assertTrue(a.u == 0)
357
+ self.assertTrue(b.u == 0)
358
+ else:
359
+ self.assertTrue(abs((a.u - b.u)/b.u) < 1e-3)
360
+ self.assertTrue(a.correlation(b) == 1)
361
+
362
+ if k%2 == 0 and x.x < 0:
363
+ self.assertTrue(a.correlation(x) == 1)
364
+ else:
365
+ self.assertTrue(a.correlation(x) == -1)
366
+
367
+ if b.x == 0:
368
+ self.assertTrue(abs(d.x - b.x) < 1e-14)
369
+ else:
370
+ self.assertTrue(abs((d.x - b.x)/b.x) < 1e-14)
371
+ if x.u == 0:
372
+ self.assertTrue(d.u == 0)
373
+ else:
374
+ self.assertTrue(abs((d.u - b.u)/b.u) < 1e-3)
375
+ self.assertTrue(d.correlation(b) == 1)
376
+
377
+
378
+ if __name__ == '__main__':
379
+ unittest.main()