Vowpal Wabbit
Classes | Functions | Variables
exploration Namespace Reference

Classes

union  int_float
 

Functions

template<typename It >
int generate_epsilon_greedy (float epsilon, uint32_t top_action, It pdf_first, It pdf_last)
 Generates epsilon-greedy style exploration distribution. More...
 
template<typename InputIt , typename OutputIt >
int generate_softmax (float lambda, InputIt scores_first, InputIt scores_last, OutputIt pdf_first, OutputIt pdf_last)
 Generates softmax style exploration distribution. More...
 
template<typename InputIt , typename OutputIt >
int generate_bag (InputIt top_actions_first, InputIt top_actions_last, OutputIt pdf_first, OutputIt pdf_last)
 Generates an exploration distribution according to votes on actions. More...
 
template<typename It >
int enforce_minimum_probability (float minimum_uniform, bool update_zero_elements, It pdf_first, It pdf_last)
 Updates the pdf to ensure each action is explored with at least minimum_uniform/num_actions. More...
 
template<typename It >
int sample_after_normalizing (uint64_t seed, It pdf_first, It pdf_last, uint32_t &chosen_index)
 Sample an index from the provided pdf. If the pdf is not normalized it will be updated in-place. More...
 
template<typename It >
int sample_after_normalizing (const char *seed, It pdf_first, It pdf_last, uint32_t &chosen_index)
 Sample an index from the provided pdf. If the pdf is not normalized it will be updated in-place. More...
 
template<typename ActionIt >
int swap_chosen (ActionIt action_first, ActionIt action_last, uint32_t chosen_index)
 Swap the first value with the chosen index. More...
 
float uniform_random_merand48 (uint64_t initial)
 
template<typename It >
int generate_epsilon_greedy (float epsilon, uint32_t top_action, It pdf_first, It pdf_last, std::random_access_iterator_tag)
 
template<typename InputIt , typename OutputIt >
int generate_softmax (float lambda, InputIt scores_first, InputIt scores_last, std::input_iterator_tag, OutputIt pdf_first, OutputIt pdf_last, std::random_access_iterator_tag)
 
template<typename InputIt , typename OutputIt >
int generate_bag (InputIt top_actions_first, InputIt top_actions_last, std::input_iterator_tag, OutputIt pdf_first, OutputIt pdf_last, std::random_access_iterator_tag)
 
template<typename It >
int enforce_minimum_probability (float minimum_uniform, bool update_zero_elements, It pdf_first, It pdf_last, std::random_access_iterator_tag)
 
template<typename It >
int sample_after_normalizing (uint64_t seed, It pdf_first, It pdf_last, uint32_t &chosen_index, std::input_iterator_tag)
 
template<typename It >
int sample_after_normalizing (const char *seed, It pdf_first, It pdf_last, uint32_t &chosen_index, std::random_access_iterator_tag pdf_category)
 
template<typename ActionIt >
int swap_chosen (ActionIt action_first, ActionIt action_last, std::forward_iterator_tag, uint32_t chosen_index)
 
template<typename ActionsIt >
int swap_chosen (ActionsIt action_first, ActionsIt action_last, uint32_t chosen_index)
 

Variables

const uint64_t a = 0xeece66d5deece66dULL
 
const uint64_t c = 2147483647
 
const int bias = 127 << 23u
 

Function Documentation

◆ enforce_minimum_probability() [1/2]

template<typename It >
int exploration::enforce_minimum_probability ( float  minimum_uniform,
bool  update_zero_elements,
It  pdf_first,
It  pdf_last 
)

Updates the pdf to ensure each action is explored with at least minimum_uniform/num_actions.

Template Parameters
ItIterator type of the pdf. Must be a RandomAccessIterator.
Parameters
minimum_uniformThe minimum amount of uniform distribution to impose on the pdf.
update_zero_elementsIf true elements with zero probability are updated, otherwise those actions will be unchanged.
pdf_firstIterator pointing to the pre-allocated beginning of the pdf to be generated by this function.
pdf_lastIterator pointing to the pre-allocated end of the pdf to be generated by this function.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 226 of file explore_internal.h.

