Example #1
0
double SwitchingFunction::calculate(double distance,double&dfunc)const{
  plumed_massert(init,"you are trying to use an unset SwitchingFunction");
  if(distance>dmax){
    dfunc=0.0;
    return 0.0;
  }
  const double rdist = (distance-d0)*invr0;
  double result;

  if(rdist<=0.){
     result=1.;
     dfunc=0.0;
  }else{
    if(type==smap){
      double sx=c*pow( rdist, a ); 
      result=pow( 1.0 + sx, d ); 
      dfunc=-b*sx/rdist*result/(1.0+sx); 
    } else if(type==rational){
      result=do_rational(rdist,dfunc,nn,mm);
    }else if(type==exponential){
      result=exp(-rdist);
      dfunc=-result;
    }else if(type==nativeq){
      double rdist2 = beta*(distance - lambda * ref);
      double exprdist=exp(rdist2);
      result=1./(1.+exprdist);
      dfunc=-exprdist/(1.+exprdist)/(1.+exprdist);
    }else if(type==gaussian){
      result=exp(-0.5*rdist*rdist);
      dfunc=-rdist*result;
    }else if(type==cubic){
      double tmp1=rdist-1, tmp2=(1+2*rdist);
      result=tmp1*tmp1*tmp2;
      dfunc=2*tmp1*tmp2 + 2*tmp1*tmp1;
    }else if(type==tanh){
      double tmp1=std::tanh(rdist);
      result = 1.0 - tmp1;
      dfunc=-(1-tmp1*tmp1);
#ifdef __PLUMED_HAS_MATHEVAL
    }else if(type==matheval){
      result=evaluator_evaluate_x(evaluator,rdist);
      dfunc=evaluator_evaluate_x(evaluator_deriv,rdist);
#endif
    }else plumed_merror("Unknown switching function type");
// this is for the chain rule:
    dfunc*=invr0;
// this is because calculate() sets dfunc to the derivative divided times the distance.
// (I think this is misleading and I would like to modify it - GB)
    dfunc/=distance;
  }

  result=result*stretch+shift;
  dfunc*=stretch;

  return result;
}
Example #2
0
void
cv1d_mult_with_scaled_ft_fct_ (complex *a,
			       /*double  (*b_real) (),
				 double  (*b_imag) (),*/
			       void *b_real,
			       void *b_imag,
			       double  scale,
			       int     begin,
			       int     end,
			       real    b_step,
			       real    b_begin)
{
  register complex tmp;
  register real    tmp2;
  register int     i;
  register double  b_r;
  register double  b_i;

  assert (a != 0);
  assert (b_real != 0);

  if (b_imag) {
    for (i = begin; i <= end; i++) {
      tmp = a[i];
      tmp2 = (double) (b_begin + i*b_step)*scale;
      b_r = scale*evaluator_evaluate_x(b_real,tmp2);
      b_i = scale*evaluator_evaluate_x(b_imag,tmp2);
      a[i].real = a[i].real*b_r - a[i].imag*b_i;
      a[i].imag = tmp.real *b_i + tmp.imag *b_r;

      /* Update the sum of the squared mof of the filter. */
      flt_squared_mod_sum_ += b_r*b_r + b_i*b_i;
    }
  } else {
    for (i = begin; i <= end; i++) {
      tmp2 = scale * evaluator_evaluate_x(b_real,((double)(b_begin+i*b_step))*scale);
      a[i].real *= tmp2;
      a[i].imag *= tmp2;

      /* Update the sum of the squared mof of the filter. */
      flt_squared_mod_sum_ += tmp2*tmp2;
    }
  }

  return;
}
Example #3
0
double newtonrap(double x0, double es, double *ea, int imax, int *iter, int tabla, char *buffer, char *buffer2)
{
    double x1=x0;

    void *f, *f2;		/*  Evaluators for function and function derivative.  */
 
  /*  Create evaluator for function.  */
    f = evaluator_create (buffer);
    f2 = evaluator_create (buffer2);
    assert (f);
    assert (f2);
    
    if(tabla == 1)
    {
 
        printf ("\n\n|  i |      Raiz      |      ea      |     f(xr)    | \n");
        printf ("______________________________________________________\n");
    }

    *iter = 0;
    do{
        x0 = x1;
        x1 = x0-(evaluator_evaluate_x(f,x0)/evaluator_evaluate_x(f2,x0));
        *iter=*iter+1;
        if(x1!=0)
        {
            *ea=fabs((x1-x0)/x1)*100;
        }
        if ( tabla == 1 ) {
            printf ("| %2d | %12.8f | %12.8f | %12.8f |\n", *iter, x1, *ea, evaluator_evaluate_x(f,x1) );
	    }
    }while(es < *ea && *iter <= imax);

    evaluator_destroy(f);
    evaluator_destroy(f2);

    if ( tabla == 1 ) {
        printf ("\n\nLa Raiz es %6.4lf en %d iteraciones\n",x1,*iter);
        printf ("\n\nEl error relativo aproximado es %6.4lf\n",*ea);
        return 0;
    }
    else
        return x1;
}
Example #4
0
/* 
 * Compute from BEGIN to END the multiplication between an array of
 * complex data and a complex function. The complex function is given
 * by 2 C-function pointer, one for its real part and one for its
 * imaginary part. If the pointer for the imaginary part is set to
 * NULL, it is considered the complex function has no imaginary
 * part.
 */ 
