Hello.
I am new to SymPy and I don't know if you have the Graph class in
SymPy, but I am playing with my Graph.py anyway (see below).
I have a question in the use of self in defining __init__: in a class.
I want to define a graph, and first I define vertex objects and edge objects.
The edges should be attributed their endpoints (which are vertex objects)
and the vertices should be attributed their incident edges (which are
edge objects)
In the following, I try to define the vertex object first, then define
the edges (containing
incidence information). In the process of defining the edges, I try
to update the vertex objects
with the new incidence information with following snippet:
<code>
class Edge:
def
__init__(self,endpoint1="",endpoint2="",label='f',endpoints=set([]),beingObject='itself'):
...
...
for i in self.endpoints: #usually we define the
vertices before the edges
...
"""jazz up the incident endpoints"""
i.edges.add(self)
</code>
And it went rather wrong - all the vertices V ended up having
incident edges (the V.edges attribute) being
the set of all my edges.
So did I do something wrong?
The following is the entire module, which can be run byitself:
Thank you very much.
<code>
#Graph.py
#trying to define a graph (actually, a finite graph) in python
"""usually we define the vertices before the edges
but we may sometimes want to do the opposite"""
class Vertex:
def __init__(self,label='x',edges=set([]),beingObject='itself'):
#e.g. beingObject=sl2 (a Lie algebra object)
"""to create a vertex 'wrapper' out of the beingObject"""
self.label=label
self.edges=edges #initialise
self.being=beingObject
if edges!=set([]):
for e in edges: #usually we define the vertices
before the edges
#but we may sometimes want to
do the opposite
"""jazz up the incident edges"""
e.endpoints.add(self)
class Edge:
"""an edge can be defined as a pair of arrows but here
we do it the direct and simple way"""
def
__init__(self,endpoint1="",endpoint2="",label='f',endpoints=set([]),beingObject='itself'):
"""may be called by e=Edge('e',a,b) or
e=Edge('e',endpoints=set([a,b]))"""
if endpoints==set([]) and endpoint1 !="" :
endpoints=set([endpoint1,endpoint2])
#print label, [v.label for v in endpoints]
self.endpoints = endpoints
print label, [e.label for e in endpoints]
self.vertices = endpoints #alias
self.label=label
self.being=beingObject
if self.endpoints!=set([]):
for i in self.endpoints: #usually we define the
vertices before the edges
#but we may sometimes want to
do the opposite
"""jazz up the incident endpoints"""
i.edges.add(self)
#if isinstance(W,Vertex): W.edges=set([]) # just a
test, for i have no idea what happened - did i do something wrong with
the object constructions?
print "updating i=", i.label, "with edge", self.label
print i.label, "now has edges", [e.label for e in i.edges]
if isinstance(W,Vertex): print "and W has
edges:",[x.label for x in W.edges] #-why does it return a?
if isinstance(U,Vertex): print "and U has
edges:",[x.label for x in U.edges] #-why does it return a?
class Graph:
"""we allow multiple edges and loops for simplicity"""
def __init__(self,vertices=set([]),edges=set([]), label="No label"):
self.edges=edges
self.vertices=vertices
"""a preliminary check"""
for e in edges:
if not e.endpoints < vertices:
print "Error! The endpoints of the edge " + e.label +
" are not in the set of vertices " , [v.label for v in vertices]
return None
else:
for v in e.endpoints:
if e not in v.edges:
print "Error! Vertex "+ v.label +" doesn't
appear to recognise edge "+ e.label +", which cites it as an endpoint"
if __name__=="__main__":
U=Vertex('U')
V=Vertex('V')
W=Vertex('W')
#print W.edges
a=Edge(U,V,'a')
print "...creating the edge b: V-W............."
b=Edge(V,W,'b')
Ver=set([U,V,W])
Edg=set([a,b])
for i in Ver:
print "\n..............."
print i.label
print [e.label for e in i.edges]
for j in Edg:
print "\n..............."
print j.label
print [v.label for v in j.endpoints]
print "creating the two edge graph U-a-V-b-W"
G=Graph(Ver,Edg,"two-edge-graph")
for e in G.edges:
print
list(e.endpoints)[0].label+"-"+e.label+"-"+list(e.endpoints)[1].label
for v in G.vertices:
print "\n......" + v.label
for e in v.edges:
print e.label
</code>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [email protected]
For more options, visit this group at http://groups.google.com/group/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---