Skip to content

Commit 9151e27

Browse files
committed
improve control over prng in hydra::sample/fill_random
1 parent b07e36f commit 9151e27

File tree

7 files changed

+107
-85
lines changed

7 files changed

+107
-85
lines changed

examples/random/fill_basic_distributions.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
#include <hydra/device/System.h>
4848
#include <hydra/Parameter.h>
4949
#include <hydra/Random.h>
50-
#include <hydra/detail/Copy.inl>
50+
#include <hydra/Algorithm.h>
5151

5252

5353
//hydra functions

hydra/Random.h

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <hydra/detail/BackendPolicy.h>
3636
#include <hydra/Types.h>
3737
#include <hydra/detail/functors/RandomUtils.h>
38+
#include <hydra/detail/functors/DistributionSampler.h>
3839
#include <hydra/detail/TypeTraits.h>
3940
#include <hydra/detail/Iterable_traits.h>
4041
#include <hydra/detail/FunctorTraits.h>
@@ -118,7 +119,9 @@ template<typename RNG=default_random_engine, typename DerivedPolicy, typename It
118119
typename std::enable_if<
119120
detail::random::is_iterator<IteratorData>::value && detail::random::is_iterator<IteratorWeight>::value,
120121
Range<IteratorData> >::type
121-
unweight( hydra_thrust::detail::execution_policy_base<DerivedPolicy> const& policy, IteratorData data_begin, IteratorData data_end, IteratorWeight weights_begin);
122+
unweight( hydra_thrust::detail::execution_policy_base<DerivedPolicy> const& policy,
123+
IteratorData data_begin, IteratorData data_end, IteratorWeight weights_begin,
124+
double max_pdf=-1.0, size_t rng_seed=0x8ec74d321e6b5a27, size_t rng_jump=0);
122125

