docstr: Parameters
  ----------
  previous_best
      List with tuples of result candidates.
  
  Returns
  -------
  List with tuples of candidate anchors with additional metadata.
docstr_tok: ["Parameters","--","--","--","--","--","previous_best","List","with","tuples","of","result","candidates",".","Returns","--","--","--","-","List","with","tuples","of","candidate","anchors","with","additional","metadata","."]
code: def propose_anchors(self, previous_best: list) -> list:
      """
      Parameters
      ----------
      previous_best
          List with tuples of result candidates.
  
      Returns
      -------
      List with tuples of candidate anchors with additional metadata.
      """
  
      # compute some variables used later on
      state = self.state
      all_features = range(state["n_features"])
      coverage_data = state["coverage_data"]
      current_idx = state["current_idx"]
      data = state["data"][:current_idx]
      labels = state["labels"][:current_idx]
  
      # initially, every feature separately is an result
      if len(previous_best) == 0:
          tuples = [(x,) for x in all_features]
          for x in tuples:
              pres = data[:, x[0]].nonzero()[
                  0
              ]  # Select samples whose feat value is = to the result value
              state["t_idx"][x] = set(pres)
              state["t_nsamples"][x] = float(len(pres))
              state["t_positives"][x] = float(labels[pres].sum())
              state["t_order"][x].append(x[0])
              state["t_coverage_idx"][x] = set(
                  coverage_data[:, x[0]].nonzero()[0]
              )
              state["t_coverage"][x] = (
                  float(len(state["t_coverage_idx"][x]))
                  / coverage_data.shape[0]
              )
          return tuples
  
      # create new anchors: add a feature to every result in current best
      new_tuples: Set[tuple] = set()
      for f in all_features:
          for t in previous_best:
              new_t = self._sort(t + (f,), allow_duplicates=False)
              if (
                  len(new_t) != len(t) + 1
              ):  # Avoid repeating the same feature ...
                  continue
              if new_t not in new_tuples:
                  new_tuples.add(new_t)
                  state["t_order"][new_t] = copy.deepcopy(
                      state["t_order"][t]
                  )
                  state["t_order"][new_t].append(f)
                  state["t_coverage_idx"][new_t] = state[
                      "t_coverage_idx"
                  ][t].intersection(state["t_coverage_idx"][(f,)])
                  state["t_coverage"][new_t] = (
                      float(len(state["t_coverage_idx"][new_t]))
                      / coverage_data.shape[0]
                  )
                  t_idx = np.array(
                      list(state["t_idx"][t])
                  )  # indices of samples where the len-1 result applies
                  t_data = state["data"][t_idx]
                  present = np.where(t_data[:, f] == 1)[0]
                  state["t_idx"][new_t] = set(
                      t_idx[present]
                  )  # indices of samples where the proposed result applies
                  idx_list = list(state["t_idx"][new_t])
                  state["t_nsamples"][new_t] = float(len(idx_list))
                  state["t_positives"][new_t] = np.sum(
                      state["labels"][idx_list]
                  )
  
      return list(new_tuples)
  
imports: import copy
  import logging
  from collections import defaultdict, namedtuple
  from typing import Callable, Dict, List, Optional, Set, Tuple
  import numpy
  from alibi.utils.distributions import kl_bernoulli
label_desc: Use image node_id 11 for calling the AnchorBaseBeam obj's underlying member method code with example usage: obj.propose_anchors(previous_best) and returns: list, tuples