-// Copyright (C) 2006-2008 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
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+
// --- include from engine first, to avoid redifinition warning _POSIX_C_SOURCE
//
#include "Bloc.hxx"
#include "Loop.hxx"
#include "Switch.hxx"
#include "VisitorSaveState.hxx"
+#include "SetOfPoints.hxx"
#include "SharedPtr.hxx"
#include "RuntimeForEngineTest.hxx"
#include <string>
#include <list>
#include <vector>
+#include <string.h>
//#define _DEVDEBUG_
#include "YacsTrace.hxx"
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();
}
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();
+ //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
+ CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*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();
+ //"(A+[C*[[B*D]*[D*E]]]+[(F+G)*D]) - "
+ CPPUNIT_ASSERT(sop.getRepr()=="[(A+[[B*C]*[C*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();
+ //"(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]]]]) - "
+ CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+J)*D] - ");
+ }
+ //
+ {
+ 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();
+ //"(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]]]]) - "
+ CPPUNIT_ASSERT(sop.getRepr()=="[([(A+[([[B*C]*[C*E]]+(F+G))*[C*I]])*H]+(J+K+L))*D] - ");
+ }
+ {
+ Bloc proc("TOP");
+ std::vector<Bloc *> vn;
+ std::vector<std::string> v{"B","C","D","E","F","G","H","I","J","K"};
+ 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]);//B -> C
+ proc.edAddCFLink(vn[0],vn[3]);//B -> E
+ proc.edAddCFLink(vn[0],vn[5]);//B -> G
+ proc.edAddCFLink(vn[2],vn[3]);//D -> E
+ proc.edAddCFLink(vn[4],vn[5]);//F -> G
+ proc.edAddCFLink(vn[6],vn[7]);//H -> I
+ proc.edAddCFLink(vn[0],vn[7]);//B -> I
+ proc.edAddCFLink(vn[8],vn[9]);//J -> K
+ proc.edAddCFLink(vn[0],vn[9]);//B -> K
+ //
+ 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()=="[([B*D]+E)*([B*F]+G)*([B*H]+I)*([B*J]+K)*C] - ");
+ }
+}