7
7
from path import Path
8
8
from pycropml .transpiler .Parser import parser
9
9
from pycropml .transpiler .ast_transform import AstTransformer , transform_to_syntax_tree
10
+ from pycropml .nameconvention import signature2 , signature2_from_name
10
11
11
12
class RGenerator (CodeGenerator , RRules ):
12
13
"""This class contains the specific properties of
@@ -239,6 +240,70 @@ def visit_function_definition(self, node):
239
240
self .newline (extra = 1 )
240
241
self .newline (node )
241
242
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"""
242
307
self .write ('%s <- function (' % node .name )
243
308
for i , pa in enumerate (node .params ):
244
309
self .write (pa .name )
@@ -249,16 +314,6 @@ def visit_function_definition(self, node):
249
314
self .write (',\n ' )
250
315
self .write ('){' )
251
316
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
262
317
self .body (node .block )
263
318
self .newline (node )
264
319
self .write ("}" )
@@ -432,22 +487,122 @@ class RCompo(RGenerator):
432
487
for C# languages.
433
488
"""
434
489
def __init__ (self , tree , model = None , name = None ):
490
+ RGenerator .__init__ (self ,tree , model , name )
435
491
self .tree = tree
436
492
self .model = model
437
493
self .name = name
438
- RGenerator .__init__ (self ,tree , model , self .name )
439
494
x = os .path .split (self .model .aPath )[0 ]
440
495
z = x .split ('\\ ' )#.pop()
441
496
z .pop ()
442
497
sourcePath = "/" .join (z )+ "/src/r"
443
- self .write ("library (gsubfn) " )
444
498
self .newline ()
445
- self .write ("setwd('%s')" % sourcePath )
499
+ self .write ("# setwd('%s')" % sourcePath )
446
500
self .newline ()
447
501
for m in self .model .model :
448
502
self .write ("source('%s.r')" % m .name .lower ().capitalize ())
449
503
self .newline ()
450
504
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
+
451
606
def visit_tuple (self ,node ):
452
607
self .write ("list[" )
453
608
for n in node .elements :
0 commit comments