parameters: (self, node, op, depth=10)
return_statement: return None
docstring: Starting from the given node, finds a node lower in the graph matching the given operation name. 
      This is not an exhaustive graph search.
      In order to graph search bfs is used, so runtime complexity is O(V+E).
      :param self: The gs.Graph object being extended.
      :param node: The node to start searching from.
      :param op: The operation name to search for.
      :param depth: Stop searching after traversing these many nodes.
      :return: The first descendant node matching that performs that op.
docstring_summary: Starting from the given node, finds a node lower in the graph matching the given operation name. 
      This is not an exhaustive graph search.
      In order to graph search bfs is used, so runtime complexity is O(V+E).
      :param self: The gs.Graph object being extended.
      :param node: The node to start searching from.
      :param op: The operation name to search for.
      :param depth: Stop searching after traversing these many nodes.
      :return: The first descendant node matching that performs that op.
docstring_tokens: Starting from the given node finds a node lower in the graph matching the given operation name . This is not an exhaustive graph search . In order to graph search bfs is used so runtime complexity is O ( V + E ) . : param self : The gs . Graph object being extended . : param node : The node to start searching from . : param op : The operation name to search for . : param depth : Stop searching after traversing these many nodes . : return : The first descendant node matching that performs that op .
function: def find_descendant_by_op(self, node, op, depth=10):
      """
      Starting from the given node, finds a node lower in the graph matching the given operation name. 
      This is not an exhaustive graph search.
      In order to graph search bfs is used, so runtime complexity is O(V+E).
      :param self: The gs.Graph object being extended.
      :param node: The node to start searching from.
      :param op: The operation name to search for.
      :param depth: Stop searching after traversing these many nodes.
      :return: The first descendant node matching that performs that op.
      """
      queue = []
      for i in range(depth):
          queue.append(node.o())
          while queue:
              node = queue.pop(0)
              if node.op == op:
                  return node
              for child in node.outputs[0].outputs:
                  queue.append(child)
      return None
function_tokens: def find_descendant_by_op ( self , node , op , depth = 10 ) : queue = [ ] for i in range ( depth ) : queue . append ( node . o ( ) ) while queue : node = queue . pop ( 0 ) if node . op == op : return node for child in node . outputs [ 0 ] . outputs : queue . append ( child ) return None