This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "roboptim-core-plugin-ipopt".

The branch, master has been updated
       via  5969cebdb6746deb3dd17c2afed109649a2f2e19 (commit)
      from  457e3a7c13b08437cb3d7eb3c34d9dd8ab8dfdbf (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 5969cebdb6746deb3dd17c2afed109649a2f2e19
Author: Thomas Moulard <thomas.moul...@gmail.com>
Date:   Mon Mar 1 11:46:23 2010 +0100

    Upgrade to RobOptim core 0.5.6.
    
            CAUTION: starting from now, $(libdir)/roboptim-core /MUST/
            be in your LT_LIBRARY_PATH! It is also recommended to remove
            manually your old $(libdir)/roboptim-core-ipopt* files.
    
        * configure.ac: Require newer roboptim-core.
        * include/roboptim/core/plugin/ipopt.hh:
        Declare parameters management methods.
        * src/Makefile.am: Install plug-in in separate directory.
        * src/roboptim-core-ipopt-plugin.cc: Management parameters properly.
        * tests/plugin.stdout,
        * tests/simple.stdout: Regenerate.
    
    Signed-off-by: Thomas Moulard <thomas.moul...@gmail.com>

diff --git a/ChangeLog b/ChangeLog
index ed628fd..dfc762e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2010-03-01  Thomas Moulard  <thomas.moul...@gmail.com>
+
+       Upgrade to RobOptim core 0.5.6.
+
+        CAUTION: starting from now, $(libdir)/roboptim-core /MUST/
+        be in your LT_LIBRARY_PATH! It is also recommended to remove
+        manually your old $(libdir)/roboptim-core-ipopt* files.
+
+       * configure.ac: Require newer roboptim-core.
+       * include/roboptim/core/plugin/ipopt.hh:
+       Declare parameters management methods.
+       * src/Makefile.am: Install plug-in in separate directory.
+       * src/roboptim-core-ipopt-plugin.cc: Management parameters properly.
+       * tests/plugin.stdout,
+       * tests/simple.stdout: Regenerate.
+
 2009-08-24  Thomas Moulard  <thomas.moul...@gmail.com>
 
        Update to new SourceForge URLs.
diff --git a/configure.ac b/configure.ac
index b935d04..927ad3b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -58,7 +58,7 @@ JRL_PROG_DOXYGEN
 LT_INIT([dlopen])
 
 # Search for roboptim-core.
-ROBOPTIM_CORE_PKG_CONFIG([roboptim-core >= 0.2])
+ROBOPTIM_CORE_PKG_CONFIG([roboptim-core >= 0.5.6])
 
 # Search for Ipopt.
 IPOPT_HEADERS(, [AC_MSG_FAILURE(["Ipopt header not found."])])
diff --git a/include/roboptim/core/plugin/ipopt.hh 
b/include/roboptim/core/plugin/ipopt.hh
index 5e85c49..e0fec0b 100644
--- a/include/roboptim/core/plugin/ipopt.hh
+++ b/include/roboptim/core/plugin/ipopt.hh
@@ -17,11 +17,17 @@
 
 #ifndef ROBOPTIM_CORE_IPOPT_HH
 # define ROBOPTIM_CORE_IPOPT_HH
+# include <roboptim/core/sys.hh>
+# include <roboptim/core/portability.hh>
+
 # include <boost/mpl/vector.hpp>
+
 # include <coin/IpSmartPtr.hpp>
+
 # include <roboptim/core/solver.hh>
 # include <roboptim/core/twice-derivable-function.hh>
 
+
 /// \brief Ipopt classes.
 namespace Ipopt
 {
@@ -47,8 +53,9 @@ namespace roboptim
   ///
   /// \warning Ipopt needs twice derivable functions, so be sure
   /// to provide hessians in your function's problems.
-  class IpoptSolver : public Solver<TwiceDerivableFunction,
-                                   boost::mpl::vector<TwiceDerivableFunction> >
+  class ROBOPTIM_DLLEXPORT IpoptSolver
+    : public Solver<TwiceDerivableFunction,
+                   boost::mpl::vector<TwiceDerivableFunction> >
   {
   public:
     friend class detail::MyTNLP;
@@ -74,6 +81,16 @@ namespace roboptim
     virtual Ipopt::SmartPtr<Ipopt::IpoptApplication> getIpoptApplication ()
       throw ();
   private:
+    /// \brief Initialize parameters.
+    ///
+    /// Add solver parameters. Called during construction.
+    void initializeParameters () throw ();
+
+    /// \brief Read parameters and update associated options in Ipopt.
+    ///
+    /// Called before solving problem.
+    void updateParameters () throw ();
+
     /// \brief Smart pointer to the Ipopt non linear problem description.
     Ipopt::SmartPtr<Ipopt::TNLP> nlp_;
     /// \brief Smart pointer to the Ipopt application instance.
diff --git a/src/Makefile.am b/src/Makefile.am
index 7e227fa..9d4c8a8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -10,7 +10,10 @@ AM_CPPFLAGS += $(ROBOPTIMCORE_CFLAGS)
 # Add available warnings flags.
 AM_CXXFLAGS += $(WARNING_CXXFLAGS)
 
-lib_LTLIBRARIES = roboptim-core-ipopt-plugin.la
+# Define plug-in directory.
+plugindir = $(libdir)/roboptim-core
+
+plugin_LTLIBRARIES = roboptim-core-ipopt-plugin.la
 
 roboptim_core_ipopt_plugin_la_SOURCES = doc.hh roboptim-core-ipopt-plugin.cc
 
diff --git a/src/roboptim-core-ipopt-plugin.cc 
b/src/roboptim-core-ipopt-plugin.cc
index 663b334..b413de1 100644
--- a/src/roboptim-core-ipopt-plugin.cc
+++ b/src/roboptim-core-ipopt-plugin.cc
@@ -18,6 +18,9 @@
 #include <cassert>
 #include <cstring>
 
+#include <boost/foreach.hpp>
+#include <boost/variant/apply_visitor.hpp>
+
 #include <coin/IpIpoptApplication.hpp>
 #include <coin/IpTNLP.hpp>
 
@@ -501,12 +504,110 @@ namespace roboptim
       nlp_ (new MyTNLP (*this)),
       app_ (new IpoptApplication (false, false))
   {
-    // Set default options.
-    app_->Options ()->SetNumericValue ("tol", 1e-7);
-    app_->Options ()->SetStringValue ("mu_strategy", "adaptive");
-    app_->Options ()->SetStringValue ("output_file", "");
+    // Initialize parameters.
+    initializeParameters ();
+  }
+
+#define DEFINE_PARAMETER(KEY, DESCRIPTION, VALUE)      \
+  do {                                                 \
+    parameters_[KEY].description = DESCRIPTION;                \
+    parameters_[KEY].value = VALUE;                    \
+  } while (0)
+
+  void
+  IpoptSolver::initializeParameters () throw ()
+  {
+    parameters_.clear ();
+
+    // Shared parameters.
+    DEFINE_PARAMETER ("max-iterations", "number of iterations", 3000);
+
+    // IPOPT specific.
+    // Much more options are available for Ipopt, see ``Options reference'' of
+    // Ipopt documentation.
+
+    //  Output
+    DEFINE_PARAMETER ("ipopt.print_level", "output verbosity level", 5);
+    DEFINE_PARAMETER ("ipopt.print_user_options",
+                     "print all options set by the user", "no");
+    DEFINE_PARAMETER ("ipopt.print_options_documentation",
+                     "switch to print all algorithmic options", "no");
+    DEFINE_PARAMETER
+      ("ipopt.output_file",
+       "file name of desired output file (leave unset for no file output)", 
"");
+    DEFINE_PARAMETER ("ipopt.file_print_level",
+                     "verbosity level for output file", 5);
+    DEFINE_PARAMETER ("ipopt.option_file_name",
+                     "file name of options file (to overwrite default)", "");
+
+    //  Termination
+    DEFINE_PARAMETER ("ipopt.tol",
+                     "desired convergence tolerance (relative)", 1e-7);
+
+    //  Barrier parameter
+    DEFINE_PARAMETER ("ipopt.mu_strategy",
+                     "update strategy for barrier parameter", "adaptive");
 
-    //app_->Options ()->SetStringValue ("nlp_scaling_method", "user-scaling");
+  }
+
+#undef DEFINE_PARAMETER
+
+
+  namespace
+  {
+    struct IpoptParametersUpdater
+      : public boost::static_visitor<>
+    {
+      explicit IpoptParametersUpdater
+      (const Ipopt::SmartPtr<Ipopt::IpoptApplication>& app,
+       const std::string& key)
+       : app (app),
+         key (key)
+
+      {}
+      void
+      operator () (const Function::value_type& val) const
+      {
+       app->Options ()->SetNumericValue (key, val);
+      }
+
+      void
+      operator () (const int& val) const
+      {
+       app->Options ()->SetNumericValue (key, val);
+      }
+
+      void
+      operator () (const std::string& val) const
+      {
+       app->Options ()->SetStringValue (key, val);
+      }
+
+    private:
+      const Ipopt::SmartPtr<Ipopt::IpoptApplication>& app;
+      const std::string& key;
+    };
+  } // end of anonymous namespace.
+
+  void
+  IpoptSolver::updateParameters () throw ()
+  {
+    const std::string prefix = "ipopt.";
+    typedef const std::pair<const std::string, Parameter> const_iterator_t;
+    BOOST_FOREACH (const_iterator_t& it, parameters_)
+      {
+       if (it.first.substr (0, prefix.size ()) == prefix)
+         {
+           boost::apply_visitor
+             (IpoptParametersUpdater
+              (app_, it.first.substr (prefix.size ())), it.second.value);
+         }
+      }
+
+    // Remap standardized parameters.
+    boost::apply_visitor
+      (IpoptParametersUpdater
+       (app_, "max_iter"), parameters_["max-iterations"].value);
   }
 
   IpoptSolver::~IpoptSolver () throw ()
@@ -571,6 +672,8 @@ namespace roboptim
   void
   IpoptSolver::solve () throw ()
   {
+    // Read parameters and forward them to Ipopt.
+    updateParameters ();
     ApplicationReturnStatus status = app_->Initialize ("");
 
     switch (status)
@@ -603,15 +706,21 @@ extern "C"
   using namespace roboptim;
   typedef IpoptSolver::parent_t solver_t;
 
-  solver_t* create (const IpoptSolver::problem_t& pb);
-  void destroy (solver_t* p);
+  ROBOPTIM_DLLEXPORT unsigned getSizeOfProblem ();
+  ROBOPTIM_DLLEXPORT solver_t* create (const IpoptSolver::problem_t& pb);
+  ROBOPTIM_DLLEXPORT void destroy (solver_t* p);
+
+  ROBOPTIM_DLLEXPORT unsigned getSizeOfProblem ()
+  {
+    return sizeof (IpoptSolver::problem_t);
+  }
 
-  solver_t* create (const IpoptSolver::problem_t& pb)
+  ROBOPTIM_DLLEXPORT solver_t* create (const IpoptSolver::problem_t& pb)
   {
     return new IpoptSolver (pb);
   }
 
-  void destroy (solver_t* p)
+  ROBOPTIM_DLLEXPORT void destroy (solver_t* p)
   {
     delete p;
   }
diff --git a/tests/plugin.stdout b/tests/plugin.stdout
index ebcc32b..b285a32 100644
--- a/tests/plugin.stdout
+++ b/tests/plugin.stdout
@@ -1,23 +1,35 @@
-Problem:
-  a * d * (a + b + c) + d (twice derivable function)
-  Argument's bounds: (1, 5), (1, 5), (1, 5), (1, 5)
-  Argument's scales: 1, 1, 1, 1
-  Number of constraints: 2
-  Constraint 0
-      a * b * c * d (twice derivable function)
-      Bounds: (25, inf)
-      Scales: 1
-      Initial value: [1](25)
-      
-  Constraint 1
-      a * a + b * b + c * c + d * d (twice derivable function)
-      Bounds: (40, 40)
-      Scales: 1
-      Initial value: [1](52)
-      
-  Starting point: [4](1,5,5,1)
-  Starting value: [1](12)
-  Infinity value (for all functions): inf
+Solver:
+  Problem:
+    a * d * (a + b + c) + d (twice derivable function)
+    Argument's bounds: (1, 5), (1, 5), (1, 5), (1, 5)
+    Argument's scales: 1, 1, 1, 1
+    Number of constraints: 2
+    Constraint 0
+        a * b * c * d (twice derivable function)
+        Bounds: (25, inf)
+        Scales: 1
+        Initial value: [1](25)
+        
+    Constraint 1
+        a * a + b * b + c * c + d * d (twice derivable function)
+        Bounds: (40, 40)
+        Scales: 1
+        Initial value: [1](52) (constraint not satisfied)
+        
+    Starting point: [4](1,5,5,1)
+    Starting value: [1](12)
+    Infinity value (for all functions): inf
+  Parameters:
+    ipopt.file_print_level (verbosity level for output file): 5
+    ipopt.mu_strategy (update strategy for barrier parameter): adaptive
+    ipopt.option_file_name (file name of options file (to overwrite default)): 
+    ipopt.output_file (file name of desired output file (leave unset for no 
file output)): 
+    ipopt.print_level (output verbosity level): 5
+    ipopt.print_options_documentation (switch to print all algorithmic 
options): no
+    ipopt.print_user_options (print all options set by the user): no
+    ipopt.tol (desired convergence tolerance (relative)): 1e-07
+    max-iterations (number of iterations): 3000
+    
 A solution has been found: 
 Result: 
   Size (input, output): 4, 1
diff --git a/tests/simple.stdout b/tests/simple.stdout
index ebcc32b..b285a32 100644
--- a/tests/simple.stdout
+++ b/tests/simple.stdout
@@ -1,23 +1,35 @@
-Problem:
-  a * d * (a + b + c) + d (twice derivable function)
-  Argument's bounds: (1, 5), (1, 5), (1, 5), (1, 5)
-  Argument's scales: 1, 1, 1, 1
-  Number of constraints: 2
-  Constraint 0
-      a * b * c * d (twice derivable function)
-      Bounds: (25, inf)
-      Scales: 1
-      Initial value: [1](25)
-      
-  Constraint 1
-      a * a + b * b + c * c + d * d (twice derivable function)
-      Bounds: (40, 40)
-      Scales: 1
-      Initial value: [1](52)
-      
-  Starting point: [4](1,5,5,1)
-  Starting value: [1](12)
-  Infinity value (for all functions): inf
+Solver:
+  Problem:
+    a * d * (a + b + c) + d (twice derivable function)
+    Argument's bounds: (1, 5), (1, 5), (1, 5), (1, 5)
+    Argument's scales: 1, 1, 1, 1
+    Number of constraints: 2
+    Constraint 0
+        a * b * c * d (twice derivable function)
+        Bounds: (25, inf)
+        Scales: 1
+        Initial value: [1](25)
+        
+    Constraint 1
+        a * a + b * b + c * c + d * d (twice derivable function)
+        Bounds: (40, 40)
+        Scales: 1
+        Initial value: [1](52) (constraint not satisfied)
+        
+    Starting point: [4](1,5,5,1)
+    Starting value: [1](12)
+    Infinity value (for all functions): inf
+  Parameters:
+    ipopt.file_print_level (verbosity level for output file): 5
+    ipopt.mu_strategy (update strategy for barrier parameter): adaptive
+    ipopt.option_file_name (file name of options file (to overwrite default)): 
+    ipopt.output_file (file name of desired output file (leave unset for no 
file output)): 
+    ipopt.print_level (output verbosity level): 5
+    ipopt.print_options_documentation (switch to print all algorithmic 
options): no
+    ipopt.print_user_options (print all options set by the user): no
+    ipopt.tol (desired convergence tolerance (relative)): 1e-07
+    max-iterations (number of iterations): 3000
+    
 A solution has been found: 
 Result: 
   Size (input, output): 4, 1

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                             |   16 ++++
 configure.ac                          |    2 +-
 include/roboptim/core/plugin/ipopt.hh |   21 +++++-
 src/Makefile.am                       |    5 +-
 src/roboptim-core-ipopt-plugin.cc     |  127 ++++++++++++++++++++++++++++++---
 tests/plugin.stdout                   |   52 ++++++++-----
 tests/simple.stdout                   |   52 ++++++++-----
 7 files changed, 222 insertions(+), 53 deletions(-)


hooks/post-receive
-- 
roboptim-core-plugin-ipopt

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
roboptim-commit mailing list
roboptim-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/roboptim-commit

Reply via email to