Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void mcmc(t_Params *ptParams, t_Data *ptData, gsl_vector* ptX)
- {
- pthread_t thread1, thread2, thread3;
- int iret1 , iret2 , iret3;
- gsl_vector *ptX1 = gsl_vector_alloc(3),
- *ptX2 = gsl_vector_alloc(3),
- *ptX3 = gsl_vector_alloc(3);
- t_MetroInit atMetroInit[3];
- printf("\nMCMC iter = %d sigmaA = %.2f sigmaB = %.2f sigmaS = %.2f\n",
- ptParams->nIter, ptParams->dSigmaA, ptParams->dSigmaB, ptParams->dSigmaS);
- gsl_vector_memcpy(ptX1, ptX);
- gsl_vector_set(ptX2, 0, gsl_vector_get(ptX,0) + 2.0*ptParams->dSigmaA);
- gsl_vector_set(ptX2, 1, gsl_vector_get(ptX,1) + 2.0*ptParams->dSigmaB);
- gsl_vector_set(ptX2, 2, gsl_vector_get(ptX,2) + 2.0*ptParams->dSigmaS);
- gsl_vector_set(ptX3, 0, gsl_vector_get(ptX,0) - 2.0*ptParams->dSigmaA);
- gsl_vector_set(ptX3, 1, gsl_vector_get(ptX,1) - 2.0*ptParams->dSigmaB);
- if(gsl_vector_get(ptX,2) - 2.0*ptParams->dSigmaS > (double) ptData->nL){
- gsl_vector_set(ptX3, 2, gsl_vector_get(ptX,2) - 2.0*ptParams->dSigmaS);
- }
- else{
- gsl_vector_set(ptX3, 2, (double) ptData->nL);
- }
- atMetroInit[0].ptParams = ptParams;
- atMetroInit[0].ptData = ptData;
- atMetroInit[0].ptX = ptX1;
- atMetroInit[0].nThread = 0;
- atMetroInit[0].lSeed = ptParams->lSeed;
- atMetroInit[0].nAccepted = 0;
- atMetroInit[1].ptParams = ptParams;
- atMetroInit[1].ptData = ptData;
- atMetroInit[1].ptX = ptX2;
- atMetroInit[1].nThread = 1;
- atMetroInit[1].lSeed = ptParams->lSeed + 1;
- atMetroInit[1].nAccepted = 0;
- atMetroInit[2].ptParams = ptParams;
- atMetroInit[2].ptData = ptData;
- atMetroInit[2].ptX = ptX3;
- atMetroInit[2].nThread = 2;
- atMetroInit[2].lSeed = ptParams->lSeed + 2;
- atMetroInit[2].nAccepted = 0;
- writeThread(&atMetroInit[0]);
- writeThread(&atMetroInit[1]);
- writeThread(&atMetroInit[2]);
- iret1 = pthread_create(&thread1, NULL, metropolis, (void*) &atMetroInit[0]);
- iret2 = pthread_create(&thread2, NULL, metropolis, (void*) &atMetroInit[1]);
- iret3 = pthread_create(&thread3, NULL, metropolis, (void*) &atMetroInit[2]);
- pthread_join(thread1, NULL);
- pthread_join(thread2, NULL);
- pthread_join(thread3, NULL);
- printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[0].nThread,
- atMetroInit[0].nAccepted, ptParams->nIter,((double) atMetroInit[0].nAccepted)/((double) ptParams->nIter));
- printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[1].nThread,
- atMetroInit[1].nAccepted, ptParams->nIter,((double) atMetroInit[1].nAccepted)/((double) ptParams->nIter));
- printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[2].nThread,
- atMetroInit[2].nAccepted, ptParams->nIter, ((double) atMetroInit[2].nAccepted)/((double) ptParams->nIter));
- gsl_vector_free(ptX1); gsl_vector_free(ptX2); gsl_vector_free(ptX3);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement