code: def predict_proba(self, L):
          
          # First, get the estimated probability distribution over the feasible
          # set defined by the TaskGraph
          # This is an [n,k] array, where k = |(feasible set)|
          Y_pf = LabelModel.predict_proba(self, L)
          n, k = Y_pf.shape
  
          # Now get the per-task marginals
          # TODO: Make this optional, versus just returning the above
          Y_p = [np.zeros((n, k_t)) for k_t in self.task_graph.K]
          for yi, y in enumerate(self.task_graph.feasible_set()):
              for t in range(self.t):
                  k_t = int(y[t])
                  Y_p[t][:, k_t - 1] += Y_pf[:, yi]
          return Y_p
docs: Returns the task marginals estimated by the model: a t-length list of
          [n,k_t] matrices where the (i,j) entry of the sth matrix represents the
          estimated P((Y_i)_s | \lambda_j(x_i))
  
          Args:
              L: A t-length list of [n,m] scipy.sparse label matrices with values
                  in {0,1,...,k}