Skip to content

Commit 7545732

Browse files
committed
Backup of partial refactoring of Rng not a subtrait of RngCore
1 parent 90bc02b commit 7545732

File tree

19 files changed

+127
-199
lines changed

19 files changed

+127
-199
lines changed

necsim/core/src/cogs/rng.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ use core::{convert::AsMut, ptr::copy_nonoverlapping};
33
use serde::{de::DeserializeOwned, Serialize};
44

55
use crate::{
6-
cogs::{DistributionCore, DistributionSampler, Habitat, MathsCore},
6+
cogs::{Backup, DistributionCore, DistributionSampler, Habitat, MathsCore},
77
landscape::IndexedLocation,
88
};
99

10-
pub trait Rng<M: MathsCore>: RngCore {
10+
pub trait Rng<M: MathsCore>: Backup + Clone + core::fmt::Debug {
1111
type Generator: RngCore;
1212
type Sampler;
1313

@@ -17,7 +17,7 @@ pub trait Rng<M: MathsCore>: RngCore {
1717
#[must_use]
1818
fn map_generator<F: FnOnce(Self::Generator) -> Self::Generator>(self, map: F) -> Self;
1919

20-
fn with_rng<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q;
20+
fn with<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q;
2121
}
2222

2323
#[allow(clippy::module_name_repetitions)]
@@ -121,6 +121,6 @@ where
121121
{
122122
#[must_use]
123123
fn sample_with(&mut self, params: D::Parameters) -> D::Sample {
124-
self.with_rng(|rng, samplers| samplers.sample_with(rng, samplers, params))
124+
self.with(|rng, samplers| samplers.sample_with(rng, samplers, params))
125125
}
126126
}

necsim/impls/cuda/src/cogs/rng.rs

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use core::marker::PhantomData;
22

3-
use necsim_core::cogs::{MathsCore, Rng, RngCore};
4-
53
use const_type_layout::TypeGraphLayout;
64
use rust_cuda::safety::StackOnly;
75

8-
use serde::{Deserialize, Deserializer, Serialize, Serializer};
6+
use necsim_core::cogs::{MathsCore, Rng};
97

108
#[allow(clippy::module_name_repetitions)]
119
#[derive(Debug, rust_cuda::common::LendRustToCuda)]
@@ -38,22 +36,9 @@ impl<M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> From<R> for C
3836
}
3937
}
4038

41-
impl<M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> RngCore for CudaRng<M, R> {
42-
type Seed = <R as RngCore>::Seed;
43-
44-
#[must_use]
45-
#[inline]
46-
fn from_seed(seed: Self::Seed) -> Self {
47-
Self {
48-
inner: R::from_seed(seed),
49-
marker: PhantomData::<M>,
50-
}
51-
}
52-
53-
#[must_use]
54-
#[inline]
55-
fn sample_u64(&mut self) -> u64 {
56-
self.inner.sample_u64()
39+
impl<M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> CudaRng<M, R> {
40+
pub fn into(self) -> R {
41+
self.inner
5742
}
5843
}
5944

@@ -74,26 +59,7 @@ impl<M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> Rng<M> for Cu
7459
}
7560
}
7661

77-
fn with_rng<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
78-
self.inner.with_rng(inner)
79-
}
80-
}
81-
82-
impl<M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> Serialize for CudaRng<M, R> {
83-
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
84-
self.inner.serialize(serializer)
85-
}
86-
}
87-
88-
impl<'de, M: MathsCore, R: Rng<M> + StackOnly + ~const TypeGraphLayout> Deserialize<'de>
89-
for CudaRng<M, R>
90-
{
91-
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
92-
let inner = R::deserialize(deserializer)?;
93-
94-
Ok(Self {
95-
inner,
96-
marker: PhantomData::<M>,
97-
})
62+
fn with<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
63+
self.inner.with(inner)
9864
}
9965
}

necsim/impls/no-std/src/cogs/active_lineage_sampler/alias/sampler/indexed/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use hashbrown::HashMap;
1212

1313
use necsim_core::cogs::{
1414
distribution::{IndexU128, IndexU64, IndexUsize, Length},
15-
Backup, Distribution, MathsCore, Rng, Samples,
15+
Backup, Distribution, MathsCore, Rng, RngCore, Samples,
1616
};
1717
use necsim_core_bond::{NonNegativeF64, PositiveF64};
1818

@@ -67,7 +67,7 @@ impl<E: Eq + Hash + Backup> RejectionSamplingGroup<E> {
6767
rng,
6868
Length(NonZeroUsize::new_unchecked(self.weights.len())),
6969
);
70-
let height = rng.sample_u64() >> 11;
70+
let height = rng.generator().sample_u64() >> 11;
7171

