in tensorwatch/model_graph/hiddenlayer/summary_graph.py [0:0]
def predecessors_f(self, node_name, predecessors_types, done_list=None, logging=None, denorm_names=True):
"""Returns a list of <op>'s predecessors, if they match the <predecessors_types> criteria.
"""
node_name = distiller.normalize_module_name(node_name)
node = self.find_op(node_name)
node_is_an_op = True
if node is None:
node_is_an_op = False
node = self.find_param(node_name)
if node is None:
msglogger.warning("predecessors_f: Could not find node {}".format(node_name))
return []
if done_list is None:
done_list = []
done_list.append(node_name)
if not isinstance(predecessors_types, list):
predecessors_types = [predecessors_types]
if node_is_an_op:
# We check if we found the type of node we're looking for,
# and that this is not the first node in our search.
if node['type'] in predecessors_types and len(done_list) > 1:
return [distiller.denormalize_module_name(self._src_model, node_name) if denorm_names else node_name]
# This is an operation node
preds = [edge.src for edge in self.edges if (edge.dst == node_name and
edge.src not in done_list)]
else:
# This is a data node
preds = [edge.src for edge in self.edges if (edge.dst == node_name and
edge.src not in done_list)]
ret = []
for predecessor in preds:
ret += self.predecessors_f(predecessor, predecessors_types, done_list, logging, denorm_names)
return ret