Private method which return the cartesian product of the states
        of the genes in the model. It represents all the possible state for a given model.

        Examples
        --------

        The model contains 2 genes: operon = {0, 1, 2}
                                    mucuB = {0, 1}
        Then this method returns ((0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1))
        For reach tuple, the first element is the state of the operon gene, and the
        second element stands for the state of the mucuB gene.

def _cartesian_product_of_every_states_of_each_genes(self) -> Tuple[Tuple[int, ...]]:
        """ 
        Private method which return the cartesian product of the states
        of the genes in the model. It represents all the possible state for a given model.

        Examples
        --------

        The model contains 2 genes: operon = {0, 1, 2}
                                    mucuB = {0, 1}
        Then this method returns ((0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1))
        For reach tuple, the first element is the state of the operon gene, and the
        second element stands for the state of the mucuB gene.
        """
        if not self.genes:
            return () 
        return tuple(product(*[gene.states for gene in self.genes]))