Skip to content

Commit 7db326b

Browse files
Merge pull request #194 from cyrillemidingoyi/release
update py to Crop2ml
2 parents 68d403a + 06f0726 commit 7db326b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2305
-82
lines changed

src/pycropml/transpiler/antlr_py/csharp/csharp_preprocessing.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def action_assignment(self, tree):
115115
self.env[-1][t_name] = type_
116116

117117

118-
if tree.op != "=":
118+
if "op" in dir(tree) and tree.op != "=":
119119
if t_name not in self.current_scope:
120120
self.inputs.append(t_name)
121121

@@ -155,22 +155,18 @@ def action_if_statement(self, tree):
155155
self.transform(tree.test)
156156
self.transform(tree.block)
157157
m1 = self.env[-1]
158-
print("pppppp", m1)
159158
self.env.pop()
160159
self.current_scope = self.current()
161160

162161
if tree.otherwise:
163162
self.env.append({})
164163
self.transform(tree.otherwise)
165164
m2 = self.env[-1]
166-
print("nnnnnnnn", m2)
167165
self.env.pop()
168166
common_keys = m1.keys( ) & m2.keys()
169167
common_dict = {k:m1[k] for k in common_keys}
170168
self.env[-1].update(common_dict)
171-
self.current_scope = self.current()
172-
print("iiiii", self.inputs)
173-
print("ifff", self.current_scope)
169+
self.current_scope = self.current()
174170
return tree
175171

176172
#def action_elseif_statement(self, tree):

src/pycropml/transpiler/antlr_py/dssat/run.py

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ def translate(node, asgt, imports, inout=[], index=[]):
7676
r = z.process(h)
7777

7878

79-
return translate_simple(r, total_tree=asgt)
79+
return r
8080

81-
def translate_simple(r, total_tree=None):
81+
def translate_simple(r, total_tree=None, var = []):
8282
""" Transform the ASG of Fortran code in the Common Model Representation that is transformed into CyML
8383
8484
Args:
@@ -87,7 +87,7 @@ def translate_simple(r, total_tree=None):
8787
Returns:
8888
str: The generated CyML code
8989
"""
90-
cd = f90_cyml.F90_Cyml_ast(r, treeG=total_tree)
90+
cd = f90_cyml.F90_Cyml_ast(r, treeG=total_tree, var = var)
9191
hh = cd.transform()
9292
nd = transform_to_syntax_tree(hh)
9393
codes = writeCyml(nd)
@@ -209,7 +209,7 @@ def run_dssat(component, package):
209209
newinputs.append(d.decl[0])
210210

211211
inout = modunit_asg[0].inputs_name + modunit_asg[0].outputs_name + attrname
212-
212+
213213
ass = Assignment()
214214
node2=ass.process(node_w_attrib)
215215
l = Local()
@@ -225,7 +225,6 @@ def run_dssat(component, package):
225225
if inp.name in input1 and inp.name not in modunit_asg[0].indexnames :
226226
inputs1.append(inp)
227227

228-
229228
initialization = extraction(res[0] , init_tags[0],init_tags[1])
230229
ratecalculation = extraction(res[0] , rates_tags[0],rates_tags[1])
231230
statecalculation = extraction(res[0] , states_tags[0],states_tags[1])
@@ -247,49 +246,72 @@ def run_dssat(component, package):
247246
algop = False
248247
ratep = False
249248
statep = False
249+
init_outputs = []
250+
v = []
250251

251-
if initialization:
252-
initv = True
253-
metainfo_init = {"name": f"init.{modunit_asg[0].name}", "language":"Cyml", "filename":f"algo/pyx/init.{modunit_asg[0].name}.pyx"}
254-
initialization = initialization[0] +endline + endconstruct
255-
comments_init = fortrancomments(initialization)
256-
initialization_dictasg = to_dictASG(initialization, language,comments_init, env = modunit_asg[0].env)
257-
initialization_asg = to_CASG(initialization_dictasg)
258-
codes_init = translate(decl+initialization_asg,asgt,imports, inout=inout, index = modunit_asg[0].indexnames)
259-
260-
261252
if algoPart:
262253
algop = True
263254
algoPart = algoPart[0] + endline + endconstruct
264255
comments_compute = fortrancomments(algoPart)
265256
algoPart_dictasg = to_dictASG(algoPart, language,comments_compute, env = modunit_asg[0].env)
266257
algoPart_asg = to_CASG(algoPart_dictasg)
267-
codes_compute = translate(decl+algoPart_asg,asgt,imports,inout=inout, index = modunit_asg[0].indexnames)
268-
258+
r = translate(decl+algoPart_asg,asgt,imports,inout=inout, index = modunit_asg[0].indexnames)
269259

