@@ -125,7 +125,7 @@ def clean_knots(knots, min_distance, lmin=0, lmax=inf):
125
125
126
126
class TSLPF (LogPosteriorFunction ):
127
127
def __init__ (self , name : str , ldmodel , data : TSDataSet , nk : int = 50 , nldc : int = 10 , nthreads : int = 1 ,
128
- tmpars = None , noise_model : str = 'white' ,
128
+ tmpars = None , noise_model : Literal [ "white" , "fixed_gp" , "free_gp" ] = 'white' ,
129
129
interpolation : Literal ['bspline' , 'pchip' , 'makima' ] = 'bspline' ):
130
130
super ().__init__ (name )
131
131
self ._original_data : TSDataSet | None = None
@@ -206,6 +206,8 @@ def _init_parameters(self) -> None:
206
206
self ._init_p_limb_darkening ()
207
207
self ._init_p_radius_ratios ()
208
208
self ._init_p_noise ()
209
+ if self ._nm == NM_GP_FREE :
210
+ self ._init_p_gp ()
209
211
self ._init_p_baseline ()
210
212
self ._init_p_bias ()
211
213
self .ps .freeze ()
@@ -230,6 +232,10 @@ def set_noise_model(self, noise_model: str) -> None:
230
232
self ._nm = noise_models [noise_model ]
231
233
if self ._nm in (NM_GP_FIXED , NM_GP_FREE ):
232
234
self ._init_gp ()
235
+ if self ._nm == NM_GP_FREE :
236
+ self .ps .thaw ()
237
+ self ._init_p_gp ()
238
+ self .ps .freeze ()
233
239
234
240
def _init_gp (self ) -> None :
235
241
"""Initializes the Gaussian Process (GP) .
@@ -329,6 +335,15 @@ def _init_p_noise(self):
329
335
self ._start_wnm = ps .blocks [- 1 ].start
330
336
self ._sl_wnm = ps .blocks [- 1 ].slice
331
337
338
+ def _init_p_gp (self ):
339
+ ps = self .ps
340
+ if not hasattr (self , '_sl_gp' ):
341
+ pp = [GParameter ('gp_log_sigma' , 'GP log sigma' , '' , NP (0.0 , 0.01 ), (- inf , inf )),
342
+ GParameter ('gp_log_rho' , 'GP log rho' , '' , NP (0.0 , 0.01 ), (- inf , inf ))]
343
+ ps .add_global_block ('gp_hyperparameters' , pp )
344
+ self ._start_gp = ps .blocks [- 1 ].start
345
+ self ._sl_gp = ps .blocks [- 1 ].slice
346
+
332
347
def _init_p_baseline (self ):
333
348
ps = self .ps
334
349
self .n_baselines = self .data .n_baselines
@@ -664,12 +679,12 @@ def lnlikelihood(self, pv) -> ndarray | float :
664
679
if self ._nm == NM_WHITE :
665
680
for i , d in enumerate (self .data ):
666
681
lnl += lnlike_normal (d .fluxes , fmod [i ], d .errors , wn_multipliers [:, d .ngid ], d .mask )
667
- elif self . _nm == NM_GP_FIXED :
682
+ else :
668
683
for j in range (npv ):
684
+ if self ._nm == NM_GP_FREE :
685
+ self .set_gp_hyperparameters (* pv [j , self ._sl_gp ])
669
686
for i in range (self .data .size ):
670
687
lnl [j ] += self ._gp [i ].log_likelihood (self ._gp_flux [i ] - fmod [i ][j ][self .data [i ].mask ])
671
- else :
672
- raise NotImplementedError ("The free GP noise model hasn't been implemented yet." )
673
688
return lnl if npv > 1 else lnl [0 ]
674
689
675
690
def create_initial_population (self , n : int , source : str , add_noise : bool = True ) -> ndarray :
0 commit comments