-# Copyright (C) 2006-2015 CEA/DEN, EDF R&D
+# Copyright (C) 2006-2016 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
node2000.setScript("o6=2+i5")
p.edAddLink(node200.edGetSamplePort(),i5)
#
- node3=self.r.createForEachLoop("node3",td)
+ node3=self.r.createForEachLoop("node3",td2)
p.edAddChild(node3)
p.edAddCFLink(node2,node3)
p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
node2000.setScript("def ff(x):\n return 2+x")
p.edAddLink(node200.edGetSamplePort(),i5)
#
- node3=self.r.createForEachLoop("node3",td)
+ node3=self.r.createForEachLoop("node3",td2)
p.edAddChild(node3)
p.edAddCFLink(node2,node3)
p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
ex.RunW(n0,0)
self.assertEqual(n0.getState(),pilot.DONE)
pass
+
+ def test18(self):
+ p=self.r.createProc("prTest18")
+ n00=self.r.createScriptNode("Salome","n00")
+ self.assertEqual(n00.getMaxLevelOfParallelism(),1)
+ n00.setExecutionMode("remote")
+ self.assertEqual(n00.getMaxLevelOfParallelism(),1)
+ cont=p.createContainer("gg","Salome")
+ n00.setContainer(cont)
+ self.assertEqual(n00.getMaxLevelOfParallelism(),1)
+ cont.setProperty("nb_proc_per_nod","6")
+ self.assertEqual(n00.getMaxLevelOfParallelism(),1)
+ cont.setProperty("nb_proc_per_node","7") # <- here
+ self.assertEqual(n00.getMaxLevelOfParallelism(),7) # <- here
+ pass
+
+ def test19(self):
+ """This test checks the mechanism of YACS that allow PythonNodes to know their DynParaLoop context."""
+ fname="test19.xml"
+ l=loader.YACSLoader()
+ #
+ p=self.r.createProc("PROC")
+ ti=p.createType("int","int")
+ tdi=p.createSequenceTc("seqint","seqint",ti)
+ # Level0
+ fe0=self.r.createForEachLoop("FE0",ti) ; p.edAddChild(fe0)
+ fe0.edGetNbOfBranchesPort().edInitInt(4)
+ fe0_end=self.r.createScriptNode("Salome","fe0_end")
+ fe0.edSetFinalizeNode(fe0_end)
+ fe0_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
+assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)""")
+ n0=self.r.createScriptNode("Salome","n0") ; p.edAddChild(n0)
+ n0.setScript("o1=range(10)")
+ a=n0.edAddOutputPort("o1",tdi)
+ p.edAddLink(a,fe0.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n0,fe0)
+ # Level1
+ b0=self.r.createBloc("b0") ; fe0.edAddChild(b0)
+ n1=self.r.createScriptNode("Salome","n1") ; b0.edAddChild(n1)
+ n1.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
+assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)
+o1=range(10)""")
+ b=n1.edAddOutputPort("o1",tdi)
+ fe1=self.r.createForEachLoop("FE1",ti) ; b0.edAddChild(fe1)
+ fe1.edGetNbOfBranchesPort().edInitInt(3)
+ fe1_end=self.r.createScriptNode("Salome","fe1_end")
+ fe1_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
+assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
+assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
+""")
+ fe1.edSetFinalizeNode(fe1_end)
+ p.edAddLink(b,fe1.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n1,fe1)
+ # Level2
+ n2=self.r.createScriptNode("Salome","n2") ; fe1.edAddChild(n2)
+ n2.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
+assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
+assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
+""")
+
+ p.saveSchema(fname)
+ ex=pilot.ExecutorSwig()
+
+ # local run of PythonNodes n1 and n2
+ p=l.load(fname)
+ p.init()
+ self.assertEqual(p.getState(),pilot.READY)
+ ex.setDPLScopeSensitive(True) # <- this line is the aim of the test
+ ex.RunW(p,0)
+ self.assertEqual(p.getState(),pilot.DONE)
+
+ # run remote
+ p=l.load(fname)
+ cont=p.createContainer("gg","HPSalome")
+ cont.setSizeOfPool(2)
+ n1=p.getChildByName("FE0.b0.n1") ; n1.setExecutionMode("remote") ; n1.setContainer(cont)
+ n2=p.getChildByName("FE0.b0.FE1.n2") ; n2.setExecutionMode("remote") ; n2.setContainer(cont)
+ p.init()
+ self.assertEqual(p.getState(),pilot.READY)
+ ex.RunW(p,0)
+ self.assertEqual(p.getState(),pilot.DONE)
+ pass
+
+ def test20(self):
+ """This test revealed a huge bug in ElementaryNode contained in a loop or foreach. The RECONNECT state generated invalid dependancies that only HPContainer can reveal the problem"""
+ def assignCont(n,cont):
+ n.setExecutionMode("remote") ; n.setContainer(cont)
+ pass
+ xmlFileName="test20.xml"
+ p=self.r.createProc("test26")
+ #
+ cont=p.createContainer("gg","HPSalome") # very important ! HP Container needed for the test !
+ cont.setSizeOfPool(8) # important make this figure >= 6
+ #
+ po=p.createInterfaceTc("python:obj:1.0","pyobj",[])
+ sop=p.createSequenceTc("list[pyobj]","list[pyobj]",po)
+ #
+ b0=self.r.createBloc("test26/main") ; p.edAddChild(b0)
+ n0=self.r.createScriptNode("Salome","test26/n0") ; assignCont(n0,cont) # 1
+ n0.setScript("""import os
+dd=range(10)""")
+ dd=n0.edAddOutputPort("dd",sop) ; b0.edAddChild(n0)
+ fe0=self.r.createForEachLoop("test26/FE0",po) ; b0.edAddChild(fe0)
+ fe0.edGetNbOfBranchesPort().edInitInt(1) # very important for the test : 1 !
+ fe0i=self.r.createBloc("test26/FE0_internal") ; fe0.edSetNode(fe0i)
+ zeArgInitNode2=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode2,cont) # 2
+ fe0i.edAddChild(zeArgInitNode2)
+ c1=zeArgInitNode2.edAddInputPort("c",po)
+ c2=zeArgInitNode2.edAddOutputPort("c",po)
+ zeRun=self.r.createBloc("test26/zeRun") ; fe0i.edAddChild(zeRun)
+ zeArgInitNode=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode,cont) # 3
+ zeRun.edAddChild(zeArgInitNode)
+ ff1=zeArgInitNode.edAddInputPort("ff",po)
+ ff2=zeArgInitNode.edAddOutputPort("ff",po)
+ line01=self.r.createScriptNode("Salome","line01") ; zeRun.edAddChild(line01) ; assignCont(line01,cont) # 4
+ line01.setScript("ee=3")
+ ee0=line01.edAddOutputPort("ee",po)
+ initt=self.r.createScriptNode("Salome","test26/initt") ; assignCont(initt,cont) # 5
+ initt.setScript("pass") ; zeRun.edAddChild(initt)
+ end=self.r.createScriptNode("Salome","test26/end") ; assignCont(end,cont) # 6
+ end.setScript("import os") ; zeRun.edAddChild(end)
+ retu=self.r.createScriptNode("Salome","return") ; assignCont(retu,cont) # 7
+ retu.setScript("ee=i0") ; zeRun.edAddChild(retu)
+ i0=retu.edAddInputPort("i0",po)
+ ee=retu.edAddOutputPort("ee",po)
+ zeRun.edAddCFLink(zeArgInitNode,line01)
+ zeRun.edAddCFLink(line01,initt)
+ zeRun.edAddCFLink(initt,end)
+ zeRun.edAddCFLink(end,retu)
+ p.edAddLink(ee0,i0)
+ #
+ returnn=self.r.createScriptNode("Salome","return") ; assignCont(returnn,cont) # 8
+ returnn.setScript("elt=i0")
+ i00=returnn.edAddInputPort("i0",po)
+ elt=returnn.edAddOutputPort("elt",po)
+ fe0i.edAddChild(returnn)
+ fe0i.edAddCFLink(zeArgInitNode2,zeRun)
+ fe0i.edAddCFLink(zeRun,returnn)
+ p.edAddLink(c2,ff1)
+ p.edAddLink(ee,i00)
+ #
+ finalize=self.r.createScriptNode("Salome","test26/finalize") ; b0.edAddChild(finalize) ; assignCont(finalize,cont) # 9
+ finalize.setScript("pass")
+ b0.edAddCFLink(n0,fe0)
+ b0.edAddCFLink(fe0,finalize)
+ #
+ p.edAddLink(dd,fe0.edGetSeqOfSamplesPort())
+ p.edAddLink(fe0.edGetSamplePort(),c1)
+ #
+ #p.saveSchema(xmlFileName)
+ p.getChildByName("test26/main.test26/FE0").edGetNbOfBranchesPort().edInitInt(1) # very important 1 !
+ #
+ ex=pilot.ExecutorSwig()
+ self.assertEqual(p.getState(),pilot.READY)
+ ex.RunW(p,0)
+ self.assertEqual(p.getState(),pilot.DONE)
+ pass
+
+ pass
+
+ def test21(self):
+ "test if we restart from a saved state in a foreach loop"
+ fname="test21.xml"
+ xmlStateFileName="saveState21.xml"
+ from datetime import datetime
+ p=self.r.createProc("prTest21")
+ cont=p.createContainer("gg","Salome")
+ cont.setProperty("name","localhost")
+ cont.setProperty("hostname","localhost")
+ cont.setProperty("type","multi")
+ td=p.createType("double","double")
+ ti=p.createType("int","int")
+ tsi=p.createSequenceTc("seqint","seqint",ti)
+ tsd=p.createSequenceTc("seqdbl","seqdbl",td)
+ n0=self.r.createScriptNode("","n0")
+ o0=n0.edAddOutputPort("o0",tsi)
+ n0.setScript("o0=[ elt for elt in range(6) ]")
+ p.edAddChild(n0)
+ n1=self.r.createForEachLoop("n1",ti)
+ n10=self.r.createScriptNode("","n10")
+ n10.setExecutionMode("remote")
+ n10.setContainer(cont)
+ n1.edAddChild(n10)
+ n10.setScript("""
+import time
+time.sleep(2)
+o2=2*i1
+""")
+ i1=n10.edAddInputPort("i1",ti)
+ o2=n10.edAddOutputPort("o2",ti)
+ p.edAddChild(n1)
+ p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
+ p.edAddLink(n1.edGetSamplePort(),i1)
+ p.edAddCFLink(n0,n1)
+ n1.edGetNbOfBranchesPort().edInitPy(2)
+ n2=self.r.createScriptNode("","n2")
+ n2.setScript("o4=i3")
+ i3=n2.edAddInputPort("i3",tsi)
+ o4=n2.edAddOutputPort("o4",tsi)
+ n2.setScript("o4=i3")
+ p.edAddChild(n2)
+ p.edAddCFLink(n1,n2)
+ p.edAddLink(o2,i3)
+ p.saveSchema(fname)
+ #
+ l=loader.YACSLoader()
+ p=l.load(fname)
+ n1=p.getChildByName("n1")
+ ex=pilot.ExecutorSwig()
+ ex.setKeepGoingProperty(True)
+ #
+ startt=datetime.now()
+ import threading
+ myRun=threading.Thread(None, ex.RunW, None, (p,0))
+ myRun.start()
+ import time
+ time.sleep(5)
+ SALOMERuntime.schemaSaveState(p, ex, xmlStateFileName)
+ a,b,c=n1.getPassedResults(ex)
+ myRun.join()
+ t0=datetime.now()-startt
+ #
+ self.assertEqual(p.getState(),pilot.DONE)
+ self.assertEqual(n1.getState(),pilot.DONE)
+ self.assertEqual(a,[0,1])
+ self.assertEqual([elt.getPyObj() for elt in b],[[0L,2L]])
+ #
+ p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
+ p.getChildByName("n1").getChildByName("n10").setScript("""
+import time
+time.sleep(0.1)
+o2=5*i1
+""")
+ loader.loadState(p, xmlStateFileName)
+ p.resetState(1)
+ p.getChildByName("n1").assignPassedResults(a,b,c)
+ p.exUpdateState();
+ #
+ startt=datetime.now()
+ ex.RunW(p,0,False)
+ t1=datetime.now()-startt
+ #
+ self.assertEqual(n1.getState(),pilot.DONE)
+ self.assertEqual(p.getState(),pilot.DONE)
+ self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,2L,10L,15L,20L,25L])
+ pass
+ pass
+
+ def test22(self):
+ """Restart from a saved state in a foreach loop without using assignPassedResults.
+ This test uses the files test21.xml and saveState21.xml produced by test21.
+ """
+ fname="test21.xml"
+ xmlStateFileName="saveState21.xml"
+
+ ex=pilot.ExecutorSwig()
+ l=loader.YACSLoader()
+ q=l.load(fname)
+ q.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
+ q.getChildByName("n1").getChildByName("n10").setScript("""
+import time
+time.sleep(0.1)
+print "execution n10:", i1
+o2=5*i1
+""")
+ q.getChildByName("n2").setScript("""
+print "execution n2:", i3
+o4=i3
+""")
+ loader.loadState(q, xmlStateFileName)
+ q.resetState(1)
+ q.exUpdateState()
+ #
+ ex.RunW(q,0,False)
+ #
+ self.assertEqual(q.getChildByName("n1").getState(),pilot.DONE)
+ self.assertEqual(q.getState(),pilot.DONE)
+ self.assertEqual(q.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,2L,10L,15L,20L,25L])
+ pass
pass
if __name__ == '__main__':