/* -*- C -*- */
/**
 * author: Pierre Schnizer
 */
%{
#include <gsl/gsl_multimin.h>
%}

%apply gsl_fsolver * { gsl_multimin_fminimizer *, gsl_multimin_fdfminimizer *}
%apply gsl_fsolver * BUFFER {gsl_multimin_fminimizer  * BUFFER}
%apply gsl_fdfsolver * BUFFER {gsl_multimin_fdfminimizer * BUFFER}
%{
#define PyGSL_gsl_multimin_fminimizer_GET_PARAMS(sys)   \
        (sys)->f->params;
#define PyGSL_gsl_multimin_fdfminimizer_GET_PARAMS(sys)   \
        (sys)->fdf->params;
#define  PyGSL_gsl_multimin_function_GET_PARAMS(sys) \
         (sys)->params
#define  PyGSL_gsl_multimin_function_fdf_GET_PARAMS(sys) \
         (sys)->params
%}
%apply gsl_fsolver   * BUFFER {gsl_multimin_function     * BUFFER};
%apply gsl_fdfsolver * BUFFER {gsl_multimin_function_fdf * BUFFER};

/*
 * This typemap is needed to enable the _x functions to return a numeric array
 */
%{
  typedef gsl_vector gsl_multimin_solver_data;
%}
/* add functions to allocate and free the memory stored by gsl_multimin_function */
%inline %{
  gsl_multimin_function * gsl_multimin_function_init(gsl_multimin_function * STORE)
  {
    return STORE;
  }
  gsl_multimin_function_fdf * gsl_multimin_function_init_fdf(gsl_multimin_function_fdf * STORE)
  {
	 return STORE;
    /* Do Not need to do anything here. All done in the typemaps */
  }
  void gsl_multimin_function_free(gsl_multimin_function * FREE)
  {
       ;
  }

  void gsl_multimin_function_free_fdf(gsl_multimin_function_fdf * FREE)
  {
    /* Do Not need to do anything here. All done in the typemaps */
       ;
  }
%}
%{
  double  gsl_multimin_fminimizer_f(gsl_multimin_fminimizer * s)
  {	
    	return s->fval;
  }
%}
double  
gsl_multimin_fminimizer_f(gsl_multimin_fminimizer * s);

gsl_multimin_fminimizer *
gsl_multimin_fminimizer_alloc(const gsl_multimin_fminimizer_type *T,
                                size_t n);

int 
gsl_multimin_fminimizer_set (gsl_multimin_fminimizer * s,
                             gsl_multimin_function * BUFFER,
                             const gsl_vector * IN,
                             const gsl_vector * IN);

void
gsl_multimin_fminimizer_free(gsl_multimin_fminimizer *s);

const char * 
gsl_multimin_fminimizer_name (const gsl_multimin_fminimizer * s);

int
gsl_multimin_fminimizer_iterate(gsl_multimin_fminimizer *s);


gsl_multimin_solver_data *
gsl_multimin_fminimizer_x (const gsl_multimin_fminimizer * s);

double 
gsl_multimin_fminimizer_minimum (const gsl_multimin_fminimizer * s);

double
gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * s);


gsl_multimin_fdfminimizer *
gsl_multimin_fdfminimizer_alloc(const gsl_multimin_fdfminimizer_type *T,
                                size_t n);

int 
gsl_multimin_fdfminimizer_set(gsl_multimin_fdfminimizer * s,
			      gsl_multimin_function_fdf * BUFFER,
			      const gsl_vector * IN,
			      double step_size, double tol);

void
gsl_multimin_fdfminimizer_free(gsl_multimin_fdfminimizer *s);

const char * 
gsl_multimin_fdfminimizer_name (const gsl_multimin_fdfminimizer * s);

int
gsl_multimin_fdfminimizer_iterate(gsl_multimin_fdfminimizer * BUFFER);

int
gsl_multimin_fdfminimizer_restart(gsl_multimin_fdfminimizer * BUFFER);
int
gsl_multimin_test_gradient(const gsl_vector * IN,double epsabs);
int
gsl_multimin_test_size(double size, double epsabs);

%{
  double  gsl_multimin_fdfminimizer_f(gsl_multimin_fdfminimizer * s)
  {	
    	return s->f;
  }
%}
double  
gsl_multimin_fdfminimizer_f(gsl_multimin_fdfminimizer * s);
gsl_multimin_solver_data *
gsl_multimin_fdfminimizer_x(gsl_multimin_fdfminimizer * s);

gsl_multimin_solver_data *
gsl_multimin_fdfminimizer_dx(gsl_multimin_fdfminimizer * s);

gsl_multimin_solver_data *
gsl_multimin_fdfminimizer_gradient(gsl_multimin_fdfminimizer * s);

double 
gsl_multimin_fdfminimizer_minimum(gsl_multimin_fdfminimizer * s);

extern const 
gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_steepest_descent;
extern const 
gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_conjugate_pr;
extern const 
gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_conjugate_fr;
extern const 
gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_vector_bfgs;

%inline %{
	  /* 
	   * Try to find what level of GSL I am running. If less than zero, 
	   * give a NULL. The overlying wrapper must check for NULL and raise 
           * an approbriate error message.
	   */
#if PYGSL_GSL_MAJOR_VERSION < 1
#error "This wrapper needs at least GSL 1.0"
#endif 
	  
#if PYGSL_GSL_MINOR_VERSION < 3	  
	  gsl_multimin_fminimizer_type *gsl_multimin_fminimizer_nmsimplex = NULL;
#else 
	  extern const
	       gsl_multimin_fminimizer_type *gsl_multimin_fminimizer_nmsimplex;
#endif
%}




syntax highlighted by Code2HTML, v. 0.9.1