DMP_BBO library
Parameterizable.cpp
Go to the documentation of this file.
1 
25 
26 #include <iostream>
27 #include <limits>
28 #include <eigen3/Eigen/Core>
29 
30 using namespace std;
31 using namespace Eigen;
32 
33 namespace DmpBbo {
34 
35 void Parameterizable::setSelectedParameters(const std::set<std::string>& selected_values_labels)
36 {
37 
38  // Check if all labels passed are actually possible
39  set<string> possible_values_labels;
40  getSelectableParameters(possible_values_labels);
41  set<string>::iterator it;
42  for (it = selected_values_labels.begin(); it != selected_values_labels.end(); ++it)
43  if (possible_values_labels.count(*it)==0)
44  cout << "WARNING: '" << *it << "' is an unknown label in Parameterizable." << endl;
45 
46  getParameterVectorMask(selected_values_labels,selected_mask_);
47 }
48 
49 int Parameterizable::getParameterVectorSelectedSize(void) const
50 {
51  int all_size = 0;
52  for (int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
53  if (selected_mask_[all_ii]>0)
54  all_size++;
55 
56  return all_size;
57 }
58 
59 void Parameterizable::getParameterVectorSelected(Eigen::VectorXd& values, bool normalized) const
60 {
61  Eigen::VectorXd all_values;
62  getParameterVectorAll(all_values);
63 
64  values.resize(getParameterVectorSelectedSize());
65  // We cannot do this with Block, because regions might not be contiguous
66  int ii = 0;
67  for (int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
68  if (selected_mask_[all_ii]>0)
69  values[ii++] = all_values[all_ii];
70 
71  if (normalized)
72  {
73  VectorXd min_vec, max_vec;
74  getParameterVectorSelectedMinMax(min_vec, max_vec);
75 
76  VectorXd range = (max_vec.array()-min_vec.array());
77  for (int ii=0; ii<values.size(); ii++)
78  {
79  if (range[ii]>0)
80  {
81  values[ii] = (values[ii]-min_vec[ii])/range[ii];
82  }
83  else
84  {
85  if (abs(max_vec[ii])>0)
86  values[ii] = values[ii]/abs(2*max_vec[ii]);
87  }
88  }
89 
90  }
91 
92 }
93 
94 
95 void Parameterizable::setParameterVectorSelected(const Eigen::VectorXd& values_arg, bool normalized)
96 {
97  // If the initial parameter vector is still empty, get it now, before changing its value.
98  if (parameter_vector_all_initial_.size()==0)
99  getParameterVectorAll(parameter_vector_all_initial_);
100 
101  VectorXd all_values;
102  getParameterVectorAll(all_values);
103 
104  VectorXd values = values_arg;
105  if (normalized)
106  {
107  VectorXd min_vec, max_vec, range;
108  getParameterVectorSelectedMinMax(min_vec, max_vec);
109  range = (max_vec.array()-min_vec.array());
110  for (int ii=0; ii<values.size(); ii++)
111  {
112  if (range[ii]>0)
113  {
114  values[ii] = values[ii]*range[ii] + min_vec[ii];
115  }
116  else
117  {
118  if (abs(max_vec[ii])>0)
119  values[ii] = values[ii]*abs(2*max_vec[ii]);
120  }
121  }
122  }
123 
124  // We cannot do this with Eigen::Block, because regions might not be contiguous
125  int ii = 0;
126  for (int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
127  if (selected_mask_[all_ii]>0)
128  all_values[all_ii] = values[ii++];
129 
130  setParameterVectorAll(all_values);
131 
132 }
133 
134 void Parameterizable::getParameterVectorSelectedMinMax(Eigen::VectorXd& min_vec, Eigen::VectorXd& max_vec) const
135 {
136  VectorXd all_min_vec, all_max_vec;
137  getParameterVectorAllMinMax(all_min_vec, all_max_vec);
138 
139  min_vec.resize(getParameterVectorSelectedSize());
140  max_vec.resize(getParameterVectorSelectedSize());
141 
142  // We cannot do this with Eigen::Block, because regions might not be contiguous
143  int ii = 0;
144  for (int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
145  {
146  if (selected_mask_[all_ii]>0)
147  {
148  min_vec[ii] = all_min_vec[all_ii];
149  max_vec[ii] = all_max_vec[all_ii];
150  ii++;
151  }
152  }
153 
154 }
155 
156 void Parameterizable::getParameterVectorAllMinMax(Eigen::VectorXd& min_vec, Eigen::VectorXd& max_vec) const
157 {
158  set<string> all_selected_values_labels;
159  getSelectableParameters(all_selected_values_labels);
160 
161  VectorXi selected_mask;
162  getParameterVectorMask(all_selected_values_labels, selected_mask);
163 
164  // If the initial parameter vector is still empty, get it now.
165  if (parameter_vector_all_initial_.size()==0)
166  getParameterVectorAll(parameter_vector_all_initial_);
167 
168  Eigen::VectorXd all_values = parameter_vector_all_initial_;
169 
170  // Example:
171  // selected_mask = [ 1 1 1 2 2 2 3 3 3 1 1 1 ]
172  // all_values = [ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 20.0 21.0 22.0 ]
173  //
174  // For all blocks in selected_mask, compute the min/max in all_values for that block.
175  // In the example above
176  // block 1 : min = 1.0; max = 22.0;
177  // block 2 : min = 4.0; max = 6.0;
178  // block 3 : min = 7.0; max = 9.0;
179  //
180  // Then min_vec and max_vec will be as follows:
181  // min_vec = [ 1.0 1.0 1.0 4.0 4.0 4.0 7.0 7.0 7.0 1.0 1.0 1.0 ]
182  // max_vec = [ 3.0 3.0 3.0 6.0 6.0 6.0 9.0 9.0 9.0 20.0 21.0 22.0 ]
183 
184  min_vec.resize(getParameterVectorAllSize());
185  max_vec.resize(getParameterVectorAllSize());
186 
187  // We cannot do this with Eigen::Block, because regions might not be contiguous
188  int n_blocks = selected_mask.maxCoeff();
189  for (int i_block=1; i_block<=n_blocks; i_block++)
190  {
191  if ((selected_mask.array() == i_block).any())
192  {
193  // Initialize values to extrema
194  double min_this_block = std::numeric_limits<double>::max();
195  double max_this_block = std::numeric_limits<double>::lowest();
196 
197  // Determine the min/max values in this block
198  for (int all_ii=0; all_ii<selected_mask.size(); all_ii++)
199  {
200  if (selected_mask[all_ii]==i_block)
201  {
202  min_this_block =(all_values[all_ii]<min_this_block ? all_values[all_ii] : min_this_block);
203  max_this_block =(all_values[all_ii]>max_this_block ? all_values[all_ii] : max_this_block);
204  }
205  }
206 
207  // Set the min/max for this block
208  for (int all_ii=0; all_ii<selected_mask.size(); all_ii++)
209  {
210  if (selected_mask[all_ii]==i_block)
211  {
212  min_vec[all_ii] = min_this_block;
213  max_vec[all_ii] = max_this_block;
214  }
215  }
216 
217  //cout << "_________________" << endl;
218  //cout << " i_block=" << i_block << endl;
219  //cout << " min_this_block=" << min_this_block << endl;
220  //cout << " max_this_block=" << max_this_block << endl;
221  //cout << min_vec.transpose() << endl;
222  //cout << max_vec.transpose() << endl;
223  }
224 
225  }
226 
227 }
228 
229 
230 /*
231 void Parameterizable::getParameterVectorSelectedMinMax(Eigen::VectorXd& min_vec, Eigen::VectorXd& max_vec) const
232 {
233 
234  Eigen::VectorXd all_min_values, all_max_values;
235  getParameterVectorAllMinMax(all_min_values,all_max_values);
236 
237  min_vec.resize(getParameterVectorSelectedSize());
238  max_vec.resize(getParameterVectorSelectedSize());
239  // We cannot do this with Block, because regions might not be contiguous
240  int ii = 0;
241  for (int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
242  {
243  if (selected_mask_[all_ii]>0)
244  {
245  min_vec[ii] = all_min_values[all_ii];
246  max_vec[ii] = all_max_values[all_ii];
247  ii++;
248  }
249  }
250 }
251 */
252 
253 
254 void Parameterizable::getParameterVectorSelected(std::vector<Eigen::VectorXd>& vector_values, bool normalized) const
255 {
256  VectorXd values;
257  getParameterVectorSelected(values,normalized);
258 
259  if (lengths_per_dimension_.size()==0)
260  {
261  vector_values.resize(1);
262  vector_values[0] = values;
263  return;
264  }
265 
266  assert(values.size()==lengths_per_dimension_.sum());
267 
268  vector_values.resize(lengths_per_dimension_.size());
269  int offset = 0;
270  for (int i_dim=0; i_dim<lengths_per_dimension_.size(); i_dim++)
271  {
272  vector_values[i_dim] = values.segment(offset,lengths_per_dimension_[i_dim]);
273  offset += lengths_per_dimension_[i_dim];
274  }
275 
276 }
277 
278 void Parameterizable::setParameterVectorSelected(const std::vector<Eigen::VectorXd>& vector_values, bool normalized)
279 {
280  if (lengths_per_dimension_.size()==0)
281  {
282  assert(vector_values.size()==1);
283  assert(vector_values[0].size()==getParameterVectorSelectedSize());
284  setParameterVectorSelected(vector_values[0],normalized);
285  return;
286  }
287 
288  VectorXd values(lengths_per_dimension_.sum());
289  int offset = 0;
290  for (int i_dim=0; i_dim<lengths_per_dimension_.size(); i_dim++)
291  {
292  assert(vector_values[i_dim].size() == lengths_per_dimension_[i_dim]);
293  values.segment(offset,lengths_per_dimension_[i_dim]) = vector_values[i_dim];
294  offset += lengths_per_dimension_[i_dim];
295  }
296 
297  setParameterVectorSelected(values,normalized);
298 }
299 
300 
301 void Parameterizable::setParameterVectorModifier(std::string modifier, bool new_value)
302 {
303  if (parameter_vector_all_initial_.size()>0)
304  {
305  cerr << __FILE__ << ":" << __LINE__ << ":";
306  cerr << "Warning: you can only set a ParameterVectorModifier if the intial state has not yet been determined." << endl;
307  return;
308  }
309  setParameterVectorModifierPrivate(modifier, new_value);
310 }
311 
312 }
Parameterizable class header file.