Salome HOME
Correction of bug detected by the boss
authorAnthony Geay <anthony.geay@edf.fr>
Fri, 12 May 2017 08:58:09 +0000 (10:58 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Fri, 12 May 2017 08:58:09 +0000 (10:58 +0200)
src/engine/Container.hxx
src/runtime/RuntimeSALOME.hxx
src/runtime/SalomeContainerHelper.cxx
src/runtime/SalomeContainerHelper.hxx
src/runtime/SalomeHPContainer.cxx
src/runtime/SalomeHPContainer.hxx
src/runtime/SalomeHPContainerTools.cxx
src/runtime/SalomeHPContainerTools.hxx
src/runtime_swig/SALOMERuntime.i
src/yacsloader_swig/Test/testHPDecorator.py

index 73f32524e34f696184ffa3711aae3240df429b41..8f5b6edcf59a75c7f330c3b16fef106a1f578fc3 100644 (file)
@@ -72,7 +72,7 @@ namespace YACS
       virtual std::map<std::string,std::string> getProperties() const = 0;
       virtual std::map<std::string,std::string> getResourceProperties(const std::string& name) const = 0;
       virtual void setProperties(const std::map<std::string,std::string>& properties);
-      std::string getName() const { return _name; }
+      virtual std::string getName() const { return _name; }
       //! \b WARNING ! name is used in edition to identify different containers, it is not the runtime name of the container
       void setName(std::string name) { _name = name; }
       void setProc(Proc* proc) { _proc = proc; }
index 4479b3ded82788bbde635a34b311ca1f1d171e60..06515767dee92bd8749b4f74e4ba06a353896a48 100644 (file)
@@ -124,7 +124,9 @@ namespace YACS
       virtual ServiceInlineNode *createSInlineNode(const std::string& kind, const std::string& name);
       virtual ComponentInstance* createComponentInstance(const std::string& name,
                                                          const std::string& kind="");
+#ifndef SWIG
       virtual Container *createContainer(const std::string& kind="");
+#endif
       virtual WhileLoop* createWhileLoop(const std::string& name);
       virtual ForLoop* createForLoop(const std::string& name);
       virtual OptimizerLoop* createOptimizerLoop(const std::string& name,const std::string& algLib,
index b65e2bd46814572fd41c0419e6669674d473c39b..0e54975741eff60bbb33e6fb780d4715db1c8b9e 100644 (file)
@@ -105,6 +105,15 @@ void SalomeContainerMonoHelper::shutdown()
   _trueCont=Engines::Container::_nil();
 }
 
+std::string SalomeContainerMonoHelper::getKernelContainerName() const
+{
+  if(CORBA::is_nil(_trueCont))
+    return std::string("NULL");
+  CORBA::String_var containerName(_trueCont->name());
+  std::string ret(containerName);
+  return ret;
+}
+
 SalomeContainerMonoHelper::~SalomeContainerMonoHelper()
 {
 }
index 8fa363f5b5a2769f43b8d894f528d115252aa7a0..0236f81a4320579331accd3736436035583a8fab 100644 (file)
@@ -63,6 +63,7 @@ namespace YACS
       void setContainer(const Task *askingNode, Engines::Container_var cont);
       bool isKernelContNull() const;
       void shutdown();
+      std::string getKernelContainerName() const;
     private:
       ~SalomeContainerMonoHelper();
     public:
index e057a5f1ef556b212460fee6ba6bf82b037442c4..b198882dbf49419b0b5d0490d258180910b618ab 100644 (file)
@@ -216,6 +216,11 @@ Engines::Container_var SalomeHPContainerBase::getContainerPtr(const Task *asking
   return helper->getContainer(NULL);
 }
 
+std::vector<std::string> SalomeHPContainerBase::getKernelContainerNames() const
+{
+  return _launchModeType->getKernelContainerNames();
+}
+
 ////////////////
 
 SalomeHPContainer::SalomeHPContainer():SalomeHPContainerBase(new SalomeHPContainerVectOfHelper)
@@ -329,6 +334,16 @@ Container *SalomeHPContainerShared::cloneAlways() const
   throw Exception("SalomeHPContainerShared::cloneAlways : you are not supposed to be in this situation ! This type of container has only existence during execution !");
 }
 
