nodeCondMutualInfo :: (Floating prob, Ord prob, Ord a)
                      => [String]
                      -> [String]
                      -> [String]
                      -> ModelDistribution prob a
                      -> prob
nodeCondMutualInfo yv xv zv m =
  let p_xgz = extractC $ conditionalize xv zv m
      p_xgyz = \(y,z) -> (extractC $ conditionalize xv (yv++zv) m) $ y ++ z
      p_z = extract $ marginalize zv m
      p_ygz = extractC $ conditionalize yv zv m
  in condMutualInfo p_xgz p_xgyz p_z (p_ygz -|- p_z)
nodeCondMutualInfo :: (Floating prob, Ord prob, Ord a)
                      => [String]
                      -> [String]
                      -> [String]
                      -> ModelDistribution prob a
                      -> prob
nodeCondMutualInfo yv xv zv m =
  let p_xgz = extractC $ conditionalize xv zv m
      p_xgyz = \(y,z) -> (extractC $ conditionalize xv (yv++zv) m) $ y ++ z
      p_z = extract $ marginalize zv m
      p_ygz = extractC $ conditionalize yv zv m
  in condMutualInfo p_xgz p_xgyz p_z (p_ygz -|- p_z)
nodeCondMutualInfo yv xv zv m =
  let p_xgz = extractC $ conditionalize xv zv m
      p_xgyz = \(y,z) -> (extractC $ conditionalize xv (yv++zv) m) $ y ++ z
      p_z = extract $ marginalize zv m
      p_ygz = extractC $ conditionalize yv zv m
  in condMutualInfo p_xgz p_xgyz p_z (p_ygz -|- p_z)