Exemple #1
0
/**
 @param[in] vetrices array of vetrices (so far only for 3)
 @param[in] E material constatn E
 @param[in] mi material constatn mi
 @param[in] fs volume force vector
 @param[out] stifMat stifness matrix (array 36 long)
 @param[out]
 */
void elastLoc(Point *vetrices[], PetscReal E, PetscReal mi, PetscReal *fs,
              PetscReal *stifMat, PetscReal *bL) {

    PetscReal
    T[] =
    { 1, 1, 1, vetrices[0]->x, vetrices[1]->x, vetrices[2]->x, vetrices[0]->y, vetrices[1]->y, vetrices[2]->y };

    PetscReal phiGrad[] = { vetrices[1]->y - vetrices[2]->y, vetrices[2]->x
                            - vetrices[1]->x, vetrices[2]->y - vetrices[0]->y, vetrices[0]->x
                            - vetrices[2]->x, vetrices[0]->y - vetrices[1]->y, vetrices[1]->x
                            - vetrices[0]->x
                          };

    //PetscPrintf(PETSC_COMM_SELF, "DET:%e \n", matrixDet(T, 3));

    PetscReal detT = fabs(matrixDet(T, 3));

    PetscReal phiGradT[6];
    matrixTranspose(phiGrad, 3, 2, phiGradT);

    double Cmu[] = { 2, 0, 0, 0, 2, 0, 0, 0, 1 };
    //double Clm[] = { 1, 1, 0, 1, 1, 0, 0, 0, 0 }; Why is this never used?
    PetscReal C[] = { 1 - mi, mi, 0, mi, 1 - mi, 0, 0, 0, (1 - 2 * mi) / 2 };

    matrixSum(C, E / ((1 + mi) * (1 - 2 * mi)), Cmu, 0, C, 3, 3);

    double R[18], RT[18];
    for (int i = 0; i < 18; i++)
        R[i] = 0;

    int idxR1[] = { 0, 2 };
    int idxC1[] = { 0, 2, 4 };
    int idxR2[] = { 2, 1 };
    int idxC2[] = { 1, 3, 5 };

    matrixSetSub(R, 3, 6, idxR1, 2, idxC1, 3, phiGradT);
    matrixSetSub(R, 3, 6, idxR2, 2, idxC2, 3, phiGradT);

    matrixTranspose(R, 3, 6, RT);

    PetscReal temp[18];

    matrixMult(C, 3, 3, R, 3, 6, temp);
    matrixMult(RT, 6, 3, temp, 3, 6, stifMat);

    matrixSum(stifMat, 1 / (2 * detT), stifMat, 0, stifMat, 6, 6);
    //PetscPrintf(PETSC_COMM_SELF, "%e %e \n", fs[0], fs[1]);

    //Volume Force
    for (int i = 0; i < 3; i++) {
        bL[i * 2] = detT / 6 * fs[0];
        bL[i * 2 + 1] = detT / 6 * fs[1];
    }

    //@TODO Edge Force!!!
}
void ParamContainerEmissions::setGaussianSIGMA(double **sigma) {
	int i,j;
	for(i=0; i<D; i++) {
		for(j=0; j<D; j++) {
			this->sigma[i][j] = sigma[i][j];
			this->inverseSigma[i][j] = sigma[i][j];
		}
	}
	inverse(inverseSigma, this->D);
	this->determinant = matrixDet(sigma, this->D);
}
/**
 * 01) ParamContainerEmissions Constructor for MULTIVARIATEGAUSSIAN
 *
 */
