Calculate probability of cells jointly taking values given a
        latent state.

        :param Y: A list of constraints to apply when querying.  Each constraint
            is a triplet of (r,d,v): r is the row index, d is the column
            index and v is the value of the constraint
        :type Y: list of lists
        :param Q: A list of values to query.  Each value is triplet of (r,d,v):
            r is the row index, d is the column index, and v is the value at
            which the density is evaluated.
        :type Q: list of lists

        :returns: float -- joint log probabilities of the values specified by Q

def predictive_probability_multistate(self, M_c, X_L_list, X_D_list, Y, Q):
        """Calculate probability of cells jointly taking values given a
        latent state.

        :param Y: A list of constraints to apply when querying.  Each constraint
            is a triplet of (r,d,v): r is the row index, d is the column
            index and v is the value of the constraint
        :type Y: list of lists
        :param Q: A list of values to query.  Each value is triplet of (r,d,v):
            r is the row index, d is the column index, and v is the value at
            which the density is evaluated.
        :type Q: list of lists

        :returns: float -- joint log probabilities of the values specified by Q
        """
        return su.predictive_probability_multistate(
            M_c, X_L_list, X_D_list, Y, Q)