Skip to content
This repository has been archived by the owner on Sep 12, 2024. It is now read-only.

Commit

Permalink
refactor: finalizing edge fix pr
Browse files Browse the repository at this point in the history
  • Loading branch information
marsninja committed Jan 28, 2024
1 parent b65b7f3 commit 1dd3369
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 36 deletions.
20 changes: 6 additions & 14 deletions examples/reference/connect_expressions.jac
Original file line number Diff line number Diff line change
@@ -1,39 +1,31 @@
import:py random;

node node_a{
has value:int;
}

walker Creator {
can create with `<root> entry;
can travel with `<root>|node_a entry;
}

edge MyEdge {
has val:int =5;
}

:walker:Creator:can:create{
end = <here>;
for i = 0 to i<8 by i+=1{
if i % 2 == 0{
end ++> end := node_a(value=i+1);
for i = 0 to i<7 by i+=1{
if i % 2==0{
end ++> end := node_a(value=i);
}
else{
end +:MyEdge:val=random.randint(1,8):+> node_a(value=i+10);
end +:MyEdge:val=i:+> end := node_a(value=i+10);
}
}
}
:walker:Creator:can:travel{
#print the node values that is connected with MyEdge edges of val less than 5
for i in -:MyEdge:val<=5 :->{
for i in -:MyEdge:val<=6 :->{
print(i.value);
}
visit-->;
}

with entry{
random.seed(3);
<root> spawn Creator();
#print(<root>._jac_.gen_dot());
# print(<r>._jac_.gen_dot());
}
54 changes: 35 additions & 19 deletions jaclang/core/construct.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,29 +40,45 @@ def connect_node(self, nd: NodeArchitype, edg: EdgeArchitype) -> NodeArchitype:
edg._jac_.attach(self.obj, nd)
return self.obj

# def edges_to_nodes(
# self, dir: EdgeDir, filter_type: Optional[type], filter_func: Optional[Callable]
# ) -> list[NodeArchitype]:
# """Get set of nodes connected to this node."""
# filter_func = filter_func if filter_func else lambda x: x
# ret_nodes: list[NodeArchitype] = []
# if dir in [EdgeDir.OUT]:
# edge_list = []
# for x in self.edges[EdgeDir.OUT]:
# if x._jac_.target and (not filter_type or isinstance(x, filter_type)):
# edge_list.append(x)
# new_edge = filter_func(edge_list)
# for i in new_edge:
# ret_nodes.append(i._jac_.target)
# elif dir in [EdgeDir.IN]:
# edge_list = []
# for i in self.edges[EdgeDir.IN]:
# if i._jac_.source and (not filter_type or isinstance(i, filter_type)):
# edge_list.append(i)
# new_edge = filter_func(edge_list)
# for i in new_edge:
# ret_nodes.append(i._jac_.source)
# return ret_nodes

def edges_to_nodes(
self, dir: EdgeDir, filter_type: Optional[type], filter_func: Optional[Callable]
) -> list[NodeArchitype]:
"""Get set of nodes connected to this node."""
filter_func = filter_func if filter_func else lambda x: x
ret_nodes: list[NodeArchitype] = []
if dir in [EdgeDir.OUT]:
edge = []
for x in self.edges[EdgeDir.OUT]:
if x._jac_.target and (not filter_type or isinstance(x, filter_type)):
edge.append(x)
new_edge = filter_func(edge)
for i in new_edge:
ret_nodes.append(i._jac_.target)
elif dir in [EdgeDir.IN]:
edge = []
for i in self.edges[EdgeDir.IN]:
if i._jac_.source and (not filter_type or isinstance(i, filter_type)):
edge.append(i)
new_edge = filter_func(edge)
for i in new_edge:
ret_nodes.append(i._jac_.source)
return ret_nodes
filter_func = filter_func or (lambda x: x)
edge_list = [
e
for e in self.edges[dir]
if getattr(e._jac_, "target" if dir == EdgeDir.OUT else "source", None)
and (not filter_type or isinstance(e, filter_type))
]
return [
getattr(e._jac_, "target" if dir == EdgeDir.OUT else "source")
for e in filter_func(edge_list)
]

def gen_dot(self, dot_file: Optional[str] = None) -> str:
"""Generate Dot file for visualizing nodes and edges."""
Expand Down
2 changes: 1 addition & 1 deletion jaclang/plugin/feature.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ def get_root() -> Architype:
def build_edge(
edge_dir: EdgeDir,
conn_type: Optional[Type[Architype]],
conn_assign: Optional[tuple],
conn_assign: Optional[tuple[tuple, tuple]],
) -> Architype:
"""Jac's root getter."""
return JacFeature.pm.hook.build_edge(
Expand Down
2 changes: 1 addition & 1 deletion jaclang/plugin/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def get_root() -> Architype:
def build_edge(
edge_dir: EdgeDir,
conn_type: Optional[Type[Architype]],
conn_assign: Optional[tuple],
conn_assign: Optional[tuple[tuple, tuple]],
) -> Architype:
"""Jac's root getter."""
raise NotImplementedError
2 changes: 1 addition & 1 deletion jaclang/tests/fixtures/gendot_bubble_sort.jac
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,5 @@ with entry{
<r> spawn walker1();
<r> spawn walker2();
<r> spawn walker3();
<r>._jac_.gen_dot();
print(<r>._jac_.gen_dot());
}

0 comments on commit 1dd3369

Please sign in to comment.