270260
if ratecalculation:
271261
ratep = True
272262
ratecalculation = ratecalculation[0] + endline + endconstruct
273263
comments_rate = fortrancomments(ratecalculation)
274264
ratecalculation_dictasg = to_dictASG(ratecalculation, language,comments_rate, env = modunit_asg[0].env)
275265
ratecalculation_asg = to_CASG(ratecalculation_dictasg)
276-
codes_rates = translate(decl+ratecalculation_asg,asgt,imports,inout=inout, index = modunit_asg[0].indexnames)
266+
g = Call_stmt(trees=asgt)
267+
h = g.process(ratecalculation_asg)
268+
from pycropml.transpiler.antlr_py.csharp.csharp_preprocessing import CheckingInOut
269+
zz = CheckingInOut( {},isAlgo = True)
270+
r_ch = zz.process(h)
271+
index = list(set(modunit_asg[0].indexnames).intersection(set(zz.inputs) ))
272+
r = translate(decl + ratecalculation_asg,asgt,imports,inout=inout, index = index)
273+
var = list(set(zz.inputs) - set(index))
274+
print(var)
275+
x = list(set(var)-set([m.name for m in model_inputs]))
276+
277+
for i in x:
278+
v.append(extr2.getDeclaration(asgt, i))
279+
codes_rates = translate_simple(r, total_tree=asgt, var = var)
277280

278281
if statecalculation:
279282
statep = True
280283
statecalculation = statecalculation[0] + endline + endconstruct
281284
comments_state = fortrancomments(statecalculation)
282285
statecalculation_dictasg = to_dictASG(statecalculation, language,comments_state, env = modunit_asg[0].env)
283286
statecalculation_asg = to_CASG(statecalculation_dictasg)
284-
codes_states = translate(decl+statecalculation_asg,asgt,imports,inout=inout, index = modunit_asg[0].indexnames)
285-
287+
r, codes_states = translate(decl+statecalculation_asg,asgt,imports,inout=inout, index = modunit_asg[0].indexnames)
288+
289+
if initialization:
290+
initv = True
291+
metainfo_init = {"name": f"init.{modunit_asg[0].name}", "language":"Cyml", "filename":f"algo/pyx/init.{modunit_asg[0].name}.pyx"}
292+
initialization = initialization[0] +endline + endconstruct
293+
comments_init = fortrancomments(initialization)
294+
initialization_dictasg = to_dictASG(initialization, language,comments_init, env = modunit_asg[0].env)
295+
initialization_asg = to_CASG(initialization_dictasg)
296+
297+
from pycropml.transpiler.antlr_py.csharp.csharp_preprocessing import CheckingInOut
298+
zz = CheckingInOut( {},isAlgo = True)
299+
r_ch = zz.process(initialization_asg)
300+
index = list(set(modunit_asg[0].indexnames).intersection(set(zz.inputs) ))
301+
init_outputs = zz.outputs
302+
r = translate(decl + initialization_asg,asgt,imports,inout=inout, index = index)
303+
#var = list(set(zz.inputs) - set(index))
304+
var = [n.name for n in model_inputs+v]
305+
codes_init = translate_simple(r, total_tree=asgt, var=var)
306+
307+
286308
metainfo = extractMetaInfo(mod, "!")
287309
inp_info = []
288310
out_info = []
289311

290312
metainfo2 = copy.deepcopy(metainfo)
291313
mm = []
292-
for inp in model_inputs:
314+
for inp in model_inputs+v:
293315
res = {}
294316
if inp.name in metainfo.keys() and inp.name not in mm:
295317
res["name"] = inp.name

