@@ -2059,49 +2059,52 @@ protected
20592059 list< Integer > partition, varIdcs, adjEqs, pathVarIdcs;
20602060 list< CommonSubExp > cses;
20612061algorithm
2062- // getall vars with only 2 adjacent equations
2063- numVars : = BackendVariable . varsSize(allVars);
2064- (_, pathVarIdcs) := List . filter1OnTrueSync( List . map(arrayList(mTIn), listLength), intEq, 2 , List . intRange(numVars) );
2065- pathVars := BackendVariable . listVar1 (List . map1(pathVarIdcs, BackendVariable . getVarAtIndexFirst, allVars ));
2066- pathVarIdxMap := listArray (List . map1(pathVarIdcs,Array . getIndexFirst,varMap ));
2067- cses := cseIn ;
2068- eqLst_all := BackendEquation . equationList(allEqs) ;
2069-
2070- if BackendVariable . varsSize(pathVars) > 0 then
2071- for partition in allPartitions loop
2072- // print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2073- // print("pathVarIdxMap "+stringDelimitList(List.map(List.map1(pathVarIdcs,Array.getIndexFirst,varMap), intString), ", ")+"\n");
2062+ try
2063+ // getall vars with only 2 adjacent equations
2064+ numVars := BackendVariable . varsSize(allVars );
2065+ (_, pathVarIdcs) := List . filter1OnTrueSync (List . map(arrayList(mTIn), listLength), intEq, 2 , List . intRange(numVars ));
2066+ pathVars := BackendVariable . listVar1 (List . map1(pathVarIdcs, BackendVariable . getVarAtIndexFirst, allVars ));
2067+ pathVarIdxMap := listArray( List . map1(pathVarIdcs, Array . getIndexFirst,varMap)) ;
2068+ cses := cseIn ;
2069+ eqLst_all : = BackendEquation . equationList(allEqs);
2070+ if BackendVariable . varsSize(pathVars) > 0 then
2071+ for partition in allPartitions loop
2072+ // print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2073+ // print("pathVarIdxMap "+stringDelimitList(List.map(List.map1(pathVarIdcs,Array.getIndexFirst,varMap), intString), ", ")+"\n");
20742074
2075- // get only the partition equations
2076- eqLst := List . map1(partition,List . getIndexFirst,eqLst_all);
2077- eqs := BackendEquation . listEquation(eqLst);
2075+ // get only the partition equations
2076+ eqLst := List . map1(partition,List . getIndexFirst,eqLst_all);
2077+ eqs := BackendEquation . listEquation(eqLst);
20782078
2079- eqSys := BackendDAEUtil . createEqSystem(pathVars, eqs);
2080- (_, m, mT) := BackendDAEUtil . getIncidenceMatrix(eqSys, BackendDAE . SOLVABLE (), NONE ());
2079+ eqSys := BackendDAEUtil . createEqSystem(pathVars, eqs);
2080+ (_, m, mT) := BackendDAEUtil . getIncidenceMatrix(eqSys, BackendDAE . SOLVABLE (), NONE ());
20812081
2082- // BackendDump.dumpIncidenceMatrix(m);
2083- // BackendDump.dumpIncidenceMatrixT(mT);
2084- // varAtts := List.threadMap(List.fill(false, arrayLength(mT)), List.fill("", arrayLength(mT)), Util.makeTuple);
2085- // eqAtts := List.threadMap(List.fill(false, arrayLength(m)), List.fill("", arrayLength(m)), Util.makeTuple);
2086- // BackendDump.dumpBipartiteGraphStrongComponent2(pathVars, eqs, m, varAtts, eqAtts, "shortenPaths"+stringDelimitList(List.map(partition,intString),"_"));
2082+ // BackendDump.dumpIncidenceMatrix(m);
2083+ // BackendDump.dumpIncidenceMatrixT(mT);
2084+ // varAtts := List.threadMap(List.fill(false, arrayLength(mT)), List.fill("", arrayLength(mT)), Util.makeTuple);
2085+ // eqAtts := List.threadMap(List.fill(false, arrayLength(m)), List.fill("", arrayLength(m)), Util.makeTuple);
2086+ // BackendDump.dumpBipartiteGraphStrongComponent2(pathVars, eqs, m, varAtts, eqAtts, "shortenPaths"+stringDelimitList(List.map(partition,intString),"_"));
20872087
2088- for idx in 1 :arrayLength(mT) loop
2089- adjEqs := arrayGet(mT,idx);
2088+ for idx in 1 :arrayLength(mT) loop
2089+ adjEqs := arrayGet(mT,idx);
20902090
2091- if listLength(adjEqs)== 2 then
2091+ if listLength(adjEqs)== 2 then
20922092 // print("varIdx1 "+intString(varIdx)+"\n");
20932093 // print("adjEqs "+stringDelimitList(List.map(adjEqs,intString),",")+"\n");
2094- adjEqs := list(arrayGet(eqMap,listGet(partition,eq)) for eq in adjEqs);
2095- varIdx := arrayGet(pathVarIdxMap,idx);
2096- cses := SHORTCUT_CSE (adjEqs,varIdx)::cses;
2097- end if ;
2098- end for ; // end the variables
2099- GC . free(m);
2100- GC . free(mT);
2101- end for ; // end all partitions
2102- // print("the SHORTPATH cses : \n"+stringDelimitList(List.map(cses, printCSE), "\n")+"\n");
2103- end if ;
2104- cseOut := cses;
2094+ adjEqs := list(arrayGet(eqMap,listGet(partition,eq)) for eq in adjEqs);
2095+ varIdx := arrayGet(pathVarIdxMap,idx);
2096+ cses := SHORTCUT_CSE (adjEqs,varIdx)::cses;
2097+ end if ;
2098+ end for ; // end the variables
2099+ GC . free(m);
2100+ GC . free(mT);
2101+ end for ; // end all partitions
2102+ // print("the SHORTPATH cses : \n"+stringDelimitList(List.map(cses, printCSE), "\n")+"\n");
2103+ end if ;
2104+ cseOut := cses;
2105+ else
2106+ cseOut := cseIn;
2107+ end try ;
21052108end shortenPaths;
21062109
21072110protected function getCSE2"traverses the partitions and checks for CSE2 i.e a=b+const. ; c = b+const. --> a=c
@@ -2177,50 +2180,57 @@ algorithm
21772180 Integer sharedVarIdx, eqIdx1, eqIdx2, varIdx1, varIdx2;
21782181 list< Integer > varIdcs1, varIdcs2, sharedVarIdcs, eqIdcs;
21792182 list< Integer > loop1;
2183+ list< list< Integer >> loops;
21802184 BackendDAE . Equation eq1, eq2;
21812185 BackendDAE . Var var1, var2;
21822186 DAE . Exp varExp1, varExp2, lhs, rhs1, rhs2;
21832187 array< Integer > varMapArr, eqMapArr;
2188+ list< CommonSubExp > cseLst;
21842189 case (_, _, _, _, _, _, _, _)
2185- equation
2186- // print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2190+ algorithm
2191+ // print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
21872192 // partition has only one loop
2188- ({loop1}, _, _) = ResolveLoops . resolveLoops_findLoops({partition}, m, mT, findExactlyOneLoop= true );
2193+ (loops, _, _) := ResolveLoops . resolveLoops_findLoops({partition}, m, mT, findExactlyOneLoop= false );
2194+ cseLst := cseIn;
2195+ for loop1 in loops loop
21892196 // print("loop1 "+stringDelimitList(List.map(loop1, intString), ", ")+"\n");
2190- {eqIdx1, eqIdx2} = loop1;
2191- varIdcs1 = arrayGet(m, eqIdx1);
2192- varIdcs2 = arrayGet(m, eqIdx2);
2193- (sharedVarIdcs, varIdcs1, varIdcs2) = List . intersection1OnTrue(varIdcs1, varIdcs2, intEq);
2194- // print("sharedVarIdcs "+stringDelimitList(List.map(sharedVarIdcs, intString), ", ")+"\n");
2195- // print("varIdcs1 "+stringDelimitList(List.map(varIdcs1, intString), ", ")+"\n");
2196- // print("varIdcs2 "+stringDelimitList(List.map(varIdcs2, intString), ", ")+"\n");
2197- {varIdx1} = varIdcs1;
2198- {varIdx2} = varIdcs2;
2199- {eq1, eq2} = BackendEquation . getList(loop1, eqs);
2200- var1 = BackendVariable . getVarAt(vars, varIdx1);
2201- var2 = BackendVariable . getVarAt(vars, varIdx2);
2202-
2203- // compare the actual equations
2204- varExp1 = BackendVariable . varExp(var1);
2205- varExp2 = BackendVariable . varExp(var2);
2206- BackendDAE . EQUATION (exp= lhs, scalar= rhs1) = eq1;
2207- (rhs1, _) = ExpressionSolve . solve(lhs, rhs1, varExp1);
2208- BackendDAE . EQUATION (exp= lhs, scalar= rhs2) = eq2;
2209- (rhs2, _) = ExpressionSolve . solve(lhs, rhs2, varExp2);
2210- true = Expression . expEqual(rhs1, rhs2);
2211- // print("rhs1 " +ExpressionDump.printExpStr(rhs1)+"\n");
2212- // print("rhs2 " +ExpressionDump.printExpStr(rhs2)+"\n");
2213- // print("is equal\n");
2214- // build CSE
2215- eqMapArr = listArray(eqMap);
2216- varMapArr = listArray(varMap);
2217- sharedVarIdcs = list(arrayGet(varMapArr, i) for i in sharedVarIdcs);
2218- varIdcs1 = listAppend(varIdcs1, varIdcs2);
2219- varIdcs1 = list(arrayGet(varMapArr, i) for i in varIdcs1);
2220- eqIdcs = list(arrayGet(eqMapArr,i) for i in loop1);
2221- GC . free(eqMapArr);
2222- GC . free(varMapArr);
2223- then ASSIGNMENT_CSE (eqIdcs, sharedVarIdcs, varIdcs1)::cseIn;
2197+ {eqIdx1, eqIdx2} := loop1;
2198+ varIdcs1 := arrayGet(m, eqIdx1);
2199+ varIdcs2 := arrayGet(m, eqIdx2);
2200+ (sharedVarIdcs, varIdcs1, varIdcs2) := List . intersection1OnTrue(varIdcs1, varIdcs2, intEq);
2201+ // print("sharedVarIdcs "+stringDelimitList(List.map(sharedVarIdcs, intString), ", ")+"\n");
2202+ // print("varIdcs1 "+stringDelimitList(List.map(varIdcs1, intString), ", ")+"\n");
2203+ // print("varIdcs2 "+stringDelimitList(List.map(varIdcs2, intString), ", ")+"\n");
2204+ {varIdx1} := varIdcs1;
2205+ {varIdx2} := varIdcs2;
2206+ {eq1, eq2} := BackendEquation . getList(loop1, eqs);
2207+ var1 := BackendVariable . getVarAt(vars, varIdx1);
2208+ var2 := BackendVariable . getVarAt(vars, varIdx2);
2209+
2210+ // compare the actual equations
2211+ varExp1 := BackendVariable . varExp(var1);
2212+ varExp2 := BackendVariable . varExp(var2);
2213+ BackendDAE . EQUATION (exp= lhs, scalar= rhs1) := eq1;
2214+ (rhs1, _) := ExpressionSolve . solve(lhs, rhs1, varExp1);
2215+ BackendDAE . EQUATION (exp= lhs, scalar= rhs2) := eq2;
2216+ (rhs2, _) := ExpressionSolve . solve(lhs, rhs2, varExp2);
2217+ if Expression . expEqual(rhs1, rhs2) then
2218+ // print("rhs1 " +ExpressionDump.printExpStr(rhs1)+"\n");
2219+ // print("rhs2 " +ExpressionDump.printExpStr(rhs2)+"\n");
2220+ // print("is equal\n");
2221+ // build CSE
2222+ eqMapArr := listArray(eqMap);
2223+ varMapArr := listArray(varMap);
2224+ sharedVarIdcs := list(arrayGet(varMapArr, i) for i in sharedVarIdcs);
2225+ varIdcs1 := listAppend(varIdcs1, varIdcs2);
2226+ varIdcs1 := list(arrayGet(varMapArr, i) for i in varIdcs1);
2227+ eqIdcs := list(arrayGet(eqMapArr,i) for i in loop1);
2228+ GC . free(eqMapArr);
2229+ GC . free(varMapArr);
2230+ cseLst := ASSIGNMENT_CSE (eqIdcs, sharedVarIdcs, varIdcs1)::cseLst;
2231+ end if ;
2232+ end for ;
2233+ then cseLst;
22242234 else cseIn;
22252235 end matchcontinue;
22262236end getCSE3;
0 commit comments