153 {
154 std::vector<T> cost;
155 int maxLevels=v[0][0].size();
156 if(maxFeatures<1)
157 maxFeatures=maxLevels;
158 int k=subset.size();
159 if(k>=maxFeatures)
160 return -1;
161 while(cost.size()<subset.size())
162 cost.push_back(1);
163 cost.push_back(addFeature(v,theCostFactory,subset,verbose));
164 ++k;
165 if(verbose>1)
166 std::cout << "added " << subset.back() << ", " << subset.size() << "/" << maxFeatures << " features selected with cost: " << cost.back() << std::endl;
167 else if(verbose){
168 for(std::list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)
169 std::cout << *lit << " ";
170 std::cout << std::endl;
171 }
172 while(k<maxFeatures){
173 cost.push_back(addFeature(v,theCostFactory,subset,verbose));
174 ++k;
175 if(verbose>1)
176 std::cout << "added " << subset.back() << ", " << subset.size() << "/" << maxFeatures << " features selected with cost: " << cost.back() << std::endl;
177 else if(verbose){
178 for(std::list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)
179 std::cout << *lit << " ";
180 std::cout << " (cost: " << cost.back() << ")" << std::endl;
181 }
182
183 while(k>1){
184 int x_r;
185 double cost_r=removeFeature(v,theCostFactory,subset,x_r,verbose);
186 if(cost_r>cost[k-1]+epsilon){
187 --k;
188 cost[k]=cost_r;
189 cost.pop_back();
190 if(verbose>1)
191 std::cout << "removed " << x_r << ", " << subset.size() << "/" << maxFeatures << " features remain with cost: " << cost_r << std::endl;
192 else if(verbose){
193 for(std::list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)
194 std::cout << *lit << " ";
195 std::cout << " (cost: " << cost.back() << ")" << std::endl;
196 }
197 continue;
198 }
199 else if(cost_r>=0){
200 subset.push_back(x_r);
201 break;
202 }
203 else if(verbose)
204 std::cout << "could not remove any feature" << std::endl;
205 cost.pop_back();
206 }
207 }
208 return cost.back();
209}