def count_banned_value_observations(banned_values, root_expr, bindings): f = make_banned_value_counter(banned_values, bindings) count = [0] def g(prob_expr): count[0] += f(prob_expr[2]) E.filter_walk(E.is_prob, g, root_expr) return count[0]
def get_variable_order(root_expr): touched = set() order = [] def f(v): if v not in touched: touched.add(v) order.append(unpack_v(v)) return v # abuse of map - ignore result, just use it to walk tree filter_walk(is_v, f, root_expr) return order
def banned_value_counter(exprs): count = [0] f = make_counter(count) for expr in exprs: E.filter_walk(p, f, expr) return count[0]
def count_dos(expr): count = [0] f = make_counter(count) E.filter_walk(E.is_do, f, expr) return count[0]