예제 #1
0
    def abstract(self, graph):
        graph = edengraphtools._edge_to_vertex_transform(graph)
        tmpgraph = edengraphtools._revert_edge_to_vertex_transform(graph)
        abstract_graph = make_abstract(tmpgraph)
        _abstract_graph = edengraphtools._edge_to_vertex_transform(abstract_graph)

        for n, d in _abstract_graph.nodes(data=True):
            if 'contracted' not in d:
                d['contracted'] = set()

        getabstr = {contra: node for node, d in _abstract_graph.nodes(data=True) for contra in d.get('contracted', [])}

        for n, d in graph.nodes(data=True):
            if 'edge' in d:
                # if we have found an edge node...
                # lets see whos left and right of it:
                n1, n2 = graph.neighbors(n)
                # case1: ok those belong to the same gang so we most likely also belong there.
                if getabstr[n1] == getabstr[n2]:
                    _abstract_graph.node[getabstr[n1]]['contracted'].add(n)

                # case2: neighbors belong to different gangs...
                else:
                    blub = set(_abstract_graph.neighbors(getabstr[n1])) & set(_abstract_graph.neighbors(getabstr[n2]))
                    for blob in blub:
                        if 'contracted' in _abstract_graph.node[blob]:
                            _abstract_graph.node[blob]['contracted'].add(n)
                        else:
                            _abstract_graph.node[blob]['contracted'] = set([n])

        return _abstract_graph
예제 #2
0
def make_graphs_static(ngraphs=100,
                       graphsize=5,
                       node_labels=5,
                       edge_labels=5,
                       maxdeg=3,
                       labeldistribution='real',
                       nocycles=False):
    l = []
    seen = {}
    failcount = 0
    while len(l) < ngraphs:
        g = make_graph_strict(graphsize,
                              node_labels,
                              edge_labels,
                              maxdeg,
                              dist=labeldistribution,
                              allow_cycles=not nocycles)
        harsch = glcip.graph_hash(
            edeng._edge_to_vertex_transform(g.copy()),
            get_node_label=lambda id, node: hash(node['label']))
        if harsch not in seen:
            seen[harsch] = 1
            l.append(g)
            failcount = 0
        else:
            #gprint(g)
            failcount += 1
            assert failcount < 10, "failed 10 times in a row to generate an unseen rand graph, check your params"

    return l
예제 #3
0
    def abstract_graph(self, base_graph):
        '''
        we need to make an abstraction Ooo
        '''

        # create the abstract graph and populate the contracted set
        abstract_graph = rna_forgi.get_abstr_graph(base_graph.graph['structure'], max(base_graph.nodes()) + 1)# DOES NOT EXIST ANYMORE ignore_inserts=self.ignore_inserts)
        abstract_graph = _edge_to_vertex_transform(abstract_graph)
        completed_abstract_graph = rna_forgi.edge_parent_finder(abstract_graph, base_graph)

        # eden is forcing us to set a label and a contracted attribute.. lets do this
        for n, d in completed_abstract_graph.nodes(data=True):
            if 'edge' in d:
                d['label'] = 'e'
        # in the abstract graph , all the edge nodes need to have a contracted attribute.
        # originaly this happens naturally but since we make multiloops into one loop
        # there are some left out
        for n, d in completed_abstract_graph.nodes(data=True):
            if 'contracted' not in d:
                d['contracted'] = set()


        completed_abstract_graph.graph['original']=base_graph

        completed_abstract_graph.graph['mod_dict']={0:123, len(base_graph.graph['sequence'])-1:555}
        return completed_abstract_graph
예제 #4
0
 def postprocess_transformer_out(graph):
     # 1. the original graph needs to be directed
     ograph = _edge_to_vertex_transform(graph.graph['original'])
     graph.graph['original'] = rna.expanded_rna_graph_to_digraph(ograph)
     # 2. our convention is, that node ids are not overlapping ,, complying by optimistic renaming..
     graph = nx.convert_node_labels_to_integers(graph,first_label=1000)
     return graph
예제 #5
0
def ses_to_graph(ses):
    structure, energy, sequence = ses
    base_graph = eden_rna.sequence_dotbracket_to_graph(seq_info=sequence, seq_struct=structure)
    base_graph = _edge_to_vertex_transform(base_graph)
    base_graph = rna.expanded_rna_graph_to_digraph(base_graph)
    base_graph.graph['energy'] = energy
    base_graph.graph['sequence'] = sequence
    base_graph.graph['structure'] = structure
    return base_graph
