import pytest
import numpy as np
from threeML import LocalMinimization, GlobalMinimization
from threeML import parallel_computation
from astromodels import clone_model
try:
import ROOT
except:
has_root = False
else:
has_root = True
skip_if_ROOT_is_not_available = pytest.mark.skipif(
not has_root, reason="No ROOT available"
)
try:
import pygmo
except:
has_pygmo = False
else:
has_pygmo = True
skip_if_pygmo_is_not_available = pytest.mark.skipif(
not has_pygmo, reason="No pygmo available"
)
# skip_if_ROOT_is_available = pytest.mark.skipif(
# (not has_pygmo) or has_root, reason="ROOT is available. Skipping incompatible tests."
# )
[docs]
def check_results(fit_results):
assert np.isclose(fit_results['value']['bn090217206.spectrum.main.Powerlaw.K'],2.571, atol=1e-1)
assert np.isclose(fit_results['value']['bn090217206.spectrum.main.Powerlaw.index'], -1.185, atol=5e-2)
[docs]
def do_analysis(jl, minimizer):
jl.set_minimizer(minimizer)
fit_results, like_frame = jl.fit()
check_results(fit_results)
fit_results = jl.get_errors()
check_results(fit_results)
[docs]
def do_contours_check(jl, minimizer):
#make sure that model is restored after contour calculation
jl.set_minimizer(minimizer)
_ = jl.fit()
model_clone = clone_model(jl._likelihood_model)
_ = jl.get_contours( jl._likelihood_model.bn090217206.spectrum.main.Powerlaw.index, -3.5, -0.5, 30 )
for param in jl._likelihood_model.parameters:
assert jl._likelihood_model.parameters[param].value == model_clone[param].value
[docs]
def test_minuit_simple(joint_likelihood_bn090217206_nai):
do_analysis(joint_likelihood_bn090217206_nai, "minuit")
[docs]
def test_minuit_complete(joint_likelihood_bn090217206_nai):
minuit = LocalMinimization("minuit")
minuit.setup(ftol=1e-3)
do_analysis(joint_likelihood_bn090217206_nai, minuit)
do_contours_check( joint_likelihood_bn090217206_nai, "minuit" )
[docs]
@skip_if_ROOT_is_not_available
def test_ROOT_simple(joint_likelihood_bn090217206_nai):
do_analysis(joint_likelihood_bn090217206_nai, "ROOT")
[docs]
@skip_if_ROOT_is_not_available
def test_ROOT_complete(joint_likelihood_bn090217206_nai):
root = LocalMinimization("ROOT")
root.setup(ftol=1e-3, max_function_calls=10000, strategy=2)
do_analysis(joint_likelihood_bn090217206_nai, root)
do_contours_check( joint_likelihood_bn090217206_nai, "minuit" )
[docs]
def test_grid(joint_likelihood_bn090217206_nai):
grid = GlobalMinimization("GRID")
minuit = LocalMinimization("minuit")
grid.setup(
grid={
joint_likelihood_bn090217206_nai.likelihood_model.bn090217206.spectrum.main.Powerlaw.K: np.linspace(
0.1, 10, 10
)
},
second_minimization=minuit,
)
do_analysis(joint_likelihood_bn090217206_nai, grid)
[docs]
@skip_if_pygmo_is_not_available
def test_pagmo(joint_likelihood_bn090217206_nai):
pagmo = GlobalMinimization("PAGMO")
minuit = LocalMinimization("minuit")
algo = pygmo.algorithm(pygmo.bee_colony(gen=100))
pagmo.setup(
islands=4,
population_size=20,
evolution_cycles=1,
second_minimization=minuit,
algorithm=algo,
)
do_analysis(joint_likelihood_bn090217206_nai, pagmo)
#@skip_if_ROOT_is_available
#def test_parallel_pagmo(joint_likelihood_bn090217206_nai):
#
# with parallel_computation(start_cluster=False):
#
# test_pagmo(joint_likelihood_bn090217206_nai)
[docs]
def test_scipy(joint_likelihood_bn090217206_nai):
minim = LocalMinimization("scipy")
do_analysis(joint_likelihood_bn090217206_nai, minim)
joint_likelihood_bn090217206_nai.likelihood_model.bn090217206.spectrum.main.Powerlaw.K = (
1.25
)
do_analysis(joint_likelihood_bn090217206_nai, minim)