Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
/* 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;
}
Example #4
0
/* 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());
	  }
     }


}
Example #5
0
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();
	  }
     }

}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
 /**
  * C++ version of gsl_nan().
  * @return NaN.
  */
 inline double nan(){ return gsl_nan(); }
Example #10
0
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;
}