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; }
/* 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; }