123126
/**
124127
* \ingroup random
@@ -137,7 +140,8 @@ template<typename RNG=default_random_engine, typename IteratorData, typename Ite
137140
typename std::enable_if<
138141
detail::random::is_iterator<IteratorData>::value && detail::random::is_iterator<IteratorWeight>::value,
139142
Range<IteratorData> >::type
140-
unweight( detail::BackendPolicy<BACKEND> const& policy, IteratorData data_begin, IteratorData data_end, IteratorWeight weights_begin);
143+
unweight( detail::BackendPolicy<BACKEND> const& policy, IteratorData data_begin, IteratorData data_end, IteratorWeight weights_begin,
144+
double max_pdf=-1.0, size_t rng_seed=0x8ec74d321e6b5a27, size_t rng_jump=0);
141145

142146
/**
143147
* \ingroup random
@@ -156,7 +160,8 @@ typename std::enable_if<
156160
detail::random::is_iterator<IteratorData>::value && detail::random::is_iterator<IteratorWeight>::value,
157161
Range<IteratorData>
158162
>::type
159-
unweight(IteratorData data_begin, IteratorData data_end , IteratorData weights_begin);
163+
unweight(IteratorData data_begin, IteratorData data_end , IteratorData weights_begin,
164+
double max_pdf=-1.0, size_t rng_seed=0x8ec74d321e6b5a27, size_t rng_jump=0);
160165

161166
/**
162167
* \ingroup random
@@ -174,7 +179,8 @@ template<typename RNG=default_random_engine, typename IterableData, typename Ite
174179
typename std::enable_if<
175180
detail::random::is_iterable<IterableData>::value && detail::random::is_iterable<IterableWeight>::value,
176181
Range< decltype(std::declval<IterableData>().begin())> >::type
177-
unweight( hydra::detail::BackendPolicy<BACKEND> const& policy, IterableData&& data, IterableWeight&& weights);
182+
unweight( hydra::detail::BackendPolicy<BACKEND> const& policy, IterableData&& data, IterableWeight&& weights,
183+
double max_pdf=-1.0, size_t rng_seed=0x8ec74d321e6b5a27, size_t rng_jump=0);
178184

179185
/**
180186
* \ingroup random
@@ -192,7 +198,8 @@ typename std::enable_if<
192198
detail::random::is_iterable<IterableData>::value && detail::random::is_iterable<IterableWeight>::value,
193199
Range< decltype(std::declval<IterableData>().begin())>
194200
>::type
195-
unweight( IterableData data, IterableWeight weights);
201+
unweight( IterableData data, IterableWeight weights,
202+
double max_pdf=-1.0, size_t rng_seed=0x8ec74d321e6b5a27, size_t rng_jump=0 );
196203

197204

198205
/**
@@ -304,7 +311,7 @@ detail::random::is_callable<Functor>::value && detail::random::is_iterator<Itera
304311
Range<Iterator> >::type
305312
sample(hydra::detail::BackendPolicy<BACKEND> const& policy,
306313
Iterator begin, Iterator end, double min, double max,
307-
Functor const& functor, size_t seed=0xb56c4feeef1b);
314+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
308315

309316
/**
310317
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -322,7 +329,7 @@ detail::random::is_callable<Functor>::value && detail::random::is_iterator<Itera
322329
Range<Iterator> >::type
323330
sample(hydra_thrust::detail::execution_policy_base<DerivedPolicy> const& policy,
324331
Iterator begin, Iterator end, double min, double max,
325-
Functor const& functor, size_t seed=0xb56c4feeef1b);
332+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
326333

327334
/**
328335
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -338,7 +345,7 @@ typename std::enable_if<
338345
detail::random::is_callable<Functor>::value && detail::random::is_iterator<Iterator>::value,
339346
Range<Iterator> >::type
340347
sample(Iterator begin, Iterator end , double min, double max,
341-
Functor const& functor, size_t seed=0xb56c4feeef1b);
348+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
342349

343350
/**
344351
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -353,7 +360,7 @@ typename std::enable_if<
353360
detail::random::is_callable<Functor>::value && detail::random::is_iterable<Iterable>::value ,
354361
Range< decltype(std::declval<Iterable>().begin())>>::type
355362
sample(Iterable&& output, double min, double max,
356-
Functor const& functor, size_t seed=0xb56c4feeef1b);
363+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
357364

358365
/**
359366
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -369,7 +376,7 @@ typename std::enable_if<
369376
detail::random::is_callable<Functor>::value && detail::random::is_iterator<Iterator>::value,
370377
Range<Iterator> >::type
371378
sample(Iterator begin, Iterator end , std::array<double,N>const& min, std::array<double,N>const& max,
372-
Functor const& functor, size_t seed=0xb56c4feeef1b);
379+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
373380

374381
/**
375382
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -388,7 +395,7 @@ detail::is_tuple_type< decltype(*std::declval<Iterator>())>::value,
388395
Range<Iterator> >::type
389396
sample(Iterator begin, Iterator end ,
390397
typename Functor::argument_type const& min, typename Functor::argument_type const& max,
391-
Functor const& functor, size_t seed=0xb56c4feeef1b);
398+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
392399

393400
/**
394401
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -406,7 +413,7 @@ Range<Iterator> >::type
406413
sample(hydra::detail::BackendPolicy<BACKEND> const& policy,
407414
Iterator begin, Iterator end ,
408415
std::array<double,N>const& min, std::array<double,N>const& max,
409-
Functor const& functor, size_t seed=0xb56c4feeef1b);
416+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
410417
/**
411418
* @brief Fill a range with numbers distributed according a user defined distribution.
412419
* @param policy backend to perform the calculation.
@@ -423,7 +430,7 @@ Range<Iterator> >::type
423430
sample(hydra_thrust::detail::execution_policy_base<DerivedPolicy> const& policy,
424431
Iterator begin, Iterator end ,
425432
std::array<double,N>const& min, std::array<double,N>const& max,
426-
Functor const& functor, size_t seed=0xb56c4feeef1b);
433+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
427434

428435
/**
429436
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -439,7 +446,7 @@ detail::random::is_callable<Functor>::value && detail::random::is_iterable<Itera
439446
Range< decltype(std::declval<Iterable>().begin())>>::type
440447
sample( Iterable&& output ,
441448
std::array<double,N>const& min, std::array<double,N>const& max,
442-
Functor const& functor, size_t seed=0xb56c4feeef1b);
449+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
443450

444451
/**
445452
* @brief Fill a range with numbers distributed according a user defined distribution.
@@ -457,7 +464,7 @@ detail::is_tuple_type< decltype(*std::declval<Iterable>().begin())>::value ,
457464
Range< decltype(std::declval<Iterable>().begin())>>::type
458465
sample( Iterable&& output ,
459466
typename Functor::argument_type const& min,typename Functor::argument_type const& max,
460-
Functor const& functor, size_t seed=0xb56c4feeef1b);
467+
Functor const& functor, size_t seed=0xb56c4feeef1b, size_t rng_jump=0 );
461468

462469
/**
463470
* \ingroup random
@@ -474,7 +481,7 @@ decltype(std::declval<RngFormula<FUNCTOR>>().Generate( std::declval<Engine&>(),
474481
typename hydra_thrust::iterator_traits<Iterator>::value_type
475482
>::value, void>::type
476483
fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
477-
Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
484+
Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
478485

479486
/**
480487
* \ingroup random
@@ -489,7 +496,7 @@ typename std::enable_if< hydra::detail::has_rng_formula<FUNCTOR>::value && std::
489496
decltype(std::declval<RngFormula<FUNCTOR>>().Generate( std::declval<Engine&>(), std::declval<FUNCTOR const&>())),
490497
typename hydra_thrust::iterator_traits<Iterator>::value_type
491498
>::value, void>::type
492-
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
499+
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
493500

494501
/**
495502
* \ingroup random
@@ -504,7 +511,7 @@ typename std::enable_if< hydra::detail::is_iterable<Iterable>::value && std::is_
504511
decltype(*std::declval<Iterable>().begin()), typename FUNCTOR::return_type
505512
>::value, void>::type
506513
fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
507-
Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
514+
Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
508515

509516
/**
510517
* \ingroup random
@@ -517,7 +524,7 @@ template< typename Engine = hydra::default_random_engine, typename Iterable, typ
517524
typename std::enable_if< hydra::detail::is_iterable<Iterable>::value && std::is_convertible<
518525
decltype(*std::declval<Iterable>().begin()), typename FUNCTOR::return_type
519526
>::value, void>::type
520-
fill_random(Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
527+
fill_random(Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
521528

522529
/**
523530
* \ingroup random
@@ -531,7 +538,7 @@ fill_random(Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf
531538
template< typename Engine = hydra::default_random_engine, hydra::detail::Backend BACKEND, typename Iterator, typename FUNCTOR >
532539
typename std::enable_if< !hydra::detail::has_rng_formula<FUNCTOR>::value , void>::type
533540
fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
534-
Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
541+
Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
535542

536543
/**
537544
* \ingroup random
@@ -543,7 +550,7 @@ fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
543550
*/
544551
template< typename Engine = hydra::default_random_engine, typename Iterator, typename FUNCTOR >
545552
typename std::enable_if< !hydra::detail::has_rng_formula<FUNCTOR>::value , void>::type
546-
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
553+
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
547554