src/pycropml/transpiler/antlr_py/fortran/fortranTransformer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,7 @@ def visit_assignmentstmt(self, node, label, NAME, sFExprListRef, substringRange,
12621262
'elements': [res["value"]]},
12631263
'right': self.type_env['arrays'][res["target"]["name"]],
12641264
'pseudo_type': ['list', type_]},
1265-
'pseudo_type': type_}
1265+
'pseudo_type': ["array",type_]}
12661266
if self.recursive and str(NAME)==self.out:
12671267
return {"type":"implicit_return",
12681268
"value": res["value"],

src/pycropml/transpiler/antlr_py/python/pythonExtraction.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pycropml.transpiler.antlr_py.extract_metadata_from_comment import ExtractComments, extract_compo
66
from pycropml.transpiler.antlr_py.extraction import ExtractComments
77
from openalea.core.pkgmanager import PackageManager
8+
from pycropml.transpiler.antlr_py.codeExtraction import extraction
89
import re
910

1011

@@ -21,7 +22,51 @@ def retrievePackage(self, wralea_dir):
2122

2223
def modelunit(self, file, tree):
2324
pass
25+
26+
def getMethod(self, tree):
27+
self.getTypeNode(tree, "function_definition")
28+
return self.getTree
2429

25-
def modelcomposition(self, wf, mu_names):
26-
pass
30+
def modelcomposition(self, file, models, tree):
31+
self.mc = extract_compo(file)
32+
inputlink = []
33+
outputlink = []
34+
inp = {}
35+
#name = re.findall(r'(def\s+.+\()', py_unit)[0].replace("def", "").replace("(", "").strip()
36+
funcs = self.getMethod(tree)
37+
algo = [f for f in funcs if f.name.startswith("model")]
38+
self.getTypeNode(algo[0].block,"custom_call")
39+
call = self.getTree
40+
self.mc.model = [c.function.split("model_")[-1] for c in call]
41+
inps, outs = [], []
42+
md = [n for m in self.mc.model for n in models if m.lower() == n.name.split("model_")[-1].lower()]
43+
self.mc.model = [n.name for n in md]
44+
inps = [n.name for m in md for n in m.inputs ]
45+
outs = [n.name for m in md for n in m.outputs ]
46+
m_in = set(inps) - set(outs)
47+
z = {}
48+
internallink= []
49+
for m in md:
50+
vi = list(set([n.name for n in m.inputs ]).intersection(m_in))
51+
vo = [n.name for n in m.outputs]
52+
for v in vi:
53+
inputlink.append({"target": m.name + "." + v, "source":v})
54+
for v in vo: z.update({v:m.name})
55+
56+
for k, v in z.items():
57+
outputlink.append({"source": v + "." + k, "target":k})
58+
59+
for i in range(0, len(md)-1):
60+
mi = md[i]
61+
for j in range(i+1, len(md)):
62+
mj = md[j]
63+
vi = list(set([n.name for n in mi.outputs ]).intersection(set([n.name for n in mj.inputs ])))
64+
if vi:
65+
for k in vi:
66+
internallink.append({"source": mi.name + "." + k, "target":mj.name + "." + k})
67+
68+
self.mc.inputlink = inputlink
69+
self.mc.outputlink = outputlink
70+
self.mc.internallink = internallink
71+
return self.mc
2772

src/pycropml/transpiler/antlr_py/python/pythonTransformer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,6 @@ def _translate_builtin_call(self, namespace, function, args, location, attrib):
10531053
prepare_table(TYPED_API[namespace], ORIGINAL_METHODS.get(namespace)).strip()))
10541054

10551055
elif not isinstance(api, dict):
1056-
print(args)
10571056
z = api.expand(args)
10581057
if attrib == 1:
10591058
z["attrib"] = 1

src/pycropml/transpiler/antlr_py/python/run.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def run_python(components, package):
6161
package_name = m[0] +"." + "".join(m[1:])
6262

6363
mu_names = []
64+
models = []
6465
for k, v in files.items():
6566
if v not in [composite]:
6667
print(v)
@@ -88,11 +89,14 @@ def run_python(components, package):
8889