Referenced by CB_EXPLORE::get_cover_probabilities(), vw_slim::vw_predict< W >::predict(), VW::cb_explore_adf::softmax::cb_explore_adf_softmax::predict_or_learn_impl(), VW::cb_explore_adf::first::cb_explore_adf_first::predict_or_learn_impl(), VW::cb_explore_adf::bag::cb_explore_adf_bag::predict_or_learn_impl(), VW::cb_explore_adf::cover::cb_explore_adf_cover::predict_or_learn_impl(), VW::cb_explore_adf::regcb::cb_explore_adf_regcb::predict_or_learn_impl(), and TEST().

227  {
228  typedef typename std::iterator_traits<It>::iterator_category pdf_category;
229 
230  return enforce_minimum_probability(minimum_uniform, update_zero_elements, pdf_first, pdf_last, pdf_category());
231  }
int enforce_minimum_probability(float minimum_uniform, bool update_zero_elements, It pdf_first, It pdf_last, std::random_access_iterator_tag)

◆ enforce_minimum_probability() [2/2]

template<typename It >
int exploration::enforce_minimum_probability ( float  minimum_uniform,
bool  update_zero_elements,
It  pdf_first,
It  pdf_last,
std::random_access_iterator_tag   
)

Definition at line 158 of file explore_internal.h.

References E_EXPLORATION_BAD_RANGE, prediction_type::prob, and S_EXPLORATION_OK.

159  {
160  // iterators don't support <= in general
161  if (pdf_first == pdf_last || pdf_last < pdf_first)
163 
164  size_t num_actions = pdf_last - pdf_first;
165 
166  if (minimum_uniform > 0.999) // uniform exploration
167  {
168  size_t support_size = num_actions;
169  if (!update_zero_elements)
170  {
171  for (It d = pdf_first; d != pdf_last; ++d)
172  if (*d == 0)
173  support_size--;
174  }
175 
176  for (It d = pdf_first; d != pdf_last; ++d)
177  if (update_zero_elements || *d > 0)
178  *d = 1.f / support_size;
179 
180  return S_EXPLORATION_OK;
181  }
182 
183  minimum_uniform /= num_actions;
184  float touched_mass = 0.;
185  float untouched_mass = 0.;
186  uint16_t num_actions_touched = 0;
187 
188  for (It d = pdf_first; d != pdf_last; ++d)
189  {
190  auto& prob = *d;
191  if ((prob > 0 || (prob == 0 && update_zero_elements)) && prob <= minimum_uniform)
192  {
193  touched_mass += minimum_uniform;
194  prob = minimum_uniform;
195  ++num_actions_touched;
196  }
197  else
198  untouched_mass += prob;
199  }
200 
201  if (touched_mass > 0.)
202  {
203  if (touched_mass > 0.999)
204  {
205  minimum_uniform = (1.f - untouched_mass) / (float)num_actions_touched;
206  for (It d = pdf_first; d != pdf_last; ++d)
207  {
208  auto& prob = *d;
209  if ((prob > 0 || (prob == 0 && update_zero_elements)) && prob <= minimum_uniform)
210  prob = minimum_uniform;
211  }
212  }
213  else
214  {
215  float ratio = (1.f - touched_mass) / untouched_mass;
216  for (It d = pdf_first; d != pdf_last; ++d)
217  if (*d > minimum_uniform)
218  *d *= ratio;
219  }
220  }
221 
222  return S_EXPLORATION_OK;
223  }
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3

◆ generate_bag() [1/2]

template<typename InputIt , typename OutputIt >
int exploration::generate_bag ( InputIt  top_actions_first,
InputIt  top_actions_last,
OutputIt  pdf_first,
OutputIt  pdf_last 
)

Generates an exploration distribution according to votes on actions.

Template Parameters
InputItIterator type of the input actions. Must be an InputIterator.
OutputItIterator type of the pre-allocated pdf. Must be a RandomAccessIterator.
Parameters
top_actions_firstIterator pointing to the beginning of the top actions.
top_actions_lastIterator pointing to the end of the top actions.
pdf_firstIterator pointing to the pre-allocated beginning of the pdf to be generated by this function.
pdf_lastIterator pointing to the pre-allocated end of the pdf to be generated by this function.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 149 of file explore_internal.h.

