Skip to content

Commit e7e297d

Browse files
matthewfeickertkratsg
authored andcommitted
Use math.pow to improve exponentiation in interpolators (#506)
* Use math.pow for fast code4 * Use math.pow for slow codes This keeps things consistent across all codes
1 parent 24f488f commit e7e297d

File tree

2 files changed

+60
-59
lines changed

2 files changed

+60
-59
lines changed

pyhf/interpolators/code1.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import math
23
from .. import get_backend, default_backend
34
from .. import events
45
from . import _slow_interpolator_looper
@@ -98,9 +99,9 @@ def product(self, down, nom, up, alpha):
9899
delta_up = up / nom
99100
delta_down = down / nom
100101
if alpha > 0:
101-
delta = delta_up ** alpha
102+
delta = math.pow(delta_up, alpha)
102103
else:
103-
delta = delta_down ** (-alpha)
104+
delta = math.pow(delta_down, (-alpha))
104105
return delta
105106

106107
def __init__(self, histogramssets, subscribe=True):

pyhf/interpolators/code4.py

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -64,44 +64,44 @@ def __init__(self, histogramssets, subscribe=True, alpha0=1):
6464
-1.0 / 16 * alpha0,
6565
],
6666
[
67-
3.0 / (2 * alpha0 ** 2),
68-
3.0 / (2 * alpha0 ** 2),
67+
3.0 / (2 * math.pow(alpha0, 2)),
68+
3.0 / (2 * math.pow(alpha0, 2)),
6969
-9.0 / (16 * alpha0),
7070
9.0 / (16 * alpha0),
7171
1.0 / 16,
7272
1.0 / 16,
7373
],
7474
[
75-
-5.0 / (8 * alpha0 ** 3),
76-
5.0 / (8 * alpha0 ** 3),
77-
5.0 / (8 * alpha0 ** 2),
78-
5.0 / (8 * alpha0 ** 2),
75+
-5.0 / (8 * math.pow(alpha0, 3)),
76+
5.0 / (8 * math.pow(alpha0, 3)),
77+
5.0 / (8 * math.pow(alpha0, 2)),
78+
5.0 / (8 * math.pow(alpha0, 2)),
7979
-1.0 / (8 * alpha0),
8080
1.0 / (8 * alpha0),
8181
],
8282
[
83-
3.0 / (-2 * alpha0 ** 4),
84-
3.0 / (-2 * alpha0 ** 4),
85-
-7.0 / (-8 * alpha0 ** 3),
86-
7.0 / (-8 * alpha0 ** 3),
87-
-1.0 / (8 * alpha0 ** 2),
88-
-1.0 / (8 * alpha0 ** 2),
83+
3.0 / (-2 * math.pow(alpha0, 4)),
84+
3.0 / (-2 * math.pow(alpha0, 4)),
85+
-7.0 / (-8 * math.pow(alpha0, 3)),
86+
7.0 / (-8 * math.pow(alpha0, 3)),
87+
-1.0 / (8 * math.pow(alpha0, 2)),
88+
-1.0 / (8 * math.pow(alpha0, 2)),
8989
],
9090
[
91-
3.0 / (16 * alpha0 ** 5),
92-
-3.0 / (16 * alpha0 ** 5),
93-
-3.0 / (16 * alpha0 ** 4),
94-
-3.0 / (16 * alpha0 ** 4),
95-
1.0 / (16 * alpha0 ** 3),
96-
-1.0 / (16 * alpha0 ** 3),
91+
3.0 / (16 * math.pow(alpha0, 5)),
92+
-3.0 / (16 * math.pow(alpha0, 5)),
93+
-3.0 / (16 * math.pow(alpha0, 4)),
94+
-3.0 / (16 * math.pow(alpha0, 4)),
95+
1.0 / (16 * math.pow(alpha0, 3)),
96+
-1.0 / (16 * math.pow(alpha0, 3)),
9797
],
9898
[
99-
1.0 / (2 * alpha0 ** 6),
100-
1.0 / (2 * alpha0 ** 6),
101-
-5.0 / (16 * alpha0 ** 5),
102-
5.0 / (16 * alpha0 ** 5),
103-
1.0 / (16 * alpha0 ** 4),
104-
1.0 / (16 * alpha0 ** 4),
99+
1.0 / (2 * math.pow(alpha0, 6)),
100+
1.0 / (2 * math.pow(alpha0, 6)),
101+
-5.0 / (16 * math.pow(alpha0, 5)),
102+
5.0 / (16 * math.pow(alpha0, 5)),
103+
1.0 / (16 * math.pow(alpha0, 4)),
104+
1.0 / (16 * math.pow(alpha0, 4)),
105105
],
106106
]
107107
)
@@ -228,8 +228,8 @@ def __call__(self, alphasets):
228228

