def get_next_step(self, available_names, done_insns): from pytools import all, argmax2 available_insns = [(insn, insn.priority) for insn in self.instructions if insn not in done_insns and all( dep.name in available_names for dep in insn.get_dependencies())] if not available_insns: raise self.NoInstructionAvailable from pytools import flatten discardable_vars = set(available_names) - set( flatten([dep.name for dep in insn.get_dependencies()] for insn in self.instructions if insn not in done_insns)) # {{{ make sure results do not get discarded dm = mappers.DependencyMapper(composite_leaves=False) def remove_result_variable(result_expr): # The extra dependency mapper run is necessary # because, for instance, subscripts can make it # into the result expression, which then does # not consist of just variables. for var in dm(result_expr): assert isinstance(var, Variable) discardable_vars.discard(var.name) obj_array_vectorize(remove_result_variable, self.result) # }}} return argmax2(available_insns), discardable_vars
def _make_dep_mapper(include_subscripts): return mappers.DependencyMapper( include_operator_bindings=False, include_subscripts=include_subscripts, include_calls="descend_args")