code: def transform(self, X):
          
          iclustup = []
          dims = self.n_components
          if hasattr(self, 'isort1'):
              if X.shape[1] == self.v.shape[0]:
                  # reduce dimensionality of X
                  X = X @ self.v
                  nclust = self.n_X
                  AtS = self.A.T @ self.S
                  vnorm   = np.sum(self.S * (self.A @ AtS), axis=0)[np.newaxis,:]
                  cv      = X @ AtS
                  cmap    = np.maximum(0., cv)**2 / vnorm
                  iclustup, cmax = upsample(np.sqrt(cmap), dims, nclust, 10)
              else:
                  print('ERROR: new points do not have as many features as original data')
          else:
              print('ERROR: need to fit model first before you can embed new points')
          if iclustup.ndim > 1:
              iclustup = iclustup.T
          else:
              iclustup = iclustup.flatten()
          return iclustup
docs: if already fit, can add new points and see where they fall