229229
class _slow_code4(object):
230230
"""
231-
delta_up**alpha0 = 1 + a1 alpha0 + a2 alpha0^2 + a3 alpha0^3 + a4 alpha0^4 + a5 alpha0^5 + a6 alpha0^6
232-
delta_down**alpha0 = 1 - a1 alpha0 + a2 alpha0^2 - a3 alpha0^3 + a4 alpha0^4 - a5 alpha0^5 + a6 alpha0^6
231+
delta_up^alpha0 = 1 + a1 alpha0 + a2 alpha0^2 + a3 alpha0^3 + a4 alpha0^4 + a5 alpha0^5 + a6 alpha0^6
232+
delta_down^alpha0 = 1 - a1 alpha0 + a2 alpha0^2 - a3 alpha0^3 + a4 alpha0^4 - a5 alpha0^5 + a6 alpha0^6
233233
234234
f[alpha_] := 1 + a1 * alpha + a2 * alpha^2 + a3 * alpha^3 + a4 * alpha^4 + a5 * alpha^5 + a6 * alpha^6
235235
up[alpha_] := delta_up^alpha
@@ -269,17 +269,17 @@ def product(self, down, nom, up, alpha):
269269
delta_up = up / nom
270270
delta_down = down / nom
271271
if alpha >= self.alpha0:
272-
delta = delta_up ** alpha
272+
delta = math.pow(delta_up, alpha)
273273
elif -self.alpha0 < alpha < self.alpha0:
274-
delta_up_alpha0 = delta_up ** self.alpha0
275-
delta_down_alpha0 = delta_down ** self.alpha0
274+
delta_up_alpha0 = math.pow(delta_up, self.alpha0)
275+
delta_down_alpha0 = math.pow(delta_down, self.alpha0)
276276
b = [
277277
delta_up_alpha0 - 1,
278278
delta_down_alpha0 - 1,
279279
math.log(delta_up) * delta_up_alpha0,
280280
-math.log(delta_down) * delta_down_alpha0,
281-
math.log(delta_up) ** 2 * delta_up_alpha0,
282-
math.log(delta_down) ** 2 * delta_down_alpha0,
281+
math.pow(math.log(delta_up), 2) * delta_up_alpha0,
282+
math.pow(math.log(delta_down), 2) * delta_down_alpha0,
283283
]
284284
A_inverse = [
285285
[
@@ -291,44 +291,44 @@ def product(self, down, nom, up, alpha):
291291
-1.0 / 16 * self.alpha0,
292292
],
293293
[
294-
3.0 / (2 * self.alpha0 ** 2),
295-
3.0 / (2 * self.alpha0 ** 2),
294+
3.0 / (2 * math.pow(self.alpha0, 2)),
295+
3.0 / (2 * math.pow(self.alpha0, 2)),
296296
-9.0 / (16 * self.alpha0),
297297
9.0 / (16 * self.alpha0),
298298
1.0 / 16,
299299
1.0 / 16,
300300
],
301301
[
302-
-5.0 / (8 * self.alpha0 ** 3),
303-
5.0 / (8 * self.alpha0 ** 3),
304-
5.0 / (8 * self.alpha0 ** 2),
305-
5.0 / (8 * self.alpha0 ** 2),
302+
-5.0 / (8 * math.pow(self.alpha0, 3)),
303+
5.0 / (8 * math.pow(self.alpha0, 3)),
304+
5.0 / (8 * math.pow(self.alpha0, 2)),
305+
5.0 / (8 * math.pow(self.alpha0, 2)),
306306
-1.0 / (8 * self.alpha0),
307307
1.0 / (8 * self.alpha0),
308308
],
309309
[
310-
3.0 / (-2 * self.alpha0 ** 4),
311-
3.0 / (-2 * self.alpha0 ** 4),
312-
-7.0 / (-8 * self.alpha0 ** 3),
313-
7.0 / (-8 * self.alpha0 ** 3),
314-
-1.0 / (8 * self.alpha0 ** 2),
315-
-1.0 / (8 * self.alpha0 ** 2),
310+
3.0 / (-2 * math.pow(self.alpha0, 4)),
311+
3.0 / (-2 * math.pow(self.alpha0, 4)),
312+
-7.0 / (-8 * math.pow(self.alpha0, 3)),
313+
7.0 / (-8 * math.pow(self.alpha0, 3)),
314+
-1.0 / (8 * math.pow(self.alpha0, 2)),
315+
-1.0 / (8 * math.pow(self.alpha0, 2)),
316316
],
317317
[
318-
3.0 / (16 * self.alpha0 ** 5),
319-
-3.0 / (16 * self.alpha0 ** 5),
320-
-3.0 / (16 * self.alpha0 ** 4),
321-
-3.0 / (16 * self.alpha0 ** 4),
322-
1.0 / (16 * self.alpha0 ** 3),
323-
-1.0 / (16 * self.alpha0 ** 3),
318+
3.0 / (16 * math.pow(self.alpha0, 5)),
319+
-3.0 / (16 * math.pow(self.alpha0, 5)),
320+
-3.0 / (16 * math.pow(self.alpha0, 4)),
321+
-3.0 / (16 * math.pow(self.alpha0, 4)),
322+
1.0 / (16 * math.pow(self.alpha0, 3)),
323+
-1.0 / (16 * math.pow(self.alpha0, 3)),
324324
],
325325
[
326-
1.0 / (2 * self.alpha0 ** 6),
327-
1.0 / (2 * self.alpha0 ** 6),
328-
-5.0 / (16 * self.alpha0 ** 5),
329-
5.0 / (16 * self.alpha0 ** 5),
330-
1.0 / (16 * self.alpha0 ** 4),
331-
1.0 / (16 * self.alpha0 ** 4),
326+
1.0 / (2 * math.pow(self.alpha0, 6)),
327+
1.0 / (2 * math.pow(self.alpha0, 6)),
328+
-5.0 / (16 * math.pow(self.alpha0, 5)),
329+
5.0 / (16 * math.pow(self.alpha0, 5)),
330+
1.0 / (16 * math.pow(self.alpha0, 4)),
331+
1.0 / (16 * math.pow(self.alpha0, 4)),
332332
],
333333
]
334334

@@ -337,9 +337,9 @@ def product(self, down, nom, up, alpha):
337337
]
338338
delta = 1
339339
for i in range(1, 7):
340-
delta += coefficients[i - 1] * alpha ** i
340+
delta += coefficients[i - 1] * math.pow(alpha, i)
341341
else:
342-
delta = delta_down ** (-alpha)
342+
delta = math.pow(delta_down, (-alpha))
343343
return delta
344344

345345
def __init__(self, histogramssets, subscribe=True, alpha0=1):

0 commit comments

Comments
 (0)