37 #include <bio_ik/goal.h> 39 #include "forward_kinematics.h" 42 #include <bio_ik/robot_info.h> 57 inline double random() {
return std::uniform_real_distribution<double>(0, 1)(rng); }
59 inline std::size_t random_index(std::size_t s) {
return std::uniform_int_distribution<size_t>(0, s - 1)(rng); }
61 std::normal_distribution<double> normal_distribution;
62 inline double random_gauss() {
return normal_distribution(rng); }
64 inline double random(
double min,
double max) {
return random() * (max - min) + min; }
66 template <
class e>
inline e& random_element(std::vector<e>& l) {
return l[random_index(l.size())]; }
68 template <
class e>
inline const e& random_element(
const std::vector<e>& l) {
return l[random_index(l.size())]; }
71 inline size_t fast_random_index(
size_t mod) {
return _xorshift() % mod; }
72 template <
class T>
inline const T& fast_random_element(
const std::vector<T>& v) {
return v[fast_random_index(v.size())]; }
74 static const size_t random_buffer_size = 1024 * 1024 * 8;
76 const double* make_random_buffer()
78 static std::vector<double> buf;
79 buf.resize(random_buffer_size);
84 const double* random_buffer;
85 size_t random_buffer_index;
86 inline double fast_random()
88 double r = random_buffer[random_buffer_index & (random_buffer_size - 1)];
89 random_buffer_index++;
93 const double* make_random_gauss_buffer()
96 static std::vector<double> buf;
97 buf.resize(random_buffer_size);
102 const double* random_gauss_buffer;
103 size_t random_gauss_index;
104 inline double fast_random_gauss()
106 double r = random_gauss_buffer[random_gauss_index & (random_buffer_size - 1)];
107 random_gauss_index++;
110 inline const double* fast_random_gauss_n(
size_t n)
112 size_t i = random_gauss_index;
113 random_gauss_index += n;
114 if(random_gauss_index >= random_buffer_size) i = 0, random_gauss_index = n;
115 return random_gauss_buffer + i;
119 : rng(std::random_device()())
121 random_buffer = make_random_buffer();
122 random_buffer_index = _xorshift();
123 random_gauss_buffer = make_random_gauss_buffer();
124 random_gauss_index = _xorshift();
135 std::vector<Frame> null_tip_frames;
136 volatile int canceled;
138 virtual void step() = 0;
140 virtual const std::vector<double>& getSolution()
const = 0;
142 virtual void setParams(
const IKParams& p) {}
145 : model(p.robot_model)
146 , modelInfo(p.robot_model)
153 virtual void initialize(
const Problem& problem)
155 this->problem = problem;
156 this->problem.initialize2();
157 model.initialize(problem.tip_link_indices);
159 null_tip_frames.resize(problem.tip_link_indices.size());
162 double computeSecondaryFitnessActiveVariables(
const double* active_variable_positions) {
return problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions); }
164 double computeSecondaryFitnessAllVariables(
const std::vector<double>& variable_positions) {
return computeSecondaryFitnessActiveVariables(extractActiveVariables(variable_positions)); }
166 double computeFitnessActiveVariables(
const std::vector<Frame>& tip_frames,
const double* active_variable_positions) {
return problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); }
168 double computeFitnessActiveVariables(
const aligned_vector<Frame>& tip_frames,
const double* active_variable_positions) {
return problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); }
170 double computeCombinedFitnessActiveVariables(
const std::vector<Frame>& tip_frames,
const double* active_variable_positions)
173 ret += problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions);
174 ret += problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions);
178 double computeCombinedFitnessActiveVariables(
const aligned_vector<Frame>& tip_frames,
const double* active_variable_positions)
181 ret += problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions);
182 ret += problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions);
186 bool checkSolutionActiveVariables(
const std::vector<Frame>& tip_frames,
const double* active_variable_positions) {
return problem.checkSolutionActiveVariables(tip_frames, active_variable_positions); }
188 bool checkSolution(
const std::vector<double>& variable_positions,
const std::vector<Frame>& tips) {
return checkSolutionActiveVariables(tips, extractActiveVariables(variable_positions)); }
190 std::vector<double> temp_active_variable_positions;
192 double* extractActiveVariables(
const std::vector<double>& variable_positions)
194 temp_active_variable_positions.resize(problem.active_variables.size());
195 for(
size_t i = 0; i < temp_active_variable_positions.size(); i++)
196 temp_active_variable_positions[i] = variable_positions[problem.active_variables[i]];
197 return temp_active_variable_positions.data();
200 double computeFitness(
const std::vector<double>& variable_positions,
const std::vector<Frame>& tip_frames) {
return computeFitnessActiveVariables(tip_frames, extractActiveVariables(variable_positions)); }
202 double computeFitness(
const std::vector<double>& variable_positions)
204 model.applyConfiguration(variable_positions);
205 return computeFitness(variable_positions, model.getTipFrames());
208 virtual size_t concurrency()
const {
return 1; }