void
cv1d_cplx_mult_num_ana_ (complex *a,
			 /*double  (*b_real) (),
			   double  (*b_imag) (),*/
			 void *b_real,
			 void *b_imag,
			 int     begin,
			 int     end,
			 real    b_step,
			 real    b_begin)
{
  register complex tmp;
  register real    tmp2;
  register double  b_r;
  register double  b_i;
  register int     i;

  assert (a != 0);
  assert (b_real != 0);

  if (b_imag) {
    for (i = begin; i <= end; i++) {
      tmp = a[i];
      tmp2 = b_begin + i*b_step;
      b_r = evaluator_evaluate_x(b_real,(double)(tmp2));
      b_i = evaluator_evaluate_x(b_imag,(double)(tmp2));
      a[i].real = a[i].real*b_r - a[i].imag*b_i;
      a[i].imag = tmp.real*b_i + tmp.imag*b_r;

      /* Update the sum of the squared mof of the filter. */
      flt_squared_mod_sum_ += b_r*b_r + b_i*b_i;
    }
  } else {
    for (i = begin; i <= end; i++) {
      tmp2 = evaluator_evaluate_x(b_real,(double)(b_begin+i*b_step));
      a[i].real *= tmp2;
      a[i].imag *= tmp2;

      /* Update the sum of the squared mof of the filter. */
      flt_squared_mod_sum_ += tmp2*tmp2;
    }
  }
}
Example #5
0
double pfijo(double x0, double es, double *ea, int imax, int *iter, int tabla, char *buffer)
{
    double xr=x0, xrold;

    void *f;		/*  Evaluators for function and function derivative.  */
 
  /*  Create evaluator for function.  */
    f = evaluator_create (buffer);
    assert (f);

    if(tabla == 1)
    {
 
        printf ("\n\n|  i |      Raiz      |      ea      |     f(xr)    | \n");
        printf ("______________________________________________________\n");
    }

    *iter = 0;
    do{
        xrold = xr;
        xr = evaluator_evaluate_x(f,xrold);
        *iter=*iter+1;
        if(xr!=0)
        {
            *ea=fabs((xr-xrold)/xr)*100;
        }
        if ( tabla == 1 ) {
            printf ("| %2d | %12.8f | %12.8f | %12.8f |\n", *iter, xr, *ea, evaluator_evaluate_x(f,xr) );
	    }

    }while(es < *ea && *iter <= imax);

    evaluator_destroy(f);

    if ( tabla == 1 ) {
        printf ("\n\nLa Raiz es %6.4lf en %d iteraciones\n",xr,*iter);
        printf ("\n\nEl error relativo aproximado es %6.4lf\n",*ea);
        return 0;
    }
    else
        return xr;
}
Example #6
0
/*
 * TODO - Como graficar de manera que el "path" que se forma al unir los puntos
 * concuerde con la gráfica. Por ejemplo, la función tan(x) presenta asíntotas verticales
 * en los múltiplos impares de pi/2.
 * Entonces se tiene un punto de la forma (a,f(a)) unido a (b,f(b)) donde a < n*pi/2 < b, y 
 * f(a) >>>> f(b)... entonces se genera una linea que atraviesa la que seria la asintota horizontal.
 */
static void
gs_function_plot_draw (GsPlot *plot, GsGraphTransform *t, GsRectangle *v, cairo_t *cr)
{
	GsPoint point, d_point, d_prev_point;

	if (GS_FUNCTION_PLOT (plot)->priv->matheval_c == NULL) {
		return;
	}

	d_prev_point. x = -1;
	d_prev_point.y = -1;

	cairo_save (cr);
	gdk_cairo_set_source_color (cr, &(plot->priv->color));
//	cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL);

	for (point.x = v->x1; point.x <= v->x2; point.x += 0.05) {
		point.y = evaluator_evaluate_x (GS_FUNCTION_PLOT (plot)->priv->matheval_c,
						point.x);

		gs_point_to_pixel (t, &point, &d_point);

		if (d_prev_point.x > -1 && d_prev_point.y > -1) {
/*			cairo_move_to (cr, d_prev_point.x, d_prev_point.y);
			cairo_line_to (cr, d_point.x, d_point.y);
			cairo_stroke (cr);*/
			cairo_arc (cr, d_point.x, d_point.y, 1., 0., M_PI * 2);
			cairo_fill (cr);
		}

		d_prev_point.x = d_point.x;
		d_prev_point.y = d_point.y;
	}

	cairo_restore (cr);
}
Example #7
0
/*!
 \brief convert_before_download() converts the value passed using the
 conversions bound to the widget
 \param widget (GtkWidget *) widget to extract the conversion info from
 \param value (gfloat *) the "real world" value from the tuning gui before
 translation to MS-units
 \returns the integere ms-units form after conversion
 */
