From 549ce29e96c5aee1ac95a569c5020fc5f853f25b Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 21 Jan 2024 10:47:49 +0530 Subject: [PATCH 01/20] some examples changed --- examples/reference/connect_expressions.jac | 40 +++++++++++++++++ .../data_spatail_walker_statements.jac | 4 +- .../reference/data_spatial_references.jac | 14 +++--- examples/reference/data_spatial_references.py | 44 ++++++++++++------- .../data_spatial_spawn_expressions.jac | 2 +- 5 files changed, 78 insertions(+), 26 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index e69de29bb..9e9b88380 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -0,0 +1,40 @@ +import:py random; + +walker walker_1 { + can create with ` entry; +} + +edge MyEdge { + has val:int =5; +} + +node node_a{ + has val:int; + can print_some with walker_1 entry; +} +node node_b{ + has value:int; +} + +:walker:walker_1:can:create{ + end = ; + for i = 0 to i<5 by i+=1{ + end ++> end := node_a(val=i+1); + } + #connect 3 nodes of node_b from the last node_a created + for i=0 to i<3 by i+=1 { + node_a(val=3) +:MyEdge:val=random.randint(1,10):+> node_b(value=i+5); + } + visit-->; +} + +:node:node_a:can:print_some{ + print(f"this is {}"); + + visit-->; +} + +with entry{ + spawn walker_1(); + ._jac_.gen_dot(); +} \ No newline at end of file diff --git a/examples/reference/data_spatail_walker_statements.jac b/examples/reference/data_spatail_walker_statements.jac index e1c8f2006..52e5dd231 100644 --- a/examples/reference/data_spatail_walker_statements.jac +++ b/examples/reference/data_spatail_walker_statements.jac @@ -28,11 +28,11 @@ walker walker_2{ visit -->; } :node:node_a:can:print_something -> str{ - f"walker_1 entered to {}"|>print; + print(f"walker_1 entered to {}"); visit -->; } with entry{ - :> walker_1 spawn ; #walker_1 statrt walking from root node + walker_1() spawn ; #walker_1 statrt walking from root node spawn walker_2(); #after walker_1 finish walking walker_2 start walking to nodes } \ No newline at end of file diff --git a/examples/reference/data_spatial_references.jac b/examples/reference/data_spatial_references.jac index ce7d2ade2..ecfd6fbb8 100644 --- a/examples/reference/data_spatial_references.jac +++ b/examples/reference/data_spatial_references.jac @@ -10,7 +10,7 @@ edge MyEdge { walker Walk { #has count: int = 0; can create with ` entry; - #can do_something with ` entry; + can do_something with ` entry; } :walker:Walk:can:create{ @@ -20,11 +20,13 @@ walker Walk { } visit -->; } -# :walker:Walk:can:do_something{ -# for i in -:MyEdge:val<=5 :->{ -# print(i.val); -# } -# } +:walker:Walk:can:do_something{ + for i in -:MyEdge:val<=5 :->{ + print(i.val); + } + print("Hello"); + visit -->; +} with entry { diff --git a/examples/reference/data_spatial_references.py b/examples/reference/data_spatial_references.py index 879f7a747..352df998c 100644 --- a/examples/reference/data_spatial_references.py +++ b/examples/reference/data_spatial_references.py @@ -1,22 +1,32 @@ -""" -need to create some type of edge with fields +from __future__ import annotations +from jaclang.plugin.feature import JacFeature as jac +import random -edge MyEdge { - has val:int =5; -} +@jac.make_architype('node', on_entry=[], on_exit=[]) +class MyNode: + value: int -node MyNode { -} +@jac.make_architype('edge', on_entry=[], on_exit=[]) +class MyEdge: + val: int = 5 -create 10 edges off of root +@jac.make_architype('walker', on_entry=[jac.DSFunc('create', jac.RootType), jac.DSFunc('do_something', jac.RootType)], on_exit=[]) +class Walk: - +:MyEdge:val=randint(0, 10):+> MyNode() + def create(self, walker_here: jac.RootType) -> None: + i = 0 + while i < 5: + jac.connect(jac.get_root(), MyNode(value=i + 1), jac.build_edge(jac.EdgeDir.OUT, MyEdge, (('val',), (random.randint(1, 10),)))) + jac.connect(walker_here, MyNode(value=i + 1), jac.build_edge(jac.EdgeDir.OUT, None, None)) + i += 1 + if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): + pass -5 of these - - ++> MyNode() - -then we test the refs -for i in -:MyEdge:val<=5:->: - print i.val; -""" + def do_something(self, walker_here: jac.RootType) -> None: + for i in (lambda x: [i for i in x if i.val <= 5])(jac.edge_ref(walker_here, jac.EdgeDir.OUT, MyEdge)): + print(i.val) + print('Hello') + if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): + pass +jac.spawn_call(jac.get_root(), Walk()) +#jac.get_root()._jac_.gen_dot() diff --git a/examples/reference/data_spatial_spawn_expressions.jac b/examples/reference/data_spatial_spawn_expressions.jac index 640ca3fc1..b8f978411 100644 --- a/examples/reference/data_spatial_spawn_expressions.jac +++ b/examples/reference/data_spatial_spawn_expressions.jac @@ -23,5 +23,5 @@ node node_a{ } with entry{ - :> Adder spawn ; # spawn will iniiate the walker Adder from root node + Adder() spawn ; # spawn will iniiate the walker Adder from root node } \ No newline at end of file From 39782d20938c9e98227c7e2975c08e541510b0b8 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 21 Jan 2024 10:49:00 +0530 Subject: [PATCH 02/20] after pre-commit passed --- examples/reference/connect_expressions.jac | 4 +- examples/reference/data_spatial_references.py | 41 +++++++++++++++---- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 9e9b88380..d1f5c7c71 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -17,7 +17,7 @@ node node_b{ } :walker:walker_1:can:create{ - end = ; + end = ; for i = 0 to i<5 by i+=1{ end ++> end := node_a(val=i+1); } @@ -30,7 +30,7 @@ node node_b{ :node:node_a:can:print_some{ print(f"this is {}"); - + visit-->; } diff --git a/examples/reference/data_spatial_references.py b/examples/reference/data_spatial_references.py index 352df998c..de72c18ff 100644 --- a/examples/reference/data_spatial_references.py +++ b/examples/reference/data_spatial_references.py @@ -2,31 +2,54 @@ from jaclang.plugin.feature import JacFeature as jac import random -@jac.make_architype('node', on_entry=[], on_exit=[]) + +@jac.make_architype("node", on_entry=[], on_exit=[]) class MyNode: value: int -@jac.make_architype('edge', on_entry=[], on_exit=[]) + +@jac.make_architype("edge", on_entry=[], on_exit=[]) class MyEdge: val: int = 5 -@jac.make_architype('walker', on_entry=[jac.DSFunc('create', jac.RootType), jac.DSFunc('do_something', jac.RootType)], on_exit=[]) -class Walk: +@jac.make_architype( + "walker", + on_entry=[ + jac.DSFunc("create", jac.RootType), + jac.DSFunc("do_something", jac.RootType), + ], + on_exit=[], +) +class Walk: def create(self, walker_here: jac.RootType) -> None: i = 0 while i < 5: - jac.connect(jac.get_root(), MyNode(value=i + 1), jac.build_edge(jac.EdgeDir.OUT, MyEdge, (('val',), (random.randint(1, 10),)))) - jac.connect(walker_here, MyNode(value=i + 1), jac.build_edge(jac.EdgeDir.OUT, None, None)) + jac.connect( + jac.get_root(), + MyNode(value=i + 1), + jac.build_edge( + jac.EdgeDir.OUT, MyEdge, (("val",), (random.randint(1, 10),)) + ), + ) + jac.connect( + walker_here, + MyNode(value=i + 1), + jac.build_edge(jac.EdgeDir.OUT, None, None), + ) i += 1 if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): pass def do_something(self, walker_here: jac.RootType) -> None: - for i in (lambda x: [i for i in x if i.val <= 5])(jac.edge_ref(walker_here, jac.EdgeDir.OUT, MyEdge)): + for i in (lambda x: [i for i in x if i.val <= 5])( + jac.edge_ref(walker_here, jac.EdgeDir.OUT, MyEdge) + ): print(i.val) - print('Hello') + print("Hello") if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): pass + + jac.spawn_call(jac.get_root(), Walk()) -#jac.get_root()._jac_.gen_dot() +# jac.get_root()._jac_.gen_dot() From 71ebe4127d69b56ad2a0ccffc1f6dfbf9c0bbb32 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Tue, 23 Jan 2024 08:38:47 +0530 Subject: [PATCH 03/20] some changes in examples --- examples/reference/connect_expressions.jac | 14 ++++++++++++-- examples/reference/data_spatial_references.jac | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index d1f5c7c71..54fdfd18b 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -20,15 +20,25 @@ node node_b{ end = ; for i = 0 to i<5 by i+=1{ end ++> end := node_a(val=i+1); + #connect three nodes of node_b from node_a(val=3) + if i == 2{ + for j=0 to j<3 by j+=1 { + end +:MyEdge:val=random.randint(1,10):+> node_b(value=j+10); + } + + } } #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { - node_a(val=3) +:MyEdge:val=random.randint(1,10):+> node_b(value=i+5); + end +:MyEdge:val=random.randint(1,10):+> node_b(value=i+5); } visit-->; } :node:node_a:can:print_some{ + # for i in -:MyEdge:val<=5 :->{ + # print(i.val); + # } print(f"this is {}"); visit-->; @@ -36,5 +46,5 @@ node node_b{ with entry{ spawn walker_1(); - ._jac_.gen_dot(); + #._jac_.gen_dot(); } \ No newline at end of file diff --git a/examples/reference/data_spatial_references.jac b/examples/reference/data_spatial_references.jac index ecfd6fbb8..7f8b42e5c 100644 --- a/examples/reference/data_spatial_references.jac +++ b/examples/reference/data_spatial_references.jac @@ -16,7 +16,7 @@ walker Walk { :walker:Walk:can:create{ for i=0 to i<5 by i+=1 { +:MyEdge:val=random.randint(1,10):+> MyNode(value=i+1); - ++> MyNode(value=i+1); + # ++> MyNode(value=i+1); } visit -->; } @@ -31,7 +31,7 @@ walker Walk { with entry { spawn Walk(); - #._jac_.gen_dot(); + ._jac_.gen_dot(); } From cf8a0bd3c2c538d5a37cd2bcbbe4bd823d723118 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Wed, 24 Jan 2024 01:13:49 +0530 Subject: [PATCH 04/20] connect_expressions edge example --- examples/reference/connect_expressions.jac | 40 +++++++++++++++------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 54fdfd18b..87518e093 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -4,16 +4,21 @@ walker walker_1 { can create with ` entry; } -edge MyEdge { - has val:int =5; -} - node node_a{ has val:int; can print_some with walker_1 entry; } + +walker walker_2{ + can travel with `|node_a entry; +} node node_b{ has value:int; + can do with walker_2 entry; +} + +edge MyEdge { + has val:int =5; } :walker:walker_1:can:create{ @@ -23,28 +28,39 @@ node node_b{ #connect three nodes of node_b from node_a(val=3) if i == 2{ for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,10):+> node_b(value=j+10); + end +:MyEdge:val=random.randint(1,5):+> node_b(value=j+10); } } } #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { - end +:MyEdge:val=random.randint(1,10):+> node_b(value=i+5); + end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); + } + visit-->else { + print("finish walking"); } +} +:walker:walker_2:can:travel{ + print("Hi, this is walker_2"); + for i in -:MyEdge:val<=5 :->{ + print(i.val); + } visit-->; } -:node:node_a:can:print_some{ - # for i in -:MyEdge:val<=5 :->{ - # print(i.val); - # } - print(f"this is {}"); - visit-->; +:node:node_a:can:print_some{ + print(f"this is {}"); + visit--> ; } +:node:node_b:can:do{ + print("Hey there!"); + visit-->; + } with entry{ spawn walker_1(); + spawn walker_2(); #._jac_.gen_dot(); } \ No newline at end of file From 07995568ab5ad7af387f36f6ecb25ff1e992b4e3 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Wed, 24 Jan 2024 12:32:57 +0530 Subject: [PATCH 05/20] "connect some change" --- examples/reference/connect_expressions.jac | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 87518e093..857649778 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -15,6 +15,7 @@ walker walker_2{ node node_b{ has value:int; can do with walker_2 entry; + can print_one with walker_1 entry; } edge MyEdge { @@ -37,9 +38,7 @@ edge MyEdge { for i=0 to i<3 by i+=1 { end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); } - visit-->else { - print("finish walking"); - } + visit-->; } :walker:walker_2:can:travel{ print("Hi, this is walker_2"); @@ -58,6 +57,9 @@ edge MyEdge { print("Hey there!"); visit-->; } +:node:node_b:can:print_one{ + print(f"This is {}, Welcome walker_1!! "); +} with entry{ spawn walker_1(); From 6d775d1425f3df509b6156aa8e046f87e61cc0e1 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Wed, 24 Jan 2024 12:35:20 +0530 Subject: [PATCH 06/20] "pre-commit checked" --- examples/reference/connect_expressions.jac | 2 +- jaclang/tests/fixtures/semstr.jac | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 857649778..f69a0094d 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -49,7 +49,7 @@ edge MyEdge { } -:node:node_a:can:print_some{ +:node:node_a:can:print_some{ print(f"this is {}"); visit--> ; } diff --git a/jaclang/tests/fixtures/semstr.jac b/jaclang/tests/fixtures/semstr.jac index 182e46849..7370b488b 100644 --- a/jaclang/tests/fixtures/semstr.jac +++ b/jaclang/tests/fixtures/semstr.jac @@ -1,4 +1,4 @@ -# enum 'enum' emotion { +# enum 'enum' emotion { # Happy, # Sad, # Calm, @@ -25,5 +25,5 @@ # } can add() -> 'no of'int {} -# can 'update user mood' +# can 'update user mood' # updateMood(* 'jll'mood: str,'fd'gfgf:str) ->'mood selection'str {} \ No newline at end of file From dfbcd2d6419922384949ebe799f471b8007252ec Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Fri, 26 Jan 2024 22:28:37 +0530 Subject: [PATCH 07/20] default conn_assign modified --- jaclang/plugin/default.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index c7388875d..d45566a1c 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -195,4 +195,14 @@ def build_edge( edge._jac_.dir = edge_dir else: raise TypeError("Invalid edge object") + if conn_assign and isinstance(conn_assign, tuple) and len(conn_assign) == 2: + field, value = conn_assign[0][0], conn_assign[1][0] + if hasattr(edge, field): + setattr(edge, field, value) + else: + # Return an error if the attribute does not exist + return ValueError(f"Invalid attribute: {field}") + + print(conn_assign) + return edge From d4d542c1642d1a84d1f3ea73d8d9c1120f6c309b Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 08:29:46 -0500 Subject: [PATCH 08/20] chore: resolve conflicts --- jaclang/tests/fixtures/semstr.jac | 5 ----- 1 file changed, 5 deletions(-) diff --git a/jaclang/tests/fixtures/semstr.jac b/jaclang/tests/fixtures/semstr.jac index 3ccc352ed..7795a0f7e 100644 --- a/jaclang/tests/fixtures/semstr.jac +++ b/jaclang/tests/fixtures/semstr.jac @@ -25,11 +25,6 @@ journal { } can add() -> 'no of'int {} -<<<<<<< HEAD -# can 'update user mood' -# updateMood(* 'jll'mood: str,'fd'gfgf:str) ->'mood selection'str {} -======= can 'update user mood' updateMood(* 'jll' mood: str,'semstrinngfd' gfgf:str) ->'mood selection'str {} ->>>>>>> main From 24076d3192964f658d0dba18ce7643dc891d989c Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 08:41:54 -0500 Subject: [PATCH 09/20] refactor: cleanup --- examples/reference/connect_expressions.jac | 23 ++++++++++------------ jaclang/plugin/default.py | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index f69a0094d..2d7a6d6ad 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -1,28 +1,28 @@ import:py random; -walker walker_1 { +walker Creator { can create with ` entry; } node node_a{ has val:int; - can print_some with walker_1 entry; + can print_some with Creator entry; } -walker walker_2{ +walker Travelor{ can travel with `|node_a entry; } node node_b{ has value:int; - can do with walker_2 entry; - can print_one with walker_1 entry; + can do with Travelor entry; + can print_one with Creator entry; } edge MyEdge { has val:int =5; } -:walker:walker_1:can:create{ +:walker:Creator:can:create{ end = ; for i = 0 to i<5 by i+=1{ end ++> end := node_a(val=i+1); @@ -37,11 +37,11 @@ edge MyEdge { #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); + print(end._jac_.edges); } visit-->; } -:walker:walker_2:can:travel{ - print("Hi, this is walker_2"); +:walker:Travelor:can:travel{ for i in -:MyEdge:val<=5 :->{ print(i.val); } @@ -50,19 +50,16 @@ edge MyEdge { :node:node_a:can:print_some{ - print(f"this is {}"); visit--> ; } :node:node_b:can:do{ - print("Hey there!"); visit-->; } :node:node_b:can:print_one{ - print(f"This is {}, Welcome walker_1!! "); } with entry{ - spawn walker_1(); - spawn walker_2(); + spawn Creator(); + spawn Travelor(); #._jac_.gen_dot(); } \ No newline at end of file diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index bf8339148..6b9f0fb5f 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -209,6 +209,6 @@ def build_edge( # Return an error if the attribute does not exist return ValueError(f"Invalid attribute: {field}") - print(conn_assign) + # print(conn_assign) return edge From 5a9bd6826e34c16c044734807b845d6ae2a88cd3 Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 08:52:41 -0500 Subject: [PATCH 10/20] test(language): connect op with conn_assign --- jaclang/tests/fixtures/edge_ops.jac | 66 +++++++++++++++++++++++++++++ jaclang/tests/test_language.py | 10 +++++ 2 files changed, 76 insertions(+) create mode 100644 jaclang/tests/fixtures/edge_ops.jac diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac new file mode 100644 index 000000000..0b105be39 --- /dev/null +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -0,0 +1,66 @@ +import:py random; + +walker Creator { + can create with ` entry; +} + +node node_a{ + has val:int; + can print_some with Creator entry; +} + +walker Travelor{ + can travel with `|node_a entry; +} +node node_b{ + has value:int; + can do with Travelor entry; + can print_one with Creator entry; +} + +edge MyEdge { + has val:int =5; +} + +:walker:Creator:can:create{ + end = ; + for i = 0 to i<5 by i+=1{ + end ++> end := node_a(val=i+1); + #connect three nodes of node_b from node_a(val=3) + if i == 2{ + for j=0 to j<3 by j+=1 { + end +:MyEdge:val=random.randint(1,5):+> node_b(value=j+10); + } + + } + } + #connect 3 nodes of node_b from the last node_a created + for i=0 to i<3 by i+=1 { + end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); + } + print([i.val for i in list(end._jac_.edges.values())[1]]); + visit-->; +} +:walker:Travelor:can:travel{ + for i in -:MyEdge:val<=5 :->{ + print(i.val); + } + visit-->; +} + + +:node:node_a:can:print_some{ + visit--> ; +} +:node:node_b:can:do{ + visit-->; + } +:node:node_b:can:print_one{ +} + +with entry{ + random.seed(1); + spawn Creator(); + spawn Travelor(); + #._jac_.gen_dot(); +} \ No newline at end of file diff --git a/jaclang/tests/test_language.py b/jaclang/tests/test_language.py index 2833cc842..f60cf5240 100644 --- a/jaclang/tests/test_language.py +++ b/jaclang/tests/test_language.py @@ -202,3 +202,13 @@ def test_has_lambda_goodness(self) -> None: stdout_value = captured_output.getvalue() self.assertEqual(stdout_value.split("\n")[0], "mylist: [1, 2, 3]") self.assertEqual(stdout_value.split("\n")[1], "mydict: {'a': 2, 'b': 4}") + + def test_conn_assign_on_edges(self) -> None: + """Test conn assign on edges.""" + construct.root._jac_.edges[construct.EdgeDir.OUT].clear() + captured_output = io.StringIO() + sys.stdout = captured_output + jac_import("edge_ops", self.fixture_abs_path("./")) + sys.stdout = sys.__stdout__ + stdout_value = captured_output.getvalue() + self.assertEqual(stdout_value.split("\n")[0], "[3, 1, 4]") From 738a6a01ca4abdff7b5fabb689b1cfd29e5b1894 Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 09:08:51 -0500 Subject: [PATCH 11/20] refactor: improve conn_assign implementation --- jaclang/plugin/default.py | 16 ++++++++-------- jaclang/tests/fixtures/edge_ops.jac | 10 ++++++---- jaclang/tests/test_language.py | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index 6b9f0fb5f..586bab0d9 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -192,7 +192,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.""" conn_type = conn_type if conn_type else GenericEdge @@ -201,13 +201,13 @@ def build_edge( edge._jac_.dir = edge_dir else: raise TypeError("Invalid edge object") - if conn_assign and isinstance(conn_assign, tuple) and len(conn_assign) == 2: - field, value = conn_assign[0][0], conn_assign[1][0] - if hasattr(edge, field): - setattr(edge, field, value) - else: - # Return an error if the attribute does not exist - return ValueError(f"Invalid attribute: {field}") + if conn_assign: + for fld, val in zip(conn_assign[0], conn_assign[1]): + if hasattr(edge, fld): + setattr(edge, fld, val) + else: + # Return an error if the attribute does not exist + return ValueError(f"Invalid attribute: {field}") # print(conn_assign) diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac index 0b105be39..60c22a247 100644 --- a/jaclang/tests/fixtures/edge_ops.jac +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -19,7 +19,8 @@ node node_b{ } edge MyEdge { - has val:int =5; + has val:int =5, + val2:int = 10; } :walker:Creator:can:create{ @@ -29,16 +30,17 @@ edge MyEdge { #connect three nodes of node_b from node_a(val=3) if i == 2{ for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,5):+> node_b(value=j+10); + end +:MyEdge:val=random.randint(1,5), val2=random.randint(1,5):+> node_b(value=j+10); } - + print([(i.val, i.val2) for i in list(end._jac_.edges.values())[1]]); } } + #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); } - print([i.val for i in list(end._jac_.edges.values())[1]]); + visit-->; } :walker:Travelor:can:travel{ diff --git a/jaclang/tests/test_language.py b/jaclang/tests/test_language.py index f60cf5240..38d244914 100644 --- a/jaclang/tests/test_language.py +++ b/jaclang/tests/test_language.py @@ -211,4 +211,4 @@ def test_conn_assign_on_edges(self) -> None: jac_import("edge_ops", self.fixture_abs_path("./")) sys.stdout = sys.__stdout__ stdout_value = captured_output.getvalue() - self.assertEqual(stdout_value.split("\n")[0], "[3, 1, 4]") + self.assertEqual(stdout_value.split("\n")[0], "[(2, 5), (1, 3), (1, 4)]") From 030a7f5f2244cc0e6f52f6f2767b173eeb7cccca Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 09:10:20 -0500 Subject: [PATCH 12/20] fix: tweaks --- jaclang/plugin/default.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index 586bab0d9..cc25ec049 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -206,9 +206,5 @@ def build_edge( if hasattr(edge, fld): setattr(edge, fld, val) else: - # Return an error if the attribute does not exist - return ValueError(f"Invalid attribute: {field}") - - # print(conn_assign) - + raise ValueError(f"Invalid attribute: {field}") return edge From ea389ea45b54ae016864b4a04c74034b6323ac7f Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 09:10:42 -0500 Subject: [PATCH 13/20] fix: tweaks --- jaclang/plugin/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index cc25ec049..984ef1c3a 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -206,5 +206,5 @@ def build_edge( if hasattr(edge, fld): setattr(edge, fld, val) else: - raise ValueError(f"Invalid attribute: {field}") + raise ValueError(f"Invalid attribute: {fld}") return edge From 56eb4d77fe964e799c1e09634844c5d56c32586a Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 09:33:08 -0500 Subject: [PATCH 14/20] refactor: cleanup for edge ref improvements' --- jaclang/core/construct.py | 11 +++-------- jaclang/tests/fixtures/edge_ops.jac | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/jaclang/core/construct.py b/jaclang/core/construct.py index e4b8dc309..508796dcd 100644 --- a/jaclang/core/construct.py +++ b/jaclang/core/construct.py @@ -47,15 +47,11 @@ def edges_to_nodes( ret_nodes: list[NodeArchitype] = [] if dir in [EdgeDir.OUT]: for i in self.edges[EdgeDir.OUT]: - if i._jac_.target and ( - not filter_type or isinstance(i._jac_.target, filter_type) - ): + if i._jac_.target and (not filter_type or isinstance(i, filter_type)): ret_nodes.append(i._jac_.target) elif dir in [EdgeDir.IN]: for i in self.edges[EdgeDir.IN]: - if i._jac_.source and ( - not filter_type or isinstance(i._jac_.source, filter_type) - ): + if i._jac_.source and (not filter_type or isinstance(i, filter_type)): ret_nodes.append(i._jac_.source) return ret_nodes @@ -80,8 +76,7 @@ def gen_dot(self, dot_file: Optional[str] = None) -> str: if dot_file: with open(dot_file, "w") as f: f.write(dot_content + "}") - else: - print(dot_content + "}") + return dot_content + "}" @dataclass(eq=False) diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac index 60c22a247..d0930fe76 100644 --- a/jaclang/tests/fixtures/edge_ops.jac +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -44,8 +44,8 @@ edge MyEdge { visit-->; } :walker:Travelor:can:travel{ - for i in -:MyEdge:val<=5 :->{ - print(i.val); + for i in -:MyEdge:val<=5:-> { + print(i.value); } visit-->; } From 0bb5adfe52f52bb105c5e46289dba2caf251db52 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 28 Jan 2024 03:00:53 +0530 Subject: [PATCH 15/20] edge_ref filter_func --- .../compiler/passes/main/pyast_gen_pass.py | 9 +----- jaclang/core/construct.py | 29 ++++++++++++++----- jaclang/plugin/default.py | 4 ++- jaclang/plugin/feature.py | 4 ++- jaclang/plugin/spec.py | 1 + jaclang/tests/fixtures/edge_ops.jac | 4 +-- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/jaclang/compiler/passes/main/pyast_gen_pass.py b/jaclang/compiler/passes/main/pyast_gen_pass.py index b2c00acb2..8d91a9ff5 100644 --- a/jaclang/compiler/passes/main/pyast_gen_pass.py +++ b/jaclang/compiler/passes/main/pyast_gen_pass.py @@ -2043,18 +2043,11 @@ def translate_edge_op_ref(self, loc: ast3.AST, node: ast.EdgeOpRef) -> ast3.AST: node.filter_type.gen.py_ast if node.filter_type else self.sync(ast3.Constant(value=None)), + node.filter_cond.gen.py_ast if node.filter_cond else self.sync(ast3.Constant(value=None)) ], keywords=[], ) ) - if node.filter_cond: - ret = self.sync( - ast3.Call( - func=node.filter_cond.gen.py_ast, - args=[ret], - keywords=[], - ) - ) return ret def exit_disconnect_op(self, node: ast.DisconnectOp) -> None: diff --git a/jaclang/core/construct.py b/jaclang/core/construct.py index 508796dcd..ef3fe858f 100644 --- a/jaclang/core/construct.py +++ b/jaclang/core/construct.py @@ -41,18 +41,33 @@ def connect_node(self, nd: NodeArchitype, edg: EdgeArchitype) -> NodeArchitype: return self.obj def edges_to_nodes( - self, dir: EdgeDir, filter_type: Optional[type] + self, dir: EdgeDir, filter_type: Optional[type],filter_func: Optional[Callable] ) -> list[NodeArchitype]: """Get set of nodes connected to this node.""" + print("here", filter_func) + filter_func = filter_func if filter_func else lambda x: x ret_nodes: list[NodeArchitype] = [] - if dir in [EdgeDir.OUT]: - for i in self.edges[EdgeDir.OUT]: - if i._jac_.target and (not filter_type or isinstance(i, filter_type)): - ret_nodes.append(i._jac_.target) + if dir in [EdgeDir.OUT]: + + print(self. edges[EdgeDir.OUT]) + print(filter_func(self. edges[EdgeDir.OUT])) + for i in filter_func( + [ + x + for x in self. edges[EdgeDir.OUT] + if x._jac_.target + and (not filter_type or isinstance(x, filter_type)) + ] + ): + ret_nodes. append (i._jac_.target) elif dir in [EdgeDir.IN]: - for i in self.edges[EdgeDir.IN]: + edge = [] + for i in self.edges[EdgeDir. IN]: if i._jac_.source and (not filter_type or isinstance(i, filter_type)): - ret_nodes.append(i._jac_.source) + edge.append (i) + new_edge = filter_func(edge) + for i in new_edge: + ret_nodes.append(i._jac_.source) return ret_nodes def gen_dot(self, dot_file: Optional[str] = None) -> str: diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index 984ef1c3a..88e2d1980 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -129,10 +129,12 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], + filter_func: Optional[Callable] = None ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" + print("b",filter_func) if isinstance(node_obj, NodeArchitype): - return node_obj._jac_.edges_to_nodes(dir, filter_type) + return node_obj._jac_.edges_to_nodes(dir, filter_type, filter_func) else: raise TypeError("Invalid node object") diff --git a/jaclang/plugin/feature.py b/jaclang/plugin/feature.py index e5aec6b9e..262767384 100644 --- a/jaclang/plugin/feature.py +++ b/jaclang/plugin/feature.py @@ -86,10 +86,12 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], + filter_func: Optional[Callable] = None ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" + print("a", filter_func) return JacFeature.pm.hook.edge_ref( - node_obj=node_obj, dir=dir, filter_type=filter_type + node_obj=node_obj, dir=dir, filter_type=filter_type,filter_func=filter_func ) @staticmethod diff --git a/jaclang/plugin/spec.py b/jaclang/plugin/spec.py index 7c774fb78..df8cb2bba 100644 --- a/jaclang/plugin/spec.py +++ b/jaclang/plugin/spec.py @@ -110,6 +110,7 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], + filter_func: Optional[Callable] = None ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" raise NotImplementedError diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac index d0930fe76..88a22751c 100644 --- a/jaclang/tests/fixtures/edge_ops.jac +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -30,7 +30,7 @@ edge MyEdge { #connect three nodes of node_b from node_a(val=3) if i == 2{ for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,5), val2=random.randint(1,5):+> node_b(value=j+10); + end +:MyEdge:val=random.randint(1,15), val2=random.randint(1,5):+> node_b(value=j+10); } print([(i.val, i.val2) for i in list(end._jac_.edges.values())[1]]); } @@ -38,7 +38,7 @@ edge MyEdge { #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { - end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); + end +:MyEdge:val=random.randint(1,20):+> node_b(value=i+5); } visit-->; From 6ddcc4507555db68f475a18239848cc973e2f4b4 Mon Sep 17 00:00:00 2001 From: marsninja Date: Sat, 27 Jan 2024 16:44:14 -0500 Subject: [PATCH 16/20] fix: filter compr on edge ref --- jaclang/core/construct.py | 16 ++++++---------- jaclang/plugin/default.py | 5 ++--- jaclang/plugin/feature.py | 5 ++--- jaclang/plugin/spec.py | 2 +- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/jaclang/core/construct.py b/jaclang/core/construct.py index ef3fe858f..6c494121e 100644 --- a/jaclang/core/construct.py +++ b/jaclang/core/construct.py @@ -41,30 +41,26 @@ def connect_node(self, nd: NodeArchitype, edg: EdgeArchitype) -> NodeArchitype: return self.obj def edges_to_nodes( - self, dir: EdgeDir, filter_type: Optional[type],filter_func: Optional[Callable] + self, dir: EdgeDir, filter_type: Optional[type], filter_func: Optional[Callable] ) -> list[NodeArchitype]: """Get set of nodes connected to this node.""" - print("here", filter_func) filter_func = filter_func if filter_func else lambda x: x ret_nodes: list[NodeArchitype] = [] - if dir in [EdgeDir.OUT]: - - print(self. edges[EdgeDir.OUT]) - print(filter_func(self. edges[EdgeDir.OUT])) + if dir in [EdgeDir.OUT]: for i in filter_func( [ x - for x in self. edges[EdgeDir.OUT] + for x in self.edges[EdgeDir.OUT] if x._jac_.target and (not filter_type or isinstance(x, filter_type)) ] ): - ret_nodes. append (i._jac_.target) + ret_nodes.append(i._jac_.target) elif dir in [EdgeDir.IN]: edge = [] - for i in self.edges[EdgeDir. IN]: + for i in self.edges[EdgeDir.IN]: if i._jac_.source and (not filter_type or isinstance(i, filter_type)): - edge.append (i) + edge.append(i) new_edge = filter_func(edge) for i in new_edge: ret_nodes.append(i._jac_.source) diff --git a/jaclang/plugin/default.py b/jaclang/plugin/default.py index 88e2d1980..9c6f2e51d 100644 --- a/jaclang/plugin/default.py +++ b/jaclang/plugin/default.py @@ -129,12 +129,11 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], - filter_func: Optional[Callable] = None + filter_func: Optional[Callable], ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" - print("b",filter_func) if isinstance(node_obj, NodeArchitype): - return node_obj._jac_.edges_to_nodes(dir, filter_type, filter_func) + return node_obj._jac_.edges_to_nodes(dir, filter_type, filter_func) else: raise TypeError("Invalid node object") diff --git a/jaclang/plugin/feature.py b/jaclang/plugin/feature.py index 262767384..6824a5dbe 100644 --- a/jaclang/plugin/feature.py +++ b/jaclang/plugin/feature.py @@ -86,12 +86,11 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], - filter_func: Optional[Callable] = None + filter_func: Optional[Callable], ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" - print("a", filter_func) return JacFeature.pm.hook.edge_ref( - node_obj=node_obj, dir=dir, filter_type=filter_type,filter_func=filter_func + node_obj=node_obj, dir=dir, filter_type=filter_type, filter_func=filter_func ) @staticmethod diff --git a/jaclang/plugin/spec.py b/jaclang/plugin/spec.py index df8cb2bba..5d980f2bb 100644 --- a/jaclang/plugin/spec.py +++ b/jaclang/plugin/spec.py @@ -110,7 +110,7 @@ def edge_ref( node_obj: NodeArchitype, dir: EdgeDir, filter_type: Optional[type], - filter_func: Optional[Callable] = None + filter_func: Optional[Callable], ) -> list[NodeArchitype]: """Jac's apply_dir stmt feature.""" raise NotImplementedError From e95561e71f7ddbeef92db98c2946d07c0f4e060d Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 28 Jan 2024 03:58:03 +0530 Subject: [PATCH 17/20] refactored: connect.jac, edges_ops.jac, construct.py, test passed for conn_assign --- examples/reference/connect_expressions.jac | 29 ++++--------------- .../compiler/passes/main/pyast_gen_pass.py | 4 ++- jaclang/core/construct.py | 14 ++++----- jaclang/tests/fixtures/edge_ops.jac | 13 --------- jaclang/tests/test_language.py | 4 ++- 5 files changed, 18 insertions(+), 46 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 2d7a6d6ad..7914d0220 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -5,18 +5,12 @@ walker Creator { } node node_a{ - has val:int; - can print_some with Creator entry; + has value:int; } walker Travelor{ can travel with `|node_a entry; } -node node_b{ - has value:int; - can do with Travelor entry; - can print_one with Creator entry; -} edge MyEdge { has val:int =5; @@ -25,39 +19,28 @@ edge MyEdge { :walker:Creator:can:create{ end = ; for i = 0 to i<5 by i+=1{ - end ++> end := node_a(val=i+1); + end ++> end := node_a(value=i+1); #connect three nodes of node_b from node_a(val=3) if i == 2{ for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,5):+> node_b(value=j+10); + end +:MyEdge:val=random.randint(1,5):+> node_a(value=j+10); } - } } #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { - end +:MyEdge:val=random.randint(1,5):+> node_b(value=i+5); - print(end._jac_.edges); + end +:MyEdge:val=random.randint(1,15):+> node_a(value=i+5); } visit-->; } :walker:Travelor:can:travel{ + #print the node values that is connected with MyEdge edges of val less than 5 for i in -:MyEdge:val<=5 :->{ - print(i.val); + print(i.value); } visit-->; } - -:node:node_a:can:print_some{ - visit--> ; -} -:node:node_b:can:do{ - visit-->; - } -:node:node_b:can:print_one{ -} - with entry{ spawn Creator(); spawn Travelor(); diff --git a/jaclang/compiler/passes/main/pyast_gen_pass.py b/jaclang/compiler/passes/main/pyast_gen_pass.py index 8d91a9ff5..6fac1990f 100644 --- a/jaclang/compiler/passes/main/pyast_gen_pass.py +++ b/jaclang/compiler/passes/main/pyast_gen_pass.py @@ -2043,7 +2043,9 @@ def translate_edge_op_ref(self, loc: ast3.AST, node: ast.EdgeOpRef) -> ast3.AST: node.filter_type.gen.py_ast if node.filter_type else self.sync(ast3.Constant(value=None)), - node.filter_cond.gen.py_ast if node.filter_cond else self.sync(ast3.Constant(value=None)) + node.filter_cond.gen.py_ast + if node.filter_cond + else self.sync(ast3.Constant(value=None)), ], keywords=[], ) diff --git a/jaclang/core/construct.py b/jaclang/core/construct.py index 6c494121e..e9a178dd1 100644 --- a/jaclang/core/construct.py +++ b/jaclang/core/construct.py @@ -47,14 +47,12 @@ def edges_to_nodes( filter_func = filter_func if filter_func else lambda x: x ret_nodes: list[NodeArchitype] = [] if dir in [EdgeDir.OUT]: - for i in filter_func( - [ - x - for x in self.edges[EdgeDir.OUT] - if x._jac_.target - and (not filter_type or isinstance(x, filter_type)) - ] - ): + 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 = [] diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac index 88a22751c..6c4169ca7 100644 --- a/jaclang/tests/fixtures/edge_ops.jac +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -6,7 +6,6 @@ walker Creator { node node_a{ has val:int; - can print_some with Creator entry; } walker Travelor{ @@ -14,8 +13,6 @@ walker Travelor{ } node node_b{ has value:int; - can do with Travelor entry; - can print_one with Creator entry; } edge MyEdge { @@ -50,16 +47,6 @@ edge MyEdge { visit-->; } - -:node:node_a:can:print_some{ - visit--> ; -} -:node:node_b:can:do{ - visit-->; - } -:node:node_b:can:print_one{ -} - with entry{ random.seed(1); spawn Creator(); diff --git a/jaclang/tests/test_language.py b/jaclang/tests/test_language.py index 38d244914..e0be59460 100644 --- a/jaclang/tests/test_language.py +++ b/jaclang/tests/test_language.py @@ -211,4 +211,6 @@ def test_conn_assign_on_edges(self) -> None: jac_import("edge_ops", self.fixture_abs_path("./")) sys.stdout = sys.__stdout__ stdout_value = captured_output.getvalue() - self.assertEqual(stdout_value.split("\n")[0], "[(2, 5), (1, 3), (1, 4)]") + self.assertEqual(stdout_value.split("\n")[0], "[(3, 5), (14, 1), (5, 1)]") + self.assertEqual(stdout_value.split("\n")[1], "10") + self.assertEqual(stdout_value.split("\n")[2], "12") From 1e1d9ac628783c0545a282983c11cfad262b18c3 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 28 Jan 2024 09:01:43 +0530 Subject: [PATCH 18/20] refactored:connect.jac, edge_ops.jac simplified --- examples/reference/connect_expressions.jac | 31 ++++++++-------------- jaclang/tests/fixtures/edge_ops.jac | 28 ++++++------------- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 7914d0220..74d51b2b6 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -1,14 +1,11 @@ import:py random; -walker Creator { - can create with ` entry; -} - node node_a{ has value:int; } -walker Travelor{ +walker Creator { + can create with ` entry; can travel with `|node_a entry; } @@ -18,22 +15,16 @@ edge MyEdge { :walker:Creator:can:create{ end = ; - for i = 0 to i<5 by i+=1{ - end ++> end := node_a(value=i+1); - #connect three nodes of node_b from node_a(val=3) - if i == 2{ - for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,5):+> node_a(value=j+10); - } + for i = 0 to i<8 by i+=1{ + if i % 2 == 0{ + end ++> end := node_a(value=i+1); + } + else{ + end +:MyEdge:val=random.randint(1,8):+> node_a(value=i+10); } } - #connect 3 nodes of node_b from the last node_a created - for i=0 to i<3 by i+=1 { - end +:MyEdge:val=random.randint(1,15):+> node_a(value=i+5); - } - visit-->; } -:walker:Travelor:can:travel{ +: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 :->{ print(i.value); @@ -42,7 +33,7 @@ edge MyEdge { } with entry{ + random.seed(3); spawn Creator(); - spawn Travelor(); - #._jac_.gen_dot(); + #print(._jac_.gen_dot()); } \ No newline at end of file diff --git a/jaclang/tests/fixtures/edge_ops.jac b/jaclang/tests/fixtures/edge_ops.jac index 6c4169ca7..5eea5633f 100644 --- a/jaclang/tests/fixtures/edge_ops.jac +++ b/jaclang/tests/fixtures/edge_ops.jac @@ -1,19 +1,13 @@ import:py random; -walker Creator { - can create with ` entry; -} - node node_a{ - has val:int; + has value:int; } -walker Travelor{ +walker Creator { + can create with ` entry; can travel with `|node_a entry; } -node node_b{ - has value:int; -} edge MyEdge { has val:int =5, @@ -23,24 +17,19 @@ edge MyEdge { :walker:Creator:can:create{ end = ; for i = 0 to i<5 by i+=1{ - end ++> end := node_a(val=i+1); - #connect three nodes of node_b from node_a(val=3) + end ++> end := node_a(value=i+1); if i == 2{ for j=0 to j<3 by j+=1 { - end +:MyEdge:val=random.randint(1,15), val2=random.randint(1,5):+> node_b(value=j+10); + end +:MyEdge:val=random.randint(1,15), val2=random.randint(1,5):+> node_a(value=j+10); } print([(i.val, i.val2) for i in list(end._jac_.edges.values())[1]]); } } - - #connect 3 nodes of node_b from the last node_a created for i=0 to i<3 by i+=1 { - end +:MyEdge:val=random.randint(1,20):+> node_b(value=i+5); + end +:MyEdge:val=random.randint(1,20):+> node_a(value=i+5); } - - visit-->; } -:walker:Travelor:can:travel{ +:walker:Creator:can:travel{ for i in -:MyEdge:val<=5:-> { print(i.value); } @@ -50,6 +39,5 @@ edge MyEdge { with entry{ random.seed(1); spawn Creator(); - spawn Travelor(); - #._jac_.gen_dot(); + #print(._jac_.gen_dot()); } \ No newline at end of file From b65b7f392d27885a8a01d2ba17510c36f22a29b8 Mon Sep 17 00:00:00 2001 From: Sarujan1999 Date: Sun, 28 Jan 2024 09:04:53 +0530 Subject: [PATCH 19/20] removed data spatial references --- .../reference/data_spatial_references.jac | 35 ------------ examples/reference/data_spatial_references.py | 54 ------------------- 2 files changed, 89 deletions(-) diff --git a/examples/reference/data_spatial_references.jac b/examples/reference/data_spatial_references.jac index 7f8b42e5c..b28b04f64 100644 --- a/examples/reference/data_spatial_references.jac +++ b/examples/reference/data_spatial_references.jac @@ -1,38 +1,3 @@ -import:py random; -node MyNode { - has value: int; - -} -edge MyEdge { - has val:int =5; -} -walker Walk { - #has count: int = 0; - can create with ` entry; - can do_something with ` entry; -} - -:walker:Walk:can:create{ - for i=0 to i<5 by i+=1 { - +:MyEdge:val=random.randint(1,10):+> MyNode(value=i+1); - # ++> MyNode(value=i+1); - } - visit -->; -} -:walker:Walk:can:do_something{ - for i in -:MyEdge:val<=5 :->{ - print(i.val); - } - print("Hello"); - visit -->; -} - - -with entry { - spawn Walk(); - ._jac_.gen_dot(); - -} diff --git a/examples/reference/data_spatial_references.py b/examples/reference/data_spatial_references.py index de72c18ff..8b1378917 100644 --- a/examples/reference/data_spatial_references.py +++ b/examples/reference/data_spatial_references.py @@ -1,55 +1 @@ -from __future__ import annotations -from jaclang.plugin.feature import JacFeature as jac -import random - -@jac.make_architype("node", on_entry=[], on_exit=[]) -class MyNode: - value: int - - -@jac.make_architype("edge", on_entry=[], on_exit=[]) -class MyEdge: - val: int = 5 - - -@jac.make_architype( - "walker", - on_entry=[ - jac.DSFunc("create", jac.RootType), - jac.DSFunc("do_something", jac.RootType), - ], - on_exit=[], -) -class Walk: - def create(self, walker_here: jac.RootType) -> None: - i = 0 - while i < 5: - jac.connect( - jac.get_root(), - MyNode(value=i + 1), - jac.build_edge( - jac.EdgeDir.OUT, MyEdge, (("val",), (random.randint(1, 10),)) - ), - ) - jac.connect( - walker_here, - MyNode(value=i + 1), - jac.build_edge(jac.EdgeDir.OUT, None, None), - ) - i += 1 - if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): - pass - - def do_something(self, walker_here: jac.RootType) -> None: - for i in (lambda x: [i for i in x if i.val <= 5])( - jac.edge_ref(walker_here, jac.EdgeDir.OUT, MyEdge) - ): - print(i.val) - print("Hello") - if jac.visit_node(self, jac.edge_ref(walker_here, jac.EdgeDir.OUT, None)): - pass - - -jac.spawn_call(jac.get_root(), Walk()) -# jac.get_root()._jac_.gen_dot() From 1dd336995e087ad92de116538831d7f3484e2b13 Mon Sep 17 00:00:00 2001 From: marsninja Date: Sun, 28 Jan 2024 08:40:55 -0500 Subject: [PATCH 20/20] refactor: finalizing edge fix pr --- examples/reference/connect_expressions.jac | 20 +++---- jaclang/core/construct.py | 54 ++++++++++++------- jaclang/plugin/feature.py | 2 +- jaclang/plugin/spec.py | 2 +- jaclang/tests/fixtures/gendot_bubble_sort.jac | 2 +- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/examples/reference/connect_expressions.jac b/examples/reference/connect_expressions.jac index 74d51b2b6..38c32679e 100644 --- a/examples/reference/connect_expressions.jac +++ b/examples/reference/connect_expressions.jac @@ -1,39 +1,31 @@ -import:py random; - node node_a{ has value:int; } - walker Creator { can create with ` entry; can travel with `|node_a entry; } - edge MyEdge { has val:int =5; } - :walker:Creator:can:create{ end = ; - 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); spawn Creator(); - #print(._jac_.gen_dot()); + # print(._jac_.gen_dot()); } \ No newline at end of file diff --git a/jaclang/core/construct.py b/jaclang/core/construct.py index e9a178dd1..f4680d62a 100644 --- a/jaclang/core/construct.py +++ b/jaclang/core/construct.py @@ -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.""" diff --git a/jaclang/plugin/feature.py b/jaclang/plugin/feature.py index 6824a5dbe..927afca9b 100644 --- a/jaclang/plugin/feature.py +++ b/jaclang/plugin/feature.py @@ -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( diff --git a/jaclang/plugin/spec.py b/jaclang/plugin/spec.py index 5d980f2bb..0cab0b3bd 100644 --- a/jaclang/plugin/spec.py +++ b/jaclang/plugin/spec.py @@ -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 diff --git a/jaclang/tests/fixtures/gendot_bubble_sort.jac b/jaclang/tests/fixtures/gendot_bubble_sort.jac index 2eb934aea..68f93f177 100644 --- a/jaclang/tests/fixtures/gendot_bubble_sort.jac +++ b/jaclang/tests/fixtures/gendot_bubble_sort.jac @@ -57,5 +57,5 @@ with entry{ spawn walker1(); spawn walker2(); spawn walker3(); - ._jac_.gen_dot(); + print(._jac_.gen_dot()); } \ No newline at end of file