static void celt_pvq_search(float *X, int *y, int K, int N)

{

    int i;

    float res = 0.0f, y_norm = 0.0f, xy_norm = 0.0f;



    for (i = 0; i < N; i++)

        res += FFABS(X[i]);



    res = K/res;



    for (i = 0; i < N; i++) {

        y[i] = lrintf(res*X[i]);

        y_norm  += y[i]*y[i];

        xy_norm += y[i]*X[i];

        K -= FFABS(y[i]);

    }



    while (K) {

        int max_idx = 0, phase = FFSIGN(K);

        float max_den = 1.0f, max_num = 0.0f;

        y_norm += 1.0f;



        for (i = 0; i < N; i++) {

            float xy_new = xy_norm + 1*phase*FFABS(X[i]);

            float y_new  = y_norm  + 2*phase*FFABS(y[i]);

            xy_new = xy_new * xy_new;

            /* FIXME: the y[i] check makes the search slightly worse at Ks below 5 */

            if (y[i] && (max_den*xy_new) > (y_new*max_num)) {

                max_den = y_new;

                max_num = xy_new;

                max_idx = i;

            }

        }



        K -= phase;



        phase *= FFSIGN(X[max_idx]);

        xy_norm += 1*phase*X[max_idx];

        y_norm  += 2*phase*y[max_idx];

        y[max_idx] += phase;

    }

}

static void celt_pvq_search(float *X, int *y, int K, int N)

{

    int i;

    float res = 0.0f, y_norm = 0.0f, xy_norm = 0.0f;



    for (i = 0; i < N; i++)

        res += FFABS(X[i]);



    res = K/res;



    for (i = 0; i < N; i++) {

        y[i] = lrintf(res*X[i]);

        y_norm  += y[i]*y[i];

        xy_norm += y[i]*X[i];

        K -= FFABS(y[i]);

    }



    while (K) {

        int max_idx = 0, phase = FFSIGN(K);

        float max_den = 1.0f, max_num = 0.0f;

        y_norm += 1.0f;



        for (i = 0; i < N; i++) {

            float xy_new = xy_norm + 1*phase*FFABS(X[i]);

            float y_new  = y_norm  + 2*phase*FFABS(y[i]);

            xy_new = xy_new * xy_new;

            

            if (y[i] && (max_den*xy_new) > (y_new*max_num)) {

                max_den = y_new;

                max_num = xy_new;

                max_idx = i;

            }

        }



        K -= phase;



        phase *= FFSIGN(X[max_idx]);

        xy_norm += 1*phase*X[max_idx];

        y_norm  += 2*phase*y[max_idx];

        y[max_idx] += phase;

    }

}

static void FUNC_0(float *VAR_0, int *VAR_1, int VAR_2, int VAR_3)

{

    int VAR_4;

    float VAR_5 = 0.0f, VAR_6 = 0.0f, VAR_7 = 0.0f;



    for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++)

        VAR_5 += FFABS(VAR_0[VAR_4]);



    VAR_5 = VAR_2/VAR_5;



    for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++) {

        VAR_1[VAR_4] = lrintf(VAR_5*VAR_0[VAR_4]);

        VAR_6  += VAR_1[VAR_4]*VAR_1[VAR_4];

        VAR_7 += VAR_1[VAR_4]*VAR_0[VAR_4];

        VAR_2 -= FFABS(VAR_1[VAR_4]);

    }



    while (VAR_2) {

        int VAR_8 = 0, VAR_9 = FFSIGN(VAR_2);

        float VAR_10 = 1.0f, VAR_11 = 0.0f;

        VAR_6 += 1.0f;



        for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++) {

            float VAR_12 = VAR_7 + 1*VAR_9*FFABS(VAR_0[VAR_4]);

            float VAR_13  = VAR_6  + 2*VAR_9*FFABS(VAR_1[VAR_4]);

            VAR_12 = VAR_12 * VAR_12;

            

            if (VAR_1[VAR_4] && (VAR_10*VAR_12) > (VAR_13*VAR_11)) {

                VAR_10 = VAR_13;

                VAR_11 = VAR_12;

                VAR_8 = VAR_4;

            }

        }



        VAR_2 -= VAR_9;



        VAR_9 *= FFSIGN(VAR_0[VAR_8]);

        VAR_7 += 1*VAR_9*VAR_0[VAR_8];

        VAR_6  += 2*VAR_9*VAR_1[VAR_8];

        VAR_1[VAR_8] += VAR_9;

    }

}

static void FUNC_0(float *VAR_0, int *VAR_1, int VAR_2, int VAR_3)
{ int VAR_4; float VAR_5 = 0.0f, VAR_6 = 0.0f, VAR_7 = 0.0f; for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++) VAR_5 += FFABS(VAR_0[VAR_4]); VAR_5 = VAR_2/VAR_5; for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++) { VAR_1[VAR_4] = lrintf(VAR_5*VAR_0[VAR_4]); VAR_6  += VAR_1[VAR_4]*VAR_1[VAR_4]; VAR_7 += VAR_1[VAR_4]*VAR_0[VAR_4]; VAR_2 -= FFABS(VAR_1[VAR_4]); } while (VAR_2) { int VAR_8 = 0, VAR_9 = FFSIGN(VAR_2); float VAR_10 = 1.0f, VAR_11 = 0.0f; VAR_6 += 1.0f; for (VAR_4 = 0; VAR_4 < VAR_3; VAR_4++) { float VAR_12 = VAR_7 + 1*VAR_9*FFABS(VAR_0[VAR_4]); float VAR_13  = VAR_6  + 2*VAR_9*FFABS(VAR_1[VAR_4]); VAR_12 = VAR_12 * VAR_12; if (VAR_1[VAR_4] && (VAR_10*VAR_12) > (VAR_13*VAR_11)) { VAR_10 = VAR_13; VAR_11 = VAR_12; VAR_8 = VAR_4; } } VAR_2 -= VAR_9; VAR_9 *= FFSIGN(VAR_0[VAR_8]); VAR_7 += 1*VAR_9*VAR_0[VAR_8]; VAR_6  += 2*VAR_9*VAR_1[VAR_8]; VAR_1[VAR_8] += VAR_9; } }