Salome HOME
Use /tmp for temporary files needed by salome tests.
[modules/yacs.git] / src / engine / Test / engineTest.cxx
index cc823cc178709bec49826fa40c4ba7ad44935210..84f52bd736baa02f6ac473a8f3b09dee550f93fb 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2006-2015  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2019  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -26,6 +26,7 @@
 #include "Loop.hxx"
 #include "Switch.hxx"
 #include "VisitorSaveState.hxx"
+#include "SetOfPoints.hxx"
 
 #include "SharedPtr.hxx"
 #include "RuntimeForEngineTest.hxx"
@@ -999,7 +1000,7 @@ void EngineTest::RecursiveBlocs_multipleRecursion()
         DEBTRACE("     output port name for graphe = " << _nodeMap["graphe"]->getOutPortName(*it));
       }
     YACS::ENGINE::VisitorSaveState vst(_compoMap["graphe"]);
-    vst.openFileDump("dumpState.xml");
+    vst.openFileDump("/tmp/RecursiveBlocs_multipleRecursion_dumpState.xml");
     _compoMap["graphe"]->accept(&vst);
     vst.closeFileDump();
   }
@@ -1072,3 +1073,339 @@ void EngineTest::checkLogger()
   CPPUNIT_ASSERT(logger->getStr()==expected2);
   delete proc;
 }
