Beispiel #1
0
void main_comp(double *A1, double *B1, int N, int n, int K, int ngrid, double data[], double data1[], int delta[], int **freq, double *grid, double **F, double **Fsmooth, double **hazard, const char *appdir)
{
    int             i,j,k,**ind,iterations,n_Iterations=1000;
    int             *njumps;
    double          phi,**fdens;
    double          step,**p,**jumploc;
    double          A,B,c,h;
    SampleTime		*obs;
    
    
    delta[0]=0;
    data[0]=data1[0]=0;
        
    obs = new SampleTime[N];
    
    for (i=0; i<N; i++)
    {
        obs[i].t = data[i+1];
        obs[i].delta = delta[i+1];
    }
    
    qsort(obs,N,sizeof(SampleTime),CompareTime);
    
    for (i=0; i<N; i++)
    {
        data[i+1]= obs[i].t ;
        delta[i+1] = obs[i].delta;
    }
    
    ind = new int *[K+2];
    
    
    for (i=0;i<K+2;i++)
        ind[i]= new int[N+1];
    
    for (k=1;k<=K+1;k++)
        F[k][0]=0;
    
    njumps = new int[K+2];
    fdens= new double *[K+2];
    p= new double *[K+2];
    jumploc= new double *[K+2];
    
    
    for (i=0;i<K+2;i++)
    {
        fdens[i]= new double[ngrid+1];
        p[i]= new double[n+1];
        jumploc[i]= new double[n+1];
    }
    
    
    ICM(N,n,freq,K,ind,F,n_Iterations,&phi,&iterations);
    
    ofstream file2_("MLE.txt");
    
    if (file2_.is_open())
    {
        for (i=1;i<=n;i++)
        {
            if (F[K+1][i]>F[K+1][i-1])
            {
                file2_ << setprecision(11) << setw(20) << data1[i];
                for (k=1;k<=K+1;k++)
                    file2_ << setprecision(11) <<  setw(20) << F[k][i];
                file2_ << "\n";
            }
        }
        file2_.close();
    }

    
    for (k=1;k<=K+1;k++)
    {
        j=0;
        for (i=1;i<=n;i++)
        {
            if (F[k][i]>F[k][i-1])
            {
                p[k][j]=F[k][i]-F[k][i-1];
                jumploc[k][j]=data1[i];
                j++;
            }
        }
        njumps[k]=j;
    }
    
    A=min(N,data);
    B=max(N,data);
    *A1=A;
    *B1=B;
    step=(B-A)/ngrid;
    
    c=B;
    
    for (i=0;i<=ngrid;i++)
        grid[i]=A+i*step;
    
    h = fmin(c*pow(N,-1.0/7),9.9);
    
    
    for (i=0;i<=ngrid;i++)
    {
        for (k=1;k<K+1;k++)
            fdens[k][i]=dens_estimate(A,B,k,njumps,jumploc,p,h,grid[i]);
    }
    
    h = B*pow(N,-1.0/5);
    
    
    for (i=0;i<=ngrid;i++)
    {
        for (k=1;k<=K;k++)
            Fsmooth[k][i]=bdf(A,B,k,njumps,jumploc,p,h,grid[i]);
    }
    
    for (i=0;i<=ngrid;i++)
    {
        for (k=1;k<=K;k++)
            hazard[k][i]=fdens[k][i]/(1-Fsmooth[k][i]);
    }
    
    ofstream file_("SMLE.txt");

    if (file_.is_open())
    {
        for (i=1;i<=ngrid;i++)
        {
            file_ << setprecision(10) << setw(20) << grid[i];
            for (k=1;k<K+1;k++)
                file_ << setprecision(10) <<  setw(20) << Fsmooth[k][i];
            file_ << "\n";
        }
        file_.close();
    }
    
    ofstream file1_("data.txt");
    
    if (file1_.is_open())
    {
        for (i=1;i<=N;i++)
        {
            file1_ << setprecision(11) << setw(20) << data[i];
            file1_ <<  setw(10) << delta[i];
            file1_ << "\n";
        }
        file1_.close();
    }
    
    
    
    ofstream file3_("hazard.txt");
    
    if (file3_.is_open())
    {
        for (i=1;i<=ngrid;i++)
        {
            file3_ << setprecision(10) << setw(20) << grid[i];
            for (k=1;k<K+1;k++)
                file3_ << setprecision(10) <<  setw(20) << hazard[k][i];
            file3_ << "\n";
        }
        file3_.close();
    }
    
    // free memory
    
    for (i = 0; i < K+2; i++)
         delete[] ind[i], delete[] p[i], delete[] jumploc[i], delete[] fdens[i];
    
    delete[] ind, delete[] p, delete[] jumploc, delete[] njumps, delete[] fdens;
    
    delete[] obs;
}
Beispiel #2
0
/* perform adaptive MAP on given src and initial segmentation label */
void Amap(double *src, unsigned char *label, unsigned char *prob, double *mean, int n_classes, int niters, int sub, int *dims, int pve, double weight_MRF, double *voxelsize, int niters_ICM, double offset)
{
  int i, nix, niy, niz;
  int area, nvol, vol;
  int histo[65536];
  int n[MAX_NC], j;
  double var[MAX_NC];
  double thresh[2], beta[1];
  double min_src = HUGE, max_src = -HUGE;
  int cumsum[65536];
  struct point *r;
      
  area = dims[0]*dims[1];
  vol = area*dims[2];
 
  for(i = 0; i < vol; i++) {
    min_src = MIN(src[i], min_src);
    max_src = MAX(src[i], max_src);
  }
  
  /* build histogram */
  for(i = 0; i < 65536; i++) histo[i] = 0;
  for(i = 0; i < vol; i++) {
    if (label[i] == 0) continue;
    histo[(int)ROUND(65535.0*(src[i]-min_src)/(max_src-min_src))]++;
  }

  /* find values between 1% and 99% quartile */
  cumsum[0] = histo[0];
  for(i = 1; i < 65536; i++) cumsum[i] = cumsum[i-1] + histo[i];
  for(i = 0; i < 65536; i++) cumsum[i] = (int) ROUND(1000.0*(double)cumsum[i]/(double)cumsum[65535]);
  for(i = 0; i < 65536; i++) if (cumsum[i] >= 10) break;
  thresh[0] = (double)i/65535.0*(max_src-min_src);
  for(i = 65535; i > 0; i--) if (cumsum[i] <= 990) break;
  thresh[1] = (double)i/65535.0*(max_src-min_src);
 
  /* define grid dimensions */
  nix = (int) ceil((dims[0]-1)/((double) sub))+1;
  niy = (int) ceil((dims[1]-1)/((double) sub))+1;
  niz = (int) ceil((dims[2]-1)/((double) sub))+1; 
  nvol  = nix*niy*niz;

  r = (struct point*)malloc(sizeof(struct point)*MAX_NC*nvol);
  if(r == NULL) {
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }
    
  /* estimate 3 classes before PVE */
  EstimateSegmentation(src, label, prob, r, mean, var, n_classes, niters, sub, dims, thresh, beta, offset);
  
  /* Use marginalized likelihood to estimate initial 5 or 6 classes */
  if (pve) {

    ComputeInitialPveLabel(src, label, prob, r, n_classes, sub, dims, pve);
    n_classes = pve;
    
    /* recalculate means for pure and mixed classes */
    for(j = 0; j < n_classes; j++) {
      n[j] = 0;
      mean[j] = 0.0;
    }
    for(i = 0; i < vol; i++) {
      if(label[i] == 0) continue;
      n[label[i]-1]++;
      mean[label[i]-1] += src[i];
    }
    for(j = 0; j < n_classes; j++) mean[j] /= n[j];
  }
  
  /* use much smaller beta for if no pve is selected */
  if(!pve) beta[0] /= 20.0;
  
  /* Iterative Conditional Mode */
  if(niters_ICM > 0) {
    if(weight_MRF != 1.0) {
      beta[0] *= weight_MRF;
      printf("Weighted MRF beta %3.3f\n",beta[0]);
    }
  
    ICM(prob, label, n_classes, dims, beta[0], niters_ICM, voxelsize);
  }
  
  free(r);

  return;    
}