Как скопировать модель SoPlex? - PullRequest
2 голосов
/ 01 апреля 2019

Я использую SoPlex, чтобы настроить lp и решить его.Затем я пытаюсь сделать копию оригинального lp и изменить ее.Мой код выглядит следующим образом:

int main()
{
   using namespase soplex;
   SoPlex spx;
   // add columns
   // add rows
   auto status = spx.optimize();

   SoPlex copy(spx);
   // modify some columns

   status = copy.optimize();

   return 0;
}

Когда я запускаю свой код в valgrind, я замечаю, что память, выделенная методами внутри конструктора копирования SoPlex, не освобождается.

Есть лиутечка памяти внутри SoPlex или я не правильно ее использую?

1 Ответ

1 голос
/ 02 апреля 2019

Вы используете функцию копирования правильно.В SoPlex действительно есть утечка памяти, которая будет исправлена ​​в следующей версии.

Тем временем вы можете попробовать применить этот патч для SoPlex-4.0.1:

diff --git a/src/soplex/slufactor.cpp b/src/soplex/slufactor.cpp
index ae41604..a3314d8 100644
--- a/src/soplex/slufactor.cpp
+++ b/src/soplex/slufactor.cpp
@@ -1230,8 +1230,6 @@ SLUFactor::SLUFactor(const SLUFactor& old)
    l.rperm     = 0;

    solveCount = 0;
-   solveTime = TimerFactory::createTimer(timerType);
-   factorTime = TimerFactory::createTimer(timerType);

    try
    {
@@ -1326,16 +1324,23 @@ void SLUFactor::freeAll()

    if(l.rperm)
       spx_free(l.rperm);
+
+   if(solveTime)
+   {
+      solveTime->~Timer();
+      spx_free(solveTime);
+   }
+
+   if(factorTime)
+   {
+      factorTime->~Timer();
+      spx_free(factorTime);
+   }
 }

 SLUFactor::~SLUFactor()
 {
    freeAll();
-
-   solveTime->~Timer();
-   factorTime->~Timer();
-   spx_free(solveTime);
-   spx_free(factorTime);
 }

 static Real betterThreshold(Real th)
diff --git a/src/soplex/spxbasis.cpp b/src/soplex/spxbasis.cpp
index 6370e89..40d201b 100644
--- a/src/soplex/spxbasis.cpp
+++ b/src/soplex/spxbasis.cpp
@@ -1363,6 +1363,7 @@ SPxBasis::~SPxBasis()
       factor = 0;
    }

+   theTime->~Timer();
    spx_free(theTime);
 }

...