Beispiel #1
0
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;
}
Beispiel #2
0
//*******************************************************
//     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.           */
 
}