Beispiel #1
0
	bool shouldSwitch(DDModel::Node *l,DDModel::Node *r) {
		med_type lm = cvt_med(MVal(l,m_dir)),
			rm = cvt_med(MVal(r,m_dir));
		return lm > rm || lm==rm && m_allowEqual;
	}
Beispiel #2
0
/********************************************************************
*
*   Function    : jacobi
*   Goal        : 
*
*    
*   input parameters   : mat   : original Matrix
*
*   output parameters  : d     : contains the eigenvalues
*                        eig_v : contains the eigenvectors as columna
*
*   returnted Value    : success or error messages
*
********************************************************************/
extern int jacobi( Matrix* mat, Vector *d, Matrix *eig_v )
{
  int    j, iq, ip, i, n, nrot;
  double tresh, theta, tau, t, sm, s, h, g, c;
  Vector *b, 
         *z;       /* this vector accumulate terms */
  double **mval, **vval, **bval, **dval, **zval;
  Matrix *msave;

  if( (mat == NULL) || (d == NULL) || (eig_v == NULL) )
    { printf(" jacobi: you gave me a NULL-pointer\n");
      return( MATH_FATAL_ERROR );
    }

  if( (MDim1(mat) != MDim2(mat)) || (VDim(d) != MDim1(mat)) ||
      (MDim1(eig_v) != MDim2(eig_v)) || (MDim1(mat) != MDim1(eig_v)) )
    { printf(" jacobi: wrong dimensions of the matrices or the vector\n");
      return( MATH_WARNING );
    }
  
  msave = matrix_alloc( MDim1(mat), MDim2(mat) );
  matrix_copy( mat, msave );

  n = MDim1(msave);
  mval = msave->val;
  vval = eig_v->val;
  dval = d->val;
  b = vector_alloc( n );   bval = b->val;
  z = vector_alloc( n );   zval = z->val;

  /* Initialize */
  for( ip = 0; ip < n; ip++ )      /* initialize to the identiy matrix */
    { for( iq = 0; iq < n; iq ++ )
	MVal(vval,ip,iq) = 0.0;
      MVal(vval,ip,ip) = 1.0;
    }
  for( ip = 0; ip < n; ip++ )              /* initialize b and d to the */
    { VVal(bval,ip) = VVal(dval,ip) = MVal(mval,ip,ip) ; /* diagonal of msave */
      VVal(zval,ip) = 0.0;
    }
  nrot = 0;

  for( i = 0; i < 50; i++ )
    { 
      sm = 0.0;
      for( ip = 0; ip < n-1; ip++) 
	for( iq = ip+1; iq < n; iq++) sm += SYS_FABS(MVal(mval,ip,iq));

      if( sm == 0.0) 
	{ vector_free( b );
	  vector_free( z );
	  matrix_free( msave );
	  eigsort( eig_v, d );
	  return( MATH_SUCCESS );
	}

      if (i < 4) tresh = 0.2 * sm / (n * n);
      else       tresh = 0.0;

      for( ip = 0; ip < n-1;ip++) 
	for( iq = ip+1; iq < n; iq++) 
	  { g = 100.0 * SYS_FABS( MVal(mval,ip,iq) );

	    if ( (i > 4) && 
		((double) SYS_FABS(VVal(dval,ip))+g)==(double) SYS_FABS(VVal(dval,ip)) &&
		((double) SYS_FABS(VVal(dval,iq))+g)==(double) SYS_FABS(VVal(dval,iq)) )
	      { MVal(mval,ip,iq) = 0.0;
	      }
	    else if( SYS_FABS( MVal(mval,ip,iq) ) > tresh )
	      { h = VVal(dval,iq) - VVal(dval,ip);
                if( (double) (SYS_FABS(h) + g) == (double)SYS_FABS(h)) 
		  { t = ( MVal(mval,ip,iq) ) / h;
		  }
                else 
		  {  theta = 0.5 * h / ( MVal(mval,ip,iq) );
                     t     = 1.0 / (SYS_FABS(theta) + sqrt(1.0 + theta*theta));
                     if( theta < 0.0 ) t = -t;
		   }
                c   = 1.0 / sqrt( 1 + t*t);
                s   = t * c;
                tau = s / (1.0 + c);
                h   = t * MVal(mval,ip,iq);
                VVal(zval,ip) -= h;
                VVal(zval,iq) += h;
                VVal(dval,ip) -= h;
                VVal(dval,iq) += h;
                MVal( mval,ip,iq) = 0.0;

                for (j = 0;    j < ip; j++) ROTATE( mval,j, ip,j, iq);
                for (j = ip+1; j < iq; j++) ROTATE( mval,ip,j, j, iq);
                for (j = iq+1; j < n;  j++) ROTATE( mval,ip,j, iq,j);
                for (j = 0;    j < n;  j++) ROTATE( vval,j, ip,j, iq);
                ++nrot;
           }
        }
      
      for( ip = 0; ip < n; ip++ )
	{ VVal(bval,ip) += VVal(zval,ip);
	  VVal(dval,ip)  = VVal(bval,ip);
	  VVal(zval,ip)  = 0.0;
	}
    }
  printf(" jacobi: to many iterations in routine\n");
  return( MATH_WARNING );
}