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