Skip to content
Snippets Groups Projects
Commit d529747a authored by Derval Guillaume's avatar Derval Guillaume
Browse files

Node/hyperedge generators

parent 7e36d447
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,7 @@ __all__ = [ ...@@ -6,7 +6,7 @@ __all__ = [
"StdConstraint", "SOSConstraint", "Objective", "VariableDefinition", "Node", "StdConstraint", "SOSConstraint", "Objective", "VariableDefinition", "Node",
"HyperEdge", "NodeDefinition", "NodeImport", "HyperEdgeDefinition", "HyperEdgeImport", "HyperEdge", "NodeDefinition", "NodeImport", "HyperEdgeDefinition", "HyperEdgeImport",
"ExpressionOp", "GBOMLGraph", "ImplicitLoop", "RValue", "RValueWithGen", "GeneratedRValue", "ExpressionOp", "GBOMLGraph", "ImplicitLoop", "RValue", "RValueWithGen", "GeneratedRValue",
"Range", "MultiLoop", "DictEntry", "Dictionary" "Range", "MultiLoop", "DictEntry", "Dictionary", "NodeGenerator", "HyperEdgeGenerator"
] ]
from gboml.ast.arrays import * from gboml.ast.arrays import *
......
from dataclasses import dataclass from dataclasses import dataclass
from gboml.ast import Loop
from gboml.ast.base import GBOMLObject from gboml.ast.base import GBOMLObject
from gboml.ast.constraints import Constraint from gboml.ast.constraints import Constraint
from gboml.ast.path import VarOrParam from gboml.ast.path import VarOrParam
...@@ -18,6 +19,14 @@ class HyperEdgeDefinition(HyperEdge): ...@@ -18,6 +19,14 @@ class HyperEdgeDefinition(HyperEdge):
constraints: list[Constraint] constraints: list[Constraint]
@dataclass
class HyperEdgeGenerator(HyperEdge):
name: VarOrParam
loop: Loop
parameters: list[Definition]
constraints: list[Constraint]
@dataclass @dataclass
class HyperEdgeImport(HyperEdge): class HyperEdgeImport(HyperEdge):
name: str name: str
......
from dataclasses import dataclass from dataclasses import dataclass
from gboml.ast import Loop
from gboml.ast.base import GBOMLObject from gboml.ast.base import GBOMLObject
from gboml.ast.constraints import Constraint from gboml.ast.constraints import Constraint
from gboml.ast.path import VarOrParam from gboml.ast.path import VarOrParam
...@@ -24,6 +25,18 @@ class NodeDefinition(Node): ...@@ -24,6 +25,18 @@ class NodeDefinition(Node):
objectives: list[Objective] objectives: list[Objective]
@dataclass
class NodeGenerator(Node):
name: VarOrParam
loop: Loop
parameters: list[Definition]
nodes: list[Node]
hyperedges: list[HyperEdge]
variables: list[VariableDefinition]
constraints: list[Constraint]
objectives: list[Objective]
@dataclass @dataclass
class NodeImport(Node): class NodeImport(Node):
name: str name: str
......
...@@ -25,7 +25,7 @@ _program: node | hyperedge ...@@ -25,7 +25,7 @@ _program: node | hyperedge
// NODES // NODES
?node: node_definition | node_import ?node: node_definition | node_import
node_definition: "#NODE" ID \ node_definition: "#NODE" var_or_param [loop] \
parameters_block \ parameters_block \
program_block \ program_block \
variables_block \ variables_block \
...@@ -45,7 +45,7 @@ variable_scope_change: ID SCOPE ";" ...@@ -45,7 +45,7 @@ variable_scope_change: ID SCOPE ";"
// HYPEREDGES // HYPEREDGES
?hyperedge: hyperedge_definition | hyperedge_import ?hyperedge: hyperedge_definition | hyperedge_import
hyperedge_definition: "#HYPEREDGE" ID \ hyperedge_definition: "#HYPEREDGE" var_or_param [loop] \
parameters_block \ parameters_block \
constraints_block constraints_block
......
...@@ -61,7 +61,6 @@ def _lark_to_gboml(tree: Tree, filename: Optional[str] = None) -> GBOMLGraph: ...@@ -61,7 +61,6 @@ def _lark_to_gboml(tree: Tree, filename: Optional[str] = None) -> GBOMLGraph:
# obj(*children, meta=meta) # obj(*children, meta=meta)
# #
to_obj = { to_obj = {
"hyperedge_definition": HyperEdgeDefinition,
"hyperedge_import": HyperEdgeImport, "hyperedge_import": HyperEdgeImport,
"definition": Definition, "definition": Definition,
"var_or_param_leaf": VarOrParamLeaf, "var_or_param_leaf": VarOrParamLeaf,
...@@ -119,13 +118,31 @@ def _lark_to_gboml(tree: Tree, filename: Optional[str] = None) -> GBOMLGraph: ...@@ -119,13 +118,31 @@ def _lark_to_gboml(tree: Tree, filename: Optional[str] = None) -> GBOMLGraph:
def program_block(self, meta: Meta, *childrens: list[Node | HyperEdge]) -> NodesAndHyperEdges: def program_block(self, meta: Meta, *childrens: list[Node | HyperEdge]) -> NodesAndHyperEdges:
return self.NodesAndHyperEdges([x for x in childrens if isinstance(x, Node)], [x for x in childrens if isinstance(x, HyperEdge)]) return self.NodesAndHyperEdges([x for x in childrens if isinstance(x, Node)], [x for x in childrens if isinstance(x, HyperEdge)])
def node_definition(self, meta: Meta, name: str, param_block: list[Definition], subprogram_block: NodesAndHyperEdges, def hyperedge_definition(self, meta: Meta, name: VarOrParam, loop: Optional[Loop], param_block: list[Definition], constraint_block: list[Constraint]):
if loop is None:
if len(name.path) != 1 or len(name.path[0].indices) != 0:
raise Exception(f"Invalid name for node: {name}")
return HyperEdgeDefinition(name.path[0].name, param_block, constraint_block, meta=meta)
else:
return HyperEdgeGenerator(name, loop, param_block, constraint_block, meta=meta)
def node_definition(self, meta: Meta, name: VarOrParam, loop: Optional[Loop], param_block: list[Definition], subprogram_block: NodesAndHyperEdges,
variable_block: list[VariableDefinition], constraint_block: list[Constraint], variable_block: list[VariableDefinition], constraint_block: list[Constraint],
objectives_block: list[Objective]): objectives_block: list[Objective]):
return NodeDefinition(name, param_block, if loop is None:
subprogram_block.nodes, subprogram_block.hyperedges, if len(name.path) != 1 or len(name.path[0].indices) != 0:
variable_block, constraint_block, raise Exception(f"Invalid name for node: {name}")
objectives_block, meta=meta) return NodeDefinition(name.path[0].name,
param_block,
subprogram_block.nodes, subprogram_block.hyperedges,
variable_block, constraint_block,
objectives_block, meta=meta)
else:
return NodeGenerator(name, loop,
param_block,
subprogram_block.nodes, subprogram_block.hyperedges,
variable_block, constraint_block,
objectives_block, meta=meta)
def node_import(self, meta: Meta, name: str, imported_name: VarOrParam, imported_from: str, redef: list[ScopeChange | Definition]): def node_import(self, meta: Meta, name: str, imported_name: VarOrParam, imported_from: str, redef: list[ScopeChange | Definition]):
return NodeImport(name, imported_name, imported_from, return NodeImport(name, imported_name, imported_from,
......
...@@ -13,6 +13,10 @@ ...@@ -13,6 +13,10 @@
a = 2; a = 2;
b external; b external;
c internal; c internal;
#NODE nodeL[i] for i in [0:10]
#VARIABLES
#HYPEREDGE E[i] for i in [0:10]
#CONSTRAINTS
#NODE node1 #NODE node1
#PARAMETERS #PARAMETERS
a = 2; a = 2;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment