class_docstr: LayerFunc for GRUCell
      
class_docstr_tok: ["LayerFunc","for","GRUCell"]
code: def __deepcopy__(self, memo):
      cls = self.__class__
      ## __new__ won't init the class, we need to do that ourselves
      copied = cls.__new__(cls)
      ## record in the memo that self has been copied to avoid recursive copying
      memo[id(self)] = copied
  
      ## first copy all content
      for k, v in six.iteritems(self.__dict__):
          setattr(copied, k, deepcopy(v, memo))
  
      ## then we need to create new para names for param_attr in self.attr_holder
      self.param_prefix = None
      self.bias_prefix = None
  
      def create_new_para_name(attr):
          if attr:
              assert attr.name, "attr should have a name already!"
              name_key = "PARL_target_" + attr.name
              if "_gate" in name_key and "param" in name_key:
                  if self.param_prefix is not None:
                      name_key = self.param_prefix
                  else:
                      name_key = name_key.replace("_gate", "")
                      name_key = unique_name.generate(name_key)
                      self.param_prefix = name_key
                  name_key += "_gate"
              elif "_gate" in name_key and "bias" in name_key:
                  if self.bias_prefix is not None:
                      name_key = self.bias_prefix
                  else:
                      name_key = name_key.replace("_gate", "")
                      name_key = unique_name.generate(name_key)
                      self.bias_prefix = name_key
                  name_key += "_gate"
              elif "_candidate" in name_key and "param" in name_key:
                  if self.param_prefix is not None:
                      name_key = self.param_prefix
                  else:
                      name_key = name_key.replace("_candidate", "")
                      name_key = unique_name.generate(name_key)
                      self.param_prefix = name_key
                  name_key += "_candidate"
              elif "_candidate" in name_key and "bias" in name_key:
                  if self.bias_prefix is not None:
                      name_key = self.bias_prefix
                  else:
                      name_key = name_key.replace("_candidate", "")
                      name_key = unique_name.generate(name_key)
                      self.bias_prefix = name_key
                  name_key += "_candidate"
              else:
                  name_key = unique_name.generate(name_key)
              attr.name = name_key
  
      for attr in copied.attr_holder.tolist():
          create_new_para_name(attr)
  
      ## We require the user to sync the parameter values later, because
      ## this deepcopy is supposed to be called only before the startup
      ## program. This function will cause the computation graph change, so
      ## it cannot be called during the execution.
      return copied
  
imports: import inspect
  import paddle.fluid.layers
  import paddle.fluid.unique_name
  import paddle.fluid
  import six
  from copy import deepcopy
  from paddle.fluid.executor import _fetch_var
  from paddle.fluid.framework import Variable
  from paddle.fluid.layers import *
  from paddle.fluid.param_attr import ParamAttr
  from parl.core.fluid.layers.attr_holder import AttrHolder
  from parl.utils import get_fluid_version
label_desc: Use image node_id 2 for calling the GRULayerFunc obj's underlying member method code with example usage: obj.__deepcopy__(memo) and returns: copied