28 #include <eigen3/Eigen/Core> 31 using namespace Eigen;
35 void Parameterizable::setSelectedParameters(
const std::set<std::string>& selected_values_labels)
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;
46 getParameterVectorMask(selected_values_labels,selected_mask_);
49 int Parameterizable::getParameterVectorSelectedSize(
void)
const 52 for (
int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
53 if (selected_mask_[all_ii]>0)
59 void Parameterizable::getParameterVectorSelected(Eigen::VectorXd& values,
bool normalized)
const 61 Eigen::VectorXd all_values;
62 getParameterVectorAll(all_values);
64 values.resize(getParameterVectorSelectedSize());
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];
73 VectorXd min_vec, max_vec;
74 getParameterVectorSelectedMinMax(min_vec, max_vec);
76 VectorXd range = (max_vec.array()-min_vec.array());
77 for (
int ii=0; ii<values.size(); ii++)
81 values[ii] = (values[ii]-min_vec[ii])/range[ii];
85 if (abs(max_vec[ii])>0)
86 values[ii] = values[ii]/abs(2*max_vec[ii]);
95 void Parameterizable::setParameterVectorSelected(
const Eigen::VectorXd& values_arg,
bool normalized)
98 if (parameter_vector_all_initial_.size()==0)
99 getParameterVectorAll(parameter_vector_all_initial_);
102 getParameterVectorAll(all_values);
104 VectorXd values = values_arg;
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++)
114 values[ii] = values[ii]*range[ii] + min_vec[ii];
118 if (abs(max_vec[ii])>0)
119 values[ii] = values[ii]*abs(2*max_vec[ii]);
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++];
130 setParameterVectorAll(all_values);
134 void Parameterizable::getParameterVectorSelectedMinMax(Eigen::VectorXd& min_vec, Eigen::VectorXd& max_vec)
const 136 VectorXd all_min_vec, all_max_vec;
137 getParameterVectorAllMinMax(all_min_vec, all_max_vec);
139 min_vec.resize(getParameterVectorSelectedSize());
140 max_vec.resize(getParameterVectorSelectedSize());
144 for (
int all_ii=0; all_ii<selected_mask_.size(); all_ii++)
146 if (selected_mask_[all_ii]>0)
148 min_vec[ii] = all_min_vec[all_ii];
149 max_vec[ii] = all_max_vec[all_ii];
156 void Parameterizable::getParameterVectorAllMinMax(Eigen::VectorXd& min_vec, Eigen::VectorXd& max_vec)
const 158 set<string> all_selected_values_labels;
159 getSelectableParameters(all_selected_values_labels);
161 VectorXi selected_mask;
162 getParameterVectorMask(all_selected_values_labels, selected_mask);
165 if (parameter_vector_all_initial_.size()==0)
166 getParameterVectorAll(parameter_vector_all_initial_);
168 Eigen::VectorXd all_values = parameter_vector_all_initial_;
184 min_vec.resize(getParameterVectorAllSize());
185 max_vec.resize(getParameterVectorAllSize());
188 int n_blocks = selected_mask.maxCoeff();
189 for (
int i_block=1; i_block<=n_blocks; i_block++)
191 if ((selected_mask.array() == i_block).any())
194 double min_this_block = std::numeric_limits<double>::max();
195 double max_this_block = std::numeric_limits<double>::lowest();
198 for (
int all_ii=0; all_ii<selected_mask.size(); all_ii++)
200 if (selected_mask[all_ii]==i_block)
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);
208 for (
int all_ii=0; all_ii<selected_mask.size(); all_ii++)
210 if (selected_mask[all_ii]==i_block)
212 min_vec[all_ii] = min_this_block;
213 max_vec[all_ii] = max_this_block;
254 void Parameterizable::getParameterVectorSelected(std::vector<Eigen::VectorXd>& vector_values,
bool normalized)
const 257 getParameterVectorSelected(values,normalized);
259 if (lengths_per_dimension_.size()==0)
261 vector_values.resize(1);
262 vector_values[0] = values;
266 assert(values.size()==lengths_per_dimension_.sum());
268 vector_values.resize(lengths_per_dimension_.size());
270 for (
int i_dim=0; i_dim<lengths_per_dimension_.size(); i_dim++)
272 vector_values[i_dim] = values.segment(offset,lengths_per_dimension_[i_dim]);
273 offset += lengths_per_dimension_[i_dim];
278 void Parameterizable::setParameterVectorSelected(
const std::vector<Eigen::VectorXd>& vector_values,
bool normalized)
280 if (lengths_per_dimension_.size()==0)
282 assert(vector_values.size()==1);
283 assert(vector_values[0].size()==getParameterVectorSelectedSize());
284 setParameterVectorSelected(vector_values[0],normalized);
288 VectorXd values(lengths_per_dimension_.sum());
290 for (
int i_dim=0; i_dim<lengths_per_dimension_.size(); i_dim++)
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];
297 setParameterVectorSelected(values,normalized);
301 void Parameterizable::setParameterVectorModifier(std::string modifier,
bool new_value)
303 if (parameter_vector_all_initial_.size()>0)
305 cerr << __FILE__ <<
":" << __LINE__ <<
":";
306 cerr <<
"Warning: you can only set a ParameterVectorModifier if the intial state has not yet been determined." << endl;
309 setParameterVectorModifierPrivate(modifier, new_value);
Parameterizable class header file.