Advertisement
Guest User

Untitled

a guest
Apr 4th, 2012
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. void mcmc(t_Params *ptParams, t_Data *ptData, gsl_vector* ptX)
  2. {
  3.   pthread_t thread1, thread2, thread3;
  4.   int       iret1  , iret2  , iret3;
  5.   gsl_vector *ptX1 = gsl_vector_alloc(3),
  6.              *ptX2 = gsl_vector_alloc(3),
  7.              *ptX3 = gsl_vector_alloc(3);
  8.   t_MetroInit atMetroInit[3];
  9.  
  10.   printf("\nMCMC iter = %d sigmaA = %.2f sigmaB = %.2f sigmaS = %.2f\n",
  11.        ptParams->nIter, ptParams->dSigmaA, ptParams->dSigmaB, ptParams->dSigmaS);
  12.  
  13.   gsl_vector_memcpy(ptX1, ptX);
  14.  
  15.   gsl_vector_set(ptX2, 0, gsl_vector_get(ptX,0) + 2.0*ptParams->dSigmaA);
  16.   gsl_vector_set(ptX2, 1, gsl_vector_get(ptX,1) + 2.0*ptParams->dSigmaB);
  17.   gsl_vector_set(ptX2, 2, gsl_vector_get(ptX,2) + 2.0*ptParams->dSigmaS);    
  18.  
  19.   gsl_vector_set(ptX3, 0, gsl_vector_get(ptX,0) - 2.0*ptParams->dSigmaA);
  20.   gsl_vector_set(ptX3, 1, gsl_vector_get(ptX,1) - 2.0*ptParams->dSigmaB);
  21.   if(gsl_vector_get(ptX,2) - 2.0*ptParams->dSigmaS > (double) ptData->nL){
  22.     gsl_vector_set(ptX3, 2, gsl_vector_get(ptX,2) - 2.0*ptParams->dSigmaS);
  23.   }
  24.   else{
  25.     gsl_vector_set(ptX3, 2, (double) ptData->nL);
  26.   }
  27.   atMetroInit[0].ptParams = ptParams;
  28.   atMetroInit[0].ptData   = ptData;
  29.   atMetroInit[0].ptX      = ptX1;
  30.   atMetroInit[0].nThread  = 0;
  31.   atMetroInit[0].lSeed    = ptParams->lSeed;
  32.   atMetroInit[0].nAccepted = 0;
  33.  
  34.   atMetroInit[1].ptParams = ptParams;
  35.   atMetroInit[1].ptData   = ptData;
  36.   atMetroInit[1].ptX      = ptX2;
  37.   atMetroInit[1].nThread  = 1;
  38.   atMetroInit[1].lSeed    = ptParams->lSeed + 1;
  39.   atMetroInit[1].nAccepted = 0;
  40.  
  41.   atMetroInit[2].ptParams = ptParams;
  42.   atMetroInit[2].ptData   = ptData;
  43.   atMetroInit[2].ptX      = ptX3;
  44.   atMetroInit[2].nThread  = 2;
  45.   atMetroInit[2].lSeed    = ptParams->lSeed + 2;
  46.   atMetroInit[2].nAccepted = 0;
  47.  
  48.   writeThread(&atMetroInit[0]);
  49.   writeThread(&atMetroInit[1]);
  50.   writeThread(&atMetroInit[2]);
  51.  
  52.   iret1 = pthread_create(&thread1, NULL, metropolis, (void*) &atMetroInit[0]);
  53.   iret2 = pthread_create(&thread2, NULL, metropolis, (void*) &atMetroInit[1]);
  54.   iret3 = pthread_create(&thread3, NULL, metropolis, (void*) &atMetroInit[2]);
  55.   pthread_join(thread1, NULL);
  56.   pthread_join(thread2, NULL);
  57.   pthread_join(thread3, NULL);
  58.  
  59.  
  60.   printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[0].nThread,
  61.      atMetroInit[0].nAccepted, ptParams->nIter,((double) atMetroInit[0].nAccepted)/((double) ptParams->nIter));
  62.  
  63.   printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[1].nThread,
  64.      atMetroInit[1].nAccepted, ptParams->nIter,((double) atMetroInit[1].nAccepted)/((double) ptParams->nIter));
  65.  
  66.   printf("%d: accept. ratio %d/%d = %f\n", atMetroInit[2].nThread,
  67.      atMetroInit[2].nAccepted, ptParams->nIter, ((double) atMetroInit[2].nAccepted)/((double) ptParams->nIter));
  68.      
  69.   gsl_vector_free(ptX1); gsl_vector_free(ptX2); gsl_vector_free(ptX3);
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement