code: def prune_influence_map(self):
          im = self.get_im()
          logger.info('Removing self loops')
          edges_to_remove = []
          for e in im.edges():
              if e[0] == e[1]:
                  logger.info('Removing self loop: %s', e)
                  edges_to_remove.append((e[0], e[1]))
          im.remove_edges_from(edges_to_remove)
          remove_im_params(self.model, im)
          logger.info('Get successorts of each node')
          succ_dict = {}
          for node in im.nodes():
              succ_dict[node] = set(im.successors(node))
          logger.info('Compare combinations of successors')
          group_key_fun = lambda x: len(succ_dict[x])
          nodes_sorted = sorted(im.nodes(), key=group_key_fun)
          groups = itertools.groupby(nodes_sorted, key=group_key_fun)
          edges_to_remove = []
          for gix, group in groups:
              combos = itertools.combinations(group, 2)
              for ix, (p1, p2) in enumerate(combos):
                  if succ_dict[p1].difference(succ_dict[p2]) == set([p2]) and \
                     succ_dict[p2].difference(succ_dict[p1]) == set([p1]):
                      for u, v in ((p1, p2), (p2, p1)):
                          edges_to_remove.append((u, v))
                          logger.debug('Will remove edge (%s, %s)', u, v)
          logger.info('Removing %d edges from influence map' %
                      len(edges_to_remove))
          im.remove_edges_from(edges_to_remove)