8990
if py_units:
9091
for py_unit in py_units:
92+
9193
# match def ...() # retrieve the name
9294
name = re.findall(r'(def\s+.+\()', py_unit)[0].replace("def", "").replace("(", "").strip()
9395
# extract algorithm of each py_unit using file_asg, the name of the unit
9496
meth = z.getmethod(file_asg, name, True)
95-
97+
98+
99+
96100
mdata = extract(meth.doc) # create a ModelUnit object (description, inputs and outputs). After we complete with other info
97101
#print(mdata.description.ExtendedDescription, "babfsdvhsdbvjsbvbsjvjskdfbv")
98102

@@ -150,4 +154,13 @@ def run_python(components, package):
150154
break
151155
else:
152156
generate_unitfile(package, mdata, package_name)
153-
157+
models.append(mdata)
158+
159+
with open(composite, "r") as f:
160+
code = f.read()
161+
res_compo = extraction(code, modeltag_begin,modeltag_end)
162+
compo_dictasg = to_dictASG(res_compo[0] , "py")
163+
compo_asg = to_CASG(compo_dictasg)
164+
mc = op_extr.modelcomposition(res_compo[0], models, compo_asg)
165+
generate_compositefile(package, mc, package_name)
166+

src/pycropml/transpiler/antlr_py/simplace/simplaceExtraction.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -239,25 +239,26 @@ def modelcomposition(self, xfile, models):
239239
outputs = []
240240
for el in list(root):
241241
for l in list(el):
242-
mu_name = l.attrib["id"]
243-
mods.append(mu_name)
244-
for j in list(l):
245-
attr = j.attrib
246-
if j.tag == "input" and "source" in attr:
247-
id = attr["id"]
248-
var = attr["source"].split(".")[-1]
249-
mod = attr["source"].split(".")[0]
250-
if mod == name or mod not in mods:
251-
self.mc.inputlink.append({"target": mu_name + "." + id, "source":var})
252-
inputs.append(var)
253-
elif mod in mods:
254-
self.mc.internallink.append({"source": mod + "." + var, "target":mu_name + "." + id})
255-
elif j.tag == "output":
256-
id = attr["id"]
257-
var = attr["destination"].split(".")[-1]
258-
mod = attr["destination"].split(".")[0]
259-
self.mc.outputlink.append({"source": mu_name + "." + id, "target":var})
260-
outputs.append(var)
242+
if l.tag=="simcomponent":
243+
mu_name = l.attrib["id"]
244+
mods.append(mu_name)
245+
for j in list(l):
246+
attr = j.attrib
247+
if j.tag == "input" and "source" in attr:
248+
id = attr["id"]
249+
var = attr["source"].split(".")[-1]
250+
mod = attr["source"].split(".")[0]
251+
if mod == name or mod not in mods:
252+
self.mc.inputlink.append({"target": mu_name + "." + id, "source":var})
253+
inputs.append(var)
254+
elif mod in mods:
255+
self.mc.internallink.append({"source": mod + "." + var, "target":mu_name + "." + id})
256+
elif j.tag == "output":
257+
id = attr["id"]
258+
var = attr["destination"].split(".")[-1]
259+
mod = attr["destination"].split(".")[0]
260+
self.mc.outputlink.append({"source": mu_name + "." + id, "target":var})
261+
outputs.append(var)
261262
self.mc.model = mods
262263
for m in models:
263264
for n in m.inputs:

src/pycropml/transpiler/generators/biomaGenerator.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ def TestPostConditions(self, node):
289289
self.open(node)
290290
self.write("//Set current values of the outputs to the static VarInfo representing the output properties of the domain classes")
291291
for out in self.model.outputs:
292+
print(out.name)
292293
self.newline(node)
293294
self.write('%s%s.DomainClass.%s%sVarInfo.%s.CurrentValue=%s.%s;'%(self.customer,self.name, self.name, out.variablecategory.capitalize(),out.name,category[out.variablecategory], out.name))
294295
self.newline(node)

0 commit comments

Comments
 (0)