Referenced by vw_slim::vw_predict< W >::predict(), VW::cb_explore_adf::bag::cb_explore_adf_bag::predict_or_learn_impl(), and TEST().

150  {
151  typedef typename std::iterator_traits<InputIt>::iterator_category top_actions_category;
152  typedef typename std::iterator_traits<OutputIt>::iterator_category pdf_category;
153 
154  return generate_bag(top_actions_first, top_actions_last, top_actions_category(), pdf_first, pdf_last, pdf_category());
155  }
int generate_bag(InputIt top_actions_first, InputIt top_actions_last, std::input_iterator_tag, OutputIt pdf_first, OutputIt pdf_last, std::random_access_iterator_tag)

◆ generate_bag() [2/2]

template<typename InputIt , typename OutputIt >
int exploration::generate_bag ( InputIt  top_actions_first,
InputIt  top_actions_last,
std::input_iterator_tag  ,
OutputIt  pdf_first,
OutputIt  pdf_last,
std::random_access_iterator_tag   
)

Definition at line 122 of file explore_internal.h.

References accumulate(), E_EXPLORATION_BAD_RANGE, and S_EXPLORATION_OK.

123  {
124  // iterators don't support <= in general
125  if (pdf_first == pdf_last || pdf_last < pdf_first)
127 
128  float num_models = (float)std::accumulate(top_actions_first, top_actions_last, 0.);
129  if (num_models <= 1e-6)
130  {
131  // based on above checks we have at least 1 element in pdf
132  *pdf_first = 1;
133  for (OutputIt d = pdf_first + 1; d != pdf_last; ++d)
134  *d = 0;
135 
136  return S_EXPLORATION_OK;
137  }
138 
139  // divide late to improve numeric stability
140  InputIt t_a = top_actions_first;
141  float normalizer = 1.f / num_models;
142  for (OutputIt d = pdf_first; d != pdf_last && t_a != top_actions_last; ++d, ++t_a)
143  *d = *t_a * normalizer;
144 
145  return S_EXPLORATION_OK;
146  }
void accumulate(vw &all, parameters &weights, size_t offset)
Definition: accumulate.cc:20
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3

◆ generate_epsilon_greedy() [1/2]

template<typename It >
int exploration::generate_epsilon_greedy ( float  epsilon,
uint32_t  top_action,
It  pdf_first,
It  pdf_last 
)

Generates epsilon-greedy style exploration distribution.

Template Parameters
ItIterator type of the pre-allocated pdf. Must be a RandomAccessIterator.
Parameters
epsilonMinimum probability used to explore among options. Each action is explored with at least epsilon/num_actions.
top_actionIndex of the exploit actions. This action will be get probability mass of 1-epsilon + (epsilon/num_actions).
pdf_firstIterator pointing to the pre-allocated beginning of the pdf to be generated by this function.
pdf_lastIterator pointing to the pre-allocated end of the pdf to be generated by this function.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 61 of file explore_internal.h.

Referenced by vw_slim::vw_predict< W >::predict(), CB_EXPLORE::predict_or_learn_greedy(), and TEST().

62  {
63  typedef typename std::iterator_traits<It>::iterator_category pdf_category;
64  return generate_epsilon_greedy(epsilon, top_action, pdf_first, pdf_last, pdf_category());
65  }
int generate_epsilon_greedy(float epsilon, uint32_t top_action, It pdf_first, It pdf_last, std::random_access_iterator_tag)

◆ generate_epsilon_greedy() [2/2]

template<typename It >
int exploration::generate_epsilon_greedy ( float  epsilon,
uint32_t  top_action,
It  pdf_first,
It  pdf_last,
std::random_access_iterator_tag   
)

Definition at line 38 of file explore_internal.h.

References E_EXPLORATION_BAD_RANGE, exploration::int_float::f, prediction_type::prob, and S_EXPLORATION_OK.

