class_docstr: Class for representing PDAGs (also known as CPDAG). PDAGs are the equivalence classes of
  DAGs and contain both directed and undirected edges.
  
  Note: In this class, undirected edges are represented using two edges in both direction i.e.
  an undirected edge between X - Y is represented using X -> Y and X <- Y.
class_docstr_tok: ["Class","for","representing","PDAGs","(","also","known","as","CPDAG",")",".","PDAGs","are","the","equivalence","classes","of","DAGs","and","contain","both","directed","and","undirected","edges",".","Note",":","In","this","class",",","undirected","edges","are","represented","using","two","edges","in","both","direction","i.e",".","an","undirected","edge","between","X","-","Y","is","represented","using","X","-",">","Y","and","X","<","-","Y","."]
docstr: Returns a copy of the object instance.
  
  Returns
  -------
  Copy of PDAG: pgmpy.dag.PDAG
      Returns a copy of self.
docstr_tok: ["Returns","a","copy","of","the","object","instance",".","Returns","--","--","--","-","Copy","of","PDAG",":","pgmpy.dag.PDAG","Returns","a","copy","of","self","."]
code: def copy(self):
      """
      Returns a copy of the object instance.
  
      Returns
      -------
      Copy of PDAG: pgmpy.dag.PDAG
          Returns a copy of self.
      """
      return PDAG(
          directed_ebunch=list(self.directed_edges.copy()),
          undirected_ebunch=list(self.undirected_edges.copy()),
          latents=self.latents,
      )
  
imports: import itertools
  import networkx
  import numpy
  from pgmpy.base import UndirectedGraph
  from pgmpy.global_vars import logger
  from pgmpy.independencies import Independencies
label_desc: Use image node_id 2 for calling the PDAG obj's underlying member method code with example usage: obj.copy() and returns: PDAG