G_MODULE_EXPORT gint convert_before_download(GtkWidget *widget, gfloat value)
{
	static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
	gint return_value = 0;
	gint tmpi = 0;
	gchar * conv_expr = NULL;
	void *evaluator = NULL;
	DataSize size = MTX_U08;
	float lower = 0.0;
	float upper = 0.0;
	gfloat *multiplier = NULL;
	gfloat *adder = NULL;
	guint i = 0;
	GHashTable *mhash = NULL;
	GHashTable *ahash = NULL;
	gchar *key_list = NULL;
	gchar *mult_list = NULL;
	gchar *add_list = NULL;
	gchar **keys = NULL;
	gchar **mults = NULL;
	gchar **adds = NULL;
	gint table_num = 0;
	gchar *tmpbuf = NULL;
	gchar * source_key = NULL;
	gchar * hash_key = NULL;
	gint *algorithm = NULL;
	GHashTable *sources_hash = NULL;

	sources_hash = DATA_GET(global_data,"sources_hash");
	algorithm = DATA_GET(global_data,"algorithm");

	g_static_mutex_lock(&mutex);


	if (!OBJ_GET(widget,"size"))
		printf(__FILE__"%s %s\n",_(": convert_before_download, FATAL ERROR, size undefined for widget %s "),glade_get_widget_name(widget));

	size = (DataSize)OBJ_GET(widget,"size");
	if (OBJ_GET(widget,"raw_lower"))
		lower = (gfloat)strtol(OBJ_GET(widget,"raw_lower"),NULL,10);
	else
		lower = (gfloat)get_extreme_from_size(size,LOWER);
	if (OBJ_GET(widget,"raw_upper"))
		upper = (gfloat)strtol(OBJ_GET(widget,"raw_upper"),NULL,10);
	else
		upper = (gfloat)get_extreme_from_size(size,UPPER);

	/* MULTI EXPRESSION ONLY! */
	if (OBJ_GET(widget,"multi_expr_keys"))
	{
		if ((!OBJ_GET(widget,"mhash")) && (!OBJ_GET(widget,"ahash")))
		{
			mhash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
			ahash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
			key_list = OBJ_GET(widget,"multi_expr_keys");
			mult_list = OBJ_GET(widget,"fromecu_mults");
			add_list = OBJ_GET(widget,"fromecu_addds");
			keys = g_strsplit(key_list,",",-1);
			mults = g_strsplit(mult_list,",",-1);
			adds = g_strsplit(add_list,",",-1);
			for (i=0;i<MIN(g_strv_length(keys),g_strv_length(mults));i++)
			{
				multiplier = g_new0(gfloat, 1);
				*multiplier = (gfloat)g_strtod(mults[i],NULL);
				g_hash_table_insert(mhash,g_strdup(keys[i]),multiplier);
				adder = g_new0(gfloat, 1);
				*adder = (gfloat)g_strtod(adds[i],NULL);
				g_hash_table_insert(ahash,g_strdup(keys[i]),adder);
			}
			g_strfreev(keys);
			g_strfreev(mults);
			g_strfreev(adds);

			OBJ_SET_FULL(widget,"mhash",mhash,g_hash_table_destroy);
			OBJ_SET_FULL(widget,"ahash",ahash,g_hash_table_destroy);
		}
		mhash = OBJ_GET(widget,"mhash");
		ahash = OBJ_GET(widget,"ahash");
		source_key = OBJ_GET(widget,"source_key");
		if (!source_key)
			printf(_("big problem, source key is undefined!!\n"));
		hash_key = (gchar *)g_hash_table_lookup(sources_hash,source_key);
		tmpbuf = (gchar *)OBJ_GET(widget,"table_num");
		if (tmpbuf)
			table_num = (GINT)strtol(tmpbuf,NULL,10);
		if (table_num == -1) /* Not a table */
		{
			if (!hash_key)
			{
				multiplier = g_hash_table_lookup(mhash,"DEFAULT");
				adder = g_hash_table_lookup(ahash,"DEFAULT");
			}
			else
			{
				multiplier = g_hash_table_lookup(mhash,(gchar *)hash_key);
				adder = g_hash_table_lookup(ahash,(gchar *)hash_key);
			}
		}
		else /* This is a 3d table */
		{
			switch (algorithm[table_num])
			{
				case SPEED_DENSITY:
					if (!hash_key)
					{
						multiplier = g_hash_table_lookup(mhash,"DEFAULT");
						adder = g_hash_table_lookup(ahash,"DEFAULT");
					}
					else
					{
						multiplier = g_hash_table_lookup(mhash,hash_key);
						adder = g_hash_table_lookup(ahash,hash_key);
					}
					break;
				case ALPHA_N:
					multiplier = g_hash_table_lookup(mhash,"DEFAULT");
					adder = g_hash_table_lookup(ahash,"DEFAULT");
					break;
				case MAF:
					multiplier = g_hash_table_lookup(mhash,"AFM_VOLTS");
					adder = g_hash_table_lookup(ahash,"AFM_VOLTS");
					break;
			}
		}
		/* Reverse calc due to this being TO the ecu */
		if ((multiplier) && (adder))
			return_value = (GINT)((value - (*adder))/(*multiplier));
		else if (multiplier)
			return_value = (GINT)(value/(*multiplier));
		else
			return_value = (GINT)value;
	}
	else /* NON Multi Expression */
	{
		conv_expr = (gchar *)OBJ_GET(widget,"toecu_conv_expr");

		/* Expression is NOT multi expression but has more complex math*/
		if (conv_expr)
		{
			evaluator = (void *)OBJ_GET(widget,"dl_evaluator");
			if (!evaluator)
			{
				evaluator = evaluator_create(conv_expr);
				assert(evaluator);
				OBJ_SET_FULL(widget,"dl_evaluator",(gpointer)evaluator,evaluator_destroy);
			}
			return_value = (GINT)evaluator_evaluate_x(evaluator,value); 
		}
		else
		{
			multiplier = (gfloat *)OBJ_GET(widget,"fromecu_mult");
			adder = (gfloat *)OBJ_GET(widget,"fromecu_add");
			/* Handle all cases of with or without multiplier/adder*/
			if ((multiplier) && (adder))
				return_value = (GINT)((value - (*adder))/(*multiplier));
			else if (multiplier)
				return_value = (GINT)(value/(*multiplier));
			else
				return_value = (GINT)value;
		}
	}
	dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_before_dl():\n\t widget %s raw %.2f, sent %i\n",glade_get_widget_name(widget),value,return_value));
	if (return_value > upper) 
	{
		dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_before_download()\n\t WARNING value clamped at %f (%f <- %f -> %f)!!\n",upper,lower,value,upper));
		return_value = upper;
	}
	if (return_value < lower)
	{
		dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_before_download()\n\t WARNING value clamped at %f (%f <- %f -> %f)!!\n",lower,lower,value,upper));
		return_value = lower;
	}

	tmpi = return_value;
	if (OBJ_GET(widget,"lookuptable"))
		return_value = (GINT)reverse_lookup_obj(G_OBJECT(widget),tmpi);

	g_static_mutex_unlock(&mutex);
	return (return_value);
}
Example #8
0
/*!
 \brief convert_after_upload() converts the ms-units data to the real world
 units for display on the GUI
 \param widget (GtkWidget *) to extract the conversion info from to perform
 the necessary math
 \returns the real world value for the GUI
 */
