-
Notifications
You must be signed in to change notification settings - Fork 305
/
BackendDAEOptimize.mo
5831 lines (5343 loc) · 228 KB
/
BackendDAEOptimize.mo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* This file is part of OpenModelica.
*
* Copyright (c) 1998-2014, Open Source Modelica Consortium (OSMC),
* c/o Linköpings universitet, Department of Computer and Information Science,
* SE-58183 Linköping, Sweden.
*
* All rights reserved.
*
* THIS PROGRAM IS PROVIDED UNDER THE TERMS OF GPL VERSION 3 LICENSE OR
* THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.2.
* ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
* RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GPL VERSION 3,
* ACCORDING TO RECIPIENTS CHOICE.
*
* The OpenModelica software and the Open Source Modelica
* Consortium (OSMC) Public License (OSMC-PL) are obtained
* from OSMC, either from the above address,
* from the URLs: http://www.ida.liu.se/projects/OpenModelica or
* http://www.openmodelica.org, and in the OpenModelica distribution.
* GNU version 3 is obtained from: http://www.gnu.org/copyleft/gpl.html.
*
* This program is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
* IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL.
*
* See the full OSMC Public License conditions for more details.
*
*/
encapsulated package BackendDAEOptimize
" file: BackendDAEOptimize.mo
package: BackendDAEOptimize
description: BackendDAEOptimize contains functions that do some kind of
optimization on the BackendDAE datatype:
- removing simpleEquations
- Tearing/Relaxation
- Linearization
- Inline Integration
- and so on ..."
public import Absyn;
public import BackendDAE;
public import DAE;
public import FCore;
public import HashTable2;
protected
import Algorithm;
import Array;
import BackendDAETransform;
import BackendDAEUtil;
import BackendDump;
import BackendEquation;
import BackendDAEEXT;
import BackendInline;
import BackendVarTransform;
import BackendVariable;
import BaseHashTable;
import CheckModel;
import ClassInf;
import ComponentReference;
import DAEUtil;
import DAEDump;
import Debug;
import Differentiate;
import ElementSource;
import ExpandableArray;
import Expression;
import ExpressionDump;
import ExpressionSolve;
import ExpressionSimplify;
import Error;
import Flags;
import GC;
import HashTableExpToIndex;
import HpcOmTaskGraph;
import List;
import Matching;
import MetaModelica.Dangerous;
import RewriteRules;
import SCode;
import SynchronousFeatures;
import Tearing;
import Types;
import Util;
import Values;
public function simplifyAllExpressions "author: lochel"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE = inDAE;
protected
list<BackendDAE.Equation> removedEqsList = {};
BackendDAE.Shared shared;
algorithm
_ := BackendDAEUtil.traverseBackendDAEExpsNoCopyWithUpdate(outDAE, ExpressionSimplify.simplify1TraverseHelper, 0);
// filter empty algorithms
shared := outDAE.shared;
for eq in BackendEquation.equationList(shared.removedEqs) loop
removedEqsList := match eq
case BackendDAE.ALGORITHM(alg=DAE.ALGORITHM_STMTS(statementLst={})) then removedEqsList;
else eq::removedEqsList;
end match;
end for;
shared.removedEqs := BackendEquation.listEquation(MetaModelica.Dangerous.listReverseInPlace(removedEqsList));
outDAE.shared := shared;
end simplifyAllExpressions;
// =============================================================================
// simplify time independent function calls
//
// public functions:
// - simplifyTimeIndepFuncCalls
// =============================================================================
public function simplifyTimeIndepFuncCalls "author: Frenkel TUD 2012-06
pre(param) -> param
der(param) -> 0.0
change(param) -> false
edge(param) -> false"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE;
algorithm
(outDAE, _) := BackendDAEUtil.mapEqSystemAndFold(inDAE, simplifyTimeIndepFuncCalls0, false);
outDAE := simplifyTimeIndepFuncCallsShared(outDAE);
end simplifyTimeIndepFuncCalls;
protected function simplifyTimeIndepFuncCalls0 "author: Frenkel TUD 2012-06"
input BackendDAE.EqSystem isyst;
input BackendDAE.Shared inShared;
input Boolean inChanged;
output BackendDAE.EqSystem osyst;
output BackendDAE.Shared outShared;
output Boolean outChanged;
algorithm
(osyst, outShared, outChanged) := matchcontinue (isyst, inShared)
local
BackendDAE.Shared shared;
BackendDAE.EqSystem syst;
case (syst, shared)
algorithm
((_, (_, _, true))) := BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate (
syst.orderedEqs, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls,
(shared.globalKnownVars, shared.aliasVars, false))
);
((_, (_, _, true))) := BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate (
syst.removedEqs, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls,
(shared.globalKnownVars, shared.aliasVars, false))
);
then (isyst, inShared, true);
else (isyst, inShared, inChanged);
end matchcontinue;
end simplifyTimeIndepFuncCalls0;
protected function traverserExpsimplifyTimeIndepFuncCalls
input DAE.Exp inExp;
input tuple<BackendDAE.Variables, BackendDAE.Variables, Boolean> inTpl;
output DAE.Exp outExp;
output tuple<BackendDAE.Variables, BackendDAE.Variables, Boolean> outTpl;
algorithm
(outExp, outTpl) := matchcontinue (inExp, inTpl)
local
BackendDAE.Variables globalKnownVars, aliasvars;
DAE.Type tp;
DAE.Exp e, zero;
DAE.ComponentRef cr;
BackendDAE.Var var;
DAE.CallAttributes attr;
Boolean negate;
case (DAE.CALL(path=Absyn.IDENT(name="der"), expLst={DAE.CREF(componentRef=cr, ty=tp)}), (globalKnownVars, aliasvars, _)) equation
(var, _) = BackendVariable.getVarSingle(cr, globalKnownVars);
false = BackendVariable.isVarOnTopLevelAndInput(var);
(zero, _) = Expression.makeZeroExpression(Expression.arrayDimension(tp));
then (zero, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="pre"), expLst={e as DAE.CREF(componentRef=cr)}), (globalKnownVars, aliasvars, _)) equation
(_, _) = BackendVariable.getVarSingle(cr, globalKnownVars);
then(e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="previous"), expLst={e as DAE.CREF(componentRef=cr)}), (globalKnownVars, aliasvars, _)) equation
(_, _) = BackendVariable.getVarSingle(cr, globalKnownVars);
then(e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="pre"), expLst={e as DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time"))}), (globalKnownVars, aliasvars, _))
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="previous"), expLst={e as DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time"))}), (globalKnownVars, aliasvars, _))
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="pre"), expLst={e as DAE.UNARY(DAE.UMINUS(_), DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time")))}), (globalKnownVars, aliasvars, _))
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="previous"), expLst={e as DAE.UNARY(DAE.UMINUS(_), DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time")))}), (globalKnownVars, aliasvars, _))
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="pre"), expLst={DAE.CREF(componentRef=cr, ty=tp)}, attr=attr), (globalKnownVars, aliasvars, _)) equation
(var, _) = BackendVariable.getVarSingle(cr, aliasvars);
(cr, negate) = BackendVariable.getAlias(var);
e = DAE.CREF(cr, tp);
e = if negate then Expression.negate(e) else e;
(e, _) = ExpressionSimplify.simplify(DAE.CALL(Absyn.IDENT("pre"), {e}, attr));
(e, _) = Expression.traverseExpBottomUp(e, traverserExpsimplifyTimeIndepFuncCalls, (globalKnownVars, aliasvars, false));
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="previous"), expLst={DAE.CREF(componentRef=cr, ty=tp)}, attr=attr), (globalKnownVars, aliasvars, _)) equation
(var, _) = BackendVariable.getVarSingle(cr, aliasvars);
(cr, negate) = BackendVariable.getAlias(var);
e = DAE.CREF(cr, tp);
e = if negate then Expression.negate(e) else e;
(e, _) = ExpressionSimplify.simplify(DAE.CALL(Absyn.IDENT("previous"), {e}, attr));
(e, _) = Expression.traverseExpBottomUp(e, traverserExpsimplifyTimeIndepFuncCalls, (globalKnownVars, aliasvars, false));
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="change"), expLst={DAE.CREF(componentRef=cr, ty=tp)}), (globalKnownVars, aliasvars, _)) equation
(_::_, _) = BackendVariable.getVar(cr, globalKnownVars);
zero = Expression.arrayFill(Expression.arrayDimension(tp), DAE.BCONST(false));
then (zero, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="change"), expLst={DAE.CREF(componentRef=cr, ty=tp)}), (globalKnownVars, aliasvars, _)) equation
(_::_, _) = BackendVariable.getVar(cr, aliasvars);
zero = Expression.arrayFill(Expression.arrayDimension(tp), DAE.BCONST(false));
then (zero, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="change"), expLst={DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time"))}), (globalKnownVars, aliasvars, _))
then (DAE.BCONST(false), (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="change"), expLst={DAE.CREF(componentRef=cr, ty=tp)}, attr=attr), (globalKnownVars, aliasvars, _)) equation
(var, _) = BackendVariable.getVarSingle(cr, aliasvars);
(cr, negate) = BackendVariable.getAlias(var);
e = DAE.CREF(cr, tp);
e = if negate then Expression.negate(e) else e;
(e, _) = ExpressionSimplify.simplify(DAE.CALL(Absyn.IDENT("change"), {e}, attr));
(e, _) = Expression.traverseExpBottomUp(e, traverserExpsimplifyTimeIndepFuncCalls, (globalKnownVars, aliasvars, false));
then (e, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="edge"), expLst={DAE.CREF(componentRef=cr, ty=tp)}), (globalKnownVars, aliasvars, _)) equation
(_, _) = BackendVariable.getVarSingle(cr, globalKnownVars);
zero = Expression.arrayFill(Expression.arrayDimension(tp), DAE.BCONST(false));
then (zero, (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="edge"), expLst={DAE.CREF(componentRef=DAE.CREF_IDENT(ident="time"))}), (globalKnownVars, aliasvars, _))
then (DAE.BCONST(false), (globalKnownVars, aliasvars, true));
case (DAE.CALL(path=Absyn.IDENT(name="edge"), expLst={DAE.CREF(componentRef=cr, ty=tp)}, attr=attr), (globalKnownVars, aliasvars, _)) equation
(var, _) = BackendVariable.getVarSingle(cr, aliasvars);
(cr, negate) = BackendVariable.getAlias(var);
e = DAE.CREF(cr, tp);
e = if negate then Expression.negate(e) else e;
(e, _) = ExpressionSimplify.simplify(DAE.CALL(Absyn.IDENT("edge"), {e}, attr));
(e, _) = Expression.traverseExpBottomUp(e, traverserExpsimplifyTimeIndepFuncCalls, (globalKnownVars, aliasvars, false));
then (e, (globalKnownVars, aliasvars, true));
else (inExp, inTpl);
end matchcontinue;
end traverserExpsimplifyTimeIndepFuncCalls;
protected function simplifyTimeIndepFuncCallsShared "pre(param) -> param
der(param) -> 0.0
change(param) -> false
edge(param) -> false
author: Frenkel TUD 2012-06"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE;
protected
BackendDAE.Shared shared;
algorithm
shared := inDAE.shared;
BackendDAEUtil.traverseBackendDAEExpsVarsWithUpdate(shared.globalKnownVars, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls, (shared.globalKnownVars, shared.aliasVars, false)));
BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate(shared.initialEqs, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls, (shared.globalKnownVars, shared.aliasVars, false)));
BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate(shared.removedEqs, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls, (shared.globalKnownVars, shared.aliasVars, false)));
(shared.eventInfo, _) := traverseEventInfoExps(shared.eventInfo, Expression.traverseSubexpressionsHelper, (traverserExpsimplifyTimeIndepFuncCalls, (shared.globalKnownVars, shared.aliasVars, false)));
outDAE := BackendDAE.DAE(inDAE.eqs, shared);
end simplifyTimeIndepFuncCallsShared;
protected function traverseEventInfoExps<T>
input output BackendDAE.EventInfo eventInfo;
input FuncExpType func;
input output T arg;
partial function FuncExpType
input DAE.Exp inExp;
input T inTypeA;
output DAE.Exp outExp;
output T outA;
end FuncExpType;
algorithm
arg := DoubleEndedList.mapFoldNoCopy(eventInfo.zeroCrossings.zc, function traverseZeroCrossingExps(func=func), arg);
arg := DoubleEndedList.mapFoldNoCopy(eventInfo.samples.zc, function traverseZeroCrossingExps(func=func), arg);
arg := DoubleEndedList.mapFoldNoCopy(eventInfo.relations, function traverseZeroCrossingExps(func=func), arg);
end traverseEventInfoExps;
protected function traverseZeroCrossingExps<T>
input output BackendDAE.ZeroCrossing zc;
input FuncExpType func;
input output T arg;
partial function FuncExpType
input DAE.Exp inExp;
input T inTypeA;
output DAE.Exp outExp;
output T outA;
end FuncExpType;
algorithm
(zc, arg) := match zc
local
DAE.Exp relation1, relation2;
list<Integer> occurEquLst;
case BackendDAE.ZERO_CROSSING(relation1, occurEquLst)
equation
(relation2, arg) = Expression.traverseExpBottomUp(relation1, func, arg);
then (if referenceEq(relation1, relation2) then BackendDAE.ZERO_CROSSING(relation2, occurEquLst) else zc, arg);
end match;
end traverseZeroCrossingExps;
// =============================================================================
// =============================================================================
protected function traverseIncidenceMatrix "author: Frenkel TUD 2010-12"
replaceable type Type_a subtypeof Any;
input BackendDAE.IncidenceMatrix inM;
input FuncType func;
input Type_a inTypeA;
output BackendDAE.IncidenceMatrix outM;
output Type_a outTypeA;
partial function FuncType
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix,Type_a> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix,Type_a> outTpl;
end FuncType;
algorithm
(outM,outTypeA) := traverseIncidenceMatrix1(inM,func,1,arrayLength(inM),inTypeA);
end traverseIncidenceMatrix;
protected function traverseIncidenceMatrix1 "author: Frenkel TUD 2010-12"
replaceable type Type_a subtypeof Any;
input BackendDAE.IncidenceMatrix inM;
input FuncType func;
input Integer pos "iterated 1..len";
input Integer len "length of array";
input Type_a inTypeA;
output BackendDAE.IncidenceMatrix outM;
output Type_a outTypeA;
partial function FuncType
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix,Type_a> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix,Type_a> outTpl;
end FuncType;
algorithm
(outM,outTypeA) := traverseIncidenceMatrix2(inM,func,pos,len,intGt(pos,len),inTypeA);
annotation(__OpenModelica_EarlyInline = true);
end traverseIncidenceMatrix1;
protected function traverseIncidenceMatrix2
" author: Frenkel TUD 2010-12"
replaceable type Type_a subtypeof Any;
input BackendDAE.IncidenceMatrix inM;
input FuncType func;
input Integer pos "iterated 1..len";
input Integer len "length of array";
input Boolean stop;
input Type_a inTypeA;
output BackendDAE.IncidenceMatrix outM;
output Type_a outTypeA;
partial function FuncType
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix,Type_a> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix,Type_a> outTpl;
end FuncType;
algorithm
(outM,outTypeA) := match (inM,func,pos,len,stop,inTypeA)
local
BackendDAE.IncidenceMatrix m,m1,m2;
Type_a extArg,extArg1,extArg2;
list<Integer> eqns,eqns1;
case(_,_,_,_,true,_)
then (inM,inTypeA);
case(_,_,_,_,false,_)
equation
((eqns,m,extArg)) = func((inM[pos],pos,inM,inTypeA));
eqns1 = List.removeOnTrue(pos,intLt,eqns);
(m1,extArg1) = traverseIncidenceMatrixList(eqns1,m,func,arrayLength(m),pos,extArg);
(m2,extArg2) = traverseIncidenceMatrix2(m1,func,pos+1,len,intGt(pos+1,len),extArg1);
then (m2,extArg2);
end match;
end traverseIncidenceMatrix2;
protected function traverseIncidenceMatrixList
" author: Frenkel TUD 2011-04"
replaceable type Type_a subtypeof Any;
input list<Integer> inLst "elements to traverse";
input BackendDAE.IncidenceMatrix inM;
input FuncType func;
input Integer len "length of array";
input Integer maxpos "do not go further than this position";
input Type_a inTypeA;
output BackendDAE.IncidenceMatrix outM;
output Type_a outTypeA;
partial function FuncType
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix,Type_a> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix,Type_a> outTpl;
end FuncType;
algorithm
(outM,outTypeA) := matchcontinue(inLst,inM,func,len,maxpos,inTypeA)
local
BackendDAE.IncidenceMatrix m,m1;
Type_a extArg,extArg1;
list<Integer> rest,eqns,eqns1,alleqns;
Integer pos;
case({},_,_,_,_,_) then (inM,inTypeA);
case(pos::rest,_,_,_,_,_) equation
// do not leave the list
true = intLt(pos,len+1);
// do not more than necesary
true = intLt(pos,maxpos);
((eqns,m,extArg)) = func((inM[pos],pos,inM,inTypeA));
eqns1 = List.removeOnTrue(maxpos,intLt,eqns);
alleqns = List.unionOnTrueList({rest, eqns1},intEq);
(m1,extArg1) = traverseIncidenceMatrixList(alleqns,m,func,len,maxpos,extArg);
then (m1,extArg1);
case(pos::rest,_,_,_,_,_) equation
// do not leave the list
true = intLt(pos,len+1);
(m,extArg) = traverseIncidenceMatrixList(rest,inM,func,len,maxpos,inTypeA);
then (m,extArg);
case (_,_,_,_,_,_)
equation
true = Flags.isSet(Flags.FAILTRACE);
Debug.trace("- BackendDAEOptimize.traverseIncidenceMatrixList failed\n");
then
fail();
end matchcontinue;
end traverseIncidenceMatrixList;
protected function toplevelInputOrUnfixed
input BackendDAE.Var inVar;
output Boolean b;
algorithm
b := BackendVariable.isVarOnTopLevelAndInput(inVar) or
BackendVariable.isParam(inVar) and not BackendVariable.varFixed(inVar);
end toplevelInputOrUnfixed;
protected function traversingTimeEqnsFinder "author: Frenkel 2010-12"
input DAE.Exp inExp;
input tuple<Boolean,BackendDAE.Variables,BackendDAE.Variables,Boolean,Boolean> inTpl;
output DAE.Exp outExp;
output Boolean cont;
output tuple<Boolean,BackendDAE.Variables,BackendDAE.Variables,Boolean,Boolean> outTpl;
algorithm
(outExp,cont,outTpl) := matchcontinue (inExp,inTpl)
local
DAE.Exp e;
Boolean b,b1,b2;
BackendDAE.Variables vars,globalKnownVars;
DAE.ComponentRef cr;
BackendDAE.Var var;
list<BackendDAE.Var> vlst;
case (e as DAE.CREF(DAE.CREF_IDENT(ident = "time",subscriptLst = {}),_), (_,vars,globalKnownVars,b1,b2))
then (e,false,(true,vars,globalKnownVars,b1,b2));
// inputs not constant and parameter(fixed=false) are constant but evaluated after konstant variables are evaluted
case (e as DAE.CREF(cr,_), (_,vars,globalKnownVars,b1,b2))
equation
(vlst,_::_)= BackendVariable.getVar(cr, globalKnownVars) "input variables stored in known variables are input on top level";
false = List.mapAllValueBool(vlst,toplevelInputOrUnfixed,false);
then (e,false,(true,vars,globalKnownVars,b1,b2));
case (e as DAE.CALL(path = Absyn.IDENT(name = "sample"), expLst = {_,_,_}), (_,vars,globalKnownVars,b1,b2)) then (e,false,(true,vars,globalKnownVars,b1,b2));
case (e as DAE.CALL(path = Absyn.IDENT(name = "pre"), expLst = {_}), (_,vars,globalKnownVars,b1,b2)) then (e,false,(true,vars,globalKnownVars,b1,b2));
case (e as DAE.CALL(path = Absyn.IDENT(name = "previous"), expLst = {_}), (_,vars,globalKnownVars,b1,b2)) then (e,false,(true,vars,globalKnownVars,b1,b2));
case (e as DAE.CALL(path = Absyn.IDENT(name = "change"), expLst = {_}), (_,vars,globalKnownVars,b1,b2)) then (e,false,(true,vars,globalKnownVars,b1,b2));
case (e as DAE.CALL(path = Absyn.IDENT(name = "edge"), expLst = {_}), (_,vars,globalKnownVars,b1,b2)) then (e,false,(true,vars,globalKnownVars,b1,b2));
// case for finding simple equation in jacobians
// there are all known variables mark as input
// and they are all time-depending
case (e as DAE.CREF(cr,_), (_,vars,globalKnownVars,true,b2))
equation
(var::_,_::_)= BackendVariable.getVar(cr, globalKnownVars);
DAE.INPUT() = BackendVariable.getVarDirection(var);
then (e,false,(true,vars,globalKnownVars,true,b2));
// unkown var
case (e as DAE.CREF(cr,_), (_,vars,globalKnownVars,b1,true))
equation
(_::_,_::_)= BackendVariable.getVar(cr, vars);
then (e,false,(true,vars,globalKnownVars,b1,true));
case (e,(b,vars,globalKnownVars,b1,b2)) then (e,not b,(b,vars,globalKnownVars,b1,b2));
end matchcontinue;
end traversingTimeEqnsFinder;
public function countSimpleEquations
"author: Frenkel TUD 2011-05
This function count the simple equations on the form a=b and a=const and a=f(not time)
in BackendDAE.BackendDAE. Note this functions does not use variable replacements, because
of this the number of simple equations is maybe smaller than using variable replacements."
input BackendDAE.BackendDAE inDlow;
input BackendDAE.IncidenceMatrix inM;
output Integer outSimpleEqns;
algorithm
outSimpleEqns:=
match (inDlow,inM)
local
BackendDAE.BackendDAE dlow;
BackendDAE.EquationArray eqns;
Integer n;
case (dlow,_)
equation
// check equations
(_,(_,n)) = traverseIncidenceMatrix(inM,countSimpleEquationsFinder,(dlow,0));
then n;
end match;
end countSimpleEquations;
protected function countSimpleEquationsFinder
"author: Frenkel TUD 2011-05"
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix, tuple<BackendDAE.BackendDAE,Integer>> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix, tuple<BackendDAE.BackendDAE,Integer>> outTpl;
algorithm
outTpl:=
matchcontinue (inTpl)
local
BackendDAE.IncidenceMatrixElement elem;
Integer pos,l,i,n,n_1;
BackendDAE.IncidenceMatrix m;
BackendDAE.BackendDAE dae;
BackendDAE.EqSystem syst;
BackendDAE.Shared shared;
case ((elem,pos,m,(dae as BackendDAE.DAE({syst},shared),n)))
equation
// check number of vars in eqns
l = listLength(elem);
true = intLt(l,3);
true = intGt(l,0);
countsimpleEquation(elem,l,pos,syst,shared);
n_1 = n+1;
then (({},m,(dae,n_1)));
case ((_,_,m,(dae,n)))
then (({},m,(dae,n)));
end matchcontinue;
end countSimpleEquationsFinder;
protected function countsimpleEquation
" author: Frenkel TUD 2011-05"
input BackendDAE.IncidenceMatrixElement elem;
input Integer length;
input Integer pos;
input BackendDAE.EqSystem syst;
input BackendDAE.Shared shared;
algorithm
_ := matchcontinue(elem,length,pos,syst,shared)
local
DAE.ComponentRef cr;
Integer i,j;
DAE.Exp es,cre,e1,e2;
BackendDAE.Variables vars,globalKnownVars;
BackendDAE.Var var;
BackendDAE.EquationArray eqns;
BackendDAE.Equation eqn;
Boolean negate;
DAE.ElementSource source;
// a = const
// wbraun:
// speacial case for Jacobains, since there are all known variablen
// time depending input variables
case ({i},_,_,_,BackendDAE.SHARED(backendDAEType = BackendDAE.JACOBIAN()))
equation
vars = BackendVariable.daeVars(syst);
var = BackendVariable.getVarAt(vars,intAbs(i));
// no State
false = BackendVariable.isStateorStateDerVar(var);
// try to solve the equation
eqns = BackendEquation.getEqnsFromEqSystem(syst);
eqn = BackendEquation.get(eqns,pos);
BackendDAE.EQUATION(exp=e1,scalar=e2) = eqn;
// variable time not there
globalKnownVars = BackendVariable.daeGlobalKnownVars(shared);
(_,(false,_,_,_,_)) = Expression.traverseExpTopDown(e1, traversingTimeEqnsFinder, (false,vars,globalKnownVars,true,false));
(_,(false,_,_,_,_)) = Expression.traverseExpTopDown(e2, traversingTimeEqnsFinder, (false,vars,globalKnownVars,true,false));
cr = BackendVariable.varCref(var);
cre = Expression.crefExp(cr);
(_,{}) = ExpressionSolve.solve(e1,e2,cre);
then ();
// a = const
case ({i},_,_,_,_)
equation
vars = BackendVariable.daeVars(syst);
var = BackendVariable.getVarAt(vars,intAbs(i));
// no State
false = BackendVariable.isStateorStateDerVar(var);
// try to solve the equation
eqns = BackendEquation.getEqnsFromEqSystem(syst);
eqn = BackendEquation.get(eqns,pos);
BackendDAE.EQUATION(exp=e1,scalar=e2) = eqn;
// variable time not there
globalKnownVars = BackendVariable.daeGlobalKnownVars(shared);
(_,(false,_,_,_,_)) = Expression.traverseExpTopDown(e1, traversingTimeEqnsFinder, (false,vars,globalKnownVars,false,false));
(_,(false,_,_,_,_)) = Expression.traverseExpTopDown(e2, traversingTimeEqnsFinder, (false,vars,globalKnownVars,false,false));
cr = BackendVariable.varCref(var);
cre = Expression.crefExp(cr);
(_,{}) = ExpressionSolve.solve(e1,e2,cre);
then ();
// a = der(b)
case ({_,_},_,_,_,_)
equation
eqns = BackendEquation.getEqnsFromEqSystem(syst);
eqn = BackendEquation.get(eqns,pos);
(cr,_,_,_,_) = BackendEquation.derivativeEquation(eqn);
// select candidate
vars = BackendVariable.daeVars(syst);
((_::_),(_::_)) = BackendVariable.getVar(cr,vars);
then ();
// a = b
case ({_,_},_,_,_,_)
equation
eqns = BackendEquation.getEqnsFromEqSystem(syst);
(eqn as BackendDAE.EQUATION()) = BackendEquation.get(eqns,pos);
_ = BackendEquation.aliasEquation(eqn);
then ();
end matchcontinue;
end countsimpleEquation;
// =============================================================================
// remove parameters stuff
//
// =============================================================================
public function removeParameters
"author wbraun"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE;
algorithm
outDAE := match inDAE
local
BackendDAE.Variables globalKnownVars;
BackendVarTransform.VariableReplacements repl;
BackendDAE.EqSystems systs;
BackendDAE.Shared shared;
case (BackendDAE.DAE(systs, shared as BackendDAE.SHARED(globalKnownVars=globalKnownVars)))
algorithm
repl := BackendVarTransform.emptyReplacements();
((repl, _)) := BackendVariable.traverseBackendDAEVars(globalKnownVars, removeParametersFinder, (repl, globalKnownVars));
(globalKnownVars, repl) := replaceFinalVars(1, globalKnownVars, repl);
(globalKnownVars, repl) := replaceFinalVars(1, globalKnownVars, repl);
if Flags.isSet(Flags.DUMP_PARAM_REPL) then
BackendVarTransform.dumpReplacements(repl);
end if;
systs := List.map1(systs,removeParameterswork, repl);
shared.globalKnownVars := globalKnownVars;
then
BackendDAE.DAE(systs, shared);
end match;
end removeParameters;
protected function removeParameterswork
"author wbraun"
input BackendDAE.EqSystem isyst;
input BackendVarTransform.VariableReplacements repl;
output BackendDAE.EqSystem osyst;
algorithm
osyst := match isyst
local
Option<BackendDAE.IncidenceMatrix> m,mT;
BackendDAE.Variables vars;
BackendDAE.EquationArray eqns,eqns1;
list<BackendDAE.Equation> lsteqns;
BackendDAE.Matching matching;
BackendDAE.EqSystem syst;
BackendDAE.BaseClockPartitionKind partitionKind;
case syst as BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns)
algorithm
(vars, _) := replaceFinalVars(1, vars, repl); // replacing variable attributes (e.g start) in unknown vars
(lsteqns, _) := BackendVarTransform.replaceEquations(BackendEquation.equationList(eqns), repl, NONE());
syst.orderedVars := vars;
syst.orderedEqs := BackendEquation.listEquation(lsteqns);
syst.m := NONE(); syst.mT := NONE();
then
syst;
end match;
end removeParameterswork;
protected function removeParametersFinder
input BackendDAE.Var inVar;
input tuple<BackendVarTransform.VariableReplacements,BackendDAE.Variables> inTpl;
output BackendDAE.Var outVar;
output tuple<BackendVarTransform.VariableReplacements,BackendDAE.Variables> outTpl;
algorithm
(outVar,outTpl) := matchcontinue (inVar,inTpl)
local
BackendDAE.Variables vars;
BackendDAE.Var v;
BackendVarTransform.VariableReplacements repl,repl_1;
DAE.ComponentRef varName;
Option< .DAE.VariableAttributes> values;
DAE.Exp exp,exp1;
case (v as BackendDAE.VAR(varName=varName,varKind=BackendDAE.PARAM(),bindExp=SOME(exp)),(repl,vars))
equation
(exp1, _) = Expression.traverseExpBottomUp(exp, BackendDAEUtil.replaceCrefsWithValues, (vars, varName));
repl_1 = BackendVarTransform.addReplacement(repl, varName, exp1,NONE());
then (v,(repl_1,vars));
else (inVar,inTpl);
end matchcontinue;
end removeParametersFinder;
protected function replaceFinalVars
" author: Frenkel TUD 2011-04"
input Integer inNumRepl;
input BackendDAE.Variables inVars;
input BackendVarTransform.VariableReplacements inRepl;
output BackendDAE.Variables outVars;
output BackendVarTransform.VariableReplacements outRepl;
algorithm
(outVars,outRepl) := matchcontinue(inNumRepl,inVars,inRepl)
local
Integer numrepl;
BackendDAE.Variables globalKnownVars,globalKnownVars1,globalKnownVars2;
BackendVarTransform.VariableReplacements repl,repl1,repl2;
case(numrepl,globalKnownVars,repl)
equation
true = intEq(0,numrepl);
then (globalKnownVars,repl);
case(_,globalKnownVars,repl)
equation
(globalKnownVars1, (repl1,numrepl)) = BackendVariable.traverseBackendDAEVarsWithUpdate(globalKnownVars,replaceFinalVarTraverser,(repl,0));
(globalKnownVars2, repl2) = replaceFinalVars(numrepl,globalKnownVars1,repl1);
then (globalKnownVars2,repl2);
end matchcontinue;
end replaceFinalVars;
protected function replaceFinalVarTraverser
input BackendDAE.Var inVar;
input tuple<BackendVarTransform.VariableReplacements,Integer> inTpl;
output BackendDAE.Var outVar;
output tuple<BackendVarTransform.VariableReplacements,Integer> outTpl;
algorithm
(outVar,outTpl) := matchcontinue (inVar,inTpl)
local
BackendDAE.Var v,v1;
BackendVarTransform.VariableReplacements repl,repl_1;
Integer numrepl;
DAE.Exp e,e1;
DAE.ComponentRef cr;
Option<DAE.VariableAttributes> attr,new_attr;
case (v as BackendDAE.VAR(varName=cr,bindExp=SOME(e),values=attr),(repl,numrepl))
equation
(e1,true) = BackendVarTransform.replaceExp(e, repl, NONE());
(e1,_) = ExpressionSimplify.simplify(e1);
v1 = BackendVariable.setBindExp(v, SOME(e1));
repl_1 = addConstExpReplacement(e1,cr,repl);
(attr,repl_1) = BackendDAEUtil.traverseBackendDAEVarAttr(attr,traverseExpVisitorWrapper,repl_1);
v1 = BackendVariable.setVarAttributes(v1,attr);
then (v1,(repl_1,numrepl+1));
case (v as BackendDAE.VAR(values=attr),(repl,numrepl))
equation
(new_attr,repl) = BackendDAEUtil.traverseBackendDAEVarAttr(attr,traverseExpVisitorWrapper,repl);
v1 = BackendVariable.setVarAttributes(v,new_attr);
then (v1,(repl,numrepl));
end matchcontinue;
end replaceFinalVarTraverser;
protected function addConstExpReplacement
input DAE.Exp inExp;
input DAE.ComponentRef cr;
input BackendVarTransform.VariableReplacements inRepl;
output BackendVarTransform.VariableReplacements outRepl;
algorithm
outRepl := matchcontinue(inExp,cr,inRepl)
case (_,_,_)
equation
true = Expression.isConst(inExp);
then
BackendVarTransform.addReplacement(inRepl, cr, inExp,NONE());
else
inRepl;
end matchcontinue;
end addConstExpReplacement;
protected function traverseExpVisitorWrapper "help function to replaceFinalVarTraverser"
input DAE.Exp inExp;
input BackendVarTransform.VariableReplacements inRepl;
output DAE.Exp exp;
output BackendVarTransform.VariableReplacements repl;
algorithm
(exp,repl) := matchcontinue(inExp,inRepl)
local
DAE.ComponentRef cr;
case (exp as DAE.CREF(_,_),repl) equation
(exp,_) = BackendVarTransform.replaceExp(exp,repl,NONE());
then (exp,repl);
else (inExp,inRepl);
end matchcontinue;
end traverseExpVisitorWrapper;
// =============================================================================
// remove protected parameters stuff
//
// =============================================================================
public function removeProtectedParameters
"author Frenkel TUD"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE;
algorithm
outDAE := match inDAE
local
BackendDAE.Variables globalKnownVars;
BackendVarTransform.VariableReplacements repl;
BackendDAE.EqSystems systs;
BackendDAE.Shared shared;
case BackendDAE.DAE(systs, shared as BackendDAE.SHARED(globalKnownVars=globalKnownVars))
algorithm
repl := BackendVarTransform.emptyReplacements();
repl := BackendVariable.traverseBackendDAEVars(globalKnownVars, protectedParametersFinder, repl);
if Flags.isSet(Flags.DUMP_PP_REPL) then
BackendVarTransform.dumpReplacements(repl);
end if;
systs := List.map1(systs, removeProtectedParameterswork, repl);
shared.globalKnownVars := globalKnownVars;
then
(BackendDAE.DAE(systs, shared));
end match;
end removeProtectedParameters;
protected function removeProtectedParameterswork
"author Frenkel TUD"
input BackendDAE.EqSystem isyst;
input BackendVarTransform.VariableReplacements repl;
output BackendDAE.EqSystem osyst;
algorithm
osyst := match isyst
local
BackendDAE.EqSystem syst;
BackendDAE.Variables vars;
BackendDAE.EquationArray eqns;
list<BackendDAE.Equation> lsteqns;
Boolean b;
case syst as BackendDAE.EQSYSTEM(orderedEqs=eqns)
algorithm
lsteqns := BackendEquation.equationList(eqns);
(lsteqns, b) := BackendVarTransform.replaceEquations(lsteqns, repl, NONE());
if b then
syst.orderedEqs := BackendEquation.listEquation(lsteqns);
syst := BackendDAEUtil.clearEqSyst(syst);
end if;
then
syst;
end match;
end removeProtectedParameterswork;
protected function protectedParametersFinder
input BackendDAE.Var inVar;
input BackendVarTransform.VariableReplacements inRepl;
output BackendDAE.Var outVar;
output BackendVarTransform.VariableReplacements outRepl;
algorithm
(outVar,outRepl) := matchcontinue (inVar,inRepl)
local
BackendDAE.Var v;
BackendVarTransform.VariableReplacements repl,repl_1;
DAE.ComponentRef varName;
Option< .DAE.VariableAttributes> values;
DAE.Exp exp;
case (v as BackendDAE.VAR(varName=varName,varKind=BackendDAE.PARAM(),bindExp=SOME(exp),values=values),repl)
equation
true = DAEUtil.getProtectedAttr(values);
repl_1 = BackendVarTransform.addReplacement(repl, varName, exp,NONE());
then (v,repl_1);
else (inVar,inRepl);
end matchcontinue;
end protectedParametersFinder;
// =============================================================================
// remove equal function calls equations stuff
//
// =============================================================================
public function removeEqualFunctionCalls "author: Frenkel TUD 2011-04
This function detects equal function calls of the form a=f(b) and c=f(b) in
BackendDAE.BackendDAE to get speed up."
input BackendDAE.BackendDAE dae;
output BackendDAE.BackendDAE odae;
algorithm
if Flags.getConfigBool(Flags.CSE_CALL) or Flags.getConfigBool(Flags.CSE_EACHCALL) then
// skip this module if cse module is activated
odae := dae;
else
odae := BackendDAEUtil.mapEqSystem(dae,removeEqualFunctionCallsWork);
end if;
end removeEqualFunctionCalls;
protected function removeEqualFunctionCallsWork "author: Frenkel TUD 2011-04
This function detects equal function calls of the form a=f(b) and c=f(b) in
BackendDAE.BackendDAE to get speed up."
input BackendDAE.EqSystem isyst;
input BackendDAE.Shared ishared;
output BackendDAE.EqSystem osyst;
output BackendDAE.Shared oshared;
algorithm
(osyst,oshared) := match isyst
local
BackendDAE.IncidenceMatrix m;
BackendDAE.IncidenceMatrixT mT;
BackendDAE.Variables vars;
BackendDAE.EquationArray eqns;
list<Integer> changed;
Boolean b;
BackendDAE.EqSystem syst;
DAE.FunctionTree funcs;
case syst as BackendDAE.EQSYSTEM(orderedVars=vars,orderedEqs=eqns)
algorithm
funcs := BackendDAEUtil.getFunctions(ishared);
(syst, m, mT) := BackendDAEUtil.getIncidenceMatrixfromOption(syst, BackendDAE.NORMAL(), SOME(funcs));
// check equations
(m, (mT,_,_,changed)) := traverseIncidenceMatrix(m, removeEqualFunctionCallFinder, (mT,vars,eqns,{}));
// update arrayeqns and algorithms, collect info for wrappers
syst.m := SOME(m); syst.mT := SOME(mT); syst.matching := BackendDAE.NO_MATCHING();
syst := BackendDAEUtil.updateIncidenceMatrix(syst, BackendDAE.NORMAL(), NONE(), changed);
then (syst, ishared);
end match;
end removeEqualFunctionCallsWork;
protected function removeEqualFunctionCallFinder "author: Frenkel TUD 2010-12"
input tuple<BackendDAE.IncidenceMatrixElement,Integer,BackendDAE.IncidenceMatrix, tuple<BackendDAE.IncidenceMatrixT,BackendDAE.Variables,BackendDAE.EquationArray,list<Integer>>> inTpl;
output tuple<list<Integer>,BackendDAE.IncidenceMatrix, tuple<BackendDAE.IncidenceMatrixT,BackendDAE.Variables,BackendDAE.EquationArray,list<Integer>>> outTpl;
algorithm
outTpl:=
matchcontinue (inTpl)
local
BackendDAE.IncidenceMatrixElement elem;
Integer pos;
BackendDAE.IncidenceMatrix m,mT;
list<Integer> changed;
BackendDAE.Variables vars;
BackendDAE.EquationArray eqns,eqns1;
DAE.Exp exp,e1,e2,ecr;
AvlSetInt.Tree expvars;
list<Integer> controleqns,expvars1;
list<list<Integer>> expvarseqns;
case ((elem,pos,m,(mT,vars,eqns,changed)))
equation
// check number of vars in eqns
_::_ = elem;
BackendDAE.EQUATION(exp=e1,scalar=e2) = BackendEquation.get(eqns,pos);
// BackendDump.debugStrExpStrExpStr(("Test ",e1," = ",e2,"\n"));
(ecr,exp) = functionCallEqn(e1,e2,vars);
// TODO: Handle this with alias-equations instead?; at least they don't replace back to the original expression...
// failure(DAE.CREF(componentRef=_) = exp);
// failure(DAE.UNARY(operator=DAE.UMINUS(ty=_),exp=DAE.CREF(componentRef=_)) = exp);
// BackendDump.debugStrExpStrExpStr(("Found ",ecr," = ",exp,"\n"));
expvars = BackendDAEUtil.incidenceRowExp(exp,vars,AvlSetInt.EMPTY(),NONE(),BackendDAE.NORMAL());
// print("expvars "); BackendDump.debuglst((expvars,intString," ","\n"));
(expvars1::expvarseqns) = List.map2(AvlSetInt.listKeys(expvars),varEqns,pos,mT);
// print("expvars1 "); BackendDump.debuglst((expvars1,intString," ","\n"));;
controleqns = getControlEqns(expvars1,expvarseqns);
// print("controleqns "); BackendDump.debuglst((controleqns,intString," ","\n"));
(eqns1,changed) = removeEqualFunctionCall(controleqns,ecr,exp,eqns,changed);
//print("changed1 "); BackendDump.debuglst((changed1,intString," ","\n"));
//print("changed2 "); BackendDump.debuglst((changed2,intString," ","\n"));
// print("Next\n");
then (({},m,(mT,vars,eqns1,changed)));
case ((_,_,m,(mT,vars,eqns,changed)))
then (({},m,(mT,vars,eqns,changed)));
end matchcontinue;
end removeEqualFunctionCallFinder;
protected function functionCallEqn
"author Frenkel TUD 2011-04"
input DAE.Exp ie1;
input DAE.Exp ie2;
input BackendDAE.Variables inVars;
output DAE.Exp outECr;
output DAE.Exp outExp;
algorithm
(outECr,outExp) := match (ie1,ie2,inVars)
local
DAE.ComponentRef cr;
DAE.Exp e1,e2;
DAE.Operator op;