#ifndef GRADIENT_H_INCLUDED
#define GRADIENT_H_INCLUDED

#include <stdio.h>

#define TAU      0.01
#define OMEGA    0.0001

#define MAX_ITER 100000

/**
 * Approxime le gradient de la fonction passer en paramètre aux coordonnées fournies
 * @param function
 * @param x
 * @param dimension
 * @param delta
 * @return 
 */
double* approximateGradient(
    double (*function)(const double[]),
    double x[],
    size_t dimension,
    double delta);
/**
 * Calcul de la norme euclidienne
 */
double  normeEuclidienne(
    const double x[],
    const size_t dimension);

/**
 * Renvoi l'erreur entre la solution et le vecteur en param�tre
 */
double  error(
    unsigned int dimension,
    double x[],
    double solution[]);

/** M�thode du gradient � pas optimal */
void resolveGradientOptimal(
    const double (*function)(double vector[],size_t dimension), /* objective function*/
    const double vector0[],                                     /* initial vector */
    const size_t vector_dimension,                              /* vecteur dimension */
    double pas,                                                 /* step */
    double epsilon,                                             /* epsilon */
    int    max_iter                                             /* maximum iteration */
);
/** M�thode du gradient � pas fixe */
void resolveByGradientPasFixe(
    const double (*function)(double vector[],size_t dimension), /* objective function*/
    const double vector0[],                                     /* initial vector */
    const size_t vector_dimension,                              /* vecteur dimension */
    double pas,                                                 /* step */
    double epsilon,                                             /* epsilon */
    int    max_iter                                             /* maximum iteration */
);

#endif // GRADIENT_H_INCLUDED