548555
/**
549556
* \ingroup random
@@ -560,7 +567,7 @@ decltype(std::declval<RngFormula<FUNCTOR>>().Generate( std::declval<Engine&>(),
560567
typename std::iterator_traits<Iterator>::value_type
561568
>::value && hydra::detail::has_rng_formula<FUNCTOR>::value, void>::type
562569
fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
563-
Iterator begin, Iterator end, FUNCTOR const& funct, size_t seed=0x254a0afcf7da74a2);
570+
Iterator begin, Iterator end, FUNCTOR const& funct, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
564571

565572
/**
566573
* \ingroup random
@@ -575,7 +582,7 @@ typename std::enable_if< !std::is_convertible<
575582
decltype(std::declval<RngFormula<FUNCTOR>>().Generate( std::declval<Engine&>(), std::declval<FUNCTOR const&>())),
576583
typename std::iterator_traits<Iterator>::value_type
577584
>::value && hydra::detail::has_rng_formula<FUNCTOR>::value, void>::type
578-
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
585+
fill_random(Iterator begin, Iterator end, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
579586

580587
/**
581588
* \ingroup random
@@ -590,7 +597,7 @@ typename std::enable_if< !hydra::detail::is_iterable<Iterable>::value || !std::i
590597
decltype(*std::declval<Iterable>().begin()), typename FUNCTOR::return_type
591598
>::value, void>::type
592599
fill_random(hydra::detail::BackendPolicy<BACKEND> const& policy,
593-
Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
600+
Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
594601

595602
/**
596603
* \ingroup random
@@ -603,7 +610,7 @@ template< typename Engine = hydra::default_random_engine, typename Iterable, typ
603610
typename std::enable_if< !hydra::detail::is_iterable<Iterable>::value || !std::is_convertible<
604611
decltype(*std::declval<Iterable>().begin()), typename FUNCTOR::return_type
605612
>::value, void>::type
606-
fill_random(Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2);
613+
fill_random(Iterable&& iterable, FUNCTOR const& functor, size_t seed=0x254a0afcf7da74a2, size_t rng_jump=0 );
607614

608615

609616

0 commit comments

Comments
 (0)