7272
// 53rd bit of weight is always 1, so sampling chance >= 50%
7373
if height < self.weights[index] {

necsim/impls/no-std/src/cogs/active_lineage_sampler/alias/sampler/indexed/tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ fn sample_single_group() {
191191

192192
let mut tally = [0_u64; 6];
193193

194-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(24897);
194+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(24897));
195195

196196
for _ in 0..N {
197197
let (maybe_group, sample) = group.sample_pop(&mut lookup, &mut rng);
@@ -906,7 +906,7 @@ fn add_update_event_full() {
906906
fn sample_single_group_full() {
907907
const N: usize = 10_000_000;
908908

909-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(471_093);
909+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(471_093));
910910

911911
let mut sampler = DynamicAliasMethodIndexedSampler::with_capacity(6);
912912

@@ -955,7 +955,7 @@ fn sample_single_group_full() {
955955
fn sample_three_groups_full() {
956956
const N: usize = 10_000_000;
957957

958-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(739_139);
958+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(739_139));
959959

960960
let mut sampler = DynamicAliasMethodIndexedSampler::with_capacity(6);
961961

@@ -1001,7 +1001,7 @@ fn sample_three_groups_full() {
10011001
fn sample_three_groups_full_reverse() {
10021002
const N: usize = 10_000_000;
10031003

1004-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(248_971);
1004+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(248_971));
10051005

10061006
let mut sampler = DynamicAliasMethodIndexedSampler::with_capacity(6);
10071007

@@ -1123,7 +1123,7 @@ impl Rng<IntrinsicsMathsCore> for DummyRng {
11231123
map(self)
11241124
}
11251125

1126-
fn with_rng<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
1126+
fn with<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
11271127
let samplers = DummyDistributionSamplers;
11281128

11291129
inner(self, &samplers)

necsim/impls/no-std/src/cogs/active_lineage_sampler/alias/sampler/stack/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use core::{
99

1010
use necsim_core::cogs::{
1111
distribution::{IndexU128, IndexU64, IndexUsize, Length},
12-
Backup, Distribution, MathsCore, Rng, Samples,
12+
Backup, Distribution, MathsCore, Rng, RngCore, Samples,
1313
};
1414
use necsim_core_bond::{NonNegativeF64, PositiveF64};
1515

@@ -60,7 +60,7 @@ impl<E: Eq + Hash + Backup> RejectionSamplingGroup<E> {
6060
rng,
6161
Length(NonZeroUsize::new_unchecked(self.weights.len())),
6262
);
63-
let height = rng.sample_u64() >> 11;
63+
let height = rng.generator().sample_u64() >> 11;
6464

6565
// 53rd bit of weight is always 1, so sampling chance >= 50%
6666
if height < self.weights[index] {

necsim/impls/no-std/src/cogs/active_lineage_sampler/alias/sampler/stack/tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn sample_single_group() {
105105

106106
let mut tally = [0_u64; 6];
107107

108-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(24897);
108+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(24897));
109109

110110
for _ in 0..N {
111111
let (maybe_group, sample) = group.sample_pop(&mut rng);
@@ -405,7 +405,7 @@ fn add_remove_event_full() {
405405
fn sample_single_group_full() {
406406
const N: usize = 10_000_000;
407407

408-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(471_093);
408+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(471_093));
409409

410410
let mut sampler = DynamicAliasMethodStackSampler::with_capacity(6);
411411

@@ -454,7 +454,7 @@ fn sample_single_group_full() {
454454
fn sample_three_groups_full() {
455455
const N: usize = 10_000_000;
456456

457-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(739_139);
457+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(739_139));
458458

459459
let mut sampler = DynamicAliasMethodStackSampler::with_capacity(6);
460460

@@ -500,7 +500,7 @@ fn sample_three_groups_full() {
500500
fn sample_three_groups_full_reverse() {
501501
const N: usize = 10_000_000;
502502

503-
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::seed_from_u64(248_971);
503+
let mut rng = SimpleRng::<IntrinsicsMathsCore, WyHash>::from(WyHash::seed_from_u64(248_971));
504504

505505
let mut sampler = DynamicAliasMethodStackSampler::with_capacity(6);
506506

@@ -622,7 +622,7 @@ impl Rng<IntrinsicsMathsCore> for DummyRng {
622622
map(self)
623623
}
624624

625-
fn with_rng<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
625+
fn with<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
626626
let samplers = DummyDistributionSamplers;
627627

628628
inner(self, &samplers)

necsim/impls/no-std/src/cogs/habitat/almost_infinite.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::{fmt, marker::PhantomData};
22

33
use necsim_core::{
4-
cogs::{Backup, Habitat, MathsCore, Rng, UniformlySampleableHabitat},
4+
cogs::{Backup, Habitat, MathsCore, Rng, RngCore, UniformlySampleableHabitat},
55
landscape::{IndexedLocation, LandscapeExtent, Location},
66
};
77
use necsim_core_bond::{OffByOneU32, OffByOneU64};
@@ -82,7 +82,7 @@ impl<M: MathsCore, G: Rng<M>> UniformlySampleableHabitat<M, G> for AlmostInfinit
8282
#[must_use]
8383
#[inline]
8484
fn sample_habitable_indexed_location(&self, rng: &mut G) -> IndexedLocation {
85-
let index = rng.sample_u64();
85+
let index = rng.generator().sample_u64();
8686

8787
IndexedLocation::new(
8888
Location::new(

necsim/impls/no-std/src/cogs/rng/simple.rs

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ use core::{
33
num::{NonZeroU128, NonZeroU32, NonZeroU64, NonZeroUsize},
44
};
55

6-
use serde::{Deserialize, Deserializer, Serialize, Serializer};
7-
86
use necsim_core::cogs::{
97
distribution::{
108
Bernoulli, Exponential, IndexU128, IndexU32, IndexU64, IndexUsize, Lambda, Length, Normal,
@@ -23,20 +21,18 @@ pub struct SimpleRng<M: MathsCore, R: RngCore> {
2321
marker: PhantomData<M>,
2422
}
2523

26-
impl<M: MathsCore, R: RngCore> Serialize for SimpleRng<M, R> {
27-
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
28-
self.inner.serialize(serializer)
24+
impl<M: MathsCore, R: RngCore> From<R> for SimpleRng<M, R> {
25+
fn from(inner: R) -> Self {
26+
Self {
27+
inner,
28+
marker: PhantomData::<M>,
29+
}
2930
}
3031
}
3132

32-
impl<'de, M: MathsCore, R: RngCore> Deserialize<'de> for SimpleRng<M, R> {
33-
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
34-
let inner = R::deserialize(deserializer)?;
35-
36-
Ok(Self {
37-
inner,
38-
marker: PhantomData::<M>,
39-
})
33+
impl<M: MathsCore, R: RngCore> SimpleRng<M, R> {
34+
pub fn into(self) -> R {
35+
self.inner
4036
}
4137
}
4238

@@ -50,23 +46,6 @@ impl<M: MathsCore, R: RngCore> Backup for SimpleRng<M, R> {
5046
}
5147
}
5248

53-
impl<M: MathsCore, R: RngCore> RngCore for SimpleRng<M, R> {
54-
type Seed = R::Seed;
55-
56-
#[must_use]
57-
fn from_seed(seed: Self::Seed) -> Self {
58-
Self {
59-
inner: R::from_seed(seed),
60-
marker: PhantomData::<M>,
61-
}
62-
}
63-
64-
#[must_use]
65-
fn sample_u64(&mut self) -> u64 {
66-
self.inner.sample_u64()
67-
}
68-
}
69-
7049
impl<M: MathsCore, R: RngCore> Rng<M> for SimpleRng<M, R> {
7150
type Generator = R;
7251
type Sampler = SimplerDistributionSamplers<M, R>;
@@ -84,7 +63,7 @@ impl<M: MathsCore, R: RngCore> Rng<M> for SimpleRng<M, R> {
8463
}
8564
}
8665

87-
fn with_rng<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
66+
fn with<F: FnOnce(&mut Self::Generator, &Self::Sampler) -> Q, Q>(&mut self, inner: F) -> Q {
8867
let samplers = SimplerDistributionSamplers {
8968
_marker: PhantomData::<(M, R)>,
9069
};

rustcoalescence/algorithms/cuda/src/launch.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ pub fn initialise_and_simulate<
5858
Error: From<CudaError>,
5959
>(
6060
args: &CudaArguments,
61-
rng: CudaRng<M, SimpleRng<M, WyHash>>,
61+
rng: WyHash,
6262
scenario: O,
6363
pre_sampler: OriginPreSampler<M, I>,
6464
pause_before: Option<NonNegativeF64>,
6565
local_partition: &mut P,
6666
lineage_store_sampler_initialiser: L,
67-
) -> Result<SimulationOutcome<M, CudaRng<M, SimpleRng<M, WyHash>>>, Error>
67+
) -> Result<SimulationOutcome<WyHash>, Error>
6868
where
6969
O::Habitat: RustToCuda,
7070
O::DispersalSampler<
@@ -120,6 +120,8 @@ where
120120
R::ReportDispersal,
121121
>,
122122
{
123+
let rng = CudaRng::from(SimpleRng::from(rng));
124+
123125
let (
124126
habitat,
125127
dispersal_sampler,
@@ -236,8 +238,7 @@ where
236238
.into_iter()
237239
.chain(passthrough.into_iter())
238240
.collect(),
239-
rng: simulation.rng_mut().clone(),
240-
marker: PhantomData::<M>,
241+
rng: simulation.rng_mut().clone().into().into(),
241242
}),
242243
}
243244
}

0 commit comments

Comments
 (0)