Skip to content

Commit 152a703

Browse files
Merge pull request #253 from cyrillemidingoyi/newb
Merge pull request #32 from AgriculturalModelExchangeInitiative/master
2 parents 5527c9e + 2eea0ed commit 152a703

File tree

4 files changed

+199
-18
lines changed

4 files changed

+199
-18
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ def visit_class_type(self, node,namespace_or_type_name, OBJECT, DYNAMIC, STRING,
11751175
typ = x[0] if isinstance(x, list) else x
11761176
return {"type":typ, "pseudo_type":x}
11771177
if OBJECT:
1178-
return self.visit(OBJECT)
1178+
return {"type":"object", "pseudo_type":"object"}
11791179
if DYNAMIC:
11801180
return self.visit(DYNAMIC)
11811181
if STRING:
@@ -1225,7 +1225,7 @@ def visit_local_constant_declaration(self, node, CONST, type_, constant_declarat
12251225
typ = self.visit(type_)
12261226
decls = self.visit(constant_declarators)
12271227
for d in decls:
1228-
d["type"] = typ
1228+
d["type"] = typ["pseudo_type"]
12291229
res["decl"].append(d)
12301230
return res
12311231

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ def run_simplace(components, output):
8383
if not isdir(cyml_rep):
8484
cyml_rep.mkdir()
8585
models = []
86+
p = SimplaceExtraction()
87+
auxiliary = p.getAuxiliary(compositeStrat)
8688
for strat in simpleStrat:
8789
print(strat)
8890
with open(strat, "r") as f:
@@ -96,7 +98,7 @@ def run_simplace(components, output):
9698
strAsg = to_CASG(dictasgt)
9799

98100
mm = SimplaceExtraction()
99-
mm.modelunit(strAsg)
101+
mm.modelunit(strAsg, auxiliary)
100102
mm.model.description
101103

102104
names = [ j.name for j in mm.model.inputs + mm.model.outputs]

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def getOutputs(self, tree):
119119
outs = list(map(lambda out: out.instance.name, setouts))
120120
return outs
121121

122-
def modelunit(self, tree):
122+
def modelunit(self, tree, auxiliary):
123123
desc = self.description(tree)
124124
self.model= ModelUnit({"name":desc["name"], "version":"001", "timestep":"1"})
125125
description = self.model_desc(desc)
@@ -149,6 +149,9 @@ def modelunit(self, tree):
149149
elif att == "rate": category = "rate"
150150
elif att == "state": category = "state"
151151
else: category = att.lower()
152+
153+
if auxiliary[self.model.name] and name in auxiliary[self.model.name]:
154+
category = "auxiliary"
152155

153156
if name in ins and name in outnames: category = "state"
154157

@@ -271,7 +274,28 @@ def modelcomposition(self, xfile, models):
271274
return self.mc
272275

273276

274-
277+
def getAuxiliary(self, xfile):
278+
doc = xml.parse(xfile)
279+
root = doc.getroot()
280+
compositeid = root.attrib["class"]
281+
name = compositeid.split(".")[-1]
282+
print("composite name", name)
283+
mods = []
284+
res = {}
285+
for el in list(root):
286+
for l in list(el):
287+
if l.tag=="simcomponent":
288+
mu_name = l.attrib["id"]
289+
mods.append(mu_name)
290+
res[mu_name]=[]
291+
for j in list(l):
292+
attr = j.attrib
293+
if j.tag == "input" and "source" in attr:
294+
id = attr["id"]
295+
mod = attr["source"].split(".")[0]
296+
if mod != name:
297+
res[mu_name].append(id)
298+
return res
275299

276300

277301

src/pycropml/transpiler/generators/rGenerator.py

Lines changed: 168 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from path import Path
88
from pycropml.transpiler.Parser import parser
99
from pycropml.transpiler.ast_transform import AstTransformer, transform_to_syntax_tree
10+
from pycropml.nameconvention import signature2, signature2_from_name
1011

1112
class RGenerator(CodeGenerator, RRules):
1213
"""This class contains the specific properties of
@@ -239,6 +240,70 @@ def visit_function_definition(self, node):
239240
self.newline(extra=1)
240241
self.newline(node)
241242
self.funcname = node.name
243+
if node.name.startswith("init_"):
244+
self.write(f"#' @Title Initialization of the {self.model.description.Title}")
245+
self.newline(1)
246+
for arg in node.params:
247+
for inp in self.model.inputs:
248+
if arg.name == inp.name:
249+
self.write(f"#' @param {inp.name} ({inp.unit}) {inp.description} {inp.parametercategory if 'parametercategory' in dir(inp) else inp.variablecategory} ({inp.default}, {inp.min}-{inp.max}) ")
250+
self.newline(1)
251+
self.write(f"#'")
252+
self.newline(1)
253+
self.write(f"#' @return")
254+
self.newline(1)
255+
for out in self.model.outputs:
256+
if out.variablecategory=="state":
257+
self.write(f"#' \item {out.name} ({out.unit}) {out.description} {out.variablecategory} ({out.min}-{inp.max}) ")
258+
self.newline(1)
259+
self.newline(1)
260+
self.write(f"#'")
261+
self.newline(1)
262+
self.write(f"#' @export")
263+
self.newline(1)
264+
265+
if self.model and node.name.startswith("model_") and node.name.split("model_")[1]==signature(self.model):
266+
print(dir(self.model.description))
267+
self.write(f"#' @Title {self.model.description.Title}")
268+
self.newline(1)
269+
self.write(f"#' @Description {self.model.description.ExtendedDescription}")
270+
self.newline(1)
271+
self.write(f"#' @Authors {self.model.description.Authors} ")
272+
self.newline(1)
273+
self.write(f"#' @Institutions {self.model.description.Institution}")
274+
self.newline(1)
275+
self.write(f"#' @Reference {self.model.description.Reference}")
276+
self.newline(1)
277+
self.write(f"#' @Version {self.model.version}")
278+
self.newline(1)
279+
self.write(f"#'")
280+
self.newline(1)
281+
for inp in self.model.inputs:
282+
self.write(f"#' @param {inp.name} ({inp.unit}) {inp.description} {inp.parametercategory if 'parametercategory' in dir(inp) else inp.variablecategory} ({inp.default}, {inp.min}-{inp.max}) ")
283+
self.newline(1)
284+
self.write(f"#'")
285+
self.newline(1)
286+
self.write(f"#' @return")
287+
self.newline(1)
288+
for out in self.model.outputs:
289+
self.write(f"#' \item {out.name} ({out.unit}) {out.description} {out.variablecategory} ({out.min}-{inp.max}) ")
290+
self.newline(1)
291+
self.write(f"#'")
292+
self.newline(1)
293+
self.write(f"#' @export")
294+
self.newline(1)
295+
296+
297+
298+
"""self.write(self.doc.header)
299+
self.newline(node)
300+
self.write(self.doc.desc)
301+
self.newline(node)
302+
self.write(self.doc.inputs_doc)
303+
self.newline(node)
304+
self.write(self.doc.outputs_doc)
305+
self.newline(node)
306+
self.model = None"""
242307
self.write('%s <- function (' % node.name)
243308
for i, pa in enumerate(node.params):
244309
self.write(pa.name)
@@ -249,16 +314,6 @@ def visit_function_definition(self, node):
249314
self.write(',\n ')
250315
self.write('){')
251316
self.newline(node)
252-
if self.model and node.name.startswith("model_") and node.name.split("model_")[1]==signature(self.model):
253-
self.write(self.doc.header)
254-
self.newline(node)
255-
self.write(self.doc.desc)
256-
self.newline(node)
257-
self.write(self.doc.inputs_doc)
258-
self.newline(node)
259-
self.write(self.doc.outputs_doc)
260-
self.newline(node)
261-
self.model = None
262317
self.body(node.block)
263318
self.newline(node)
264319
self.write("}")
@@ -432,22 +487,122 @@ class RCompo(RGenerator):
432487
for C# languages.
433488
"""
434489
def __init__(self, tree, model=None, name=None):
490+
RGenerator.__init__(self,tree, model, name)
435491
self.tree = tree
436492
self.model = model
437493
self.name = name
438-
RGenerator.__init__(self,tree, model, self.name)
439494
x = os.path.split(self.model.aPath)[0]
440495
z=x.split('\\')#.pop()
441496
z.pop()
442497
sourcePath = "/".join(z)+"/src/r"
443-
self.write("library (gsubfn) ")
444498
self.newline()
445-
self.write("setwd('%s')"%sourcePath)
499+
self.write("#setwd('%s')"%sourcePath)
446500
self.newline()
447501
for m in self.model.model:
448502
self.write("source('%s.r')"%m.name.lower().capitalize())
449503
self.newline()
450504

505+
if not self.model.initialization:
506+
self.newline(1)
507+
self.write(f"#' @Title Initialization of {signature2_from_name(self.model.name)} component")
508+
self.newline(1)
509+
self.write(f"#' ")
510+
self.newline(1)
511+
self.initcomposition(tree)
512+
self.newline(extra=1)
513+
514+
515+
def visit_module(self, node):
516+
self.newline(extra=1)
517+
self.newline(node)
518+
self.visit(node.body)
519+
520+
def initcomposition(self, node):
521+
print(self.model.name)
522+
name = "init_"+ signature2_from_name(self.model.name)
523+
pas = []
524+
inps = []
525+
z = ""
526+
for i, pa in enumerate(self.model.inputlink):
527+
p_source = pa["source"]
528+
p_target = pa["target"].split(".")[1]
529+
for m in self.model.model:
530+
for inp in m.inputs:
531+
n=None
532+
if p_target == inp.name and ("parametercategory" in dir(inp) or inp.variablecategory == "exogenous") and p_target not in pas:
533+
z = z + p_source + ", "
534+
pas.append(p_target)
535+
n = 1
536+
inps.append(inp)
537+
538+
outs = []
539+
for m in self.model.ord:
540+
for mod in self.model.model:
541+
if m == mod.name and "initialization" in dir(mod) and mod.initialization:
542+
for out in mod.outputs:
543+
if out.variablecategory == "state":
544+
outs.append(out)
545+
546+
for inp in inps:
547+
self.write(f"#' @param {inp.name} ({inp.unit}) {inp.description} {inp.parametercategory if 'parametercategory' in dir(inp) else inp.variablecategory} ({inp.default}, {inp.min}-{inp.max}) ")
548+
self.newline(1)
549+
550+
self.write(f"#'")
551+
self.newline(1)
552+
self.write(f"#' @return")
553+
self.newline(1)
554+
for out in outs:
555+
self.write(f"#' \item {out.name} ({out.unit}) {out.description} {out.variablecategory} ({out.min}-{inp.max}) ")
556+
self.newline(1)
557+
558+
self.write(f"#'")
559+
self.newline(1)
560+
self.write(f"#' @export")
561+
self.newline(1)
562+
self.write(f"{name} <- function(")
563+
z = z[:-2]
564+
self.write(z)
565+
566+
self.write("){")
567+
self.newline(1)
568+
self.indentation += 1
569+
states = []
570+
print([{m.name:m.variablecategory} for m in self.model.inputs if "variablecategory" in dir(m)])
571+
for m in self.model.inputs:
572+
if "variablecategory" in dir(m) and (m.variablecategory == "state" or m.variablecategory == "auxiliary"):
573+
states.append(m.name)
574+
print(states)
575+
for n in self.model.diff_in:
576+
# write assignment such as key = value
577+
if self.model.diff_in[n] not in states:
578+
self.write(f"{n} <- {self.model.diff_in[n]}")
579+
self.newline(1)
580+
581+
for m in self.model.ord:
582+
for mod in self.model.model:
583+
if m == mod.name and "initialization" in dir(mod) and mod.initialization:
584+
self.write(f"i_{signature(mod)} <- init_{signature(mod)}(")
585+
par =[]
586+
for inp in mod.inputs:
587+
if "parametercategory" in dir(inp):
588+
par.append(inp.name)
589+
elif inp.variablecategory == "exogenous":
590+
par.append(inp.name)
591+
for i, pa in enumerate(par):
592+
self.write(pa)
593+
if i!= (len(par)-1):
594+
self.write(', ')
595+
self.write(")")
596+
self.newline(1)
597+
598+
self.newline(1)
599+
self.write("return (list (")
600+
self.multValreturn(outs)
601+
self.write("))")
602+
self.indentation -= 1
603+
self.write("}")
604+
605+
451606
def visit_tuple(self,node):
452607
self.write("list[")
453608
for n in node.elements:

0 commit comments

Comments
 (0)