• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

California-Planet-Search / radvel / #503

14 Sep 2023 05:47PM UTC coverage: 90.035%. Remained the same
#503

push

coveralls-python

web-flow
Merge pull request #382 from California-Planet-Search/next-release

Version 1.4.11

10 of 10 new or added lines in 3 files covered. (100.0%)

3298 of 3663 relevant lines covered (90.04%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.37
/radvel/tests/test_api.py
1
import sys
2
import copy
1✔
3
import warnings
1✔
4
import types
1✔
5

6
import radvel
1✔
7
import radvel.driver
1✔
8
import numpy as np
1✔
9
import scipy
1✔
10
import radvel.prior
1✔
11

12
warnings.simplefilter('ignore')
1✔
13

14

15
class _args(types.SimpleNamespace):
1✔
16
    outputdir = '/tmp/'
1✔
17
    decorr = False
1✔
18
    name_in_title = False
1✔
19
    gp = False
1✔
20
    simple = False
1✔
21

22
    nwalkers = 50
1✔
23
    nsteps = 100
1✔
24
    ensembles = 8
1✔
25
    maxGR = 1.10
1✔
26
    burnGR = 1.30
1✔
27
    burnAfactor = 25
1✔
28
    minAfactor = 50
1✔
29
    maxArchange = .07
1✔
30
    minTz = 1000
1✔
31
    minsteps = 100
1✔
32
    minpercent = 5
1✔
33
    thin = 1
1✔
34
    serial = False
1✔
35
    save = True
1✔
36
    savename = 'rawchains.h5'
1✔
37
    proceed = False
1✔
38
    proceedname = None
1✔
39
    headless=False
1✔
40

41

42
def _standard_run(setupfn, arguments):
1✔
43
    """
44
    Run through all of the standard steps
45
    """
46

47
    args = arguments
1✔
48
    args.setupfn = setupfn
1✔
49

50
    radvel.driver.fit(args)
1✔
51
    radvel.driver.mcmc(args)
1✔
52
    radvel.driver.derive(args)
1✔
53

54
    args.type = ['trend', 'jit', 'e', 'nplanets', 'gp']
1✔
55
    args.verbose = True
1✔
56
    radvel.driver.ic_compare(args)
1✔
57

58
    args.type = ['params', 'priors', 'rv', 'ic_compare', 'derived', 'crit']
1✔
59
    radvel.driver.tables(args)
1✔
60

61
    args.type = ['rv', 'corner', 'auto', 'trend', 'derived']
1✔
62
    args.plotkw = {'highlight_last': True, 'show_rms': True}
1✔
63
    radvel.driver.plots(args)
1✔
64

65
    args.comptype = 'ic_compare'
1✔
66
    args.latex_compiler = 'pdflatex'
1✔
67
    radvel.driver.report(args)
1✔
68

69

70
def test_k2(setupfn='example_planets/epic203771098.py'):
1✔
71
    """
72
    Run through K2-24 example
73
    """
74
    args = _args()
1✔
75
    args.setupfn = setupfn
1✔
76
    _standard_run(setupfn, args)
1✔
77

78
    # set the proceed flag and continue
79
    args.proceed = True
1✔
80
    radvel.driver.mcmc(args)
1✔
81

82
    args.ensembles = 1
1✔
83
    try:
1✔
84
        radvel.driver.mcmc(args)
1✔
85
    except ValueError:  # expected error when changing number of ensembles with proceed flag
1✔
86
        pass
1✔
87

88
    args.serial = True
1✔
89
    args.proceed = False
1✔
90
    radvel.driver.mcmc(args)
1✔
91

92

93
def test_hd(setupfn='example_planets/HD164922.py'):
1✔
94
    """
95
    Check multi-instrument fit
96
    """
97
    args = _args()
1✔
98
    args.setupfn = setupfn
1✔
99

100
    radvel.driver.fit(args)
1✔
101
    radvel.driver.mcmc(args)
1✔
102

103
    args.type = ['rv']
1✔
104
    args.plotkw = {}
1✔
105
    radvel.driver.plots(args)
1✔
106

107

108
def test_k2131(setupfn='example_planets/k2-131.py'):
1✔
109
    """
110
    Check GP fit
111
    """
112
    args = _args()
1✔
113
    args.setupfn = setupfn
1✔
114

115
    radvel.driver.fit(args)
1✔
116

117
    args.type = ['gp']
1✔
118
    args.verbose = True
1✔
119
    radvel.driver.ic_compare(args)
1✔
120

121
    args.type = ['rv']
1✔
122
    args.gp = True
1✔
123
    args.plotkw = {}
1✔
124
    radvel.driver.plots(args)
1✔
125

126

127
def test_celerite(setupfn='example_planets/k2-131_celerite.py'):
1✔
128
    """
129
    Check celerite GP fit
130
    """
131
    args = _args()
1✔
132
    args.setupfn = setupfn
1✔
133

134
    radvel.driver.fit(args)
1✔
135

136
    args.type = ['rv']
1✔
137
    args.gp = True
1✔
138
    args.plotkw = {'plot_likelihoods_separately':True}
1✔
139
    radvel.driver.plots(args)
1✔
140

141

142
def test_basis():
1✔
143
    """
144
    Test basis conversions
145
    """
146

147
    basis_list = radvel.basis.BASIS_NAMES
1✔
148
    default_basis = 'per tc e w k'
1✔
149

150
    anybasis_params = radvel.Parameters(1, basis=default_basis)
1✔
151

152
    anybasis_params['per1'] = radvel.Parameter(value=20.885258)
1✔
153
    anybasis_params['tc1'] = radvel.Parameter(value=2072.79438)
1✔
154
    anybasis_params['e1'] = radvel.Parameter(value=0.01)
1✔
155
    anybasis_params['w1'] = radvel.Parameter(value=1.6)
1✔
156
    anybasis_params['k1'] = radvel.Parameter(value=10.0)
1✔
157

158
    anybasis_params['dvdt'] = radvel.Parameter(value=0.0)
1✔
159
    anybasis_params['curv'] = radvel.Parameter(value=0.0)
1✔
160

161
    anybasis_params['gamma_j'] = radvel.Parameter(1.0)
1✔
162
    anybasis_params['jit_j'] = radvel.Parameter(value=2.6)
1✔
163

164
    for new_basis in basis_list:
1✔
165
        iparams = radvel.basis._copy_params(anybasis_params)
1✔
166
        ivector = radvel.Vector(iparams)
1✔
167
        if new_basis != default_basis:
1✔
168
            new_vector = iparams.basis.v_to_any_basis(ivector, new_basis)
1✔
169
            new_params = iparams.basis.to_any_basis(iparams, new_basis)
1✔
170
            tmpv = new_vector.copy()
1✔
171
            tmp = radvel.basis._copy_params(new_params)
1✔
172

173
            old_vector = tmp.basis.v_to_any_basis(tmpv, default_basis)
1✔
174
            old_params = tmp.basis.to_any_basis(tmp, default_basis)
1✔
175

176
            for par in iparams:
1✔
177
                before = iparams[par].value
1✔
178
                after = old_params[par].value
1✔
179
                assert (before - after) <= 1e-5,\
1✔
180
                    "Parameters do not match after basis conversion: \
181
{}, {} != {}".format(par, before, after)
182

183
            for i in range(ivector.vector.shape[0]):
1✔
184
                before = ivector.vector[i][0]
1✔
185
                after = old_vector[i][0]
1✔
186
                assert (before - after) <= 1e-5, \
1✔
187
                    "Vectors do not match after basis conversion: \
188
{} row, {} != {}".format(i, before, after)
189

190

191

192
def test_kernels():
1✔
193
    """
194
    Test basic functionality of all standard GP kernels
195
    """
196

197
    kernel_list = radvel.gp.KERNELS
1✔
198

199
    for kernel in kernel_list:
1✔
200
        hnames = kernel_list[kernel] # gets list of hyperparameter name strings
1✔
201
        hyperparams = {k: radvel.Parameter(value=1.) for k in hnames}
1✔
202
        kernel_call = getattr(radvel.gp, kernel + "Kernel")
1✔
203
        test_kernel = kernel_call(hyperparams)
1✔
204

205
        x = np.array([1.,2.,3.])
1✔
206
        test_kernel.compute_distances(x,x)
1✔
207
        test_kernel.compute_covmatrix(x.T)
1✔
208

209
        print("Testing {}".format(kernel_call(hyperparams)))
1✔
210

211
        sys.stdout.write("Testing error catching with dummy hyperparameters... \n")
1✔
212

213
        fakeparams1 = {}
1✔
214
        fakeparams1['dummy'] = radvel.Parameter(value=1.0)
1✔
215
        try:
1✔
216
            kernel_call(fakeparams1)
1✔
217
            raise Exception('Test #1 failed for {}'.format(kernel))
×
218
        except AssertionError:
1✔
219
            sys.stdout.write("passed #1\n")
1✔
220

221
        fakeparams2 = copy.deepcopy(hyperparams)
1✔
222
        fakeparams2[hnames[0]] = 1.
1✔
223
        try:
1✔
224
            kernel_call(fakeparams2)
1✔
225
            raise Exception('Test #2 failed for {}'.format(kernel))
×
226
        except AttributeError:
1✔
227
            sys.stdout.write("passed #2\n")
1✔
228

229

230
def test_priors():
1✔
231
    """
232
    Test basic functionality of all Priors
233
    """
234

235
    params = radvel.Parameters(1, 'per tc secosw sesinw logk')
1✔
236
    params['per1'] = radvel.Parameter(10.0)
1✔
237
    params['tc1'] = radvel.Parameter(0.0)
1✔
238
    params['secosw1'] = radvel.Parameter(0.0)
1✔
239
    params['sesinw1'] = radvel.Parameter(0.0)
1✔
240
    params['logk1'] = radvel.Parameter(1.5)
1✔
241

242
    vector = radvel.Vector(params)
1✔
243

244
    testTex = r'Delta Function Prior on $\sqrt{e}\cos{\omega}_{b}$'
1✔
245

246
    def userdef_prior_func(inp_list):
1✔
247
        if inp_list[0] >= 0. and inp_list[0] < 1.:
1✔
248
            return 0.
1✔
249
        else:
250
            return -np.inf
×
251

252
    prior_tests = {
1✔
253
        radvel.prior.EccentricityPrior(1):                  1/.99,
254
        radvel.prior.EccentricityPrior([1]):                1/.99,
255
        radvel.prior.PositiveKPrior(1):                     1.0,
256
        radvel.prior.Gaussian('per1', 9.9, 0.1):            scipy.stats.norm(9.9,0.1).pdf(10.),
257
        radvel.prior.HardBounds('per1', 1.0, 9.0):          0.,
258
        radvel.prior.HardBounds('per1', 1.0, 11.0):         1./10.,
259
        radvel.prior.Jeffreys('per1', 0.1, 100.0):          (1./10.)/np.log(100./0.1),
260
        radvel.prior.ModifiedJeffreys('per1', 0.1, 100.0, 0.):  (1./10.)/np.log(100./0.1),
261
        radvel.prior.ModifiedJeffreys('per1', 2., 100.0, 1.):  (1./9.)/np.log(99.),
262
        radvel.prior.SecondaryEclipsePrior(1, 5.0, 10.0):    1./np.sqrt(2.*np.pi),
263
        radvel.prior.NumericalPrior(
264
            ['sesinw1'],
265
            np.random.randn(1,5000000)
266
        ):                                                  scipy.stats.norm(0, 1).pdf(0.),
267
        radvel.prior.UserDefinedPrior(
268
            ['secosw1'], userdef_prior_func, testTex
269
        ):                                                  1.0,
270
        radvel.prior.InformativeBaselinePrior(
271
            'per1', 5.0, duration=1.0
272
        ):                                                  6./10.
273

274
    }
275

276
    for prior, val in prior_tests.items():
1✔
277
        print(prior.__repr__())
1✔
278
        print(prior.__str__())
1✔
279
        tolerance = .01
1✔
280
        print(abs(np.exp(prior(params, vector))))
1✔
281
        print(val)
1✔
282
        assert abs(np.exp(prior(params, vector)) - val) < tolerance, \
1✔
283
            "Prior output does not match expectation"
284

285

286
def test_kepler():
1✔
287
    """
288
    Profile and test C-based Kepler solver
289
    """
290
    radvel.kepler.profile()
1✔
291

292

293
def test_model_comp(setupfn='example_planets/HD164922.py'):
1✔
294
    """
295
    Test some additional model_comp lines
296
    """
297

298
    args = _args()
1✔
299
    args.setupfn = setupfn
1✔
300
    radvel.driver.fit(args)
1✔
301

302
    # also check some additional lines of model_comp
303
    args.verbose = True
1✔
304
    args.type = ['trend']
1✔
305
    radvel.driver.ic_compare(args)
1✔
306

307
    args.simple = True
1✔
308
    args.type = ['e']
1✔
309
    radvel.driver.ic_compare(args)
1✔
310

311
    args.simple = False
1✔
312
    args.type = ['something_else']
1✔
313
    try:
1✔
314
        radvel.driver.ic_compare(args)
1✔
315
        raise Exception("Unexpected result from model_comp.")
×
316
    except AssertionError:  # expected result
1✔
317
        return
1✔
318

319

320
if __name__ == '__main__':
1✔
321
    #test_k2()
322
    #test_hd()
323
    #test_model_comp()
324
    test_k2131()
×
325
    #test_celerite()
326
    # test_basis()
327
    #test_kernels()
328
    #test_kepler()
329
    #test_priors()
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc