def copy_subtree(self, source_node, dest_node):  
if self._validate_node_name(source_node):<EOL><INDENT>raise RuntimeError("<STR_LIT>")<EOL><DEDENT>if self._validate_node_name(dest_node):<EOL><INDENT>raise RuntimeError("<STR_LIT>")<EOL><DEDENT>if source_node not in self._db:<EOL><INDENT>raise RuntimeError("<STR_LIT>".format(source_node))<EOL><DEDENT>if not dest_node.startswith(self.root_name + self._node_separator):<EOL><INDENT>raise RuntimeError("<STR_LIT>")<EOL><DEDENT>for node in self._get_subtree(source_node):<EOL><INDENT>self._db[node.replace(source_node, dest_node, <NUM_LIT:1>)] = {<EOL>"<STR_LIT>": self._db[node]["<STR_LIT>"].replace(source_node, dest_node, <NUM_LIT:1>),<EOL>"<STR_LIT>": [<EOL>child.replace(source_node, dest_node, <NUM_LIT:1>)<EOL>for child in self._db[node]["<STR_LIT>"]<EOL>],<EOL>"<STR_LIT:data>": copy.deepcopy(self._db[node]["<STR_LIT:data>"]),<EOL>}<EOL><DEDENT>self._create_intermediate_nodes(dest_node)<EOL>parent = self._node_separator.join(dest_node.split(self._node_separator)[:-<NUM_LIT:1>])<EOL>self._db[dest_node]["<STR_LIT>"] = parent<EOL>self._db[parent]["<STR_LIT>"] = sorted(<EOL>self._db[parent]["<STR_LIT>"] + [dest_node]<EOL>)<EOL>
r"""
        Copy a sub-tree from one sub-node to another.

        Data is added if some nodes of the source sub-tree exist in the
        destination sub-tree

        :param source_name: Root node of the sub-tree to copy from
        :type  source_name: :ref:`NodeName`

        :param dest_name: Root node of the sub-tree to copy to
        :type  dest_name: :ref:`NodeName`

        :raises:
         * RuntimeError (Argument \`dest_node\` is not valid)

         * RuntimeError (Argument \`source_node\` is not valid)

         * RuntimeError (Illegal root in destination node)

         * RuntimeError (Node *[source_node]* not in tree)

        Using the same example tree created in
        :py:meth:`ptrie.Trie.add_nodes`::

            >>> from __future__ import print_function
            >>> import docs.support.ptrie_example
            >>> tobj = docs.support.ptrie_example.create_tree()
            >>> print(tobj)
            root
            ├branch1 (*)
            │├leaf1
            ││└subleaf1 (*)
            │└leaf2 (*)
            │ └subleaf2
            └branch2
            >>> tobj.copy_subtree('root.branch1', 'root.branch3')
            >>> print(tobj)
            root
            ├branch1 (*)
            │├leaf1
            ││└subleaf1 (*)
            │└leaf2 (*)
            │ └subleaf2
            ├branch2
            └branch3 (*)
             ├leaf1
             │└subleaf1 (*)
             └leaf2 (*)
              └subleaf2