docs: def set_params(self, **params):
          """Set parameters on this object
  
          Safe setter method - attributes should not be modified directly as some
          changes are not valid.
          Valid parameters:
          - n_jobs
          - random_state
          - verbose
          Invalid parameters: (these would require modifying the kernel matrix)
          - knn
          - adaptive_k
          - decay
          - distance
          - thresh
          - beta
  
          Parameters
          ----------
          params : key-value pairs of parameter name and new values
  
          Returns
          -------
          self
          """
          # mnn specific arguments
          if 'beta' in params and params['beta'] != self.beta:
              raise ValueError("Cannot update beta. Please create a new graph")
  
          # knn arguments
          knn_kernel_args = ['knn', 'decay', 'distance', 'thresh', 'bandwidth']
          knn_other_args = ['n_jobs', 'random_state', 'verbose']
          for arg in knn_kernel_args:
              if arg in params and params[arg] != getattr(self, arg):
                  raise ValueError("Cannot update {}. "
                                   "Please create a new graph".format(arg))
          for arg in knn_other_args:
              if arg in params:
                  self.__setattr__(arg, params[arg])
                  for g in self.subgraphs:
                      g.set_params(**{arg: params[arg]})
  
          # update superclass parameters
          super().set_params(**params)
          return self