class_docstr: Class for representing Junction Tree.
  
  Junction tree is undirected graph where each node represents a clique
  (list, tuple or set of nodes) and edges represent sepset between two cliques.
  Each sepset in G separates the variables strictly on one side of edge to
  other.
  
  Parameters
  ----------
  data: input graph
      Data to initialize graph. If data=None (default) an empty graph is
      created. The data is an edge list.
  
  Examples
  --------
  Create an empty JunctionTree with no nodes and no edges
  
  >>> from pgmpy.models import JunctionTree
  >>> G = JunctionTree()
  
  G can be grown by adding clique nodes.
  
  **Nodes:**
  
  Add a tuple (or list or set) of nodes as single clique node.
  
  >>> G.add_node(('a', 'b', 'c'))
  >>> G.add_nodes_from([('a', 'b'), ('a', 'b', 'c')])
  
  **Edges:**
  
  G can also be grown by adding edges.
  
  >>> G.add_edge(('a', 'b', 'c'), ('a', 'b'))
  
  or a list of edges
  
  >>> G.add_edges_from([(('a', 'b', 'c'), ('a', 'b')),
  ...                   (('a', 'b', 'c'), ('a', 'c'))])
docstr: Returns a dictionary mapping each node to its list of possible states.
  
  Returns
  -------
  state_dict: dict
      Dictionary of nodes to possible states
code: def states(self):
      """
      Returns a dictionary mapping each node to its list of possible states.
  
      Returns
      -------
      state_dict: dict
          Dictionary of nodes to possible states
      """
      state_names_list = [phi.state_names for phi in self.factors]
      state_dict = {
          node: states
          for d in state_names_list
          for node, states in d.items()
      }
      return state_dict
  
file_path: pgmpy/pgmpy/models/JunctionTree.py
imports: import networkx
  from pgmpy.models import ClusterGraph
label_desc: Use image node_id 3 for calling the JunctionTree obj's underlying member method code with example usage: obj.states() and returns: state_dict