39  {
40  if (pdf_last < pdf_first)
42 
43  size_t num_actions = pdf_last - pdf_first;
44  if (num_actions == 0)
46 
47  if (top_action >= num_actions)
48  top_action = (uint32_t)num_actions - 1;
49 
50  float prob = epsilon / (float)num_actions;
51 
52  for (It d = pdf_first; d != pdf_last; ++d)
53  *d = prob;
54 
55  *(pdf_first + top_action) += 1.f - epsilon;
56 
57  return S_EXPLORATION_OK;
58  }
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3
float f
Definition: cache.cc:40

◆ generate_softmax() [1/2]

template<typename InputIt , typename OutputIt >
int exploration::generate_softmax ( float  lambda,
InputIt  scores_first,
InputIt  scores_last,
OutputIt  pdf_first,
OutputIt  pdf_last 
)

Generates softmax style exploration distribution.

Template Parameters
InputItIterator type of the input scores. Must be an InputIterator.
OutputItIterator type of the pre-allocated pdf. Must be a RandomAccessIterator.
Parameters
lambdaLambda parameter of softmax.
scores_firstIterator pointing to beginning of the scores.
scores_lastIterator pointing to end of the scores.
pdf_firstIterator pointing to the pre-allocated beginning of the pdf to be generated by this function.
pdf_lastIterator pointing to the pre-allocated end of the pdf to be generated by this function.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 113 of file explore_internal.h.

Referenced by CB_ADF::cb_adf::learn_SM(), vw_slim::vw_predict< W >::predict(), VW::cb_explore_adf::softmax::cb_explore_adf_softmax::predict_or_learn_impl(), and TEST().

114  {
115  typedef typename std::iterator_traits<InputIt>::iterator_category scores_category;
116  typedef typename std::iterator_traits<OutputIt>::iterator_category pdf_category;
117 
118  return generate_softmax(lambda, scores_first, scores_last, scores_category(), pdf_first, pdf_last, pdf_category());
119  }
int generate_softmax(float lambda, InputIt scores_first, InputIt scores_last, std::input_iterator_tag, OutputIt pdf_first, OutputIt pdf_last, std::random_access_iterator_tag)

◆ generate_softmax() [2/2]

template<typename InputIt , typename OutputIt >
int exploration::generate_softmax ( float  lambda,
InputIt  scores_first,
InputIt  scores_last,
std::input_iterator_tag  ,
OutputIt  pdf_first,
OutputIt  pdf_last,
std::random_access_iterator_tag   
)

Definition at line 68 of file explore_internal.h.

References E_EXPLORATION_BAD_RANGE, prediction_type::prob, and S_EXPLORATION_OK.

69  {
70  if (scores_last < scores_first || pdf_last < pdf_first)
72 
73  size_t num_actions_scores = scores_last - scores_first;
74  size_t num_actions_pdf = pdf_last - pdf_first;
75 
76  if (num_actions_scores != num_actions_pdf)
77  {
78  // fallback to the minimum
79  scores_last = scores_first + std::min(num_actions_scores, num_actions_pdf);
80  OutputIt pdf_new_last = pdf_first + std::min(num_actions_scores, num_actions_pdf);
81 
82  // zero out pdf
83  for (OutputIt d = pdf_new_last; d != pdf_last; ++d)
84  *d = 0;
85 
86  pdf_last = pdf_new_last;
87  }
88 
89  if (pdf_last - pdf_first == 0)
91 
92  float norm = 0.;
93  float max_score = lambda > 0 ? *std::max_element(scores_first, scores_last)
94  : *std::min_element(scores_first, scores_last);
95 
96  InputIt s = scores_first;
97  for (OutputIt d = pdf_first; d != pdf_last && s != scores_last; ++d, ++s)
98  {
99  float prob = exp(lambda*(*s - max_score));
100  norm += prob;
101 
102  *d = prob;
103  }
104 
105  // normalize
106  for (OutputIt d = pdf_first; d != pdf_last; ++d)
107  *d /= norm;
108 
109  return S_EXPLORATION_OK;
110  }
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3

◆ sample_after_normalizing() [1/4]

