class_docstr: High-level Python wrapper for a llama.cpp model.
code: def _sample(
      self,
      last_n_tokens_data,  # type: llama_cpp.Array[llama_cpp.llama_token]
      last_n_tokens_size: llama_cpp.c_int,
      top_k: llama_cpp.c_int,
      top_p: llama_cpp.c_float,
      temp: llama_cpp.c_float,
      tfs_z: llama_cpp.c_float,
      repeat_penalty: llama_cpp.c_float,
      frequency_penalty: llama_cpp.c_float,
      presence_penalty: llama_cpp.c_float,
      mirostat_mode: llama_cpp.c_int,
      mirostat_tau: llama_cpp.c_float,
      mirostat_eta: llama_cpp.c_float,
      penalize_nl: bool = True,
  ):
      invalidInputError(
          self.ctx is not None,
          "The attribute `ctx` of `Llama` object is None.",
      )
      invalidInputError(
          len(self.eval_logits) > 0,
          "The attribute `eval_logits` of `Llama` object is None.",
      )
      n_vocab = self.n_vocab()
      n_ctx = self.n_ctx()
      top_k = llama_cpp.c_int(n_vocab) if top_k.value <= 0 else top_k
      last_n_tokens_size = (
          llama_cpp.c_int(n_ctx)
          if last_n_tokens_size.value < 0
          else last_n_tokens_size
      )
      logits = self.eval_logits[-1]
      nl_logit = logits[self._token_nl]
      candidates = self._candidates
      llama_cpp.llama_init_candidates(
          ctx=self.ctx,
          candidates=llama_cpp.ctypes.byref(candidates),
      )
      llama_cpp.llama_sample_repetition_penalty(
          ctx=self.ctx,
          last_tokens_data=last_n_tokens_data,
          last_tokens_size=last_n_tokens_size,
          candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
          penalty=repeat_penalty,
      )
      llama_cpp.llama_sample_frequency_and_presence_penalties(
          ctx=self.ctx,
          candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
          last_tokens_data=last_n_tokens_data,
          last_tokens_size=last_n_tokens_size,
          alpha_frequency=frequency_penalty,
          alpha_presence=presence_penalty,
      )
      if not penalize_nl:
          candidates.data[self._token_nl].logit = llama_cpp.c_float(
              nl_logit
          )
      if temp.value == 0.0:
          return llama_cpp.llama_sample_token_greedy(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
          )
      elif mirostat_mode.value == 1:
          mirostat_mu = llama_cpp.c_float(2.0 * mirostat_tau.value)
          mirostat_m = llama_cpp.c_int(100)
          llama_cpp.llama_sample_temperature(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              temp=temp,
          )
          return llama_cpp.llama_sample_token_mirostat(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              tau=mirostat_tau,
              eta=mirostat_eta,
              mu=llama_cpp.ctypes.byref(mirostat_mu),  # type: ignore
              m=mirostat_m,
          )
      elif mirostat_mode.value == 2:
          mirostat_mu = llama_cpp.c_float(2.0 * mirostat_tau.value)
          llama_cpp.llama_sample_temperature(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.pointer(candidates),
              temp=temp,
          )
          return llama_cpp.llama_sample_token_mirostat_v2(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              tau=mirostat_tau,
              eta=mirostat_eta,
              mu=llama_cpp.ctypes.byref(mirostat_mu),  # type: ignore
          )
      else:
          llama_cpp.llama_sample_top_k(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              k=top_k,
              min_keep=llama_cpp.c_size_t(1),
          )
          llama_cpp.llama_sample_tail_free(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              z=tfs_z,
              min_keep=llama_cpp.c_size_t(1),
          )
          llama_cpp.llama_sample_typical(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              p=llama_cpp.c_float(1.0),
              min_keep=llama_cpp.c_size_t(1),
          )
          llama_cpp.llama_sample_top_p(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              p=top_p,
              min_keep=llama_cpp.c_size_t(1),
          )
          llama_cpp.llama_sample_temperature(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
              temp=temp,
          )
          return llama_cpp.llama_sample_token(
              ctx=self.ctx,
              candidates=llama_cpp.ctypes.byref(candidates),  # type: ignore
          )
  
imports: import os
  import sys
  import uuid
  import time
  import math
  import multiprocessing
  from typing import List, Optional, Union, Generator, Sequence, Iterator, Deque, Tuple
  from collections import deque, OrderedDict
  from bigdl.llm.utils.common import invalidInputError
  from bigdl.llm.ggml.model.generation import GenerationMixin
  from .None import llama_cpp
  from .llama_types import *
label_desc: Use image node_id 7 for calling the Llama obj's underlying member method code with example usage: obj._sample(last_n_tokens_data, last_n_tokens_size, top_k, top_p, temp, tfs_z, repeat_penalty, frequency_penalty, presence_penalty, mirostat_mode, mirostat_tau, mirostat_eta, penalize_nl) and returns: llama_cpp, llama_cpp, llama_cpp, llama_cpp