class_docstr: Recast optimizer where points to evaluate are provided in batches
  and stored by the optimizer to be asked and told on. The fake_callable
  is only brought into action every 'batch size' number of asks and tells
  instead of every ask and tell. This opens up the optimizer to
  parallelism.
  
  Note
  ----
  You have to complete a batch before you start a new one so parallelism
  is only possible within batches i.e. if a batch size is 100 and you have
  done 100 asks, you must do 100 tells before you ask again but you could do
  those 100 asks and tells in parallel. To find out if you can perform an ask
  at any given time call self.can_ask.
class_docstr_tok: ["Recast","optimizer","where","points","to","evaluate","are","provided","in","batches","and","stored","by","the","optimizer","to","be","asked","and","told","on",".","The","fake_callable","is","only","brought","into","action","every","'batch","size","'","number","of","asks","and","tells","instead","of","every","ask","and","tell",".","This","opens","up","the","optimizer","to","parallelism",".","Note","--","--","You","have","to","complete","a","batch","before","you","start","a","new","one","so","parallelism","is","only","possible","within","batches","i.e",".","if","a","batch","size","is","100","and","you","have","done","100","asks",",","you","must","do","100","tells","before","you","ask","again","but","you","could","do","those","100","asks","and","tells","in","parallel",".","To","find","out","if","you","can","perform","an","ask","at","any","given","time","call","self.can_ask","."]
docstr: Returns value for a point which was "asked"
  (none asked point cannot be "tell")
docstr_tok: ["Returns","value","for","a","point","which","was","``","asked","''","(","none","asked","point","can","not","be","``","tell","''",")"]
code: def _internal_tell_candidate(
      self, candidate: p.Parameter, loss: float
  ) -> None:
      """Returns value for a point which was "asked"
      (none asked point cannot be "tell")
      """
      assert (
          self._messaging_thread is not None
      ), 'Start by using "ask" method, instead of "tell" method'
      if not self._messaging_thread.is_alive():  # optimizer is done
          self._check_error()
          return
      candidate_index = self.indices.pop(candidate.uid)
      self._batch_losses[candidate_index] = self._post_loss(
          candidate, loss
      )
      self._tell_counter += 1
      # if batch size number of tells since new batch, send array of losses to fake callable
      if self._tell_counter == self.batch_size:
          self._messaging_thread.messages_tell.put(
              np.array(self._batch_losses)
          )
          self._batch_losses = []
          self._tell_counter = 0
  
imports: import warnings
  import threading
  import queue
  import numpy
  import nevergrad.common.typing
  from nevergrad.common.errors import NevergradError
  from nevergrad.parametrization import parameter
  from .None import base
  from .base import IntOrParameter
label_desc: Use image node_id 3 for calling the BatchRecastOptimizer obj's underlying member method code with example usage: obj._internal_tell_candidate(candidate, loss) without return types