Skip to main content

SeedStream

Struct SeedStream 

Source
pub struct SeedStream { /* private fields */ }
Expand description

A deterministic, fan-out seed generator for benchmark and training trials.

SeedStream derives independent 64-bit seeds for each (environment index, trial index) pair, and further splits each trial seed into separate env and agent seeds. Every derivation is a pure function of base and the index arguments, so the same SeedStream always produces the same sequence.

§Design

Derivation uses splitmix64 — a bijective mixing function — XOR’d with index-dependent multipliers. The env and agent branches are separated by distinct domain constants so env_seed(t) != agent_seed(t) for all t.

§Thread safety

SeedStream holds no mutable state and is Copy. All methods are const fn. It is safe to share across threads without synchronisation.

Implementations§

Source§

impl SeedStream

Source

pub const fn new(base: u64) -> Self

Creates a new SeedStream from the given base seed.

All seeds derived from this stream are fully determined by base. Two streams constructed with the same base produce identical output.

§Examples
use rlevo_core::util::seed::SeedStream;

let stream = SeedStream::new(0xDEAD_BEEF);
assert_eq!(stream.base(), 0xDEAD_BEEF);
Source

pub const fn base(&self) -> u64

Returns the base seed this stream was constructed with.

Useful for serialising or logging the root of a reproducible run.

§Examples
use rlevo_core::util::seed::SeedStream;

let stream = SeedStream::new(42);
assert_eq!(stream.base(), 42);
Source

pub const fn trial_seed(&self, env_idx: usize, trial_idx: usize) -> u64

Derives a deterministic seed for a specific (env index, trial index) pair.

The returned value is the root from which env_seed and agent_seed are derived for that trial. Different (env_idx, trial_idx) pairs always produce different seeds.

§Examples
use rlevo_core::util::seed::SeedStream;

let stream = SeedStream::new(42);

// Repeated calls with identical arguments are stable.
assert_eq!(stream.trial_seed(0, 0), stream.trial_seed(0, 0));

// Different index pairs yield different seeds.
assert_ne!(stream.trial_seed(0, 0), stream.trial_seed(0, 1));
assert_ne!(stream.trial_seed(0, 0), stream.trial_seed(1, 0));
Source

pub const fn env_seed(&self, trial_seed: u64) -> u64

Derives the environment seed for a given trial seed.

Pass the result of trial_seed as trial_seed. The returned value is guaranteed to differ from agent_seed for the same input, preventing env and agent RNGs from correlating.

§Examples
use rlevo_core::util::seed::SeedStream;

let stream = SeedStream::new(42);
let t = stream.trial_seed(0, 0);
let env_seed = stream.env_seed(t);
let agent_seed = stream.agent_seed(t);
assert_ne!(env_seed, agent_seed);
Source

pub const fn agent_seed(&self, trial_seed: u64) -> u64

Derives the agent seed for a given trial seed.

Pass the result of trial_seed as trial_seed. The returned value is guaranteed to differ from env_seed for the same input, preventing agent and env RNGs from correlating.

§Examples
use rlevo_core::util::seed::SeedStream;

let stream = SeedStream::new(42);
let t = stream.trial_seed(0, 0);

// agent_seed and env_seed are derived with different domain constants,
// so they are always distinct for the same trial seed.
assert_ne!(stream.agent_seed(t), stream.env_seed(t));

// Repeated calls are stable.
assert_eq!(stream.agent_seed(t), stream.agent_seed(t));

Trait Implementations§

Source§

impl Clone for SeedStream

Source§

fn clone(&self) -> SeedStream

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SeedStream

Source§

impl Debug for SeedStream

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Adaptor<()> for T

Source§

fn adapt(&self)

Adapt the type to be passed to a metric.
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<C> CloneExpand for C
where C: Clone,

Source§

fn __expand_clone_method(&self, _scope: &mut Scope) -> C

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoComptime for T

Source§

fn comptime(self) -> Self

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TuneInputs for T
where T: Clone + Send + Sync + 'static,

Source§

type At<'a> = T

The concrete input type at lifetime 'a.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more