def METHOD_NAME(self, source_rule, rules_by_origin=None):
    "Returns all init_ptrs accessible by rule (recursive)"
    if rules_by_origin is None:
        rules_by_origin = self.rules_by_origin
    init_ptrs = set()
    def _expand_rule(rule):
        assert not rule.is_term, rule
        for r in rules_by_origin[rule]:
            init_ptr = RulePtr(r, 0)
            init_ptrs.add(init_ptr)
            if r.expansion: # if not empty rule
                new_r = init_ptr.next
                if not new_r.is_term:
                    yield new_r
    for _ in bfs([source_rule], _expand_rule):
        pass
    return fzset(init_ptrs)