internal virtual int select_working_set(int[] working_set)
{
// return i,j which maximize -grad(f)^T d , under constraint
// if alpha_i == C, d != +1
// if alpha_i == 0, d != -1
double Gmax1 = - INF; // max { -grad(f)_i * d | y_i*d = +1 }
int Gmax1_idx = - 1;
double Gmax2 = - INF; // max { -grad(f)_i * d | y_i*d = -1 }
int Gmax2_idx = - 1;
for (int i = 0; i < active_size; i++)
{
if (y[i] == + 1)
// y = +1
{
if (!is_upper_bound(i))
// d = +1
{
if (- G[i] > Gmax1)
{
Gmax1 = - G[i];
Gmax1_idx = i;
}
}
if (!is_lower_bound(i))
// d = -1
{
if (G[i] > Gmax2)
{
Gmax2 = G[i];
Gmax2_idx = i;
}
}
}
// y = -1
else
{
if (!is_upper_bound(i))
// d = +1
{
if (- G[i] > Gmax2)
{
Gmax2 = - G[i];
Gmax2_idx = i;
}
}
if (!is_lower_bound(i))
// d = -1
{
if (G[i] > Gmax1)
{
Gmax1 = G[i];
Gmax1_idx = i;
}
}
}
}
if (Gmax1 + Gmax2 < eps)
return 1;
working_set[0] = Gmax1_idx;
working_set[1] = Gmax2_idx;
return 0;
}