template<typename It >
int exploration::sample_after_normalizing ( uint64_t  seed,
It  pdf_first,
It  pdf_last,
uint32_t &  chosen_index 
)

Sample an index from the provided pdf. If the pdf is not normalized it will be updated in-place.

Template Parameters
InputItIterator type of the pdf. Must be a RandomAccessIterator.
Parameters
seedThe seed for the pseudo-random generator.
pdf_firstIterator pointing to the beginning of the pdf.
pdf_lastIterator pointing to the end of the pdf.
chosen_indexreturns the chosen index.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 286 of file explore_internal.h.

Referenced by do_actual_learning_ldf(), VW::cb_sample_data::learn_or_predict(), vw_slim::vw_predict< W >::predict(), predict_bandit_adf(), predict_or_learn(), predict_or_learn_adf(), sample_after_normalizing(), and TEST().

287  {
288  typedef typename std::iterator_traits<It>::iterator_category pdf_category;
289  return sample_after_normalizing(seed, pdf_first, pdf_last, chosen_index, pdf_category());
290  }
int sample_after_normalizing(const char *seed, It pdf_first, It pdf_last, uint32_t &chosen_index, std::random_access_iterator_tag pdf_category)

◆ sample_after_normalizing() [2/4]

template<typename It >
int exploration::sample_after_normalizing ( const char *  seed,
It  pdf_first,
It  pdf_last,
uint32_t &  chosen_index 
)

Sample an index from the provided pdf. If the pdf is not normalized it will be updated in-place.

Template Parameters
ItIterator type of the pdf. Must be a RandomAccessIterator.
Parameters
seedThe seed for the pseudo-random generator. Will be hashed using MURMUR hash.
pdf_firstIterator pointing to the beginning of the pdf.
pdf_lastIterator pointing to the end of the pdf.
chosen_indexreturns the chosen index.
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Definition at line 304 of file explore_internal.h.

References sample_after_normalizing().

305  {
306  typedef typename std::iterator_traits<It>::iterator_category pdf_category;
307  return sample_after_normalizing(seed, pdf_first, pdf_last, chosen_index, pdf_category());
308  }
int sample_after_normalizing(const char *seed, It pdf_first, It pdf_last, uint32_t &chosen_index, std::random_access_iterator_tag pdf_category)

◆ sample_after_normalizing() [3/4]

template<typename It >
int exploration::sample_after_normalizing ( uint64_t  seed,
It  pdf_first,
It  pdf_last,
uint32_t &  chosen_index,
std::input_iterator_tag   
)

Definition at line 236 of file explore_internal.h.

References E_EXPLORATION_BAD_RANGE, exploration::int_float::i, S_EXPLORATION_OK, and uniform_random_merand48().

237  {
238  if (pdf_first == pdf_last || pdf_last < pdf_first)
240  // Create a discrete_distribution based on the returned weights. This class handles the
241  // case where the sum of the weights is < or > 1, by normalizing agains the sum.
242  float total = 0.f;
243  for (It pdf = pdf_first; pdf != pdf_last; ++pdf)
244  {
245  if (*pdf < 0)
246  *pdf = 0;
247 
248  total += *pdf;
249  }
250 
251  // assume the first is the best
252  if (total == 0)
253  {
254  chosen_index = 0;
255  *pdf_first = 1;
256  return S_EXPLORATION_OK;
257  }
258 
259  float draw = total * uniform_random_merand48(seed);
260  if (draw > total) //make very sure that draw can not be greater than total.
261  draw = total;
262 
263  bool index_found = false; //found chosen action
264  float sum = 0.f;
265  uint32_t i = 0;
266  for (It pdf = pdf_first; pdf != pdf_last; ++pdf, ++i)
267  {
268  sum += *pdf;
269  if (!index_found && sum > draw)
270  {
271  chosen_index = i;
272  index_found = true;
273  }
274  *pdf /= total;
275  }
276 
277  if(!index_found)
278  chosen_index = i - 1;
279 
280  return S_EXPLORATION_OK;
281  }
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3
float uniform_random_merand48(uint64_t initial)

◆ sample_after_normalizing() [4/4]

