From ca36ddf4116444a4ca298cd65c421b7d3be04a85 Mon Sep 17 00:00:00 2001 From: Ovidiu Mircescu Date: Mon, 29 Jul 2019 16:14:40 +0200 Subject: [PATCH] Fix issue when there are two optimizer loops. --- src/runtime/SalomeOptimizerLoop.cxx | 4 +- src/runtime/SalomeOptimizerLoop.hxx | 3 + src/yacsloader/Test/YacsLoaderTest.cxx | 7 +- .../samples/double_optimizer_py.xml | 104 ++++++++++++++++++ 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 src/yacsloader/samples/double_optimizer_py.xml diff --git a/src/runtime/SalomeOptimizerLoop.cxx b/src/runtime/SalomeOptimizerLoop.cxx index 0b347f2e9..6147386d4 100644 --- a/src/runtime/SalomeOptimizerLoop.cxx +++ b/src/runtime/SalomeOptimizerLoop.cxx @@ -69,6 +69,7 @@ SalomeOptimizerLoop::SalomeOptimizerLoop(const SalomeOptimizerLoop& other, Compo SalomeOptimizerLoop::~SalomeOptimizerLoop() { + Py_XDECREF(_pyAlgo); } Node *SalomeOptimizerLoop::simpleClone(ComposedNode *father, bool editionOnly) const @@ -147,10 +148,11 @@ void SalomeOptimizerLoop::loadAlgorithm() PyObject *next; } SwigPyObject; + PyObject * _pyAlgo = PyDict_GetItemString(globals, "algo"); + Py_XINCREF(_pyAlgo); SwigPyObject* pyalgo = (SwigPyObject*)PyDict_GetItemString(globals, "swigalgo"); _alg=(OptimizerAlgBase*)pyalgo->ptr; _alg->setPool(&_myPool); - _alg->incrRef(); } PyGILState_Release(gstate); } diff --git a/src/runtime/SalomeOptimizerLoop.hxx b/src/runtime/SalomeOptimizerLoop.hxx index 594352d38..e8d321a2a 100644 --- a/src/runtime/SalomeOptimizerLoop.hxx +++ b/src/runtime/SalomeOptimizerLoop.hxx @@ -22,6 +22,7 @@ #include "YACSRuntimeSALOMEExport.hxx" #include "OptimizerLoop.hxx" +#include namespace YACS { @@ -39,6 +40,8 @@ namespace YACS SalomeOptimizerLoop(const SalomeOptimizerLoop& other, ComposedNode *father, bool editionOnly); ~SalomeOptimizerLoop(); virtual std::string typeName() {return "YACS__ENGINE__SalomeOptimizerLoop";} + private: + PyObject * _pyAlgo = nullptr; }; } } diff --git a/src/yacsloader/Test/YacsLoaderTest.cxx b/src/yacsloader/Test/YacsLoaderTest.cxx index 9fe83e9c2..eca557c89 100644 --- a/src/yacsloader/Test/YacsLoaderTest.cxx +++ b/src/yacsloader/Test/YacsLoaderTest.cxx @@ -842,6 +842,11 @@ void YacsLoaderTest::optimizers() CPPUNIT_ASSERT(ret == 0); CPPUNIT_ASSERT(p->getEffectiveState() == YACS::DONE ); delete p; + + ret = driverTest(p, "samples/double_optimizer_py.xml"); + CPPUNIT_ASSERT(ret == 0); + CPPUNIT_ASSERT(p->getEffectiveState() == YACS::DONE ); + delete p; } void YacsLoaderTest::pyremotes() @@ -871,4 +876,4 @@ void YacsLoaderTest::nonepyobj() CPPUNIT_ASSERT(p->getEffectiveState() == YACS::DONE ); CPPUNIT_ASSERT_EQUAL(p->getOutputPort("n2.r")->getAsString(), std::string("True")); delete p; -} \ No newline at end of file +} diff --git a/src/yacsloader/samples/double_optimizer_py.xml b/src/yacsloader/samples/double_optimizer_py.xml new file mode 100644 index 000000000..1d2facf75 --- /dev/null +++ b/src/yacsloader/samples/double_optimizer_py.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + OptimizerLoop1 OutNode5 + DataIn3 OptimizerLoop1 + DataIn3 OptimizerLoop10 + + OptimizerLoop1 algoResults + OutNode5 i6 + + + OptimizerLoop1 evalSamples + OptimizerLoop1.PyScript7 i8 + + + DataIn3 o4 + OptimizerLoop1 algoInit + + + DataIn3 o4 + OptimizerLoop10 algoInit + + + OptimizerLoop10 evalSamples + OptimizerLoop10.PyScript7 i8 + + + OptimizerLoop1.PyScript7 o9 + OptimizerLoop1 evalResults + + + OptimizerLoop10.PyScript7 o9 + OptimizerLoop10 evalResults + + + OptimizerLoop1nbBranches + 1 + + + OptimizerLoop10nbBranches + 1 + + + + + + + + + -- 2.39.2