code: def run(self, n_samples=1000, random_state=None):
      x, y = self.load_data(n_samples=n_samples)
  
      print("-" * 80)
      print("Random state", random_state)
      print("-" * 80, flush=True)
  
      random_state = check_random_state(random_state)
  
      start = time.time()
      start_aff = time.time()
      affinity = openTSNE.affinity.PerplexityBasedNN(
          x,
          perplexity=self.perplexity,
          method="annoy",
          n_jobs=self.n_jobs,
          random_state=random_state,
          verbose=True,
      )
      print("openTSNE: NN search", time.time() - start_aff, flush=True)
  
      init = openTSNE.initialization.random(
          x, n_components=2, random_state=random_state, verbose=True
      )
  
      start_optim = time.time()
      embedding = openTSNE.TSNEEmbedding(
          init,
          affinity,
          learning_rate=self.learning_rate,
          n_jobs=self.n_jobs,
          negative_gradient_method="bh",
          random_state=random_state,
          verbose=True,
      )
      embedding.optimize(
          250, exaggeration=12, momentum=0.8, inplace=True
      )
      embedding.optimize(750, momentum=0.5, inplace=True)
      print("openTSNE: Optimization", time.time() - start_optim)
      print("openTSNE: Full", time.time() - start, flush=True)
  
imports: import gzip
  import pickle
  import time
  from os import path
  import fire
  import numpy
  from MulticoreTSNE import MulticoreTSNE
  from sklearn.manifold import TSNE
  from sklearn.utils import check_random_state
  import openTSNE
  import openTSNE.callbacks
label_desc: Use image node_id 1 for calling the openTSNEBH obj's underlying member method code with example usage: obj.run(n_samples, random_state) without return types