Add an edge (dependency) between the specified nodes.

        Args:
            ind_node (str): The independent node to add an edge to.
            dep_node (str): The dependent node that has a dependency on the
                            ind_node.

        Raises:
            KeyError: Either the ind_node, or dep_node do not exist.
            DAGValidationError: Raised if the resulting graph is invalid.

def add_edge(self, ind_node, dep_node):
        """ Add an edge (dependency) between the specified nodes.

        Args:
            ind_node (str): The independent node to add an edge to.
            dep_node (str): The dependent node that has a dependency on the
                            ind_node.

        Raises:
            KeyError: Either the ind_node, or dep_node do not exist.
            DAGValidationError: Raised if the resulting graph is invalid.
        """
        graph = self.graph
        if ind_node not in graph:
            raise KeyError('independent node %s does not exist' % ind_node)
        if dep_node not in graph:
            raise KeyError('dependent node %s does not exist' % dep_node)
        test_graph = deepcopy(graph)
        test_graph[ind_node].add(dep_node)
        test_dag = DAG()
        test_dag.graph = test_graph
        is_valid, message = test_dag.validate()
        if is_valid:
            graph[ind_node].add(dep_node)
        else:
            raise DAGValidationError(message)