Commit 5c53382f authored by Savva Golubitsky's avatar Savva Golubitsky

Func reworked, Selector added

parent d2596858
...@@ -34,7 +34,8 @@ class Edge(object): ...@@ -34,7 +34,8 @@ class Edge(object):
'_morphism', '_morphism',
'_io_mapping', '_io_mapping',
'preprocess', 'preprocess',
'postprocess' 'postprocess',
'order'
] ]
def __init__(self, predicate, morphism, def __init__(self, predicate, morphism,
io_mapping=InOutMapping(), io_mapping=InOutMapping(),
......
...@@ -2,11 +2,41 @@ import collections ...@@ -2,11 +2,41 @@ import collections
import os import os
from enum import Enum, auto from enum import Enum, auto
from functools import partial from functools import partial
import importlib as imp
import comsdk.aux as aux import comsdk.aux as aux
ImplicitParallelizationInfo = collections.namedtuple('ImplicitParallelizationInfo', ['array_keys_mapping', 'branches_number', 'branch_i']) ImplicitParallelizationInfo = collections.namedtuple('ImplicitParallelizationInfo', ['array_keys_mapping', 'branches_number', 'branch_i'])
class Func():
__slots__ = (
'module',
'func',
'name'
)
def __init__(self, module="", name="", dummy=True,func=None):
self.module = module
self.name = name
if func is not None:
self.func = func
elif dummy:
self.func = lambda data: data
else:
self.func = getattr(imp.import_module(module), name)
def __str__(self):
return "{}.{}()".format(self.module, self.name)
class Selector(Func):
__slots__=(
'ntransf'
)
def __init__(self, ntransf, module="", name="", dummy=True):
self.ntransf = ntransf
super().__init__(module, name, func=(lambda x: [True for i in range(ntransf)]) if dummy else None, dummy=False)
class Transfer: class Transfer:
def __init__(self, edge, output_state, index=None): def __init__(self, edge, output_state, index=None):
self.edge = edge self.edge = edge
...@@ -23,39 +53,6 @@ class IdleRunType(Enum): ...@@ -23,39 +53,6 @@ class IdleRunType(Enum):
INIT = auto() INIT = auto()
CLEANUP = auto() CLEANUP = auto()
# class GraphFactory:
# def __init__(self):
# pass
#
# def create_state():
# pass
#
# def create_edge():
# Here we should somehow pass the argument for "special" edges
# Essentially, we change only io_mapping
# pass
#
# def make_graph():
# pass
'''
class PluralGraphFactory:
def __init__(self, plural_keys_mappings, parallel_graphs_number):
self.plural_keys_mappings = plural_keys_mappings
self.parallel_graphs_number = parallel_graphs_number
self.init_state = None
def create_state(state):
if self.init_state == None:
self.init_state = state
def create_edge():
# Here we should somehow pass the argument for "special" edges
# Essentially, we change only io_mapping
pass
def make_graph():
pass
'''
class PluralState: class PluralState:
def __init__(self, states): def __init__(self, states):
self.states = states self.states = states
......
import re import re
import copy import copy
import comsdk.graph as gr
from comsdk.edge import *
import importlib as imp import importlib as imp
from typing import NamedTuple
from enum import Enum, auto
from comsdk.graph import Graph, Func, State
from comsdk.edge import Edge
# Ключевые слова, описывающие граф
class Params(): class Params():
__slots__=( __slots__=(
'module', 'module',
...@@ -17,7 +14,8 @@ class Params(): ...@@ -17,7 +14,8 @@ class Params():
'function', 'function',
'morphism', 'morphism',
'parallelism', 'parallelism',
'comment' 'comment',
'order'
) )
def __init__(self): def __init__(self):
for slot in self.__slots__: for slot in self.__slots__:
...@@ -29,25 +27,14 @@ class Params(): ...@@ -29,25 +27,14 @@ class Params():
stri += s+": {}, ".format(getattr(self, s)) stri += s+": {}, ".format(getattr(self, s))
return stri return stri
class Func(): entities = {}
__slots__ = (
'module',
'func',
'name'
)
def __init__(self, module, name, func=None):
self.module = module
self.name = name
self.func = lambda data: data if func is None else func
def __str__(self):
return "{}.{}()".format(self.module, self.name)
class GraphFactory(): class GraphFactory():
__slots__ = ( __slots__ = (
'states', 'states',
'graph', 'graph',
'tocpp' 'tocpp',
'entities'
) )
def __init__(self, tocpp=False): def __init__(self, tocpp=False):
self.states = {} self.states = {}
...@@ -57,17 +44,19 @@ class GraphFactory(): ...@@ -57,17 +44,19 @@ class GraphFactory():
if selectorname is not None: if selectorname is not None:
sp = entities[selectorname] sp = entities[selectorname]
if self.tocpp: if self.tocpp:
sel_f = Func(sp.module, sp.entry_func) sel_f = Func(sp.module, sp.entry_func, dummy=True)
else: else:
sel_f = Func(sp.module, sp.entry_func, getattr(imp.import_module(sp.module), sp.entry_func)) sel_f = Func(sp.module, sp.entry_func, getattr(imp.import_module(sp.module), sp.entry_func))
else:
sel_f = Func()
if statename not in self.states: if statename not in self.states:
newstate = gr.State(statename, selector=sel_f) newstate = State(statename, selector=sel_f)
self.states[statename] = newstate self.states[statename] = newstate
def _create_morphism(self, morphname=None): def _create_morphism(self, morphname=None):
if morphname is None: if morphname is None:
return Func("", ""), Func("", "") return Func(), Func()
pred_f, func_f = Func("",""), Func("", "") pred_f, func_f = Func(), Func()
morph = entities[morphname] morph = entities[morphname]
for m in morph.__slots__: for m in morph.__slots__:
if getattr(morph,m) != None: if getattr(morph,m) != None:
...@@ -80,178 +69,172 @@ class GraphFactory(): ...@@ -80,178 +69,172 @@ class GraphFactory():
exit(0) exit(0)
pred = entities[getattr(morph, m)] pred = entities[getattr(morph, m)]
if self.tocpp: if self.tocpp:
pred_f = Func(pred.module, pred.entry_func) pred_f = Func(pred.module, pred.entry_func, dummy=True)
else: else:
pred_f = Func(pred.module, pred.entry_func, getattr(imp.import_module(pred.module), pred.entry_func)) pred_f = Func(pred.module, pred.entry_func)
if m=="function": if m=="function":
if getattr(morph,m) not in entities: if getattr(morph,m) not in entities:
print("\tERROR: Function: {} is not defined!".format(getattr(morph, m))) print("\tERROR: Function: {} is not defined!".format(getattr(morph, m)))
exit(0) exit(0)
fu = entities[getattr(morph, m)] fu = entities[getattr(morph, m)]
if self.tocpp: if self.tocpp:
func_f = Func(fu.module, fu.entry_func) func_f = Func(fu.module, fu.entry_func, dummy=True)
else: else:
func_f = Func(fu.module, fu.entry_func, getattr(imp.import_module(fu.module), fu.entry_func)) func_f = Func(fu.module, fu.entry_func)
return pred_f, func_f return pred_f, func_f
def add_connection(self, st1, st2, morphism=None): def add_connection(self, st1, st2, morphism=None):
pred, entr = self._create_morphism(morphism) pred, entr = self._create_morphism(morphism)
self.states[st1].connect_to(self.states[st2], edge=Edge(pred, entr)) self.states[st1].connect_to(self.states[st2], edge=Edge(pred, entr))
print("{} --{}-{}--> {}".format(st1, pred, entr, st2)) # print("{} --{}-{}--> {}".format(st1, pred, entr, st2))
def build(self): def build(self):
self.graph = gr.Graph(self.states["__BEGIN__"], self.states["__END__"]) self.graph = Graph(self.states["__BEGIN__"], self.states["__END__"])
self.graph.init_graph() self.graph.init_graph()
return self.graph
fact = GraphFactory(tocpp=True) class Parser():
entities = {} __slots__ = (
'entities',
def check_brackets(rawfile): 'fact'
br = 0 )
qu = 0
for char in rawfile:
if char == "[":
br+=1
elif char == "{":
br+=1
elif char == "(":
br+=1
elif char == "]":
br-=1
elif char == "}":
br-=1
elif char == ")":
br-=1
elif char =="\"":
qu+=1
if br!=0 or qu%2!=0:
print("Brackets or quotes do not match! Check your file")
exit(-1)
def split_multiple(param):
res = []
first=True
for s in param.__slots__:
attr = getattr(param,s)
if attr is not None and '|' in attr:
vals = attr.split('|')
for v in vals:
par = copy.copy(param)
setattr(par, s, v)
res.append(par)
return res
def __init__(self, tocpp=True):
self.entities = {}
self.fact = GraphFactory(tocpp=True)
def _check_brackets(self, rawfile):
#Props is line "[proFp=smth, ...]" br = 0
def param_from_props(props): qu = 0
parm = Params() for char in rawfile:
props = props.replace("]", '') if char == "[":
if '(' in props: br+=1
#replaces , in (smth,smth) to ; elif char == "{":
props =props[:props.find('(')]+props[props.find('(')+1:props.find(')')].replace(',','|') br+=1
rs =props.split(r",") #.split(r", ") elif char == "(":
for r in rs: br+=1
r=r.split(r"=", 1) elif char == "]":
if r[0] in parm.__slots__: br-=1
setattr(parm, r[0], r[1]) elif char == "}":
else: br-=1
print("\tERROR:Unknown parameter: "+ r[0]) elif char == ")":
br-=1
elif char =="\"":
qu+=1
if br!=0 or qu%2!=0:
print("Brackets or quotes do not match! Check your file")
exit(-1) exit(-1)
return parm
def param_from_entln(raw):
res = re.split(r"\[", raw, 1)
return res[0], param_from_props(res[1])
def _split_multiple(self,param):
def topology(raw): res = []
spl = re.split(r"\s*(=>|->|\[|\])\s*", raw) first=True
spl = list(filter(lambda x: x!="[" and x!="]" and x!="", spl)) for s in param.__slots__:
left = spl[0].split(",") attr = getattr(param,s)
right = spl[2].split(",") if attr is not None and '|' in attr:
if len(spl)>3: vals = attr.split('|')
param_from_props(spl[3]) for v in vals:
if (len(left)>1) and (len(right)>1): par = copy.copy(param)
print("ERROR:Ambigious multiple connection in line:\n\t{}".format(raw)) setattr(par, s, v)
exit() res.append(par)
# many to one conection return res
elif len(left)>1:
p = param_from_props(spl[3]) #Props is line "[proFp=smth, ...]"
morphs = split_multiple(p) def _param_from_props(self,props):
if len(morphs)!=len(left): parm = Params()
print("\tERROR:Count of edges do not match to count of states in many to one connection!\n\t\t{}".format(raw)) props = props.replace("]", '')
exit() if '(' in props:
fact.add_state(right[0]) #replaces , in (smth,smth) to ;
for i, st in enumerate(left): props =props[:props.find('(')]+props[props.find('(')+1:props.find(')')].replace(',','|')
fact.add_state(st) rs =props.split(r",") #.split(r", ")
fact.add_connection(st, right[0], morphs[i].morphism) for r in rs:
# one to many connection, here could be selector r=r.split(r"=", 1)
elif len(right)>1: if r[0] in parm.__slots__:
p = param_from_props(spl[3]) setattr(parm, r[0], r[1])
fact.add_state(left[0],selector=p.selector) else:
morphs = split_multiple(p) print("\tERROR:Unknown parameter: "+ r[0])
if len(morphs)!=len(right): exit(-1)
print("\tERROR:Count of edges do not match to count of states in one to many connection!\n\t\t{}".format(raw)) return parm
def _param_from_entln(self, raw):
res = re.split(r"\[", raw, 1)
return res[0], self._param_from_props(res[1])
def _topology(self,raw):
spl = re.split(r"\s*(=>|->|\[|\])\s*", raw)
spl = list(filter(lambda x: x!="[" and x!="]" and x!="", spl))
left = spl[0].split(",")
right = spl[2].split(",")
if len(spl)>3:
self._param_from_props(spl[3])
if (len(left)>1) and (len(right)>1):
print("ERROR:Ambigious multiple connection in line:\n\t{}".format(raw))
exit() exit()
for i, st in enumerate(right): # many to one conection
fact.add_state(st) elif len(left)>1:
fact.add_connection(left[0], st, morphs[i].morphism) p = self._param_from_props(spl[3])
# one to one connection morphs = self._split_multiple(p)
else: if len(morphs)!=len(left):
fact.add_state(left[0]) print("\tERROR:Count of edges do not match to count of states in many to one connection!\n\t\t{}".format(raw))
fact.add_state(right[0]) exit()
if len(spl)==4: self.fact.add_state(right[0])
pr =param_from_props(spl[3]) for i, st in enumerate(left):
fact.add_connection(left[0], right[0], pr.morphism) self.fact.add_state(st)
elif len(spl)==3: self.fact.add_connection(st, right[0], morphs[i].morphism)
fact.add_connection(left[0], right[0], None) # one to many connection, here could be selector
# print(spl) elif len(right)>1:
p = self._param_from_props(spl[3])
self.fact.add_state(left[0],selectorname=p.selector)
file = open("./test.adot", "r") morphs = self._split_multiple(p)
dot = file.read() if len(morphs)!=len(right):
check_brackets(dot) print("\tERROR:Count of edges do not match to count of states in one to many connection!\n\t\t{}".format(raw))
#commts = re.findall(r"\".*\"", dot) exit()
# for i, st in enumerate(right):
dot = re.sub(r"[ \t\r]", "", dot) #deleting all spaces self.fact.add_state(st)
dot = re.sub(r"((digraph\w+\n?)|}|{)", "", dot) self.fact.add_connection(left[0], st, morphs[i].morphism)
dot = re.sub(r"\/\/.*", "", dot) # one to one connection
dot = re.sub(r"^\n$", "", dot) else:
#print("Checking graph...") self.fact.add_state(left[0])
#graphcheck = re.search(r"\A(digraph)\w+\n?{((\/\/)*.*\n*)+}\Z", dot) self.fact.add_state(right[0])
#if graphcheck is None: if len(spl)==4:
# print("Incorrect graph, check syntax!") pr =self._param_from_props(spl[3])
# exit() self.fact.add_connection(left[0], right[0], pr.morphism)
# elif len(spl)==3:
#print("Graph id good, processing!") self.fact.add_connection(left[0], right[0], None)
def parse_file(self, filename):
#dot = re.sub(r"//*$", "", dot) file = open(filename, "r")
dotlines = dot.splitlines() dot = file.read()
dotlines = list(filter(None, dotlines)) self._check_brackets(dot)
dot = re.sub(r"[ \t\r]", "", dot) #deleting all spaces
# ent_re - regular expr for edges, states, functions properties dot = re.sub(r"((digraph\w+\n?)|}|{)", "", dot)
ent_re = re.compile(r"^\w+\[.*\]$") dot = re.sub(r"\/\/.*", "", dot)
# top_re - regular expr for topology properties, most time consuming one dot = re.sub(r"^\n$", "", dot)
top_re = re.compile(r"^(\w+,?)+(->|=>)(\w+,?)+(\[(\w+=(\(?\w+,?\)?)+,?)+\])?") #print("Checking graph...")
# (r"^\w[\w\s,]*(->|=>)\s*\w[\w\s,=\[\]()]*$") #graphcheck = re.search(r"\A(digraph)\w+\n?{((\/\/)*.*\n*)+}\Z", dot)
#if graphcheck is None:
for i, ln in enumerate(dotlines): # print("Incorrect graph, check syntax!")
if ent_re.match(ln): # exit()
name, parm = param_from_entln(ln) #
entities[name] = parm #print("Graph id good, processing!")
elif top_re.match(ln): #dot = re.sub(r"//*$", "", dot)
topology(ln) dotlines = dot.splitlines()
dotlines = list(filter(None, dotlines))
# for e in entities: # ent_re - regular expr for edges, states, functions properties
# print(e, entities[e]) ent_re = re.compile(r"^\w+\[.*\]$")
# # top_re - regular expr for topology properties, most time consuming one
# print("states:\n") top_re = re.compile(r"^(\w+,?)+(->|=>)(\w+,?)+(\[(\w+=(\(?\w+,?\)?)+,?)+\])?")
# for st in fact.states: # (r"^\w[\w\s,]*(->|=>)\s*\w[\w\s,=\[\]()]*$")
# print(st) for i, ln in enumerate(dotlines):
# if ent_re.match(ln):
exit() name, parm = self._param_from_entln(ln)
entities[name] = parm
elif top_re.match(ln):
self._topology(ln)
self.entities = entities
return self.fact.build()
# pars = Parser()
# graph = pars.parse_file("./test.adot")
import comsdk.parser as prs
from comsdk.graph import Selector, Func
p= 5
res = lambda : [True for i in range(p)]
print(res())
# ff = Func(func=lambda x: [True for i in range(p)])
data = {}
sel1 = Selector(3)
sel2 = Selector(3, "selectors", "sel1")
sel3 = Selector(3, "selector", "sel2")
print(sel1)
print(sel2)
print(sel3)
\ No newline at end of file
__BEGIN__ --.()-.()--> INPUT_READY
INPUT_READY --predicate_funcs.predicate_x()-case_gen_funcs.function_1()--> TEPMLATE_COPIED
TEPMLATE_COPIED --predicate_funcs.predicate_y()-case_gen_funcs.function_2()--> NAMES_SUBSTITUTED
NAMES_SUBSTITUTED --predicate_funcs.predicate_x()-case_gen_funcs.function_3()--> CONTENT_SUBSTITUTED
CONTENT_SUBSTITUTED --.()-case_gen_funcs.create_dump()--> DUMP_CREATED
CONTENT_SUBSTITUTED --predicate_funcs.predicate_y()-case_gen_funcs.save_to_db()--> RESULT_SAVED
CONTENT_SUBSTITUTED --predicate_funcs.predicate_x()-case_gen_funcs.save_to_file()--> RESULT_SAVED
RESULT_SAVED --predicate_funcs.predicate_y()-case_gen_funcs.repeat()--> INPUT_READY
RESULT_SAVED --predicate_funcs.predicate_x()-case_gen_funcs.exit()--> __END__
RESULT_SAVED --.()-case_gen_funcs.exit()--> __END__
DUMP_CREATED --case_gen_funcs.check_dump()-case_gen_funcs.exit()--> __END__
...@@ -38,5 +38,5 @@ digraph CODEOBJECT_GENERATOR ...@@ -38,5 +38,5 @@ digraph CODEOBJECT_GENERATOR
// В зависимости от результата вычисления функции-SELECTOR осуществляется переход по // В зависимости от результата вычисления функции-SELECTOR осуществляется переход по
//первому или второму ребру //первому или второму ребру
RESULT_SAVED, DUMP_CREATED -> __END__ [morphism=(EDGE_8, EDGE_9),order=(20,30)] RESULT_SAVED, DUMP_CREATED -> __END__ [morphism=(EDGE_8, EDGE_9),order=(20,30)]
RESULT_SAVED -> INPUT_READY,__END__ [selector=SELECTOR, morphism=(EDGE_6, EDGE_7)] RESULT_SAVED -> INPUT_READY,FAKE,__END__ [selector=SELECTOR, morphism=(EDGE_6,EDGE_1,EDGE_7)]
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment