diff --git a/eval/defs.cpp b/eval/defs.cpp index ff89ff7..89536bc 100755 --- a/eval/defs.cpp +++ b/eval/defs.cpp @@ -40,10 +40,13 @@ MaybeVValue VarEnv::operator[](VKey k) const } FuncEnv::FuncEnv() {} -FuncEnvType FuncEnv::mapping_ = {{"isEmpty", 0}, {"isMember", 1}, {"minElem", 2}, {"maxElem", 3}, {"lt", 4}, - {"compose", 5}, {"inv", 6}, {"image", 7}, {"preImage", 8}, {"dom", 9}, {"combine", 10}, {"minMap", 11}, - {"reduce", 12}, {"minAdj", 13}, {"CC", 14}, {"minReach", 15}, {"matching", 16}, {"scc", 17}, - {"sort", 18}, {"firstInv", 19}, {"matchSCC", 20}}; +FuncEnvType FuncEnv::mapping_ = { + {"isEmpty", 0}, {"isMember", 1}, {"minElem", 2}, {"maxElem", 3}, {"lt", 4} + , {"compose", 5}, {"inv", 6}, {"image", 7}, {"preImage", 8}, {"dom", 9} + , {"combine", 10}, {"minMap", 11}, {"reduce", 12}, {"minAdj", 13}, {"CC", 14} + , {"minReach", 15}, {"matching", 16}, {"scc", 17}, {"sort", 18} + , {"firstInv", 19}, {"matchSCC", 20}, {"matchSCCTS", 21} +}; MaybeFValue FuncEnv::operator[](FKey k) const { diff --git a/eval/defs.hpp b/eval/defs.hpp index 99261fc..2ff1158 100755 --- a/eval/defs.hpp +++ b/eval/defs.hpp @@ -123,8 +123,9 @@ struct FuncEnv{ static FuncEnvType mapping_; }; -typedef enum { empty, member, min, max, lt, comp, inv, im, preim, dom, comb, min_map, red, min_adj - , connected, min_reach, matching, scc, ts, first_inv, match_scc } Func; +typedef enum { empty, member, min, max, lt, comp, inv, im, preim, dom, comb + , min_map, red, min_adj, connected, min_reach, matching, scc, ts, first_inv + , match_scc, match_scc_ts } Func; // Classes for pretty printing ------------------------------------------------ diff --git a/eval/visitors/eval_expr.cpp b/eval/visitors/eval_expr.cpp index 257532b..d433173 100755 --- a/eval/visitors/eval_expr.cpp +++ b/eval/visitors/eval_expr.cpp @@ -317,11 +317,34 @@ auto match_scc_visitor_ = Util::Overload { return MapBaseType(scc.calculate()); }, [](auto a, auto b, auto c, auto d) { - Util::ERROR("Wrong arguments for scc"); + Util::ERROR("Wrong arguments for matching+scc"); return MapBaseType(); } }; +auto match_scc_ts_visitor_ = Util::Overload { + [](LIB::BaseSBG a, Util::MD_NAT b, Util::MD_NAT c, bool d) { + LIB::BaseMatch match(a.copy(b[0]), d); + match.calculate(c[0]); + LIB::BaseSCC scc(buildSCCFromMatching(match), d); + LIB::BasePWMap scc_res = scc.calculate(); + LIB::BaseTopSort ts(buildSortFromSCC(scc, scc_res), d); + return InfoBaseType(ts.calculate()); + }, + [](LIB::CanonSBG a, Util::MD_NAT b, Util::MD_NAT c, bool d) { + LIB::CanonMatch match(a.copy(b[0]), d); + match.calculate(c[0]); + LIB::CanonSCC scc(buildSCCFromMatching(match), d); + LIB::CanonPWMap scc_res = scc.calculate(); + LIB::CanonTopSort ts(buildSortFromSCC(scc, scc_res), d); + return InfoBaseType(ts.calculate()); + }, + [](auto a, auto b, auto c, auto d) { + Util::ERROR("Wrong arguments for matching+scc+ts"); + return InfoBaseType(); + } +}; + // ----------------------------------------------------------------------------- // Expression evaluator -------------------------------------------------------- // ----------------------------------------------------------------------------- @@ -709,6 +732,20 @@ ExprBaseType EvalExpression::operator()(AST::Call v) const } break; + case Eval::Func::match_scc_ts: + if (eval_args.size() == 3) { + arity_ok = true; + + SBGBaseType g = std::visit(EvalGraph{}, eval_args[0]); + NatBaseType copies = std::visit(EvalNatBT{}, eval_args[1]); + NatBaseType k = std::visit(EvalNatBT{}, eval_args[2]); + InfoBaseType result = std::visit( + match_scc_ts_visitor_, g, copies, k, std::variant(debug_) + ); + return result; + } + break; + default: Util::ERROR("EvalExpression: function %s not implemented", vname.c_str()); return Util::MD_NAT(0); diff --git a/sbg/map.cpp b/sbg/map.cpp index 86fdc46..bedae5d 100755 --- a/sbg/map.cpp +++ b/sbg/map.cpp @@ -113,6 +113,12 @@ SBGMap::SBGMap(Interval i, LExp le) : dom_(), exp_() { exp_ = Exp(le); } template +SBGMap::SBGMap(SetPiece mdi, Exp exp) : dom_(), exp_() { + compatible(mdi, exp); + dom_ = Set(mdi); + exp_ = exp; +} +template SBGMap::SBGMap(Set dom, Exp exp) : dom_(), exp_() { if (!dom.isEmpty()) { for (const SetPiece &mdi : dom) diff --git a/sbg/map.hpp b/sbg/map.hpp index 32526ac..43368e3 100755 --- a/sbg/map.hpp +++ b/sbg/map.hpp @@ -48,6 +48,7 @@ struct SBGMap { SBGMap(); SBGMap(Interval i, LExp le); + SBGMap(SetPiece mdi, Exp exp); SBGMap(Set dom, Exp exp); bool operator==(const SBGMap &other) const; diff --git a/sbg/pw_map.cpp b/sbg/pw_map.cpp index 8d0a5e4..8dae5df 100755 --- a/sbg/pw_map.cpp +++ b/sbg/pw_map.cpp @@ -261,6 +261,10 @@ PWMap PWMap::composition(const PWMap &other) const for (const Map &map2 : map2.maps_) res.emplaceBack(map1.composition(map2)); + std::cout << *this << "\n"; + std::cout << other << "\n"; + std::cout << res << "\n\n"; + return res; } @@ -868,7 +872,6 @@ template PWMap PWMap::compact() const { PWMap res; - std::cout << "this: " << *this << "\n"; if (dom().isEmpty()) return res; @@ -895,8 +898,6 @@ PWMap PWMap::compact() const } } - std::cout << "res: " << res << "\n\n"; - return res; } diff --git a/sbg/sbg_algorithms.cpp b/sbg/sbg_algorithms.cpp index 9f5db50..d1ec9fe 100755 --- a/sbg/sbg_algorithms.cpp +++ b/sbg/sbg_algorithms.cpp @@ -673,7 +673,7 @@ template MatchInfo SBGMatching::calculate(unsigned int k) { if (debug()) - Util::SBG_LOG << sbg() << "\n"; + Util::SBG_LOG << "Matching sbg: " << sbg() << "\n\n"; set_k(k); auto begin = std::chrono::high_resolution_clock::now(); @@ -790,15 +790,11 @@ template PWMap SBGSCC::calculate() { if (debug()) - Util::SBG_LOG << dsbg() << "\n\n"; + Util::SBG_LOG << "SCC dsbg: " << dsbg() << "\n\n"; do { sccStep(); - if (debug()) - Util::SBG_LOG << "Call\n\n"; sccStep(); - if (debug()) - Util::SBG_LOG << "Call\n\n"; } while (Ediff() != Set()); DSBGraph aux_dsbg( @@ -810,6 +806,9 @@ PWMap SBGSCC::calculate() PW new_rmap = min_reach.calculate(Set(), V()).reps(); set_rmap(new_rmap); + if (debug()) + Util::SBG_LOG << "SCC result: " << new_rmap << "\n\n"; + return rmap(); } @@ -896,6 +895,9 @@ Set SBGTopSort::topSortStep() template VertexOrder SBGTopSort::calculate() { + if (debug()) + Util::SBG_LOG << "Topological sort dsbg:\n" << dsbg() << "\n\n"; + VertexOrder res; do { @@ -904,6 +906,9 @@ VertexOrder SBGTopSort::calculate() res.emplaceBack(nth); } while (!disordered().isEmpty()); + if (debug()) + Util::SBG_LOG << "Topological sort result:\n" << res << "\n\n"; + return res; } @@ -999,6 +1004,53 @@ DSBGraph buildSCCFromMatching(const SBGMatching &match) template BaseDSBG buildSCCFromMatching(const BaseMatch &match); template CanonDSBG buildSCCFromMatching(const CanonMatch &match); +template +DSBGraph buildSortFromSCC( + const SBGSCC &scc, const PWMap &rmap +) +{ + PWMap aux_rmap = rmap.compact(); + PWMap reps_rmap = aux_rmap.filterMap([](const SBGMap &sbgmap) { + return eqId(sbgmap); + }); + Set V = reps_rmap.dom(); + + PWMap Vmap; + unsigned int j = 1, dims = rmap.nmbrDims(); + for (SetPiece mdi : V) { + Util::MD_NAT v(dims, j); + Vmap.emplaceBack(SBGMap(mdi, Exp(v))); + ++j; + } + + DSBGraph dsbg = scc.dsbg(); + Set Ediff = dsbg.E().difference(scc.E()); + PWMap mapB = rmap.composition(dsbg.mapB().restrict(Ediff)); + PWMap mapD = rmap.composition(dsbg.mapD().restrict(Ediff)); + + j = 1; + PWMap Emap; + for (const SBGMap &map1 : Vmap) { + Set edges1 = mapB.preImage(map1.dom()); + for (const SBGMap &map2 : Vmap) { + Set edges2 = mapD.preImage(map2.dom()); + Set dom = edges1.intersection(edges2); + Exp exp(Util::MD_NAT(dims, j)); + + Emap.emplaceBack(SBGMap(dom.compact(), exp)); + ++j; + } + } + PWMap subE_map = dsbg.subE_map().restrict(Ediff); + + DSBGraph res(V, Vmap, mapB, mapD, Emap); + res.set_subE_map(subE_map); + return res; +} + +template BaseDSBG buildSortFromSCC(const BaseSCC &scc, const BasePWMap &rmap); +template CanonDSBG buildSortFromSCC(const CanonSCC &scc, const CanonPWMap &rmap); + } // namespace LIB } // namespace SBG diff --git a/sbg/sbg_algorithms.hpp b/sbg/sbg_algorithms.hpp index bf762ed..9dc961b 100755 --- a/sbg/sbg_algorithms.hpp +++ b/sbg/sbg_algorithms.hpp @@ -177,10 +177,10 @@ struct SBGSCC { member_class(Set, V); member_class(PW, Vmap); - member_class(Set, E); member_class(PW, Emap); //----------------------------- + member_class(Set, E); // Edges in the same SCC in each step member_class(Set, Ediff); // Edges between different SCC in each step member_class(PW, mapB); @@ -253,6 +253,9 @@ typedef SBGTopSort CanonTopSort; template DSBGraph buildSCCFromMatching(const SBGMatching &match); +template +DSBGraph buildSortFromSCC(const SBGSCC &scc, const PWMap &rmap); + } // namespace LIB } // namespace SBG diff --git a/test/sbg1.test b/test/cc1.test similarity index 100% rename from test/sbg1.test rename to test/cc1.test diff --git a/test/sbg2.test b/test/cc2.test similarity index 100% rename from test/sbg2.test rename to test/cc2.test diff --git a/test/implicit_indices.test b/test/implicit_indices.test index 3d5d96d..17a0703 100644 --- a/test/implicit_indices.test +++ b/test/implicit_indices.test @@ -1,10 +1,12 @@ -// model implicit_indices -// Real a[100][100], b[100]; -// equation -// for i in 1:100 loop -// a[i] = b; -// end loop; -// end implicit_indices +/* +model implicit_indices + Real a[100][100], b[100]; +equation + for i in 1:100 loop + a[i] = b; + end loop; +end implicit_indices +*/ dims = 2 diff --git a/test/sbg5.test b/test/matching1.test similarity index 100% rename from test/sbg5.test rename to test/matching1.test diff --git a/test/sbg4.test b/test/matching2.test similarity index 100% rename from test/sbg4.test rename to test/matching2.test diff --git a/test/sbg7.test b/test/matching3.test similarity index 100% rename from test/sbg7.test rename to test/matching3.test diff --git a/test/sbg6.test b/test/rc_matching.test similarity index 89% rename from test/sbg6.test rename to test/rc_matching.test index 407ec60..bdad0a2 100644 --- a/test/sbg6.test +++ b/test/rc_matching.test @@ -1,4 +1,23 @@ -// Matching test, RC circuit with variables iR, vA, vB, der(vC) +/* +model rc + constant Integer n=100; + parameter Real RA=1,RB=1,C=1,i0=1; + Real vA[n],vB[n],vC[n],iR[n]; +equation + iR[1]=i0; // Eq.(1) + for i in 1:n loop + vA[i]=RA*iR[i]; //Eq.(2) + vB[i]=RB*iR[i]; //Eq.(3) + end for; + for i in 2:n loop + vA[i]+vB[i]=vC[i-1]-vC[i]; //Eq.(4) + end for; + for i in 1:n-1 loop + C*der(vC[i])=iR[i]-iR[i+1]; //Eq.(5) + end for; + C*der(vC[n])=iR[n]; //Eq.(6) +end rc; +*/ N = 100000 diff --git a/test/rc_scc.test b/test/rc_scc.test deleted file mode 100644 index 3c110be..0000000 --- a/test/rc_scc.test +++ /dev/null @@ -1,70 +0,0 @@ -// SCC test of the RC circuit example - -N = 100 - -FU11 = 1 -FU21 = N-1+FU11 -FU22 = 1+FU21 -FU33 = N+FU22 -FU42 = N-1+FU33 -FU54 = N-1+FU42 -FU64 = 1+FU54 - -E1 = N-1 // FU21 - FU42 -E2 = 1+E1 // FU22 - FU11 -E3 = 1+E2 // FU33 - FU11 -E4 = N-1+E3 // FU33 - FU21 -E5 = N-1+E4 // FU42 - FU33 -E6 = 1+E5 // FU54 - FU11 -E7 = N-2+E6 // FU54 - FU21 -E8 = 1+E7 // FU64 - FU21 - -off1b = r(FU21, 1)-r(E1, 1) -off2b = r(FU22, 1)-r(E2, 1) -off3b = r(FU33, 1)-r(E3, 1)-N+1 -off4b = r(FU33, 1)-r(E4, 1) -off5b = r(FU42, 1)-r(E5, 1) -off6b = r(FU54, 1)-r(E6, 1)-N+2 -off7b = r(FU54, 1)-r(E7, 1) -off8b = r(FU64, 1)-r(E8, 1) - -off1d = r(FU42, 1)-r(E1, 1) -off2d = r(FU11, 1)-r(E2, 1) -off3d = r(FU11, 1)-r(E3, 1) -off4d = r(FU21, 1)-r(E4, 1) -off5d = r(FU33, 1)-r(E5, 1) -off6d = r(FU11, 1)-r(E6, 1) -off7d = r(FU21, 1)-r(E7, 1)-1 -off8d = r(FU21, 1)-r(E8, 1) - -V %= {[1:1:FU11], [FU11+1:1:FU21], [FU21+1:1:FU22], [FU22+1:1:FU33] - , [FU33+1:1:FU42], [FU42+1:1:FU54], [FU54+1:1:FU64]}; -Vmap %= <<{[1:1:FU11]} -> 0*x+1, {[FU11+1:1:FU21]} -> 0*x+2, {[FU21+1:1:FU22]} -> 0*x+3 - , {[FU22+1:1:FU33]} -> 0*x+4 , {[FU33+1:1:FU42]} -> 0*x+5 - , {[FU42+1:1:FU54]} -> 0*x+6, {[FU54+1:1:FU64]} -> 0*x+7>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; - -scc( - V %= {[1:1:FU11], [FU11+1:1:FU21], [FU21+1:1:FU22], [FU22+1:1:FU33] - , [FU33+1:1:FU42], [FU42+1:1:FU54], [FU54+1:1:FU64]}; - Vmap %= <<{[1:1:FU11]} -> 0*x+1, {[FU11+1:1:FU21]} -> 0*x+2, {[FU21+1:1:FU22]} -> 0*x+3 - , {[FU22+1:1:FU33]} -> 0*x+4 , {[FU33+1:1:FU42]} -> 0*x+5 - , {[FU42+1:1:FU54]} -> 0*x+6, {[FU54+1:1:FU64]} -> 0*x+7>>; - mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; - mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; - Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; -) diff --git a/test/rc_ts.test b/test/rc_ts.test index d183937..aa0132b 100644 --- a/test/rc_ts.test +++ b/test/rc_ts.test @@ -1,52 +1,108 @@ -// Topological sort test of the RC circuit example +/* +model rc + constant Integer n=100; + parameter Real RA=1,RB=1,C=1,i0=1; + Real vA[n],vB[n],vC[n],iR[n]; +equation + iR[1]=i0; // Eq.(1) + for i in 1:n loop + vA[i]=RA*iR[i]; //Eq.(2) + vB[i]=RB*iR[i]; //Eq.(3) + end for; + for i in 2:n loop + vA[i]+vB[i]=vC[i-1]-vC[i]; //Eq.(4) + end for; + for i in 1:n-1 loop + C*der(vC[i])=iR[i]-iR[i+1]; //Eq.(5) + end for; + C*der(vC[n])=iR[n]; //Eq.(6) +end rc; +*/ -N = 100000 +N = 100 -FU11 = 1 -FU21 = N-1+FU11 -FU22 = 1+FU21 -FU33 = 1+FU22 -FU54 = N-1+FU33 -FU64 = 1+FU54 +F1 = 1 +F2 = N+F1 +F3 = N+F2 +F4 = N-1+F3 +F5 = N-1+F4 +F6 = 1+F5 +U1 = N+F6 +U2 = N+U1 +U3 = N+U2 +U4 = N+U3 -E1 = 1 // FU22 - FU11 -E2 = 1+E1 // FU33 - FU11 -E3 = 1+E2 // FU54 - FU11 -E4 = N-2+E3 // FU54 - FU21 -E5 = 1+E4 // FU64 - FU21 +E1 = 1 +E2 = N+E1 +E3 = N+E2 +E4 = N+E3 +E5 = N+E4 +E6 = N-1+E5 +E7 = N-1+E6 +E8a = N-1+E7 +E8b = N-1+E8a +E9 = N-1+E8b +E10 = 1+E9 +E11 = 1+E10 -off1b = r(FU22, 1)-r(E1, 1) -off2b = r(FU33, 1)-r(E2, 1) -off3b = r(FU54, 1)-r(E3, 1)-N+2 -off4b = r(FU54, 1)-r(E4, 1) -off5b = r(FU64, 1)-r(E5, 1) +off1b = 4*N +off2b = 4*N-1 +off3d = N +off3b = off2b +off4d = N +off4b = 2*N-1 +off5d = 2*N +off5b = 3*N-1 +off6d = 2*N +off6b = N +off7d = 3*N-1 +off7b = N+1 +off8ad = 3*N-1 +off8ab = 2*N-1 +off8bd = 4*N-2 +off8bb = 3*N-3 +off9d = 5*N-3 +off9b = N-3 +off10d = 5*N-3 +off10b = 4*N-3 +off11d = 5*N-2 +off11b = N-2 -off1d = r(FU11, 1)-r(E1, 1) -off2d = r(FU11, 1)-r(E2, 1) -off3d = r(FU11, 1)-r(E3, 1) -off4d = r(FU21, 1)-r(E4, 1) -off5d = r(FU21, 1)-r(E5, 1) - -V %= {[1:1:FU11], [FU11+1:1:FU21], [FU21+1:1:FU22], [FU22+1:1:FU33] - , [FU33+1:1:FU54], [FU54+1:1:FU64]}; -Vmap %= <<{[1:1:FU11]} -> 0*x+1, {[FU11+1:1:FU21]} -> 0*x+2, {[FU21+1:1:FU22]} -> 0*x+3 - , {[FU22+1:1:FU33]} -> 0*x+4 , {[FU33+1:1:FU54]} -> 0*x+5, {[FU54+1:1:FU64]} -> 0*x+6>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d>>; +V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:F4], [F4+1:1:F5], [F5+1:1:F6], [F6+1:1:U1] + , [U1+1:1:U2], [U2+1:1:U3], [U3+1:1:U4]}; +Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3, {[F3+1:1:F4]} -> 0*x+4 + , {[F4+1:1:F5]} -> 0*x+5, {[F5+1:1:F6]} -> 0*x+6, {[F6+1:1:U1]} -> 0*x+7 + , {[U1+1:1:U2]} -> 0*x+8, {[U2+1:1:U3]} -> 0*x+9, {[U3+1:1:U4]} -> 0*x+10>>; +map1 %= <<{[1:1:E1]} -> 1*x+0, {[E1+1:1:E2]} -> 1*x+0, {[E2+1:1:E3]} -> 1*x-off3d + , {[E3+1:1:E4]} -> 1*x-off4d, {[E4+1:1:E5]} -> 1*x-off5d, {[E5+1:1:E6]} -> 1*x-off6d + , {[E6+1:1:E7]} -> 1*x-off7d, {[E7+1:1:E8a]} -> 1*x-off8ad, {[E8a+1:1:E8b]} -> 1*x-off8bd + , {[E8b+1:1:E9]} -> 1*x-off9d, {[E9+1:1:E10]} -> 1*x-off10d, {[E10+1:1:E11]} -> 1*x-off11d>>; +map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b + , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b + , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8a]} -> 1*x-off8ab, {[E8a+1:1:E8b]} -> 1*x-off8bb + , {[E8b+1:1:E9]} -> 1*x-off9b, {[E9+1:1:E10]} -> 1*x-off10b, {[E10+1:1:E11]} -> 1*x-off11b>>; Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5>>; + , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 + , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8a], [E8a+1:1:E8b]} -> 0*x+8, {[E8b+1:1:E9]} -> 0*x+9 + , {[E9+1:1:E10]} -> 0*x+10, {[E10+1:1:E11]} -> 0*x+11>>; -sort( - V %= {[1:1:FU11], [FU11+1:1:FU21], [FU21+1:1:FU22], [FU22+1:1:FU33] - , [FU33+1:1:FU54], [FU54+1:1:FU64]}; - Vmap %= <<{[1:1:FU11]} -> 0*x+1, {[FU11+1:1:FU21]} -> 0*x+2, {[FU21+1:1:FU22]} -> 0*x+3 - , {[FU22+1:1:FU33]} -> 0*x+4 , {[FU33+1:1:FU54]} -> 0*x+5, {[FU54+1:1:FU64]} -> 0*x+6>>; - mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b>>; - mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d>>; +matchSCCTS( + V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:F4], [F4+1:1:F5], [F5+1:1:F6], [F6+1:1:U1] + , [U1+1:1:U2], [U2+1:1:U3], [U3+1:1:U4]}; + Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3, {[F3+1:1:F4]} -> 0*x+4 + , {[F4+1:1:F5]} -> 0*x+5, {[F5+1:1:F6]} -> 0*x+6, {[F6+1:1:U1]} -> 0*x+7 + , {[U1+1:1:U2]} -> 0*x+8, {[U2+1:1:U3]} -> 0*x+9, {[U3+1:1:U4]} -> 0*x+10>>; + map1 %= <<{[1:1:E1]} -> 1*x+0, {[E1+1:1:E2]} -> 1*x+0, {[E2+1:1:E3]} -> 1*x-off3d + , {[E3+1:1:E4]} -> 1*x-off4d, {[E4+1:1:E5]} -> 1*x-off5d, {[E5+1:1:E6]} -> 1*x-off6d + , {[E6+1:1:E7]} -> 1*x-off7d, {[E7+1:1:E8a]} -> 1*x-off8ad, {[E8a+1:1:E8b]} -> 1*x-off8bd + , {[E8b+1:1:E9]} -> 1*x-off9d, {[E9+1:1:E10]} -> 1*x-off10d, {[E10+1:1:E11]} -> 1*x-off11d>>; + map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b + , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b + , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8a]} -> 1*x-off8ab, {[E8a+1:1:E8b]} -> 1*x-off8bb + , {[E8b+1:1:E9]} -> 1*x-off9b, {[E9+1:1:E10]} -> 1*x-off10b, {[E10+1:1:E11]} -> 1*x-off11b>>; Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5>>; + , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 + , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8a], [E8a+1:1:E8b]} -> 0*x+8, {[E8b+1:1:E9]} -> 0*x+9 + , {[E9+1:1:E10]} -> 0*x+10, {[E10+1:1:E11]} -> 0*x+11>>; + , 1, 6 ) diff --git a/test/sbg10_scc.test b/test/sbg10_scc.test deleted file mode 100644 index cc7c93b..0000000 --- a/test/sbg10_scc.test +++ /dev/null @@ -1,72 +0,0 @@ -// SCC of Test2 from the paper - -N = 100 - -F1x = N-2 -F2a = N-2+F1x -F3b = N-2+F2a -F4b = 1+F3b -F5b = 1+F4b -F6x = 1+F5b -F7x = 1+F6x -F8a = 1+F7x -F9a = 1+F8a - -E1 = N-2 // F1x - F2a -E2 = N-3+E1 // F2a - F2a -E3 = N-2+E2 // F2a - F3b -E4 = 1+E3 // F2a - F9a -E5 = 1+E4 // F6x - F8a -E6 = 1+E5 // F7x F9a -E7 = 1+E6 // F8a - F2a -E8 = 1+E7 // F8a - F4b - -off1d = r(F2a, 1)-r(E1, 1) -off2d = r(F2a, 1)-r(E2, 1) -off3d = r(F3b, 1)-r(E3, 1) -off4d = r(F9a, 1)-r(E4, 1) -off5d = r(F8a, 1)-r(E5, 1) -off6d = r(F9a, 1)-r(E6, 1) -off7d = r(F2a, 1)-r(E7, 1)-N+4 -off8d = r(F4b, 1)-r(E8, 1) - -off1b = r(F1x, 1)-r(E1, 1) -off2b = r(F2a, 1)-r(E2, 1)-1 -off3b = r(F2a, 1)-r(E3, 1) -off4b = r(F2a, 1)-r(E4, 1) -off5b = r(F6x, 1)-r(E5, 1) -off6b = r(F7x, 1)-r(E6, 1) -off7b = r(F8a, 1)-r(E7, 1) -off8b = r(F8a, 1)-r(E8, 1) - -V %= {[1:1:F1x], [F1x+1:1:F2a], [F2a+1:1:F3b], [F3b+1:1:F4b], [F4b+1:1:F5b], [F5b+1:1:F6x] - , [F6x+1:1:F7x], [F7x+1:1:F8a], [F8a+1:1:F9a]}; -Vmap %= <<{[1:1:F1x]} -> 0*x+1, {[F1x+1:1:F2a]} -> 0*x+2, {[F2a+1:1:F3b]} -> 0*x+3 - , {[F3b+1:1:F4b]} -> 0*x+4, {[F4b+1:1:F5b]} -> 0*x+5, {[F5b+1:1:F6x]} -> 0*x+6 - , {[F6x+1:1:F7x]}-> 0*x+7, {[F7x+1:1:F8a]} -> 0*x+8, {[F8a+1:1:F9a]} -> 0*x+9>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; - -scc( -V %= {[1:1:F1x], [F1x+1:1:F2a], [F2a+1:1:F3b], [F3b+1:1:F4b], [F4b+1:1:F5b], [F5b+1:1:F6x] - , [F6x+1:1:F7x], [F7x+1:1:F8a], [F8a+1:1:F9a]}; -Vmap %= <<{[1:1:F1x]} -> 0*x+1, {[F1x+1:1:F2a]} -> 0*x+2, {[F2a+1:1:F3b]} -> 0*x+3 - , {[F3b+1:1:F4b]} -> 0*x+4, {[F4b+1:1:F5b]} -> 0*x+5, {[F5b+1:1:F6x]} -> 0*x+6 - , {[F6x+1:1:F7x]}-> 0*x+7, {[F7x+1:1:F8a]} -> 0*x+8, {[F8a+1:1:F9a]} -> 0*x+9>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; -) diff --git a/test/sbg11_scc.test b/test/sbg11_scc.test deleted file mode 100644 index 5b06962..0000000 --- a/test/sbg11_scc.test +++ /dev/null @@ -1,72 +0,0 @@ -// SCC of Test3 from the paper - -N = 100 - -F1x = N-2 -F2a = N-2+F1x -F3b = N-2+F2a -F4b = 1+F3b -F5b = 1+F4b -F6x = 1+F5b -F7x = 1+F6x -F8a = 1+F7x -F9a = 1+F8a - -E1 = N-2 // F1x - F2a -E2 = N-3+E1 // F2a - F2a -E3 = N-2+E2 // F2a - F3b -E4 = 1+E3 // F2a - F8a -E5 = 1+E4 // F6x - F9a -E6 = 1+E5 // F7x - F2a -E7 = 1+E6 // F8a - F4b -E8 = 1+E7 // F8a - F9a - -off1d = r(F2a, 1)-r(E1, 1) -off2d = r(F2a, 1)-r(E2, 1)-1 -off3d = r(F3b, 1)-r(E3, 1) -off4d = r(F8a, 1)-r(E4, 1) -off5d = r(F9a, 1)-r(E5, 1) -off6d = r(F2a, 1)-r(E6, 1) -off7d = r(F4b, 1)-r(E7, 1) -off8d = r(F9a, 1)-r(E8, 1) - -off1b = r(F1x, 1)-r(E1, 1) -off2b = r(F2a, 1)-r(E2, 1) -off3b = r(F2a, 1)-r(E3, 1) -off4b = r(F2a, 1)-r(E4, 1)-N+3 -off5b = r(F6x, 1)-r(E5, 1) -off6b = r(F7x, 1)-r(E6, 1) -off7b = r(F8a, 1)-r(E7, 1) -off8b = r(F8a, 1)-r(E8, 1) - -V %= {[1:1:F1x], [F1x+1:1:F2a], [F2a+1:1:F3b], [F3b+1:1:F4b], [F4b+1:1:F5b], [F5b+1:1:F6x] - , [F6x+1:1:F7x], [F7x+1:1:F8a], [F8a+1:1:F9a]}; -Vmap %= <<{[1:1:F1x]} -> 0*x+1, {[F1x+1:1:F2a]} -> 0*x+2, {[F2a+1:1:F3b]} -> 0*x+3 - , {[F3b+1:1:F4b]} -> 0*x+4, {[F4b+1:1:F5b]} -> 0*x+5, {[F5b+1:1:F6x]} -> 0*x+6 - , {[F6x+1:1:F7x]}-> 0*x+7, {[F7x+1:1:F8a]} -> 0*x+8, {[F8a+1:1:F9a]} -> 0*x+9>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; - -scc( -V %= {[1:1:F1x], [F1x+1:1:F2a], [F2a+1:1:F3b], [F3b+1:1:F4b], [F4b+1:1:F5b], [F5b+1:1:F6x] - , [F6x+1:1:F7x], [F7x+1:1:F8a], [F8a+1:1:F9a]}; -Vmap %= <<{[1:1:F1x]} -> 0*x+1, {[F1x+1:1:F2a]} -> 0*x+2, {[F2a+1:1:F3b]} -> 0*x+3 - , {[F3b+1:1:F4b]} -> 0*x+4, {[F4b+1:1:F5b]} -> 0*x+5, {[F5b+1:1:F6x]} -> 0*x+6 - , {[F6x+1:1:F7x]}-> 0*x+7, {[F7x+1:1:F8a]} -> 0*x+8, {[F8a+1:1:F9a]} -> 0*x+9>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 - , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6 - , {[E6+1:1:E7]} -> 0*x+7, {[E7+1:1:E8]} -> 0*x+8>>; -) diff --git a/test/sbg12.test b/test/sbg12.test deleted file mode 100644 index d8bec08..0000000 --- a/test/sbg12.test +++ /dev/null @@ -1,122 +0,0 @@ -// Matching Test3 of the paper, multiple copies - -N = 10000 - -F1 = N-2 -F2 = N-2+F1 -F3 = N-2+F2 -F4 = 1+F3 -F5 = 1+F4 -F6 = 1+F5 -F7 = 1+F6 -F8 = 1+F7 -F9 = 1+F8 -U1 = N+F9 // a -U2 = N+U1 // b -U3 = N+U2 // der(x) - -E1 = N-2 // F1 - a[i] -E2 = N-2+E1 // F1 - der(x[i]) -E3 = N-2+E2 // F2 - a[i] -E4 = N-2+E3 // F2 - a[i+1] -E5 = N-2+E4 // F2 - b[i] -E6 = N-2+E5 // F3 - b[i] -E7 = 1+E6 // F4 - b[1] -E8 = 1+E7 // F5 - b[N] -E9 = 1+E8 // F6 - a[1] -E10 = 1+E9 // F6 - der(x[1]) -E11 = 1+E10 // F7 - a[N] -E12 = 1+E11 // F7 - der(x[N]) -E13 = 1+E12 // F8 - a[1] -E14 = 1+E13 // F8 - a[2] -E15 = 1+E14 // F8 - b[1] -E16 = 1+E15 // F9 - a[1] - -off1d = 0 -off2d = r(F1, 1)-r(E2, 1) -off3d = r(F2, 1)-r(E3, 1) -off4d = r(F2, 1)-r(E4, 1) -off5d = r(F2, 1)-r(E5, 1) -off6d = r(F3, 1)-r(E6, 1) -off7d = r(F4, 1)-r(E7, 1) -off8d = r(F5, 1)-r(E8, 1) -off9d = r(F6, 1)-r(E9, 1) -off10d = r(F6, 1)-r(E10, 1) -off11d = r(F7, 1)-r(E11, 1) -off12d = r(F7, 1)-r(E12, 1) -off13d = r(F8, 1)-r(E13, 1) -off14d = r(F8, 1)-r(E14, 1) -off15d = r(F8, 1)-r(E15, 1) -off16d = r(F9, 1)-r(E16, 1) - -off1b = r(U1, 1)-r(E1, 1)-1 -off2b = r(U3, 1)-r(E2, 1)-1 -off3b = r(U1, 1)-r(E3, 1)-1 -off4b = r(U1, 1)-r(E4, 1) -off5b = r(U2, 1)-r(E5, 1)-1 -off6b = r(U2, 1)-r(E6, 1)-1 -off7b = r(U2, 1)-r(E7, 1)-N+1 -off8b = r(U2, 1)-r(E8, 1) -off9b = r(U1, 1)-r(E9, 1)-N+1 -off10b = r(U3, 1)-E10-N+1 -off11b = r(U1, 1)-E11 -off12b = r(U3, 1)-E12 -off13b = r(U1, 1)-E13-N+1 -off14b = r(U1, 1)-E14-N+2 -off15b = r(U2, 1)-E15-N+1 -off16b = r(U1, 1)-E16-N+1 - -V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:F4], [F4+1:1:F5], [F5+1:1:F6] - , [F6+1:1:F7], [F7+1:1:F8], [F8+1:1:F9] - , [F9+1:1:U1], [U1+1:1:U2], [U2+1:1:U3]}; -Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3 - , {[F3+1:1:F4]} -> 0*x+4, {[F4+1:1:F5]} -> 0*x+5, {[F5+1:1:F6]} -> 0*x+6 - , {[F6+1:1:F7]}-> 0*x+7, {[F7+1:1:F8]} -> 0*x+8, {[F8+1:1:F9]} -> 0*x+9 - , {[F9+1:1:U1]} -> 0*x+10, {[U1+1:1:U2]} -> 0*x+11, {[U2+1:1:U3]} -> 0*x+12>>; -map1 %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d, {[E8+1:1:E9]} -> 1*x+off9d - , {[E9+1:1:E10]} -> 1*x+off10d, {[E10+1:1:E11]} -> 1*x+off11d, {[E11+1:1:E12]} -> 1*x+off12d - , {[E12+1:1:E13]} -> 1*x+off13d, {[E13+1:1:E14]} -> 1*x+off14d, {[E14+1:1:E15]} -> 1*x+off15d - , {[E15+1:1:E16]} -> 1*x+off16d>>; -map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b, {[E8+1:1:E9]} -> 1*x+off9b - , {[E9+1:1:E10]} -> 1*x+off10b, {[E10+1:1:E11]} -> 1*x+off11b, {[E11+1:1:E12]} -> 1*x+off12b - , {[E12+1:1:E13]} -> 1*x+off13b, {[E13+1:1:E14]} -> 1*x+off14b, {[E14+1:1:E15]} -> 1*x+off15b - , {[E15+1:1:E16]} -> 1*x+off16b>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3], [E3+1:1:E4]} -> 0*x+3 - , {[E4+1:1:E5]} -> 0*x+4, {[E5+1:1:E6]} -> 0*x+5 - , {[E6+1:1:E7]} -> 0*x+6, {[E7+1:1:E8]} -> 0*x+7, {[E8+1:1:E9]} -> 0*x+8 - , {[E9+1:1:E10]} -> 0*x+9, {[E10+1:1:E11]} -> 0*x+10, {[E11+1:1:E12]} -> 0*x+11 - , {[E12+1:1:E13], [E13+1:1:E14]} -> 0*x+12, {[E14+1:1:E15]} -> 0*x+13 - , {[E15+1:1:E16]} -> 0*x+14>>; - -matching( -V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:F4], [F4+1:1:F5], [F5+1:1:F6] - , [F6+1:1:F7], [F7+1:1:F8], [F8+1:1:F9] - , [F9+1:1:U1], [U1+1:1:U2], [U2+1:1:U3]}; -Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3 - , {[F3+1:1:F4]} -> 0*x+4, {[F4+1:1:F5]} -> 0*x+5, {[F5+1:1:F6]} -> 0*x+6 - , {[F6+1:1:F7]}-> 0*x+7, {[F7+1:1:F8]} -> 0*x+8, {[F8+1:1:F9]} -> 0*x+9 - , {[F9+1:1:U1]} -> 0*x+10, {[U1+1:1:U2]} -> 0*x+11, {[U2+1:1:U3]} -> 0*x+12>>; -map1 %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d - , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d - , {[E6+1:1:E7]} -> 1*x+off7d, {[E7+1:1:E8]} -> 1*x+off8d, {[E8+1:1:E9]} -> 1*x+off9d - , {[E9+1:1:E10]} -> 1*x+off10d, {[E10+1:1:E11]} -> 1*x+off11d, {[E11+1:1:E12]} -> 1*x+off12d - , {[E12+1:1:E13]} -> 1*x+off13d, {[E13+1:1:E14]} -> 1*x+off14d, {[E14+1:1:E15]} -> 1*x+off15d - , {[E15+1:1:E16]} -> 1*x+off16d>>; -map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b - , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b - , {[E6+1:1:E7]} -> 1*x+off7b, {[E7+1:1:E8]} -> 1*x+off8b, {[E8+1:1:E9]} -> 1*x+off9b - , {[E9+1:1:E10]} -> 1*x+off10b, {[E10+1:1:E11]} -> 1*x+off11b, {[E11+1:1:E12]} -> 1*x+off12b - , {[E12+1:1:E13]} -> 1*x+off13b, {[E13+1:1:E14]} -> 1*x+off14b, {[E14+1:1:E15]} -> 1*x+off15b - , {[E15+1:1:E16]} -> 1*x+off16b>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3], [E3+1:1:E4]} -> 0*x+3 - , {[E4+1:1:E5]} -> 0*x+4, {[E5+1:1:E6]} -> 0*x+5 - , {[E6+1:1:E7]} -> 0*x+6, {[E7+1:1:E8]} -> 0*x+7, {[E8+1:1:E9]} -> 0*x+8 - , {[E9+1:1:E10]} -> 0*x+9, {[E10+1:1:E11]} -> 0*x+10, {[E11+1:1:E12]} -> 0*x+11 - , {[E12+1:1:E13], [E13+1:1:E14]} -> 0*x+12, {[E14+1:1:E15]} -> 0*x+13 - , {[E15+1:1:E16]} -> 0*x+14>>; -, 4, 2 -) diff --git a/test/sbg3.test b/test/sbg3.test deleted file mode 100644 index ce42af8..0000000 --- a/test/sbg3.test +++ /dev/null @@ -1,34 +0,0 @@ -N = 100000000 -N1 = 50000000 -N2 = N-1 -N3 = N+N1 -N4 = 2*N+1 -N5 = 2*N -N6 = 3*N -N7 = N6 + N1 -N8 = N5 + 1 -N9 = N1 + N6 -N10 = N2 + N5 -N11 = N1 + 1 + N -N12 = N + 1 - -Vml = N1+N+1 -Eml = Vml-1 - - V %= {[Vml:1:Vml], [2*N:1:2*N], [N4:1:Vml+N2], [Vml+N2+2:1:4*N-1]}; - Vmap %= <<{[N4:1:N5+N1], [Vml:1:Vml], [N5+N1+2:1:3*N]} -> 0*x+1, {[2*N:1:2*N], [3*N+1:1:4*N-1]} -> 0*x+2>>; - mapB %= <<{[1:1:1]} -> 0*x+N4, {[2:1:N1]} -> 1*x+N5, {[N1+1:1:N1+1]} -> 0*x+N7, {[N1+2:1:N]} -> 1*x+N5, {[N+1:1:2*N-2]} -> 1*x+N8 - , {[2*N-1:1:2*N-1]} -> 0*x+N5>>; - mapD %= <<{[1:1:1]} -> 0*x+N9, {[2:1:N1]} -> 1*x+N10, {[N1+1:1:N1+1]} -> 0*x+N11, {[N1+2:1:N]} -> 1*x+N10, {[N+1:1:Eml-1]} -> 1*x+N12 - , {[Eml:1:Eml]} -> 1*x+1, {[Eml+1:1:2*N-2]} -> 1*x+N12, {[2*N-1:1:2*N-1]} -> 0*x+N6>>; - Emap %= <<{[1:1:1]} -> 0*x+1, {[2:1:N]} -> 0*x+2, {[N+1:1:2*N-1]} -> 0*x+3>>; - -minReach( - V %= {[Vml:1:Vml], [2*N:1:2*N], [N4:1:Vml+N2], [Vml+N2+2:1:4*N-1]}; - Vmap %= <<{[N4:1:N5+N1], [Vml:1:Vml], [N5+N1+2:1:3*N]} -> 0*x+1, {[2*N:1:2*N], [3*N+1:1:4*N-1]} -> 0*x+2>>; - mapB %= <<{[1:1:1]} -> 0*x+N4, {[2:1:N1]} -> 1*x+N5, {[N1+1:1:N1+1]} -> 0*x+N7, {[N1+2:1:N]} -> 1*x+N5, {[N+1:1:2*N-2]} -> 1*x+N8 - , {[2*N-1:1:2*N-1]} -> 0*x+N5>>; - mapD %= <<{[1:1:1]} -> 0*x+N9, {[2:1:N1]} -> 1*x+N10, {[N1+1:1:N1+1]} -> 0*x+N11, {[N1+2:1:N]} -> 1*x+N10, {[N+1:1:Eml-1]} -> 1*x+N12 - , {[Eml:1:Eml]} -> 1*x+1, {[Eml+1:1:2*N-2]} -> 1*x+N12, {[2*N-1:1:2*N-1]} -> 0*x+N6>>; - Emap %= <<{[1:1:1]} -> 0*x+1, {[2:1:N]} -> 0*x+2, {[N+1:1:2*N-1]} -> 0*x+3>>; -) diff --git a/test/sbg9_scc.test b/test/sbg9_scc.test deleted file mode 100644 index 9a42f6b..0000000 --- a/test/sbg9_scc.test +++ /dev/null @@ -1,33 +0,0 @@ -// SCC of Test1 from the paper - -N = 100 - -F1a = N -F2b = N+F1a -F3x = N+F2b - -E1 = N // F1a - F2b -E2 = N+E1 // F2b - F1a -E3 = N+E2 // F3x - F1a - -off1d = r(F2b, 1)-r(E1, 1) -off2d = r(F1a, 1)-r(E2, 1) -off3d = r(F1a, 1)-r(E3, 1) - -off1b = r(F1a, 1)-r(E1, 1) -off2b = r(F2b, 1)-r(E2, 1) -off3b = r(F3x, 1)-r(E3, 1) - -V %= {[1:1:F1a], [F1a+1:1:F2b], [F2b+1:1:F3x]}; -Vmap %= <<{[1:1:F1a]} -> 0*x+1, {[F1a+1:1:F2b]} -> 0*x+2, {[F2b+1:1:F3x]} -> 0*x+3>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3>>; - -scc( -V %= {[1:1:F1a], [F1a+1:1:F2b], [F2b+1:1:F3x]}; -Vmap %= <<{[1:1:F1a]} -> 0*x+1, {[F1a+1:1:F2b]} -> 0*x+2, {[F2b+1:1:F3x]} -> 0*x+3>>; -mapB %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b>>; -mapD %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d>>; -Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3>>; -) diff --git a/test/sbg9.test b/test/test1_matching.test similarity index 90% rename from test/sbg9.test rename to test/test1_matching.test index aa2402a..740ecf6 100644 --- a/test/sbg9.test +++ b/test/test1_matching.test @@ -1,4 +1,15 @@ -// Matching Test1 of the paper, one copy +/* +model Test1 + constant Integer N = 100; + Real a[N], b[N], x[N]; +equation + for i in 1:N loop + a[i] = 2 * x[i] - b[i]; + a[i] = 2 * b[i] - x[i]; + der(x[i]) = 1 - a[i]; + end for; +end Test1; +*/ N = 100000 diff --git a/test/test1_ts.test b/test/test1_ts.test new file mode 100644 index 0000000..c57b31f --- /dev/null +++ b/test/test1_ts.test @@ -0,0 +1,65 @@ +/* +model Test1 + constant Integer N = 100; + Real a[N], b[N], x[N]; +equation + for i in 1:N loop + a[i] = 2 * x[i] - b[i]; + a[i] = 2 * b[i] - x[i]; + der(x[i]) = 1 - a[i]; + end for; +end Test1; +*/ + +N = 100000 + +F1 = N +F2 = N+F1 +F3 = N+F2 +U1 = N+F3 +U2 = N+U1 +U3 = N+U2 + +E1 = N // F1 - a[i] +E2 = N+E1 // F1 - b[i] +E3 = N+E2 // F2 - a[i] +E4 = N+E3 // F2 - b[i] +E5 = N+E4 // F3 - a[i] +E6 = N+E5 // F3 - der(x[i]) + +off1d = 0 +off2d = r(F1, 1)-r(E2, 1) +off3d = r(F2, 1)-r(E3, 1) +off4d = r(F2, 1)-r(E4, 1) +off5d = r(F3, 1)-r(E5, 1) +off6d = r(F3, 1)-r(E6, 1) + +off1b = r(U1, 1)-r(E1, 1) +off2b = r(U2, 1)-r(E2, 1) +off3b = r(U1, 1)-r(E3, 1) +off4b = r(U2, 1)-r(E4, 1) +off5b = r(U1, 1)-r(E5, 1) +off6b = r(U3, 1)-r(E6, 1) + +V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:U1], [U1+1:1:U2], [U2+1:1:U3]}; +Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3 + , {[F3+1:1:U1]} -> 0*x+10, {[U1+1:1:U2]} -> 0*x+11, {[U2+1:1:U3]} -> 0*x+12>>; +map1 %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d + , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d>>; +map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b + , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b>>; +Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 + , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6>>; + +matchSCCTS( +V %= {[1:1:F1], [F1+1:1:F2], [F2+1:1:F3], [F3+1:1:U1], [U1+1:1:U2], [U2+1:1:U3]}; +Vmap %= <<{[1:1:F1]} -> 0*x+1, {[F1+1:1:F2]} -> 0*x+2, {[F2+1:1:F3]} -> 0*x+3 + , {[F3+1:1:U1]} -> 0*x+10, {[U1+1:1:U2]} -> 0*x+11, {[U2+1:1:U3]} -> 0*x+12>>; +map1 %= <<{[1:1:E1]} -> 1*x+off1d, {[E1+1:1:E2]} -> 1*x+off2d, {[E2+1:1:E3]} -> 1*x+off3d + , {[E3+1:1:E4]} -> 1*x+off4d, {[E4+1:1:E5]} -> 1*x+off5d, {[E5+1:1:E6]} -> 1*x+off6d>>; +map2 %= <<{[1:1:E1]} -> 1*x+off1b, {[E1+1:1:E2]} -> 1*x+off2b, {[E2+1:1:E3]} -> 1*x+off3b + , {[E3+1:1:E4]} -> 1*x+off4b, {[E4+1:1:E5]} -> 1*x+off5b, {[E5+1:1:E6]} -> 1*x+off6b>>; +Emap %= <<{[1:1:E1]} -> 0*x+1, {[E1+1:1:E2]} -> 0*x+2, {[E2+1:1:E3]} -> 0*x+3 + , {[E3+1:1:E4]} -> 0*x+4, {[E4+1:1:E5]} -> 0*x+5, {[E5+1:1:E6]} -> 0*x+6>>; +, 1, 6 +) diff --git a/test/sbg10.test b/test/test2_matching.test similarity index 93% rename from test/sbg10.test rename to test/test2_matching.test index 2c45416..3c2a67f 100644 --- a/test/sbg10.test +++ b/test/test2_matching.test @@ -1,4 +1,22 @@ -// Matching Test2 of the paper, one copy +/* +model Test2 + //Model with possibly wrong initial matching + constant Integer N = 100; + Real a[N], x[N], b[N]; +equation + for i in 2:N-1 loop + der(x[i]) = a[i] - x[i]; + a[i + 1] = a[i] + b[i]; + b[i] = x[i - 1]; + end for; + b[1] = 0; + b[N] = x[N - 1]; + der(x[1]) = a[1] - x[1]; + der(x[N]) = a[N] - x[N]; + a[2] = a[1] + b[1]; + a[N] = 1; +end Test2; +*/ N = 100000 diff --git a/test/sbg11.test b/test/test3_matching.test similarity index 93% rename from test/sbg11.test rename to test/test3_matching.test index ed20899..338823a 100644 --- a/test/sbg11.test +++ b/test/test3_matching.test @@ -1,4 +1,21 @@ -// Matching Test3 of the paper, one copy +/* +model Test3 + constant Integer N = 100; + Real a[N], x[N], b[N]; +equation + for i in 2:N-1 loop + der(x[i]) = a[i] - x[i]; + a[i + 1] = a[i] + b[i]; + b[i] = x[i - 1]; + end for; + b[1] = 0; + b[N] = x[N - 1]; + der(x[1]) = a[1] - x[1]; + der(x[N]) = a[N] - x[N]; + a[1] = 1; + a[N] = a[N - 1] + b[N - 1]; +end Test3; +*/ N = 100000