Hi Greg!

On Thu, Jan 28, 2010 at 08:27:30PM -0800, Greg McWhirter wrote:
> I've been working on upgrading networkx to 1.0.1 for the past couple
> days and have things passing almost all the tests (modulo some answer
> correction for changed format of networkx representations)

Thanks for your work: +1 on staying synchronized with networkx!

> The other big block of tests that don't pass are unpickling tests from
> sage/structure/sage_object.pyx
> I am wondering how big a problem this really is?
> 
> Looking at some of the classes for some of the things it fails on
> (detailed at the bottom), it seems they use a graph object somewhere
> in the internals. I am guessing that since networkx removed the XGraph
> and XDiGraph objects somewhere between 0.36 (which is the version
> currently shipping with sage) and 1.0.1, the pickled objects can't
> find those classes and fail to unpickle. However, I don't know how to
> test that exactly, nor what to do about it (possibly patching networkx
> to do something when asked for those classes, loading up the up-to-
> date ones instead?)

A confirmation: dynkin diagrams inherit from DiGraph, and all crystals
point to a dynkin diagram. Similarly for posets. So if some type of
graphs don't unpickle, I am not surprised for all of this to fail.

The following command (to be run with Sage with the old networkx)
tells you what will happens upon later unpickling, say, a poset:

    sage: P = Poset()
    sage: explain_pickle(dumps(P))
    pg_FinitePoset = unpickle_global('sage.combinat.posets.posets', 
'FinitePoset')
    si1 = unpickle_newobj(pg_FinitePoset, ())
    pg_HasseDiagram = unpickle_global('sage.combinat.posets.hasse_diagram', 
'HasseDiagram')
    si2 = unpickle_newobj(pg_HasseDiagram, ())
    pg_SparseGraphBackend = unpickle_global('sage.graphs.base.sparse_graph', 
'SparseGraphBackend')
    si3 = unpickle_newobj(pg_SparseGraphBackend, ())
    pg_SparseGraph = unpickle_global('sage.graphs.base.sparse_graph', 
'SparseGraph')
    unpickle_build(si3, {'_cg_rev':pg_SparseGraph(0r, 16r, 10r, [], []), 
'directed':True, 'vertex_labels':{}, '_multiple_edges':False, '_directed':True, 
'_name':'', 'vertex_ints':{}, '_loops':False, 'edge_labels':{0r:None}, 
'_cg':pg_SparseGraph(0r, 16r, 10r, [], [])})
    unpickle_build(si2, {'_weighted':False, '_pos':None, '_boundary':[], 
'_latex_opts':None, '_backend':si3})
    unpickle_build(si1, {'_hasse_diagram':si2, '_embedding':None, 
'_convert_method_name':None, '_cdata':None, '_category':None, '_names':None, 
'_generators':None, '_elements':[], '_hash':None, '_pickle_version':1r, 
'_element_constructor':None, '_initial_convert_list':[], 
'_element_init_pass_parent':False, '_initial_action_list':[], 
'_initial_coerce_list':[], '_base':None})
    si1

Then, you can just copy paste the commands in a Sage with the new
networkx, and see what breaks. Most likely it is the
SparseGraphBackend thing.  If it's just a question of renamed class,
then you can add something along the following lines somewhere in the
graph code:

        from sage.structure.sage_object import register_unpickle_override
        
register_unpickle_override('sage.graphs.base.sparse_graph','SparseGraphBackend',
                                   <some function or class that will emulate 
the previous thing>)

Cheers,
                                Nicolas
--
Nicolas M. ThiƩry "Isil" <nthi...@users.sf.net>
http://Nicolas.Thiery.name/

-- 
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