[Kst] [Bug 102785] New: plugin crashes kst with error Alarm Clock

Brendan Crill bpc at ipac.caltech.edu
Tue Mar 29 20:24:42 CEST 2005


------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=102785         
           Summary: plugin crashes kst with error Alarm Clock
           Product: kst
           Version: 1.0.0
          Platform: Debian testing
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: crash
          Priority: NOR
         Component: general
        AssignedTo: kst kde org
        ReportedBy: bpc ipac caltech edu


Version:           1.0.0 (using KDE KDE 3.3.2)
Installed from:    Debian testing/unstable Packages
Compiler:          gcc 3.3.5 
OS:                Linux

Here's the plugin source code.

-----------
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

#define RADEG 57.29578
#define N_P 3
#define MAX_ITER 10000
int vary_param[N_P] = {1,1,1};

extern "C" int xpol(const double *const inArrays[], const int inArrayLens[],
         const double is[],
         double *outArrays[], int outArrayLens[],
         double outScalars[]);


double fit_function (double x, double*p) {
  return p[0]*(1.0 - (1-p[1])*sin((x-p[2])/RADEG)*sin((x-p[2])/RADEG));
}

double Chi2(double*x,double*y,double*p,int npts) {
  double term;
  double sum=0.0;
  int i;

  for (i=0;i<npts;i++) {
    term = y[i] - fit_function(x[i],p);
    sum += term*term;
  }
  return sum;
}

double maximum(double* x,int npts) {
  int i;
  double result = -1e99;

  for (i=0;i<npts;i++) {
    if (x[i]>result) result = x[i];
  }
  return result;
}


double minimum(double*x,int npts) {
  int i;
  double result = 1e99;

  for (i=0;i<npts;i++) {
    if (x[i]<result) result = x[i];
  }
  return result;
}
int mindex(double*x,int npts) {
  int i;
  int result=0;
  double min=1e99;

  for (i=0;i<npts;i++) {
    if (x[i]<min) {min = x[i];result=i;}
  }
  return result;


}

int maxdex(double*x,int npts) {
  int i;
  int result=0;
  double max=0.0;

  for (i=0;i<npts;i++) {
    if (x[i]>max) {max = x[i];result=i;}
  }
  return result;


}

double guess_phase(double*x,double*y,int npts){
  int min,max,i;

  min = mindex(y,npts);
  max = maxdex(y,npts);

  i = max;

  return (double)x[i];

}