예제 #6
0
    def transform(self, inputs):
        '''
        Parameters
        ----------
        inputs : list of things

        Returns
        -------
        graphwrapper : iterator
        '''
        return [_edge_to_vertex_transform(i) for i in inputs]
예제 #7
0
    def wrap(self, graph):
        """

        Parameters
        ----------
        graph: nx.graph

        Returns
        -------
        graphdecomposer
        """

        graph = edengraphtools._edge_to_vertex_transform(graph)
        return (graph,self.abstract(graph))
예제 #8
0
def make_abstract(graph):
    '''
    graph should be the same expanded graph that we will feed to extract_cips later...
    Parameters
    ----------
    graph


    Returns
    -------

    '''
    if isinstance(graph, nx.DiGraph):
        graph = graph.to_undirected()

    graph2 = edengraphtools._revert_edge_to_vertex_transform(graph)
    graph2 = edge_type_in_radius_abstraction(graph2)
    graph2 = edengraphtools._edge_to_vertex_transform(graph2)

    # find out to which abstract node the edges belong
    # finding out where the edge-nodes belong, because the contractor cant possibly do this
    getabstr = {contra: node for node, d in graph2.nodes(data=True) for contra in d.get('contracted', [])}

    for n, d in graph.nodes(data=True):
        if 'edge' in d:
            # if we have found an edge node...
            # lets see whos left and right of it:
            n1, n2 = graph.neighbors(n)
            # case1: ok those belong to the same gang so we most likely also belong there.
            if getabstr[n1] == getabstr[n2]:
                graph2.node[getabstr[n1]]['contracted'].add(n)

            # case2: neighbors belong to different gangs...
            else:
                blub = set(graph2.neighbors(getabstr[n1])) & set(graph2.neighbors(getabstr[n2]))
                for blob in blub:
                    if 'contracted' in graph2.node[blob]:
                        graph2.node[blob]['contracted'].add(n)
                    else:
                        graph2.node[blob]['contracted'] = set([n])
    return graph2
예제 #9
0
    def transform(self, sequences):
        """

        Parameters
        ----------
        sequences : iterable over rna sequences

        Returns
        -------
        list of RnaGraphWrappers
        """
        result = []
        for sequence in sequences:
            # get structure
            structure, energy, sequence = self.NNmodel.transform_single(sequence)
            # FIXING STRUCTURE
            structure, sequence = fix_structure(structure, sequence)
            if structure == None:
                result.append(None)
                continue
            # built base_graph
            base_graph = eden_rna.sequence_dotbracket_to_graph(seq_info=sequence, seq_struct=structure)

            base_graph = _edge_to_vertex_transform(base_graph)
            base_graph = expanded_rna_graph_to_digraph(base_graph)
            base_graph.graph['energy'] = energy
            base_graph.graph['sequence'] = sequence
            base_graph.graph['structure'] = structure
            if self.fold_only:
                result.append(base_graph)
            else:
                result.append(self.abstract_graph(base_graph))

            # result.append(
            #       (sequence, structure, base_graph, self.abstract_graph(base_graph))
            #)

        return result
