docs: def get_cardinality(self, node=None):
          """
          Returns the cardinality of the node
  
          Parameters
          ----------
          node: any hashable python object (optional)
              The node whose cardinality we want. If node is not specified returns a
              dictionary with the given variable as keys and their respective cardinality
              as values.
  
          Returns
          -------
          int or dict : If node is specified returns the cardinality of the node.
                        If node is not specified returns a dictionary with the given
                        variable as keys and their respective cardinality as values.
  
  
          Examples
          --------
          >>> from pgmpy.models import ClusterGraph
          >>> from pgmpy.factors.discrete import DiscreteFactor
          >>> student = ClusterGraph()
          >>> factor = DiscreteFactor(['Alice', 'Bob'], cardinality=[2, 2],
          ...                 values=np.random.rand(4))
          >>> student.add_node(('Alice', 'Bob'))
          >>> student.add_factors(factor)
          >>> student.get_cardinality()
          defaultdict(<class 'int'>, {'Bob': 2, 'Alice': 2})
  
          >>> student.get_cardinality(node='Alice')
          2
          """
          if node:
              for factor in self.factors:
                  for variable, cardinality in zip(factor.scope(), factor.cardinality):
                      if node == variable:
                          return cardinality
  
          else:
              cardinalities = defaultdict(int)
              for factor in self.factors:
                  for variable, cardinality in zip(factor.scope(), factor.cardinality):
                      cardinalities[variable] = cardinality
              return cardinalities