Salome HOME
85fb8d2a941ee75867796c0316a6346cc3ec8ebf
[modules/yacs.git] / src / yacsloader_swig / Test / testSaveLoadRun.py
1 #!/usr/bin/env python3
2 # Copyright (C) 2006-2023  CEA/DEN, EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import unittest
22 import tempfile
23 import os
24
25 import pilot
26 import SALOMERuntime
27 import loader
28 import salome
29
30 import datetime
31
32 class TestSaveLoadRun(unittest.TestCase):
33   def setUp(self):
34     SALOMERuntime.RuntimeSALOME.setRuntime()
35     self.r=SALOMERuntime.getSALOMERuntime()
36     self.workdir = tempfile.mkdtemp(suffix=".yacstest")
37     pass
38
39   def tearDown(self):
40     salome.salome_init()
41     cm = salome.lcc.getContainerManager()
42     cm.ShutdownContainers()
43     salome.dsm.shutdownScopes()
44     pass
45
46   def test0(self):
47     """First test of HP Container no loop here only the 3 sorts of python nodes (the Distributed is it still used and useful ?) """
48     fname=os.path.join(self.workdir, "TestSaveLoadRun0.xml")
49     nbOfNodes=8
50     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
51     l=loader.YACSLoader()
52     p=self.r.createProc("prTest0")
53     td=p.createType("double","double")
54     ti=p.createType("int","int")
55     pg=pilot.PlayGround()
56     pg.setData([("localhost",4)])
57     cont=p.createContainer("gg","HPSalome")
58     cont.setProperty("name","localhost")
59     cont.setProperty("hostname","localhost")
60     cont.setProperty("nb_proc_per_node","1")
61     script0="""
62 def ff(nb,dbg):
63     from math import cos
64     import datetime
65     
66     ref=datetime.datetime.now()
67     t=0. ; pas=1./float(nb)
68     for i in range(nb):
69         for j in range(nb):
70             x=j*pas
71             t+=1.+cos(1.*(x*3.14159))
72             pass
73         pass
74     print("coucou from script0-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
75     return t
76 """
77     script1="""
78 from math import cos
79 import datetime
80 ref=datetime.datetime.now()
81 o2=0. ; pas=1./float(i1)
82 for i in range(i1):
83   for j in range(i1):
84     x=j*pas
85     o2+=1.+cos(1.*(x*3.14159))
86     pass
87 print("coucou from script1-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
88 """
89     for i in range(nbOfNodes):
90       node0=self.r.createFuncNode("DistPython","node%i"%(i))
91       p.edAddChild(node0)
92       node0.setFname("ff")
93       node0.setContainer(cont)
94       node0.setScript(script0)
95       nb=node0.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
96       dbg=node0.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
97       out0=node0.edAddOutputPort("s",td)
98       #
99       nodeMiddle=self.r.createFuncNode("Salome","node%i_1"%(i))
100       p.edAddChild(nodeMiddle)
101       p.edAddCFLink(node0,nodeMiddle)
102       nodeMiddle.setFname("ff")
103       nodeMiddle.setContainer(cont)
104       nodeMiddle.setScript(script0)
105       nb=nodeMiddle.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
106       dbg=nodeMiddle.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
107       out0=nodeMiddle.edAddOutputPort("s",td)
108       nodeMiddle.setExecutionMode("remote")
109       #
110       nodeEnd=self.r.createScriptNode("Salome","node%i_2"%(i+1))
111       p.edAddChild(nodeEnd)
112       p.edAddCFLink(nodeMiddle,nodeEnd)
113       nodeEnd.setContainer(cont)
114       nodeEnd.setScript(script1)
115       i1=nodeEnd.edAddInputPort("i1",ti) ; i1.edInitInt(sqrtOfNumberOfTurn)
116       dbg=nodeEnd.edAddInputPort("dbg",ti) ; dbg.edInitInt(i)
117       o2=nodeEnd.edAddOutputPort("o2",td)
118       nodeEnd.setExecutionMode("remote")
119       pass
120     p.saveSchema(fname)
121     p=l.load(fname)
122     ex=pilot.ExecutorSwig()
123     self.assertEqual(p.getState(),pilot.READY)
124     st=datetime.datetime.now()
125     p.propagePlayGround(pg)
126     # 1st exec
127     ex.RunW(p,0)
128     print("Time spend of test0 to run 1st %s"%(str(datetime.datetime.now()-st)))
129     self.assertEqual(p.getState(),pilot.DONE)
130     # 2nd exec using the same already launched remote python interpreters
131     st=datetime.datetime.now()
132     ex.RunW(p,0)
133     print("Time spend of test0 to run 2nd %s"%(str(datetime.datetime.now()-st)))
134     self.assertEqual(p.getState(),pilot.DONE)
135     # 3rd exec using the same already launched remote python interpreters
136     st=datetime.datetime.now()
137     ex.RunW(p,0)
138     print("Time spend of test0 to run 3rd %s"%(str(datetime.datetime.now()-st)))
139     self.assertEqual(p.getState(),pilot.DONE)
140     pass
141
142   def test1(self):
143     """ HP Container again like test0 but the initialization key of HPContainer is used here."""
144     fname=os.path.join(self.workdir, "TestSaveLoadRun1.xml")
145     nbOfNodes=8
146     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
147     l=loader.YACSLoader()
148     p=self.r.createProc("prTest1")
149     td=p.createType("double","double")
150     ti=p.createType("int","int")
151     pg=pilot.PlayGround()
152     pg.setData([("localhost",4)])
153     cont=p.createContainer("gg","HPSalome")
154     cont.setProperty("InitializeScriptKey","aa=123.456")
155     cont.setProperty("name","localhost")
156     cont.setProperty("hostname","localhost")
157     cont.setProperty("nb_proc_per_node","1")
158     script0="""
159 def ff(nb,dbg):
160     from math import cos
161     import datetime
162     
163     ref=datetime.datetime.now()
164     t=0. ; pas=1./float(nb)
165     for i in range(nb):
166         for j in range(nb):
167             x=j*pas
168             t+=1.+cos(1.*(x*3.14159))
169             pass
170         pass
171     print("coucou from script0-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
172     return t
173 """
174     # here in script1 aa is refered ! aa will exist thanks to HPCont Init Script
175     script1="""
176 from math import cos
177 import datetime
178 ref=datetime.datetime.now()
179 o2=0. ; pas=1./float(i1)
180 for i in range(i1):
181   for j in range(i1):
182     x=j*pas
183     o2+=1.+cos(1.*(x*3.14159))
184     pass
185 print("coucou %lf from script1-%i  -> %s"%(aa,dbg,str(datetime.datetime.now()-ref)))
186 aa+=1.
187 """
188     #
189     for i in range(nbOfNodes):
190       nodeMiddle=self.r.createFuncNode("Salome","node%i_1"%(i)) # PyFuncNode remote
191       p.edAddChild(nodeMiddle)
192       nodeMiddle.setFname("ff")
193       nodeMiddle.setContainer(cont)
194       nodeMiddle.setScript(script0)
195       nb=nodeMiddle.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
196       dbg=nodeMiddle.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
197       out0=nodeMiddle.edAddOutputPort("s",td)
198       nodeMiddle.setExecutionMode("remote")
199       #
200       nodeEnd=self.r.createScriptNode("Salome","node%i_2"%(i+1)) # PythonNode remote
201       p.edAddChild(nodeEnd)
202       p.edAddCFLink(nodeMiddle,nodeEnd)
203       nodeEnd.setContainer(cont)
204       nodeEnd.setScript(script1)
205       i1=nodeEnd.edAddInputPort("i1",ti) ; i1.edInitInt(sqrtOfNumberOfTurn)
206       dbg=nodeEnd.edAddInputPort("dbg",ti) ; dbg.edInitInt(i)
207       o2=nodeEnd.edAddOutputPort("o2",td)
208       nodeEnd.setExecutionMode("remote")
209       pass
210     #
211     p.saveSchema(fname)
212     p=l.load(fname)
213     self.assertEqual(p.edGetDirectDescendants()[0].getContainer().getProperty("InitializeScriptKey"),"aa=123.456")
214     p.propagePlayGround(pg)
215     # 1st exec
216     ex=pilot.ExecutorSwig()
217     self.assertEqual(p.getState(),pilot.READY)
218     st=datetime.datetime.now()
219     ex.RunW(p,0)
220     print("Time spend of test1 to 1st run %s"%(str(datetime.datetime.now()-st)))
221     self.assertEqual(p.getState(),pilot.DONE)
222     # 2nd exec
223     st=datetime.datetime.now()
224     ex.RunW(p,0)
225     print("Time spend of test1 to 2nd run %s"%(str(datetime.datetime.now()-st)))
226     self.assertEqual(p.getState(),pilot.DONE)
227     # 3rd exec
228     st=datetime.datetime.now()
229     ex.RunW(p,0)
230     print("Time spend of test1 to 3rd run %s"%(str(datetime.datetime.now()-st)))
231     self.assertEqual(p.getState(),pilot.DONE)
232     pass
233
234   def test2(self):
235     """ Test on HP Containers in foreach context."""
236     script0="""def ff():
237     global aa
238     print("%%lf - %%s"%%(aa,str(my_container)))
239     return 16*[%i],0
240 """
241     script1="""from math import cos
242 import datetime
243 ref=datetime.datetime.now()
244 o2=0. ; pas=1./float(i1)
245 for i in range(i1):
246   for j in range(i1):
247     x=j*pas
248     o2+=1.+cos(1.*(x*3.14159))
249     pass
250 print("coucou %lf from script  -> %s"%(aa,str(datetime.datetime.now()-ref)))
251 aa+=1.
252 o3=0
253 """
254     script2="""o9=sum(i8)
255 """
256     fname=os.path.join(self.workdir, "TestSaveLoadRun2.xml")
257     nbOfNodes=8
258     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
259     l=loader.YACSLoader()
260     p=self.r.createProc("prTest1")
261     td=p.createType("double","double")
262     ti=p.createType("int","int")
263     tdi=p.createSequenceTc("seqint","seqint",ti)
264     tdd=p.createSequenceTc("seqdouble","seqdouble",td)
265     pg=pilot.PlayGround()
266     pg.setData([("localhost",4)])
267     cont=p.createContainer("gg","HPSalome")
268     cont.setProperty("InitializeScriptKey","aa=123.456")
269     cont.setProperty("name","localhost")
270     cont.setProperty("hostname","localhost")
271     cont.setProperty("nb_proc_per_node","1")
272     #
273     node0=self.r.createFuncNode("Salome","PyFunction0") # PyFuncNode remote
274     p.edAddChild(node0)
275     node0.setFname("ff")
276     node0.setContainer(cont)
277     node0.setScript(script0%(sqrtOfNumberOfTurn))
278     out0_0=node0.edAddOutputPort("o1",tdi)
279     out1_0=node0.edAddOutputPort("o2",ti)
280     node0.setExecutionMode("remote")
281     #
282     node1=self.r.createForEachLoop("node1",ti)
283     p.edAddChild(node1)
284     p.edAddCFLink(node0,node1)
285     p.edAddLink(out0_0,node1.edGetSeqOfSamplesPort())
286     node1.edGetNbOfBranchesPort().edInitInt(8)
287     #
288     node2=self.r.createScriptNode("Salome","PyScript3")
289     node1.edAddChild(node2)
290     node2.setContainer(cont)
291     node2.setScript(script1)
292     i1=node2.edAddInputPort("i1",ti)
293     p.edAddLink(node1.edGetSamplePort(),i1)
294     out0_2=node2.edAddOutputPort("o2",td)
295     out1_2=node2.edAddOutputPort("o3",ti)
296     node2.setExecutionMode("remote")
297     #
298     node3=self.r.createScriptNode("Salome","PyScript7")
299     p.edAddChild(node3)
300     node3.setScript(script2)
301     p.edAddCFLink(node1,node3)
302     i8=node3.edAddInputPort("i8",tdd)
303     o9=node3.edAddOutputPort("o9",td)
304     p.edAddLink(out0_2,i8)
305     #
306     p.saveSchema(fname)
307     p=l.load(fname)
308     o9=p.getChildByName("PyScript7").getOutputPort("o9")
309     self.assertTrue(len(p.edGetDirectDescendants()[1].getChildByName("PyScript3").getContainer().getProperty("InitializeScriptKey"))!=0)
310     # 1st exec
311     refExpected=16016013.514623128
312     ex=pilot.ExecutorSwig()
313     p.propagePlayGround(pg)
314     self.assertEqual(p.getState(),pilot.READY)
315     st=datetime.datetime.now()
316     ex.RunW(p,0)
317     print("Time spend of test2 to 1st run %s"%(str(datetime.datetime.now()-st)))
318     self.assertEqual(p.getState(),pilot.DONE)
319     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
320     # 2nd exec
321     st=datetime.datetime.now()
322     ex.RunW(p,0)
323     print("Time spend of test2 to 2nd run %s"%(str(datetime.datetime.now()-st)))
324     self.assertEqual(p.getState(),pilot.DONE)
325     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
326     # 3rd exec
327     st=datetime.datetime.now()
328     ex.RunW(p,0)
329     print("Time spend of test2 to 3rd run %s"%(str(datetime.datetime.now()-st)))
330     self.assertEqual(p.getState(),pilot.DONE)
331     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
332     pass
333
334   def test3(self):
335     """ Test that focuses on parallel load of containers."""
336     script0="""
337 if "aa" not in globals():
338   aa=123.456
339 print("%%lf - %%s"%%(aa,str(my_container)))
340 o1=100*[%i]
341 o2=0
342 """
343     script1="""from math import cos
344 import datetime
345 ref=datetime.datetime.now()
346 if "aa" not in globals():
347   aa=123.456
348 o2=0. ; pas=1./float(i1)
349 for i in range(i1):
350   for j in range(i1):
351     x=j*pas
352     o2+=1.+cos(1.*(x*3.14159))
353     pass
354 print("coucou %lf from script  -> %s"%(aa,str(datetime.datetime.now()-ref)))
355 aa+=1.
356 o3=0
357 """
358     script2="""o9=sum(i8)
359 """
360     nbOfNodes=8
361     sqrtOfNumberOfTurn=10
362     l=loader.YACSLoader()
363     p=self.r.createProc("prTest1")
364     p.setProperty("executor","workloadmanager")
365     td=p.createType("double","double")
366     ti=p.createType("int","int")
367     tdi=p.createSequenceTc("seqint","seqint",ti)
368     tdd=p.createSequenceTc("seqdouble","seqdouble",td)
369     cont=p.createContainer("gg","Salome")
370     cont.setProperty("name","localhost")
371     cont.setProperty("hostname","localhost")
372     # no limit for the number of containers launched
373     cont.setProperty("nb_proc_per_node","0")
374     cont.setProperty("type","multi")
375     cont.usePythonCache(True)
376     cont.attachOnCloning()
377     #
378     node0=self.r.createScriptNode("Salome","Node0")
379     p.edAddChild(node0)
380     node0.setContainer(cont)
381     node0.setScript(script0%(sqrtOfNumberOfTurn))
382     out0_0=node0.edAddOutputPort("o1",tdi)
383     out1_0=node0.edAddOutputPort("o2",ti)
384     node0.setExecutionMode("remote")
385     #
386     node1=self.r.createForEachLoop("node1",ti)
387     p.edAddChild(node1)
388     p.edAddCFLink(node0,node1)
389     p.edAddLink(out0_0,node1.edGetSeqOfSamplesPort())
390     node1.edGetNbOfBranchesPort().edInitInt(16)
391     #
392     node2=self.r.createScriptNode("Salome","Node2")
393     node1.edAddChild(node2)
394     node2.setContainer(cont)
395     node2.setScript(script1)
396     i1=node2.edAddInputPort("i1",ti)
397     p.edAddLink(node1.edGetSamplePort(),i1)
398     out0_2=node2.edAddOutputPort("o2",td)
399     out1_2=node2.edAddOutputPort("o3",ti)
400     node2.setExecutionMode("remote")
401     #
402     node3=self.r.createScriptNode("Salome","Node3")
403     p.edAddChild(node3)
404     node3.setScript(script2)
405     p.edAddCFLink(node1,node3)
406     i8=node3.edAddInputPort("i8",tdd)
407     o9=node3.edAddOutputPort("o9",td)
408     p.edAddLink(out0_2,i8)
409     #
410     fname=os.path.join(self.workdir, "t3_new.xml")
411     p.saveSchema(fname)
412     p=l.load(fname)
413     o9=p.getChildByName("Node3").getOutputPort("o9")
414     # 1st exec
415     refExpected=11000.008377058712
416     ex=pilot.ExecutorSwig()
417     self.assertEqual(p.getState(),pilot.READY)
418     st=datetime.datetime.now()
419     ex.RunW(p,0)
420     print("Time spend of test3 to 1st run %s"%(str(datetime.datetime.now()-st)))
421     self.assertEqual(p.getState(),pilot.DONE)
422     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
423     # 2nd exec
424     st=datetime.datetime.now()
425     ex.RunW(p,0)
426     print("Time spend of test3 to 2nd run %s"%(str(datetime.datetime.now()-st)))
427     self.assertEqual(p.getState(),pilot.DONE)
428     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
429     # 3rd exec
430     st=datetime.datetime.now()
431     ex.RunW(p,0)
432     print("Time spend of test3 to 3rd run %s"%(str(datetime.datetime.now()-st)))
433     self.assertEqual(p.getState(),pilot.DONE)
434     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
435     pass
436
437   def test4(self):
438     """Double foreach."""
439     fname=os.path.join(self.workdir, "TestSaveLoadRun4.xml")
440     script1="""nb=7
441 ii=0
442 o1=nb*[None]
443 for i in range(nb):
444     tmp=(i+10)*[None]
445     for j in range(i+10):
446         tmp[j]=ii
447         ii+=1
448         pass
449     o1[i]=tmp
450     pass
451 """
452     l=loader.YACSLoader()
453     ex=pilot.ExecutorSwig()
454     p=self.r.createProc("pr")
455     p.setProperty("executor","workloadmanager")
456     cont=p.createContainer("gg","Salome")
457     cont.setProperty("name","localhost")
458     cont.setProperty("hostname","localhost")
459     # no limit for the number of containers launched
460     cont.setProperty("nb_proc_per_node","0")
461     cont.setProperty("type","multi")
462     cont.attachOnCloning()
463     td=p.createType("int","int")
464     td2=p.createSequenceTc("seqint","seqint",td)
465     td3=p.createSequenceTc("seqintvec","seqintvec",td2)
466     node1=self.r.createScriptNode("","node1")
467     node1.setScript(script1)
468     o1=node1.edAddOutputPort("o1",td3)
469     p.edAddChild(node1)
470     #
471     node2=self.r.createForEachLoop("node2",td2)
472     p.edAddChild(node2)
473     p.edAddCFLink(node1,node2)
474     p.edAddLink(o1,node2.edGetSeqOfSamplesPort())
475     node2.edGetNbOfBranchesPort().edInitInt(2)
476     node20=self.r.createBloc("node20")
477     node2.edAddChild(node20)
478     node200=self.r.createForEachLoop("node200",td)
479     node20.edAddChild(node200)
480     node200.edGetNbOfBranchesPort().edInitInt(10)
481     p.edAddLink(node2.edGetSamplePort(),node200.edGetSeqOfSamplesPort())
482     node2000=self.r.createScriptNode("","node2000")
483     node2000.setContainer(cont)
484     node2000.setExecutionMode("remote")
485     node200.edAddChild(node2000)
486     i5=node2000.edAddInputPort("i5",td)
487     o6=node2000.edAddOutputPort("o6",td)
488     node2000.setScript("o6=2+i5")
489     p.edAddLink(node200.edGetSamplePort(),i5)
490     #
491     node3=self.r.createForEachLoop("node3",td2)
492     p.edAddChild(node3)
493     p.edAddCFLink(node2,node3)
494     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
495     node3.edGetNbOfBranchesPort().edInitInt(2)
496     node30=self.r.createBloc("node30")
497     node3.edAddChild(node30)
498     node300=self.r.createForEachLoop("node300",td)
499     node30.edAddChild(node300)
500     node300.edGetNbOfBranchesPort().edInitInt(10)
501     p.edAddLink(node3.edGetSamplePort(),node300.edGetSeqOfSamplesPort())
502     node3000=self.r.createScriptNode("","node3000")
503     node3000.setContainer(cont)
504     node3000.setExecutionMode("remote")
505     node300.edAddChild(node3000)
506     i14=node3000.edAddInputPort("i14",td)
507     o15=node3000.edAddOutputPort("o15",td)
508     node3000.setScript("o15=3+i14")
509     p.edAddLink(node300.edGetSamplePort(),i14)
510     #
511     node4=self.r.createScriptNode("","node4")
512     node4.setScript("o9=i8")
513     p.edAddChild(node4)
514     i8=node4.edAddInputPort("i8",td3)
515     o9=node4.edAddOutputPort("o9",td3)
516     p.edAddCFLink(node3,node4)
517     p.edAddLink(o15,i8)
518     p.saveSchema(fname)
519     p=l.load(fname)
520     ex = pilot.ExecutorSwig()
521     self.assertEqual(p.getState(),pilot.READY)
522     ex.RunW(p,0)
523     self.assertEqual(p.getState(),pilot.DONE)
524     zeResu=p.getChildByName("node4").getOutputPort("o9").get()
525     self.assertEqual(zeResu,[[5,6,7,8,9,10,11,12,13,14],[15,16,17,18,19,20,21,22,23,24,25],[26,27,28,29,30,31,32,33,34,35,36,37],[38,39,40,41,42,43,44,45,46,47,48,49,50],[51,52,53,54,55,56,57,58,59,60,61,62,63,64],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79], [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]])
526     pass
527
528   def test5(self):
529     """Non regression test 2 of multi pyNode, pyFuncNode sharing the same HPContainer instance."""
530     # TODO : This test is DEPRECATED. HPContainer will be removed.
531     self.skipTest("HPContainer deprecated.")
532     fname=os.path.join(self.workdir, "TestSaveLoadRun5.xml")
533     script1="""nb=7
534 ii=0
535 o1=nb*[None]
536 for i in range(nb):
537     tmp=(i+10)*[None]
538     for j in range(i+10):
539         tmp[j]=ii
540         ii+=1
541         pass
542     o1[i]=tmp
543     pass
544 """
545     l=loader.YACSLoader()
546     ex=pilot.ExecutorSwig()
547     p=self.r.createProc("pr")
548     pg=pilot.PlayGround()
549     pg.setData([("localhost",10)])
550     cont=p.createContainer("gg","HPSalome")
551     cont.setProperty("nb_proc_per_node","1")
552     td=p.createType("int","int")
553     td2=p.createSequenceTc("seqint","seqint",td)
554     td3=p.createSequenceTc("seqintvec","seqintvec",td2)
555     node1=self.r.createScriptNode("","node1")
556     node1.setScript(script1)
557     o1=node1.edAddOutputPort("o1",td3)
558     p.edAddChild(node1)
559     #
560     node2=self.r.createForEachLoop("node2",td2)
561     p.edAddChild(node2)
562     p.edAddCFLink(node1,node2)
563     p.edAddLink(o1,node2.edGetSeqOfSamplesPort())
564     node2.edGetNbOfBranchesPort().edInitInt(2)
565     node20=self.r.createBloc("node20")
566     node2.edAddChild(node20)
567     node200=self.r.createForEachLoop("node200",td)
568     node20.edAddChild(node200)
569     node200.edGetNbOfBranchesPort().edInitInt(10)
570     p.edAddLink(node2.edGetSamplePort(),node200.edGetSeqOfSamplesPort())
571     node2000=self.r.createFuncNode("Salome","node2000")
572     node2000.setFname("ff")
573     node2000.setContainer(cont)
574     node2000.setExecutionMode("remote")
575     node200.edAddChild(node2000)
576     i5=node2000.edAddInputPort("i5",td)
577     o6=node2000.edAddOutputPort("o6",td)
578     node2000.setScript("def ff(x):\n  return 2+x")
579     p.edAddLink(node200.edGetSamplePort(),i5)
580     #
581     node3=self.r.createForEachLoop("node3",td2)
582     p.edAddChild(node3)
583     p.edAddCFLink(node2,node3)
584     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
585     node3.edGetNbOfBranchesPort().edInitInt(2)
586     node30=self.r.createBloc("node30")
587     node3.edAddChild(node30)
588     node300=self.r.createForEachLoop("node300",td)
589     node30.edAddChild(node300)
590     node300.edGetNbOfBranchesPort().edInitInt(10)
591     p.edAddLink(node3.edGetSamplePort(),node300.edGetSeqOfSamplesPort())
592     node3000=self.r.createFuncNode("Salome","node3000")
593     node3000.setFname("ff")
594     node3000.setContainer(cont)
595     node3000.setExecutionMode("remote")
596     node300.edAddChild(node3000)
597     i14=node3000.edAddInputPort("i14",td)
598     o15=node3000.edAddOutputPort("o15",td)
599     node3000.setScript("def ff(x):\n  return 3+x")
600     p.edAddLink(node300.edGetSamplePort(),i14)
601     #
602     node4=self.r.createScriptNode("","node4")
603     node4.setScript("o9=i8")
604     p.edAddChild(node4)
605     i8=node4.edAddInputPort("i8",td3)
606     o9=node4.edAddOutputPort("o9",td3)
607     p.edAddCFLink(node3,node4)
608     p.edAddLink(o15,i8)
609     p.saveSchema(fname)
610     p=l.load(fname)
611     p.propagePlayGround(pg)
612     ex = pilot.ExecutorSwig()
613     self.assertEqual(p.getState(),pilot.READY)
614     ex.RunW(p,0)
615     self.assertEqual(p.getState(),pilot.DONE)
616     zeResu=p.getChildByName("node4").getOutputPort("o9").get()
617     self.assertEqual(zeResu,[[5,6,7,8,9,10,11,12,13,14],[15,16,17,18,19,20,21,22,23,24,25],[26,27,28,29,30,31,32,33,34,35,36,37],[38,39,40,41,42,43,44,45,46,47,48,49,50],[51,52,53,54,55,56,57,58,59,60,61,62,63,64],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79], [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]])
618     pass
619
620   def test6(self):
621     fname=os.path.join(self.workdir, "test6.xml")
622     p=self.r.createProc("prTest0")
623     td=p.createType("double","double")
624     ti=p.createType("int","int")
625     tsi=p.createSequenceTc("seqint","seqint",ti)
626     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
627     n0=self.r.createScriptNode("","n0")
628     o0=n0.edAddOutputPort("o0",tsi)
629     n0.setScript("o0=[3,6,8,9,-2,5]")
630     p.edAddChild(n0)
631     n1=self.r.createForEachLoop("n1",ti)
632     n10=self.r.createScriptNode("","n10")
633     n1.edAddChild(n10)
634     n10.setScript("o2=2*i1")
635     i1=n10.edAddInputPort("i1",ti)
636     o2=n10.edAddOutputPort("o2",ti)
637     p.edAddChild(n1)
638     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
639     p.edAddLink(n1.edGetSamplePort(),i1)
640     p.edAddCFLink(n0,n1)
641     n1.edGetNbOfBranchesPort().edInitPy(1)
642     n2=self.r.createScriptNode("","n2")
643     n2.setScript("o4=i3")
644     i3=n2.edAddInputPort("i3",tsi)
645     o4=n2.edAddOutputPort("o4",tsi)
646     n2.setScript("o4=i3")
647     p.edAddChild(n2)
648     p.edAddCFLink(n1,n2)
649     p.edAddLink(o2,i3)
650     p.saveSchema(fname)
651     #
652     l=loader.YACSLoader()
653     p=l.load(fname)
654     n1=p.getChildByName("n1")
655     ex=pilot.ExecutorSwig()
656     #
657     ex.RunW(p,0)
658     #
659     self.assertEqual(n1.getState(),pilot.DONE)
660     n1.edGetSeqOfSamplesPort().getPyObj()
661     a,b,c=n1.getPassedResults(ex)
662     self.assertEqual(a,list(range(6)))
663     self.assertEqual([elt.getPyObj() for elt in b],[[6, 12, 16, 18, -4, 10]])
664     self.assertEqual(c,['n10_o2_interceptor'])
665     pass
666
667   def test7(self):
668     fname=os.path.join(self.workdir, "test7.xml")
669     p=self.r.createProc("prTest1")
670     cont=p.createContainer("gg","Salome")
671     cont.setProperty("name","localhost")
672     cont.setProperty("hostname","localhost")
673     cont.setProperty("type","multi")
674     td=p.createType("double","double")
675     ti=p.createType("int","int")
676     tsi=p.createSequenceTc("seqint","seqint",ti)
677     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
678     n0=self.r.createScriptNode("","n0")
679     o0=n0.edAddOutputPort("o0",tsi)
680     n0.setScript("o0=[3,6,8,9,-2,5]")
681     p.edAddChild(n0)
682     n1=self.r.createForEachLoop("n1",ti)
683     n10=self.r.createScriptNode("","n10")
684     n10.setExecutionMode("remote")
685     n10.setContainer(cont)
686     n1.edAddChild(n10)
687     n10.setScript("""
688 import time
689 if i1==9:
690   time.sleep(2)
691   raise Exception("Simulated error !")
692 else:
693   o2=2*i1
694 """)
695     i1=n10.edAddInputPort("i1",ti)
696     o2=n10.edAddOutputPort("o2",ti)
697     p.edAddChild(n1)
698     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
699     p.edAddLink(n1.edGetSamplePort(),i1)
700     p.edAddCFLink(n0,n1)
701     n1.edGetNbOfBranchesPort().edInitPy(1)
702     n2=self.r.createScriptNode("","n2")
703     n2.setScript("o4=i3")
704     i3=n2.edAddInputPort("i3",tsi)
705     o4=n2.edAddOutputPort("o4",tsi)
706     n2.setScript("o4=i3")
707     p.edAddChild(n2)
708     p.edAddCFLink(n1,n2)
709     p.edAddLink(o2,i3)
710     p.saveSchema(fname)
711     #
712     l=loader.YACSLoader()
713     p=l.load(fname)
714     n1=p.getChildByName("n1")
715     ex=pilot.ExecutorSwig()
716     #
717     ex.RunW(p,0)
718     #
719     self.assertEqual(n1.getState(),pilot.FAILED)
720     n1.edGetSeqOfSamplesPort().getPyObj()
721     a,b,c=n1.getPassedResults(ex)
722     self.assertEqual(a,list(range(3)))
723     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16]])
724     self.assertEqual(c,['n10_o2_interceptor'])
725     pass
726
727   def test8(self):
728     from datetime import datetime
729     fname=os.path.join(self.workdir, "test8.xml")
730     p=self.r.createProc("prTest2")
731     cont=p.createContainer("gg","Salome")
732     cont.setProperty("name","localhost")
733     cont.setProperty("hostname","localhost")
734     cont.setProperty("type","multi")
735     td=p.createType("double","double")
736     ti=p.createType("int","int")
737     tsi=p.createSequenceTc("seqint","seqint",ti)
738     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
739     n0=self.r.createScriptNode("","n0")
740     o0=n0.edAddOutputPort("o0",tsi)
741     n0.setScript("o0=[3,6,8,9,-2,5]")
742     p.edAddChild(n0)
743     n1=self.r.createForEachLoop("n1",ti)
744     n10=self.r.createScriptNode("","n10")
745     n10.setExecutionMode("remote")
746     n10.setContainer(cont)
747     n1.edAddChild(n10)
748     n10.setScript("""
749 import time
750 if i1==9:
751   raise Exception("Simulated error !")
752 else:
753   time.sleep(0.1)
754   o2=2*i1
755 """)
756     i1=n10.edAddInputPort("i1",ti)
757     o2=n10.edAddOutputPort("o2",ti)
758     p.edAddChild(n1)
759     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
760     p.edAddLink(n1.edGetSamplePort(),i1)
761     p.edAddCFLink(n0,n1)
762     n1.edGetNbOfBranchesPort().edInitPy(2)
763     n2=self.r.createScriptNode("","n2")
764     n2.setScript("o4=i3")
765     i3=n2.edAddInputPort("i3",tsi)
766     o4=n2.edAddOutputPort("o4",tsi)
767     n2.setScript("o4=i3")
768     p.edAddChild(n2)
769     p.edAddCFLink(n1,n2)
770     p.edAddLink(o2,i3)
771     p.saveSchema(fname)
772     #
773     l=loader.YACSLoader()
774     p=l.load(fname)
775     n1=p.getChildByName("n1")
776     ex=pilot.ExecutorSwig()
777     ex.setKeepGoingProperty(True)
778     #
779     startt=datetime.now()
780     ex.RunW(p,0)
781     t0=datetime.now()-startt
782     #
783     self.assertEqual(n1.getState(),pilot.FAILED)
784     n1.edGetSeqOfSamplesPort().getPyObj()
785     a,b,c=n1.getPassedResults(ex)
786     self.assertEqual(a,[0,1,2,4,5])
787     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16,-4,10]])
788     self.assertEqual(c,['n10_o2_interceptor'])
789     
790     p.getChildByName("n1").getChildByName("n10").setScript("""
791 import time
792 if i1==3:
793   time.sleep(2)
794   raise Exception("Simulated error !")
795 else:
796   o2=2*i1
797 """)
798     ex=pilot.ExecutorSwig()
799     ex.setKeepGoingProperty(True)
800     #
801     startt=datetime.now()
802     ex.RunW(p,0)
803     t1=datetime.now()-startt
804     #
805     self.assertEqual(n1.getState(),pilot.FAILED)
806     n1.edGetSeqOfSamplesPort().getPyObj()
807     a,b,c=n1.getPassedResults(ex)
808     self.assertEqual(a,[1,2,3,4,5])
809     self.assertEqual([elt.getPyObj() for elt in b],[[12,16,18,-4,10]])
810     self.assertEqual(c,['n10_o2_interceptor'])
811     pass
812
813   def test9(self):
814     """ Test of assignation of already computed values for foreach node."""
815     fname=os.path.join(self.workdir, "test9.xml")
816     from datetime import datetime
817     p=self.r.createProc("prTest2")
818     cont=p.createContainer("gg","Salome")
819     cont.setProperty("name","localhost")
820     cont.setProperty("hostname","localhost")
821     cont.setProperty("type","multi")
822     td=p.createType("double","double")
823     ti=p.createType("int","int")
824     tsi=p.createSequenceTc("seqint","seqint",ti)
825     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
826     n0=self.r.createScriptNode("","n0")
827     o0=n0.edAddOutputPort("o0",tsi)
828     n0.setScript("o0=[3,6,8,9,-2,5]")
829     p.edAddChild(n0)
830     n1=self.r.createForEachLoop("n1",ti)
831     n10=self.r.createScriptNode("","n10")
832     n10.setExecutionMode("remote")
833     n10.setContainer(cont)
834     n1.edAddChild(n10)
835     n10.setScript("""
836 import time
837 if i1==9:
838   raise Exception("Simulated error !")
839 else:
840   time.sleep(0.1)
841   o2=2*i1
842 """)
843     i1=n10.edAddInputPort("i1",ti)
844     o2=n10.edAddOutputPort("o2",ti)
845     p.edAddChild(n1)
846     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
847     p.edAddLink(n1.edGetSamplePort(),i1)
848     p.edAddCFLink(n0,n1)
849     n1.edGetNbOfBranchesPort().edInitPy(2)
850     n2=self.r.createScriptNode("","n2")
851     n2.setScript("o4=i3")
852     i3=n2.edAddInputPort("i3",tsi)
853     o4=n2.edAddOutputPort("o4",tsi)
854     n2.setScript("o4=i3")
855     p.edAddChild(n2)
856     p.edAddCFLink(n1,n2)
857     p.edAddLink(o2,i3)
858     p.saveSchema(fname)
859     #
860     l=loader.YACSLoader()
861     p=l.load(fname)
862     n1=p.getChildByName("n1")
863     ex=pilot.ExecutorSwig()
864     ex.setKeepGoingProperty(True)
865     #
866     startt=datetime.now()
867     ex.RunW(p,0)
868     t0=datetime.now()-startt
869     #
870     self.assertEqual(p.getState(),pilot.FAILED)
871     self.assertEqual(n1.getState(),pilot.FAILED)
872     n1.edGetSeqOfSamplesPort().getPyObj()
873     a,b,c=n1.getPassedResults(ex)
874     self.assertEqual(a,[0,1,2,4,5])
875     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16,-4,10]])
876     self.assertEqual(c,['n10_o2_interceptor'])
877     
878     p.getChildByName("n1").getChildByName("n10").setScript("""
879 import time
880 time.sleep(2)
881 o2=7*i1
882 """)
883     ex=pilot.ExecutorSwig()
884     ex.setKeepGoingProperty(True)
885     p.getChildByName("n1").assignPassedResults(a,b,c)
886     #
887     startt=datetime.now()
888     ex.RunW(p,0)
889     t1=datetime.now()-startt
890     #
891     self.assertEqual(n1.getState(),pilot.DONE)
892     self.assertEqual(p.getState(),pilot.DONE)
893     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[6,12,16,63,-4,10])
894     pass
895
896   def test10(self):
897     fname=os.path.join(self.workdir, "test10.xml")
898     from datetime import datetime
899     p=self.r.createProc("prTest2")
900     cont=p.createContainer("gg","Salome")
901     cont.setProperty("name","localhost")
902     cont.setProperty("hostname","localhost")
903     cont.setProperty("type","multi")
904     td=p.createType("double","double")
905     ti=p.createType("int","int")
906     tsi=p.createSequenceTc("seqint","seqint",ti)
907     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
908     n0=self.r.createScriptNode("","n0")
909     o0=n0.edAddOutputPort("o0",tsi)
910     n0.setScript("o0=[ 3*elt for elt in range(12) ]")
911     p.edAddChild(n0)
912     n1=self.r.createForEachLoop("n1",ti)
913     n10=self.r.createScriptNode("","n10")
914     n10.setExecutionMode("remote")
915     n10.setContainer(cont)
916     n1.edAddChild(n10)
917     n10.setScript("""
918 import time
919 if i1%2==0:
920   raise Exception("Simulated error !")
921 else:
922   time.sleep(0.1)
923   o2=4*i1
924 """)
925     i1=n10.edAddInputPort("i1",ti)
926     o2=n10.edAddOutputPort("o2",ti)
927     p.edAddChild(n1)
928     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
929     p.edAddLink(n1.edGetSamplePort(),i1)
930     p.edAddCFLink(n0,n1)
931     n1.edGetNbOfBranchesPort().edInitPy(2)
932     n2=self.r.createScriptNode("","n2")
933     n2.setScript("o4=i3")
934     i3=n2.edAddInputPort("i3",tsi)
935     o4=n2.edAddOutputPort("o4",tsi)
936     n2.setScript("o4=i3")
937     p.edAddChild(n2)
938     p.edAddCFLink(n1,n2)
939     p.edAddLink(o2,i3)
940     p.saveSchema(fname)
941     #
942     l=loader.YACSLoader()
943     p=l.load(fname)
944     n1=p.getChildByName("n1")
945     ex=pilot.ExecutorSwig()
946     ex.setKeepGoingProperty(True)
947     #
948     startt=datetime.now()
949     ex.RunW(p,0)
950     t0=datetime.now()-startt
951     #
952     self.assertEqual(p.getState(),pilot.FAILED)
953     self.assertEqual(n1.getState(),pilot.FAILED)
954     n1.edGetSeqOfSamplesPort().getPyObj()
955     a,b,c=n1.getPassedResults(ex)
956     self.assertEqual(a,[1,3,5,7,9,11])
957     self.assertEqual([elt.getPyObj() for elt in b],[[12,36,60,84,108,132]])
958     self.assertEqual(c,['n10_o2_interceptor'])
959     
960     p.getChildByName("n1").getChildByName("n10").setScript("""
961 import time
962 if i1%2==1:
963   raise Exception("Simulated error !")
964 else:
965   time.sleep(1)
966   o2=5*i1
967 """)
968     ex=pilot.ExecutorSwig()
969     ex.setKeepGoingProperty(True)
970     p.getChildByName("n1").assignPassedResults(a,b,c)
971     #
972     startt=datetime.now()
973     ex.RunW(p,0)
974     t1=datetime.now()-startt
975     #assert(t1.total_seconds()<6.+1.)# normally 6/2+1 s (6 remaining elts in 2 // branches + 1s to launch container)
976     #
977     self.assertEqual(n1.getState(),pilot.DONE)
978     self.assertEqual(p.getState(),pilot.DONE)
979     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,12,30,36,60,60,90,84,120,108,150,132])
980     pass
981
982   pass
983
984
985   def test11(self):
986     "test if we do not restart from the begining of the schema after an error in a foreach"
987     fname=os.path.join(self.workdir, "test11.xml")
988     from datetime import datetime
989     p=self.r.createProc("prTest2")
990     cont=p.createContainer("gg","Salome")
991     cont.setProperty("name","localhost")
992     cont.setProperty("hostname","localhost")
993     cont.setProperty("type","multi")
994     td=p.createType("double","double")
995     ti=p.createType("int","int")
996     tsi=p.createSequenceTc("seqint","seqint",ti)
997     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
998     n0=self.r.createScriptNode("","n0")
999     o0=n0.edAddOutputPort("o0",tsi)
1000     n0.setScript("o0=[ elt for elt in range(12) ]")
1001     p.edAddChild(n0)
1002     n1=self.r.createForEachLoop("n1",ti)
1003     n10=self.r.createScriptNode("","n10")
1004     n10.setExecutionMode("remote")
1005     n10.setContainer(cont)
1006     n1.edAddChild(n10)
1007     n10.setScript("""
1008 import time
1009 if i1%2==1:
1010   raise Exception("Simulated error !")
1011 else:
1012   time.sleep(0.1)
1013   o2=2*i1
1014 """)
1015     i1=n10.edAddInputPort("i1",ti)
1016     o2=n10.edAddOutputPort("o2",ti)
1017     p.edAddChild(n1)
1018     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1019     p.edAddLink(n1.edGetSamplePort(),i1)
1020     p.edAddCFLink(n0,n1)
1021     n1.edGetNbOfBranchesPort().edInitPy(2)
1022     n2=self.r.createScriptNode("","n2")
1023     n2.setScript("o4=i3")
1024     i3=n2.edAddInputPort("i3",tsi)
1025     o4=n2.edAddOutputPort("o4",tsi)
1026     n2.setScript("o4=i3")
1027     p.edAddChild(n2)
1028     p.edAddCFLink(n1,n2)
1029     p.edAddLink(o2,i3)
1030     p.saveSchema(fname)
1031     #
1032     l=loader.YACSLoader()
1033     p=l.load(fname)
1034     n1=p.getChildByName("n1")
1035     ex=pilot.ExecutorSwig()
1036     ex.setKeepGoingProperty(True)
1037     #
1038     startt=datetime.now()
1039     ex.RunW(p,0)
1040     t0=datetime.now()-startt
1041     #
1042     self.assertEqual(p.getState(),pilot.FAILED)
1043     self.assertEqual(n1.getState(),pilot.FAILED)
1044     n1.edGetSeqOfSamplesPort().getPyObj()
1045     a,b,c=n1.getPassedResults(ex)
1046
1047     self.assertEqual(a,[0,2,4,6,8,10])
1048     self.assertEqual([elt.getPyObj() for elt in b],[[0,4,8,12,16,20]])
1049     
1050     p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(12) ]")
1051     p.getChildByName("n1").getChildByName("n10").setScript("""
1052 import time
1053 if i1%2==0:
1054   raise Exception("Simulated error !")
1055 else:
1056   time.sleep(1)
1057   o2=5*i1
1058 """)
1059     p.resetState(1)
1060
1061
1062     p.getChildByName("n1").assignPassedResults(a,b,c)
1063     p.exUpdateState();
1064     #
1065     startt=datetime.now()
1066     ex.RunW(p,0,False)
1067     t1=datetime.now()-startt
1068     #
1069     self.assertEqual(n1.getState(),pilot.DONE)
1070     self.assertEqual(p.getState(),pilot.DONE)
1071     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,5,4,15,8,25,12,35,16,45,20,55])
1072     pass
1073   
1074   def test12(self):
1075     """ Test of nested ForEachLoop with a port connected inside and outside the loop."""
1076     schema = self.r.createProc("schema")
1077     ti = schema.getTypeCode("int")
1078     tiset = schema.createSequenceTc("", "seqint", ti)
1079     tisetseq = schema.createSequenceTc("", "seqintvec", tiset)
1080
1081     n1 = self.r.createScriptNode("", "PyScript2")
1082     n1.edAddInputPort("i3", ti)
1083     n1.edAddInputPort("i4", ti)
1084     n1.edAddOutputPort("o5", ti)
1085     n1.setScript("o5=i3+i4")
1086
1087     n2 = self.r.createScriptNode("", "PyScript1")
1088     n2.edAddInputPort("i2", ti)
1089     n2.edAddOutputPort("o3", ti)
1090     n2.setScript("o3=i2")
1091
1092     b1 = self.r.createBloc("Bloc1")
1093     b1.edAddChild(n1)
1094     b1.edAddChild(n2)
1095
1096     fe1 = self.r.createForEachLoop("ForEach1", ti)
1097     fe1.getInputPort("nbBranches").edInitPy(2)
1098     fe1.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
1099     fe1.edSetNode(b1)
1100
1101     n3 = self.r.createScriptNode("", "PostProcessing")
1102     n3.edAddInputPort("i7", tiset)
1103     n3.edAddInputPort("i5", tiset)
1104     n3.edAddOutputPort("o4", ti)
1105     n3.setScript("""
1106 o4 = 0
1107 for i in i7:
1108     o4 = i + o4
1109
1110 for i in i5:
1111     o4 = i + o4
1112 """)
1113
1114     b0 = self.r.createBloc("Bloc0")
1115     b0.edAddChild(fe1)
1116     b0.edAddChild(n3)
1117
1118     fe0 = self.r.createForEachLoop("ForEach1", ti)
1119     fe0.getInputPort("nbBranches").edInitPy(2)
1120     fe0.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
1121     fe0.edSetNode(b0)
1122
1123     schema.edAddChild(fe0)
1124
1125     nx = self.r.createScriptNode("", "Result")
1126     nx.edAddInputPort("i8", tiset)
1127     nx.edAddOutputPort("o6", ti)
1128     nx.setScript("""
1129 o6 = 0
1130 for i in i8:
1131     o6 = i + o6
1132 """)
1133     schema.edAddChild(nx)
1134
1135     schema.edAddLink(fe1.getOutputPort("evalSamples"), n1.getInputPort("i3"))
1136     schema.edAddLink(fe0.getOutputPort("evalSamples"), n1.getInputPort("i4"))
1137
1138     schema.edAddDFLink(n1.getOutputPort("o5"), n3.getInputPort("i7"))
1139     schema.edAddDFLink(n2.getOutputPort("o3"), n3.getInputPort("i5"))
1140
1141     po5 = fe1.getOutputPort("Bloc1.PyScript2.o5")
1142     schema.edAddDFLink(po5, n2.getInputPort("i2"))
1143
1144     schema.edAddDFLink(n3.getOutputPort("o4"), nx.getInputPort("i8"))
1145 #    schema.saveSchema("foreach12.xml")
1146     
1147     e = pilot.ExecutorSwig()
1148     e.RunW(schema)
1149     self.assertEqual(schema.getState(),pilot.DONE)
1150     resVal = schema.getChildByName("Result").getOutputPort("o6").getPyObj()
1151     self.assertEqual(resVal, 160)
1152     pass
1153
1154   def test13(self):
1155     """ Non regression test EDF11239. ForEach into ForEach. Problem on cloning linked to DeloymentTree.appendTask method that was too strong."""
1156     p=self.r.createProc("Bug11239")
1157     ti=p.createType("int","int")
1158     ti2=p.createSequenceTc("seqint","seqint",ti)
1159     #
1160     cont=p.createContainer("DefaultContainer","Salome")
1161     #
1162     node0=self.r.createForEachLoop("ForEachLoop_int0",ti)
1163     p.edAddChild(node0)
1164     node0.edGetSeqOfSamplesPort().edInitPy(list(range(4)))
1165     node0.edGetNbOfBranchesPort().edInitInt(2)
1166     #
1167     node00=self.r.createBloc("Bloc0")
1168     node0.edAddChild(node00)
1169     node000_0=self.r.createForEachLoop("ForEachLoop_int1",ti)
1170     node00.edAddChild(node000_0)
1171     node000_0.edGetSeqOfSamplesPort().edInitPy(list(range(4)))
1172     node000_0.edGetNbOfBranchesPort().edInitInt(3)
1173     #
1174     node0000=self.r.createBloc("Bloc1")
1175     node000_0.edAddChild(node0000)
1176     #
1177     node0000_0=self.r.createScriptNode("","PyScript2")
1178     node0000.edAddChild(node0000_0)
1179     i3=node0000_0.edAddInputPort("i3",ti)
1180     i4=node0000_0.edAddInputPort("i4",ti)
1181     o5=node0000_0.edAddOutputPort("o5",ti)
1182     node0000_0.setScript("o5 = i3 + i4")
1183     node0000_0.setContainer(cont)
1184     node0000_0.setExecutionMode("remote")
1185     p.edAddLink(node0.edGetSamplePort(),i3)
1186     p.edAddLink(node000_0.edGetSamplePort(),i4)
1187     #
1188     node0000_1=self.r.createScriptNode("","PyScript1")
1189     node0000.edAddChild(node0000_1)
1190     o3=node0000_1.edAddOutputPort("o3",ti)
1191     node0000_1.setScript("o3 = 7")
1192     node0000_1.setExecutionMode("local")
1193     p.edAddCFLink(node0000_0,node0000_1)
1194     #
1195     node000_1=self.r.createScriptNode("","PostTraitement")
1196     node00.edAddChild(node000_1)
1197     i7=node000_1.edAddInputPort("i7",ti2)
1198     i5=node000_1.edAddInputPort("i5",ti2)
1199     node000_1.setScript("for i in i7:\n    print(i)\nprint(\"separation\")\nfor i in i5:\n    print(i)")
1200     node000_1.setContainer(cont)
1201     node000_1.setExecutionMode("remote")
1202     p.edAddLink(o5,i7)
1203     p.edAddLink(o3,i5)
1204     p.edAddCFLink(node000_0,node000_1)
1205     #
1206     #p.saveSchema("tmpp.xml")
1207     ex = pilot.ExecutorSwig()
1208     self.assertEqual(p.getState(),pilot.READY)
1209     ex.RunW(p,0)
1210     self.assertEqual(p.getState(),pilot.DONE)
1211     pass
1212
1213   def test14(self):
1214     """ Non regression EDF11027. Problem after Save/Load of a foreach node with type pyobj with input "SmplsCollection" manually set before. Correction in convertToYacsObjref from XML->Neutral. Objref can hide a string !"""
1215     xmlFileName=os.path.join(self.workdir, "test14.xml")
1216     SALOMERuntime.RuntimeSALOME_setRuntime()
1217     r=pilot.getRuntime()
1218     n0=r.createProc("test23/zeRun")
1219     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1220     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
1221     n0bis=r.createBloc("test23/main") ; n0.edAddChild(n0bis)
1222     n00=r.createBloc("test23/run") ; n0bis.edAddChild(n00)
1223     #
1224     n000=r.createForEachLoop("test23/FE",tp) ; n00.edAddChild(n000)
1225     n0000=r.createScriptNode("Salome","test23/run_internal") ; n000.edSetNode(n0000)
1226     i0=n0000.edAddInputPort("i0",tp)
1227     i1=n0000.edAddInputPort("i1",tp) ; i1.edInitPy(3)
1228     o0=n0000.edAddOutputPort("o0",tp)
1229     n0000.setScript("o0=i0+i1")
1230     #
1231     n00.edAddLink(n000.edGetSamplePort(),i0)
1232     #
1233     n000.edGetSeqOfSamplesPort().edInitPy(list(range(10)))
1234     n000.edGetNbOfBranchesPort().edInitInt(2)
1235     #
1236     n01=r.createScriptNode("Salome","test23/check") ; n0bis.edAddChild(n01)
1237     n0bis.edAddCFLink(n00,n01)
1238     i2=n01.edAddInputPort("i2",tp2)
1239     o1=n01.edAddOutputPort("o1",tp2)
1240     n01.setScript("o1=i2")
1241     n0bis.edAddLink(o0,i2)
1242     #
1243     n0.saveSchema(xmlFileName)
1244     #
1245     l=loader.YACSLoader()
1246     p=l.load(xmlFileName) # very import do not use n0 but use p instead !
1247     ex=pilot.ExecutorSwig()
1248     #
1249     self.assertEqual(p.getState(),pilot.READY)
1250     ex.RunW(p,0)
1251     self.assertEqual(p.getState(),pilot.DONE)
1252     self.assertEqual(p.getChildByName("test23/main.test23/check").getOutputPort("o1").getPyObj(),[3,4,5,6,7,8,9,10,11,12])
1253     pass
1254
1255   def test15(self):
1256     #fname=os.path.join(self.workdir, "BugInConcurrentLaunchDftCont.xml")
1257     p=self.r.createProc("pr")
1258     ti=p.createType("int","int")
1259     cont=p.createContainer("DefaultContainer","Salome")
1260     # enable WorkloadManager mode because containers are not registered right
1261     # in classical mode (4 containers with the same name are launched at the
1262     # same time).
1263     p.setProperty("executor", "WorkloadManager")
1264     cont.setProperty("type", "multi")
1265     cont.setProperty("container_name","FactoryServer")
1266     b=self.r.createBloc("Bloc") ; p.edAddChild(b)
1267     #
1268     nb=4
1269     outs=[]
1270     for i in range(nb):
1271       node=self.r.createScriptNode("Salome","node%d"%i)
1272       node.setExecutionMode("remote")
1273       node.setContainer(cont)
1274       outs.append(node.edAddOutputPort("i",ti))
1275       node.setScript("i=%d"%i)
1276       b.edAddChild(node)
1277     #
1278     node=self.r.createScriptNode("Salome","nodeEnd")
1279     node.setExecutionMode("remote")
1280     node.setContainer(cont)
1281     res=node.edAddOutputPort("res",ti)
1282     p.edAddChild(node)
1283     l=[]
1284     for i in range(nb):
1285       elt="i%d"%i
1286       inp=node.edAddInputPort(elt,ti) ; l.append(elt)
1287       p.edAddChild(node)
1288       p.edAddLink(outs[i],inp)
1289     node.setScript("res="+"+".join(l))
1290     p.edAddCFLink(b,node)
1291     #
1292     for i in range(10):
1293       p.init()
1294       ex = pilot.ExecutorSwig()
1295       self.assertEqual(p.getState(),pilot.READY)
1296       ex.RunW(p,0)
1297       self.assertEqual(res.getPyObj(),6)
1298       self.assertEqual(p.getState(),pilot.DONE)
1299     pass
1300
1301   def test16(self):
1302     """ Test to check that a list[pyobj] outputport linked to pyobj inputport is OK."""
1303     SALOMERuntime.RuntimeSALOME_setRuntime()
1304     self.r=pilot.getRuntime()
1305     n0=self.r.createProc("test16/zeRun")
1306     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1307     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
1308     
1309     n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
1310     o0=n00.edAddOutputPort("o0",tp2)
1311     n00.setScript("o0=[[i+1] for i in range(8)]")
1312     n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
1313     i1=n01.edAddInputPort("i1",tp)
1314     n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
1315     n0.edAddCFLink(n00,n01)
1316     n0.edAddLink(o0,i1)
1317     #
1318     ex=pilot.ExecutorSwig()
1319     self.assertEqual(n0.getState(),pilot.READY)
1320     ex.RunW(n0,0)
1321     self.assertEqual(n0.getState(),pilot.DONE)
1322     pass
1323
1324   def test17(self):
1325     """ Same as test16 except that tp2 is not list of tp but a list of copy of tp"""
1326     SALOMERuntime.RuntimeSALOME_setRuntime()
1327     self.r=pilot.getRuntime()
1328     n0=self.r.createProc("test17/zeRun")
1329     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1330     tpp=n0.createInterfaceTc("python:obj:1.0","pyobj",[]) # diff is here
1331     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tpp)
1332     
1333     n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
1334     o0=n00.edAddOutputPort("o0",tp2)
1335     n00.setScript("o0=[[i+1] for i in range(8)]")
1336     n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
1337     i1=n01.edAddInputPort("i1",tp)
1338     n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
1339     n0.edAddCFLink(n00,n01)
1340     n0.edAddLink(o0,i1)
1341     #
1342     ex=pilot.ExecutorSwig()
1343     self.assertEqual(n0.getState(),pilot.READY)
1344     ex.RunW(n0,0)
1345     self.assertEqual(n0.getState(),pilot.DONE)
1346     pass
1347
1348   def test18(self):
1349     p=self.r.createProc("prTest18")
1350     n00=self.r.createScriptNode("Salome","n00")
1351     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1352     n00.setExecutionMode("remote")
1353     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1354     cont=p.createContainer("gg","Salome")
1355     n00.setContainer(cont)
1356     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1357     cont.setProperty("nb_proc_per_nod","6")
1358     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1359     cont.setProperty("nb_proc_per_node","7")           # <- here
1360     self.assertEqual(n00.getMaxLevelOfParallelism(),7) # <- here
1361     pass
1362     
1363   def test19(self):
1364     """This test checks the mechanism of YACS that allow PythonNodes to know their DynParaLoop context."""
1365     fname=os.path.join(self.workdir, "test19.xml")
1366     l=loader.YACSLoader()
1367     #
1368     p=self.r.createProc("PROC")
1369     p.setProperty("executor","workloadmanager")
1370     ti=p.createType("int","int")
1371     tdi=p.createSequenceTc("seqint","seqint",ti)
1372     # Level0
1373     fe0=self.r.createForEachLoop("FE0",ti) ; p.edAddChild(fe0)
1374     fe0.edGetNbOfBranchesPort().edInitInt(4)
1375     fe0_end=self.r.createScriptNode("Salome","fe0_end")
1376     fe0.edSetFinalizeNode(fe0_end)
1377     fe0_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
1378 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)""")
1379     n0=self.r.createScriptNode("Salome","n0") ; p.edAddChild(n0)
1380     n0.setScript("o1=range(10)")
1381     a=n0.edAddOutputPort("o1",tdi)
1382     p.edAddLink(a,fe0.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n0,fe0)
1383     # Level1
1384     b0=self.r.createBloc("b0") ; fe0.edAddChild(b0)
1385     n1=self.r.createScriptNode("Salome","n1") ; b0.edAddChild(n1)
1386     n1.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
1387 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)
1388 o1=range(10)""")
1389     b=n1.edAddOutputPort("o1",tdi)
1390     fe1=self.r.createForEachLoop("FE1",ti) ; b0.edAddChild(fe1)
1391     fe1.edGetNbOfBranchesPort().edInitInt(3)
1392     fe1_end=self.r.createScriptNode("Salome","fe1_end")
1393     fe1_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
1394 assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
1395 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
1396 """)
1397     fe1.edSetFinalizeNode(fe1_end)
1398     p.edAddLink(b,fe1.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n1,fe1)
1399     # Level2
1400     n2=self.r.createScriptNode("Salome","n2") ; fe1.edAddChild(n2)
1401     n2.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
1402 assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
1403 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
1404 """)
1405     
1406     p.saveSchema(fname)
1407     ex=pilot.ExecutorSwig()
1408     
1409     # local run of PythonNodes n1 and n2
1410     p=l.load(fname)
1411     p.init()
1412     self.assertEqual(p.getState(),pilot.READY)
1413     ex.setDPLScopeSensitive(True) # <- this line is the aim of the test
1414     ex.RunW(p,0)
1415     self.assertEqual(p.getState(),pilot.DONE)
1416
1417     # run remote
1418     p=l.load(fname)
1419     cont=p.createContainer("gg","Salome")
1420     cont.setProperty("name","localhost")
1421     cont.setProperty("hostname","localhost")
1422     # no limit for the number of containers launched
1423     cont.setProperty("nb_proc_per_node","0")
1424     cont.setProperty("type","multi")
1425     #cont.usePythonCache(True)
1426     cont.attachOnCloning()
1427     n1=p.getChildByName("FE0.b0.n1") ; n1.setExecutionMode("remote") ; n1.setContainer(cont)
1428     n2=p.getChildByName("FE0.b0.FE1.n2") ; n2.setExecutionMode("remote") ; n2.setContainer(cont)
1429     p.init()
1430     self.assertEqual(p.getState(),pilot.READY)
1431     ex.RunW(p,0)
1432     self.assertEqual(p.getState(),pilot.DONE)
1433     pass
1434
1435   def test20(self):
1436     """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"""
1437     def assignCont(n,cont):
1438       n.setExecutionMode("remote") ; n.setContainer(cont) 
1439       pass
1440     xmlFileName="test20.xml"
1441     p=self.r.createProc("test26")
1442     p.setProperty("executor","workloadmanager")
1443     #
1444     cont=p.createContainer("gg","Salome")
1445     cont.setProperty("name","localhost")
1446     cont.setProperty("hostname","localhost")
1447     # no limit for the number of containers launched
1448     cont.setProperty("nb_proc_per_node","0")
1449     cont.setProperty("type","multi")
1450     cont.usePythonCache(True)
1451     cont.attachOnCloning()
1452     #
1453     po=p.createInterfaceTc("python:obj:1.0","pyobj",[])
1454     sop=p.createSequenceTc("list[pyobj]","list[pyobj]",po)
1455     #
1456     b0=self.r.createBloc("test26/main") ; p.edAddChild(b0)
1457     n0=self.r.createScriptNode("Salome","test26/n0") ; assignCont(n0,cont) # 1
1458     n0.setScript("""import os
1459 dd=range(10)""")
1460     dd=n0.edAddOutputPort("dd",sop) ; b0.edAddChild(n0)
1461     fe0=self.r.createForEachLoop("test26/FE0",po) ; b0.edAddChild(fe0)
1462     fe0.edGetNbOfBranchesPort().edInitInt(1) # very important for the test : 1 !
1463     fe0i=self.r.createBloc("test26/FE0_internal") ; fe0.edSetNode(fe0i)
1464     zeArgInitNode2=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode2,cont) # 2
1465     fe0i.edAddChild(zeArgInitNode2)
1466     c1=zeArgInitNode2.edAddInputPort("c",po)
1467     c2=zeArgInitNode2.edAddOutputPort("c",po)
1468     zeRun=self.r.createBloc("test26/zeRun") ; fe0i.edAddChild(zeRun)
1469     zeArgInitNode=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode,cont) # 3
1470     zeRun.edAddChild(zeArgInitNode)
1471     ff1=zeArgInitNode.edAddInputPort("ff",po)
1472     ff2=zeArgInitNode.edAddOutputPort("ff",po)
1473     line01=self.r.createScriptNode("Salome","line01") ; zeRun.edAddChild(line01) ; assignCont(line01,cont) # 4
1474     line01.setScript("ee=3")
1475     ee0=line01.edAddOutputPort("ee",po)
1476     initt=self.r.createScriptNode("Salome","test26/initt") ; assignCont(initt,cont) # 5
1477     initt.setScript("pass") ; zeRun.edAddChild(initt)
1478     end=self.r.createScriptNode("Salome","test26/end") ; assignCont(end,cont) # 6
1479     end.setScript("import os") ; zeRun.edAddChild(end)
1480     retu=self.r.createScriptNode("Salome","return") ; assignCont(retu,cont) # 7
1481     retu.setScript("ee=i0") ; zeRun.edAddChild(retu)
1482     i0=retu.edAddInputPort("i0",po)
1483     ee=retu.edAddOutputPort("ee",po)
1484     zeRun.edAddCFLink(zeArgInitNode,line01)
1485     zeRun.edAddCFLink(line01,initt)
1486     zeRun.edAddCFLink(initt,end)
1487     zeRun.edAddCFLink(end,retu)
1488     p.edAddLink(ee0,i0)
1489     #
1490     returnn=self.r.createScriptNode("Salome","return") ; assignCont(returnn,cont) # 8
1491     returnn.setScript("elt=i0")
1492     i00=returnn.edAddInputPort("i0",po)
1493     elt=returnn.edAddOutputPort("elt",po)
1494     fe0i.edAddChild(returnn)
1495     fe0i.edAddCFLink(zeArgInitNode2,zeRun)
1496     fe0i.edAddCFLink(zeRun,returnn)
1497     p.edAddLink(c2,ff1)
1498     p.edAddLink(ee,i00)
1499     #
1500     finalize=self.r.createScriptNode("Salome","test26/finalize") ; b0.edAddChild(finalize) ; assignCont(finalize,cont) # 9
1501     finalize.setScript("pass")
1502     b0.edAddCFLink(n0,fe0)
1503     b0.edAddCFLink(fe0,finalize)
1504     #
1505     p.edAddLink(dd,fe0.edGetSeqOfSamplesPort())
1506     p.edAddLink(fe0.edGetSamplePort(),c1)
1507     #
1508     #xmlFileName="test20.xml"
1509     #p.saveSchema(xmlFileName)
1510     p.getChildByName("test26/main.test26/FE0").edGetNbOfBranchesPort().edInitInt(1) # very important 1 !
1511     #
1512     ex=pilot.ExecutorSwig()
1513     self.assertEqual(p.getState(),pilot.READY)
1514     ex.RunW(p,0)
1515     self.assertEqual(p.getState(),pilot.DONE)
1516     pass
1517
1518   pass
1519
1520   def test21(self):
1521     "test if we restart from a saved state in a foreach loop"
1522     fname=os.path.join(self.workdir, "test21.xml")
1523     xmlStateFileName=os.path.join(self.workdir, "saveState21.xml")
1524     from datetime import datetime
1525     p=self.r.createProc("prTest21")
1526     cont=p.createContainer("gg","Salome")
1527     cont.setProperty("name","localhost")
1528     cont.setProperty("hostname","localhost")
1529     cont.setProperty("type","multi")
1530     td=p.createType("double","double")
1531     ti=p.createType("int","int")
1532     tsi=p.createSequenceTc("seqint","seqint",ti)
1533     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
1534     n0=self.r.createScriptNode("","n0")
1535     o0=n0.edAddOutputPort("o0",tsi)
1536     n0.setScript("o0=[ elt for elt in range(6) ]")
1537     p.edAddChild(n0)
1538     n1=self.r.createForEachLoop("n1",ti)
1539     n10=self.r.createScriptNode("","n10")
1540     n10.setExecutionMode("remote")
1541     n10.setContainer(cont)
1542     n1.edAddChild(n10)
1543     n10.setScript("""
1544 import time
1545 time.sleep(9)
1546 o2=2*i1
1547 """)
1548     i1=n10.edAddInputPort("i1",ti)
1549     o2=n10.edAddOutputPort("o2",ti)
1550     p.edAddChild(n1)
1551     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1552     p.edAddLink(n1.edGetSamplePort(),i1)
1553     p.edAddCFLink(n0,n1)
1554     n1.edGetNbOfBranchesPort().edInitPy(2)
1555     n2=self.r.createScriptNode("","n2")
1556     n2.setScript("o4=i3")
1557     i3=n2.edAddInputPort("i3",tsi)
1558     o4=n2.edAddOutputPort("o4",tsi)
1559     n2.setScript("o4=i3")
1560     p.edAddChild(n2)
1561     p.edAddCFLink(n1,n2)
1562     p.edAddLink(o2,i3)
1563     p.saveSchema(fname)
1564     #
1565     l=loader.YACSLoader()
1566     p=l.load(fname)
1567     n1=p.getChildByName("n1")
1568     ex=pilot.ExecutorSwig()
1569     ex.setKeepGoingProperty(True)
1570     #
1571     startt=datetime.now()
1572     import threading
1573     myRun=threading.Thread(None, ex.RunW, None, (p,0))
1574     myRun.start()
1575     import time
1576     time.sleep(15)
1577     SALOMERuntime.schemaSaveState(p, ex, xmlStateFileName)
1578     a,b,c=n1.getPassedResults(ex)
1579     myRun.join()
1580     t0=datetime.now()-startt
1581     #
1582     self.assertEqual(p.getState(),pilot.DONE)
1583     self.assertEqual(n1.getState(),pilot.DONE)
1584     self.assertEqual(a,[0,1])
1585     self.assertEqual([elt.getPyObj() for elt in b],[[0,2]])
1586     #
1587     p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
1588     p.getChildByName("n1").getChildByName("n10").setScript("""
1589 import time
1590 time.sleep(0.1)
1591 o2=5*i1
1592 """)
1593     loader.loadState(p, xmlStateFileName)
1594     p.resetState(1)
1595     p.getChildByName("n1").assignPassedResults(a,b,c)
1596     p.exUpdateState();
1597     #
1598     ex.RunW(p,0,False)
1599     #
1600     self.assertEqual(n1.getState(),pilot.DONE)
1601     self.assertEqual(p.getState(),pilot.DONE)
1602     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,2,10,15,20,25])
1603
1604     # Restart from a saved state in a foreach loop without using assignPassedResults.
1605     # This test uses the files test21.xml and saveState21.xml produced by test21.
1606
1607     ex=pilot.ExecutorSwig()
1608     l=loader.YACSLoader()
1609     q=l.load(fname)
1610     q.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
1611     q.getChildByName("n1").getChildByName("n10").setScript("""
1612 import time
1613 time.sleep(0.1)
1614 print("execution n10:", i1)
1615 o2=5*i1
1616 """)
1617     q.getChildByName("n2").setScript("""
1618 print("execution n2:", i3)
1619 o4=i3
1620 """)
1621     loader.loadState(q, xmlStateFileName)
1622     q.resetState(1)
1623     q.exUpdateState()
1624     #
1625     ex.RunW(q,0,False)
1626     #
1627     self.assertEqual(q.getChildByName("n1").getState(),pilot.DONE)
1628     self.assertEqual(q.getState(),pilot.DONE)
1629     self.assertEqual(q.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,2,10,15,20,25])
1630     pass
1631
1632   def test23(self):
1633     """ test focused on weight attribut after a dump and reload from a xml file
1634     """
1635     fname=os.path.join(self.workdir, "test23.xml")
1636     p=self.r.createProc("prTest23")
1637     cont=p.createContainer("gg","Salome")
1638     cont.setProperty("name","localhost")
1639     cont.setProperty("hostname","localhost")
1640     cont.setProperty("type","multi")
1641     td=p.createType("double","double")
1642     ti=p.createType("int","int")
1643     tsi=p.createSequenceTc("seqint","seqint",ti)
1644     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
1645     n0=self.r.createScriptNode("","n0")
1646     o0=n0.edAddOutputPort("o0",tsi)
1647     n0.setScript("o0=[ elt for elt in range(6) ]")
1648     p.edAddChild(n0)
1649     n1=self.r.createForEachLoop("n1",ti)
1650     n1.setWeight(3)
1651     n10=self.r.createScriptNode("","n10")
1652     n10.setExecutionMode("remote")
1653     n10.setContainer(cont)
1654     n1.edAddChild(n10)
1655     n10.setScript("""
1656 import time
1657 time.sleep(2)
1658 o2=2*i1
1659 """)
1660     n10.setWeight(4.)
1661     i1=n10.edAddInputPort("i1",ti)
1662     o2=n10.edAddOutputPort("o2",ti)
1663     p.edAddChild(n1)
1664     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1665     p.edAddLink(n1.edGetSamplePort(),i1)
1666     p.edAddCFLink(n0,n1)
1667     n1.edGetNbOfBranchesPort().edInitPy(2)
1668     n2=self.r.createScriptNode("","n2")
1669     n2.setScript("o4=i3")
1670     i3=n2.edAddInputPort("i3",tsi)
1671     o4=n2.edAddOutputPort("o4",tsi)
1672     n2.setScript("o4=i3")
1673     p.edAddChild(n2)
1674     p.edAddCFLink(n1,n2)
1675     p.edAddLink(o2,i3)
1676     p.saveSchema(fname)
1677     #
1678     l=loader.YACSLoader()
1679     p=l.load(fname)
1680     self.assertEqual(p.getChildByName("n1").getWeight().getSimpleLoopWeight(),3.0)
1681     self.assertEqual(p.getChildByName("n1").getChildByName("n10").getWeight().getElementaryWeight(),4.0)
1682     pass
1683
1684   def test24(self):
1685     """ Non regression test EDF17470"""
1686     SALOMERuntime.RuntimeSALOME.setRuntime()
1687     r=SALOMERuntime.getSALOMERuntime()
1688     p=r.createProc("prTest2")
1689     #
1690     cont1=p.createContainer("cont1","Salome")
1691     cont1.setProperty("name","localhost")
1692     cont1.setProperty("hostname","localhost")
1693     cont1.setProperty("type","multi")
1694     cont1.setProperty("container_name","container1")
1695     #
1696     cont2=p.createContainer("cont2","Salome")
1697     cont2.setProperty("name","localhost")
1698     cont2.setProperty("hostname","localhost")
1699     cont2.setProperty("type","multi")
1700     cont2.setProperty("container_name","container2")
1701     #
1702     td=p.createType("double","double")
1703     ti=p.createType("int","int")
1704     ts=p.createType("string","string")
1705     n0=r.createScriptNode("","n0")
1706     n0.setScript("""import SalomeSDSClt
1707 import SALOME
1708 import salome
1709 import unittest
1710 import pickle
1711 import gc
1712 import time
1713
1714 def obj2Str(obj):
1715   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1716 def str2Obj(strr):
1717   return pickle.loads(strr)
1718
1719
1720 salome.salome_init()
1721 scopeName="Scope1"
1722 varName="a"
1723 dsm=salome.naming_service.Resolve("/DataServerManager")
1724 dsm.cleanScopesInNS()
1725 if scopeName in dsm.listScopes():
1726   dsm.removeDataScope(scopeName)
1727 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1728 #
1729 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
1730 dss.atomicApply([t0])
1731 """)
1732     n0_sn=n0.edAddOutputPort("scopeName",ts)
1733     n0_vn=n0.edAddOutputPort("varName",ts)
1734     #
1735     n1=r.createScriptNode("","n1")
1736     n1_sn=n1.edAddInputPort("scopeName",ts)
1737     n1_vn=n1.edAddInputPort("varName",ts)
1738     n1.setScript("""import SalomeSDSClt
1739 import SALOME
1740 import salome
1741 import unittest
1742 import pickle
1743 import gc
1744 import time
1745
1746
1747 def obj2Str(obj):
1748   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1749 def str2Obj(strr):
1750   return pickle.loads(strr)
1751
1752 salome.salome_init()
1753 dsm=salome.naming_service.Resolve("/DataServerManager")
1754 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1755 assert(not isCreated)
1756
1757 t1=dss.addMultiKeyValueSession(varName)
1758 # lecture 'ef'
1759 wk2=dss.waitForKeyInVar(varName,obj2Str("ef"))
1760 wk2.waitFor()
1761 assert(str2Obj(dss.waitForMonoThrRev(wk2))==[11,12])""")
1762     n1.setContainer(cont1)
1763     n1.setExecutionMode("remote")
1764     #
1765     n2=r.createScriptNode("","n2")
1766     n2_sn=n2.edAddInputPort("scopeName",ts)
1767     n2_vn=n2.edAddInputPort("varName",ts)
1768     n2.setScript("""import SalomeSDSClt
1769 import SALOME
1770 import salome
1771 import unittest
1772 import pickle
1773 import gc
1774 import time
1775
1776
1777 def obj2Str(obj):
1778   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1779 def str2Obj(strr):
1780   return pickle.loads(strr)
1781
1782 salome.salome_init()
1783 dsm=salome.naming_service.Resolve("/DataServerManager")
1784 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1785 assert(not isCreated)
1786 time.sleep(3.)
1787 t1=dss.addMultiKeyValueSession(varName)
1788 t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
1789 t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("ef"),obj2Str([11,12]))
1790 """)
1791     n2.setContainer(cont2)
1792     n2.setExecutionMode("remote")
1793     #
1794     p.edAddChild(n0)
1795     p.edAddChild(n1)
1796     p.edAddChild(n2)
1797     p.edAddCFLink(n0,n1)
1798     p.edAddCFLink(n0,n2)
1799     p.edAddLink(n0_sn,n1_sn)
1800     p.edAddLink(n0_vn,n1_vn)
1801     p.edAddLink(n0_sn,n2_sn)
1802     p.edAddLink(n0_vn,n2_vn)
1803     #
1804     ex=pilot.ExecutorSwig()
1805     ex.RunW(p,0)
1806     self.assertEqual(p.getState(),pilot.DONE)
1807     pass
1808
1809   def test25(self):
1810     fname=os.path.join(self.workdir, "test25.xml")
1811     p=self.r.createProc("p0")
1812     tp=p.createInterfaceTc("python:obj:1.0","pyobj",[])
1813     n1_0_sc=self.r.createScriptNode("Salome","n1_0_sc")
1814     p.edAddChild(n1_0_sc)
1815     n1_0_sc.setExecutionMode("remote")
1816     n1_0_sc.setScript("""""")
1817     i1_0_sc=n1_0_sc.edAddInputPort("i1",tp)
1818     i1_0_sc.edInitPy(list(range(4)))
1819
1820     cont=p.createContainer("gg","Salome")
1821     cont.setProperty("name","localhost")
1822     cont.setProperty("hostname","localhost")
1823     n1_0_sc.setContainer(cont)
1824
1825     p.saveSchema(fname)
1826     l=loader.YACSLoader()
1827     p=l.load(fname)
1828     ex=pilot.ExecutorSwig()
1829     self.assertEqual(p.getState(),pilot.READY)
1830     ex.RunW(p,0)
1831     self.assertEqual(p.getState(),pilot.DONE)
1832     pass
1833
1834   def test27(self):
1835     """ 
1836     This test is here to check that old (<=930) graphs are always loadable.
1837     So an xml file coming from test14 in 930 has been generated and converted into home made "base64" like format.
1838     This test puts unbased64 byte array into test_930.xml and load it to check that everything is OK.
1839     """
1840     import os
1841     content_of_file = b'DDkShXM2PeNCndPqRfnYX5EAt.GaRgPq7dNqtfnYZgvqh=kQf7moXCE2z5lED.tCxgM2RcOqdfl29ePC9YnAx3uaGetqF5lE=.E2D0uS1eM2RcOqdfl2FjPqBYE2pdNq7fl2FjPqBYHoT3.2=.Ew9dsCdUFqVfOaj2Eaxet4BeN2=BOKRWOwF0PqfYMqdYHoT3.2=.EwxYNKHeNa=5O4heOwF4OKBeN2=7Maj2FaZXOaFDFwI.E2=1kibUua=5O4heOwF7Nq9YE2pdNq7fl2ZbMiFDFwI.E2=1nqFZNCdaM2RcOqdfl21dvqFZN2=7Maj2ECbWsKxbNQxYNKL6lo12HoT3.2=.EwneOCfeNqleM2RcOqdfl2BdPC9hcCbjN4Jfd2=APqRWuaRWuwF.uSxYNKFDFwI.E2=1kibUua=5O4heOwFAsiHdNqtYE2pdNq7fl2nWtCZbPaFDFwI.E2=1n4xbMiVdNqdYs2RcOqdfl26eNaVesq9g9qRWu4ZbOaHYFwI.E2=.E2=1kCHjMCdYsibUFqVfOaj2H4xbMiVdNqdYvupdNq7YE2PcMqfeOwFAe4BjOqdYHoT3.2=.E2=.Ew1Yvq1eNC9ds2RcOqdfl2VWsiVgMKdWPuxbPulXPqRdNqtYE2PcMqfeOwF.l2x5lE=.E2=.E2D.tCxUuaHWuS=5O4heOwFAPqRWu4ZbOaHjdqVfOaF.FiVXOidfl2McP49jNCbgeaHauaHYHoT3.2=.E2=.Ew1Yvq1eNC9ds2RcOqdfl2RcOqdYE2PcMqfeOwF1PqlcMq3jPC9YHoT3.2=.EwxAPqRWu4ZbOaHblE=.E2D2MqxgM2RcOqdfl29ePC9YnAx9O4ZbN2T3.2=.E2=.EwFXPqlUFqVfOaj2EidgsiHAnoHetqF5lE=.E2=.E2=.E2D4PqHeO4lVM2RcOqdfl29ePC9YnAx48WF.FqFYu4RgMKj2FAF.EqxjMCueOKtVMij2GoX2E29dsCdfl21dvqFZN2T3.2=.E2=.E2=.E2=.EwZbMqZbOa=5O4heOwF0uanWtAnDFCfbPuZbMidYtqVXN2T3.2=.E2=.E2=.E2=.E2=.EwngNCZUsiT1n4xWOaT1m2qg6WUWe0qjMAj7MAp7OAifdwDDH4xWOaT1nongNCZUsiT3.2=.E2=.E2=.E2=.E2=.EwZbMCxYsi=5O4heOwF7MAF.EibUuaj2ECbjN4JYHoT3.2=.E2=.E2=.E2=.E2=.EwZbMCxYsi=5O4heOwF7OAF.EibUuaj2ECbjN4JYHoT3.2=.E2=.E2=.E2=.E2=.Ewxesi1jNC9UFqVfOaj2Hq12E29dsCdfl21dvqFZN2x5lE=.E2=.E2=.E2=.E2DDGKRXOKReNwI.E2=.E2=.E2=1noNjNCdcP43blE=.E2=.E2=.E2D0O49cMqZbPK=APqRWtCxXOwF4O4BguaF5lE=.E2=.E2=.E2=.E2D4NCxfNqxWOaT0uanWtAnDFWcXnoNYvqhbPq7eNw=1laHjOq1jNC9bmaPcMqmcOq1XOanXnoNYvqhUvqHWtwI.E2=.E2=.E2=.E2=1kixbPq7eNw9ePC9YnAx48WR0uanWtAnDFCfbPuZbMidYtqVXMwx0vqRjMadbk2D0vq1jNC9bmK11no9jMCxYsiT3.2=.E2=.E2=.Ewx0O49cMqZbPKT3.2=.E2=.Ewx2MqxgNwI.E2=.E2=1mKRXOKReM2RcOqdfl29ePC9YnAxAMKdgPKF5lE=.E2=.E2=.E2DAv4HdMC9bkwljMadbkwVBf06c6eUhfqX9mKH9euT1noljMadbkwxAv4HdMC9blE=.E2=.E2=.E2D7Nq1jNC9UFqVfOaj2GKH2E29dsCdfl2BdPC9hcCbjN4Jfd2x5lE=.E2=.E2=.E2DDOi9UvqHWs2RcOqdfl2xcl2=0uS1eOwF1OKnWvO1dvqFZOuFDFwI.E2=.E2=1noZbMqZbOaT3.2=.E2=.EwljNq9YvqBbk2D4NCxfNqxWOaT0uanWtAnDFCfbMwx4NCxfNqxWOaT.Ew9jNqxWOaT0uanWtAnDH43eP4pXno9jNqxWOaT.EwxAPqRWtCxXNwI.E2=.E2=1kaVWu4BdNqpUH4xbMiHjMqj2FaVXPCdYFwI.E2=.E2=.E2=1laHjOqRjMadbkidgsiHAnoHetqR0uanWtAnDFWcbEidgsiHAnoHetqydNq9eNCRcMqDDFaHjOqRjMadbk2D4NCxfMCxYsiTDMADDFaHjOq1jNC9blE=.E2=.E2=.E2D0vqRjMadbkidgsiHAnolVOalhMwx0vqRjMadbk2D0vq1jNC9bmKH1no9jMCxYsiT3.2=.E2=.Ewx0O49cMqZbPKT3.2=.Ewx2MqxgNwI.E2=1kCVYu4heMidYtwI.E2=.E2=1kixbPq7eNw9ePC9YnAx9O4ZbNo9ePC9YnAx2uiRbEidgsiHAnoMe6wx0vqRjMadbkw9jMCxYsiT5N4EYu4RgMKdgswx0vq1jNC9blE=.E2=.E2D4u4BeuaT1mKRWtwH1noZbMiT1noPcMqfeNwI.E2=1no1cNCVfOa9eNCT3.2=.Ew1cNCVfOa9eNCT3.2=.E2=.Ew9jNqxWOaT0uanWtAnDGqVdNqR0uanWtAnDFCfbNo9ePC9YnAx48WDDEixbPq7eNwD0vq1jNC9bn8hUsqng9qBXOalWuKxbMwx0vq1jNC9blE=.E2=.E2D4u4BeuaT1m4HYu4bbkw7cMiVblED4u4BeuaT1nC9YuKRiNwAUkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkmX17ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT17AAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAgkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkm917ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT18gAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAakmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkmv17ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT16QAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAdkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wx0O49cNwDDG4HYu4bbkwx4u4BeuaT3.2=.Ewx.u4HcOqdWuaHblE=.E2D.u4HcOqdWuaHblE=.E2=.E2D0vqRjMadbkidgsiHAnohcOKRbEidgsiHAnoHetqR0uanWtAnDFWcbEidgsiHAnoHetqydNq9eNCRcMqDDEixbPq7eNwD0vq1jNC9bmKX1no9jMCxYsiT3.2=.E2=.EwPcMqfeNwDDN4JYuaNbkwVBf06c6eUhcmn17ER9euT1noxYNKHeNaT1noPcMqfeNwI.E2=1no1cNCVfOa9eNCT3.wx.tCxgNwI3'
1842
1843     fname=os.path.join(self.workdir, "test_930.xml")
1844     with open(fname,"wb") as f:
1845       f.write( pilot.FromBase64Swig(content_of_file) )
1846
1847     SALOMERuntime.RuntimeSALOME_setRuntime()
1848     l=loader.YACSLoader()
1849     p=l.load(fname)
1850     self.assertTrue(p.getChildByName("test23/main").getChildByName("test23/run").getChildByName("test23/FE").getChildByName("test23/run_internal").getInputPort("i1").getPyObj() == 3)
1851     self.assertTrue(p.getChildByName("test23/main").getChildByName("test23/run").getChildByName("test23/FE").edGetSeqOfSamplesPort().getPyObj()==list(range(10)))
1852     os.remove(fname)
1853     pass
1854
1855 if __name__ == '__main__':
1856   dir_test = tempfile.mkdtemp(suffix=".yacstest")
1857   file_test = os.path.join(dir_test,"UnitTestsResult")
1858   with open(file_test, 'a') as f:
1859       f.write("  --- TEST src/yacsloader: testSaveLoadRun.py\n")
1860       suite = unittest.makeSuite(TestSaveLoadRun)
1861       result=unittest.TextTestRunner(f, descriptions=1, verbosity=1).run(suite)
1862   sys.exit(not result.wasSuccessful())