Replace all mdrun rngs with cycle based rng
[alexxy/gromacs.git] / src / gromacs / random / random.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2008, The GROMACS development team.
6  * Copyright (c) 2010,2014, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37
38 #ifndef _GMX_RANDOM_H_
39 #define _GMX_RANDOM_H_
40
41 #include <stdio.h>
42 #include "types/simple.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /*! Fixed random number seeds for different types of RNG */
49 #define RND_SEED_UPDATE    1 /*!< For coordinate update (sd, bd, ..) */
50 #define RND_SEED_REPLEX    2 /*!< For replica exchange */
51 #define RND_SEED_VRESCALE  3 /*!< For V-rescale thermostat */
52 #define RND_SEED_ANDERSEN  4 /*!< For Andersen thermostat */
53 #define RND_SEED_TPI       5 /*!< For test particle insertion */
54 #define RND_SEED_EXPANDED  6 /*!< For expanded emseble methods */
55
56 /*! \brief Abstract datatype for a random number generator
57  *
58  * This is a handle to the full state of a random number generator.
59  * You can not access anything inside the gmx_rng structure outside this
60  * file.
61  */
62 typedef struct gmx_rng *
63     gmx_rng_t;
64
65
66 /*! \brief Returns the size of the RNG integer data structure
67  *
68  * Returns the size of the RNG integer data structure.
69  * \threadsafe Yes.
70  */
71 int
72 gmx_rng_n(void);
73
74
75 /*! \brief Create a new RNG, seeded from a single integer.
76  *
77  * If you dont want to pick a seed, just call it as
78  * rng=gmx_rng_init(gmx_rng_make_seed()) to seed it from
79  * the system time or a random device.
80  *
81  * \param seed Random seed, unsigned 32-bit integer.
82  *
83  * \return Reference to a random number generator, or NULL if there was an
84  *         error.
85  *
86  * \threadsafe Yes.
87  */
88 gmx_rng_t
89 gmx_rng_init(unsigned int seed);
90
91
92 /*! \brief Generate a 'random' RNG seed.
93  *
94  * This routine tries to get a seed from /dev/random if present,
95  * and if not it uses time-of-day and process id to generate one.
96  *
97  * \return 32-bit unsigned integer random seed.
98  *
99  * Tip: If you use this in your code, it is a good idea to write the
100  * returned random seed to a logfile, so you can recreate the exact sequence
101  * of random number if you need to reproduce your run later for one reason
102  * or another.
103  *
104  * \threadsafe Yes.
105  */
106 unsigned int
107 gmx_rng_make_seed(void);
108
109
110 /*! \brief Initialize a RNG with 624 integers (>32 bits of entropy).
111  *
112  *  The Mersenne twister RNG used in Gromacs has an extremely long period,
113  *  but when you only initialize it with a 32-bit integer there are only
114  *  2^32 different possible sequences of number - much less than the generator
115  *  is capable of.
116  *
117  *  If you really need the full entropy, this routine makes it possible to
118  *  initialize the RNG with up to 624 32-bit integers, which will give you
119  *  up to 2^19968 bits of entropy.
120  *
121  *  \param seed Array of unsigned integers to form a seed
122  *  \param seed_length Number of integers in the array, up to 624 are used.
123  *
124  * \return Reference to a random number generator, or NULL if there was an
125  *         error.
126  *
127  * \threadsafe Yes.
128  */
129 gmx_rng_t
130 gmx_rng_init_array(unsigned int    seed[],
131                    int             seed_length);
132
133
134 /*! \brief Release resources of a RNG
135  *
136  *  This routine destroys a random number generator and releases all
137  *  resources allocated by it.
138  *
139  *  \param rng Handle to random number generator previously returned by
140  *                     gmx_rng_init() or gmx_rng_init_array().
141  *
142  * \threadsafe Function itself is threadsafe, but you should only destroy a
143  *             certain RNG once (i.e. from one thread).
144  */
145 void
146 gmx_rng_destroy(gmx_rng_t rng);
147
148
149 /*! \brief Get the state of a RNG
150  *
151  *  This routine stores the random state in mt and mti, mt should have
152  *  a size of at least 624, mt of 1.
153  *
154  *  \param rng Handle to random number generator previously returned by
155  *                     gmx_rng_init() or gmx_rng_init_array().
156  */
157 void
158 gmx_rng_get_state(gmx_rng_t rng, unsigned int *mt, int *mti);
159
160
161 /*! \brief Set the state of a RNG
162  *
163  *  This routine sets the random state from mt and mti, mt should have
164  *  a size of at least 624.
165  *
166  *  \param rng Handle to random number generator previously returned by
167  *                     gmx_rng_init() or gmx_rng_init_array().
168  */
169 void
170 gmx_rng_set_state(gmx_rng_t rng, unsigned int *mt, int mti);
171
172
173 /*! \brief Random 32-bit integer from a uniform distribution
174  *
175  *  This routine returns a random integer from the random number generator
176  *  provided, and updates the state of that RNG.
177  *
178  *  \param rng Handle to random number generator previously returned by
179  *                     gmx_rng_init() or gmx_rng_init_array().
180  *
181  *  \return 32-bit unsigned integer from a uniform distribution.
182  *
183  *  \threadsafe Function yes, input data no. You should not call this function
184  *              from two different threads using the same RNG handle at the
185  *              same time. For performance reasons we cannot lock the handle
186  *              with a mutex every time we need a random number - that would
187  *              slow the routine down a factor 2-5. There are two simple
188  *              solutions: either use a mutex and lock it before calling
189  *              the function, or use a separate RNG handle for each thread.
190  */
191 unsigned int
192 gmx_rng_uniform_uint32(gmx_rng_t rng);
193
194
195 /*! \brief Random gmx_real_t 0<=x<1 from a uniform distribution
196  *
197  *  This routine returns a random floating-point number from the
198  *  random number generator provided, and updates the state of that RNG.
199  *
200  *  \param rng Handle to random number generator previously returned by
201  *                     gmx_rng_init() or gmx_rng_init_array().
202  *
203  *  \return floating-point number 0<=x<1 from a uniform distribution.
204  *
205  *  \threadsafe Function yes, input data no. You should not call this function
206  *              from two different threads using the same RNG handle at the
207  *              same time. For performance reasons we cannot lock the handle
208  *              with a mutex every time we need a random number - that would
209  *              slow the routine down a factor 2-5. There are two simple
210  *              solutions: either use a mutex and lock it before calling
211  *              the function, or use a separate RNG handle for each thread.
212  */
213 real
214 gmx_rng_uniform_real(gmx_rng_t rng);
215
216
217 /*! \brief Random gmx_real_t from a gaussian distribution
218  *
219  *  This routine returns a random floating-point number from the
220  *  random number generator provided, and updates the state of that RNG.
221  *
222  *  The Box-Muller algorithm is used to provide gaussian random numbers. This
223  *  is not the fastest known algorithm for gaussian numbers, but in contrast
224  *  to the alternatives it is very well studied and you can trust the returned
225  *  random numbers to have good properties and no correlations.
226  *
227  *  \param rng Handle to random number generator previously returned by
228  *                        gmx_rng_init() or gmx_rng_init_array().
229  *
230  *  \return Gaussian random floating-point number with average 0.0 and
231  *          standard deviation 1.0. You can get any average/mean you want
232  *          by first multiplying with the desired average and then adding
233  *          the average you want.
234  *
235  *  \threadsafe Function yes, input data no. You should not call this function
236  *              from two different threads using the same RNG handle at the
237  *              same time. For performance reasons we cannot lock the handle
238  *              with a mutex every time we need a random number - that would
239  *              slow the routine down a factor 2-5. There are two simple
240  *              solutions: either use a mutex and lock it before calling
241  *              the function, or use a separate RNG handle for each thread.
242  *
243  *  It works perfectly to mix calls to get uniform and gaussian random numbers
244  *  from the same generator, but since it will affect the sequence of returned
245  *  numbers it is probably better to use separate random number generator
246  *  structures.
247  */
248 real
249 gmx_rng_gaussian_real(gmx_rng_t rng);
250
251
252
253 /* Return a new gaussian random number with expectation value
254  * 0.0 and standard deviation 1.0. This routine uses a table
255  * lookup for maximum speed.
256  *
257  * WARNING: The lookup table is 16k by default, which means
258  *          the granularity of the random numbers is coarser
259  *          than what you get from gmx_rng_gauss_real().
260  *          In most cases this is no problem whatsoever,
261  *          and it is particularly true for BD/SD integration.
262  *          Note that you will NEVER get any really extreme
263  *          numbers: the maximum absolute value returned is
264  *          4.0255485.
265  *
266  * threadsafe: yes
267  */
268 real
269 gmx_rng_gaussian_table(gmx_rng_t rng);
270
271
272 /* The stateless cycle based random number generators below,
273  * which all use threefry2x64, take the following arguments:
274  *
275  * ctr1: In mdrun the step counter, in tools the frame(-step)
276  *       counter, so we can ensure reproducible results, even
277  *       we starting at different steps/frames. Might need to be
278  *       multiplied by a constant if we need more random numbers.
279  * ctr2: A local counter, in mdrun often a global atom index.
280  *       If any algorithm needs a variable number of random numbers,
281  *       the second counter is usually a function of the local
282  *       counter.
283  * key1: A user provided random seed.
284  * key2: A fixed seed which is particular for the algorithm,
285  *       as defined at the top of this file, to ensure different
286  *       random sequences when the same user seed is used for
287  *       different algorithms.
288  */
289
290 /* Return two uniform random numbers with 2^53 equally
291  * probable values between 0 and 1 - 2^-53.
292  * It uses a stateless counter based random number generator
293  * (threefry2x64).
294  */
295 void
296 gmx_rng_cycle_2uniform(gmx_int64_t ctr1, gmx_int64_t ctr2,
297                        gmx_int64_t key1, gmx_int64_t key2,
298                        double* rnd);
299
300 /* Return three Gaussian random numbers with expectation value
301  * 0.0 and standard deviation 1.0. This routine uses a table
302  * lookup for maximum speed. It uses a stateless counter
303  * based random number generator (threefry2x64). See
304  * gmx_rng_gaussian_table for a warning about accuracy of the table.
305  *
306  * threadsafe: yes
307  */
308 void
309 gmx_rng_cycle_3gaussian_table(gmx_int64_t ctr1, gmx_int64_t ctr2,
310                               gmx_int64_t key1, gmx_int64_t key2,
311                               real* rnd);
312
313 /* As gmx_rng_3gaussian_table, but returns 6 Gaussian numbers. */
314 void
315 gmx_rng_cycle_6gaussian_table(gmx_int64_t ctr1, gmx_int64_t ctr2,
316                               gmx_int64_t key1, gmx_int64_t key2,
317                               real* rnd);
318
319 #ifdef __cplusplus
320 }
321 #endif
322
323 #endif /* _GMX_RANDOM_H_ */