Encog.MathUtil.LIBSVM.Solver.select_working_set C# (CSharp) Method

select_working_set() private method

private select_working_set ( int working_set ) : int
working_set int
return int
        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;
        }