Skip to content

Commit 18baec7

Browse files
author
Benjamin Chrétien
committed
Add optional optimization logger support.
1 parent abed0a1 commit 18baec7

5 files changed

Lines changed: 52 additions & 9 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ SET(${PROJECT_NAME}_HEADERS
2828
SETUP_PROJECT()
2929

3030
# Declare dependencies
31+
SET(BOOST_COMPONENTS
32+
date_time filesystem system thread program_options unit_test_framework)
3133
SEARCH_FOR_BOOST()
3234
SEARCH_FOR_QHULL()
3335
ADD_REQUIRED_DEPENDENCY("eigen3 >= 3.2.0")

include/roboptim/capsule/fitter.hh

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#ifndef ROBOPTIM_CAPSULE_FITTER_HH
2525
# define ROBOPTIM_CAPSULE_FITTER_HH
2626

27+
# include <boost/optional.hpp>
28+
2729
# include <roboptim/core/solver-factory.hh>
2830

2931
# include <roboptim/capsule/types.hh>
@@ -60,10 +62,14 @@ namespace roboptim
6062
value_type solutionVolume () const;
6163

6264
/// \brief Get initial capsule parameters.
63-
const argument_t initParam () const;
65+
const argument_t& initParam () const;
6466

6567
/// \brief Get solution capsule parameters.
66-
const argument_t solutionParam () const;
68+
const argument_t& solutionParam () const;
69+
70+
/// \brief Get the optional optimization log directory.
71+
boost::optional<std::string>& logDirectory ();
72+
const boost::optional<std::string>& logDirectory () const;
6773

6874
/// \brief Compute best fitting capsule over polyhedron.
6975
///
@@ -87,7 +93,7 @@ namespace roboptim
8793
///
8894
/// \param initParam initial capsule parameters
8995
/// \return capsule parameters
90-
const argument_t computeBestFitCapsuleParam (const_argument_ref
96+
const argument_t& computeBestFitCapsuleParam (const_argument_ref
9197
initParam);
9298

9399
/// \brief Compute best fitting capsule over polyhedron.
@@ -97,7 +103,7 @@ namespace roboptim
97103
///
98104
/// \param initParam initial capsule parameters
99105
/// \return capsule parameters
100-
const argument_t computeBestFitCapsuleParam (const polyhedrons_t&
106+
const argument_t& computeBestFitCapsuleParam (const polyhedrons_t&
101107
polyhedrons,
102108
const_argument_ref
103109
initParam);
@@ -130,6 +136,9 @@ namespace roboptim
130136

131137
/// \brief Nonlinear solver.
132138
std::string solver_;
139+
140+
/// \brief Optional optimization log directory.
141+
boost::optional<std::string> logDir_;
133142
};
134143

135144
/// \brief Print fitter after optimal capsule has been computed.

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ ADD_LIBRARY(${LIBRARY_NAME} SHARED
1212

1313
SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
1414

15-
TARGET_LINK_LIBRARIES(${LIBRARY_NAME} ${QHULL_LIBRARIES})
15+
TARGET_LINK_LIBRARIES(${LIBRARY_NAME} ${QHULL_LIBRARIES} boost_filesystem)
1616
PKG_CONFIG_USE_DEPENDENCY(${LIBRARY_NAME} roboptim-core)
1717
PKG_CONFIG_USE_DEPENDENCY(${LIBRARY_NAME} roboptim-core-plugin-ipopt)
1818

src/capsule-generator.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ int main(int argc, char** argv)
4343
desc.add_options ()
4444
("help", "Print this help and exit")
4545
("solver", po::value<std::string> (), "Nonlinear solver used")
46+
("log-dir", po::value<std::string> (), "Path to optimization logs")
4647
("points", po::value<std::vector<double> > ()->multitoken ()->required (),
4748
"Points that will be encapsulated");
4849

@@ -110,6 +111,12 @@ int main(int argc, char** argv)
110111
// Create fitter
111112
Fitter fitter (polyhedrons, solver);
112113

114+
// Load (optional) log directory
115+
if (vm.count ("log-dir"))
116+
{
117+
fitter.logDirectory () = vm["log-dir"].as<std::string> ();
118+
}
119+
113120
// Compute initial guess
114121
point_t P0;
115122
point_t P1;

src/fitter.cc

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,13 @@
2828
# include <math.h>
2929
# include <sstream>
3030

31+
# include <boost/shared_ptr.hpp>
32+
# include <boost/make_shared.hpp>
33+
# include <boost/ref.hpp>
34+
3135
# include <roboptim/core/finite-difference-gradient.hh>
3236
# include <roboptim/core/linear-function.hh>
37+
# include <roboptim/core/optimization-logger.hh>
3338

3439
# include <roboptim/capsule/fitter.hh>
3540

@@ -86,7 +91,7 @@ namespace roboptim
8691
return solutionVolume_;
8792
}
8893

89-
const argument_t Fitter::
94+
const argument_t& Fitter::
9095
initParam () const
9196
{
9297
assert (initParam_.size () == 7
@@ -95,7 +100,7 @@ namespace roboptim
95100
return initParam_;
96101
}
97102

98-
const argument_t Fitter::
103+
const argument_t& Fitter::
99104
solutionParam () const
100105
{
101106
assert (solutionParam_.size () == 7
@@ -104,6 +109,16 @@ namespace roboptim
104109
return solutionParam_;
105110
}
106111

112+
boost::optional<std::string>& Fitter::logDirectory ()
113+
{
114+
return logDir_;
115+
}
116+
117+
const boost::optional<std::string>& Fitter::logDirectory () const
118+
{
119+
return logDir_;
120+
}
121+
107122
void Fitter::
108123
computeBestFitCapsule (const_argument_ref initParam)
109124
{
@@ -117,15 +132,15 @@ namespace roboptim
117132
impl_computeBestFitCapsuleParam (polyhedrons, initParam, solutionParam_);
118133
}
119134

120-
const argument_t Fitter::
135+
const argument_t& Fitter::
121136
computeBestFitCapsuleParam (const_argument_ref initParam)
122137
{
123138
impl_computeBestFitCapsuleParam (polyhedrons_, initParam, solutionParam_);
124139

125140
return solutionParam_;
126141
}
127142

128-
const argument_t Fitter::
143+
const argument_t& Fitter::
129144
computeBestFitCapsuleParam (const polyhedrons_t& polyhedrons,
130145
const_argument_ref initParam)
131146
{
@@ -210,6 +225,16 @@ namespace roboptim
210225
solver.parameters ()["ipopt.mu_strategy"].value = "adaptive";
211226
solver.parameters ()["ipopt.nlp_scaling_method"].value = "gradient-based";
212227

228+
// Set optimization logger if a log directory was provided.
229+
// Note: actual logging to file is done once the OptimizationLogger is
230+
// destroyed.
231+
boost::shared_ptr<OptimizationLogger<solver_t> > logger;
232+
if (logDir_)
233+
{
234+
// Add optimization logger.
235+
logger = boost::make_shared<OptimizationLogger<solver_t> > (boost::ref (solver), *logDir_);
236+
}
237+
213238
// Solve problem and check if the optimum is correct.
214239
solver_t::result_t result = solver.minimum ();
215240

0 commit comments

Comments
 (0)