예제 #10
0
    def _prepare_extraction(self):
        # somehow check that there are only 2 layers
        # oO

        # lets get started
        if '_base_graph' in self.__dict__:
            return

        self._base_graph= edengraphtools._edge_to_vertex_transform(self._unaltered_graph.graph['original'].copy())
        #self._base_graph= edengraphtools._edge_to_vertex_transform(self.get_layers()[-1].copy()) # does not work/// why?
        self._abstract_graph = edengraphtools._edge_to_vertex_transform(self._unaltered_graph.copy() )



        # now i want to add the edges of the base graph to the contracted set of the abstract :)


        # SOME TRNASFORMERS (EG RNA) want to do this themselfes also the code below is only for undirected graphs..
        # sososo
        if not self.calc_contracted_edge_nodes:
            #print 'mindecomp _prep_extraction.. skipping contracted buulding ... this should only be the case with rna'
            return


        def base_graph_neighbors(n):
            if type(self._base_graph) == nx.DiGraph:
                return set(self._base_graph.neighbors(n)+self._base_graph.predecessors(n))
            else:
                return self._base_graph.neighbors(n)


        #  make a dictionary that maps from base_graph_node -> node in contracted graph
        getabstr = {contra: node for node, d in self._abstract_graph.nodes(data=True) for contra in d.get('contracted', [])}
        # so this basically assigns edges in the base_graph to nodes in the abstract graph.
        for n, d in self._base_graph.nodes(data=True):
            if 'edge' in d:
                # if we have found an edge node...
                # lets see whos left and right of it:
                n1, n2 = base_graph_neighbors(n)
                # case1: ok those belong to the same gang so we most likely also belong there.

                try:
                    if getabstr[n1] == getabstr[n2]:
                        self._abstract_graph.node[getabstr[n1]]['contracted'].add(n)



                    # case2: neighbors belong to different gangs...
                    else:
                        blub = set(self._abstract_graph.neighbors(getabstr[n1])) & set(self._abstract_graph.neighbors(getabstr[n2]))
                        for blob in blub:
                            if 'contracted' in self._abstract_graph.node[blob]:
                                self._abstract_graph.node[blob]['contracted'].add(n)
                            else:
                                self._abstract_graph.node[blob]['contracted'] = set([n])

                except:
                    traceback.print_stack()
                    print "key error in minor decompose.py %d %d %d" % (n1,n2,n)
                    import structout as so
                    def pg(g):
                        for n,d in g.nodes(data=True):
                            d['id']=str(n)
                        return g
                    so.gprint(pg(self._base_graph), size=35, label='id')
                    so.gprint(pg(self._abstract_graph),size=35, label='id')
                    for n,d in self._abstract_graph.nodes(data=True):
                        print d
                    exit()
예제 #11
0
    def pre_vectorizer_graph(self, nested=True, fcorrect=False, base_only=False):
        """
        Parameters
        ----------
        nested: nested minor + base graph
        fcorrect: introduce nodes that aid the forgi abstraction
        base_only: only return the base graph


        Returns
        -------
            nx.graph
        """

        if self.pre_vectorizer_rm_f and self.pre_vectorizer_nested:
            print "not sure if this works.. rnadecomposer pre_vec_graph"


        if self.pre_vectorizer_rm_f == False:
            return super(self.__class__, self).pre_vectorizer_graph(nested=self.pre_vectorizer_nested)


        # else

        backup = self._unaltered_graph.copy()
        g=self._unaltered_graph
        if g:
            if self.pre_vectorizer_rm_f:
                delset = []
                for n, d in g.nodes(data=True):
                    if d['label'] == "F":
                        down = self.nextnode(g, n)
                        up = self.nextnode(g, n, down_direction=False)
                        delset.append((n, down, up))

                for r, d, u in delset:
                    # print g.node[d[0]]
                    # we copy the label of the adjacent edge to r
                    g.node[r] = g.node[d[0]].copy()
                    # print g.node[r]

                    # g.node[r]={"label":'-','edge':True}
                    # delete neighbors
                    g.remove_nodes_from([d[0], u[0]])

                    # rewire neighbors of neighbors
                    g.add_edge(r, d[1])
                    g.add_edge(u[1], r)
                    # print r,d,u



        #g2=g.graph['original'] eden should preserve the dict..
        self._unaltered_graph =edengraphtools._edge_to_vertex_transform(g)
        #g.graph['original']=g2
        g = super(self.__class__, self).pre_vectorizer_graph(nested=self.pre_vectorizer_nested)



        #import graphlearn.utils.ascii as asc
        #asc.printrow([g],size=60)
        #exit()

        self._unaltered_graph = backup

        return g
예제 #12
0
 def transform(self, inputs):
     return [(edengraphtools._edge_to_vertex_transform(i),self.abstract(i)) for i in inputs]
def _edge_to_vertex(graph):
    return eg._edge_to_vertex_transform(graph)
예제 #14
0
 def transform_single(self, graph):
     product = self.abstract(graph)
     product.graph['original']= edengraphtools._edge_to_vertex_transform(graph)
     return product
예제 #15
0
def _edge_to_vertex(graph):
    return eg._edge_to_vertex_transform(graph)