37 #include "cppoptlib/boundedproblem.h" 38 #include "cppoptlib/meta.h" 39 #include "cppoptlib/problem.h" 75 std::vector<double> fk_values;
77 : cppoptlib::BoundedProblem<double>(TVector(ik->problem.active_variables.size()), TVector(ik->problem.active_variables.size()))
81 for(
size_t i = 0; i < ik->problem.active_variables.size(); i++)
83 m_lowerBound[i] = ik->modelInfo.getMin(ik->problem.active_variables[i]);
84 m_upperBound[i] = ik->modelInfo.getMax(ik->problem.active_variables[i]);
92 fk_values = ik->problem.initial_guess;
94 double value(
const TVector& x)
97 for(
size_t i = 0; i < ik->problem.active_variables.size(); i++)
98 fk_values[ik->problem.active_variables[i]] = x[i];
102 return ik->computeFitness(fk_values);
104 bool callback(
const cppoptlib::Criteria<double>& state,
const TVector& x)
107 return ros::WallTime::now().toSec() < ik->problem.timeout;
112 template <
class SOLVER,
int reset_if_stuck,
int threads>
struct IKOptLib :
IKBase 115 std::vector<double> solution, best_solution, temp;
118 std::shared_ptr<SOLVER> solver;
127 cppoptlib::Criteria<double> crit;
135 void initialize(
const Problem& problem)
137 IKBase::initialize(problem);
140 solution = problem.initial_guess;
144 if(thread_index > 0) reset =
true;
147 best_solution = solution;
154 crit = cppoptlib::Criteria<double>::defaults();
156 crit.gradNorm = 1e-10;
159 if(!solver) solver = std::make_shared<SOLVER>();
162 const std::vector<double>& getSolution()
const {
return best_solution; }
167 solver->setStopCriteria(crit);
174 for(
auto& vi : problem.active_variables)
175 solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi));
180 typename SOLVER::TVector x(problem.active_variables.size());
181 for(
size_t i = 0; i < problem.active_variables.size(); i++)
182 x[i] = temp[problem.active_variables[i]];
185 solver->minimize(f, x);
188 for(
size_t i = 0; i < problem.active_variables.size(); i++)
189 temp[problem.active_variables[i]] = x[i];
192 if(computeFitness(temp) < computeFitness(solution))
198 if(reset_if_stuck) reset =
true;
202 if(computeFitness(solution) < computeFitness(best_solution))
204 best_solution = solution;
208 size_t concurrency()
const {
return threads; }
212 static std::string mkoptname(std::string name,
int reset,
int threads)
214 name =
"optlib_" + name;
215 if(reset) name +=
"_r";
216 if(threads > 1) name +=
"_" + std::to_string(threads);
220 #define IKCPPOPTX(n, t, reset, threads) static bio_ik::IKFactory::Class<bio_ik::IKOptLib<cppoptlib::t<bio_ik::IKOptLibProblem>, reset, threads>> ik_optlib_##t##reset##threads(mkoptname(n, reset, threads)); 224 #define IKCPPOPT(n, t) \ 225 IKCPPOPTX(n, t, 0, 1) \ 226 IKCPPOPTX(n, t, 0, 2) \ 227 IKCPPOPTX(n, t, 0, 4) \ 228 IKCPPOPTX(n, t, 1, 1) \ 229 IKCPPOPTX(n, t, 1, 2) \ 230 IKCPPOPTX(n, t, 1, 4) 232 #include "cppoptlib/solver/bfgssolver.h" 233 IKCPPOPT(
"bfgs", BfgsSolver);
241 #include "cppoptlib/solver/conjugatedgradientdescentsolver.h" 242 IKCPPOPT(
"cgd", ConjugatedGradientDescentSolver);
244 #include "cppoptlib/solver/gradientdescentsolver.h" 245 IKCPPOPT(
"gd", GradientDescentSolver);
247 #include "cppoptlib/solver/lbfgsbsolver.h" 248 IKCPPOPT(
"lbfgsb", LbfgsbSolver);
250 #include "cppoptlib/solver/lbfgssolver.h" 251 IKCPPOPT(
"lbfgs", LbfgsSolver);
253 #include "cppoptlib/solver/neldermeadsolver.h" 254 IKCPPOPT(
"nm", NelderMeadSolver);
256 #include "cppoptlib/solver/newtondescentsolver.h" 257 IKCPPOPT(
"nd", NewtonDescentSolver);