#include <stdlib.h>
#include <math.h>

#include "logger.h"
#include "utilities.h"


double*     F(
    const double x[],
    const size_t dimension)
{
    static double result[1] = {0};

    if( dimension != 2 ){
        perror("Wrong dimension for 'f' function");
        return NULL; // Fonction de R^3 vers R
    }

    result[0] = (x[0] - x[1] * x[1] - M_PI) * (x[0] - x[1] * x[1] - M_PI) + 10 * cos(x[0]);

    return result;
}

double* gradientF(const double x[])
{
    double* result;//FIXME BAD BAD BAD
    result = (double *) malloc(2 * sizeof(double));

    result[0] = 2.0 * (x[0] - x[1] * x[1] - M_PI) - 10.0 * sin(x[0]);
    result[1] = - 4.0 * x[1] * (x[0] - x[1] * x[1] - M_PI);

    logMessage(DEBUG,"\tdx",doubleToString(result[0]));
    logMessage(DEBUG,"\tdy",doubleToString(result[1]));

    return result;
}

double*     G(
    const double x[],
    const size_t dimension)
{
    static double result[1] = {0};

    if( dimension != 2 ){
        perror("Wrong dimension for 'G' function");
        return NULL; // Fonction de R^3 vers R
    }

    result[0] = x[0] * x[0] + x[1] * x[1];

    return result;
}

double* gradientG(const double x[])
{
    double* result;//FIXME BAD BAD BAD
    result = (double *) malloc(2 * sizeof(double));

    result[0] = 2.0 * x[0];
    result[1] = 2.0 * x[1];

    return result;
}
