36 #ifndef SHARK_ALGORITHMS_QP_QPSOLVER_H 37 #define SHARK_ALGORITHMS_QP_QPSOLVER_H 46 template<
class MatrixT>
54 : quadratic(quadratic)
73 RealVector
const& regularizers
74 ): quadratic(quadratic)
89 double Cn = regularizers[0];
90 double Cp = regularizers[0];
91 if(regularizers.size() == 2)
95 unsigned int label = labels.
element(i);
96 double weight = weights.
element(i);
99 linear(i) = label? 1.0:-1.0;
100 boxMin(i) = label? 0.0:-Cn*weight;
101 boxMax(i) = label? Cp*weight : 0.0;
156 template<
class MatrixT>
164 : quadratic(quadratic)
175 for(std::size_t i = 0; i!=
dimensions(); ++i){
177 diagonal(i) = quadratic.entry(i, i);
211 quadratic.flipColumnsAndRows(i, j);
234 template<
class MatrixT>
242 : quadratic(quadratic)
247 , positive(quadratic.
size())
255 for(std::size_t i = 0; i!=
dimensions(); ++i){
257 diagonal(i) = quadratic.entry(i, i);
259 positive[i] =
linear(i) > 0;
264 : quadratic(quadratic)
269 , positive(quadratic.
size())
277 m_Cp = m_Cn = regularizers[0];
278 if(regularizers.size() == 2)
279 m_Cp = regularizers[1];
282 for(std::size_t i = 0; i!=
dimensions(); ++i){
284 diagonal(i) = quadratic.entry(i, i);
286 positive[i] =
linear(i) > 0;
292 : quadratic(quadratic)
297 , positive(quadratic.
size())
305 for(std::size_t i = 0; i!=
dimensions(); ++i){
307 diagonal(i) = quadratic.entry(i, i);
308 positive[i] = labels.
element(i) ? 1: 0;
317 return positive[i] ? 0.0 : -m_Cn;
320 return positive[i] ? m_Cp : 0.0;
342 quadratic.flipColumnsAndRows(i, j);
352 bool sameFactor = factor == variableScalingFactor;
353 double newCp = m_Cp*factor;
354 double newCn = m_Cn*factor;
355 for(std::size_t i = 0; i !=
dimensions(); ++i){
356 if(sameFactor &&
alpha(i)== m_Cp)
358 else if(sameFactor &&
alpha(i) == -m_Cn)
361 alpha(i) *= variableScalingFactor;
371 std::vector<char> positive;
390 template<
class Problem,
class SelectionStrategy =
typename Problem::PreferedSelectionStrategy >
396 ):m_problem(problem){}
403 unsigned long long iter = 0;
404 unsigned long long shrinkCounter = 0;
406 SelectionStrategy workingSet;
416 if (stop.
maxSeconds < 1e100 && (iter+1) % 1000 == 0 ){
418 if (current_time - start_time > stop.
maxSeconds){
419 if (prop != NULL) prop->type =
QpTimeout;
424 std::size_t i = 0, j = 0;
425 if (workingSet(m_problem,i, j) < stop.
minAccuracy){
426 m_problem.unshrink();
432 workingSet(m_problem,i,j);
437 m_problem.updateSMO(i,j);
441 if(shrinkCounter == 0 && m_problem.shrink(stop.
minAccuracy)){
442 shrinkCounter = std::max<std::size_t>(1000,m_problem.dimensions());
453 std::size_t i = 0, j = 0;
454 prop->accuracy = workingSet(m_problem,i, j);
455 prop->value = m_problem.functionValue();
456 prop->iterations = iter;
457 prop->seconds = finish_time - start_time;