+std::string SalomeHPContainerShared::getName() const
+{
+  return getTheBoss()->getName();
+}
+
+std::string SalomeHPContainerShared::getDiscreminantStrOfThis(const Task *askingNode) const
+{
+  return getTheBoss()->getDiscreminantStrOfThis(askingNode);
+}
+
 void SalomeHPContainerShared::start(const Task *askingNode) throw(Exception)
 {
   SalomeContainerToolsSpreadOverTheResDecorator sct(&getTheBoss()->getContainerInfo(),_pd->getPlayGround(),_launchModeType,askingNode);
index 80001ad832584ced61593521c09c8b2c58b6c39f..22cfad3d4df2318891986259b5767681fe787787 100644 (file)
@@ -75,6 +75,7 @@ namespace YACS
       void addComponentName(const std::string& name);
       void checkCapabilityToDealWith(const ComponentInstance *inst) const throw(YACS::Exception);
       Engines::Container_var getContainerPtr(const Task *askingNode) const;
+      std::vector<std::string> getKernelContainerNames() const;
     public:
       int getShutdownLev() const { return _shutdownLevel; }
       YACS::BASES::AutoRefCnt<HomogeneousPoolContainer> decorate(YACS::BASES::AutoConstRefCnt<PartDefinition> pd);
@@ -141,6 +142,8 @@ namespace YACS
       int getNumberOfCoresPerWorker() const { return _directFather->getNumberOfCoresPerWorker(); }
       void prepareMaskForExecution() const;
       void forYourTestsOnly(ForTestOmlyHPContCls *data) const;
+      std::string getName() const;
+      std::string getDiscreminantStrOfThis(const Task *askingNode) const;
     public:
       std::string getKind() const;
       void start(const Task *askingNode) throw(Exception);
index bb9ae661ddf5dd9a40e7ed38d673d778db9519db..0737fc4719dd193085361291c6852373f747a6d6 100644 (file)
@@ -157,6 +157,21 @@ void SalomeHPContainerVectOfHelper::shutdown()
         (*it)->shutdown();
 }
 
+std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames() const
+{
+  std::vector<std::string> ret;
+  {
+    YACS::BASES::AutoLocker<SalomeHPContainerVectOfHelper> alck(const_cast<SalomeHPContainerVectOfHelper *>(this));
+    std::size_t sz(_launchModeType.size());
+    ret.resize(sz);
+    for(std::size_t i=0;i<sz;i++)
+      {
+        ret[i]=_launchModeType[i]->getKernelContainerName();
+      }
+  }
+  return ret;
+}
+
 void SalomeHPContainerVectOfHelper::lock()
 {
   _mutex.lock();
index 4b080d57e371b7f0edeade2b3ca81a8a2828c3fe..f3a0ccb217bc773e54d451e9b74b20c2df6c1ae7 100644 (file)
@@ -61,6 +61,8 @@ namespace YACS
       void lock();
       //! For thread safety for concurrent load operation on same Container.
       void unLock();
+    public:
+      std::vector<std::string> getKernelContainerNames() const;
     private:
       ~SalomeHPContainerVectOfHelper() { }
       void checkNoCurrentWork() const;
index 59ce1a3d04e25f57c71f55607ce95014e601d849..5c1d6df20d72fa4839c9227fd2d149167e7c08b4 100644 (file)
   Py_DECREF(pyapi);
 %}
 
+%{
+static PyObject *convertContainer2(YACS::ENGINE::Container *cont, int owner=0)
+{
+  if(!cont)
+    return SWIG_NewPointerObj((void*)cont,SWIGTYPE_p_YACS__ENGINE__Container, owner);
+  if(dynamic_cast<YACS::ENGINE::SalomeHPContainer *>(cont))
+    {
+      return SWIG_NewPointerObj((void*)dynamic_cast<YACS::ENGINE::SalomeHPContainer *>(cont),SWIGTYPE_p_YACS__ENGINE__SalomeHPContainer, owner);
+    }
+  if(dynamic_cast<YACS::ENGINE::SalomeContainer *>(cont))
+    {
+      return SWIG_NewPointerObj((void*)dynamic_cast<YACS::ENGINE::SalomeContainer *>(cont),SWIGTYPE_p_YACS__ENGINE__SalomeContainer, owner);
+    }
+  return SWIG_NewPointerObj((void*)cont,SWIGTYPE_p_YACS__ENGINE__Container, owner);
+}
+%}
+
 // ----------------------------------------------------------------------------
 
 #ifdef SWIGPYTHON
