bool PinyinPhraseEqualTo::operator () (const PinyinPhrase &lhs, const PinyinPhrase &rhs) const { if (lhs.get_lib () == rhs.get_lib ()&& lhs.get_pinyin_offset () == rhs.get_pinyin_offset () && lhs.get_phrase_offset () == rhs.get_phrase_offset ()) return true; else if (!(lhs.get_phrase () == rhs.get_phrase ())) return false; else { for (unsigned int i=0; i<lhs.length(); i++) if (!m_equal (lhs.get_key (i), rhs.get_key (i))) return false; } return true; }
//******************************************************* // Here is a Metropolis update kernel... * //******************************************************* void metropolis_kernel( Float *sigma, Float *U) { // LRG.SetInterval(1,-1); VRB.Debug(" Beta = %f\n", GJP.Beta() ); Float fGamma = (2./3.) * GJP.Beta(); // These variables are associated with the actual update. Float old_action; Float new_action; Float accept_probability; Float die_roll; VRB.Debug("Entering update core metro new with nhits=%d and small=%f.\n", NHITS, SMALL ); for(int HIT_CNT=0; HIT_CNT<NHITS; HIT_CNT++) { { Float a,b,c,d; Float norm; Float select; Float* v; v = EPSILON; a = SMALL * LRG.Urand(); if(a>0)a*=-1; a+=1.0; b = LRG.Urand(); c = LRG.Urand(); d = LRG.Urand(); VRB.Debug("unnormalized: a=%+6.5f b=%+6.5f c=%+6.5f d=%+6.5f\n",a,b,c,d); norm = sqrt( (1.0 - a*a) / (b*b + c*c + d*d) ); b *= norm; c *= norm; d *= norm; VRB.Debug("normalized: a=%+6.5f b=%+6.5f c=%+6.5f d=%+6.5f\n",a,b,c,d); select = LRG.Urand(); if ( select < 0.33333333 ) { *(v++)=a ; *(v++)=c ; *(v++)=0.0; *(v++)=-c ; *(v++)=a ; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=1.0; *(v++)=b ; *(v++)=d ; *(v++)=0.0; *(v++)=d ; *(v++)=-b ; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; } else if ( select > 0.66666666 ) { *(v++)=1.0; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=a ; *(v++)=c ; *(v++)=0.0; *(v++)=-c ; *(v++)=a ; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=b ; *(v++)=d ; *(v++)=0.0; *(v++)=d ; *(v++)=-b ; } else { *(v++)=a ; *(v++)=0.0; *(v++)=c ; *(v++)=0.0; *(v++)=1.0; *(v++)=0.0; *(v++)=-c ; *(v++)=0.0; *(v++)=a ; *(v++)=b ; *(v++)=0.0; *(v++)=d ; *(v++)=0.0; *(v++)=0.0; *(v++)=0.0; *(v++)=d ; *(v++)=0.0; *(v++)=-b ; } } VRB.Debug("epsilon matrix:\n"); m_print( EPSILON ); // Now begin the update process. m_multiply3( MTEMP1, sigma, U ); old_action = fGamma * (9. - .5 * (MTEMP1[0]+MTEMP1[4]+MTEMP1[8]) ); VRB.Debug("Old action %e\n", old_action ); m_multiply3( MTEMP1, EPSILON, U ); m_multiply3( MTEMP2, sigma, MTEMP1 ); new_action = fGamma * (9. - .5 * (MTEMP2[0]+MTEMP2[4]+MTEMP2[8]) ); VRB.Debug("New action %e\n", new_action ); accept_probability = exp( old_action - new_action ); VRB.Debug("Accept chance %e\n", accept_probability ); die_roll = LRG.Urand(); if( die_roll < 0 ) die_roll *= -1; VRB.Debug("die roll %e\n", die_roll ); if( die_roll < accept_probability ) { VRB.Debug("ACCEPT\n\n"); m_multiply3( MTEMP1, EPSILON, U ); m_equal( U, MTEMP1 ); } else VRB.Debug("REJECT\n\n"); } /* End HIT_CNT loop for multiple hits. */ }