G_MODULE_EXPORT gfloat convert_after_upload(GtkWidget * widget)
{
	static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
	static gint (*get_ecu_data_f)(gpointer);
	static void (*send_to_ecu_f)(gpointer, gint, gboolean) = NULL;
	gfloat return_value = 0.0;
	gchar * conv_expr = NULL;
	void *evaluator = NULL;
	gint tmpi = 0;
	DataSize size = 0;
	gfloat lower = 0.0;
	gfloat upper = 0.0;
	gboolean fromecu_complex = FALSE;
	guint i = 0;
	gint table_num = -1;
	GHashTable *mhash = NULL;
	GHashTable *ahash = NULL;
	gchar *key_list = NULL;
	gchar *mult_list = NULL;
	gchar *add_list = NULL;
	gchar **keys = NULL;
	gchar **mults = NULL;
	gchar **adds = NULL;
	gchar * tmpbuf = NULL;
	gchar * source_key = NULL;
	gchar * hash_key = NULL;
	gfloat *multiplier = NULL;
	gfloat *adder = NULL;
	gint *algorithm = NULL;
	GHashTable *sources_hash = NULL;
	extern gconstpointer *global_data;


	if (!get_ecu_data_f)
		get_symbol("get_ecu_data",(void *)&get_ecu_data_f);
	if (!send_to_ecu_f)
		get_symbol("send_to_ecu",(void *)&send_to_ecu_f);
	g_return_val_if_fail(get_ecu_data_f,0.0);
	g_return_val_if_fail(send_to_ecu_f,0.0);

	g_static_mutex_lock(&mutex);

	size = (DataSize)OBJ_GET(widget,"size");
	if (size == 0)
	{
		printf(_("BIG PROBLEM, size undefined! widget %s, default to U08 \n"),(gchar *)glade_get_widget_name(widget));
		size = MTX_U08;
	}

	if (OBJ_GET(widget,"raw_lower"))
		lower = (gfloat)strtol(OBJ_GET(widget,"raw_lower"),NULL,10);
	else
		lower = (gfloat)get_extreme_from_size(size,LOWER);
	if (OBJ_GET(widget,"raw_upper"))
		upper = (gfloat)strtol(OBJ_GET(widget,"raw_upper"),NULL,10);
	else
		upper = (gfloat)get_extreme_from_size(size,UPPER);

	fromecu_complex = (GBOOLEAN)OBJ_GET(widget,"fromecu_complex");
	if (fromecu_complex)
	{
		g_static_mutex_unlock(&mutex);
		/*printf("Complex upload conversion for widget at page %i, offset %i, name %s\n",(GINT)OBJ_GET(widget,"page"),(GINT)OBJ_GET(widget,"offset"),glade_get_widget_name(widget));
		  */
		return handle_complex_expr_obj(G_OBJECT(widget),NULL,UPLOAD);
	}

	if (OBJ_GET(widget,"lookuptable"))
		tmpi = lookup_data_obj(G_OBJECT(widget),get_ecu_data_f(widget));
	else
		tmpi = get_ecu_data_f(widget);
	if (tmpi < lower)
	{
		dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_after_upload()\n\t WARNING RAW value  out of range for widget %s, clamped at %.1f (%.1f <- %i -> %.1f), updating ECU with valid value within limits!!\n",(gchar *)glade_get_widget_name(widget),lower,lower,tmpi,upper));
		tmpi = lower;
		send_to_ecu_f(widget,tmpi,TRUE);
	}
	if (tmpi > upper)
	{
		dbg_func(CONVERSIONS|CRITICAL,g_strdup_printf(__FILE__": convert_after_upload()\n\t WARNING RAW value out of range for widget %s, clamped at %.1f (%.1f <- %i -> %.1f), updating ECU with valid value within limits!!\n",(gchar *)glade_get_widget_name(widget),lower,lower,tmpi,upper));
		tmpi = upper;
		send_to_ecu_f(widget,tmpi,TRUE);
	}
	/* MULTI EXPRESSION ONLY! */
	if (OBJ_GET(widget,"multi_expr_keys"))
	{
		sources_hash = DATA_GET(global_data,"sources_hash");
		if ((!OBJ_GET(widget,"mhash")) && (!OBJ_GET(widget,"ahash")))
		{
			mhash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
			ahash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
			key_list = OBJ_GET(widget,"multi_expr_keys");
			mult_list = OBJ_GET(widget,"fromecu_mults");
			add_list = OBJ_GET(widget,"fromecu_adds");
			if (!mult_list)
				printf("BUG, widget %s is multi_expression but doesn't have fromecu_mults defined!\n",glade_get_widget_name(widget));
			if (!add_list)
				printf("BUG, widget %s is multi_expression but doesn't have fromecu_adds defined!\n",glade_get_widget_name(widget));
			keys = g_strsplit(key_list,",",-1);
			mults = g_strsplit(mult_list,",",-1);
			adds = g_strsplit(add_list,",",-1);
			for (i=0;i<MIN(g_strv_length(keys),g_strv_length(mults));i++)
			{
				multiplier = g_new0(gfloat, 1);
				*multiplier = (gfloat)g_strtod(mults[i],NULL);
				g_hash_table_insert(mhash,g_strdup(keys[i]),multiplier);
				adder = g_new0(gfloat, 1);
				*adder = (gfloat)g_strtod(adds[i],NULL);
				g_hash_table_insert(ahash,g_strdup(keys[i]),adder);
			}
			g_strfreev(keys);
			g_strfreev(mults);
			g_strfreev(adds);

			OBJ_SET_FULL(widget,"mhash",mhash,g_hash_table_destroy);
			OBJ_SET_FULL(widget,"ahash",ahash,g_hash_table_destroy);
		}
		mhash = OBJ_GET(widget,"mhash");
		ahash = OBJ_GET(widget,"ahash");
		source_key = OBJ_GET(widget,"source_key");
		if (!source_key)
			printf(_("big problem, source key is undefined!!\n"));
		hash_key = (gchar *)g_hash_table_lookup(sources_hash,source_key);
		tmpbuf = (gchar *)OBJ_GET(widget,"table_num");
		if (tmpbuf)
			table_num = (GINT)strtol(tmpbuf,NULL,10);
		if (table_num == -1)
		{
			if (!hash_key)
			{
				multiplier = g_hash_table_lookup(mhash,"DEFAULT");
				adder = g_hash_table_lookup(ahash,"DEFAULT");
			}
			else
			{
				multiplier = g_hash_table_lookup(mhash,(gchar *)hash_key);
				adder = g_hash_table_lookup(ahash,(gchar *)hash_key);
			}
		}
		else
		{
			algorithm = DATA_GET(global_data,"algorithm");
			switch (algorithm[table_num])
			{
				case SPEED_DENSITY:
					if (!hash_key)
					{
						multiplier = g_hash_table_lookup(mhash,"DEFAULT");
						adder = g_hash_table_lookup(ahash,"DEFAULT");
					}
					else
					{
						multiplier = g_hash_table_lookup(mhash,hash_key);
						adder = g_hash_table_lookup(ahash,hash_key);
					}
					break;
				case ALPHA_N:
					multiplier = g_hash_table_lookup(mhash,"DEFAULT");
					adder = g_hash_table_lookup(ahash,"DEFAULT");
					break;
				case MAF:
					multiplier = g_hash_table_lookup(mhash,"AFM_VOLTS");
					adder = g_hash_table_lookup(ahash,"AFM_VOLTS");
					break;
			}
		}
		if ((multiplier) && (adder))
			return_value = (((gfloat)tmpi * (*multiplier)) + (*adder));
		else if (multiplier)
			return_value = (gfloat)tmpi * (*multiplier);
		else
			return_value = (gfloat)tmpi;
	}
	else
	{
		conv_expr = (gchar *)OBJ_GET(widget,"fromecu_conv_expr");
		if (conv_expr)
		{
			evaluator = (void *)OBJ_GET(widget,"ul_evaluator");
			if (!evaluator)
			{
				evaluator = evaluator_create(conv_expr);
				assert(evaluator);
				OBJ_SET_FULL(widget,"ul_evaluator",(gpointer)evaluator,evaluator_destroy);
			}
			return_value = evaluator_evaluate_x(evaluator,tmpi);
		}
		else
		{
			multiplier = OBJ_GET(widget,"fromecu_mult");
			adder = OBJ_GET(widget,"fromecu_add");
			if ((multiplier) && (adder))
				return_value = (((gfloat)tmpi * (*multiplier)) + (*adder));
			else if (multiplier)
				return_value = (gfloat)tmpi * (*multiplier);
			else
				return_value = (gfloat)tmpi;
			/*dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_after_ul():\n\tNo/Fast CONVERSION defined for  widget %s, value %f\n",(gchar *)glade_get_widget_name(widget), return_value));*/
		}

	}
//	dbg_func(CONVERSIONS,g_strdup_printf(__FILE__": convert_after_ul()\n\t page %i,offset %i, raw %i, val %f\n",page,offset,tmpi,return_value));
	g_static_mutex_unlock(&mutex);
	return (return_value);
}
int core_oph_predicate2(oph_stringPtr byte_array, char *result)
{
	unsigned long i, occurrence, occurrence_number = 0;
	unsigned short r;
	double res, temporary;
	oph_predicate2_param *_result = (oph_predicate2_param *) result;
	if (_result->occurrence < 0)
		occurrence = 1;
	else
		occurrence = (unsigned long) _result->occurrence;
	switch (byte_array->type) {
		case OPH_DOUBLE:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((double *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((double *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		case OPH_FLOAT:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((float *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((float *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		case OPH_INT:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((int *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((int *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		case OPH_SHORT:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((short *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((short *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		case OPH_BYTE:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((char *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((char *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		case OPH_LONG:
			{
				for (i = _result->occurrence < 0 ? byte_array->numelem - 1 : 0; (0 <= i) && (i < byte_array->numelem); _result->occurrence < 0 ? --i : ++i) {
					res = evaluator_evaluate_x(_result->f[1], *((long long *) (byte_array->content + i * byte_array->elemsize)));
					switch (_result->op) {
						case OPH_GREATER_THAN_ZERO:
							{
								r = res > 0.0;
								break;
							}
						case OPH_LESS_THAN_ZERO:
							{
								r = res < 0.0;
								break;
							}
						case OPH_EQUAL_TO_ZERO:
							{
								r = res == 0.0;
								break;
							}
						case OPH_GREATER_OR_EQUAL_TO_ZERO:
							{
								r = res >= 0.0;
								break;
							}
						case OPH_LESS_OR_EQUAL_TO_ZERO:
							{
								r = res <= 0.0;
								break;
							}
						case OPH_NOT_EQUAL_TO_ZERO:
							{
								r = res != 0.0;
								break;
							}
						case OPH_NULL:
							{
								r = isnan(res);
								break;
							}
						default:
							pmesg(1, __FILE__, __LINE__, "Comparison value non recognized\n");
							return -1;
					}
					if (occurrence && r) {
						occurrence_number++;
						if (occurrence != occurrence_number)
							r = 0;
					}
					temporary = evaluator_evaluate_x(_result->f[r ? 2 : 3], *((long long *) (byte_array->content + i * byte_array->elemsize)));
					if (core_oph_type_cast(&temporary, (((char *) _result->f[0]) + i * _result->result_elemsize), OPH_DOUBLE, _result->result_type, byte_array->missingvalue)) {
						pmesg(1, __FILE__, __LINE__, "Unable to find result\n");
						return 1;
					}
				}
				break;
			}
		default:
			pmesg(1, __FILE__, __LINE__, "Type non recognized\n");
			return -1;
	}
	return 0;
}
Example #10
0
double
Polynomial::evaluate_x( double x )
{
	assign( "x", x );
	return evaluator_evaluate_x( m_e, x );
}
Example #11
0
void *
cv1d_a_real_d (int  border_effect,
	       void *res_data,
	       int  *first_exact_ptr,
	       int  *last_exact_ptr)
{
  real   *signal_data;
  real   *result_data;

  int  i;
  real *filter_data = 0;
  int  filter_begin_index;
  int  filter_end_index;

  _filter_ old_flt;

  assert (flt.def == ANALYTICAL);
  assert (flt.form != CV1D_UNDEFINED);
  assert (sig_form != CV1D_UNDEFINED);
  assert (sig_n >= flt.d_n);

  assert ((border_effect == CV1D_PERIODIC)
	  || (border_effect == CV1D_MIRROR)
	  || (border_effect == CV1D_PADDING)
	  || (border_effect == CV1D_0_PADDING));
  assert (res_data != 0);
  assert (first_exact_ptr != 0);
  assert (last_exact_ptr != 0);

  signal_data = (real *) sig_d_data;
  result_data = (real *) res_data;

  if (flt.scale == CV1D_NO_SCALE) {
    filter_begin_index = (int) floor (flt.d_begin) ;
    filter_end_index = (int) ceil (flt.d_end) ;
  } else {
    filter_begin_index = (int) floor (flt.d_begin*flt.scale) ;
    filter_end_index = (int) ceil (flt.d_end*flt.scale) ;
  }

  filter_data = (real *) malloc (sizeof(real)*flt.d_n);
  if (!filter_data) {
    EX_RAISE(mem_alloc_error);
  }

  if (flt.scale == CV1D_NO_SCALE) {
    for (i = filter_begin_index; i <= filter_end_index; i++) {
      filter_data[i - filter_begin_index] =
	evaluator_evaluate_x(flt.d_real_ptr,(double)(i));
    }
  } else {
    for (i = filter_begin_index; i <= filter_end_index; i++) {
      filter_data[i - filter_begin_index] =
	evaluator_evaluate_x(flt.d_real_ptr,(double)(i)*flt.scale);
    }
  }

  /*
   * Compute the sum of the squared modulus of all the filter values.
   */

  flt_squared_mod_sum_ = 0.0;
  for (i = filter_begin_index; i <= filter_end_index; i++) {
    flt_squared_mod_sum_ +=
      filter_data[i-filter_begin_index]*filter_data[i-filter_begin_index];
  }

  /*  old_flt.def = flt.def;
  old_flt.d_begin = flt.d_begin;
  old_flt.d_end = flt.d_end;
  old_flt.d_data = flt.d_data;
  flt.def = NUMERICAL;
  flt.d_begin = (real) filter_begin_index;
  flt.d_end = (real) filter_end_index;
  flt.d_data = (void *) filter_data;*/
  cv1d_flt_copy_ (&flt, &old_flt);
  cv1d_flt_init_n (flt.form,
		   filter_end_index - filter_begin_index + 1,
		   -filter_begin_index,
		   0, 0,
		   filter_data,
		   0);

  result_data = cv1d_n_real_d (border_effect, result_data,
			       first_exact_ptr, last_exact_ptr);

  cv1d_flt_copy_ (&old_flt, &flt);

  free (filter_data);

  /*  flt.def = old_flt.def;
  flt.d_begin = old_flt.d_begin;
  flt.d_end = old_flt.d_end;
  flt.d_data = old_flt.d_data;*/

  cv1d_set_f_l_exact_ (first_exact_ptr, last_exact_ptr);

  return result_data;

mem_alloc_error:
  free (filter_data);

  return 0;
}
Example #12
0
void *
cv1d_a_cplx_mp (int  border_effect,
		void *res_data,
		int  *first_exact_ptr,
		int  *last_exact_ptr)
{
  complex *signal_data;
  complex *result_data;

  complex *signal_part = 0;
  complex *signal_part_ft = 0 ;
  complex *filter_ft = 0;

  int     nb_of_parts, part_nb, part_n;
  int     size_of_exact_data;
  int     i;
  int     flt_f_begin_index;
  int     flt_f_end_index;
  int     flt_d_end_index;
  real    f_step;

  assert (flt.def == ANALYTICAL);
  assert (flt.form != CV1D_UNDEFINED);
  assert (sig_form != CV1D_UNDEFINED);
  assert (sig_n >= flt.d_n);

  assert ((border_effect == CV1D_PERIODIC)
	  || (border_effect == CV1D_MIRROR)
	  || (border_effect == CV1D_PADDING)
	  || (border_effect == CV1D_0_PADDING));
  assert (res_data != 0);
  assert (first_exact_ptr != 0);
  assert (last_exact_ptr != 0);

  signal_data = (complex *) sig_d_data;
  result_data = (complex *) res_data;

  part_n = cv1d_next_good_fft_size (2*flt.d_n);
  size_of_exact_data = part_n - flt.d_n + 1;

  nb_of_parts = ceil (((double) sig_n)/size_of_exact_data);
  assert (nb_of_parts >= 1);

  f_step = 2*M_PI/(part_n);

  if (flt.scale == CV1D_NO_SCALE) {
    flt_f_begin_index = (int) floor (flt.f_begin/f_step) ;
    flt_f_end_index = (int) ceil (flt.f_end/f_step) ;
    flt_d_end_index = (int) ceil (flt.d_end) ;
  } else {
    flt_f_begin_index = (int) floor (flt.f_begin/flt.scale/f_step);
    flt_f_end_index   = (int) ceil  (flt.f_end/flt.scale/f_step);
    flt_d_end_index   = (int) ceil  (flt.d_end*flt.scale);
  }

  signal_part = (complex *) malloc (sizeof (complex)*part_n);
  if (!signal_part) {
    EX_RAISE(mem_alloc_error);
  }
  signal_part_ft = (complex *) malloc (sizeof (complex)*part_n);
  if (!signal_part_ft) {
    EX_RAISE(mem_alloc_error);
  }
  filter_ft = (complex *) malloc (sizeof (complex)*part_n);
  if (!filter_ft) {
    EX_RAISE(mem_alloc_error);
  }

  /* Fill filter fourier form array. */

  if (flt.scale == CV1D_NO_SCALE) {
    if (flt.f_imag_ptr) {
      for (i = 0; i <= flt_f_end_index; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)(i*f_step));
	filter_ft[i].imag =
	  evaluator_evaluate_x(flt.f_imag_ptr,(double)(i*f_step));
      }
      for (; i < part_n+flt_f_begin_index; i++) {
	filter_ft[i].real = 0.0;
	filter_ft[i].imag = 0.0;
      }
      for (; i < part_n; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)((i-flt_f_end_index)*f_step));
	filter_ft[i].imag =
	  evaluator_evaluate_x(flt.f_imag_ptr,(double)((i-flt_f_end_index)*f_step));
      }
    } else { /* No function pointer for the imaginary part. */
      for (i = 0; i <= flt_f_end_index; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)(i*f_step));
	filter_ft[i].imag = 0.0;
      }    
      for (; i < part_n+flt_f_begin_index; i++) {
	filter_ft[i].real = 0.0;
	filter_ft[i].imag = 0.0;
      }
      for (; i < part_n; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)((i-flt_f_end_index)*f_step));
	filter_ft[i].imag = 0.0;
      }
    }
  } else { /* flt.scale != CV1D_NO_SCALE */
    if (flt.f_imag_ptr) {
      for (i = 0; i <= flt_f_end_index; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)(i*f_step)*flt.scale);
	filter_ft[i].imag =
	  evaluator_evaluate_x(flt.f_imag_ptr,(double)(i*f_step)*flt.scale);
      }
      for (; i < part_n+flt_f_begin_index; i++) {
	filter_ft[i].real = 0.0;
	filter_ft[i].imag = 0.0;
      }
      for (; i < part_n; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)((i-flt_f_end_index)*f_step)*flt.scale);
	filter_ft[i].imag =
	  evaluator_evaluate_x(flt.f_imag_ptr,(double)((i-flt_f_end_index)*f_step)*flt.scale);
      }
    } else { /* No function pointer for the imaginary part. */
      for (i = 0; i <= flt_f_end_index; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)(i*f_step)*flt.scale);
	filter_ft[i].imag = 0.0;
      }    
      for (; i < part_n+flt_f_begin_index; i++) {
	filter_ft[i].real = 0.0;
	filter_ft[i].imag = 0.0;
      }
      for (; i < part_n; i++) {
	filter_ft[i].real =
	  evaluator_evaluate_x(flt.f_real_ptr,(double)((i-flt_f_end_index)*f_step)*flt.scale);
	filter_ft[i].imag = 0.0;
      }
    }
  }

  /*
   * Compute the sum of the squared modulus of all the filter values.
   */

  flt_squared_mod_sum_ = 0.0;
  for (i = 0; i < part_n; i++) {
    flt_squared_mod_sum_ +=
      filter_ft[i].real*filter_ft[i].real
      + filter_ft[i].imag*filter_ft[i].imag;
  }
  flt_squared_mod_sum_ = flt_squared_mod_sum_/part_n;

  for (part_nb = 0; part_nb < nb_of_parts; part_nb++) {
    int part_begin_in_signal;

    part_begin_in_signal = part_nb*size_of_exact_data - flt_d_end_index;
    cv1d_get_part_c_ (signal_part, part_n,
		      signal_data, sig_n,
		      part_begin_in_signal,
		      border_effect);

    cv1d_fft_c (signal_part, signal_part_ft, part_n);

    cv1d_cplx_mult_ (signal_part_ft, filter_ft,
		     0, part_n - 1);

    cv1d_fft_c_i (signal_part_ft, signal_part, part_n);

    if (part_nb < (nb_of_parts - 1)) {
      memcpy (result_data + part_nb*size_of_exact_data,
	      signal_part + flt_d_end_index,
	      size_of_exact_data*sizeof (complex));
    } else {
      memcpy (result_data + part_nb*size_of_exact_data,
	      signal_part + flt_d_end_index,
	      (sig_n - part_nb*(size_of_exact_data))*sizeof (complex));
    }
  }

  free (signal_part);
  free (signal_part_ft);
  free (filter_ft);
  
  cv1d_set_f_l_exact_ (first_exact_ptr, last_exact_ptr);

  return res_data;

mem_alloc_error:
  free (signal_part);
  free (signal_part_ft);
  free (filter_ft);

  return 0;
}
Example #13
0
void *
cv1d_a_real_ft (int  border_effect,
		void *res_data,
		int  *first_exact_ptr,
		int  *last_exact_ptr)
{
  real   *signal_data;
  real   *result_data;

  real    *new_signal = 0;
  complex *new_signal_ft = 0;

  int     new_size;
  int     flt_f_begin_index;
  int     flt_f_end_index;
  int     flt_d_begin_index;
  int     flt_d_end_index;
  real    f_step;

  real flt_f_real_0;
  real flt_f_imag_0;
  
  assert (flt.def == ANALYTICAL);
  assert (flt.form != CV1D_UNDEFINED);
  assert (sig_form != CV1D_UNDEFINED);
  assert (sig_n >= flt.d_n);

  assert ((border_effect == CV1D_PERIODIC)
	  || (border_effect == CV1D_MIRROR)
	  || (border_effect == CV1D_PADDING)
	  || (border_effect == CV1D_0_PADDING));
  assert (res_data != 0);
  assert (first_exact_ptr != 0);
  assert (last_exact_ptr != 0);
  assert (cv1d_is_good_fft_size (sig_n));

  signal_data = (real *) sig_d_data;
  result_data = (real *) res_data;

  switch (border_effect) {
  case CV1D_0_PADDING:
    new_size = sig_n*2;
    break;
  case CV1D_PADDING:
    new_size = sig_n*2;
    break;
  case CV1D_MIRROR:
    new_size = sig_n*2;
    break;
  case CV1D_PERIODIC:
    new_size = sig_n;
    break;
  }
  f_step = 2*M_PI/(new_size);

  if (flt.scale == CV1D_NO_SCALE) {
    flt_f_begin_index = (int) floor (flt.f_begin) ;
    flt_f_end_index = (int) ceil (flt.f_end) ;
    flt_d_begin_index = (int) floor (flt.d_begin) ;
    flt_d_end_index = (int) ceil (flt.d_end) ;
  } else {
    flt_f_begin_index = (int) floor (flt.f_begin/flt.scale/f_step);
    flt_f_end_index   = (int) ceil  (flt.f_end/flt.scale/f_step);
    flt_d_begin_index = (int) floor (flt.d_begin*flt.scale);
    flt_d_end_index   = (int) ceil  (flt.d_end*flt.scale);
  }

  assert (new_size >= (2*max(flt_f_end_index, - flt_f_begin_index) + 1));

  switch (border_effect) {
  case CV1D_0_PADDING:
    new_signal = cv1d_0_padding_transform_ (signal_data,
					    sig_n,
					    flt_d_end_index);
    break;
  case CV1D_PADDING:
    new_signal = cv1d_padding_transform_ (signal_data,
					  sig_n,
					  flt_d_end_index);
    break;
  case CV1D_MIRROR:
    new_signal = cv1d_mirror_transform_ (signal_data,
					 sig_n,
					 flt_d_end_index);
    break;
  case CV1D_PERIODIC:
    new_signal = signal_data;
    break;
  }
  if (!new_signal) {
    EX_RAISE(mem_alloc_error);
  }

  new_signal_ft = (complex *) malloc (sizeof (complex)*new_size/2);
  if (!new_signal_ft) {
    EX_RAISE(mem_alloc_error);
  }

  cv1d_fft_r (new_signal, new_signal_ft, new_size);

  flt_squared_mod_sum_ = 0.0;

  if (flt.scale == CV1D_NO_SCALE) {
    flt_f_real_0 = evaluator_evaluate_x(flt.f_real_ptr,0.0);
    flt_f_imag_0 = evaluator_evaluate_x(flt.f_real_ptr,(double)new_size/2*f_step);
    new_signal_ft[0].real *= flt_f_real_0;
    new_signal_ft[0].imag *= flt_f_imag_0;
    cv1d_cplx_mult_num_ana_ (new_signal_ft, flt.f_real_ptr, flt.f_imag_ptr,
			     1, new_size/2 - 1, f_step, 0.0);
    flt_squared_mod_sum_ *= 2;
    flt_squared_mod_sum_ +=
      flt_f_real_0*flt_f_real_0 + flt_f_imag_0*flt_f_imag_0;
  } else {
    flt_f_real_0 = flt.scale*evaluator_evaluate_x(flt.f_real_ptr,0.0*flt.scale);
    flt_f_imag_0 =  flt.scale
      * evaluator_evaluate_x(flt.f_real_ptr, (double)new_size/2*f_step*flt.scale);
    new_signal_ft[0].real *= flt_f_real_0;
    new_signal_ft[0].imag *= flt_f_imag_0;
    cv1d_mult_with_scaled_ft_fct_ (new_signal_ft, flt.f_real_ptr, flt.f_imag_ptr,
				   flt.scale, 1, new_size/2 - 1, f_step, 0.0);
    flt_squared_mod_sum_ *= 2;
    flt_squared_mod_sum_ +=
      flt_f_real_0*flt_f_real_0 + flt_f_imag_0*flt_f_imag_0;
  }

  flt_squared_mod_sum_ = flt_squared_mod_sum_/new_size;
  
  if (border_effect == CV1D_PERIODIC) {
    cv1d_fft_r_i (new_signal_ft, result_data, new_size);
  } else {
    cv1d_fft_r_i (new_signal_ft, new_signal, new_size);
    memcpy (result_data, new_signal, sig_n*sizeof (real));
    free (new_signal);
  }

  free (new_signal_ft);
  
  cv1d_set_f_l_exact_ (first_exact_ptr, last_exact_ptr);
  return res_data;

mem_alloc_error:
  free (new_signal_ft);
  free (new_signal);


  return 0;
}