code: def copy(self, extra=None):
          
          if extra is None:
              extra = dict()
          newTVS = Params.copy(self, extra)
          if self.isSet(self.estimator):
              newTVS.setEstimator(self.getEstimator().copy(extra))
          # estimatorParamMaps remain the same
          if self.isSet(self.evaluator):
              newTVS.setEvaluator(self.getEvaluator().copy(extra))
          return newTVS
docs: Creates a copy of this instance with a randomly generated uid
          and some extra params. This copies creates a deep copy of
          the embedded paramMap, and copies the embedded and extra parameters over.
  
          :param extra: Extra parameters to copy to the new instance
          :return: Copy of this instance