code: def enumerate_all(vars, e, bn):
      
      if not vars:
          return 1.0
      Y, rest = vars[0], vars[1:]
      Ynode = bn.variable_node(Y)
      if Y in e:
          return Ynode.p(e[Y], e) * enumerate_all(rest, e, bn)
      else:
          return sum(Ynode.p(y, e) * enumerate_all(rest, extend(e, Y, y), bn)
                     for y in bn.variable_values(Y))
docs: Return the sum of those entries in P(vars | e{others})
      consistent with e, where P is the joint distribution represented
      by bn, and e{others} means e restricted to bn's other variables
      (the ones other than vars). Parents must precede children in vars.