code: def build(self):
      data, k = self.data, self.k
  
      timer = utils.Timer(
          f"Finding {k} nearest neighbors using Annoy approximate search using "
          f"{self.metric} distance...",
          verbose=self.verbose,
      )
      timer.__enter__()
  
      from openTSNE.dependencies.annoy import AnnoyIndex
  
      N = data.shape[0]
  
      annoy_metric = self.metric
      annoy_aliases = {
          "cosine": "angular",
          "l1": "manhattan",
          "l2": "euclidean",
          "taxicab": "manhattan",
      }
      if annoy_metric in annoy_aliases:
          annoy_metric = annoy_aliases[annoy_metric]
  
      self.index = AnnoyIndex(data.shape[1], annoy_metric)
  
      random_state = check_random_state(self.random_state)
      self.index.set_seed(random_state.randint(np.iinfo(np.int32).max))
  
      for i in range(N):
          self.index.add_item(i, data[i])
  
      # Number of trees. FIt-SNE uses 50 by default.
      self.index.build(50, n_jobs=self.n_jobs)
  
      # Return the nearest neighbors in the training set
      distances = np.zeros((N, k))
      indices = np.zeros((N, k)).astype(int)
  
      def getnns(i):
          # Annoy returns the query point itself as the first element
          indices_i, distances_i = self.index.get_nns_by_item(
              i, k + 1, include_distances=True
          )
          indices[i] = indices_i[1:]
          distances[i] = distances_i[1:]
  
      if self.n_jobs == 1:
          for i in range(N):
              getnns(i)
      else:
          from joblib import Parallel, delayed
  
          Parallel(n_jobs=self.n_jobs, require="sharedmem")(
              delayed(getnns)(i) for i in range(N)
          )
  
      timer.__exit__()
  
      return indices, distances
  
imports: import logging
  import os
  import warnings
  import numpy
  from scipy.spatial.distance import cdist
  from sklearn import neighbors
  from sklearn.utils import check_random_state
  from openTSNE import utils
label_desc: Use image node_id 2 for calling the Annoy obj's underlying member method code with example usage: obj.build() and returns: indices,  distances