Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package Ipopt for openSUSE:Factory checked in at 2025-08-10 22:20:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/Ipopt (Old) and /work/SRC/openSUSE:Factory/.Ipopt.new.1085 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "Ipopt" Sun Aug 10 22:20:45 2025 rev:24 rq:1298607 version:3.14.19 Changes: -------- --- /work/SRC/openSUSE:Factory/Ipopt/Ipopt.changes 2025-05-03 21:02:07.173551546 +0200 +++ /work/SRC/openSUSE:Factory/.Ipopt.new.1085/Ipopt.changes 2025-08-10 22:20:49.051764347 +0200 @@ -1,0 +2,40 @@ +Mon Aug 4 14:47:33 UTC 2025 - Atri Bhattacharya <[email protected]> + +- Update to version 3.14.19: + * Only Windows specific changes. +- Changes from version 3.14.18: + - Restricted workaround for using Pardiso to Intel MKL 2025.0.x. + Intel MKL 2025.1.0 has the corresponding issue fixed + [gh#coin-or/Ipopt#799]. + - Fixed that Jipopt::finalize_solution did not store final + objective value correctly [gh#coin-or/Ipopt#820]. + - Instead, the value of the last iterate evaluation was + returned, which was often the same. + - Added IpoptApplication::Version() (C++ interface), + GetIpoptVersion (C interface), and Ipopt::GetVersion() (Java + interface) to retrieve version of Ipopt library + [gh#coin-or/Ipopt#824]. + - Fixed possible missing initialization of delta_x and delta_s + in PDPerturbationHandler in case ConsiderNewSystem failed + [gh#coin-or/Ipopt#834]. + - Undefine max if defined after include of windows.h in + IpUtils.cpp [gh#coin-or/Ipopt#834]. + - Added missing initialization of Filter Acceptor in case + restoration phase is called when the fallback mechanism of + BacktrackingLinearSearch has been activated + [gh#coin-or/Ipopt#834,gh#coin-or/Ipopt#837]. + - If this happened in the first iteration, it led to the use of + uninitialized values. + - Added missing return if symbolic factorization with MA57 + (ma57ad, ma57as) failed [gh#coin-or/Ipopt#834]. + - Fixed application of scaling when computing violations of + inequality constraints in TNLP::get_curr_violations(). Added + OrigIpoptNLP::d_space(). + - Fixed signature of call to MKL's Pardiso: the DPARM argument + does not exist in this version of Pardiso. +- Use %ldconfig_scriptlets macro instead of post(un) ldconfig + scripts. +- Install doc files as part of %install and run fdupes on them to + link up duplicated files. + +------------------------------------------------------------------- Old: ---- Ipopt-3.14.17.tar.gz New: ---- Ipopt-3.14.19.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ Ipopt.spec ++++++ --- /var/tmp/diff_new_pack.5o0zWg/_old 2025-08-10 22:20:49.679790428 +0200 +++ /var/tmp/diff_new_pack.5o0zWg/_new 2025-08-10 22:20:49.679790428 +0200 @@ -19,7 +19,7 @@ %define sover 3 %define shlib libipopt%{sover} Name: Ipopt -Version: 3.14.17 +Version: 3.14.19 Release: 0 Summary: A software package for large-scale nonlinear optimization methods License: EPL-2.0 @@ -99,24 +99,27 @@ rm %{buildroot}%{_docdir}/%{name}/${f} done +# Install doc files here so that duplicates can be cleaned up using %%fdupes +mkdir -p %{buildroot}%{_docdir}/%{name} +cp -r doc/html %{buildroot}%{_docdir}/%{name}/ + find %{buildroot} -type f -name "*.la" -delete -print -%fdupes %{buildroot}%{_datadir}/coin/doc +%fdupes %{buildroot}%{_docdir}/%{name}/ %check %make_build test -%post -n %{shlib} -p /sbin/ldconfig -%postun -n %{shlib} -p /sbin/ldconfig +%ldconfig_scriptlets -n %{shlib} %files -n %{shlib} %{_libdir}/*.so.%{sover}* %files devel %doc README.md AUTHORS ChangeLog.md -%doc doc/html +%doc %{_docdir}/%{name} %license LICENSE -%{_includedir}/* +%{_includedir}/coin-or/ %{_libdir}/*.so %{_libdir}/pkgconfig/ipopt.pc ++++++ Ipopt-3.14.17.tar.gz -> Ipopt-3.14.19.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/ChangeLog.md new/Ipopt-releases-3.14.19/ChangeLog.md --- old/Ipopt-releases-3.14.17/ChangeLog.md 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/ChangeLog.md 2025-07-30 11:38:01.000000000 +0200 @@ -7,6 +7,32 @@ ## 3.14 +### 3.14.19 (2025-07-30) + +- Fixed call to `getenv_s` on Windows, introduced with 3.14.17. + This invalid use of this call made the Pardiso interfaces unusable on Windows. + +### 3.14.18 (2025-07-28) + +- Restricted workaround for using Pardiso to Intel MKL 2025.0.x. + Intel MKL 2025.1.0 has the corresponding issue fixed. [#799] +- Fixed that Jipopt::finalize_solution did not store final objective value correctly + [#820, by Kevin Kofler]. Instead, the value of the last iterate evaluation was returned, + which was often the same. +- Added IpoptApplication::Version() (C++ interface), GetIpoptVersion (C interface), and + Ipopt::GetVersion() (Java interface) to retrieve version of Ipopt library [#824]. +- Fixed possible missing initialization of delta_x and delta_s in PDPerturbationHandler + in case ConsiderNewSystem failed [#834]. +- Undefine `max` if defined after include of windows.h in IpUtils.cpp [#834]. +- Added missing initialization of Filter Acceptor in case restoration phase is called + when the fallback mechanism of BacktrackingLinearSearch has been activated [#834,#837]. + If this happened in the first iteration, it led to the use of uninitialized values. +- Added missing return if symbolic factorization with MA57 (ma57ad, ma57as) failed [#834]. +- Fixed application of scaling when computing violations of inequality constraints in + `TNLP::get_curr_violations()`. Added `OrigIpoptNLP::d_space()`. +- Fixed signature of call to MKL's Pardiso: the DPARM argument does not exist in this + version of Pardiso. + ### 3.14.17 (2024-12-14) - Added `Ipopt::RegisterInterruptHandler()` and `Ipopt::UnregisterInterruptHandler()` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/LICENSE new/Ipopt-releases-3.14.19/LICENSE --- old/Ipopt-releases-3.14.17/LICENSE 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/LICENSE 2025-07-30 11:38:01.000000000 +0200 @@ -258,3 +258,20 @@ under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/README.md new/Ipopt-releases-3.14.19/README.md --- old/Ipopt-releases-3.14.17/README.md 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/README.md 2025-07-30 11:38:01.000000000 +0200 @@ -4,7 +4,7 @@ Introduction ------------ -Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) is a software package for large-scale [nonlinear optimization](http://wiki.mcs.anl.gov/NEOS/index.php/Nonlinear_Programming_FAQ). +Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) is a software package for large-scale [nonlinear optimization](https://en.wikipedia.org/wiki/Nonlinear_programming). It is designed to find (local) solutions of mathematical optimization problems of the form $$\begin{align} @@ -111,7 +111,7 @@ Some precompiled binaries of Ipopt are also available: - **[Ipopt releases page](https://github.com/coin-or/Ipopt/releases)** provides libraries and executables for Windows -- **[JuliaBinaryWrappers](https://github.com/JuliaBinaryWrappers/Ipopt_jll.jl/releases)** provides libraries and executables; [libHSL](https://licences.stfc.ac.uk/products/Software/HSL/LibHSL) provides prebuild HSL libraries +- **[JuliaBinaryWrappers](https://github.com/JuliaBinaryWrappers/Ipopt_jll.jl/releases)** provides libraries and executables (see also [notes on BLAS/LAPACK](https://github.com/jump-dev/Ipopt.jl#blas-and-lapack); [libHSL](https://licences.stfc.ac.uk/products/Software/HSL/LibHSL) provides prebuild HSL libraries - **[IDEAS](https://github.com/IDAES/idaes-ext/releases)** provides executables; these executables include HSL solvers Getting Help diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/configure new/Ipopt-releases-3.14.19/configure --- old/Ipopt-releases-3.14.17/configure 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/configure 2025-07-30 11:38:01.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for Ipopt 3.14.17. +# Generated by GNU Autoconf 2.72 for Ipopt 3.14.19. # # Report bugs to <https://github.com/coin-or/Ipopt/issues/new>. # @@ -620,8 +620,8 @@ # Identity of this package. PACKAGE_NAME='Ipopt' PACKAGE_TARNAME='ipopt' -PACKAGE_VERSION='3.14.17' -PACKAGE_STRING='Ipopt 3.14.17' +PACKAGE_VERSION='3.14.19' +PACKAGE_STRING='Ipopt 3.14.19' PACKAGE_BUGREPORT='https://github.com/coin-or/Ipopt/issues/new' PACKAGE_URL='https://github.com/coin-or/Ipopt' @@ -1496,7 +1496,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.17 to adapt to many kinds of systems. +'configure' configures Ipopt 3.14.19 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1567,7 +1567,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Ipopt 3.14.17:";; + short | recursive ) echo "Configuration of Ipopt 3.14.19:";; esac cat <<\_ACEOF @@ -1770,7 +1770,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Ipopt configure 3.14.17 +Ipopt configure 3.14.19 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2607,7 +2607,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.17, which was +It was created by Ipopt $as_me 3.14.19, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -4478,7 +4478,7 @@ -printf "%s\n" "#define IPOPT_VERSION \"3.14.17\"" >>confdefs.h +printf "%s\n" "#define IPOPT_VERSION \"3.14.19\"" >>confdefs.h printf "%s\n" "#define IPOPT_VERSION_MAJOR 3" >>confdefs.h @@ -4487,7 +4487,7 @@ printf "%s\n" "#define IPOPT_VERSION_MINOR 14" >>confdefs.h -printf "%s\n" "#define IPOPT_VERSION_RELEASE 17" >>confdefs.h +printf "%s\n" "#define IPOPT_VERSION_RELEASE 19" >>confdefs.h @@ -4560,7 +4560,7 @@ # Define the identity of the package. PACKAGE='ipopt' - VERSION='3.14.17' + VERSION='3.14.19' # Some tools Automake needs. @@ -24442,9 +24442,9 @@ - LT_LDFLAGS="$LT_LDFLAGS -version-number 3:14:17" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: libtool version info: -version-number 3:14:17" >&5 -printf "%s\n" "$as_me: libtool version info: -version-number 3:14:17" >&6;} + LT_LDFLAGS="$LT_LDFLAGS -version-number 3:14:19" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: libtool version info: -version-number 3:14:19" >&5 +printf "%s\n" "$as_me: libtool version info: -version-number 3:14:19" >&6;} LT_LDFLAGS="$LT_LDFLAGS -no-undefined" @@ -30314,7 +30314,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.17, which was +This file was extended by Ipopt $as_me 3.14.19, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -30387,7 +30387,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -Ipopt config.status 3.14.17 +Ipopt config.status 3.14.19 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/configure.ac new/Ipopt-releases-3.14.19/configure.ac --- old/Ipopt-releases-3.14.17/configure.ac 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/configure.ac 2025-07-30 11:38:01.000000000 +0200 @@ -8,7 +8,7 @@ # Names and other basic things # ############################################################################# -AC_INIT([Ipopt],[3.14.17],[https://github.com/coin-or/Ipopt/issues/new],[],[https://github.com/coin-or/Ipopt]) +AC_INIT([Ipopt],[3.14.19],[https://github.com/coin-or/Ipopt/issues/new],[],[https://github.com/coin-or/Ipopt]) AC_COPYRIGHT([ Copyright 2004, 2011 International Business Machines and others. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/contrib/sIPOPT/AmplSolver/SensAmplTNLP.cpp new/Ipopt-releases-3.14.19/contrib/sIPOPT/AmplSolver/SensAmplTNLP.cpp --- old/Ipopt-releases-3.14.17/contrib/sIPOPT/AmplSolver/SensAmplTNLP.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/contrib/sIPOPT/AmplSolver/SensAmplTNLP.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -295,9 +295,8 @@ //exc.ReportException(*jnlst_); // const std::string exc_mess = exc.Message(); const std::string exc_mess = exc.Message(); - jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run sIPOPT " - "because of incorrect AMPL suffix!\n" - " Message: %s\n\n", exc_mess.c_str()); + jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run sIPOPT because of incorrect AMPL suffix!\n" + " Message: %s\n\n", exc_mess.c_str()); options_->SetStringValue("sens_internal_abort", "yes"); bool ignore_suffix_error; options_->GetBoolValue("ignore_suffix_error", ignore_suffix_error, ""); @@ -319,9 +318,8 @@ catch( SUFFIX_EMPTY& exc ) { const std::string exc_mess = exc.Message(); - jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run reduced hessian computation " - "because of incorrect AMPL suffix!\n" - " Message: %s\n\n", exc_mess.c_str()); + jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run reduced hessian computation because of incorrect AMPL suffix!\n" + " Message: %s\n\n", exc_mess.c_str()); options_->SetStringValue("sens_internal_abort", "yes"); bool ignore_suffix_error; options_->GetBoolValue("ignore_suffix_error", ignore_suffix_error, ""); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/contrib/sIPOPT/src/SensApplication.cpp new/Ipopt-releases-3.14.19/contrib/sIPOPT/src/SensApplication.cpp --- old/Ipopt-releases-3.14.17/contrib/sIPOPT/src/SensApplication.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/contrib/sIPOPT/src/SensApplication.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -192,10 +192,9 @@ { if( n_sens_steps_ <= 0 ) { - jnlst_->Printf(J_WARNING, J_MAIN, "\n" - "The run_sens option was set to true, but the specified\n" - "number of sensitivity steps was set to zero.\n" - "Computation is aborted.\n\n"); + jnlst_->Printf(J_WARNING, J_MAIN, "\nThe run_sens option was set to true, but the specified\n" + "number of sensitivity steps was set to zero.\n" + "Computation is aborted.\n\n"); } } @@ -272,15 +271,13 @@ if( compute_red_hessian_ && redhess_internal_abort ) { - jnlst_->Printf(J_WARNING, J_MAIN, "\nReduced hessian was not computed " - "because an error occurred.\n" - "See exception message above for details.\n\n"); + jnlst_->Printf(J_WARNING, J_MAIN, "\nReduced hessian was not computed because an error occurred.\n" + "See exception message above for details.\n\n"); } if( run_sens_ && sens_internal_abort ) { - jnlst_->Printf(J_WARNING, J_MAIN, "\nsIPOPT was not called " - "because an error occurred.\n" - "See exception message above for details.\n\n"); + jnlst_->Printf(J_WARNING, J_MAIN, "\nsIPOPT was not called because an error occurred.\n" + "See exception message above for details.\n\n"); } ip_nlp_->FinalizeSolution(status, *ip_data_->curr()->x(), *zL, *zU, *c, *d, *yc, *yd, obj, GetRawPtr(ip_data_), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/contrib/sIPOPT/src/SensReducedHessianCalculator.cpp new/Ipopt-releases-3.14.19/contrib/sIPOPT/src/SensReducedHessianCalculator.cpp --- old/Ipopt-releases-3.14.17/contrib/sIPOPT/src/SensReducedHessianCalculator.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/contrib/sIPOPT/src/SensReducedHessianCalculator.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -64,10 +64,10 @@ if( have_x_scaling || have_c_scaling || have_d_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "\n" - "-------------------------------------------------------------------------------\n" - " *** WARNING ***\n" - "-------------------------------------------------------------------------------\n" - "You are using the reduced hessian feature with scaling of\n"); + "-------------------------------------------------------------------------------\n" + " *** WARNING ***\n" + "-------------------------------------------------------------------------------\n" + "You are using the reduced hessian feature with scaling of\n"); if( have_x_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "*** variables\n"); @@ -81,9 +81,9 @@ Jnlst().Printf(J_WARNING, J_MAIN, "*** inequality constraints\n"); } Jnlst().Printf(J_WARNING, J_MAIN, "enabled.\n" - "A correct unscaled solution of the reduced hessian cannot be guaranteed in this\n" - "case. Please consider rerunning with scaling turned off.\n" - "-------------------------------------------------------------------------------\n\n"); + "A correct unscaled solution of the reduced hessian cannot be guaranteed in this\n" + "case. Please consider rerunning with scaling turned off.\n" + "-------------------------------------------------------------------------------\n\n"); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/doc/main.dox new/Ipopt-releases-3.14.19/doc/main.dox --- old/Ipopt-releases-3.14.17/doc/main.dox 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/doc/main.dox 2025-07-30 11:38:01.000000000 +0200 @@ -280,7 +280,7 @@ Modern, light-weight (~1k loc), **Eigen**-based <strong>C++</strong> interface to %Ipopt and Snopt. -- [IPyOpt](https://gitlab.com/g-braeunlich/ipyopt) +- [ipyopt](https://gitlab.com/ipyopt-devs/ipyopt) Interfacing %Ipopt from **Python**. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/doc/output.dox new/Ipopt-releases-3.14.19/doc/output.dox --- old/Ipopt-releases-3.14.17/doc/output.dox 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/doc/output.dox 2025-07-30 11:38:01.000000000 +0200 @@ -76,8 +76,8 @@ | N | penalty value updated in merit function method w/ second order correction | | R | Restoration phase just started | | w | in watchdog procedure | - | s | step accepted in soft restoration phase | - | t/T | tiny step accepted without line search | + | s/S | step accepted in soft restoration phase (S: original backtracking globalization also satisfied) | + | t/T | tiny step accepted without line search (T: two consecutive tiny steps) | | r | some previous iterate restored | - ls: The number of backtracking line search steps (does not include diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/examples/ScalableProblems/RegisteredTNLP.hpp new/Ipopt-releases-3.14.19/examples/ScalableProblems/RegisteredTNLP.hpp --- old/Ipopt-releases-3.14.17/examples/ScalableProblems/RegisteredTNLP.hpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/examples/ScalableProblems/RegisteredTNLP.hpp 2025-07-30 11:38:01.000000000 +0200 @@ -16,7 +16,7 @@ { public: RegisteredTNLP() - : interrupted_(false) + : interrupted_(false) { } /** Initialize internal parameters. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/examples/hs071_java/HS071.java new/Ipopt-releases-3.14.19/examples/hs071_java/HS071.java --- old/Ipopt-releases-3.14.17/examples/hs071_java/HS071.java 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/examples/hs071_java/HS071.java 2025-07-30 11:38:01.000000000 +0200 @@ -395,6 +395,11 @@ // Create the problem HS071 hs071 = new HS071(); + // Get and print the Ipopt version + int version[] = new int[3]; + hs071.getVersion(version); + System.out.println("Ipopt version: " + version[0] + "." + version[1] + "." + version[2]); + // Set some options // hs071.setNumericOption("tol",1E-7); // hs071.setStringOption("nlp_scaling_method","user-scaling"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/Inexact/IpIterativePardisoSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/Inexact/IpIterativePardisoSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/Inexact/IpIterativePardisoSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/Inexact/IpIterativePardisoSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -220,7 +220,9 @@ int num_procs = 1; #ifdef IPOPT_HAS_GETENV_S char var[10]; - if( getenv_s(NULL, var, sizeof(var), "OMP_NUM_THREADS") == 0 ) + int required_size; + getenv_s(&required_size, var, sizeof(var), "OMP_NUM_THREADS"); + if( required_size > 0 ) #else char* var = getenv("OMP_NUM_THREADS"); if( var != NULL ) @@ -398,7 +400,9 @@ ) { #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT") == 0 ) + size_t required_size; + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT") ) #endif @@ -411,7 +415,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } @@ -455,7 +459,8 @@ /* additional matrix format */ #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT_MTX") == 0 ) + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT_MTX"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT_MTX") ) #endif @@ -468,7 +473,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpBacktrackingLineSearch.cpp new/Ipopt-releases-3.14.19/src/Algorithm/IpBacktrackingLineSearch.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpBacktrackingLineSearch.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpBacktrackingLineSearch.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -321,13 +321,23 @@ "We are in an emergency mode, but no restoration phase or other fall back is available."); } fallback_activated_ = false; // reset the flag + + // in order to init the line search for the acceptor next, we need a delta to calculate reference_gradBarrTDelta_ + // since likely we are here because this has failed in PDSearchDirCalculator::ComputeSearchDirection(), we set a new delta now + SmartPtr<IteratesVector> delta = IpData().curr()->MakeNewIteratesVector(true); + delta->Set(0.0); + IpData().set_delta(delta); } else { - // Initialize the acceptor for this backtracking line search - acceptor_->InitThisLineSearch(in_watchdog_); actual_delta = IpData().delta()->MakeNewContainer(); } + // Initialize the acceptor for this backtracking line search + // this was originally only done if fallback_activated_ was not true, i.e., if we were not going into restoration phase + // however, if the fallback is activated, we may go to the restoration phase below, which calls acceptor_->PrepareRestoPhaseStart() + // below, which calls FilterLSAcceptor::AugmentFilter(), which needs to have reference_barr_ and reference_theta_ initialized + // so we call InitThisLineSearch also in this case now + acceptor_->InitThisLineSearch(in_watchdog_); if( start_with_resto_ ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpFilterLSAcceptor.cpp new/Ipopt-releases-3.14.19/src/Algorithm/IpFilterLSAcceptor.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpFilterLSAcceptor.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpFilterLSAcceptor.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -23,6 +23,7 @@ FilterLSAcceptor::FilterLSAcceptor(const SmartPtr<PDSystemSolver>& pd_solver) : + reference_initialized_(false), filter_(2), pd_solver_(pd_solver) { @@ -265,6 +266,7 @@ reference_barr_ = watchdog_barr_; reference_gradBarrTDelta_ = watchdog_gradBarrTDelta_; } + reference_initialized_ = true; filter_.Print(Jnlst()); } @@ -297,6 +299,8 @@ DBG_START_METH("FilterLSAcceptor::AugmentFilter", dbg_verbosity); + DBG_ASSERT(reference_initialized_); + Number phi_add = reference_barr_ - gamma_phi_ * reference_theta_; Number theta_add = (1. - gamma_theta_) * reference_theta_; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpFilterLSAcceptor.hpp new/Ipopt-releases-3.14.19/src/Algorithm/IpFilterLSAcceptor.hpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpFilterLSAcceptor.hpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpFilterLSAcceptor.hpp 2025-07-30 11:38:01.000000000 +0200 @@ -290,6 +290,10 @@ * respect to which progress is to be made */ Number reference_gradBarrTDelta_; + /** Whether reference_theta_, reference_barr_, reference_gradBarrTDelta_ + * have been initialized by a call to InitThisLineSearch(). + */ + bool reference_initialized_; /** Constraint violation at reference point */ Number watchdog_theta_; /** Barrier objective function at reference point */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpOrigIpoptNLP.cpp new/Ipopt-releases-3.14.19/src/Algorithm/IpOrigIpoptNLP.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpOrigIpoptNLP.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpOrigIpoptNLP.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -312,8 +312,7 @@ && IsValid(jac_d_space_) && IsValid(h_space_) && IsValid(scaled_jac_c_space_) && IsValid(scaled_jac_d_space_) && IsValid(scaled_h_space_)); - DBG_ASSERT(retValue && "Model cannot return null vector or matrix prototypes or spaces," - " please return zero length vectors instead"); + DBG_ASSERT(retValue && "Model cannot return null vector or matrix prototypes or spaces, please return zero length vectors instead"); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpOrigIpoptNLP.hpp new/Ipopt-releases-3.14.19/src/Algorithm/IpOrigIpoptNLP.hpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpOrigIpoptNLP.hpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpOrigIpoptNLP.hpp 2025-07-30 11:38:01.000000000 +0200 @@ -282,6 +282,12 @@ { return x_space_; } + + /// @since 3.14.18 + virtual SmartPtr<const VectorSpace> d_space() const + { + return d_space_; + } ///@} /** Accessor method for vector/matrix spaces pointers */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/IpPDPerturbationHandler.cpp new/Ipopt-releases-3.14.19/src/Algorithm/IpPDPerturbationHandler.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/IpPDPerturbationHandler.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/IpPDPerturbationHandler.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -216,6 +216,9 @@ } delta_d = delta_d_curr_ = delta_c; + delta_x = 0.; + delta_s = 0.; + if( hess_degenerate_ == DEGENERATE ) { delta_x_curr_ = 0.; @@ -226,11 +229,6 @@ return false; } } - else - { - delta_x = 0.; - delta_s = delta_x; - } delta_x_curr_ = delta_x; delta_s_curr_ = delta_s; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMa27TSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMa27TSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMa27TSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMa27TSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -197,8 +197,7 @@ options.GetNumericValue("ma27_pivtol", pivtol_, prefix); if( options.GetNumericValue("ma27_pivtolmax", pivtolmax_, prefix) ) { - ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"ma27_pivtolmax\": This value must be between " - "ma27_pivtol and 1."); + ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"ma27_pivtolmax\": This value must be between ma27_pivtol and 1."); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMa57TSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMa57TSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMa57TSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMa57TSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -332,8 +332,7 @@ options.GetNumericValue("ma57_pivtol", pivtol_, prefix); if( options.GetNumericValue("ma57_pivtolmax", pivtolmax_, prefix) ) { - ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"pivtolmax\": This value must be between " - "pivtol and 1."); + ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"pivtolmax\": This value must be between pivtol and 1."); } else if( pivtol_ > pivtolmax_ ) { @@ -576,6 +575,7 @@ { Jnlst().Printf(J_ERROR, J_LINEAR_ALGEBRA, "*** Error from MA57AD *** INFO(0) = %" IPOPT_INDEX_FORMAT "\n", wd_info_[0]); + return SYMSOLVER_FATAL_ERROR; } wd_lfact_ = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -198,8 +198,7 @@ options.GetNumericValue("mumps_pivtol", pivtol_, prefix); if( options.GetNumericValue("mumps_pivtolmax", pivtolmax_, prefix) ) { - ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"mumps_pivtolmax\": This value must be between " - "mumps_pivtol and 1."); + ASSERT_EXCEPTION(pivtolmax_ >= pivtol_, OPTION_INVALID, "Option \"mumps_pivtolmax\": This value must be between mumps_pivtol and 1."); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -47,8 +47,7 @@ const ipindex* MSGLVL, ipnumber* B, ipnumber* X, - ipindex* E, - ipnumber* DPARM + ipindex* E ); #ifndef IPOPT_NO_MKLVERSIONCHECK @@ -90,7 +89,6 @@ PT_ = new void* [64]; IPARM_ = new Index[64]; - DPARM_ = new Number[64]; } PardisoMKLSolverInterface::~PardisoMKLSolverInterface() @@ -108,13 +106,12 @@ Index idmy = 0; Number ddmy = 0.; IPOPT_LAPACK_FUNC(pardiso, PARDISO)(PT_, &MAXFCT_, &MNUM_, &MTYPE_, &PHASE, &N, &ddmy, &idmy, &idmy, &idmy, &NRHS, IPARM_, &MSGLVL_, &ddmy, - &ddmy, &ERROR, DPARM_); + &ddmy, &ERROR); DBG_ASSERT(ERROR == 0); } delete[] PT_; delete[] IPARM_; - delete[] DPARM_; delete[] a_; } @@ -225,7 +222,7 @@ Index idmy = 0; Number ddmy = 0.; IPOPT_LAPACK_FUNC(pardiso, PARDISO)(PT_, &MAXFCT_, &MNUM_, &MTYPE_, &PHASE, &N, &ddmy, &idmy, &idmy, &idmy, &NRHS, IPARM_, &MSGLVL_, &ddmy, - &ddmy, &ERROR, DPARM_); + &ddmy, &ERROR); DBG_ASSERT(ERROR == 0); } @@ -265,6 +262,7 @@ // MKL 2025.0.1 does not work correctly with IPARM_[20] = 3 and IPARM_[7] > 0 // workaround: change to IPARM_[20] = 1 (the default) + // MKL 2025.1.0 has this fixed // https://github.com/coin-or/Ipopt/issues/799 // https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Pardiso-bunch-kaufman-pivoting-option-3-different-in-MKL-2025-0/m-p/1648273 #ifndef IPOPT_NO_MKLVERSIONCHECK @@ -272,7 +270,7 @@ { MKLVersion mklver; MKL_Get_Version(&mklver); - if( mklver.MajorVersion >= 2025 ) + if( mklver.MajorVersion == 2025 && mklver.UpdateVersion == 0 ) { IPARM_[20] = 1; Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, @@ -393,7 +391,9 @@ ) { #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT") == 0 ) + size_t required_size; + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT") ) #endif @@ -406,7 +406,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } @@ -450,7 +450,8 @@ /* additional matrix format */ #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT_MTX") == 0 ) + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT_MTX"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT_MTX") ) #endif @@ -463,7 +464,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } @@ -526,7 +527,7 @@ "Calling Pardiso for symbolic factorization (PHASE=%d).\n", PHASE); IPOPT_LAPACK_FUNC(pardiso, PARDISO)(PT_, &MAXFCT_, &MNUM_, &MTYPE_, &PHASE, &N, a_, ia, ja, &PERM, - &NRHS, IPARM_, &MSGLVL_, &B, &X, &ERROR, DPARM_); + &NRHS, IPARM_, &MSGLVL_, &B, &X, &ERROR); if( HaveIpData() ) { IpData().TimingStats().LinearSystemSymbolicFactorization().End(); @@ -580,7 +581,7 @@ IPOPT_LAPACK_FUNC(pardiso, PARDISO)(PT_, &MAXFCT_, &MNUM_, &MTYPE_, &PHASE, &N, a_, ia, ja, &PERM, - &NRHS, IPARM_, &MSGLVL_, &B, &X, &ERROR, DPARM_); + &NRHS, IPARM_, &MSGLVL_, &B, &X, &ERROR); if( HaveIpData() ) { IpData().TimingStats().LinearSystemFactorization().End(); @@ -720,21 +721,7 @@ rhs_vals[i] = ORIG_RHS[i]; } IPOPT_LAPACK_FUNC(pardiso, PARDISO)(PT_, &MAXFCT_, &MNUM_, &MTYPE_, &PHASE, &N, a_, ia, ja, &PERM, &NRHS, IPARM_, &MSGLVL_, rhs_vals, X, - &ERROR, DPARM_); - - if( ERROR <= -100 && ERROR >= -102 ) - { - Jnlst().Printf(J_WARNING, J_LINEAR_ALGEBRA, - "Iterative solver in Pardiso did not converge (ERROR = %" IPOPT_INDEX_FORMAT ")\n", ERROR); - Jnlst().Printf(J_WARNING, J_LINEAR_ALGEBRA, - " Decreasing drop tolerances from DPARM_[4] = %e and DPARM_[5] = %e\n", DPARM_[4], DPARM_[5]); - PHASE = 23; - DPARM_[4] /= 2.0; - DPARM_[5] /= 2.0; - Jnlst().Printf(J_WARNING, J_LINEAR_ALGEBRA, - " to DPARM_[4] = %e and DPARM_[5] = %e\n", DPARM_[4], DPARM_[5]); - ERROR = 0; - } + &ERROR); delete[] X; delete[] ORIG_RHS; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.hpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.hpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.hpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoMKLSolverInterface.hpp 2025-07-30 11:38:01.000000000 +0200 @@ -165,8 +165,6 @@ Index MTYPE_; /** Parameter and info array for Pardiso. */ Index* IPARM_; - /** Parameter and info array for Pardiso. */ - Number* DPARM_; /** Message level. */ Index MSGLVL_; ///@} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpPardisoSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpPardisoSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -405,7 +405,9 @@ // Obtain the numbers of processors from the value of OMP_NUM_THREADS #ifdef IPOPT_HAS_GETENV_S char var[10]; - if( getenv_s(NULL, var, sizeof(var), "OMP_NUM_THREADS") == 0 ) + size_t required_size; + getenv_s(&required_size, var, sizeof(var), "OMP_NUM_THREADS"); + if( required_size > 0 ) #else char* var = getenv("OMP_NUM_THREADS"); if( var != NULL ) @@ -603,7 +605,9 @@ ) { #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT") == 0 ) + size_t required_size; + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT") ) #endif @@ -616,7 +620,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } @@ -660,7 +664,8 @@ /* additional matrix format */ #ifdef IPOPT_HAS_GETENV_S - if( getenv_s(NULL, NULL, 0, "IPOPT_WRITE_MAT_MTX") == 0 ) + getenv_s(&required_size, NULL, 0, "IPOPT_WRITE_MAT_MTX"); + if( required_size > 0 ) #else if( getenv("IPOPT_WRITE_MAT_MTX") ) #endif @@ -673,7 +678,7 @@ #ifdef IPOPT_HAS_GETENV_S char mat_pref[32]; - if( getenv_s(NULL, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) + if( getenv_s(&required_size, mat_pref, sizeof(mat_pref), "IPOPT_WRITE_PREFIX") != 0 ) { memcpy(mat_pref, "mat-ipopt", 10); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpSpralSolverInterface.cpp new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpSpralSolverInterface.cpp --- old/Ipopt-releases-3.14.17/src/Algorithm/LinearSolvers/IpSpralSolverInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Algorithm/LinearSolvers/IpSpralSolverInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -375,16 +375,14 @@ switch_[i] = SWITCH_AT_START; scaling_type_ = scaling_val_[i]; current_level_ = i; - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabled " - "scaling level %d on initialization\n", current_level_); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabled scaling level %d on initialization\n", current_level_); } else if( switch_val[i] == "at_start_reuse" ) { switch_[i] = SWITCH_AT_START_REUSE; scaling_type_ = scaling_val_[i]; current_level_ = i; - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabled " - "scaling level %d on initialization\n", current_level_); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabled scaling level %d on initialization\n", current_level_); } else if( switch_val[i] == "on_demand" ) { @@ -464,17 +462,13 @@ // Correct scaling and ordering if necessary. if( control_.ordering == 2 && control_.scaling != 3 ) { - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface, " - "matching-based ordering was used, but matching-based scaling was " - "not. Setting scaling using the matching-based ordering.\n"); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface, matching-based ordering was used, but matching-based scaling was not. Setting scaling using the matching-based ordering.\n"); control_.scaling = scaling_type_ = 3; } if( control_.ordering != 2 && control_.scaling == 3 ) { - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface, " - "matching-based scaling was used, but matching-based ordering was " - "not. Setting ordering using the matching-based algorithm.\n"); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface, matching-based scaling was used, but matching-based ordering was not. Setting ordering using the matching-based algorithm.\n"); control_.ordering = 2; } @@ -498,8 +492,7 @@ if( info.flag < 0 ) { - Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::InitializeStructure: " - "Unhandled error. info.flag = %d.\n", info.flag); + Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::InitializeStructure: Unhandled error. info.flag = %d.\n", info.flag); return SYMSOLVER_FATAL_ERROR; } } @@ -556,15 +549,13 @@ if ( info.flag == 6 || info.flag == -5 ) { - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: " - "Singular system, estimated rank %d of %d\n", info.matrix_rank, ndim_); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: Singular system, estimated rank %d of %d\n", info.matrix_rank, ndim_); return SYMSOLVER_SINGULAR; } if ( info.flag < 0 ) { - Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: " - "Unhandled error. info.flag = %d.\n", info.flag); + Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: Unhandled error. info.flag = %d.\n", info.flag); return SYMSOLVER_FATAL_ERROR; } } @@ -578,29 +569,24 @@ spral_ssids_factor_ptr32(false, ia, ja, val_, scaling_, akeep_, &fkeep_, &control_, &info); - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: delays %d, nfactor %" PRId64 ", " - "nflops %" PRId64 ", maxfront %d\n", info.num_delay, info.num_factor, info.num_flops, - info.maxfront); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: delays %d, nfactor %" PRId64 ", nflops %" PRId64 ", maxfront %d\n", info.num_delay, info.num_factor, info.num_flops, info.maxfront); if( HaveIpData() ) { IpData().TimingStats().LinearSystemFactorization().End(); Number t2 = IpData().TimingStats().LinearSystemFactorization().TotalWallclockTime(); - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SpralSolverInterface::Factorization: " - "spral_factor_solve took %10.3f\n", t2 - t1); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SpralSolverInterface::Factorization: spral_factor_solve took %10.3f\n", t2 - t1); } if( info.flag == 7 || info.flag == 6 || info.flag == -5 ) { - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: " - "Singular system, estimated rank %d of %d\n", info.matrix_rank, ndim_); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: Singular system, estimated rank %d of %d\n", info.matrix_rank, ndim_); return SYMSOLVER_SINGULAR; } if( info.flag < 0 ) { - Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: " - "Unhandled error. info.flag = %d.\n", info.flag); + Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: Unhandled error. info.flag = %d.\n", info.flag); if( info.flag == -53 ) { Jnlst().Printf(J_STRONGWARNING, J_LINEAR_ALGEBRA, "Maybe one forgot to set environment variable OMP_CANCELLATION to TRUE.\n"); @@ -657,8 +643,7 @@ // Number of delays has signficantly increased, so trigger. current_level_ = i; scaling_type_ = scaling_val_[i]; - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: " - "Enabling scaling %d due to excess delays\n", i); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabling scaling %d due to excess delays\n", i); rescale_ = true; } @@ -668,8 +653,7 @@ if( check_NegEVals && info.num_neg != numberOfNegEVals ) { - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: " - "info.num_neg = %d, but numberOfNegEVals = %" IPOPT_INDEX_FORMAT "\n", info.num_neg, numberOfNegEVals); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "In SpralSolverInterface::Factorization: info.num_neg = %d, but numberOfNegEVals = %" IPOPT_INDEX_FORMAT "\n", info.num_neg, numberOfNegEVals); return SYMSOLVER_WRONG_INERTIA; } @@ -720,8 +704,7 @@ rescale_ = true; current_level_ = i; scaling_type_ = scaling_val_[i]; - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabling scaling " - "%d due to failure of iterative refinement\n", current_level_); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "SPRAL: Enabling scaling %d due to failure of iterative refinement\n", current_level_); break; default: ; @@ -734,8 +717,7 @@ } pivtol_changed_ = true; - Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "Increasing pivot tolerance " - "for SPRAL from %7.2e ", control_.u); + Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "Increasing pivot tolerance for SPRAL from %7.2e ", control_.u); control_.u = Min(umax_, std::pow(control_.u, 0.75)); Jnlst().Printf(J_DETAILED, J_LINEAR_ALGEBRA, "to %7.2e.\n", control_.u); return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Common/IpJournalist.cpp new/Ipopt-releases-3.14.19/src/Common/IpJournalist.cpp --- old/Ipopt-releases-3.14.17/src/Common/IpJournalist.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Common/IpJournalist.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -524,8 +524,8 @@ if( n >= (int)sizeof(buffer_) ) { - char* bigmsg = new char[n+1]; - vsnprintf(bigmsg, (size_t) n+1, pformat, ap); + char* bigmsg = new char[n + 1]; + vsnprintf(bigmsg, (size_t) n + 1, pformat, ap); bigmsg[n] = '\0'; *os_ << bigmsg; } @@ -533,7 +533,7 @@ { if( n < 0 ) { - buffer_[sizeof(buffer_)-1] = '\0'; + buffer_[sizeof(buffer_) -1] = '\0'; } *os_ << buffer_; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Common/IpRegOptions.cpp new/Ipopt-releases-3.14.19/src/Common/IpRegOptions.cpp --- old/Ipopt-releases-3.14.17/src/Common/IpRegOptions.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Common/IpRegOptions.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -289,8 +289,7 @@ jnlst.Printf(J_SUMMARY, J_DOCUMENTATION, "\\end{itemize}\n"); } - jnlst.Printf(J_SUMMARY, J_DOCUMENTATION, "" - "\n"); + jnlst.Printf(J_SUMMARY, J_DOCUMENTATION, "\n"); } void RegisteredOption::MakeValidLatexString( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Common/IpUtils.cpp new/Ipopt-releases-3.14.19/src/Common/IpUtils.cpp --- old/Ipopt-releases-3.14.17/src/Common/IpUtils.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Common/IpUtils.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -51,6 +51,9 @@ '#define small char' */ #undef small #endif +#ifdef max +#undef max +#endif #define TWO_TO_THE_THIRTYTWO 4294967296.0 #define DELTA_EPOCH_IN_SECS 11644473600.0 inline double IpCoinGetTimeOfDay() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Common/config_ipopt_default.h new/Ipopt-releases-3.14.19/src/Common/config_ipopt_default.h --- old/Ipopt-releases-3.14.17/src/Common/config_ipopt_default.h 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Common/config_ipopt_default.h 2025-07-30 11:38:01.000000000 +0200 @@ -5,7 +5,7 @@ /***************************************************************************/ /* Version number of project */ -#define IPOPT_VERSION "3.14.17" +#define IPOPT_VERSION "3.14.19" /* 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 17 +#define IPOPT_VERSION_RELEASE 19 /* 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.17/src/Interfaces/IpIpoptApplication.cpp new/Ipopt-releases-3.14.19/src/Interfaces/IpIpoptApplication.cpp --- old/Ipopt-releases-3.14.17/src/Interfaces/IpIpoptApplication.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpIpoptApplication.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -1047,4 +1047,15 @@ IpoptAlgorithm::print_copyright_message(*jnlst_); } +void IpoptApplication::Version( + int& major, + int& minor, + int& release +) +{ + major = IPOPT_VERSION_MAJOR; + minor = IPOPT_VERSION_MINOR; + release = IPOPT_VERSION_RELEASE; +} + } // namespace Ipopt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/IpIpoptApplication.hpp new/Ipopt-releases-3.14.19/src/Interfaces/IpIpoptApplication.hpp --- old/Ipopt-releases-3.14.17/src/Interfaces/IpIpoptApplication.hpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpIpoptApplication.hpp 2025-07-30 11:38:01.000000000 +0200 @@ -265,11 +265,23 @@ ); /** Method to register all Ipopt options. */ - static void - RegisterAllIpoptOptions( + static void RegisterAllIpoptOptions( const SmartPtr<RegisteredOptions>& roptions ); + /** Return version of Ipopt library. + * + * Gives the value of IPOPT_VERSION_MAJOR, IPOPT_VERSION_MINOR, and IPOPT_VERSION_RELEASE + * that were used when the Ipopt library was build. + * + * @since 3.14.18 + */ + static void Version( + int& major, /**< set to major version number of Ipopt */ + int& minor, /**< set to minor version number of Ipopt */ + int& release /**< set to release version number of Ipopt */ + ); + private: /**@name Default Compiler Generated Methods * (Hidden to avoid implicit creation/calling). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/IpStdCInterface.cpp new/Ipopt-releases-3.14.19/src/Interfaces/IpStdCInterface.cpp --- old/Ipopt-releases-3.14.17/src/Interfaces/IpStdCInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpStdCInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -11,6 +11,8 @@ #include "IpBlas.hpp" #include "IpSmartPtr.hpp" +#include <cassert> + struct IpoptProblemInfo { Ipopt::SmartPtr<Ipopt::IpoptApplication> app; @@ -331,3 +333,16 @@ return ipopt_problem->tnlp->get_curr_violations(scaled != 0, n, x_L_violation, x_U_violation, compl_x_L, compl_x_U, grad_lag_x, m, nlp_constraint_violation, compl_g); } + +void GetIpoptVersion( + int* major, /**< buffer to store major version number of Ipopt */ + int* minor, /**< buffer to store minor version number of Ipopt */ + int* release /**< buffer to store release version number of Ipopt */ +) +{ + assert(major != NULL); + assert(minor != NULL); + assert(release != NULL); + + Ipopt::IpoptApplication::Version(*major, *minor, *release); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/IpStdCInterface.h new/Ipopt-releases-3.14.19/src/Interfaces/IpStdCInterface.h --- old/Ipopt-releases-3.14.17/src/Interfaces/IpStdCInterface.h 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpStdCInterface.h 2025-07-30 11:38:01.000000000 +0200 @@ -421,6 +421,19 @@ ipnumber* compl_g ); +/** Return version of Ipopt library. + * + * Gives the value of IPOPT_VERSION_MAJOR, IPOPT_VERSION_MINOR, and IPOPT_VERSION_RELEASE + * that were used when the Ipopt library was build. + * + * @since 3.14.18 + */ +IPOPTLIB_EXPORT void IPOPT_CALLCONV GetIpoptVersion( + int* major, /**< buffer to store major version number of Ipopt */ + int* minor, /**< buffer to store minor version number of Ipopt */ + int* release /**< buffer to store release version number of Ipopt */ +); + #ifdef __cplusplus } /* extern "C" { */ #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/IpStdJInterface.cpp new/Ipopt-releases-3.14.19/src/Interfaces/IpStdJInterface.cpp --- old/Ipopt-releases-3.14.17/src/Interfaces/IpStdJInterface.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpStdJInterface.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -665,7 +665,7 @@ env->SetNumberArrayRegion(mult_gj, 0, m, const_cast<Number*>(lambda)); } - env->GetNumberArrayRegion(fj, 0, 1, &obj_value); + env->SetNumberArrayRegion(fj, 0, 1, &obj_value); } /* Intermediate Callback method for the user. */ @@ -1143,4 +1143,20 @@ return ret; } + JNIEXPORT void JNICALL Java_org_coinor_Ipopt_GetVersion( + JNIEnv* env, + jobject /*obj_this*/, + jintArray jversion + ) + { + int version[3]; + IpoptApplication::Version(version[0], version[1], version[2]); + + /* int[] -> jint[] */ + jint versionj[3] = { version[0], version[1], version[2] }; + + /* jint[] -> jintArray */ + env->SetIntArrayRegion(jversion, 0, 3, versionj); + } + } // extern "C" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/IpTNLP.cpp new/Ipopt-releases-3.14.19/src/Interfaces/IpTNLP.cpp --- old/Ipopt-releases-3.14.17/src/Interfaces/IpTNLP.cpp 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/IpTNLP.cpp 2025-07-30 11:38:01.000000000 +0200 @@ -931,7 +931,7 @@ // orig_d_L is unscaled, but we need the scaled one below (because d is scaled) if( orignlp->NLP_scaling()->have_d_scaling() ) { - d_L = orignlp->NLP_scaling()->apply_vector_scaling_d_NonConst(d_L); + d_L = orignlp->NLP_scaling()->apply_vector_scaling_d_LU_NonConst(*orignlp->Pd_L(), d_L, *orignlp->d_space()); } } else // if no relaxation, then orig_d_L() returns NULL, use d_L instead @@ -966,7 +966,7 @@ // orig_d_U is unscaled, but we need the scaled one below (because d is scaled) if( orignlp->NLP_scaling()->have_d_scaling() ) { - d_U = orignlp->NLP_scaling()->apply_vector_scaling_d_NonConst(d_U); + d_U = orignlp->NLP_scaling()->apply_vector_scaling_d_LU_NonConst(*orignlp->Pd_U(), d_U, *orignlp->d_space()); } } else // if no relaxation, then orig_d_U() returns NULL, use d_U instead diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Ipopt-releases-3.14.17/src/Interfaces/Ipopt.java new/Ipopt-releases-3.14.19/src/Interfaces/Ipopt.java --- old/Ipopt-releases-3.14.17/src/Interfaces/Ipopt.java 2024-12-14 14:40:06.000000000 +0100 +++ new/Ipopt-releases-3.14.19/src/Interfaces/Ipopt.java 2025-07-30 11:38:01.000000000 +0200 @@ -124,6 +124,11 @@ double compl_g[] ); + /* Native function should not be used directly */ + private native void GetVersion( + int version[] + ); + /** Use C index style for iRow and jCol vectors */ public final static int C_STYLE = 0; @@ -205,13 +210,6 @@ { try { - /* This loads the Ipopt library with RTLD_LOCAL, which means that symbols loaded are not made available for future dlopen() calls. - * This causes a problem when using MKL, which loads an additional library at runtime, e.g., libmkl_avx2, because this lib references - * to symbols that could be resolved in previously load MKL libraries - but are not because of RTLD_LOCAL. - * TODO should one add some kind of workaround to load the Ipopt lib with RTLD_GLOBAL?, e.g., - * https://stackoverflow.com/questions/5425034/java-load-shared-libraries-with-dependencies - * https://github.com/victor-paltz/global-load-library - */ System.loadLibrary(c); loadedlib = true; break; @@ -226,6 +224,13 @@ } else { + /* This loads the Ipopt library with RTLD_LOCAL, which means that symbols loaded are not made available for future dlopen() calls. + * This causes a problem when using MKL, which loads an additional library at runtime, e.g., libmkl_avx2, because this lib references + * to symbols that could be resolved in previously load MKL libraries - but are not because of RTLD_LOCAL. + * TODO should one add some kind of workaround to load the Ipopt lib with RTLD_GLOBAL?, e.g., + * https://stackoverflow.com/questions/5425034/java-load-shared-libraries-with-dependencies + * https://github.com/victor-paltz/global-load-library + */ System.loadLibrary("ipopt"); } } @@ -851,4 +856,19 @@ { return false; } + + /** Get version of Ipopt library. + * + * Gives the value of IPOPT_VERSION_MAJOR, IPOPT_VERSION_MINOR, and IPOPT_VERSION_RELEASE + * that were used when the Ipopt library was build. + * + * @param version int[3] to store major, minor, and release version number + * @since 3.14.18 + */ + public void getVersion( + int[] version + ) + { + GetVersion(version); + } }
