docs: def predict(self, X_test, y=None):
          """
          Predict embedding on new data X_test given the existing embedding on training data
  
          Uses the Nystrom Extension to estimate the eigenvectors.
  
          Currently only works with input_type data (i.e. not affinity or distance)
          """
          if not hasattr(self, 'geom_'):
              raise RuntimeError('the .fit() function must be called before the .predict() function')
          if self.geom_.X is None:
              raise NotImplementedError('method only implemented when X passed as data')
          # Complete the adjacency matrix
          adjacency_kwds = self.geom_.adjacency_kwds
          if self.geom_.adjacency_method == 'cyflann':
              if 'cyflann_kwds' in adjacency_kwds.keys():
                  cyflann_kwds = adjacency_kwds['cyflann_kwds']
              else:
                  cyflann_kwds = {}
          total_adjacency_matrix = complete_adjacency_matrix(self.geom_.adjacency_matrix,
                                                             self.geom_.X,
                                                             X_test,adjacency_kwds)
          # Compute the affinity matrix, check method and kwds
          if self.geom_.affinity_kwds is not None:
              affinity_kwds = self.geom_.affinity_kwds
          else:
              affinity_kwds = {}
          if self.geom_.affinity_method is not None:
              affinity_method = self.geom_.affinity_method
          else:
              affinity_method = 'auto'
          total_affinity_matrix = compute_affinity_matrix(total_adjacency_matrix, affinity_method,
                                                         **affinity_kwds)
          # Compute the affinity matrix, check method and kwds
          if self.geom_.laplacian_kwds is not None:
              laplacian_kwds = self.geom_.laplacian_kwds
          else:
              laplacian_kwds = {}
          if self.geom_.laplacian_method is not None:
              laplacian_method = self.geom_.laplacian_method
          else:
              self.laplacian_method = 'auto'
          total_laplacian_matrix = compute_laplacian_matrix(total_affinity_matrix, laplacian_method,
                                                         **laplacian_kwds)
          # Take the columns of Laplacian and existing embedding and pass to Nystrom Extension
          (n_sample_train) = self.geom_.adjacency_matrix.shape[0]
          total_laplacian_matrix = total_laplacian_matrix.tocsr()
          C = total_laplacian_matrix[:, :n_sample_train]
          # warnings.warn(str(C.shape))
          eigenvalues, eigenvectors = nystrom_extension(C, self.eigenvectors_, self.eigenvalues_)
          # If diffusion maps compute diffusion time etc
          if self.diffusion_maps:
              embedding = compute_diffusion_maps(laplacian_method, eigenvectors, eigenvalues, self.diffusion_time)
          else:
              embedding = eigenvectors
          (n_sample_test) = X_test.shape[0]
          embedding_test=embedding[-n_sample_test:, :]
          return embedding_test, embedding