Skip to main content

Sampler

Struct Sampler 

Source
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

Source

pub fn new(seed: u64) -> Self

Source

pub fn xtc_roll(&mut self, params: &SamplingParams) -> Option<f32>

The one uniform draw XTC needs for this token, or None when XTC cannot fire for these parameters.

XTC is the only sampler in the chain that is itself stochastic (llama_sample_xtc_apply draws from its own std::mt19937, src/llama-sampler.cpp:2146), which is why the chain below takes the roll as an argument instead of owning an RNG: the chain is also what sampling_distribution runs for speculative verification, and a filter that drew its own randomness there would make “the distribution the sampler draws from” a different distribution every time it was asked.

The draw is skipped when XTC cannot fire, and that is not an optimisation. Every draw advances the seeded stream, so drawing unconditionally would shift every subsequent token of every existing seeded generation, on every run that never asked for XTC. SamplingParams::xtc_can_fire is the single predicate this and [Candidates::xtc] share.

Source

pub fn sample( &mut self, logits: &[f32], params: &SamplingParams, history: PenaltyWindow<'_>, ) -> usize

Samples one token id from logits, given params and the PenaltyWindow the penalties look back over. Falls back to plain greedy argmax when params.temperature <= 0.0.

history is a window and not a slice on purpose: it carries the PROMPT as well as the generated tokens, which is what llama.cpp penalises over. See crate::penalty_window.

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.

Source

pub fn sample_with_mask( &mut self, logits: &[f32], params: &SamplingParams, history: PenaltyWindow<'_>, mask: Option<LogitMask<'_>>, ) -> usize

Like Self::sample, but optionally zeroes disallowed logits via mask before argmax / nucleus sampling (used for JSON-object mode).

Source

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.

Source

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§

Blanket Implementations§

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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.