ufl team mailing list archive
-
ufl team
-
Mailing list archive
-
Message #01585
Re: [Branch ~ufl-core/ufl/main] Rev 892: Add function sort_elements for?sorting elements backwards with nested sub
-
To:
ufl@xxxxxxxxxxxxxxxxxxx
-
From:
Johan Hake <johan.hake@xxxxxxxxx>
-
Date:
Tue, 26 Jan 2010 08:00:35 -0800
-
In-reply-to:
<20100126083630.GB2628@olorin>
-
User-agent:
KMail/1.12.4 (Linux/2.6.31-18-generic; KDE/4.3.4; i686; ; )
On Tuesday 26 January 2010 00:36:30 Anders Logg wrote:
> On Mon, Jan 25, 2010 at 03:59:40PM -0800, Johan Hake wrote:
> > On Monday 25 January 2010 07:13:14 Anders Logg wrote:
> > > On Mon, Jan 25, 2010 at 03:09:06PM +0000, Garth N. Wells wrote:
> > > > Anders Logg wrote:
> > > > > On Mon, Jan 25, 2010 at 03:19:36PM +0100, Marie Rognes wrote:
> > > > >> noreply@xxxxxxxxxxxxx wrote:
> > > > >>> ------------------------------------------------------------
> > > > >>> revno: 892
> > > > >>> committer: Anders Logg <logg@xxxxxxxxx>
> > > > >>> branch nick: ufl-main
> > > > >>> timestamp: Mon 2010-01-25 13:26:37 +0100
> > > > >>> message:
> > > > >>> Add function sort_elements for sorting elements backwards with
> > > > >>> nested sub elements first. Using pygraph library for sorting
> > > > >>> directed acyclic graph. modified:
> > > > >>> ufl/algorithms/__init__.py
> > > > >>> ufl/algorithms/analysis.py
> > > > >>
> > > > >> Is pygraph super-standard?
> > > > >
> > > > > I don't know but it's in Ubuntu... :-)
> > > > >
> > > > > It was the simplest way I could find to store a list of elements
> > > > > based on their dependencies to sub elements.
> > > > >
> > > > > If it's a problem, we could implement the sorting ourselves.
> > > >
> > > > If it's simple, I would suggest implementing it ourselves to avoid a
> > > > dependency since UFL didn't have any dependencies beyond the standard
> > > > Python modules. It can wait until until the UFL/FFC change are
> > > > complete though.
> > >
> > > You mean like tomorrow?
> > >
> > > If anyone has a simple piece of code to do the following, let me know:
> > >
> > > # Create directed graph
> > > g = digraph()
> > >
> > > # Add nodes (elements)
> > > for element in elements:
> > > g.add_node(element)
> > >
> > > # Add edges (dependencies)
> > > for element in elements:
> > > for sub_element in element.sub_elements():
> > > g.add_edge(element, sub_element)
> > >
> > > # Sort graph
> > > sorted_elements = topological_sorting(g)
> >
> > Try this:
> >
> > from topologicsorting import topologic_sorting
> >
> > # Add nodes (elements)
> > nodes = []
> > for element in elements:
> > nodes.append(element)
> >
> > # Add edges (dependencies)
> > edges = dict((node, []) for node in nodes)
> > for element in elements:
> > for sub_element in element.sub_elements():
> > edges[element].append(sub_element)
> >
> > # Sort graph
> > sorted_elements = topological_sorting(nodes, edges)
> >
> > Not exactly like the one you get from pygraph but close!
> >
> > Johan
> >
> >
> >
> > def topological_sorting(nodes, edges):
> > """ return a topological sorted list of the nodes
> >
> > Implemented algorithm from Wikipedia :P
> >
> > <http://en.wikipedia.org/wiki/Topological_sorting>
> >
> > No error for cyclic edges...
> > """
> > # Build initial structure:
> > # S should only contain nodes with no edge pointing to it
> >
> > L = []
> > S = nodes[:]
> > for node in nodes:
> > for es in edges.itervalues():
> > if node in es and node in S:
> > S.remove(node)
> > continue
> >
> > while S:
> > node = S.pop(0)
> > L.append(node)
> > node_edges = edges[node]
> > while node_edges:
> > m = node_edges.pop(0)
> > found = False
> > for es in edges.itervalues():
> > found = m in es
> > if found:
> > break
> > if not found:
> > S.insert(0,m)
> > return L
> >
> > if __name__ == "__main__":
> > import pygraph
> >
> > g = pygraph.digraph()
> >
> > nodes = [7, 5, 3, 11, 8, 2, 9, 10]
> > edges = {7:[8,11], 5:[11], 3:[8,10], 11:[2,9,10], 8:[9], 2:[], 9:[],
> > 10:[]}
> >
> > for node in nodes:
> > g.add_node(node)
> >
> > for node in nodes:
> > for edge in edges[node]:
> > g.add_edge(node, edge)
> >
> > print "Pygraph object:", g
> > print "Pygraph sorted list:",
> > pygraph.algorithms.sorting.topological_sorting(g) print "Some sorted
> > list:", topological_sorting(nodes, edges)
>
> Thanks! Seems to work fine. I've replaced pygraph with your
> implementation now.
Cool!
Johan
References