95 void (*print_state)(libqp_state_T state))
122 state.exitflag = 100;
130 for( i=0, m=0; i < n; i++ )
158 for( i=0; i < m; i++ )
163 for( i=0; i < n; i++ ) {
181 for( i=0; i < n; i++ )
186 for( j=0; j < n; j++ ) {
187 d[j] += col_u[j]*x[i];
194 for( i=0, state.QP = 0, state.QD=0; i < n; i++)
196 state.QP += x[i]*(f[i]+d[i]);
197 state.QD += x[i]*(f[i]-d[i]);
199 state.QP = 0.5*state.QP;
200 state.QD = 0.5*state.QD;
202 for( i=0; i < m; i++ )
208 state.QD += b[i]*tmp;
214 if( print_state != NULL)
215 print_state( state );
220 while( state.exitflag == 100 )
225 for( k=0; k < m; k++ )
240 if(S[k] != 0 && d[u] > 0)
246 if( delta > TolAbs/m && delta > TolRel*
LIBQP_ABS(state.QP)/m)
253 for( j=0; j < nk[k]; j++ )
257 if(x[i] > 0 && i != uint32_t(u))
259 tmp_num = x[i]*(d[i] - d[u]);
260 tmp_den = x[i]*x[i]*(diag_H[u] - 2*col_u[i] + diag_H[i]);
263 if( tmp_num < tmp_den )
264 tmp = tmp_num*tmp_num / tmp_den;
266 tmp = tmp_num - 0.5 * tmp_den;
279 if(x_neq[k] > 0 && S[k] != 0)
281 tmp_num = -x_neq[k]*d[u];
282 tmp_den = x_neq[k]*x_neq[k]*diag_H[u];
285 if( tmp_num < tmp_den )
286 tmp = tmp_num*tmp_num / tmp_den;
288 tmp = tmp_num - 0.5 * tmp_den;
308 for(i = 0; i < n; i++ )
309 d[i] += tmp*(col_u[i]-col_v[i]);
318 for(i = 0; i < n; i++ )
319 d[i] += tmp*col_u[i];
325 for( j=0; j < nk[k]; j++ )
332 tmp_den = x[i]*x[i]*diag_H[i];
335 if( tmp_num < tmp_den )
336 tmp = tmp_num*tmp_num / tmp_den;
338 tmp = tmp_num - 0.5 * tmp_den;
356 for(i = 0; i < n; i++ )
357 d[i] -= tmp*col_v[i];
361 state.QP = state.QP - improv;
366 for( i=0, state.QP = 0, state.QD=0; i < n; i++)
368 state.QP += x[i]*(f[i]+d[i]);
369 state.QD += x[i]*(f[i]-d[i]);
371 state.QP = 0.5*state.QP;
372 state.QD = 0.5*state.QD;
374 for( k=0; k < m; k++ )
382 state.QD += b[k]*tmp;
388 if( print_state != NULL)
389 print_state( state );
392 if(state.QP-state.QD <=
LIBQP_ABS(state.QP)*TolRel ) state.exitflag = 1;
393 else if( state.QP-state.QD <= TolAbs ) state.exitflag = 2;
394 else if( state.QP <= QP_TH ) state.exitflag = 3;
395 else if( state.nIter >= MaxIter) state.exitflag = 0;