merge rules:
        00 + 00 == 00    00 + 0B == 0B
        0A + 00 == 0A    0A + 0B == 0A
        A0 + 00 == A0    A0 + 0B == AB
        AA + 00 == AA    AA + 0B == AB

        00 + B0 == B0    00 + BB == BB
        0A + B0 == BA    0A + BB == BA
        A0 + B0 == A0    A0 + BB == AB
        AA + B0 == AA    AA + BB == AA

def merge(self, subordinate_graph):
        """
        merge rules:
        00 + 00 == 00    00 + 0B == 0B
        0A + 00 == 0A    0A + 0B == 0A
        A0 + 00 == A0    A0 + 0B == AB
        AA + 00 == AA    AA + 0B == AB

        00 + B0 == B0    00 + BB == BB
        0A + B0 == BA    0A + BB == BA
        A0 + B0 == A0    A0 + BB == AB
        AA + B0 == AA    AA + BB == AA
        """
        if not isinstance(subordinate_graph, Graph):
            raise Exception("Graph is expected to only merge with a Graph.")

        subordinate_nodes = subordinate_graph.get_nodes()

        merge_results = []
        for node_id in subordinate_nodes:
            node = subordinate_nodes[node_id]
            merge_results.append((
                node.get_id(),
                self.insert_node(node)
            ))

        # TODO perhaps throw exception if merge was unsuccessful
        return merge_results