pub struct Sampler { /* private fields */ }Expand description
A small, seedable xorshift64* generator. Not cryptographically secure – sampling doesn’t need that – but reproducible given a seed, which greedy argmax already was for free.
Implementations§
Source§impl Sampler
impl Sampler
pub fn new(seed: u64) -> Self
Sourcepub fn sample(
&mut self,
logits: &[f32],
params: &SamplingParams,
history: &[usize],
) -> usize
pub fn sample( &mut self, logits: &[f32], params: &SamplingParams, history: &[usize], ) -> usize
Samples one token id from logits, given params and the
already-generated history (for repetition penalty). Falls back
to plain greedy argmax when params.temperature <= 0.0.
A length-1 logits vector is treated as a precomputed greedy token
id (logits[0] as usize) — used by the Metal dense-stack path that
returns GPU argmax instead of downloading the full vocab.
Sourcepub fn sample_with_mask(
&mut self,
logits: &[f32],
params: &SamplingParams,
history: &[usize],
mask: Option<LogitMask<'_>>,
) -> usize
pub fn sample_with_mask( &mut self, logits: &[f32], params: &SamplingParams, history: &[usize], mask: Option<LogitMask<'_>>, ) -> usize
Like Self::sample, but optionally zeroes disallowed logits via
mask before argmax / nucleus sampling (used for JSON-object mode).
Sourcepub fn uniform(&mut self) -> f32
pub fn uniform(&mut self) -> f32
A uniform draw in [0.0, 1.0).
Exposed because speculative decoding’s accept test is a coin
flip against p_target(x) / p_draft(x) rather than a draw from
a distribution, and it must come off the same seeded stream as
every other draw in the run or a “reproducible given a seed”
generation stops being reproducible.
Sourcepub fn sample_from(&mut self, probs: &[f32]) -> usize
pub fn sample_from(&mut self, probs: &[f32]) -> usize
Draws one index from an already-normalised distribution.
Split out of Self::sample_with_mask so speculative decoding
can sample from a distribution it had to compute anyway (the
rejection rule needs p_target itself, not just a draw from it)
and still go through exactly the same draw as ordinary
sampling. Two separate copies of this loop would be two chances
to be subtly non-lossless.
Auto Trait Implementations§
impl Freeze for Sampler
impl RefUnwindSafe for Sampler
impl Send for Sampler
impl Sync for Sampler
impl Unpin for Sampler
impl UnsafeUnpin for Sampler
impl UnwindSafe for Sampler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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