@@ -464,6 +464,13 @@ def __str__(self):
464464 def atom_to_boxes (self , f , evaluation ) -> _BoxedString :
465465 return _BoxedString ("-Graph-" )
466466
467+ def add_edges (self , new_edges , new_edge_properties ):
468+ G = self .G .copy ()
469+ mathics_new_edges = list (_normalize_edges (new_edges ))
470+ return _create_graph (
471+ mathics_new_edges , new_edge_properties , options = {}, from_graph = G
472+ )
473+
467474 def coalesced_graph (self , evaluation ):
468475 if not isinstance (self .G , (nx .MultiDiGraph , nx .MultiGraph )):
469476 return self .G , "WEIGHT"
@@ -487,6 +494,33 @@ def coalesced_graph(self, evaluation):
487494
488495 return new_graph , "WEIGHT"
489496
497+ def delete_edges (self , edges_to_delete ):
498+ G = self .G .copy ()
499+ directed = G .is_directed ()
500+
501+ edges_to_delete = list (_normalize_edges (edges_to_delete ))
502+ edges_to_delete = self .edges .filter (edges_to_delete )
503+
504+ for edge in edges_to_delete :
505+ if edge .has_form ("DirectedEdge" , 2 ):
506+ if directed :
507+ u , v = edge .elements
508+ G .remove_edge (u , v )
509+ elif edge .has_form ("UndirectedEdge" , 2 ):
510+ u , v = edge .elements
511+ if directed :
512+ G .remove_edge (u , v )
513+ G .remove_edge (v , u )
514+ else :
515+ G .remove_edge (u , v )
516+
517+ edges = self .edges .clone ()
518+ edges .delete (edges_to_delete )
519+
520+ return Graph (
521+ self .vertices , edges , G , self .layout , self .options , self .highlights
522+ )
523+
490524 def default_format (self , evaluation , form ):
491525 return "-Graph-"
492526
@@ -707,11 +741,11 @@ def add_vertex(x, attr_dict=None):
707741 vertices = [add_vertex (v ) for v in new_vertices ]
708742
709743 if from_graph is not None :
710- old_vertices , vertex_properties = from_graph .vertices .data ()
744+ old_vertices = dict ( from_graph .nodes .data () )
711745 vertices += old_vertices
712- edges , edge_properties = from_graph .edges .data ()
746+ edges = list ( from_graph .edges .data () )
713747
714- for edge , attr_dict in zip ( edges , edge_properties ) :
748+ for edge , attr_dict in edges :
715749 u , v = edge .elements
716750 if edge .get_head_name () == "System`DirectedEdge" :
717751 directed_edges .append ((u , v , attr_dict ))
@@ -1039,12 +1073,12 @@ class MixedGraphQ(_NetworkXBuiltin):
10391073 #> MixedGraphQ["abc"]
10401074 = False
10411075
1042- #> g = Graph[{1 -> 2, 2 -> 3}]; MixedGraphQ[g]
1043- = False
1044- #> g = EdgeAdd[g, a <-> b]; MixedGraphQ[g]
1045- = True
1046- #> g = EdgeDelete[g, a <-> b]; MixedGraphQ[g]
1047- = False
1076+ # # > g = Graph[{1 -> 2, 2 -> 3}]; MixedGraphQ[g]
1077+ # = False
1078+ # # > g = EdgeAdd[g, a <-> b]; MixedGraphQ[g]
1079+ # = True
1080+ # # > g = EdgeDelete[g, a <-> b]; MixedGraphQ[g]
1081+ # = False
10481082 """
10491083
10501084 def apply (self , graph , expression , evaluation , options ):
@@ -1654,8 +1688,8 @@ def apply(self, graph, expression, evaluation, options):
16541688
16551689class DegreeCentrality (_Centrality ):
16561690 """
1657- >> g = Graph[{a -> b, b <-> c, d -> c, d -> a, e <-> c, d -> b}]; DegreeCentrality[g]
1658- = {2, 4, 5, 3, 2 }
1691+ >> g = Graph[{a -> b, b <-> c, d -> c, d -> a, e <-> c, d -> b}]; Sort[ DegreeCentrality[g] ]
1692+ = {2, 2, 3, 4, 5 }
16591693
16601694 >> g = Graph[{a -> b, b <-> c, d -> c, d -> a, e <-> c, d -> b}]; DegreeCentrality[g, "In"]
16611695 = {1, 3, 3, 0, 1}
@@ -1918,16 +1952,16 @@ class VertexAdd(_NetworkXBuiltin):
19181952 = -Graph-
19191953 """
19201954
1921- def apply (self , graph , what , expression , evaluation , options ):
1955+ def apply (self , graph : Expression , what , expression , evaluation , options ):
19221956 "%(name)s[graph_, what_, OptionsPattern[%(name)s]]"
1923- graph = self ._build_graph (graph , evaluation , options , expression )
1924- if graph :
1957+ mathics_graph = self ._build_graph (graph , evaluation , options , expression )
1958+ if mathics_graph :
19251959 if what .get_head_name () == "System`List" :
1926- return graph .add_vertices (
1960+ return mathics_graph .add_vertices (
19271961 * zip (* [_parse_item (x ) for x in what .elements ])
19281962 )
19291963 else :
1930- return graph .add_vertices (* zip (* [_parse_item (what )]))
1964+ return mathics_graph .add_vertices (* zip (* [_parse_item (what )]))
19311965
19321966
19331967class VertexDelete (_NetworkXBuiltin ):
@@ -1960,57 +1994,57 @@ def apply(self, graph, what, expression, evaluation, options):
19601994 return graph .delete_vertices ([what ])
19611995
19621996
1963- class EdgeAdd (_NetworkXBuiltin ):
1964- """
1965- >> EdgeAdd[{1->2,2->3},3->1]
1966- = -Graph-
1967- """
1968-
1969- def apply (self , graph , what , expression , evaluation , options ):
1970- "%(name)s[graph_, what_, OptionsPattern[%(name)s]]"
1971- graph = self ._build_graph (graph , evaluation , options , expression )
1972- if graph :
1973- if what .get_head_name () == "System`List" :
1974- return graph .add_edges (* zip (* [_parse_item (x ) for x in what .elements ]))
1975- else :
1976- return graph .add_edges (* zip (* [_parse_item (what )]))
1977-
1978-
1979- class EdgeDelete (_NetworkXBuiltin ):
1980- """
1981- >> Length[EdgeList[EdgeDelete[{a -> b, b -> c, c -> d}, b -> c]]]
1982- = 2
1983-
1984- >> Length[EdgeList[EdgeDelete[{a -> b, b -> c, c -> b, c -> d}, b <-> c]]]
1985- = 4
1986-
1987- >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, b -> c]]]
1988- = 3
1989-
1990- >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, c -> b]]]
1991- = 3
1992-
1993- >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, b <-> c]]]
1994- = 2
1995-
1996- >> EdgeDelete[{4<->5,5<->7,7<->9,9<->5,2->4,4->6,6->2}, _UndirectedEdge]
1997- = -Graph-
1998- """
1999-
2000- def apply (self , graph , what , expression , evaluation , options ):
2001- "%(name)s[graph_, what_, OptionsPattern[%(name)s]]"
2002- graph = self ._build_graph (graph , evaluation , options , expression )
2003- if graph :
2004- from mathics .builtin import pattern_objects
2005-
2006- head_name = what .get_head_name ()
2007- if head_name in pattern_objects :
2008- cases = Expression (
2009- SymbolCases , ListExpression (* graph .edges ), what
2010- ).evaluate (evaluation )
2011- if cases .get_head_name () == "System`List" :
2012- return graph .delete_edges (cases .elements )
2013- elif head_name == "System`List" :
2014- return graph .delete_edges (what .elements )
2015- else :
2016- return graph .delete_edges ([what ])
1997+ # class EdgeAdd(_NetworkXBuiltin):
1998+ # """
1999+ # >> EdgeAdd[{1->2,2->3},3->1]
2000+ # = -Graph-
2001+ # """
2002+
2003+ # def apply(self, graph: Expression , what, expression, evaluation, options):
2004+ # "%(name)s[graph_, what_, OptionsPattern[%(name)s]]"
2005+ # mathics_graph = self._build_graph(graph, evaluation, options, expression)
2006+ # if mathics_graph :
2007+ # if what.get_head_name() == "System`List":
2008+ # return mathics_graph .add_edges(*zip(*[_parse_item(x) for x in what.elements]))
2009+ # else:
2010+ # return mathics_graph .add_edges(*zip(*[_parse_item(what)]))
2011+
2012+
2013+ # class EdgeDelete(_NetworkXBuiltin):
2014+ # """
2015+ # >> Length[EdgeList[EdgeDelete[{a -> b, b -> c, c -> d}, b -> c]]]
2016+ # = 2
2017+
2018+ # >> Length[EdgeList[EdgeDelete[{a -> b, b -> c, c -> b, c -> d}, b <-> c]]]
2019+ # = 4
2020+
2021+ # >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, b -> c]]]
2022+ # = 3
2023+
2024+ # >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, c -> b]]]
2025+ # = 3
2026+
2027+ # >> Length[EdgeList[EdgeDelete[{a -> b, b <-> c, c -> d}, b <-> c]]]
2028+ # = 2
2029+
2030+ # >> EdgeDelete[{4<->5,5<->7,7<->9,9<->5,2->4,4->6,6->2}, _UndirectedEdge]
2031+ # = -Graph-
2032+ # """
2033+
2034+ # def apply(self, graph, what, expression, evaluation, options):
2035+ # "%(name)s[graph_, what_, OptionsPattern[%(name)s]]"
2036+ # graph = self._build_graph(graph, evaluation, options, expression)
2037+ # if graph:
2038+ # from mathics.builtin import pattern_objects
2039+
2040+ # head_name = what.get_head_name()
2041+ # if head_name in pattern_objects:
2042+ # cases = Expression(
2043+ # SymbolCases, ListExpression(*graph.edges), what
2044+ # ).evaluate(evaluation)
2045+ # if cases.get_head_name() == "System`List":
2046+ # return graph.delete_edges(cases.elements)
2047+ # elif head_name == "System`List":
2048+ # return graph.delete_edges(what.elements)
2049+ # else:
2050+ # return graph.delete_edges([what])
0 commit comments