template<typename It >
int exploration::sample_after_normalizing ( const char *  seed,
It  pdf_first,
It  pdf_last,
uint32_t &  chosen_index,
std::random_access_iterator_tag  pdf_category 
)

Definition at line 295 of file explore_internal.h.

References sample_after_normalizing(), and uniform_hash().

296  {
297  uint64_t seed_hash = uniform_hash(seed, strlen(seed), 0);
298  return sample_after_normalizing(seed_hash, pdf_first, pdf_last, chosen_index, pdf_category);
299  }
VW_STD14_CONSTEXPR uint64_t uniform_hash(const void *key, size_t len, uint64_t seed)
Definition: hash.h:67
int sample_after_normalizing(const char *seed, It pdf_first, It pdf_last, uint32_t &chosen_index, std::random_access_iterator_tag pdf_category)

◆ swap_chosen() [1/3]

template<typename ActionIt >
int exploration::swap_chosen ( ActionIt  action_first,
ActionIt  action_last,
uint32_t  chosen_index 
)

Swap the first value with the chosen index.

Template Parameters
ActionItIterator type of the action. Must be a forward_iterator.
Parameters
action_firstIterator pointing to the beginning of the pdf.
action_lastIterator pointing to the end of the pdf.
chosen_indexThe index value that should be swapped with the first element
Returns
int returns 0 on success, otherwise an error code as defined by E_EXPLORATION_*.

Referenced by VW::cb_sample_data::learn_or_predict(), and swap_chosen().

◆ swap_chosen() [2/3]

template<typename ActionIt >
int exploration::swap_chosen ( ActionIt  action_first,
ActionIt  action_last,
std::forward_iterator_tag  ,
uint32_t  chosen_index 
)

Definition at line 311 of file explore_internal.h.

References E_EXPLORATION_BAD_RANGE, and S_EXPLORATION_OK.

312  {
313  if ( action_last < action_first )
315 
316  size_t action_size = action_last - action_first;
317 
318  if ( action_size == 0 )
320 
321  if ( chosen_index >= action_size )
323 
324  // swap top element with chosen one
325  if ( chosen_index != 0 ) {
326  std::iter_swap(action_first, action_first + chosen_index);
327  }
328 
329  return S_EXPLORATION_OK;
330  }
#define E_EXPLORATION_BAD_RANGE
Definition: explore.h:4
#define S_EXPLORATION_OK
Definition: explore.h:3

◆ swap_chosen() [3/3]

template<typename ActionsIt >
int exploration::swap_chosen ( ActionsIt  action_first,
ActionsIt  action_last,
uint32_t  chosen_index 
)

Definition at line 333 of file explore_internal.h.

References swap_chosen().

333  {
334  typedef typename std::iterator_traits<ActionsIt>::iterator_category actionit_category;
335  return swap_chosen(action_first, action_last, actionit_category(), chosen_index);
336  }
int swap_chosen(ActionsIt action_first, ActionsIt action_last, uint32_t chosen_index)

◆ uniform_random_merand48()

float exploration::uniform_random_merand48 ( uint64_t  initial)
inline

Definition at line 29 of file explore_internal.h.

References bias, c, exploration::int_float::f, and exploration::int_float::i.

Referenced by sample_after_normalizing(), and TYPED_TEST_P().

30  {
31  initial = a * initial + c;
32  int_float temp;
33  temp.i = ((initial >> 25) & 0x7FFFFF) | bias;
34  return temp.f - 1;
35  }
constexpr uint64_t a
Definition: rand48.cc:11
constexpr int bias
Definition: rand48.cc:14
constexpr uint64_t c
Definition: rand48.cc:12

Variable Documentation

◆ a

const uint64_t exploration::a = 0xeece66d5deece66dULL

Definition at line 17 of file explore_internal.h.

◆ bias

const int exploration::bias = 127 << 23u

Definition at line 20 of file explore_internal.h.

Referenced by uniform_random_merand48().

◆ c

const uint64_t exploration::c = 2147483647

Definition at line 18 of file explore_internal.h.

Referenced by uniform_random_merand48().