int CheckIfInsideShrinkingGrain(double P0[]){
	int counter = 0;
	int i, j;
	double xinters;
	double P1[2], P2[2];

	for (j = 0; j < 2; j++) {
		if (P0[j] < 0.0) P0[j] += LENGTH[j];
		else if (P0[j] > LENGTH[j]) P0[j] -= LENGTH[j];
	}

	for (j = 0; j < 2; j++) P1[j] = VXPOINT[0][j];
	for (i = 1; i <= NVERTEX; i++) {
		for (j = 0; j < 2; j++) P2[j] = VXPOINT[(i%NVERTEX)][j];
		if (P0[1] > whichmin(P1[1], P2[1])) {
			if (P0[1] <= whichmax(P1[1], P2[1])) {
				if (P0[0] <= whichmax(P1[0], P2[0])) {
					if (P1[1] != P2[1]) {
						xinters = (P0[1]-P1[1])*(P2[0] - P1[0])/(P2[1]-P1[1]) + P1[0];
						if (P1[0] == P2[0] || P0[0] <= xinters) {
							counter++;
						}
					}
				}
			}
		}
		for (j = 0; j < 2; j++) P1[j] = P2[j];
	}

	if (counter % 2 == 0) 
		return 0; //Outside
	else
		return 1;	//Inside
}
Ejemplo n.º 2
0
char *viterbi(double *pars,double **eprob,double **tprob,int nSites){
  //  fprintf(stderr,"[%s] %f %f %f\n",__FUNCTION__,pars[0],pars[1],pars[2]);
  double logres[3]={log(pars[0]),log(pars[1]),log(pars[2])};
  //  fprintf(stderr,"init logres: %f %f %f\n",logres[0],logres[1],logres[2]);

  double **res = new double*[3];
  char **ptr = new char*[3];
  for(int i=0;i<3;i++){
    ptr[i] = new char[nSites];
    res[i] = new double[nSites];
    res[i][0] = logres[i]+eprob[i][0]; 
  }
  
  for(int i=1;i<nSites;i++){
    res[0][i] = eprob[0][i]+max(log(tprob[T00][i])+res[0][i-1],log(tprob[T10][i])+res[1][i-1],log(tprob[T20][i])+res[2][i-1]);
    res[1][i] = eprob[1][i]+max(log(tprob[T01][i])+res[0][i-1],log(tprob[T11][i])+res[1][i-1],log(tprob[T21][i])+res[2][i-1]);
    res[2][i] = eprob[2][i]+max(log(tprob[T02][i])+res[0][i-1],log(tprob[T12][i])+res[1][i-1],log(tprob[T22][i])+res[2][i-1]);
    ptr[0][i] =        whichmax(log(tprob[T00][i])+res[0][i-1],log(tprob[T10][i])+res[1][i-1],log(tprob[T20][i])+res[2][i-1]);
    ptr[1][i] =        whichmax(log(tprob[T01][i])+res[0][i-1],log(tprob[T11][i])+res[1][i-1],log(tprob[T21][i])+res[2][i-1]);
    ptr[2][i] =        whichmax(log(tprob[T02][i])+res[0][i-1],log(tprob[T12][i])+res[1][i-1],log(tprob[T22][i])+res[2][i-1]);
  }
  
  double loglike = max(res[0][nSites-1],res[1][nSites-1],res[2][nSites-1]);
  fprintf(stderr,"[%s] \tloglike=%f\n",__FUNCTION__,loglike);

  
  char *vit = new char[nSites];
  vit[nSites-1] = whichmax(ptr[0][nSites-1],ptr[1][nSites-1],ptr[2][nSites-1]);  
  for(int i=(nSites-1);i>0;i--)
    if(vit[i]==2)
      vit[i-1] = ptr[2][i];
    else if(vit[i]==1)
      vit[i-1] = ptr[1][i];
    else 
      vit[i-1] = ptr[0][i];
  
  return vit;
}
Ejemplo n.º 3
0
SEXP getLabels(SEXP mod, SEXP dataset) {
	// compute responsibilities w.r.t classic EM style
	
	PROTECT(mod=coerceVector(mod, VECSXP));
	PROTECT(dataset=coerceVector(dataset, REALSXP));
	
	int k = length(coerceVector(getListElement(mod, "w"), REALSXP));
	int n = INTEGER(getAttrib(dataset, R_DimSymbol))[0];
	int d = INTEGER(getAttrib(dataset, R_DimSymbol))[1];
	

	// build a  nxk matrix containing temp results
	gsl_matrix *response = gsl_matrix_calloc(n, k);
	gsl_vector_view view;
	
	SEXP current;
	for(int i=0; i<k; i++) {
		current = mvndensity(coerceVector(VECTOR_ELT(coerceVector(getListElement(mod, "mean"), VECSXP), i), REALSXP),
			coerceVector(VECTOR_ELT(coerceVector(getListElement(mod, "cov"), VECSXP), i), REALSXP), dataset);
		view = gsl_matrix_column(response, i);
		SXPtoVector(&(view.vector), current);
		gsl_vector_scale(&(view.vector), REAL(coerceVector(getListElement(mod, "w"), REALSXP))[i]);
	}
	
	gsl_vector *gslres = gsl_vector_alloc(n);
	
	for(int i=0; i<n; i++) {
		view = gsl_matrix_row(response, i);
		gsl_vector_set(gslres, i, (double)whichmax(&(view.vector))+1.0);
	}
	
	SEXP res;
	PROTECT(res=allocVector(INTSXP, n));
	intVectorToSXP(&res, gslres);
	
	gsl_matrix_free(response);
	gsl_vector_free(gslres);
	UNPROTECT(3);
	return(res);
	

}
Ejemplo n.º 4
0
void caspar(double *Xpass, double *Y, double *Xtestpass, double *Ytest, int *npass, int *ppass, int *ntestpass, double *plocs, double *palpha, double *ph, int *psequ, double *psse, int *ptrace){
  double **X, **XT, **Xtest, **gram, **TG, **TGI, **BT, *locs, *kern;
  double h = *ph, alpha = *palpha, dstep = 1.0;
  int n = *npass, p = *ppass, nt = *ntestpass;
  int i,j, *numneigh, ncount, **neigh;
  int *pcode; int verbose = *ptrace;

  pcode = (int *)calloc(1,sizeof(int));

  if(alpha == 0.0) alpha = .0001;

  X = (double **)calloc(n, sizeof(double *));
  for(i=0;i<n;i++) X[i] = (double *)calloc(p,sizeof(double));

  Xtest = (double **)calloc(nt, sizeof(double *));
  for(i=0;i<nt;i++) Xtest[i] = (double *)calloc(p,sizeof(double));

  XT = (double **)calloc(p, sizeof(double *));
  for(i=0;i<p;i++) XT[i] = (double *)calloc(n,sizeof(double));

  gram = (double **)calloc(p, sizeof(double *));
  for(i=0;i<p;i++) gram[i] = (double *)calloc(p,sizeof(double));

  TG = (double **)calloc(p, sizeof(double *));
  for(i=0;i<p;i++) TG[i] = (double *)calloc(p,sizeof(double));

  TGI = (double **)calloc(p, sizeof(double *));
  for(i=0;i<p;i++) TGI[i] = (double *)calloc(p,sizeof(double));

  BT = (double **)calloc(p, sizeof(double *));
  for(i=0;i<p;i++) BT[i] = (double *)calloc(n,sizeof(double));

  neigh = (int **)calloc(p, sizeof(int *));
  for(i=0;i<p;i++) neigh[i] = (int *)calloc(p,sizeof(int));

  locs = (double *)calloc(p*p, sizeof(double));
  kern = (double *)calloc(p, sizeof(double));
  for(i=0;i<p;i++) kern[i] = alpha;
  for(i=0;i<(p*p);i++) locs[i] = plocs[i];
  numneigh = (int *)calloc(p, sizeof(int));


  for(i=0;i<n;i++)
    for(j=0;j<p;j++)
      X[i][j] = Xpass[j*n + i];
  for(i=0;i<nt;i++)
    for(j=0;j<p;j++)
      Xtest[i][j] = Xtestpass[j*nt + i];
  for(i=0;i<n;i++)
    for(j=0;j<p;j++)
      XT[j][i] = X[i][j];

  MatrixTMultiplyB(X,X,p,n,p,gram);

  int step = 0;
  int takestep;
  double **tempdes;
  double **tempdestest;

  tempdes = (double **)calloc(n, sizeof(double *));
  for(i=0;i<n;i++) tempdes[i] = (double *)calloc(p, sizeof(double));
  tempdestest = (double **)calloc(nt, sizeof(double *));
  for(i=0;i<nt;i++) tempdestest[i] = (double *)calloc(p, sizeof(double));

  int *sequ; 
  sequ = (int *)calloc(p, sizeof(int));
  for(i=0;i<p;i++) sequ[i] = -1;
  double *corz; 
  corz = (double *)calloc(p, sizeof(double));
  double *cres;
  cres = (double *)calloc(n, sizeof(double));
  double *crestest;
  crestest = (double *)calloc(nt, sizeof(double));
  double *beta;
  beta = (double *)calloc(p, sizeof(double));
  double deter;

  for(i=0;i<n;i++) cres[i] = Y[i];
  for(i=0;i<nt;i++) crestest[i] = Ytest[i];

  int cutalg = p;
  if(p > n) cutalg = n;

  while(step < cutalg){
    j=0;

    for(i=0;i<p;i++){
      if(inintvec(step, i, sequ) == 0){
	corz[i] = kern[i] * fabs(corel(n, cres, XT[i]));
      }
      else{
	corz[i] = 0.0;
      }
    }

    takestep = whichmax(p,corz);

    if(step == 0) takestep = 0;

    if(verbose == 1){
      Rprintf(" [%d : %d | %d] ", step, n, p);
      Rprintf("STEP: %d",takestep+1);
    }
    sequ[step]  = takestep;
    psequ[step] = takestep;
    
    if(step > 0){
      for(i=0;i<p;i++) 
	if(kern[i] != alpha && step >0) 
	  kern[i] = (kern[i] - alpha)*(dstep-1.0)/(dstep) + alpha;
      //for(i=0;i<p;i++) kern[i] += (1.0-alpha)*depan(fabs(locs[i] - locs[sequ[step]])/h)/dstep;
      for(i=0;i<p;i++) 
	kern[i] += (1.0-alpha)*depan(locs[sequ[step]*p + i]/h)/dstep;
      /*
      for(i=0;i<p;i++) 
	Rprintf("(%g)",kern[i]);
      */
    }


    for(i=0;i<n;i++)
      tempdes[i][step] = X[i][sequ[step]];
    for(i=0;i<nt;i++)
      tempdestest[i][step] = Xtest[i][sequ[step]];

    for(i=0;i<(step+1);i++)
      for(j=0;j<(step+1);j++)
	TG[i][j] = gram[sequ[i]][sequ[j]];

    MatInvF(TG,step+1,TGI,pcode);
    if(verbose == 1) Rprintf(" [I: %d]\n",pcode[0]);

    if(step + 1 == 1) TGI[0][0] = 1.0 / TG[0][0];

    MatrixTMultiplyA(TGI,tempdes,step+1,step+1,n,BT);
    
    for(i=0;i<(step+1);i++){
      beta[i] = inner(BT[i],Y,n);
    }

    for(i=0;i<n;i++)
      cres[i] = Y[i] - inner(tempdes[i],beta,step+1);

    for(i=0;i<nt;i++)
      crestest[i] = Ytest[i] - inner(tempdestest[i],beta,step+1);

    for(i=0;i<nt;i++)
      psse[step] += crestest[i]*crestest[i];
    
    psse[step] /= nt;
    
    step ++;
    dstep = dstep + 1.0;
  }

  for(i=0;i<n;i++) free(X[i]);
  free(X);
  for(i=0;i<p;i++) free(XT[i]);
  free(XT);
  for(i=0;i<nt;i++) free(Xtest[i]);
  free(Xtest);
  for(i=0;i<p;i++) free(gram[i]);
  free(gram);
  for(i=0;i<p;i++) free(TG[i]);
  free(TG);
  for(i=0;i<p;i++) free(TGI[i]);
  free(TGI);
  for(i=0;i<p;i++) free(BT[i]);
  free(BT);
  for(i=0;i<p;i++) free(neigh[i]);
  free(neigh);
  for(i=0;i<n;i++) free(tempdes[i]);
  free(tempdes);
  for(i=0;i<nt;i++) free(tempdestest[i]);
  free(tempdestest);

  free(locs);
  free(kern);
  free(numneigh);
  free(sequ);
  free(corz);
  free(cres);
  free(crestest);
  free(beta);
}