ParamContainerEmissions::ParamContainerEmissions(double **mu, double **sigma, double regularize, int D, int* start, int updateCov, int sharedCov) {
    
    //printf("create container");
    //cout<<"create container";
	this->logCovPrior = 0;
	this->updateCov = updateCov;
	this->sharedCov = sharedCov;
	this->whichone = MULTIVARIATEGAUSSIAN;
	this->mu = mu;
	this->sigma = sigma;
	this->regularize = regularize;
	this->D = D;
	this->start=start;
    
	this->inverseSigma = allocateNumericMatrix(D, D);
	int i,j;
	for(i=0; i<D; i++) {
		for(j=0; j<D; j++) {
			this->inverseSigma[i][j] = this->sigma[i][j];
            //cout<< this->inverseSigma[i][j]<<" ";

		}
        //cout<<endl;
	}
    //cout<<endl;
	inverse(this->inverseSigma, D);
	//printf("whichone: %d dimension %d , arraystartsize %d \n", this->whichone, D, ARRAYSIZE(start));
	//LapackInvAndDet(this->inverseSigma, D);

	this->determinant = matrixDet(sigma, D);
	//cout<<"determinant "<< this->determinant<<endl;
	int mem = sizeof(double*)*D + sizeof(double)*1 + 2*sizeof(double*)*D + 2*sizeof(double)*D;
	if(DEBUG_MEMORY) {
		//printf("new->ParamContainerEmissions:MULTIVARIATEGAUSSIAN ; (%d bytes) ", mem);
	}
    //cout<<"new->ParamContainerEmissions:MULTIVARIATEGAUSSIAN ; (%d bytes) "<< mem<<endl;;
}
void gibbsOneWayAnova(double *y, int *N, int J, int sumN, int *whichJ, double rscale, int iterations, double *chains, double *CMDE, SEXP debug, int progress, SEXP pBar, SEXP rho)
{
	int i=0,j=0,m=0,Jp1sq = (J+1)*(J+1),Jsq=J*J,Jp1=J+1,npars=0;
	double ySum[J],yBar[J],sumy2[J],densDelta=0;
	double sig2=1,g=1;
	double XtX[Jp1sq], ZtZ[Jsq];
	double Btemp[Jp1sq],B2temp[Jsq],tempBetaSq=0;
	double muTemp[J],oneOverSig2temp=0;
	double beta[J+1],grandSum=0,grandSumSq=0;
	double shapeSig2 = (sumN+J*1.0)/2, shapeg = (J+1.0)/2;
	double scaleSig2=0, scaleg=0;
	double Xty[J+1],Zty[J];
	double logDet=0;
	double rscaleSq=rscale*rscale;
	
	double logSumSingle=0,logSumDouble=0;

	// for Kahan sum
	double kahanSumSingle=0, kahanSumDouble=0;
	double kahanCSingle=0,kahanCDouble=0;
	double kahanTempT=0, kahanTempY=0;
	
	int iOne=1, info;
	double dZero=0;
		

	// progress stuff
	SEXP sampCounter, R_fcall;
	int *pSampCounter;
    PROTECT(R_fcall = lang2(pBar, R_NilValue));
	PROTECT(sampCounter = NEW_INTEGER(1));
	pSampCounter = INTEGER_POINTER(sampCounter);
	
	npars=J+5;
	
	GetRNGstate();

	// Initialize to 0
	AZERO(XtX,Jp1sq);
	AZERO(ZtZ,Jsq);
	AZERO(beta,Jp1);
	AZERO(ySum,J);
	AZERO(sumy2,J);
	
	// Create vectors
	for(i=0;i<sumN;i++)
	{
		j = whichJ[i];
		ySum[j] += y[i];
		sumy2[j] += y[i]*y[i];
		grandSum += y[i];
		grandSumSq += y[i]*y[i];
	}
	
	
	// create design matrices
	XtX[0]=sumN;	
	for(j=0;j<J;j++)
	{
		XtX[j+1]=N[j];
		XtX[(J+1)*(j+1)]=N[j];
		XtX[(j+1)*(J+1) + (j+1)] = N[j];
		ZtZ[j*J + j] = N[j];
		yBar[j] = ySum[j]/(1.0*N[j]);
	}
	
	Xty[0] = grandSum;	
	Memcpy(Xty+1,ySum,J);
	Memcpy(Zty,ySum,J);
	
	// start MCMC
	for(m=0; m<iterations; m++)
	{
		R_CheckUserInterrupt();
	
		//Check progress
		
		if(progress && !((m+1)%progress)){
			pSampCounter[0]=m+1;
			SETCADR(R_fcall, sampCounter);
			eval(R_fcall, rho); //Update the progress bar
		}
		

		// sample beta
		Memcpy(Btemp,XtX,Jp1sq);
		for(j=0;j<J;j++){
			Btemp[(j+1)*(J+1)+(j+1)] += 1/g;
		}
		InvMatrixUpper(Btemp, J+1);
		internal_symmetrize(Btemp,J+1);	
		for(j=0;j<Jp1sq;j++)
			Btemp[j] *= sig2;
	
		oneOverSig2temp = 1/sig2;
		F77_CALL(dsymv)("U", &Jp1, &oneOverSig2temp, Btemp, &Jp1, Xty, &iOne, &dZero, beta, &iOne);
		
		rmvGaussianC(beta, Btemp, J+1);
		Memcpy(&chains[npars*m],beta,J+1);	
		
		
		// calculate density (Single Standardized)
		
		Memcpy(B2temp,ZtZ,Jsq);
		densDelta = -J*0.5*log(2*M_PI);
		for(j=0;j<J;j++)
		{
			B2temp[j*J+j] += 1/g;
			muTemp[j] = (ySum[j]-N[j]*beta[0])/sqrt(sig2);
		}
		InvMatrixUpper(B2temp, J);
		internal_symmetrize(B2temp,J);
		logDet = matrixDet(B2temp,J,J,1, &info);
		densDelta += -0.5*quadform(muTemp, B2temp, J, 1, J);
		densDelta += -0.5*logDet;
		if(m==0){
			logSumSingle = densDelta;
			kahanSumSingle = exp(densDelta);
		}else{
			logSumSingle =  logSumSingle + LogOnePlusX(exp(densDelta-logSumSingle));
			kahanTempY = exp(densDelta) - kahanCSingle;
			kahanTempT = kahanSumSingle + kahanTempY;
			kahanCSingle = (kahanTempT - kahanSumSingle) - kahanTempY;
			kahanSumSingle = kahanTempT;
		}
		chains[npars*m + (J+1) + 0] = densDelta;
		
		
		// calculate density (Double Standardized)
		densDelta += 0.5*J*log(g);
		if(m==0){
			logSumDouble = densDelta;
			kahanSumDouble = exp(densDelta);
		}else{
			logSumDouble =  logSumDouble + LogOnePlusX(exp(densDelta-logSumDouble));
			kahanTempY = exp(densDelta) - kahanCDouble;
			kahanTempT = kahanSumDouble + kahanTempY;
			kahanCDouble = (kahanTempT - kahanSumDouble) - kahanTempY;
			kahanSumDouble = kahanTempT;
		}
		chains[npars*m + (J+1) + 1] = densDelta;
		
		
		
		// sample sig2
		tempBetaSq = 0;
		scaleSig2 = grandSumSq - 2*beta[0]*grandSum + beta[0]*beta[0]*sumN;
		for(j=0;j<J;j++)
		{
			scaleSig2 += -2.0*(yBar[j]-beta[0])*N[j]*beta[j+1] + (N[j]+1/g)*beta[j+1]*beta[j+1];
			tempBetaSq += beta[j+1]*beta[j+1];
		}
		scaleSig2 *= 0.5;
		sig2 = 1/rgamma(shapeSig2,1/scaleSig2);
		chains[npars*m + (J+1) + 2] = sig2;
	
		// sample g
		scaleg = 0.5*(tempBetaSq/sig2 + rscaleSq);
		g = 1/rgamma(shapeg,1/scaleg);
		chains[npars*m + (J+1) + 3] = g;

	}
	
	CMDE[0] = logSumSingle - log(iterations);
	CMDE[1] = logSumDouble - log(iterations);
	CMDE[2] = log(kahanSumSingle) - log(iterations);
	CMDE[3] = log(kahanSumDouble) - log(iterations);
	
	UNPROTECT(2);
	PutRNGstate();
	
}