void PyGSL_multimin_function_fdf(const gsl_vector* x, void* params, double *f, gsl_vector *df) { int flag, i; PyGSL_solver *min_o; FUNC_MESS_BEGIN(); min_o = (PyGSL_solver *) params; assert(PyGSL_solver_check(min_o)); for(i = 0; i<x->size; i++){ DEBUG_MESS(2, "Got a x[%d] of %f", i, gsl_vector_get(x, i)); } assert(min_o->mstatic->n_cbs >= 3); flag = PyGSL_function_wrap_On_O(x, min_o->cbs[2], min_o->args, f, df, x->size, __FUNCTION__); DEBUG_MESS(2, "Got a result of %f", *f); for(i = 0; i<df->size; i++){ DEBUG_MESS(2, "Got df x[%d] of %f", i, gsl_vector_get(df, i)); } if (flag!= GSL_SUCCESS){ *f = gsl_nan(); if(min_o->isset == 1) longjmp(min_o->buffer,flag); } FUNC_MESS_END(); return; }
PyGSL_SOLVER_API_EXTERN double PyGSL_monte_function_wrap(double *x, size_t dim, void *params) { double tmp; int flag; callback_function_params *p; gsl_vector_view view; FUNC_MESS_BEGIN(); view = gsl_vector_view_array(x, dim); p = (callback_function_params *) params; flag = PyGSL_function_wrap_On_O(&view.vector, p->function, p->arguments, &tmp, NULL, view.vector.size, p->c_func_name); if (flag!= GSL_SUCCESS) { if(p->buffer_is_set == 1){ longjmp(p->buffer, flag); FUNC_MESS("\t\t Using jump buffer"); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); tmp = gsl_nan(); } } FUNC_MESS_END(); return tmp; }
/* The Callbacks */ double PyGSL_multimin_function_f(const gsl_vector* x, void* params) { double result; int flag; int i; FUNC_MESS_BEGIN(); PyGSL_solver *min_o; min_o = (PyGSL_solver *) params; assert(PyGSL_solver_check(min_o)); for(i = 0; i<x->size; i++){ DEBUG_MESS(2, "Got a x[%d] of %f", i, gsl_vector_get(x, i)); } assert(min_o->mstatic->n_cbs >= 1); flag = PyGSL_function_wrap_On_O(x, min_o->cbs[0], min_o->args, &result, NULL, x->size, __FUNCTION__); if (flag!= GSL_SUCCESS){ result = gsl_nan(); if(min_o->isset == 1) longjmp(min_o->buffer,flag); } DEBUG_MESS(2, "Got a result of %f", result); FUNC_MESS_END(); return result; }
/* GSL Documentation specifies this function to int, header to void */ PyGSL_SOLVER_API_EXTERN void PyGSL_multimin_function_wrap_fdf(const gsl_vector *x, void *params, double *f, gsl_vector *g) { int flag; callback_function_params_fdf *p; p = (callback_function_params_fdf *) params; flag = PyGSL_function_wrap_On_O(x, p->fdf, p->arguments, f, g, x->size, p->c_fdf_func_name); if (flag!= GSL_SUCCESS){ if(p->buffer_is_set == 1){ longjmp(p->buffer, flag); FUNC_MESS("\t\t Using jump buffer"); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); *f = gsl_nan(); gsl_vector_set_all(g, gsl_nan()); } } }
PyGSL_SOLVER_API_EXTERN void PyGSL_function_wrap_fdf(double x, void * params, double *f, double * fdf) { int flag; callback_function_params_fdf *p = NULL; p = (callback_function_params_fdf *) params; flag = PyGSL_function_wrap_helper(x, f, fdf, p->fdf, p->arguments, p->c_fdf_func_name); if (flag!= GSL_SUCCESS){ if(p->buffer_is_set == 1){ FUNC_MESS("\t\t Using jump buffer"); longjmp(p->buffer, flag); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); *f = gsl_nan(); *fdf = gsl_nan(); } } }
static double diff_callback(double x, void *p) { double value; int flag; pygsl_diff_args *pargs = NULL; pargs = (pygsl_diff_args *) p; assert(pargs->callback); assert(pargs->args); flag = PyGSL_function_wrap_helper(x, &value, NULL, pargs->callback, pargs->args, (char *)__FUNCTION__); if(GSL_SUCCESS != flag){ longjmp(pargs->buffer, flag); return gsl_nan(); } return value; }
PyGSL_SOLVER_API_EXTERN double PyGSL_multimin_function_wrap_f(const gsl_vector *x, void *params) { double tmp; int flag; callback_function_params_fdf *p; p = (callback_function_params_fdf *) params; flag = PyGSL_function_wrap_On_O(x, p->f, p->arguments, &tmp, NULL, x->size, p->c_f_func_name); if (flag!= GSL_SUCCESS){ if(p->buffer_is_set == 1){ longjmp(p->buffer, flag); FUNC_MESS("\t\t Using jump buffer"); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); tmp = gsl_nan(); } } return tmp; }
PyGSL_SOLVER_API_EXTERN double PyGSL_function_wrap(double x, void * params) { int flag; double result; callback_function_params *p = NULL; p = (callback_function_params *) params; assert(p->function != NULL); assert(p->arguments != NULL); flag = PyGSL_function_wrap_helper(x, &result, NULL, p->function, p->arguments, p->c_func_name); if (flag!= GSL_SUCCESS){ if(p->buffer_is_set == 1) { FUNC_MESS("\t\t Using jump buffer"); longjmp(p->buffer, flag); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); result = gsl_nan(); } } return result; }
/** * C++ version of gsl_nan(). * @return NaN. */ inline double nan(){ return gsl_nan(); }
static double PyGSL_monte_function_wrap(double *x, size_t dim, void *params) { double tmp, *dresult; int dimension; PyGSL_solver *s; PyArrayObject *a_array = NULL; PyObject *result = NULL, *arglist=NULL, *callback, *retval; PyGSL_error_info info; /* the line number to appear in the traceback */ int trb_lineno = -1, i; struct pygsl_array_cache * cache_ptr; gsl_vector_view view; FUNC_MESS_BEGIN(); s = (PyGSL_solver *) params; /* flag = PyGSL_function_wrap_On_O(&view.vector, s->cbs[0], s->args, &tmp, NULL, view.vector.size, "monte_wrap"); */ FUNC_MESS_BEGIN(); callback = s->cbs[0]; assert(s->args != NULL); assert(callback != NULL); /* Do I need to copy the array ??? */ for(i = 2; i < PyGSL_SOLVER_N_ARRAYS; ++i){ cache_ptr = &(s->cache[i]); if(cache_ptr->ref == NULL) /* no array found */ break; if(x == cache_ptr->data){ a_array = cache_ptr->ref; break; } } if(i >= PyGSL_SOLVER_N_ARRAYS){ trb_lineno = __LINE__ -1; pygsl_error("Not enough space to cache arrays...", filename, trb_lineno, GSL_ESANITY); goto fail; } if(a_array == NULL){ dimension = dim; a_array = (PyArrayObject *) PyArray_FromDimsAndData(1, &dimension, PyArray_DOUBLE, (char *)x); cache_ptr->ref = a_array; cache_ptr->data = x; /* * Required for deallocation. * Tuples steal the references. But this array will be dereferenced by the * normal procedure! */ Py_INCREF(a_array); } if (a_array == NULL){ trb_lineno = __LINE__ - 2; goto fail; } /* arglist was already set up */ result = (PyObject *) s->cache[1].ref; dresult = (double *) s->cache[1].data; arglist = (PyObject *) s->cache[0].ref; Py_INCREF(s->args); PyTuple_SET_ITEM(arglist, 0, (PyObject *) a_array); PyTuple_SET_ITEM(arglist, 1, s->args); /* arglist = Py_BuildValue("(OOO)", a_array, s->args, result); if(DEBUG > 2){ fprintf(stderr, "callback = %p, arglist = %p\n", callback, arglist); } */ FUNC_MESS(" Call Python Object BEGIN"); retval = PyEval_CallObject(callback, arglist); FUNC_MESS(" Call Python Object END"); /* info.callback = callback; info.message = __FUNCTION__; if(PyGSL_CHECK_PYTHON_RETURN(retval, 0, &info) != GSL_SUCCESS){ trb_lineno = __LINE__ - 1; goto fail; } info.argnum = 1; DEBUG_MESS(3, "result was %e", *dresult); */ FUNC_MESS_END(); return *dresult; fail: PyGSL_add_traceback(NULL, __FILE__, __FUNCTION__, trb_lineno); FUNC_MESS("Failure"); if(s->isset == 1){ longjmp(s->buffer, GSL_EFAILED); FUNC_MESS("\t\t Using jump buffer"); } else { FUNC_MESS("\t\t Jump buffer was not defined!"); } tmp = gsl_nan(); return tmp; }