@@ -211,3 +228,12 @@ namespace YACS
 %rename(OptimizerAlgSync) YACS::ENGINE::PyOptimizerAlgBase;
 %rename(OptimizerAlgASync) YACS::ENGINE::PyOptimizerAlgASync;
 %include "PyOptimizerAlg.hxx"
+
+%extend YACS::ENGINE::RuntimeSALOME
+{
+  PyObject *createContainer(const std::string& kind="")
+  {
+    YACS::ENGINE::Container *ret(self->createContainer(kind));
+    return convertContainer2(ret);
+  }
+}
index 1f130f4326ed5969a5a1a155ae497767bf02b237..ec10ee4e25da764168854faf83c63105ee84ccb1 100644 (file)
@@ -287,6 +287,74 @@ class TestHPDecortator(unittest.TestCase):
         exe.RunW(p,0)
         assert(p.getState()==pilot.DONE)
         pass
+
+    def test3(self):
+        """ First test coming from the big boss."""
+        SALOMERuntime.RuntimeSALOME.setRuntime()
+        r=SALOMERuntime.getSALOMERuntime()
+        pg=pilot.PlayGround()
+        pg.loadFromKernelCatalog()
+        assert(len(pg.getData())!=0)
+        p=r.createProc("p0")
+        td=p.createType("double","double")
+        tdd=p.createSequenceTc("seqdouble","seqdouble",td)
+        hp1=r.createContainer("HPSalome") ; hp1.setName("HP1")
+        #
+        n0=r.createScriptNode("Salome","n0")
+        n0.setExecutionMode("local")
+        out0_0=n0.edAddOutputPort("o1",tdd)
+        n0.setScript("""o1=[float(i)+0.1 for i in range(1000)]""")
+        p.edAddChild(n0)
+        #
+        n1_0=r.createForEachLoop("n1_0",td)
+        n2_0=r.createForEachLoop("n2_0",td)
+        p.edAddChild(n1_0)
+        p.edAddChild(n2_0)
+        p.edAddCFLink(n0,n1_0)
+        p.edAddCFLink(n1_0,n2_0)
+        p.edAddLink(out0_0,n1_0.edGetSeqOfSamplesPort())
+        p.edAddLink(out0_0,n2_0.edGetSeqOfSamplesPort())
+        ##
+        n1_0_sc=r.createScriptNode("Salome","n1_0_sc")
+        n1_0.edAddChild(n1_0_sc)
+        n1_0_sc.setExecutionMode("remote")
+        n1_0_sc.setScript("""2*i1""")
+        i1_0_sc=n1_0_sc.edAddInputPort("i1",td)
+        p.edAddLink(n1_0.edGetSamplePort(),i1_0_sc)
+        n1_0_sc.setContainer(hp1)
+        ##
+        n2_0_sc=r.createScriptNode("Salome","n2_0_sc")
+        n2_0.edAddChild(n2_0_sc)
+        n2_0_sc.setExecutionMode("remote")
+        n2_0_sc.setScript("""2*i1""")
+        i2_0_sc=n2_0_sc.edAddInputPort("i1",td)
+        p.edAddLink(n2_0.edGetSamplePort(),i2_0_sc)
+        n2_0_sc.setContainer(hp1)
+        ##
+        hp1.setProperty("nb_proc_per_node","1")
+        pg.setData([("localhost",3)])
+        p.fitToPlayGround(pg)########### ZE CALL
+        assert(hp1.getSizeOfPool()==3)
+        fyto=pilot.ForTestOmlyHPContCls()
+        n1_0_sc.getContainer().forYourTestsOnly(fyto)
+        assert(fyto.getContainerType()=="HPContainerShared")
+        pd=fyto.getPD()
+        assert(isinstance(pd,pilot.AllPartDefinition))
+        assert(fyto.getIDS()==(0,1,2))
+        fyto=pilot.ForTestOmlyHPContCls()
+        n2_0_sc.getContainer().forYourTestsOnly(fyto)
+        assert(fyto.getContainerType()=="HPContainerShared")
+        pd=fyto.getPD()
+        assert(isinstance(pd,pilot.AllPartDefinition))
+        assert(fyto.getIDS()==(0,1,2))
+        assert(n1_0.edGetNbOfBranchesPort().getPyObj()==3)
+        assert(n2_0.edGetNbOfBranchesPort().getPyObj()==3)
+        #
+        exe=pilot.ExecutorSwig()
+        assert(p.getState()==pilot.READY)
+        exe.RunW(p,0)
+        assert(len(set(hp1.getKernelContainerNames()))==3)
+        pass
     
     pass