I'm having a lovely conversation with myself in the comments for trac
#8350 that I want to share. :-)

There are two related problems.

1.  The current BipartiteGraph class is incomplete, see trac #1941.  I
want to use it, so I'm trying to plug some of the holes.  In
particular, trac #8350 suggests overriding add_vertex() and
add_vertices() to properly maintain the bipartition data structures.

2.  The current Graph code assumes vertices and edges can be added at
will, e.g. the algorithm for is_cirular_planar().  Also, many other
methods do not behave as expected for BipartiteGraphs, e.g. union()
will return a Graph given two BipartiteGraph's.

Problem 1 first.  add_vertex() needs to maintain the bipartition
sets.  When a new vertex is added, it needs to go "left" or "right".
The natural solution is to include an extra argument or two in order
to specify where the new vertex (vertices) will go.

I thought I had a clever solution for problem (2): if a new vertex is
added without specifying which partition it belongs to, just change
the current object from a BipartiteGraph to a Graph instance.  But now
I think this is a really bad idea, since calling an arbitrary method
that *should not* change the graph.  For example, a test like
is_circular_planar would suddenly and silently change the class of my
object!

I considered another option.  Why not just wait until an edge is added
to figure out whether a node is left or right?  Because all the
vertices should be in one set or the other at all times.  For example,
if I add a vertex and then iterate (before adding any edges) over the
left and right subsets, the new vertex would be absent!

OK, assume we solve (1) by requiring an indication of which partition
a vertex belongs in and raising an exception otherwise.  What about
Graph algorithms that change the graph temporarily or just don't "do
the right thing" for BipartiteGraph's?  I see a few possibilities.

A.  Change BipartiteGraph so that it doesn't inherit from Graph.  This
requires adding a bunch of code to bring the BipartiteGraph
functionality to par with Graph.  Also, any future methods added to
Graph will need to be duplicated (often simply delegated) in
BipartiteGraph.

PRO: clean separation, BipartiteGraph should always work.  CON:
BipartiteGraph will likely lag behind Graph in functionality; perhaps
small performance loss for delegation.

B.  Make BipartiteGraph handling an integral part of the Graph class,
similar to DiGraph and the '_directed" attribute.  This requires a
thorough review of the current Graph code to see where bipartite-ness
must be taken into account or can be exploited (optional).  Also,
future methods will need to be aware of the possibility of operating
on BipartiteGraphs.

PRO: similar to current DiGraph solution; most likely to keep
BipartiteGraph and Graph features equal.  CON: some Graph methods may
break for BipartiteGraph instances; some methods may run a little
slower due to extra conditional handling.

C.  Continue as we do now, i.e. BipartiteGraph is a subclass of Graph
and overrides methods when necessary.  This requires a thorough review
of the current Graph code to see where bipartite-ness must be taken
into account or can be exploited (optional).  These methods will need
overrides in BipartiteGraph.  Also, future methods in the Graph class
will need  this same review.

PRO: clean separation; perhaps a little less work initially.  CON:
future Graph methods most likely to break for BipartiteGraph
instances; some duplication of code possible for similar but distinct
BipartiteGraph algorithms.

SUMMARY:
All of the options require a good chunk of work to really finish the
BipartiteGraph class.  (I will not have time to finish this task
soon.)  I think option (B) is best: it's similar to the current
DiGraph situation; many new Graph methods will "just work" for
BipartiteGraph (not constantly playing catch-up); and the
BipartiteGraph case is most likely to be noticed, handled and tested
by people working on the Graph class -- once someone does the big
chunk of work.

I suppose since I'm not committing to doing the work, I'm asking for a
policy decision so I can fix my pressing problems appropriately.  I
also volunteer to put comments at the top of graph.py and
bipartite_graph.py explaining problem and the policy. :-)

Thanks!

- Ryan

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to