void Search_BruteFit(double*x,double*y,int npts,double*p,
       double*error,double*covar,int skip)
{
  double *diff;
  int curpar;
  double *input,*guess_apr;
  int done,really_done;
  int m,n_iter,i=0,j;
  double a1,a2,a3;
  double x1,x2,x3,x4;
  double last_x;

  diff = (double*)malloc(N_P*sizeof(double));
  input =  (double*)malloc(N_P*sizeof(double));
  guess_apr = (double*)malloc(N_P*sizeof(double));

  really_done = 0;

  for (i=0;i<N_P;i++) {
    guess_apr[i] = p[i];
    diff[i] = p[i]/100.0;
  }

  if (!skip) {
  while (!really_done) {
    n_iter=0;
    curpar=0;
    n_iter++;
    while ((curpar<N_P)) {
      // figure out whether to go up or down in parameter space
      done = 0;
      x2=Chi2(x,y,guess_apr,npts);
      guess_apr[curpar]+=diff[curpar];
      x3=Chi2(x,y,guess_apr,npts);
      guess_apr[curpar]-=2.0*diff[curpar];
      x1=Chi2(x,y,guess_apr,npts);
      guess_apr[curpar]+=diff[curpar];
      // which way is the direction of decreasing chi^2 ?
      if (x1<x2) { diff[curpar]*=-1.0;}
      if (x3<x2) { diff[curpar]*=1.0;}
      if ((x1<x2)||(x3<x2)){
 really_done=0;
 // keep incrementing parameter until chi^2 increases again
 do {
   guess_apr[curpar]+=diff[curpar];
   last_x=x2;
   x2 = Chi2(x,y,guess_apr,npts);
   if (n_iter>MAX_ITER) {done=1; really_done=1;}
 } while ((x2<last_x)&&(!done));
      } else { really_done=1;}
      if (!done) {
 guess_apr[curpar]-=diff[curpar];
 if (diff[curpar]<0.0) {diff[curpar]*=-1.0;}
 // use parabola method to find real minimum in this parameter
 a1 = guess_apr[curpar]-diff[curpar];
 a2 = guess_apr[curpar];
 a3 = guess_apr[curpar]+diff[curpar];
 for (m=0;m<N_P;m++) { input[m]=guess_apr[m];}
 input[curpar]=a1;
 x1=Chi2(x,y,input,npts);
 input[curpar]=a2;
 x2=Chi2(x,y,input,npts);
 input[curpar]=a3;
 x3=Chi2(x,y,input,npts);
 guess_apr[curpar]=a3-diff[curpar]*((x3-x2)/(x1-2*x2+x3)+0.5);
 error[curpar]=2.0/(x1-2*x2+x3);
 if (error[curpar]>=0.0) {
   error[curpar]=diff[curpar]*sqrt(error[curpar]);
 } else {
   error[curpar]=99.;
 }
      } else {
 error[curpar]=99.;
 p[curpar]=99.;
 really_done=1;
      }
      curpar++;
      while (!vary_param[curpar] && (curpar<N_P)) curpar++;
      if ((!really_done)&&(curpar==N_P)) curpar=0;
      if (n_iter>MAX_ITER) {really_done=1;error[0]=99.;}
    }
  }

  for (m=0;m<N_P;m++) {
    p[m]=guess_apr[m];

    if (diff[m]<0.0) diff[m]*=-1.0;
  }
  // compute co-variance
  for (m=0;m<N_P;m++){
    i = m+1;
    if (m==N_P) i=0;

    for (j=0;j<N_P;j++){
      input[j]=p[j];
    }

    input[i]+=diff[i]; input[m]+=diff[m]; x1 = Chi2(x,y,input,npts);
    input[m]-=2.*diff[m]; x2 = Chi2(x,y,input,npts);
    input[i]-=2.*diff[i]; x4 = Chi2(x,y,input,npts);
    input[m]+=2.*diff[m]; x3 = Chi2(x,y,input,npts);

    covar[m]=(x1-x2-x3+x4)/diff[m]/diff[i]/4.0;
    covar[m]=1.0/covar[m];
  }
  } else {
    for (i=0;i<N_P;i++)
      p[i]=guess_apr[i];
  }

  free(guess_apr); free(input); free(diff);
  
}

int xpol(const double *const inArrays[], const int inArrayLens[],
  const double is[],
  double *outArrays[], int outArrayLens[],
  double outScalars[])
{
  double *p;
  double *error;
  double *covar;
  double *x,*y;
  int npts;
  int i;

  npts =  inArrayLens[0];
  outArrayLens[0] = inArrayLens[0];

  outArrays[0]=(double*)realloc(outArrays[0], npts*sizeof(double));

  p = (double*)malloc(N_P*sizeof(double));
  error = (double*)malloc(N_P*sizeof(double));
  covar =  (double*)malloc(N_P*sizeof(double));
  x = (double*)malloc(npts*sizeof(double));
  y = (double*)malloc(npts*sizeof(double));

  for (i=0;i<npts;i++){
    x[i] = inArrays[0][i];
    y[i] = inArrays[1][i];
  }

  // initial guess
  p[0] = maximum(y,npts);
  p[1] = minimum(y,npts)/p[0];
  p[2] = guess_phase(x,y,npts);

  printf("guess:%g\n",p[1]);
  Search_BruteFit(x,y,npts,p,error,covar,0);

  outScalars[0] = p[1];
  
  printf("result:%g\n",p[1]);

  for (i=0;i<inArrayLens[0]; i++)
    outArrays[0][i] = fit_function(x[i],p);

  free(x); free(y);
  free(p); free(error); free(covar);

  printf("at end of program..\n");

  return 0;
}


More information about the Kst mailing list