class_docstr: Encapsulates the result of a match done by GraphMatcher.
  
  MatchResult contains a map from Pattern to the matching op and tensor.
  When the matching op has multiple output tensors, the matching tensor is the
  output tensor used by the matching op of the parent pattern. E.g., when we
  match graph
  
      -         +
     / \y0   y1/ \
    x    split    z
          |
          y         (nodes are ops; edges are going up)
  
  against add_pattern defined as
  
    y1_pattern = OpTypePattern('*')
    z_pattern = OpTypePattern('*')
    add_pattern = OpTypePattern('+', inputs=[y1_pattern, z_pattern])
  
  the matching op of `y1_pattern` is `split`, and the matching tensor of
  `y1_pattern`
  is `y1` not `y0`.
code: def add(self, pattern, op):
      self._pattern_to_op[pattern] = op
      if pattern.name is not None:
          if pattern.name in self._name_to_pattern:
              raise ValueError(
                  "Name %s is already bound to another pattern"
                  % pattern.name
              )
          self._name_to_pattern[pattern.name] = pattern
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import abc
  import itertools
  from mmdnn.conversion.common.DataStructure.graph import Graph
label_desc: Use image node_id 2 for calling the MatchResult obj's underlying member method code with example usage: obj.add(pattern, op) without return types