11import networkx as nx
2- from mathics .core .expression import Atom , Symbol
2+ from mathics .core .atoms import Atom
3+ from mathics .core .evaluation import Evaluation
4+ from mathics .core .symbols import SymbolConstant , SymbolFalse , SymbolTrue
35
46from pymathics .graph .__main__ import (
57 DEFAULT_GRAPH_OPTIONS ,
1618from mathics .builtin .base import AtomBuiltin
1719
1820
19- class TreeGraphAtom ( AtomBuiltin ) :
21+ def eval_TreeGraphQ ( g : Graph ) -> SymbolConstant :
2022 """
21- >> TreeGraph[{1->2, 2->3, 3->1}]
22- = -Graph-
23-
23+ Returns SymbolTrue if g is a (networkx) tree and SymbolFalse
24+ otherwise.
2425 """
26+ if not isinstance (g , Graph ):
27+ return SymbolFalse
28+ return SymbolTrue if nx .is_tree (g .G ) else SymbolFalse
2529
30+
31+ # FIXME: do we need to have TreeGraphAtom and TreeGraph?
32+ # Can't these be combined into one?
33+ class TreeGraphAtom (AtomBuiltin ):
2634 options = DEFAULT_TREE_OPTIONS
2735
2836 messages = {
2937 "v" : "Expected first parameter vertices to be a list of vertices" ,
3038 "notree" : "Graph is not a tree." ,
3139 }
3240
33- def eval (self , rules , evaluation , options ):
41+ def eval (self , rules , evaluation : Evaluation , options : dict ):
3442 "TreeGraph[rules_List, OptionsPattern[%(name)s]]"
35- g = _graph_from_list (rules .leaves , options )
43+ g = _graph_from_list (rules .elements , options )
3644 if not nx .is_tree (g .G ):
3745 evaluation .message (self .get_name (), "notree" )
3846
3947 g .G .graph_layout = "tree"
4048 # Compute/check/set for root?
4149 return g
4250
43- def eval_with_v_e (self , vertices , edges , evaluation , options ):
51+ def eval_with_v_e (self , vertices , edges , evaluation : Evaluation , options : dict ):
4452 "TreeGraph[vertices_List, edges_List, OptionsPattern[%(name)s]]"
45- if not all (isinstance (v , Atom ) for v in vertices .leaves ):
53+ if not all (isinstance (v , Atom ) for v in vertices .elements ):
4654 evaluation .message (self .get_name (), "v" )
4755
4856 g = _graph_from_list (
49- edges .leaves , options = options , new_vertices = vertices .leaves
57+ edges .elements , options = options , new_vertices = vertices .elements
5058 )
5159 if not nx .is_tree (g .G ):
5260 evaluation .message (self .get_name (), "notree" )
@@ -57,6 +65,12 @@ def eval_with_v_e(self, vertices, edges, evaluation, options):
5765
5866
5967class TreeGraph (Graph ):
68+ """
69+ >> TreeGraph[{1->2, 2->3, 2->4}]
70+ = -Graph-
71+
72+ """
73+
6074 options = DEFAULT_TREE_OPTIONS
6175
6276 messages = {
@@ -85,8 +99,8 @@ class TreeGraphQ(_NetworkXBuiltin):
8599 = False
86100 """
87101
88- def eval (self , g , expression , evaluation , options ):
102+ def eval (
103+ self , g , expression , evaluation : Evaluation , options : dict
104+ ) -> SymbolConstant :
89105 "TreeGraphQ[g_, OptionsPattern[%(name)s]]"
90- if not isinstance (g , Graph ):
91- return Symbol ("False" )
92- return Symbol ("True" if nx .is_tree (g .G ) else "False" )
106+ return eval_TreeGraphQ (g )
0 commit comments