Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package Ipopt for openSUSE:Factory checked 
in at 2021-07-05 22:22:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/Ipopt (Old)
 and      /work/SRC/openSUSE:Factory/.Ipopt.new.2625 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "Ipopt"

Mon Jul  5 22:22:48 2021 rev:7 rq:903975 version:3.14.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/Ipopt/Ipopt.changes      2021-06-21 
20:36:00.598648635 +0200
+++ /work/SRC/openSUSE:Factory/.Ipopt.new.2625/Ipopt.changes    2021-07-05 
22:23:09.113642128 +0200
@@ -1,0 +2,15 @@
+Wed Jun 30 19:47:27 UTC 2021 - Atri Bhattacharya <badshah...@gmail.com>
+
+- Update to version 3.14.1:
+  * Added OptionsList::SetBoolValue() and
+    OptionsList::SetBoolValueIfUnset() [gh#coin-or/Ipopt#492].
+  * Skip check for and link against libdl if linear solver loader
+    is disabled.
+  * Fixed missing initialization of
+    BacktrackingLineSearch::in_watchdog_.
+  * Fixed a problem with the current solution not being reset when
+    initialization of a NLP fails in reoptimization.
+  * Fixed that C++11 capability was not correctly identified with
+    MS/Intel compilers.
+
+-------------------------------------------------------------------

Old:
----
  Ipopt-3.14.0.tar.gz

New:
----
  Ipopt-3.14.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ Ipopt.spec ++++++
--- /var/tmp/diff_new_pack.wcsV6l/_old  2021-07-05 22:23:09.593638414 +0200
+++ /var/tmp/diff_new_pack.wcsV6l/_new  2021-07-05 22:23:09.597638383 +0200
@@ -18,7 +18,7 @@
 
 %define shlib libipopt0
 Name:           Ipopt
-Version:        3.14.0
+Version:        3.14.1
 Release:        0
 Summary:        A software package for large-scale nonlinear optimization 
methods
 License:        EPL-2.0

++++++ Ipopt-3.14.0.tar.gz -> Ipopt-3.14.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/ChangeLog.md 
new/Ipopt-releases-3.14.1/ChangeLog.md
--- old/Ipopt-releases-3.14.0/ChangeLog.md      2021-06-15 17:59:44.000000000 
+0200
+++ new/Ipopt-releases-3.14.1/ChangeLog.md      2021-06-25 11:22:34.000000000 
+0200
@@ -7,6 +7,16 @@
 
 ## 3.14
 
+### 3.14.1 (2021-06-25)
+
+- Fixed invalidation of cached Hessians when reoptimizing with same structure.
+- Added `OptionsList::SetBoolValue()` and 
`OptionsList::SetBoolValueIfUnset()`. [#492]
+- Skip check for and link against libdl if linear solver loader is disabled.
+- Fixed missing initialization of `BacktrackingLineSearch::in_watchdog_`.
+- Fixed a problem with the current solution not being reset when
+  initialization of a NLP fails in reoptimization.
+- Fixed that C++11 capability was not correctly identified with MS/Intel 
compilers.
+
 ### 3.14.0 (2021-06-15)
 
 #### Data Types
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/Makefile.am 
new/Ipopt-releases-3.14.1/Makefile.am
--- old/Ipopt-releases-3.14.0/Makefile.am       2021-06-15 17:59:44.000000000 
+0200
+++ new/Ipopt-releases-3.14.1/Makefile.am       2021-06-25 11:22:34.000000000 
+0200
@@ -19,6 +19,7 @@
 
 doc :
        cd doc && doxygen
+       sed -i -e 's@<p><a class="anchor" id="OPT_\(.*\)"></a>@<p><a 
class="anchor" id="OPT_\1"></a><a href="#OPT_\1">\&#x25B8;\&nbsp;</a>@g' 
doc/html/OPTIONS.html
 
 if BUILD_JAVA
 javadoc :
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/Makefile.in 
new/Ipopt-releases-3.14.1/Makefile.in
--- old/Ipopt-releases-3.14.0/Makefile.in       2021-06-15 17:59:44.000000000 
+0200
+++ new/Ipopt-releases-3.14.1/Makefile.in       2021-06-25 11:22:34.000000000 
+0200
@@ -849,6 +849,7 @@
 
 doc :
        cd doc && doxygen
+       sed -i -e 's@<p><a class="anchor" id="OPT_\(.*\)"></a>@<p><a 
class="anchor" id="OPT_\1"></a><a href="#OPT_\1">\&#x25B8;\&nbsp;</a>@g' 
doc/html/OPTIONS.html
 
 @BUILD_JAVA_TRUE@javadoc :
 @BUILD_JAVA_TRUE@      $(JAVADOC) -d javadoc -windowtitle "JIpopt API 
documentation" $(srcdir)/src/Interfaces/Ipopt.java
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/configure 
new/Ipopt-releases-3.14.1/configure
--- old/Ipopt-releases-3.14.0/configure 2021-06-15 17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/configure 2021-06-25 11:22:34.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for Ipopt 3.14.0.
+# Generated by GNU Autoconf 2.71 for Ipopt 3.14.1.
 #
 # Report bugs to <https://github.com/coin-or/Ipopt/issues/new>.
 #
@@ -627,8 +627,8 @@
 # Identity of this package.
 PACKAGE_NAME='Ipopt'
 PACKAGE_TARNAME='ipopt'
-PACKAGE_VERSION='3.14.0'
-PACKAGE_STRING='Ipopt 3.14.0'
+PACKAGE_VERSION='3.14.1'
+PACKAGE_STRING='Ipopt 3.14.1'
 PACKAGE_BUGREPORT='https://github.com/coin-or/Ipopt/issues/new'
 PACKAGE_URL='https://github.com/coin-or/Ipopt'
 
@@ -1494,7 +1494,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Ipopt 3.14.0 to adapt to many kinds of systems.
+\`configure' configures Ipopt 3.14.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1565,7 +1565,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Ipopt 3.14.0:";;
+     short | recursive ) echo "Configuration of Ipopt 3.14.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1760,7 +1760,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Ipopt configure 3.14.0
+Ipopt configure 3.14.1
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2645,7 +2645,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Ipopt $as_me 3.14.0, which was
+It was created by Ipopt $as_me 3.14.1, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3752,7 +3752,7 @@
       : ${FFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FFLAGS"}
       : ${FCFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FCFLAGS"}
       : ${CFLAGS:="-nologo -Z7 -MDd $ADD_CFLAGS"}
-      : ${CXXFLAGS:="-nologo -EHs -Z7 -MDd $ADD_CXXFLAGS"}
+      : ${CXXFLAGS:="-nologo -EHs -Z7 -MDd -Zc:__cplusplus $ADD_CXXFLAGS"}
     else
       : ${FFLAGS:="-g $ADD_FFLAGS"}
       : ${FCFLAGS:="-g $ADD_FCFLAGS"}
@@ -3764,7 +3764,7 @@
       : ${FFLAGS:="-nologo -fpp -O2 -MD $ADD_FFLAGS"}
       : ${FCFLAGS:="-nologo -fpp -O2 -MD $ADD_FCFLAGS"}
       : ${CFLAGS:="-nologo -DNDEBUG -O2 -MD $ADD_CFLAGS"}
-      : ${CXXFLAGS:="-nologo -EHs -DNDEBUG -O2 -MD $ADD_CXXFLAGS"}
+      : ${CXXFLAGS:="-nologo -EHs -DNDEBUG -O2 -MD -Zc:__cplusplus 
$ADD_CXXFLAGS"}
     else
       : ${FFLAGS:="-O2 $ADD_FFLAGS"}
       : ${FCFLAGS:="-O2 $ADD_FCFLAGS"}
@@ -4266,7 +4266,7 @@
 
 
 
-printf "%s\n" "#define IPOPT_VERSION \"3.14.0\"" >>confdefs.h
+printf "%s\n" "#define IPOPT_VERSION \"3.14.1\"" >>confdefs.h
 
 
 printf "%s\n" "#define IPOPT_VERSION_MAJOR 3" >>confdefs.h
@@ -4275,7 +4275,7 @@
 printf "%s\n" "#define IPOPT_VERSION_MINOR 14" >>confdefs.h
 
 
-printf "%s\n" "#define IPOPT_VERSION_RELEASE 0" >>confdefs.h
+printf "%s\n" "#define IPOPT_VERSION_RELEASE 1" >>confdefs.h
 
 
 
@@ -4386,7 +4386,7 @@
 
 # Define the identity of the package.
  PACKAGE='ipopt'
- VERSION='3.14.0'
+ VERSION='3.14.1'
 
 
 # Some tools Automake needs.
@@ -22135,9 +22135,9 @@
 
 
 
-  LT_LDFLAGS="$LT_LDFLAGS -version-number 3:14:0"
-       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: libtool version info: 
-version-number 3:14:0" >&5
-printf "%s\n" "$as_me: libtool version info: -version-number 3:14:0" >&6;}
+  LT_LDFLAGS="$LT_LDFLAGS -version-number 3:14:1"
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: libtool version info: 
-version-number 3:14:1" >&5
+printf "%s\n" "$as_me: libtool version info: -version-number 3:14:1" >&6;}
 
 
   LT_LDFLAGS="$LT_LDFLAGS -no-undefined"
@@ -26701,23 +26701,14 @@
 
 printf "%s\n" "#define IPOPT_HAS_LINEARSOLVERLOADER 1" >>confdefs.h
 
-fi
 
-ac_ext=c
+  ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext 
$LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" 
"$ac_includes_default"
-if test "x$ac_cv_header_windows_h" = xyes
-then :
-
-printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h
-
-fi
-
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" 
>&5
 printf %s "checking for dlopen in -ldl... " >&6; }
 if test ${ac_cv_lib_dl_dlopen+y}
 then :
@@ -26765,12 +26756,22 @@
   IPOPTLIB_LFLAGS="$IPOPTLIB_LFLAGS -ldl"
 fi
 
-ac_ext=c
+  ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext 
$LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" 
"$ac_includes_default"
+if test "x$ac_cv_header_windows_h" = xyes
+then :
+
+printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h
+
+fi
+
 
 ########################################################################
 ##                             sIpopt                                 ##
@@ -27974,7 +27975,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Ipopt $as_me 3.14.0, which was
+This file was extended by Ipopt $as_me 3.14.1, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28047,7 +28048,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-Ipopt config.status 3.14.0
+Ipopt config.status 3.14.1
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/configure.ac 
new/Ipopt-releases-3.14.1/configure.ac
--- old/Ipopt-releases-3.14.0/configure.ac      2021-06-15 17:59:44.000000000 
+0200
+++ new/Ipopt-releases-3.14.1/configure.ac      2021-06-25 11:22:34.000000000 
+0200
@@ -8,7 +8,7 @@
 #                       Names and other basic things                        #
 #############################################################################
 
-AC_INIT([Ipopt],[3.14.0],[https://github.com/coin-or/Ipopt/issues/new],[],[https://github.com/coin-or/Ipopt])
+AC_INIT([Ipopt],[3.14.1],[https://github.com/coin-or/Ipopt/issues/new],[],[https://github.com/coin-or/Ipopt])
 
 AC_COPYRIGHT([
 Copyright 2004, 2011 International Business Machines and others.
@@ -430,12 +430,13 @@
 if test $use_linearsolverloader = yes; then
   AC_DEFINE([IPOPT_HAS_LINEARSOLVERLOADER],[1],
             [Define to 1 if the linear solver loader should be used to load 
libraries with linear solvers at runtime])
+
+  AC_LANG_PUSH(C)
+  AC_CHECK_LIB(dl,[dlopen],[IPOPTLIB_LFLAGS="$IPOPTLIB_LFLAGS -ldl"],[])
+  AC_LANG_POP(C)
 fi
 
-AC_LANG_PUSH(C)
 AC_CHECK_HEADER([windows.h],AC_DEFINE(HAVE_WINDOWS_H,[1],[Define to 1 if 
windows.h is available.]))
-AC_CHECK_LIB(dl,[dlopen],[IPOPTLIB_LFLAGS="$IPOPTLIB_LFLAGS -ldl"],[])
-AC_LANG_POP(C)
 
 ########################################################################
 ##                             sIpopt                                 ##
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Algorithm/IpBacktrackingLineSearch.cpp 
new/Ipopt-releases-3.14.1/src/Algorithm/IpBacktrackingLineSearch.cpp
--- old/Ipopt-releases-3.14.0/src/Algorithm/IpBacktrackingLineSearch.cpp        
2021-06-15 17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Algorithm/IpBacktrackingLineSearch.cpp        
2021-06-25 11:22:34.000000000 +0200
@@ -28,6 +28,7 @@
    const SmartPtr<ConvergenceCheck>&       conv_check
 )
    : LineSearch(),
+     in_watchdog_(false),
      acceptor_(acceptor),
      resto_phase_(resto_phase),
      conv_check_(conv_check)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/src/Algorithm/IpIpoptData.cpp 
new/Ipopt-releases-3.14.1/src/Algorithm/IpIpoptData.cpp
--- old/Ipopt-releases-3.14.0/src/Algorithm/IpIpoptData.cpp     2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Algorithm/IpIpoptData.cpp     2021-06-25 
11:22:34.000000000 +0200
@@ -124,6 +124,11 @@
    SmartPtr<Vector> new_v_L;
    SmartPtr<Vector> new_v_U;
 
+   // clear curr_ from previous optimize, if any, in case 
ip_nlp.InitializeStructures() fails,
+   // e.g., because OrigIpoptNLP throws a too-few-degrees-of-freedom exception
+   curr_ = NULL;
+   iterates_space_ = NULL;
+
    // Get the required linear algebra structures from the model
    bool retValue = ip_nlp.InitializeStructures(new_x, want_x, new_y_c, 
want_y_c, new_y_d, want_y_d, new_z_L, want_z_L,
                    new_z_U, want_z_U, new_v_L, new_v_U);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Algorithm/IpOrigIpoptNLP.cpp 
new/Ipopt-releases-3.14.1/src/Algorithm/IpOrigIpoptNLP.cpp
--- old/Ipopt-releases-3.14.0/src/Algorithm/IpOrigIpoptNLP.cpp  2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Algorithm/IpOrigIpoptNLP.cpp  2021-06-25 
11:22:34.000000000 +0200
@@ -188,6 +188,7 @@
    d_cache_.InvalidateResult(deps, sdeps);
    jac_c_cache_.InvalidateResult(deps, sdeps);
    jac_d_cache_.InvalidateResult(deps, sdeps);
+   deps.resize(3, NULL);
    h_cache_.InvalidateResult(deps, sdeps);
 
    if( !nlp_->ProcessOptions(options, prefix) )
@@ -287,7 +288,7 @@
       NLP_scaling()->DetermineScaling(x_space_, c_space_, d_space_, 
jac_c_space_, jac_d_space_, h_space_,
                                       scaled_jac_c_space_, 
scaled_jac_d_space_, scaled_h_space_, *Px_L, *x_L, *Px_U, *x_U);
 
-      if( x_space_->Dim() < c_space_->Dim() )
+      if( x_space_->Dim() < c_space_->Dim() && x_space_->Dim() > 0 )
       {
          char msg[128];
          Snprintf(msg, 127, "Too few degrees of freedom: %" IPOPT_INDEX_FORMAT 
" equality constraints but only %" IPOPT_INDEX_FORMAT " variables",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Algorithm/IpRestoMinC_1Nrm.cpp 
new/Ipopt-releases-3.14.1/src/Algorithm/IpRestoMinC_1Nrm.cpp
--- old/Ipopt-releases-3.14.0/src/Algorithm/IpRestoMinC_1Nrm.cpp        
2021-06-15 17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Algorithm/IpRestoMinC_1Nrm.cpp        
2021-06-25 11:22:34.000000000 +0200
@@ -324,10 +324,18 @@
       // Use requested stop during restoration phase - rethrow exception
       THROW_EXCEPTION(RESTORATION_USER_STOP, "User requested stop during 
restoration phase");
    }
+   else if( resto_status == INVALID_NUMBER_DETECTED )
+   {
+      // this could be that we got stuck at a point that can be evaluated, but 
not differentiated
+      Jnlst().Printf(J_STRONGWARNING, J_LINE_SEARCH,
+                     "Restoration phase failed due to evaluation errors.\n");
+      retval = 1;
+   }
    else
    {
-      Jnlst().Printf(J_ERROR, J_MAIN,
-                     "Sorry, things failed ?!?!\n");
+      // often this
+      Jnlst().Printf(J_STRONGWARNING, J_LINE_SEARCH,
+                     "Restoration phase failed with unexpected solverreturn 
status %d\n", (int)resto_status);
       retval = 1;
    }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Apps/AmplSolver/AmplTNLP.cpp 
new/Ipopt-releases-3.14.1/src/Apps/AmplSolver/AmplTNLP.cpp
--- old/Ipopt-releases-3.14.0/src/Apps/AmplSolver/AmplTNLP.cpp  2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Apps/AmplSolver/AmplTNLP.cpp  2021-06-25 
11:22:34.000000000 +0200
@@ -1715,7 +1715,7 @@
       Index n = (Index) suffix_ids_.size();
       for( Index i = 0; i < n; i++ )
       {
-         delete[] suftab_[i].name;
+         free(suftab_[i].name);
          suftab_[i].name = NULL;
       }
    }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/src/Common/IpCachedResults.hpp 
new/Ipopt-releases-3.14.1/src/Common/IpCachedResults.hpp
--- old/Ipopt-releases-3.14.0/src/Common/IpCachedResults.hpp    2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Common/IpCachedResults.hpp    2021-06-25 
11:22:34.000000000 +0200
@@ -884,7 +884,7 @@
          DBG_PRINT((2, "Current set of cached results:\n"));
          for (iter = cached_results_->begin(); iter != cached_results_->end(); 
++iter)
          {
-            DBG_PRINT((2, "  DependentResult: %p\n", (*iter)));
+            DBG_PRINT((2, "  DependentResult: %p\n", (void*)*iter));
          }
       }
    }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/src/Common/IpLibraryLoader.cpp 
new/Ipopt-releases-3.14.1/src/Common/IpLibraryLoader.cpp
--- old/Ipopt-releases-3.14.0/src/Common/IpLibraryLoader.cpp    2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Common/IpLibraryLoader.cpp    2021-06-25 
11:22:34.000000000 +0200
@@ -17,6 +17,8 @@
 namespace Ipopt
 {
 
+#ifdef IPOPT_HAS_LINEARSOLVERLOADER
+
 #ifdef HAVE_WINDOWS_H
 // add description of last error on windows to string
 // see 
https://stackoverflow.com/questions/455434/how-should-i-use-formatmessage-properly-in-c
@@ -177,4 +179,33 @@
    return symbol;
 }
 
+#else // IPOPT_HAS_LINEARSOLVERLOADER
+
+void LibraryLoader::loadLibrary()
+{
+   THROW_EXCEPTION(DYNAMIC_LIBRARY_FAILURE, "Cannot load library at runtime. 
Ipopt has been build with --disable-linear-solver-loader.");
+}
+
+void LibraryLoader::unloadLibrary()
+{
+   if( libhandle == NULL )
+   {
+      return;
+   }
+
+   THROW_EXCEPTION(DYNAMIC_LIBRARY_FAILURE, "Cannot load library at runtime. 
Ipopt has been build with --disable-linear-solver-loader");
+}
+
+/** tries to load symbol from a loaded library */
+void* LibraryLoader::loadSymbol(
+   const std::string&
+)
+{
+   THROW_EXCEPTION(DYNAMIC_LIBRARY_FAILURE, "Cannot load library at runtime. 
Ipopt has been build with --disable-linear-solver-loader");
+
+   return NULL;
+}
+
+#endif // !IPOPT_HAS_LINEARSOLVERLOADER
+
 } // namespace Ipopt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/src/Common/IpObserver.hpp 
new/Ipopt-releases-3.14.1/src/Common/IpObserver.hpp
--- old/Ipopt-releases-3.14.0/src/Common/IpObserver.hpp 2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Common/IpObserver.hpp 2021-06-25 
11:22:34.000000000 +0200
@@ -235,7 +235,7 @@
    {
       for( size_t i = 0; i < subjects_.size(); ++i )
       {
-         DBG_PRINT((1, "subjects_[%zd] = %p\n", i, subjects_[i]));
+         DBG_PRINT((1, "subjects_[%zd] = %p\n", i, (const void*)subjects_[i]));
       }
    }
 #endif
@@ -243,7 +243,7 @@
    for( size_t i = subjects_.size(); i > 0; --i )
    {
 #ifdef IP_DEBUG_OBSERVER
-      DBG_PRINT((1, "About to detach subjects_[%zd] = %p\n", i, subjects_[i - 
1]));
+      DBG_PRINT((1, "About to detach subjects_[%zd] = %p\n", i, (const 
void*)subjects_[i - 1]));
 #endif
 
       RequestDetach(NT_All, subjects_[i - 1]);
@@ -280,7 +280,7 @@
 {
 #ifdef IP_DEBUG_OBSERVER
    DBG_START_METH("Observer::RequestDetach", dbg_verbosity);
-   DBG_PRINT((1, "Requesting detach of subject: %p\n", subject));
+   DBG_PRINT((1, "Requesting detach of subject: %p\n", (const void*)subject));
    DBG_ASSERT(subject);
 #endif
 
@@ -296,7 +296,7 @@
       if( attached_subject != subjects_.end() )
       {
 #ifdef IP_DEBUG_OBSERVER
-         DBG_PRINT((1, "Removing subject: %p from the list\n", subject));
+         DBG_PRINT((1, "Removing subject: %p from the list\n", (const 
void*)subject));
 #endif
 
          subjects_.erase(attached_subject);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/src/Common/IpOptionsList.hpp 
new/Ipopt-releases-3.14.1/src/Common/IpOptionsList.hpp
--- old/Ipopt-releases-3.14.0/src/Common/IpOptionsList.hpp      2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Common/IpOptionsList.hpp      2021-06-25 
11:22:34.000000000 +0200
@@ -228,10 +228,20 @@
       bool               allow_clobber = true,
       bool               dont_print = false
    );
+
+   /// @since 3.14.1
+   virtual bool SetBoolValue(
+      const std::string& tag,
+      bool               value,
+      bool               allow_clobber = true,
+      bool               dont_print = false
+   )
+   {
+      return SetStringValue(tag, value ? "yes" : "no", allow_clobber, 
dont_print);
+   }
    ///@}
 
-   /** @name Methods for setting options only if they have not been
-    *  set before*/
+   /** @name Methods for setting options only if they have not been set before 
*/
    ///@{
    virtual bool SetStringValueIfUnset(
       const std::string& tag,
@@ -253,10 +263,22 @@
       bool               allow_clobber = true,
       bool               dont_print = false
    );
+
+   /// @since 3.14.1
+   virtual bool SetBoolValueIfUnset(
+      const std::string& tag,
+      bool               value,
+      bool               allow_clobber = true,
+      bool               dont_print = false
+   )
+   {
+      return SetStringValueIfUnset(tag, value ? "yes" : "no", allow_clobber, 
dont_print);
+   }
    ///@}
 
-   /** @name Methods for retrieving values from the options list.  If
-    *  a tag is not found, the methods return false, and value is set
+   /** @name Methods for retrieving values from the options list.
+    *
+    *  If a tag is not found, the methods return false, and value is set
     *  to the default value defined in the registered options. */
    ///@{
    virtual bool GetStringValue(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Common/config_ipopt_default.h 
new/Ipopt-releases-3.14.1/src/Common/config_ipopt_default.h
--- old/Ipopt-releases-3.14.0/src/Common/config_ipopt_default.h 2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Common/config_ipopt_default.h 2021-06-25 
11:22:34.000000000 +0200
@@ -5,7 +5,7 @@
 /***************************************************************************/
 
 /* Version number of project */
-#define IPOPT_VERSION "3.14.0"
+#define IPOPT_VERSION "3.14.1"
 
 /* Major Version number of project */
 #define IPOPT_VERSION_MAJOR 3
@@ -14,7 +14,7 @@
 #define IPOPT_VERSION_MINOR 14
 
 /* Release Version number of project */
-#define IPOPT_VERSION_RELEASE 0
+#define IPOPT_VERSION_RELEASE 1
 
 /* Define to the C type corresponding to Fortran INTEGER
  * @deprecated Use ipindex instead.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Ipopt-releases-3.14.0/src/Interfaces/IpTNLPAdapter.cpp 
new/Ipopt-releases-3.14.1/src/Interfaces/IpTNLPAdapter.cpp
--- old/Ipopt-releases-3.14.0/src/Interfaces/IpTNLPAdapter.cpp  2021-06-15 
17:59:44.000000000 +0200
+++ new/Ipopt-releases-3.14.1/src/Interfaces/IpTNLPAdapter.cpp  2021-06-25 
11:22:34.000000000 +0200
@@ -450,7 +450,7 @@
 
       bool done = false;
       // We might have to do the following twice: If we detect that we
-      // don't have enought degrees of freedom, we simply redo
+      // don't have enough degrees of freedom, we simply redo
       // everything with fixed_variable_treatment to set RELAX_BOUNDS
       while( !done )
       {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Ipopt-releases-3.14.0/test/emptynlp.cpp 
new/Ipopt-releases-3.14.1/test/emptynlp.cpp
--- old/Ipopt-releases-3.14.0/test/emptynlp.cpp 2021-06-15 17:59:44.000000000 
+0200
+++ new/Ipopt-releases-3.14.1/test/emptynlp.cpp 2021-06-25 11:22:34.000000000 
+0200
@@ -287,7 +287,7 @@
    }
 };
 
-bool run(
+bool runEmpty(
    int  nvars,
    bool infeascons,
    bool infeasbounds
@@ -337,32 +337,392 @@
    return true;
 }
 
+/** Mostly empty NLP to test reoptimization with Ipopt
+ *
+ * min sum_i x_i
+ * s.t. 0 <= x
+ *      x_i <= 0   for i <= nfixed
+ *      sum_i x_i = rhs
+ *      x_1 = 0    (as constraint)
+ */
+class ReOptNLP: public TNLP
+{
+private:
+   Number rhs;
+public:
+   int nvars;
+   int nfixed;
+
+   /** constructor */
+   ReOptNLP(
+      Number rhs_ = 0.0
+   )
+      : rhs(rhs_),
+        nvars(2),
+        nfixed(0)
+   { }
+
+   /** Method to return some info about the nlp */
+   bool get_nlp_info(
+      Index&          n,
+      Index&          m,
+      Index&          nnz_jac_g,
+      Index&          nnz_h_lag,
+      IndexStyleEnum& index_style
+   )
+   {
+      n = nvars;
+      m = 2;
+      nnz_jac_g = n + 1;
+      nnz_h_lag = 0;
+      index_style = C_STYLE;
+
+      return true;
+   }
+
+   /** Method to return the bounds for my problem */
+   bool get_bounds_info(
+      Index   n,
+      Number* x_l,
+      Number* x_u,
+      Index   m,
+      Number* g_l,
+      Number* g_u
+   )
+   {
+      for( Index i = 0; i < n; ++i )
+      {
+         x_l[i] = 0.0;
+         x_u[i] = i < nfixed ? 0.0 : 1.0;
+      }
+
+      assert(m == 2);
+      g_l[0] = rhs;
+      g_u[0] = rhs;
+
+      g_l[1] = 0.0;
+      g_u[1] = 0.0;
+
+      return true;
+   }
+
+   /** Method to return the starting point for the algorithm */
+   bool get_starting_point(
+      Index   n,
+      bool    init_x,
+      Number* x,
+      bool    init_z,
+      Number*,
+      Number*,
+      Index,
+      bool    init_lambda,
+      Number*
+   )
+   {
+      if( init_x )
+         for( Index i = 0; i < n; ++i )
+         {
+            x[i] = 10.0;
+         }
+
+      assert(!init_z);
+      assert(!init_lambda);
+
+      return true;
+   }
+
+   /** Method to return the objective value */
+   bool eval_f(
+      Index         n,
+      const Number* x,
+      bool,
+      Number&       obj_value
+   )
+   {
+      obj_value = 0.0;
+      for( Index i = 0; i < n; ++i )
+      {
+         obj_value += x[i];
+      }
+
+      return true;
+   }
+
+   /** Method to return the gradient of the objective */
+   bool eval_grad_f(
+      Index         n,
+      const Number*,
+      bool,
+      Number*       grad_f
+   )
+   {
+      for( Index i = 0; i < n; ++i )
+      {
+         grad_f[i] = 1.0;
+      }
+
+      return true;
+   }
+
+   /** Method to return the constraint residuals */
+   bool eval_g(
+      Index         n,
+      const Number* x,
+      bool,
+      Index         m,
+      Number*       g
+   )
+   {
+      assert(m == 2);
+
+      g[0] = 0.0;
+      for( Index i = 0; i < n; ++i )
+      {
+         g[0] += x[i];
+      }
+
+      g[1] = x[0];
+
+      return true;
+   }
+
+   /** Method to return:
+    *   1) The structure of the Jacobian (if "values" is NULL)
+    *   2) The values of the Jacobian (if "values" is not NULL)
+    */
+   bool eval_jac_g(
+      Index         n,
+      const Number*,
+      bool,
+      Index,
+      Index         nele_jac,
+      Index*        iRow,
+      Index*        jCol,
+      Number*       values
+   )
+   {
+      assert((iRow != NULL) == (jCol != NULL));
+      assert((iRow != NULL) == (values == NULL));
+      assert(nele_jac == n + 1);
+
+      if( iRow != NULL )
+      {
+         for( Index i = 0; i < n; ++i )
+         {
+            iRow[i] = 0;
+            jCol[i] = i;
+         }
+         iRow[n] = 1;
+         jCol[n] = 0;
+      }
+      else
+         for( Index i = 0; i < n + 1; ++i )
+         {
+            values[i] = 1.0;
+         }
+
+      return true;
+   }
+
+   /** Method to return:
+    *   1) The structure of the Hessian of the Lagrangian (if "values" is NULL)
+    *   2) The values of the Hessian of the Lagrangian (if "values" is not 
NULL)
+    */
+   bool eval_h(
+      Index,
+      const Number*,
+      bool,
+      Number,
+      Index,
+      const Number*,
+      bool,
+      Index,
+      Index*,
+      Index*,
+      Number*
+   )
+   {
+      return true;
+   }
+
+   /** This method is called when the algorithm is complete so the TNLP can 
store/write the solution */
+   void finalize_solution(
+      SolverReturn               status,
+      Index                      n,
+      const Number*              x,
+      const Number*              z_L,
+      const Number*              z_U,
+      Index                      m,
+      const Number*              g,
+      const Number*              lambda,
+      Number                     obj_value,
+      const IpoptData*,
+      IpoptCalculatedQuantities*
+   )
+   {
+      std::cout << "Finalize called" << std::endl;
+      std::cout << "x =";
+      for( Index i = 0; i < n; ++i )
+      {
+         std::cout << ' ' << x[i];
+      }
+      std::cout << std::endl;
+      std::cout << "z_L =";
+      for( Index i = 0; i < n; ++i )
+      {
+         std::cout << ' ' << z_L[i];
+      }
+      std::cout << std::endl;
+      std::cout << "z_U =";
+      for( Index i = 0; i < n; ++i )
+      {
+         std::cout << ' ' << z_U[i];
+      }
+      std::cout << std::endl;
+      std::cout << "lambda =";
+      for( Index i = 0; i < m; ++i )
+      {
+         std::cout << ' ' << lambda[i];
+      }
+      std::cout << std::endl;
+
+      if( status == SUCCESS )
+      {
+         Number tol = 1e-5;
+         assert(std::abs(obj_value - rhs) < tol);
+
+         if( rhs == 0.0 )
+         {
+            for( Index i = 0; i < n; ++i )
+            {
+               assert(std::abs(x[i]) < tol);
+            }
+         }
+
+         assert(std::abs(g[0] - rhs) < tol);
+         assert(std::abs(g[1]) < tol);
+      }
+   }
+};
+
+bool runReOpt(
+   int nvars1,
+   int nvars2,
+   int nfixed,
+   Number rhs
+)
+{
+   std::cout << std::endl << "*** Solve with " << nvars1 << " variables and 
rhs=" << rhs << "." << std::endl;
+
+   SmartPtr<ReOptNLP> nlp = new ReOptNLP(rhs);
+   nlp->nvars = nvars1;
+   SmartPtr<IpoptApplication> app = new IpoptApplication();
+
+   ApplicationReturnStatus status;
+   status = app->Initialize();
+   if( status != Solve_Succeeded )
+   {
+      std::cout << std::endl << std::endl << "*** Error during 
initialization!" << std::endl;
+      return false;
+   }
+
+   status = app->OptimizeTNLP(GetRawPtr(nlp));
+
+   if( nvars1 < 2 )
+   {
+      assert(status == Not_Enough_Degrees_Of_Freedom);
+   }
+   else
+   {
+      assert((status == Solve_Succeeded) == (rhs <= 1));
+      assert((status == Infeasible_Problem_Detected) == (rhs > 1));
+   }
+
+   std::cout << std::endl << "*** Resolve with " << nvars2 << " variables, " 
<< nfixed << " variables fixed." << std::endl;
+
+   nlp->nvars = nvars2;
+   nlp->nfixed = nfixed;
+   status = app->ReOptimizeTNLP(GetRawPtr(nlp));
+
+   if( nvars2 < 2 && nfixed < nvars2 )
+   {
+      assert(status == Not_Enough_Degrees_Of_Freedom);
+   }
+   else
+   {
+      assert((status == Solve_Succeeded) == (rhs <= 1 && (rhs == 0.0 || nfixed 
< nvars2)));
+      assert((status == Infeasible_Problem_Detected) == (rhs > 1 || (rhs != 
0.0 && nfixed == nvars2)));
+   }
+
+   return true;
+}
+
+
 int main(
    int,
    char**
 )
 {
-   if( !run(0, false, false) )
+   if( !runEmpty(0, false, false) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   if( !runEmpty(5, false, false) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   if( !runEmpty(0, true, false) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   if( !runEmpty(5, true, false) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   if( !runEmpty(5, false, true) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   // 2 variables, fix them in resolve, 2 constraints
+   if( !runReOpt(2, 2, 2, 0.0) )
+   {
+      return EXIT_FAILURE;
+   }
+
+   if( !runReOpt(2, 2, 2, 1.0) )
    {
       return EXIT_FAILURE;
    }
 
-   if( !run(5, false, false) )
+   // 1 variable, do not fix in resolve, 2 constraints
+   // should give a too-few-degree-of-freedom in both solves
+   if( !runReOpt(1, 1, 0, 0.0) )
    {
       return EXIT_FAILURE;
    }
 
-   if( !run(0, true, false) )
+   // 2 variables, then 1 variable, do not fix in resolve
+   // should give a too-few-degree-of-freedom for second solve  (this case had 
a bug)
+   if( !runReOpt(2, 1, 0, 0.0) )
    {
       return EXIT_FAILURE;
    }
 
-   if( !run(5, true, false) )
+   // 2 variables, then 1 variable, but fixed in resolve
+   // should not give a too-few-degree-of-freedom, but feasible
+   if( !runReOpt(2, 1, 1, 0.0) )
    {
       return EXIT_FAILURE;
    }
 
-   if( !run(5, false, true) )
+   // 2 variables, then 1 variable, but fixed in resolve
+   // should not give a too-few-degree-of-freedom, but infeasible
+   if( !runReOpt(2, 1, 1, 1.0) )
    {
       return EXIT_FAILURE;
    }

Reply via email to