def dfs_loop_search(self, root):
        """Main algorithm to look for loop.
        It tags nodes and find ones stuck in loop.

        * Init all nodes with DFS_UNCHECKED value
        * DFS_TEMPORARY_CHECKED means we found it once
        * DFS_OK : this node (and all sons) are fine
        * DFS_NEAR_LOOP : One problem was found in of of the son
        * DFS_LOOP_INSIDE : This node is part of a loop

        :param root: Root of the dependency tree
        :type root:
        :return: None
        """
        # Make the root temporary checked
        self.nodes[root]['dfs_loop_status'] = 'DFS_TEMPORARY_CHECKED'

        # We are scanning the sons
        for child in self.nodes[root]["sons"]:
            child_status = self.nodes[child]['dfs_loop_status']
            # If a child is not checked, check it
            if child_status == 'DFS_UNCHECKED':
                self.dfs_loop_search(child)
                child_status = self.nodes[child]['dfs_loop_status']

            # If a child has already been temporary checked, it's a problem,
            # loop inside, and its a checked status
            if child_status == 'DFS_TEMPORARY_CHECKED':
                self.nodes[child]['dfs_loop_status'] = 'DFS_LOOP_INSIDE'
                self.nodes[root]['dfs_loop_status'] = 'DFS_LOOP_INSIDE'

            # If a child has already been temporary checked, it's a problem, loop inside
            if child_status in ('DFS_NEAR_LOOP', 'DFS_LOOP_INSIDE'):
                # if a node is known to be part of a loop, do not let it be less
                if self.nodes[root]['dfs_loop_status'] != 'DFS_LOOP_INSIDE':
                    self.nodes[root]['dfs_loop_status'] = 'DFS_NEAR_LOOP'
                # We've already seen this child, it's a problem
                self.nodes[child]['dfs_loop_status'] = 'DFS_LOOP_INSIDE'

        # If root have been modified, do not set it OK
        # A node is OK if and only if all of its children are OK
        # if it does not have a child, goes ok
        if self.nodes[root]['dfs_loop_status'] == 'DFS_TEMPORARY_CHECKED':
            self.nodes[root]['dfs_loop_status'] = 'DFS_OK'
Main algorithm to look for loop.
        It tags nodes and find ones stuck in loop.

        * Init all nodes with DFS_UNCHECKED value
        * DFS_TEMPORARY_CHECKED means we found it once
        * DFS_OK : this node (and all sons) are fine
        * DFS_NEAR_LOOP : One problem was found in of of the son
        * DFS_LOOP_INSIDE : This node is part of a loop

        :param root: Root of the dependency tree
        :type root:
        :return: None