+
+void EngineTest::checkGraphAnalyser0()
+{
+  {
+    static const int N=2;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[0],t[1]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(n1+n2) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser1()
+{
+  {
+    static const int N=24;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[20],t[21]); proc.edAddCFLink(t[21],t[15]); proc.edAddCFLink(t[15],t[14]); proc.edAddCFLink(t[14],t[0]); proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[23]); proc.edAddCFLink(t[23],t[5]);
+    proc.edAddCFLink(t[14],t[13]); proc.edAddCFLink(t[13],t[5]);
+    proc.edAddCFLink(t[15],t[12]); proc.edAddCFLink(t[12],t[11]); proc.edAddCFLink(t[11],t[9]); proc.edAddCFLink(t[9],t[8]); proc.edAddCFLink(t[8],t[7]); proc.edAddCFLink(t[7],t[6]); proc.edAddCFLink(t[6],t[5]);
+    proc.edAddCFLink(t[11],t[10]); proc.edAddCFLink(t[10],t[8]);
+    proc.edAddCFLink(t[15],t[16]); proc.edAddCFLink(t[16],t[17]); proc.edAddCFLink(t[17],t[19]); proc.edAddCFLink(t[19],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
+    proc.edAddCFLink(t[19],t[18]); proc.edAddCFLink(t[18],t[4]);
+    proc.edAddCFLink(t[19],t[3]); proc.edAddCFLink(t[3],t[4]);
+    proc.edAddCFLink(t[22],t[21]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="([n21*n23]+(n22+n16+[((n13+n12)+[n10*n11]+(n9+n8+n7))*((n17+n18+n20)+[n19*n3*n4]+n5)*(n15+[(n1+n2+n24)*n14])]+n6)) - ");
+  }
+  //
+  {
+    static const int N=10;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[9],t[0]); proc.edAddCFLink(t[0],t[2]); proc.edAddCFLink(t[2],t[4]); proc.edAddCFLink(t[4],t[5]);
+    proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[6]); proc.edAddCFLink(t[6],t[7]); proc.edAddCFLink(t[7],t[5]);
+    proc.edAddCFLink(t[0],t[8]); proc.edAddCFLink(t[8],t[3]); proc.edAddCFLink(t[3],t[4]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((n10+n1)+[([(n9+n4)*n3]+n5)*(n2+n7+n8)]+n6) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser2()
+{
+  {
+    static const int N=8;
+    Bloc *t[N];
+    Bloc proc("proc");
+    for(int i=0;i<N;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        t[i]=new Bloc(oss.str());
+        proc.edAddChild(t[i]);
+      }
+    proc.edAddCFLink(t[7],t[4]); proc.edAddCFLink(t[4],t[0]); proc.edAddCFLink(t[0],t[1]); proc.edAddCFLink(t[1],t[5]); proc.edAddCFLink(t[5],t[6]);
+    proc.edAddCFLink(t[4],t[2]); proc.edAddCFLink(t[2],t[3]); proc.edAddCFLink(t[3],t[5]);
+    std::vector< std::list<Node *> > r(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)r.size());
+    CPPUNIT_ASSERT_EQUAL(N,(int)r[0].size());
+    SetOfPoints sop(r[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((n8+n5)+[(n1+n2)*(n3+n4)]+(n6+n7)) - ");
+  }
+  //
+  {
+    static const int NN=6;
+    Bloc *tt[NN];
+    Bloc proc2("proc2");
+    tt[0]=new Bloc("n21") ; tt[1]=new Bloc("n22") ; tt[2]=new Bloc("n23") ; tt[3]=new Bloc("n16"); tt[4]=new Bloc("n21@1"); tt[5]=new Bloc("n23@1");
+    for(int i=0;i<NN;i++)
+      proc2.edAddChild(tt[i]);
+    proc2.edAddCFLink(tt[0],tt[4]); proc2.edAddCFLink(tt[4],tt[1]); proc2.edAddCFLink(tt[2],tt[5]); proc2.edAddCFLink(tt[5],tt[1]); proc2.edAddCFLink(tt[1],tt[3]);
+    std::vector< std::list<Node *> > rr(proc2.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rr.size());
+    CPPUNIT_ASSERT_EQUAL(NN,(int)rr[0].size());
+    SetOfPoints sop2(rr[0]);
+    sop2.simplify();
+    CPPUNIT_ASSERT(sop2.getRepr()=="([(n21+n21@1)*(n23+n23@1)]+(n22+n16)) - ");
+  }
+  //
+  {
+    static const int NNN=6;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc3");
+    ttt[0]=new Bloc("n21") ; ttt[1]=new Bloc("n22") ; ttt[2]=new Bloc("n23") ; ttt[3]=new Bloc("n16"); ttt[4]=new Bloc("n21@1"); ttt[5]=new Bloc("n23@1");
+    for(int i=0;i<NNN;i++)
+      proc3.edAddChild(ttt[i]);
+    proc3.edAddCFLink(ttt[0],ttt[4]); proc3.edAddCFLink(ttt[3],ttt[0]); proc3.edAddCFLink(ttt[2],ttt[5]); proc3.edAddCFLink(ttt[3],ttt[2]); proc3.edAddCFLink(ttt[1],ttt[3]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop3(rrr[0]);
+    sop3.simplify();
+    CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser3()
+{
+  {
+    static const int NNN=6;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc3");
+    for(int i=0;i<NNN;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        ttt[i]=new Bloc(oss.str());
+        proc3.edAddChild(ttt[i]);
+      }
+    proc3.edAddCFLink(ttt[0],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[4]);
+    proc3.edAddCFLink(ttt[0],ttt[2]); proc3.edAddCFLink(ttt[2],ttt[3]); proc3.edAddCFLink(ttt[3],ttt[4]);
+    proc3.edAddCFLink(ttt[5],ttt[3]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop3(rrr[0]);
+    //sop3.simplify();
+    //std:cerr  << std::endl << sop3.getRepr() << std::endl;
+    //CPPUNIT_ASSERT(sop3.getRepr()=="((n22+n16)+[(n21+n21@1)*(n23+n23@1)]) - ");
+  }
+}
+
+void EngineTest::checkGraphAnalyser4()
+{
+  {
+    static const int NNN=3;
+    Bloc *ttt[NNN];
+    Bloc proc3("proc");
+    for(int i=0;i<NNN;i++)
+      {
+        std::ostringstream oss; oss << "n" << i+1;
+        ttt[i]=new Bloc(oss.str());
+        proc3.edAddChild(ttt[i]);
+      }
+    proc3.edAddCFLink(ttt[2],ttt[1]); proc3.edAddCFLink(ttt[1],ttt[0]);
+    std::vector< std::list<Node *> > rrr(proc3.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL(NNN,(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(n3+n2+n1) - ");
+  }
+}
+
+/*!
+ * Case revealed by EmC2 on complex managers.
+ * Here basic combination of Link/Fork is not enough.
+ */
+void EngineTest::checkGraphAnalyser5()
+{
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[2],vn[3]);//C -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> D
+    proc.edAddCFLink(vn[1],vn[3]);//E -> F
+    proc.edAddCFLink(vn[3],vn[5]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="((A+[C*E])+[(F+G)*[D*E]]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","B","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[0],vn[3]);//A -> B
+    proc.edAddCFLink(vn[3],vn[4]);//B -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> F
+    proc.edAddCFLink(vn[2],vn[5]);//C -> D
+    proc.edAddCFLink(vn[1],vn[4]);//E -> F
+    proc.edAddCFLink(vn[4],vn[6]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","E","C","B","F","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> E
+    proc.edAddCFLink(vn[0],vn[2]);//A -> C
+    proc.edAddCFLink(vn[0],vn[3]);//A -> B
+    proc.edAddCFLink(vn[3],vn[4]);//B -> F
+    proc.edAddCFLink(vn[2],vn[4]);//C -> F
+    proc.edAddCFLink(vn[2],vn[5]);//C -> D
+    proc.edAddCFLink(vn[1],vn[4]);//E -> F
+    proc.edAddCFLink(vn[4],vn[6]);//F -> G
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","G"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> I
+    proc.edAddCFLink(vn[0],vn[2]);//A -> E
+    proc.edAddCFLink(vn[0],vn[3]);//A -> C
+    proc.edAddCFLink(vn[0],vn[4]);//A -> B
+    proc.edAddCFLink(vn[4],vn[6]);//B -> F
+    proc.edAddCFLink(vn[3],vn[7]);//C -> H
+    proc.edAddCFLink(vn[3],vn[6]);//C -> F
+    proc.edAddCFLink(vn[3],vn[8]);//C -> D
+    proc.edAddCFLink(vn[2],vn[6]);//E -> F
+    proc.edAddCFLink(vn[6],vn[9]);//F -> G
+    proc.edAddCFLink(vn[9],vn[5]);//G -> J
+    proc.edAddCFLink(vn[7],vn[5]);//H -> J
+    proc.edAddCFLink(vn[1],vn[5]);//I -> J
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[([C*[(F+G)*I]]+[([[(F+G)*H]*[(F+G)*I]]+J)*[[(F+G)*D]*[(F+G)*I]]])*[[B*[(F+G)*I]]*[E*[(F+G)*I]]]]) - ");
+  }
+  //
+  {
+    Bloc proc("TOP");
+    std::vector<Bloc *> vn;
+    std::vector<std::string> v{"A","I","E","C","B","J","F","H","D","K","G","L"};
+    std::size_t i=0;
+    for(auto it : v)
+      {
+        Bloc *pt(new Bloc(v[i++]));
+        proc.edAddChild(pt);
+        vn.push_back(pt);
+      }
+    //
+    proc.edAddCFLink(vn[0],vn[1]);//A -> I
+    proc.edAddCFLink(vn[0],vn[2]);//A -> E
+    proc.edAddCFLink(vn[0],vn[3]);//A -> C
+    proc.edAddCFLink(vn[0],vn[4]);//A -> B
+    proc.edAddCFLink(vn[4],vn[6]);//B -> F
+    proc.edAddCFLink(vn[3],vn[7]);//C -> H
+    proc.edAddCFLink(vn[3],vn[6]);//C -> F
+    proc.edAddCFLink(vn[3],vn[8]);//C -> D
+    proc.edAddCFLink(vn[2],vn[6]);//E -> F
+    proc.edAddCFLink(vn[6],vn[10]);//F -> G
+    proc.edAddCFLink(vn[10],vn[5]);//G -> J
+    proc.edAddCFLink(vn[7],vn[5]);//H -> J
+    proc.edAddCFLink(vn[1],vn[5]);//I -> J
+    proc.edAddCFLink(vn[5],vn[9]);//J -> K
+    proc.edAddCFLink(vn[9],vn[11]);//K -> L
+    //
+    std::vector< std::list<Node *> > rrr(proc.splitIntoIndependantGraph());
+    CPPUNIT_ASSERT_EQUAL(1,(int)rrr.size());
+    CPPUNIT_ASSERT_EQUAL((int)v.size(),(int)rrr[0].size());
+    SetOfPoints sop(rrr[0]);
+    sop.simplify();
+    CPPUNIT_ASSERT(sop.getRepr()=="(A+[([C*[(F+G)*I]]+[([[(F+G)*H]*[(F+G)*I]]+(J+K+L))*[[(F+G)*D]*[(F+G)*I]]])*[[B*[(F+G)*I]]*[E*[(F+G)*I]]]]) - ");
+  }
+}