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">\▸\ </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">\▸\ </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; }