A rel annotation file contains edge (rel)
        attributes. It is e.g. used to annotate the type of a dependency
        relation (subj, obj etc.).

        See also: __gen_hierarchy_file()

def __gen_rel_anno_file(self, top_level_layer):
        """
        A rel annotation file contains edge (rel)
        attributes. It is e.g. used to annotate the type of a dependency
        relation (subj, obj etc.).

        See also: __gen_hierarchy_file()
        """
        paula_id = '{0}.{1}.{2}_{3}_rel'.format(top_level_layer, self.corpus_name,
                                            self.name, top_level_layer)
        E, tree = gen_paula_etree(paula_id)

        dominance_edges = select_edges_by(
            self.dg, layer=top_level_layer,
            edge_type=EdgeTypes.dominance_relation, data=True)
        dominance_dict = defaultdict(lambda: defaultdict(str))
        for source_id, target_id, edge_attrs in dominance_edges:
            if source_id != top_level_layer+':root_node':
                dominance_dict[source_id][target_id] = edge_attrs

        base_paula_id = self.paulamap['hierarchy'][top_level_layer]
        mflist = E('multiFeatList',
                   {XMLBASE: base_paula_id+'.xml'})
        for source_id in dominance_dict:
            for target_id in dominance_dict[source_id]:
                rel_href = '#rel_{0}_{1}'.format(source_id, target_id)
                mfeat = E('multiFeat',
                          {XLINKHREF: rel_href})
                edge_attrs = dominance_dict[source_id][target_id]
                for edge_attr in edge_attrs:
                    if edge_attr not in IGNORED_EDGE_ATTRIBS:
                        mfeat.append(E('feat',
                                       {'name': edge_attr,
                                        'value': edge_attrs[edge_attr]}))

                if self.human_readable:  # adds edge label as a <!--comment-->
                    source_label = self.dg.node[source_id].get('label')
                    target_label = self.dg.node[target_id].get('label')
                    mfeat.append(Comment(u'{0} - {1}'.format(source_label,
                                                           target_label)))
                mflist.append(mfeat)

        tree.append(mflist)
        self.files[paula_id] = tree
        self.file2dtd[paula_id] = PaulaDTDs.multifeat
        return paula_id