Sampling seed for non-default samplers
Various samplers available in bilby include an option for setting the random seed, however as far as I can tell, in bilby_pipe, sampling_seed isn't passed to the samplers kwargs but instead just used to set np.random.seed here. This will work for samplers that rely solely on numpy for random number generation (though maybe not if they use the new Generator?) but won't for other samplers that use other libraries (e.g random from the standard library, torch, C++ generators etc.).
This means it can be hard to reproduce the exact results, for example, when trying to repeat an analysis to debug issues during sampling. I think it could be useful to fix this.
Samplers with random seed options
From what I can tell these samplers all have an option for a random seed:
-
cpnest(seed) -
d4nest(seed) -
nessai(seed) -
polychord(seed) -
pymc3(random_seed) -
pymultinest(seed)
Possible fixes
I can think of three possible ways to fix this but I'm keen to hear people's thoughts:
- Currently, there is a check in place for
cpnesthere but not for any of the other samplers. We could add similar checks for all of the samplers that support a random seed. This would be quite simple but would be disconnected to changes in the sampler APIs inbilby, i.e. if a sampler's API changes we may have to update bothbilbyandbilby_pipe - Add a variable similar to
npoints_equiv_kwargshere for the random seed (e.g.['seed', 'random_seed', 'sampling_seed']) and have samplers check it like they do fornpoints. We then always addsampling_seedto the sampler kwargs inbilby_pipeand rely on_verify_kwargs_against_default_kwargsto remove it for samplers that don't use it (this would give a warning to the user). - Same as the second option, but add a flag to samplers that support random seeds to avoid the aforementioned warning (e.g.
if sampler.has_random_seed: ...etc)
The second two options would require more changes but keep sampler specific changes in bilby which might be easier to maintain long term whereas the first change would probably only need changes in bilby_pipe.
I'm willing to implement this myself but wanted to get people's thoughts before I started working on it.