Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
bilby
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
lscsoft
bilby
Commits
c96cd97a
Commit
c96cd97a
authored
3 years ago
by
Matthew David Pitkin
Browse files
Options
Downloads
Patches
Plain Diff
Run black to fix formatting issues that break the pipeline
parent
c52d5226
No related branches found
Branches containing commit
No related tags found
Tags containing commit
1 merge request
!983
Allow logtrapzexp to work on a non-uniform grid
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
bilby/core/utils/calculus.py
+29
-19
29 additions, 19 deletions
bilby/core/utils/calculus.py
test/core/utils_test.py
+12
-19
12 additions, 19 deletions
test/core/utils_test.py
with
41 additions
and
38 deletions
bilby/core/utils/calculus.py
+
29
−
19
View file @
c96cd97a
...
...
@@ -6,8 +6,16 @@ from scipy.special import logsumexp
from
.logger
import
logger
def
derivatives
(
vals
,
func
,
releps
=
1e-3
,
abseps
=
None
,
mineps
=
1e-9
,
reltol
=
1e-3
,
epsscale
=
0.5
,
nonfixedidx
=
None
):
def
derivatives
(
vals
,
func
,
releps
=
1e-3
,
abseps
=
None
,
mineps
=
1e-9
,
reltol
=
1e-3
,
epsscale
=
0.5
,
nonfixedidx
=
None
,
):
"""
Calculate the partial derivatives of a function at a set of values. The
derivatives are calculated using the central difference, using an iterative
...
...
@@ -54,19 +62,19 @@ def derivatives(vals, func, releps=1e-3, abseps=None, mineps=1e-9, reltol=1e-3,
grads
=
np
.
zeros
(
len
(
nonfixedidx
))
# maximum number of times the gradient can change sign
flipflopmax
=
10.
flipflopmax
=
10.
0
# set steps
if
abseps
is
None
:
if
isinstance
(
releps
,
float
):
eps
=
np
.
abs
(
vals
)
*
releps
eps
[
eps
==
0.
]
=
releps
# if any values are zero set eps to releps
eps
[
eps
==
0.
0
]
=
releps
# if any values are zero set eps to releps
teps
=
releps
*
np
.
ones
(
len
(
vals
))
elif
isinstance
(
releps
,
(
list
,
np
.
ndarray
)):
if
len
(
releps
)
!=
len
(
vals
):
raise
ValueError
(
"
Problem with input relative step sizes
"
)
eps
=
np
.
multiply
(
np
.
abs
(
vals
),
releps
)
eps
[
eps
==
0.
]
=
np
.
array
(
releps
)[
eps
==
0.
]
eps
[
eps
==
0.
0
]
=
np
.
array
(
releps
)[
eps
==
0.
0
]
teps
=
releps
else
:
raise
RuntimeError
(
"
Relative step sizes are not a recognised type!
"
)
...
...
@@ -107,8 +115,10 @@ def derivatives(vals, func, releps=1e-3, abseps=None, mineps=1e-9, reltol=1e-3,
cureps
*=
epsscale
if
cureps
<
mineps
or
flipflop
>
flipflopmax
:
# if no convergence set flat derivative (TODO: check if there is a better thing to do instead)
logger
.
warning
(
"
Derivative calculation did not converge: setting flat derivative.
"
)
grads
[
count
]
=
0.
logger
.
warning
(
"
Derivative calculation did not converge: setting flat derivative.
"
)
grads
[
count
]
=
0.0
break
leps
*=
epsscale
...
...
@@ -122,10 +132,10 @@ def derivatives(vals, func, releps=1e-3, abseps=None, mineps=1e-9, reltol=1e-3,
break
# check whether previous diff and current diff are the same within reltol
rat
=
(
cdiff
/
cdiffnew
)
if
np
.
isfinite
(
rat
)
and
rat
>
0.
:
rat
=
cdiff
/
cdiffnew
if
np
.
isfinite
(
rat
)
and
rat
>
0.
0
:
# gradient has not changed sign
if
np
.
abs
(
1.
-
rat
)
<
reltol
:
if
np
.
abs
(
1.
0
-
rat
)
<
reltol
:
grads
[
count
]
=
cdiffnew
break
else
:
...
...
@@ -157,18 +167,20 @@ def logtrapzexp(lnf, dx):
=======
The natural logarithm of the area under the function.
"""
lnfdx1
=
lnf
[:
-
1
]
lnfdx2
=
lnf
[
1
:]
if
isinstance
(
dx
,
(
int
,
float
)):
C
=
np
.
log
(
dx
/
2.
)
C
=
np
.
log
(
dx
/
2.
0
)
elif
isinstance
(
dx
,
(
list
,
np
.
ndarray
)):
if
len
(
dx
)
!=
len
(
lnf
)
-
1
:
raise
ValueError
(
"
Step size array must have length one less than the function length
"
)
raise
ValueError
(
"
Step size array must have length one less than the function length
"
)
lndx
=
np
.
log
(
dx
)
lnfdx1
=
lnfdx1
.
copy
()
+
lndx
lnfdx2
=
lnfdx2
.
copy
()
+
lndx
lnfdx2
=
lnfdx2
.
copy
()
+
lndx
C
=
-
np
.
log
(
2.0
)
else
:
raise
TypeError
(
"
Step size must be a single value or array-like
"
)
...
...
@@ -177,9 +189,8 @@ def logtrapzexp(lnf, dx):
class
UnsortedInterp2d
(
interp2d
):
def
__call__
(
self
,
x
,
y
,
dx
=
0
,
dy
=
0
,
assume_sorted
=
False
):
"""
Modified version of the interp2d call method.
"""
Modified version of the interp2d call method.
This avoids the outer product that is done when two numpy
arrays are passed.
...
...
@@ -200,6 +211,7 @@ class UnsortedInterp2d(interp2d):
"""
from
scipy.interpolate.dfitpack
import
bispeu
x
,
y
=
self
.
_sanitize_inputs
(
x
,
y
)
out_of_bounds_x
=
(
x
<
self
.
x_min
)
|
(
x
>
self
.
x_max
)
out_of_bounds_y
=
(
y
<
self
.
y_min
)
|
(
y
>
self
.
y_max
)
...
...
@@ -232,9 +244,7 @@ class UnsortedInterp2d(interp2d):
y
=
float
(
y
)
if
isinstance
(
x
,
np
.
ndarray
)
and
isinstance
(
y
,
np
.
ndarray
):
if
x
.
shape
!=
y
.
shape
:
raise
ValueError
(
"
UnsortedInterp2d received unequally shaped arrays
"
)
raise
ValueError
(
"
UnsortedInterp2d received unequally shaped arrays
"
)
elif
isinstance
(
x
,
np
.
ndarray
)
and
not
isinstance
(
y
,
np
.
ndarray
):
y
=
y
*
np
.
ones_like
(
x
)
elif
not
isinstance
(
x
,
np
.
ndarray
)
and
isinstance
(
y
,
np
.
ndarray
):
...
...
This diff is collapsed.
Click to expand it.
test/core/utils_test.py
+
12
−
19
View file @
c96cd97a
...
...
@@ -270,6 +270,7 @@ class TestLatexPlotFormat(unittest.TestCase):
fig
,
ax
=
plt
.
subplots
()
ax
.
plot
(
self
.
x
,
self
.
y
)
fig
.
savefig
(
self
.
filename
)
plot
()
self
.
assertTrue
(
os
.
path
.
isfile
(
self
.
filename
))
...
...
@@ -279,6 +280,7 @@ class TestLatexPlotFormat(unittest.TestCase):
fig
,
ax
=
plt
.
subplots
()
ax
.
plot
(
self
.
x
,
self
.
y
)
fig
.
savefig
(
self
.
filename
)
plot
(
BILBY_MATHDEFAULT
=
1
)
self
.
assertTrue
(
os
.
path
.
isfile
(
self
.
filename
))
...
...
@@ -288,6 +290,7 @@ class TestLatexPlotFormat(unittest.TestCase):
fig
,
ax
=
plt
.
subplots
()
ax
.
plot
(
self
.
x
,
self
.
y
)
fig
.
savefig
(
self
.
filename
)
plot
(
BILBY_MATHDEFAULT
=
0
)
self
.
assertTrue
(
os
.
path
.
isfile
(
self
.
filename
))
...
...
@@ -313,14 +316,11 @@ class TestLatexPlotFormat(unittest.TestCase):
class
TestUnsortedInterp2d
(
unittest
.
TestCase
):
def
setUp
(
self
):
self
.
xx
=
np
.
linspace
(
0
,
1
,
10
)
self
.
yy
=
np
.
linspace
(
0
,
1
,
10
)
self
.
zz
=
np
.
random
.
random
((
10
,
10
))
self
.
interpolant
=
bilby
.
core
.
utils
.
UnsortedInterp2d
(
self
.
xx
,
self
.
yy
,
self
.
zz
)
self
.
interpolant
=
bilby
.
core
.
utils
.
UnsortedInterp2d
(
self
.
xx
,
self
.
yy
,
self
.
zz
)
def
tearDown
(
self
):
pass
...
...
@@ -333,22 +333,15 @@ class TestUnsortedInterp2d(unittest.TestCase):
self
.
assertIsNone
(
self
.
interpolant
(
-
0.5
,
0.5
))
def
test_returns_float_for_float_and_array
(
self
):
self
.
assertIsInstance
(
self
.
interpolant
(
0.5
,
np
.
random
.
random
(
10
)),
np
.
ndarray
)
self
.
assertIsInstance
(
self
.
interpolant
(
np
.
random
.
random
(
10
),
0.5
),
np
.
ndarray
)
self
.
assertIsInstance
(
self
.
interpolant
(
0.5
,
np
.
random
.
random
(
10
)),
np
.
ndarray
)
self
.
assertIsInstance
(
self
.
interpolant
(
np
.
random
.
random
(
10
),
0.5
),
np
.
ndarray
)
self
.
assertIsInstance
(
self
.
interpolant
(
np
.
random
.
random
(
10
),
np
.
random
.
random
(
10
)),
np
.
ndarray
self
.
interpolant
(
np
.
random
.
random
(
10
),
np
.
random
.
random
(
10
)),
np
.
ndarray
)
def
test_raises_for_mismatched_arrays
(
self
):
with
self
.
assertRaises
(
ValueError
):
self
.
interpolant
(
np
.
random
.
random
(
10
),
np
.
random
.
random
(
20
)
)
self
.
interpolant
(
np
.
random
.
random
(
10
),
np
.
random
.
random
(
20
))
def
test_returns_fill_in_correct_place
(
self
):
x_data
=
np
.
random
.
random
(
10
)
...
...
@@ -364,11 +357,11 @@ class TestTrapeziumRuleIntegration(unittest.TestCase):
self
.
dx
=
self
.
dxs
[
0
]
with
np
.
errstate
(
divide
=
"
ignore
"
):
self
.
lnfunc1
=
np
.
log
(
self
.
x
)
self
.
func1int
=
(
self
.
x
[
-
1
]
**
2
-
self
.
x
[
0
]
**
2
)
/
2
self
.
func1int
=
(
self
.
x
[
-
1
]
**
2
-
self
.
x
[
0
]
**
2
)
/
2
with
np
.
errstate
(
divide
=
"
ignore
"
):
self
.
lnfunc2
=
np
.
log
(
self
.
x
**
2
)
self
.
func2int
=
(
self
.
x
[
-
1
]
**
3
-
self
.
x
[
0
]
**
3
)
/
3
self
.
irregularx
=
np
.
array
(
[
self
.
x
[
0
],
...
...
@@ -397,7 +390,7 @@ class TestTrapeziumRuleIntegration(unittest.TestCase):
def
test_inconsistent_step_length
(
self
):
with
self
.
assertRaises
(
ValueError
):
utils
.
logtrapzexp
(
self
.
lnfunc1
,
self
.
x
[
0
:
len
(
self
.
x
)
//
2
])
utils
.
logtrapzexp
(
self
.
lnfunc1
,
self
.
x
[
0
:
len
(
self
.
x
)
//
2
])
def
test_integral_func1
(
self
):
res1
=
utils
.
logtrapzexp
(
self
.
lnfunc1
,
self
.
dx
)
...
...
@@ -405,7 +398,7 @@ class TestTrapeziumRuleIntegration(unittest.TestCase):
self
.
assertTrue
(
np
.
abs
(
res1
-
res2
)
<
1e-12
)
self
.
assertTrue
(
np
.
abs
((
np
.
exp
(
res1
)
-
self
.
func1int
)
/
self
.
func1int
)
<
1e-12
)
def
test_integral_func2
(
self
):
res
=
utils
.
logtrapzexp
(
self
.
lnfunc2
,
self
.
dxs
)
self
.
assertTrue
(
np
.
abs
((
np
.
exp
(
res
)
-
self
.
func2int
)
/
self
.
func2int
)
<
1e-4
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment