/* 
 * File:   method.h
 * Author: Andréa
 *
 * Created on 15 octobre 2010, 15:35
 */

#ifndef METHOD_H
#define	METHOD_H

#include "configuration.h"
#include "persistentItem.h"
#include "problema.h"

/**
 * Save algorithm results in method buffer variables
 */
#define saveAlgorithmData(method,problem,params,complexity,optimum,optimum_value,error) \
    method->clearResult(method);                                                  \
    loadMethodParameters(&(method->parameters),params);                                 \
    method->_last_result = (double*) malloc(sizeof(double) * problem->_dimension);\
    memcpy(method->_last_result, optimum, sizeof(double) * problem->_dimension);  \
    method->_last_result_function_value = optimum_value;                          \
    method->_last_complexity = complexity;                                        \
    if(problem->_solution) method->_last_absolute_error = error;                  \
    method->_result_loaded = TRUE;

typedef struct _method            Method;

typedef void(* algorithm_method)
	(
	Problema*        pb,
	Method*          m,
	double           init_vector[],
	MethodParameters args
);

struct _method
{
    //data
    PersistentItem*  _db_item;
    char*            _name;
    algorithm_method _method_function;

    boolean          _result_loaded;

    MethodParameters parameters;

    // data buffer
    double*          _last_result;
    double           _last_result_function_value;
    double           _last_absolute_error;
    unsigned int     _last_complexity;

    // method
    void         (*clearResult) (struct _method*);
		/* setter for db_id */
	void         (* setId)					 (struct _method*,unsigned long);
		/* getter for db_id */
	unsigned long(* getId)                   (struct _method*);

};

/**
 * Create a Method w/ some parameters
 * @param id
 *  database id
 * @param name
 *  method name
 * @param function
 *  resolve function
 * @return
 *  Method corresponding given parameters
 */
Method* createMethod(
        unsigned long   id,
        char*           name,
        algorithm_method function
);
/**
 * Free the space allocated by given method
 * @param m
 *  method
 */
void    destroyMethod(Method *);


#endif	/* METHOD_H */

