docstr: Parametric UMAP subclassing UMAP-learn, based on keras/tensorflow.
  There is also a non-parametric implementation contained within to compare
  with the base non-parametric implementation.
  
  Parameters
  ----------
  optimizer : tf.keras.optimizers, optional
      The tensorflow optimizer used for embedding, by default None
  batch_size : int, optional
      size of batch used for batch training, by default None
  dims :  tuple, optional
      dimensionality of data, if not flat (e.g. (32x32x3 images for ConvNet), by default None
  encoder : tf.keras.Sequential, optional
      The encoder Keras network
  decoder : tf.keras.Sequential, optional
      the decoder Keras network
  parametric_embedding : bool, optional
      Whether the embedder is parametric or non-parametric, by default True
  parametric_reconstruction : bool, optional
      Whether the decoder is parametric or non-parametric, by default False
  parametric_reconstruction_loss_fcn : bool, optional
      What loss function to use for parametric reconstruction, by default tf.keras.losses.BinaryCrossentropy
  parametric_reconstruction_loss_weight : float, optional
      How to weight the parametric reconstruction loss relative to umap loss, by default 1.0
  autoencoder_loss : bool, optional
      [description], by default False
  reconstruction_validation : array, optional
      validation X data for reconstruction loss, by default None
  loss_report_frequency : int, optional
      how many times per epoch to report loss, by default 1
  n_training_epochs : int, optional
      number of epochs to train for, by default 1
  global_correlation_loss_weight : float, optional
      Whether to additionally train on correlation of global pairwise relationships (>0), by default 0
  run_eagerly : bool, optional
      Whether to run tensorflow eagerly
  keras_fit_kwargs : dict, optional
      additional arguments for model.fit (like callbacks), by default {}
docstr_tok: ["Parametric","UMAP","subclassing","UMAP-learn",",","based","on","keras\/tensorflow",".","There","is","also","a","non-parametric","implementation","contained","within","to","compare","with","the","base","non-parametric","implementation",".","Parameters","--","--","--","--","--","optimizer",":","tf.keras.optimizers",",","optional","The","tensorflow","optimizer","used","for","embedding",",","by","default","None","batch_size",":","int",",","optional","size","of","batch","used","for","batch","training",",","by","default","None","dims",":","tuple",",","optional","dimensionality","of","data",",","if","not","flat","(","e.g",".","(","32x32x3","images","for","ConvNet",")",",","by","default","None","encoder",":","tf.keras.Sequential",",","optional","The","encoder","Keras","network","decoder",":","tf.keras.Sequential",",","optional","the","decoder","Keras","network","parametric_embedding",":","bool",",","optional","Whether","the","embedder","is","parametric","or","non-parametric",",","by","default","True","parametric_reconstruction",":","bool",",","optional","Whether","the","decoder","is","parametric","or","non-parametric",",","by","default","False","parametric_reconstruction_loss_fcn",":","bool",",","optional","What","loss","function","to","use","for","parametric","reconstruction",",","by","default","tf.keras.losses.BinaryCrossentropy","parametric_reconstruction_loss_weight",":","float",",","optional","How","to","weight","the","parametric","reconstruction","loss","relative","to","umap","loss",",","by","default","1.0","autoencoder_loss",":","bool",",","optional","[","description","]",",","by","default","False","reconstruction_validation",":","array",",","optional","validation","X","data","for","reconstruction","loss",",","by","default","None","loss_report_frequency",":","int",",","optional","how","many","times","per","epoch","to","report","loss",",","by","default","1","n_training_epochs",":","int",",","optional","number","of","epochs","to","train","for",",","by","default","1","global_correlation_loss_weight",":","float",",","optional","Whether","to","additionally","train","on","correlation","of","global","pairwise","relationships","(",">","0",")",",","by","default","0","run_eagerly",":","bool",",","optional","Whether","to","run","tensorflow","eagerly","keras_fit_kwargs",":","dict",",","optional","additional","arguments","for","model.fit","(","like","callbacks",")",",","by","default","{","}"]
code: def __init__(
      self,
      optimizer=None,
      batch_size=None,
      dims=None,
      encoder=None,
      decoder=None,
      parametric_embedding=True,
      parametric_reconstruction=False,
      parametric_reconstruction_loss_fcn=tf.keras.losses.BinaryCrossentropy(
          from_logits=True
      ),
      parametric_reconstruction_loss_weight=1.0,
      autoencoder_loss=False,
      reconstruction_validation=None,
      loss_report_frequency=10,
      n_training_epochs=1,
      global_correlation_loss_weight=0,
      run_eagerly=False,
      keras_fit_kwargs={},
      **kwargs,
  ):
      """
      Parametric UMAP subclassing UMAP-learn, based on keras/tensorflow.
      There is also a non-parametric implementation contained within to compare
      with the base non-parametric implementation.
  
      Parameters
      ----------
      optimizer : tf.keras.optimizers, optional
          The tensorflow optimizer used for embedding, by default None
      batch_size : int, optional
          size of batch used for batch training, by default None
      dims :  tuple, optional
          dimensionality of data, if not flat (e.g. (32x32x3 images for ConvNet), by default None
      encoder : tf.keras.Sequential, optional
          The encoder Keras network
      decoder : tf.keras.Sequential, optional
          the decoder Keras network
      parametric_embedding : bool, optional
          Whether the embedder is parametric or non-parametric, by default True
      parametric_reconstruction : bool, optional
          Whether the decoder is parametric or non-parametric, by default False
      parametric_reconstruction_loss_fcn : bool, optional
          What loss function to use for parametric reconstruction, by default tf.keras.losses.BinaryCrossentropy
      parametric_reconstruction_loss_weight : float, optional
          How to weight the parametric reconstruction loss relative to umap loss, by default 1.0
      autoencoder_loss : bool, optional
          [description], by default False
      reconstruction_validation : array, optional
          validation X data for reconstruction loss, by default None
      loss_report_frequency : int, optional
          how many times per epoch to report loss, by default 1
      n_training_epochs : int, optional
          number of epochs to train for, by default 1
      global_correlation_loss_weight : float, optional
          Whether to additionally train on correlation of global pairwise relationships (>0), by default 0
      run_eagerly : bool, optional
          Whether to run tensorflow eagerly
      keras_fit_kwargs : dict, optional
          additional arguments for model.fit (like callbacks), by default {}
      """
      super().__init__(**kwargs)
  
      # add to network
      self.dims = (
          dims  # if this is an image, we should reshape for network
      )
      self.encoder = encoder  # neural network used for embedding
      self.decoder = decoder  # neural network used for decoding
      self.parametric_embedding = (
          parametric_embedding  # nonparametric vs parametric embedding
      )
      self.parametric_reconstruction = parametric_reconstruction
      self.parametric_reconstruction_loss_fcn = (
          parametric_reconstruction_loss_fcn
      )
      self.parametric_reconstruction_loss_weight = (
          parametric_reconstruction_loss_weight
      )
      self.run_eagerly = run_eagerly
      self.autoencoder_loss = autoencoder_loss
      self.batch_size = batch_size
      self.loss_report_frequency = loss_report_frequency  # how many times per epoch to report loss in keras
      if "tensorflow_probability" in sys.modules:
          self.global_correlation_loss_weight = (
              global_correlation_loss_weight
          )
      else:
          warn(
              "tensorflow_probability not installed or incompatible to current \
                  tensorflow installation. Setting global_correlation_loss_weight to zero."
          )
          self.global_correlation_loss_weight = 0
  
      self.reconstruction_validation = reconstruction_validation  # holdout data for reconstruction acc
      self.keras_fit_kwargs = (
          keras_fit_kwargs  # arguments for model.fit
      )
      self.parametric_model = None
  
      # how many epochs to train for (different than n_epochs which is specific to each sample)
      self.n_training_epochs = n_training_epochs
      # set optimizer
      if optimizer is None:
          if parametric_embedding:
              # Adam is better for parametric_embedding
              self.optimizer = tf.keras.optimizers.Adam(1e-3)
          else:
              # Larger learning rate can be used for embedding
              self.optimizer = tf.keras.optimizers.Adam(1e-1)
      else:
          self.optimizer = optimizer
      if parametric_reconstruction and not parametric_embedding:
          warn(
              "Parametric decoding is not implemented with nonparametric \
              embedding. Turning off parametric decoding"
          )
          self.parametric_reconstruction = False
  
      if self.encoder is not None:
          if encoder.outputs[0].shape[-1] != self.n_components:
              raise ValueError(
                  (
                      "Dimensionality of embedder network output ({}) does"
                      "not match n_components ({})".format(
                          encoder.outputs[0].shape[-1],
                          self.n_components,
                      )
                  )
              )
  
imports: import numpy
  from umap import UMAP
  from warnings import warn, catch_warnings, filterwarnings
  from numba import TypingError
  import os
  from umap.spectral import spectral_layout
  from sklearn.utils import check_random_state
  import codecs, pickle
  from sklearn.neighbors import KDTree
  import sys
label_desc: Use image node_id 1 to create a new ParametricUMAP object from inherited base classes: UMAP with example: obj = ParametricUMAP(optimizer, batch_size, dims, encoder, decoder, parametric_embedding, parametric_reconstruction, parametric_reconstruction_loss_fcn, parametric_reconstruction_loss_weight, autoencoder_loss, reconstruction_validation, loss_report_frequency, n_training_epochs, global_correlation_loss_weight, run_eagerly, keras_fit_kwargs)