Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

guma Namespace Reference


Compounds

struct  guma::bbt_node
class  guma::kdnnrec
class  guma::kdrec
class  guma::kdtnode
class  guma::kdtsearch
class  guma::kdtsnode
class  guma::newton_info
class  guma::random_des
class  guma::rkdtree
class  guma::rkdtree_base

Typedefs

typedef guma::bbt_node BBTNode

Functions

template<class T> GULAPI bool GaussJordan (int nRowsCols, int nRightSides, Ptr< Ptr< T > > &A, Ptr< Ptr< T > > &b)
 Solve systems of linear equations with Gauss Jordan Elimination. More...

template GULAPI bool GaussJordan (int nRowsCols, int m, Ptr< Ptr< float > > &A, Ptr< Ptr< float > > &b)
template GULAPI bool GaussJordan (int nRowsCols, int m, Ptr< Ptr< double > > &A, Ptr< Ptr< double > > &b)
template<class T> GULAPI bool LUDecomposition (int nRowsCols, Ptr< Ptr< T > > &A, int *perm_sign, Ptr< int > &index)
 Decompose a matrix into lower and upper triangular matrix. More...

template GULAPI bool LUDecomposition (int nRowsCols, Ptr< Ptr< float > > &A, int *perm_sign, Ptr< int > &index)
template GULAPI bool LUDecomposition (int nRowsCols, Ptr< Ptr< double > > &A, int *perm_sign, Ptr< int > &index)
template<class T> GULAPI void LUBackSubstitution (int nRowsCols, Ptr< int > &index, Ptr< Ptr< T > > &A, Ptr< T > &b)
 Solve system of linear equations with help of LU-Decomposition (given in A). More...

template GULAPI void LUBackSubstitution (int nRowsCols, Ptr< int > &index, Ptr< Ptr< float > > &A, Ptr< float > &b)
template GULAPI void LUBackSubstitution (int nRowsCols, Ptr< int > &index, Ptr< Ptr< double > > &A, Ptr< double > &b)
template<class T> GULAPI void BandMVProduct (int n, int m1, int m2, Ptr< Ptr< T > > a, Ptr< T > x, Ptr< T > b)
 Multiply a band matrix and a vector: b = A*x, m1 = number of subdiagonal elements, m2 = number of superdiagonal elements, n = number of rows. More...

template GULAPI void BandMVProduct (int n, int m1, int m2, Ptr< Ptr< float > > a, Ptr< float > x, Ptr< float > b)
template GULAPI void BandMVProduct (int n, int m1, int m2, Ptr< Ptr< double > > a, Ptr< double > x, Ptr< double > b)
template<class T> GULAPI void BandDecomposition (int n, int m1, int m2, Ptr< Ptr< T > > &A, Ptr< Ptr< T > > &L, int *perm_sign, Ptr< int > &index)
 Decompose a band matrix into lower and upper triangular matrix: A = L*U. More...

template GULAPI void BandDecomposition (int n, int m1, int m2, Ptr< Ptr< float > > &A, Ptr< Ptr< float > > &L, int *perm_sign, Ptr< int > &index)
template GULAPI void BandDecomposition (int n, int m1, int m2, Ptr< Ptr< double > > &A, Ptr< Ptr< double > > &L, int *perm_sign, Ptr< int > &index)
template<class T> GULAPI void BandBackSubstitution (int n, int m1, int m2, const Ptr< Ptr< T > > &A, const Ptr< Ptr< T > > &L, const Ptr< int > &index, Ptr< T > &b)
 Solve system of linear equations with help of LU-Decomposition of a band matrix (given by L and A). More...

template GULAPI void BandBackSubstitution (int n, int m1, int m2, const Ptr< Ptr< float > > &A, const Ptr< Ptr< float > > &L, const Ptr< int > &index, Ptr< float > &b)
template GULAPI void BandBackSubstitution (int n, int m1, int m2, const Ptr< Ptr< double > > &A, const Ptr< Ptr< double > > &L, const Ptr< int > &index, Ptr< double > &b)
template<class T> GULAPI void SVDecomposition (int m, int n, Ptr< Ptr< T > > &a, Ptr< T > &w, Ptr< Ptr< T > > &v)
 Singular Value Decomposition. More...

template GULAPI void SVDecomposition (int m, int n, Ptr< Ptr< float > > &a, Ptr< float > &w, Ptr< Ptr< float > > &v)
template GULAPI void SVDecomposition (int m, int n, Ptr< Ptr< double > > &a, Ptr< double > &w, Ptr< Ptr< double > > &v)
template<class T> GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< T > > &u, Ptr< T > &w, Ptr< Ptr< T > > &v, Ptr< T > &b, Ptr< T > &x)
 Solve system of linear equations, when a Singular Value Decomposition is given. More...

template GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< float > > &u, Ptr< float > &w, Ptr< Ptr< float > > &v, Ptr< float > &b, Ptr< float > &x)
template GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< double > > &u, Ptr< double > &w, Ptr< Ptr< double > > &v, Ptr< double > &b, Ptr< double > &x)
template<class T> GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< T > > &u, Ptr< T > &w, Ptr< Ptr< T > > &v, Ptr< T > &b)
 Solve system of linear equations, when a Singular Value Decomposition is given. More...

template GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< float > > &u, Ptr< float > &w, Ptr< Ptr< float > > &v, Ptr< float > &b)
template GULAPI void SVBackSubstitution (int m, int n, Ptr< Ptr< double > > &u, Ptr< double > &w, Ptr< Ptr< double > > &v, Ptr< double > &b)
template<class T> GULAPI bool SVZero (int n, Ptr< T > &w)
 Sets very small singular values to zero. More...

template GULAPI bool SVZero (int n, Ptr< float > &w)
template GULAPI bool SVZero (int n, Ptr< double > &w)
template<class T> int SVDIntersectLines (point< T > P1, point< T > T1, point< T > P2, point< T > T2, T *alpha1, T *alpha2, point< T > *P)
 Intersect two lines in 3-dimensions, using singular decomposition. More...

template int SVDIntersectLines (point< float > P1, point< float > T1, point< float > P2, point< float > T2, float *alpha1, float *alpha2, point< float > *P)
template int SVDIntersectLines (point< double > P1, point< double > T1, point< double > P2, point< double > T2, double *alpha1, double *alpha2, point< double > *P)
template<class T> T Pythagoras (const T &a, const T &b)
 Calculate (a^2 + b^2)^{1/2}, with precautions to avoid destructive over- or underflow. More...

template<class T> bool GoldenSectionSearch (T ax, T bx, T cx, T(*func)(T, void *), void *fdat, T tol, int max_iterations, T *xmin, T *fmin)
 Searches the minimum of a function, defined over an intervall. More...

template bool GoldenSectionSearch (float ax, float bx, float cx, float(*func)(float, void *), void *, float tol, int max_iterations, float *xmin, float *fmin)
template bool GoldenSectionSearch (double ax, double bx, double cx, double(*func)(double, void *), void *, double tol, int max_iterations, double *xmin, double *fmin)
template<class T> bool LinearSearch (const Ptr< T > &p, const Ptr< T > &xold, T fold, const Ptr< T > &g, const Ptr< T > &x1, const Ptr< T > &x2, newton_info< T > &I, bool &found, bool &check, Ptr< T > &x, T *fx)
template bool LinearSearch (const Ptr< float > &p, const Ptr< float > &xold, float fold, const Ptr< float > &g, const Ptr< float > &x1, const Ptr< float > &x2, newton_info< float > &I, bool &found, bool &check, Ptr< float > &x, float *fx)
template<class T> bool Newton (Ptr< T > &x, const Ptr< T > &x1, const Ptr< T > &x2, newton_info< T > &I, int maxits)
template bool Newton (Ptr< float > &x, const Ptr< float > &x1, const Ptr< float > &x2, newton_info< float > &I, int maxits)
template bool Newton (Ptr< double > &x, const Ptr< double > &x1, const Ptr< double > &x2, newton_info< double > &I, int maxits)
GULAPI uint32 GetSeed ()
GULAPI void PseudoDes (uint32 *lword, uint32 *irword)
GULAPI void HeapSort (size_t nelem, size_t elsize, void *elptr, int(*usrfunc)(void *, void *, void *), void *usrdata)
GULAPI void PtrHeapSort (size_t nelem, void **elptr, int(*usrfunc)(void *, void *, void *), void *usrdata)
GULAPI void heapsort (int nA, Ptr< void *> &A)
GULAPI void heapsort (int nA, Ptr< int > &A)
GULAPI int BinarySearch (int x, int nA, const gul::Ptr< int > &A)
GULAPI int BinarySearch (void *x, int nA, const gul::Ptr< void *> &A)
GULAPI void InitBBT (BBTNode *head)
GULAPI int SearchElementInBBT (BBTNode *head, void *key, int compare(void *, void *), BBTNode **element)
GULAPI BBTNodeSearchSuccessorInBBT (BBTNode *element, BBTNode *head)
GULAPI BBTNodeSearchPredecessorInBBT (BBTNode *element, BBTNode *head)
GULAPI void InsertElementIntoBBT (BBTNode *element, BBTNode *where, int side, BBTNode *head)
GULAPI void DeleteElementFromBBT (BBTNode *element, BBTNode *head)
GULAPI void DumpBBTTree (BBTNode *node, int level, void dumpkey_func(void *))
GULAPI void DumpBBTNode (BBTNode *node, int level)
template<class T> void _heapsort (int nA, gul::Ptr< T > &A)
template<class T> int _BinarySearch (T x, int nA, const gul::Ptr< T > &A)
template<class T> int _BinarySearch (T x, int nA, const gul::Ptr< T > &A, int *rleft, int *rright)
template<class U> void CommonCoordinateSystem (const point< U > &B, const point< U > &P, const point< U > &Ab, const point< U > &Pb, Ptr< Ptr< U > > &T)
template void CommonCoordinateSystem (const point< float > &B, const point< float > &P, const point< float > &Ab, const point< float > &Pb, Ptr< Ptr< float > > &T)
template void CommonCoordinateSystem (const point< double > &B, const point< double > &P, const point< double > &Ab, const point< double > &Pb, Ptr< Ptr< double > > &T)
template<class U> void CommonCoordinateSystem (const gul::point< U > &B, const gul::point< U > &P, const gul::point< U > &Ab, const gul::point< U > &Pb, gul::Ptr< gul::Ptr< U > > &T)


Typedef Documentation

typedef struct guma::bbt_node guma::BBTNode
 

Referenced by gul::RefMap::Node::bbtnode(), gul::Map::Node::bbtnode(), gugr::edge_interval_tree::dump_edge_interval(), gul::RefMap::First(), gul::Map< kdnnrec< U, V > >::First(), gugr::edge_interval_tree::FreeNode(), gugr::edge_interval_tree::Head(), gugr::edge_interval_tree::InsertNode(), gul::RefMap::Last(), gul::Map< kdnnrec< U, V > >::Last(), gul::Map< kdnnrec< U, V > >::Map(), gul::RefMap::NewNode(), gul::Map< kdnnrec< U, V > >::NewNode(), gugr::edge_interval_tree::NewNode(), gul::Map< kdnnrec< U, V > >::NewNodeV(), gul::RefMap::Node::Node(), gul::Map::Node::Node(), gul::RefMap::operator=(), gul::Map< kdnnrec< U, V > >::operator=(), gul::RefMap::RefMap(), gul::RefMap::RemoveNode(), gul::Map< kdnnrec< U, V > >::RemoveNode(), gugr::edge_interval_tree::RemoveNode(), gul::RefMap::SearchNode(), gul::Map< kdnnrec< U, V > >::SearchNode(), gugr::edge_interval_tree::SearchNode(), gul::Map< kdnnrec< U, V > >::~Map(), and gul::RefMap::~RefMap().


Function Documentation

template<class T>
int _BinarySearch   x,
int    nA,
const gul::Ptr< T > &    A,
int *    rleft,
int *    rright
[inline]
 

Definition at line 219 of file guma_sorting.h.

00221 {
00222   int mid,right,left;
00223 
00224   if( nA == 0 ) 
00225   {
00226     *rleft = -1;
00227     *rright = -1;
00228     return -1;
00229   }
00230 
00231   if( A[0] >=  x )
00232   {
00233     *rright = 0;
00234 
00235     if( A[0] > x ) 
00236     {
00237       *rleft = -1; 
00238       return -1;
00239     }
00240     else
00241     {
00242       *rleft = 0;
00243       return 0;
00244     }
00245   }
00246 
00247   if( A[nA-1] <=  x )
00248   {
00249     *rleft = nA-1;
00250 
00251     if( A[nA-1] < x )
00252     {
00253       *rright = -1;
00254       return -1;
00255     }
00256     else
00257     {
00258       *rright = nA-1;
00259       return nA-1;
00260     }
00261   }
00262 
00263   left = 0;
00264   right = nA;
00265   mid = (left+right)/2;
00266 
00267   while( (mid!=left) && (mid!=right) )
00268   {  
00269     if( A[mid] == x  )
00270       break;
00271     else if( A[mid] > x )
00272     {
00273       right = mid;
00274       mid = (left+right)>>1;
00275     }
00276     else
00277     {
00278       left = mid;
00279       mid = (left+right)>>1;
00280     }
00281   }
00282   if( A[mid] != x )
00283   {
00284     *rleft = left;
00285     *rright = right;
00286     return -1;
00287   }
00288   else
00289   {
00290     *rleft = mid;
00291     *rright = mid;
00292   }
00293  
00294   return mid;
00295 }

template<class T>
int _BinarySearch   x,
int    nA,
const gul::Ptr< T > &    A
[inline]
 

Definition at line 168 of file guma_sorting.h.

00169 {
00170   int mid,right,left;
00171 
00172   if( nA == 0 ) return -1;
00173 
00174   if( A[0] >=  x )
00175   {
00176     if( A[0] > x ) return -1;
00177     return 0;
00178   }
00179   if( A[nA-1] <=  x )
00180   {
00181     if( A[nA-1] < x ) return -1;
00182     return nA-1;
00183   }
00184 
00185   left = 0;
00186   right = nA;
00187   mid = (left+right)/2;
00188 
00189   while( (mid!=left) && (mid!=right) )
00190   {  
00191     if( A[mid] == x  )
00192       break;
00193     else if( A[mid] > x )
00194     {
00195       right = mid;
00196       mid = (left+right)>>1;
00197     }
00198     else
00199     {
00200       left = mid;
00201       mid = (left+right)>>1;
00202     }
00203   }
00204   if( A[mid] != x ) return -1;
00205 
00206   return mid;
00207 }

template<class T>
void _heapsort int    nA,
gul::Ptr< T > &    A
[inline]
 

Definition at line 109 of file guma_sorting.h.

00110 {
00111   gul::Ptr<T>& ra = A;
00112   T rra;
00113   int n = nA, l, ir, i, j;
00114 
00115   if( n < 2 ) return;
00116   l = (n >> 1) + 1;
00117   ir = n;
00118   
00119   for(;;)
00120   {
00121     if( l > 1 )
00122     {
00123       rra = ra[l-2];
00124       l--;    
00125     }
00126     else
00127     {
00128       rra = ra[ir-1];
00129       ra[ir-1] = ra[0];
00130       
00131       if( --ir == 1 )
00132       {
00133         ra[0] = rra;
00134         break;
00135       }
00136     }
00137     i = l;
00138     j = l+l;
00139 
00140     while( j <= ir )
00141     {
00142       if( (j < ir) && (ra[j-1] < ra[j]) )
00143         j++;
00144   
00145       if( rra < ra[j-1] )
00146       {
00147         ra[i-1] = ra[j-1];
00148         i = j;
00149         j <<= 1;
00150       }
00151       else
00152         j = ir + 1;
00153     }
00154 
00155     ra[i-1] = rra;
00156   }
00157 }

template GULAPI void BandBackSubstitution int    n,
int    m1,
int    m2,
const Ptr< Ptr< double > > &    A,
const Ptr< Ptr< double > > &    L,
const Ptr< int > &    index,
Ptr< double > &    b
 

template GULAPI void BandBackSubstitution int    n,
int    m1,
int    m2,
const Ptr< Ptr< float > > &    A,
const Ptr< Ptr< float > > &    L,
const Ptr< int > &    index,
Ptr< float > &    b
 

template<class T>
GULAPI void guma::BandBackSubstitution int    n,
int    m1,
int    m2,
const Ptr< Ptr< T > > &    A,
const Ptr< Ptr< T > > &    L,
const Ptr< int > &    index,
Ptr< T > &    b
 

Solve system of linear equations with help of LU-Decomposition of a band matrix (given by L and A).

Definition at line 393 of file guma_lineq.cpp.

00396 {
00397   int i,k,l,mm;
00398   T dum;
00399 
00400   mm = m1 + m2 + 1;
00401   l = m1;
00402 
00403   for( k = 0; k < n; k++ ) /* Forward substitution */
00404   {
00405     i = index[k];
00406     if( i != k ) Swap( b[k], b[i] );
00407     if( l < n ) l++;
00408     for( i = k+1; i < l; i++ )
00409       b[i] -= L[k][i-k-1]*b[k];
00410   }
00411   l = 1;
00412   for( i = n-1; i >= 0; i-- ) /* Forward substitution */
00413   {
00414     dum = b[i];
00415     for( k = 1; k < l; k++ )
00416       dum -= A[i][k]*b[k+i];
00417     b[i] = dum/A[i][0];
00418     if( l < mm ) l++;
00419   }
00420 }

template GULAPI void BandDecomposition int    n,
int    m1,
int    m2,
Ptr< Ptr< double > > &    A,
Ptr< Ptr< double > > &    L,
int *    perm_sign,
Ptr< int > &    index
 

template GULAPI void BandDecomposition int    n,
int    m1,
int    m2,
Ptr< Ptr< float > > &    A,
Ptr< Ptr< float > > &    L,
int *    perm_sign,
Ptr< int > &    index
 

template<class T>
GULAPI void guma::BandDecomposition int    n,
int    m1,
int    m2,
Ptr< Ptr< T > > &    A,
Ptr< Ptr< T > > &    L,
int *    perm_sign,
Ptr< int > &    index
 

Decompose a band matrix into lower and upper triangular matrix: A = L*U.

m1 = number of subdiagonal elements, m2 = number of superdiagonal elements, n = number of rows and columns. L is returned in L[0..n-1][0..m1-1], U in the input matrix A; the rowwise permutation from pivoting is returned in 'index', its sign in 'perm_sign'.

Definition at line 320 of file guma_lineq.cpp.

00323 {
00324   int i,j,k,l,mm,d;
00325   T dum;
00326 
00327   mm = m1 + m2 + 1;
00328   l = m1;
00329   for( i = 0; i < m1; i++ )
00330   {
00331     for( j = m1-i; j < mm; j++ )
00332       A[i][j-l] = A[i][j];
00333     l--;
00334     for( j = mm-l-1; j < mm; j++ )
00335       A[i][j] = 0.0;
00336   }
00337   d = 1;
00338   l = m1;
00339 
00340   for( k = 0; k < n; k++ )
00341   {
00342     dum = A[k][0];
00343     i = k;
00344 
00345     if( l < n ) l++;
00346     for( j = k+1; j < l; j++ )
00347     {
00348       if( rtr<T>::fabs(A[j][0]) > rtr<T>::fabs(dum) )
00349       {
00350         dum = A[j][0];
00351         i = j;
00352       }
00353     }
00354     index[k] = i;
00355 
00356     if( dum == 0.0 )     /* if algorithmically singular */
00357       A[k][0] = rtr<T>::tiny();
00358 
00359     if( i != k )         /* interchange rows */
00360     {
00361       d = -d;
00362       for( j = 0; j < mm; j++ )
00363         Swap( A[k][j], A[i][j] );
00364     }
00365     
00366     for( i = k+1; i < l; i++ )  // i = i'+1
00367     {
00368       dum = A[i][0]/A[k][0];
00369       L[k][i-k-1] = dum;
00370 
00371       for( j = 1; j < mm; j++ )
00372         A[i][j-1] = A[i][j] - dum*A[k][j];
00373 
00374       A[i][mm-1] = 0.0;
00375     }
00376   }
00377   *perm_sign = d;
00378 }

template GULAPI void BandMVProduct int    n,
int    m1,
int    m2,
Ptr< Ptr< double > >    a,
Ptr< double >    x,
Ptr< double >    b
 

template GULAPI void BandMVProduct int    n,
int    m1,
int    m2,
Ptr< Ptr< float > >    a,
Ptr< float >    x,
Ptr< float >    b
 

template<class T>
GULAPI void guma::BandMVProduct int    n,
int    m1,
int    m2,
Ptr< Ptr< T > >    a,
Ptr< T >    x,
Ptr< T >    b
 

Multiply a band matrix and a vector: b = A*x, m1 = number of subdiagonal elements, m2 = number of superdiagonal elements, n = number of rows.

It demonstrates the indexing scheme for band matrices

Definition at line 286 of file guma_lineq.cpp.

00288 {
00289   int i,k,j,m;
00290 
00291   for( i = 0; i < n; i++ )
00292   {
00293     k = i - m1;
00294 
00295     m = Min(m1+m2+1,n-k);
00296 
00297     b[i] = 0;
00298 
00299     for( j = Max(0,-k); j < m; j++ )
00300       b[i] += a[i][j] * x[j+k];
00301   }
00302 }

GULAPI int guma::BinarySearch void *    x,
int    nA,
const gul::Ptr< void *> &    A
 

Definition at line 153 of file guma_sorting.cpp.

00154 { return _BinarySearch( x, nA, A); }

GULAPI int guma::BinarySearch int    x,
int    nA,
const gul::Ptr< int > &    A
 

Definition at line 151 of file guma_sorting.cpp.

00152 { return _BinarySearch( x, nA, A); }

template<class U>
void CommonCoordinateSystem const gul::point< U > &    B,
const gul::point< U > &    P,
const gul::point< U > &    Ab,
const gul::point< U > &    Pb,
gul::Ptr< gul::Ptr< U > > &    T
 

template void CommonCoordinateSystem const point< double > &    B,
const point< double > &    P,
const point< double > &    Ab,
const point< double > &    Pb,
Ptr< Ptr< double > > &    T
 

template void CommonCoordinateSystem const point< float > &    B,
const point< float > &    P,
const point< float > &    Ab,
const point< float > &    Pb,
Ptr< Ptr< float > > &    T
 

template<class U>
void CommonCoordinateSystem const point< U > &    B,
const point< U > &    P,
const point< U > &    Ab,
const point< U > &    Pb,
Ptr< Ptr< U > > &    T
 

Definition at line 49 of file guma_transform.cpp.

Referenced by GUL_CommonCoordinateSystem().

00052 {
00053   point<U> a1,a2,a3,b1,b2,b3;
00054   Ptr< Ptr<U> > Ta,Tb;
00055   int i;
00056 
00057   Ta.reserve_pool(3);
00058   Tb.reserve_pool(3);
00059   for( i = 0; i < 3; i++ )
00060   {
00061     Ta[i].reserve_pool(3);
00062     Tb[i].reserve_pool(3);
00063   }
00064 
00065   normalize( &a1, B );
00066   normalize( &a2, P-((P*a1)*a1) );
00067   normalize( &a3, cross_product(a1,a2) );
00068 
00069   normalize( &b1, -Ab );
00070   normalize( &b2, P-((P*b1)*b1) );
00071   normalize( &b3, cross_product(b1,b2) );
00072 
00073   Tb[0][0] = b1[0];   Tb[0][1] = b1[1];  Tb[0][2] = b1[2];
00074   Tb[1][0] = b2[0];   Tb[1][1] = b2[1];  Tb[1][2] = b2[2];
00075   Tb[2][0] = b3[0];   Tb[2][1] = b3[1];  Tb[2][2] = b3[2];
00076 
00077   GaussJordan( 3, 0, Tb, Tb ); 
00078 
00079   Ta[0][0] = a1[0];   Ta[0][1] = a1[1];  Ta[0][2] = a1[2];
00080   Ta[1][0] = a2[0];   Ta[1][1] = a2[1];  Ta[1][2] = a2[2];
00081   Ta[2][0] = a3[0];   Ta[2][1] = a3[1];  Ta[2][2] = a3[2];
00082 
00083   MMProduct( 3, 3, 3, Tb, Ta, T );  
00084 
00085   T[3][0] = B[0];  T[3][1] = B[1]; T[3][2] = B[2]; T[3][3] = (U)1; 
00086   T[0][3] = T[1][3] = T[2][3] = (U)0; 
00087 }

GULAPI void guma::DeleteElementFromBBT BBTNode   element,
BBTNode   head
 

Definition at line 601 of file guma_sorting.cpp.

Referenced by gul::RefMap::RemoveNode(), gul::Map< kdnnrec< U, V > >::RemoveNode(), and gugr::edge_interval_tree::RemoveNode().

00602 {
00603   BBTNode *P,*Q,*Pk,*Pk_1,*A,*B,*X;
00604   int ak, ak_1, ak_ini;
00605   
00606   P = head->right;
00607   if( P == NULL ) return;
00608     
00609   P = Q = element;
00610 
00611   if( P->right == NULL )    /* Knoten suchen, bei dem rechter oder */
00612   {                         /* linker Ast = NULL:                  */
00613     Pk = P;
00614     ak = 1;
00615     Pk_1 = Pk->parent;
00616     ak_1 = ak_ini = Pk->F.l;
00617   }
00618   else if( P->left == NULL )
00619   {
00620     Pk = P;
00621     ak = -1;
00622     Pk_1 = Pk->parent;
00623     ak_1 = ak_ini = Pk->F.l;
00624   }
00625   else
00626   {
00627     P = P->right;                    /* nach rechts gehen */    
00628 
00629     if( P->left == NULL )
00630     {
00631       Pk = Q;
00632 
00633       if( Q->F.l == 1 )     
00634       {
00635         Q->parent->right = P;
00636         P->F.l = 1;
00637       }
00638       else
00639       {
00640         Q->parent->left = P;
00641         P->F.l = -1; 
00642       }       
00643       P->parent = Q->parent;
00644       P->F.b = Q->F.b;
00645 
00646       ak = 1;
00647       Pk_1 = P;
00648       ak_1 = -1;    
00649       ak_ini = 1;
00650     }
00651     else
00652     {
00653       do            /* suchen bis Nachfolger in symmetrischer */
00654       {             /* Ordnung gefunden                       */
00655         Pk = P;
00656         P = P->left;
00657       }
00658       while( P != NULL );
00659 
00660       ak = -1;
00661       Pk_1 = Pk->parent;
00662       ak_1 = ak_ini = Pk->F.l;
00663     }
00664   }            
00665 
00666 /* --- Knoten loeschen: -------------------------------------------- */
00667 
00668   if( ak_1 == -1 )                                /* wenn Pk linker Sohn */
00669   {
00670     Pk_1->left = (ak == -1 ? Pk->right : Pk->left);
00671     if( Pk_1->left != NULL )
00672     {
00673       Pk_1->left->parent = Pk_1;
00674       Pk_1->left->F.l = -1;
00675     }
00676   }    
00677   else
00678   {
00679     Pk_1->right = (ak == -1 ? Pk->right : Pk->left);
00680     if( Pk_1->right != NULL )
00681     {
00682       Pk_1->right->parent = Pk_1;
00683       Pk_1->right->F.l = 1;
00684     }
00685   }  
00686 
00687   if( Pk != Q )
00688   {
00689     Pk->left = Q->left;                /* Pk uebernimmt nun die Rolle von Q */
00690     if( Pk->left != NULL )
00691       Pk->left->parent = Pk;
00692     Pk->right = Q->right;
00693     if( Pk->right != NULL )
00694       Pk->right->parent = Pk;
00695 
00696     Pk->F.b = Q->F.b;
00697   
00698     Pk->parent = Q->parent;
00699     Pk->F.l = Q->F.l;
00700     if( Pk->F.l == -1 )
00701       Pk->parent->left = Pk;
00702     else
00703       Pk->parent->right = Pk;
00704   } 
00705                                      /* Q kann jetzt freigeben werden */
00706 
00707 /* --- Balance-Faktoren updaten ------------------------------------- */  
00708 
00709   ak = ak_ini;
00710   Pk = Pk_1;
00711 
00712   while( 1 )
00713   {
00714     if( Pk == head )                       /* Listenkopf */
00715     {
00716       (*((int *)&head->left))--;           /* Hoehe des Baums um 1 erniedrigen */
00717       break;                 /*** fertig ***/
00718     }
00719     else if( Pk->F.b == ak )
00720     {
00721       Pk->F.b = 0;
00722 
00723       ak = Pk->F.l;                       /* k-- */
00724       Pk = Pk->parent;
00725     }
00726     else if( Pk->F.b == 0 )
00727     {
00728       Pk->F.b = -ak;
00729       break;                  /*** fertig ***/
00730     }
00731     else                                 /* rebalancieren erforderlich, */
00732     {                                    /* da (Pk->B == -ak) */
00733       if( ak == -1 )          /*** Ausfuehrung fuer (ak == -1) ***/
00734       {
00735         A = Pk;
00736         ak_1 = Pk->F.l;
00737         Pk_1 = Pk->parent; 
00738 
00739         B = A->right;                     /* B = Zweig auf der anderen Seite */
00740       
00741         if( B->F.b == 1 )                 /* B->B == -ak => Single Rotation */
00742         {
00743           A->right = B->left;             /* LINK(A,-ak) = LINK(B,ak) */
00744           if( A->right != NULL )
00745           {
00746             A->right->parent = A;
00747             A->right->F.l = 1;
00748           }
00749 
00750           B->left = A;                    /* LINK(B,ak) = A */
00751           if( B->left != NULL )
00752           {
00753             B->left->parent = B;
00754             B->left->F.l = -1;
00755           }
00756 
00757           A->F.b = B->F.b = 0;
00758           
00759           ak = ak_1;                       /* k-- */
00760           Pk = Pk_1;
00761           
00762           if( ak == -1 )
00763           {
00764             Pk->left = B;
00765             if( Pk->left != NULL )
00766             {
00767               Pk->left->parent = Pk;
00768               Pk->left->F.l = -1;
00769             }
00770           }  
00771           else
00772           {
00773             Pk->right = B;  
00774             if( Pk->right != NULL )
00775             {
00776               Pk->right->parent = Pk;
00777               Pk->right->F.l = 1;
00778             }
00779           }
00780         }
00781         else if( B->F.b == -1 )           /* (B->B == ak) => Double Rotation */
00782         {
00783           X = B->left;                    /* X = LINK(B,ak) */
00784  
00785           A->right = X->left;             /* LINK(A,-ak) = LINK(X,ak) */
00786           if( A->right != NULL )
00787           {
00788             A->right->parent = A;
00789             A->right->F.l = 1;
00790           }
00791 
00792           B->left = X->right;             /* LINK(B,ak) = LINK(X,-ak) */
00793           if( B->left != NULL )
00794           {
00795             B->left->parent = B;
00796             B->left->F.l = -1;
00797           }
00798           
00799           X->left = A;                    /* LINK(X,ak) = A           */
00800           if( X->left != NULL )
00801           {
00802             X->left->parent = X;
00803             X->left->F.l = -1;
00804           }
00805 
00806           X->right = B;                   /* LINK(X,-ak) = B          */
00807           if( X->right != NULL )
00808           {
00809             X->right->parent = X;
00810             X->right->F.l = 1;
00811           }
00812           
00813           if( X->F.b == -1 )              /* (X->B == ak)             */
00814           {
00815             A->F.b = 0;                   /* A->B = 0                 */
00816             B->F.b = 1;                   /* B->B = -ak               */
00817           }
00818           else if( X->F.b == 1 )          /* (X->B == -ak)            */
00819           {
00820             A->F.b = -1;                  /* A->B = ak                */
00821             B->F.b = 0;                   /* B->B = 0                 */
00822           }
00823           else                            /* B->B = 0                 */
00824           {
00825             A->F.b = 0;
00826             B->F.b = 0;
00827           }
00828           X->F.b = 0; 
00829 
00830           ak = ak_1;                       /* k-- */
00831           Pk = Pk_1;
00832 
00833           if( ak == -1 )
00834           {
00835             Pk->left = X;
00836             if( Pk->left != NULL )
00837             {
00838               Pk->left->parent = Pk;
00839               Pk->left->F.l = -1;
00840             }
00841           }  
00842           else
00843           {
00844             Pk->right = X;  
00845             if( Pk->right != NULL )
00846             {
00847               Pk->right->parent = Pk;
00848               Pk->right->F.l = 1;
00849             }
00850           }
00851         }
00852         else                               /* (B->B == 0) => Single Rotation */
00853         {
00854           A->right = B->left;              /* LINK(A,-ak) = LINK(B,ak)     */
00855           if( A->right != NULL )
00856           {
00857             A->right->parent = A;
00858             A->right->F.l = 1;
00859           }
00860           
00861           B->left = A;                     /* LINK(B,ak) = A               */
00862           if( B->left != NULL )
00863           {
00864             B->left->parent = B;
00865             B->left->F.l = -1;
00866           }
00867 
00868           B->F.b = -1;                     /* B->B = ak                    */
00869 
00870           ak = ak_1;                    /* k-- */
00871           Pk = Pk_1;
00872 
00873           if( ak == -1 )
00874           {
00875             Pk->left = B;
00876             if( Pk->left != NULL )
00877             {
00878               Pk->left->parent = Pk;
00879               Pk->left->F.l = -1;
00880             }
00881           }  
00882           else
00883           {
00884             Pk->right = B;  
00885             if( Pk->right != NULL )
00886             {
00887               Pk->right->parent = Pk;
00888               Pk->right->F.l = 1;
00889             }
00890           }
00891 
00892           break;              /*** fertig ***/
00893         }
00894 
00895 
00896       }
00897       else                    /*** dasselbe nochmal fuer (ak == +1) ***/
00898       {
00899         A = Pk;
00900         ak_1 = Pk->F.l;
00901         Pk_1 = Pk->parent;
00902         
00903         B = A->left;                      /* B = Zweig auf der anderen Seite */
00904       
00905         if( B->F.b == -1 )                /* (B->B == -ak) => Single Rotation */
00906         {
00907           A->left = B->right;             /* LINK(A,-ak) = LINK(B,ak) */
00908           if( A->left != NULL )
00909           {
00910             A->left->parent = A;
00911             A->left->F.l = -1;
00912           }
00913                 
00914           B->right = A;
00915           if( B->right != NULL )
00916           {
00917             B->right->parent = B;
00918             B->right->F.l = 1;
00919           }
00920           
00921           A->F.b = B->F.b = 0;
00922           
00923           ak = ak_1;                       /* k-- */
00924           Pk = Pk_1;
00925         
00926           if( ak == -1 )
00927           {
00928             Pk->left = B;
00929             if( Pk->left != NULL )
00930             {
00931               Pk->left->parent = Pk;
00932               Pk->left->F.l = -1;
00933             }
00934           }  
00935           else
00936           {
00937             Pk->right = B;  
00938             if( Pk->right != NULL )
00939             {
00940               Pk->right->parent = Pk;
00941               Pk->right->F.l = 1;
00942             }
00943           }
00944         }
00945         else if( B->F.b == 1 )            /* (B->B == ak) => Double Rotation */
00946         {
00947           X = B->right;                   /* X = LINK(B,ak) */
00948  
00949           A->left = X->right;             /* LINK(A,-ak) = LINK(X,ak) */
00950           if( A->left != NULL )
00951           {
00952             A->left->parent = A;
00953             A->left->F.l = -1;
00954           }
00955           
00956           B->right = X->left;             /* LINK(B,ak) = LINK(X,-ak) */
00957           if( B->right != NULL )
00958           {
00959             B->right->parent = B;
00960             B->right->F.l = 1;
00961           }
00962 
00963           X->right = A;                   /* LINK(X,ak) = A           */
00964           if( X->right != NULL )
00965           {
00966             X->right->parent = X;
00967             X->right->F.l = 1;
00968           }
00969 
00970           X->left = B;                    /* LINK(X,-ak) = B          */
00971           if( X->left != NULL )
00972           {
00973             X->left->parent = X;
00974             X->left->F.l = -1;
00975           }
00976 
00977           if( X->F.b == 1 )               /* (X->B == ak)             */
00978           {
00979             A->F.b = 0;                   /* A->B = 0                 */
00980             B->F.b = -1;                  /* B->B = -ak               */
00981           }
00982           else if( X->F.b == -1 )         /* (X->B == -ak)            */
00983           {
00984             A->F.b = 1;                   /* A->B = ak                */
00985             B->F.b = 0;                   /* B->B = 0                 */
00986           }
00987           else                            /* B->B = 0                 */
00988           {
00989             A->F.b = 0;
00990             B->F.b = 0;
00991           }  
00992           X->F.b = 0;
00993 
00994           ak = ak_1;                       /* k-- */
00995           Pk = Pk_1;
00996         
00997           if( ak == -1 )
00998           {
00999             Pk->left = X;
01000             if( Pk->left != NULL )
01001             {
01002               Pk->left->parent = Pk;
01003               Pk->left->F.l = -1;
01004             }
01005           }  
01006           else
01007           {
01008             Pk->right = X;  
01009             if( Pk->right != NULL )
01010             {
01011               Pk->right->parent = Pk;
01012               Pk->right->F.l = 1;
01013             }
01014           }
01015         }
01016         else                               /* (B->B == 0) => Single Rotation */
01017         {
01018           A->left = B->right;              /* LINK(A,-ak) = LINK(B,ak)     */
01019           if( A->left != NULL )
01020           {
01021             A->left->parent = A;
01022             A->left->F.l = -1;
01023           }
01024 
01025           B->right = A;                    /* LINK(B,ak) = A               */
01026           if( B->right != NULL )
01027           {
01028             B->right->parent = B;
01029             B->right->F.l = 1;
01030           }
01031           
01032           B->F.b = 1;                      /* B->B = ak                    */
01033 
01034           ak = ak_1;                    /* k-- */
01035           Pk = Pk_1;
01036         
01037           if( ak == -1 )
01038           {
01039             Pk->left = B;
01040             if( Pk->left != NULL )
01041             {
01042               Pk->left->parent = Pk;
01043               Pk->left->F.l = -1;
01044             }
01045           }  
01046           else
01047           {
01048             Pk->right = B;  
01049             if( Pk->right != NULL )
01050             {
01051               Pk->right->parent = Pk;
01052               Pk->right->F.l = 1;
01053             }
01054           }
01055 
01056           break;              /*** fertig ***/
01057         }
01058       }
01059     }    /*** Ende "while"-Schleife ***/
01060   }
01061     
01062   return;
01063 }                                   

GULAPI void guma::DumpBBTNode BBTNode   node,
int    level
 

Definition at line 1097 of file guma_sorting.cpp.

01098 {
01099   int i;
01100 
01101   if( node == NULL )
01102     return;
01103     
01104   if( node->left != NULL )
01105     DumpBBTNode( node->left, level+4 );
01106 
01107   for( i = 0; i < level; i++ )
01108   {
01109     cout << " ";
01110   }
01111   cout << (void *)node << ":[b:" << node->F.b << ", l:" << node->F.l <<
01112        "] (l=" << (void *)node->left << ", r=" <<
01113        (void *)node->right << ", p=" << (void *)node->parent << ")\n";
01114 
01115   if( node->right != NULL )
01116     DumpBBTNode( node->right, level+4 );
01117 }

GULAPI void guma::DumpBBTTree BBTNode   node,
int    level,
void dumpkey_func(void *)   
 

Definition at line 1069 of file guma_sorting.cpp.

01071 {
01072   int i;
01073 
01074   if( node == NULL )
01075     return;
01076     
01077   if( node->left != NULL )
01078     DumpBBTTree( node->left, level+4, dumpkey_func );
01079 
01080   for( i = 0; i < level; i++ )
01081   {
01082     cout << " ";
01083   }
01084 
01085   if( node->key != NULL )
01086     dumpkey_func( node->key );
01087     cout << "\n";
01088 
01089   if( node->right != NULL )
01090     DumpBBTTree( node->right, level+4, dumpkey_func );
01091 }

template GULAPI bool GaussJordan int    nRowsCols,
int    m,
Ptr< Ptr< double > > &    A,
Ptr< Ptr< double > > &    b
 

template GULAPI bool GaussJordan int    nRowsCols,
int    m,
Ptr< Ptr< float > > &    A,
Ptr< Ptr< float > > &    b
 

template<class T>
GULAPI bool guma::GaussJordan int    nRowsCols,
int    nRightSides,
Ptr< Ptr< T > > &    A,
Ptr< Ptr< T > > &    b
 

Solve systems of linear equations with Gauss Jordan Elimination.

(A)nn * (b')nm = (b)nm (A)nn * (A')nn = (1)nn

After that, matrix 'A' contains the inverse matrix of 'A', and the columns of 'b' contain the solution vectors of the different right sides in 'b'. (see "Numerical Recipes in C")

Definition at line 59 of file guma_lineq.cpp.

00061 {
00062   Ptr<int> indexc,indexr;
00063   Ptr<T> ipivot;
00064   int icol,irow, n,i,j,k,l,ll,m;
00065   T big,pivotinv,dummy;
00066 
00067   n = nRowsCols - 1;
00068   m = nRightSides - 1;
00069 
00070   indexc.reserve_pool(n+1);
00071   indexr.reserve_pool(n+1);
00072   ipivot.reserve_pool(n+1);
00073   
00074   for( j = 0; j <= n; j++ )
00075     ipivot[j] = 0;
00076  
00077   for( i = 0; i <= n; i++ )
00078   {
00079     big = 0.0;
00080     
00081     for( j = 0; j <= n; j++ )
00082     {
00083       if( ipivot[j] != 1 )
00084       {
00085         for( k = 0; k <= n; k++ )
00086         {
00087           if( ipivot[k] == 0 )
00088           {
00089             if( rtr<T>::fabs( A[j][k] ) >= big )
00090             {
00091               big = rtr<T>::fabs( A[j][k] );
00092               irow = j;
00093               icol = k;
00094             }
00095           }
00096           else if( ipivot[k] > 1 )
00097             return false;
00098         }
00099       }
00100     } 
00101     ipivot[icol]++;
00102 
00103     if( irow != icol )
00104     {
00105       for( l = 0; l <= n; l++ )
00106         Swap( A[irow][l], A[icol][l] );
00107       for( l = 0; l <= m; l++ )
00108         Swap( b[irow][l], b[icol][l] ); 
00109     }
00110     indexr[i] = irow;
00111     indexc[i] = icol;
00112 
00113     if( A[icol][icol] == 0.0 )
00114       return false;
00115 
00116     pivotinv = (T)1 / A[icol][icol];
00117     A[icol][icol] = 1.0;
00118     for( l = 0; l <= n; l++ )
00119       A[icol][l] *= pivotinv;
00120     for( l = 0; l <= m; l++ )
00121       b[icol][l] *= pivotinv;
00122       
00123     for( ll = 0; ll <= n; ll++ )
00124     {
00125       if( ll != icol )
00126       {
00127         dummy = A[ll][icol];
00128         A[ll][icol] = 0.0;
00129         for( l = 0; l <= n; l++ )
00130           A[ll][l] -= A[icol][l] * dummy;
00131         for( l = 0; l <= m; l++ )
00132           b[ll][l] -= b[icol][l] * dummy;  
00133       }
00134     }
00135   }
00136   for( l = n; l >= 0; l-- )
00137   {
00138     if( indexr[l] != indexc[l] )
00139     {
00140       for( k = 0; k <= n; k++ )
00141         Swap( A[k][indexr[l]], A[k][indexc[l]] );
00142     }
00143   }
00144   return true;
00145 }

GULAPI gul::uint32 guma::GetSeed  
 

Definition at line 91 of file guma_random.cpp.

Referenced by guma::random_des::Random().

00092 {
00093   uint32 seed;
00094   int fd,n;
00095    
00096   fd = open( "/dev/random", O_RDONLY ); 
00097   if( fd < 0 )
00098   {
00099     cout << "GetSeed: Couldn't open \"/dev/random\"\n";
00100     return (uint32)time(0);
00101   } 
00102   n = read( fd, &seed, sizeof(seed) );
00103   if( n != sizeof(seed) )
00104   {
00105     close(fd);
00106 
00107     cout << "GetSeed: Couldn't read " << sizeof(seed) << "bytes\n";
00108     return (uint32)time(0);
00109   }  
00110 
00111   close(fd);
00112   return seed;
00113 }

template bool GoldenSectionSearch double    ax,
double    bx,
double    cx,
double(*    func)(double, void *),
void *   ,
double    tol,
int    max_iterations,
double *    xmin,
double *    fmin
 

template bool GoldenSectionSearch float    ax,
float    bx,
float    cx,
float(*    func)(float, void *),
void *   ,
float    tol,
int    max_iterations,
float *    xmin,
float *    fmin
 

template<class T>
bool guma::GoldenSectionSearch   ax,
  bx,
  cx,
T(*    func)(T, void *),
void *    fdat,
  tol,
int    max_iterations,
T *    xmin,
T *    fmin
 

Searches the minimum of a function, defined over an intervall.

uses Golden Section search (a three point bracketing method), see "Numerical recipes in C", intervall: ax < bx < cx, function values: f(ax) > f(bx) < f(cx)

Definition at line 35 of file guma_minimize.cpp.

00037 {
00038   T x0,x1,x2,x3,f1,f2;
00039   int iteration;
00040     
00041   x0 = ax;
00042   x3 = cx;
00043   
00044   if( rtr<T>::fabs(cx-bx) > rtr<T>::fabs(bx-ax) )
00045   {
00046     x1 = bx;
00047     x2 = bx + rtr<T>::golden_c()*(cx-bx);
00048   }
00049   else
00050   {
00051     x2 = bx;
00052     x1 = bx - rtr<T>::golden_c()*(bx-ax);
00053   }    
00054   f1 = func( x1, fdat );
00055   f2 = func( x2, fdat );
00056 
00057   for( iteration = 0; iteration < max_iterations; iteration++ )
00058   {
00059     if( f2 < f1 )
00060     {
00061       x0 = x1;
00062       x1 = x2;
00063       x2 = rtr<T>::golden_r() * x2 + rtr<T>::golden_c() * x3;
00064       f1 = f2;
00065       f2 = func( x2, fdat );
00066     }
00067     else
00068     {
00069       x3 = x2;
00070       x2 = x1;
00071       x1 = rtr<T>::golden_r() * x2 + rtr<T>::golden_c() * x0;
00072       f2 = f1;
00073       f1 = func( x1, fdat );
00074     }    
00075     if( rtr<T>::fabs(x3-x0) <= tol*(rtr<T>::fabs(x1)+rtr<T>::fabs(x2)) )
00076       break;
00077   }
00078   if( f1 < f2 )
00079   {
00080     *xmin = x1;
00081     *fmin = f1;  
00082   }
00083   else
00084   {
00085     *xmin = x2;
00086     *fmin = f2;
00087   }
00088   if( iteration == max_iterations ) return false;
00089   return true;
00090 }

GULAPI void guma::heapsort int    nA,
gul::Ptr< int > &    A
 

Definition at line 148 of file guma_sorting.cpp.

00148 { _heapsort( nA, A ); }

GULAPI void guma::heapsort int    nA,
gul::Ptr< void *> &    A
 

Definition at line 147 of file guma_sorting.cpp.

00147 { _heapsort( nA, A ); }

GULAPI void guma::HeapSort size_t    nelem,
size_t    elsize,
void *    elptr,
int(*    usrfunc)(void *, void *, void *),
void *    usrdata
 

Definition at line 38 of file guma_sorting.cpp.

00040 {
00041   char *ra, *rra;
00042   size_t n = nelem, l, ir, i, j;
00043 
00044   rra = (char *)alloca( elsize );
00045   if( rra == NULL ) return;
00046 
00047   ra = (char *)elptr;
00048 
00049   if( n < 2 ) return;
00050   l = (n >> 1) + 1;
00051   ir = n;
00052   
00053   for(;;)
00054   {
00055     if( l > 1 )
00056     {
00057       memcpy( rra, &ra[(l-2)*elsize], elsize );
00058       l--;    
00059     }
00060     else
00061     {
00062       memcpy( rra, &ra[(ir-1)*elsize], elsize );
00063       memcpy( &ra[(ir-1)*elsize], ra, elsize );
00064       if( --ir == 1 )
00065       {
00066         memcpy( ra, rra, elsize );
00067         break;
00068       }
00069     }
00070     i = l;
00071     j = l+l;
00072 
00073     while( j <= ir )
00074     {
00075       if( (j < ir) &&
00076           (usrfunc( &ra[(j-1)*elsize], &ra[j*elsize], usrdata ) < 0) )
00077         j++;
00078        
00079       if( usrfunc(rra, &ra[(j-1)*elsize], usrdata) < 0 )
00080       {
00081         memcpy( &ra[(i-1)*elsize], &ra[(j-1)*elsize], elsize );
00082         i = j;
00083         j <<= 1;
00084       }
00085       else
00086         j = ir + 1;
00087     }
00088     memcpy( &ra[(i-1)*elsize], rra, elsize );
00089   }
00090   return;
00091 }

GULAPI void guma::InitBBT BBTNode   head
 

Definition at line 166 of file guma_sorting.cpp.

Referenced by gul::RefMap::DeleteElems(), gul::Map< kdnnrec< U, V > >::DeleteElems(), gugr::edge_interval_tree::edge_interval_tree(), gul::Map< kdnnrec< U, V > >::Map(), and gul::RefMap::RefMap().

00167 {
00168   head->F.b = 1;
00169   head->F.l = 0;
00170  
00171   (*((int *)(&head->left))) = 0;  /* height = 0 */
00172   head->right = NULL;
00173 }

GULAPI void guma::InsertElementIntoBBT BBTNode   element,
BBTNode   where,
int    side,
BBTNode   head
 

Definition at line 281 of file guma_sorting.cpp.

Referenced by gul::RefMap::InsertNode(), gul::Map< kdnnrec< U, V > >::InsertNode(), and gugr::edge_interval_tree::InsertNode().

00283 {
00284   BBTNode *Q, *Pk, *Pk_1, *A, *B, *X;
00285   int ak, ak_1;
00286 
00287   Q = element;                    /* neuen Knoten initialisieren */
00288   Q->left = Q->right = NULL;    
00289   Q->F.b = 0;
00290 
00291   Pk = where;
00292   ak = side;
00293 
00294   if( ak == -1 )
00295   {
00296     Pk->left = Q;
00297     if( Pk->left != NULL )
00298     {
00299       Pk->left->parent = Pk;
00300       Pk->left->F.l = -1;
00301     }
00302   }  
00303   else
00304   {
00305     Pk->right = Q;  
00306     if( Pk->right != NULL )
00307     {
00308       Pk->right->parent = Pk;
00309       Pk->right->F.l = 1;
00310     }
00311   }  
00312   
00313   while( (Pk->F.b == 0) && (Pk != head) )  /* Balance Faktoren aktualisieren */
00314   {
00315     Pk->F.b = ak;
00316     ak = Pk->F.l;                 /* k-- */
00317     Pk = Pk->parent;
00318   }
00319 
00320   if( Pk == head )
00321   {
00322     (*((int *)(&head->left)))++;  /* Baumhoehe im Headerknoten erhoehen */
00323     return;                      /*** fertig ***/
00324   }
00325 
00326   if( ak == -1 ) /*** eventuell Rebalancieren, Ausfuehrung fuer (ak == -1) ***/
00327   {
00328     A = Pk;
00329     Pk_1 = Pk->parent;
00330     ak_1 = Pk->F.l;
00331     
00332     if( A->F.b == 1 )             /* (A->B == -ak)   */    
00333     {
00334       A->F.b = 0;
00335       return;                    /*** fertig ***/
00336     }
00337     else                          /* A->B == ak      */
00338     {
00339       B = Pk->left;               /* B = LINK(A,ak)  */
00340 
00341       if( B->F.b == -1 )          /* (B->B == ak) => Single Rotation */
00342       {
00343         A->left = B->right;       /* LINK(A,ak) = LINK(B,-ak) */     
00344         if( A->left != NULL )
00345         {
00346           A->left->parent = A;
00347           A->left->F.l = -1;
00348         }
00349             
00350         B->right = A;             /* LINK(B,-ak) = A  */
00351         if( B->right != NULL )
00352         {
00353           B->right->parent = B;
00354           B->right->F.l = 1;
00355         }
00356             
00357         A->F.b = B->F.b = 0;
00358 
00359         ak = ak_1;                          /* k-- */
00360         Pk = Pk_1;
00361           
00362         if( ak == -1 )                      /* Wurzel Teilbaum = B */
00363         {
00364           Pk->left = B;
00365           if( Pk->left != NULL )
00366           {
00367             Pk->left->parent = Pk;
00368             Pk->left->F.l = -1;
00369           }
00370         }  
00371         else
00372         {
00373           Pk->right = B;  
00374           if( Pk->right != NULL )
00375           {
00376             Pk->right->parent = Pk;
00377             Pk->right->F.l = 1;
00378           }
00379         }
00380 
00381         return;   /*** fertig ***/
00382       }
00383       else                        /* (B->B == -ak) => Double Rotation */
00384       {
00385         X = B->right;             /* X = LINK(B,-ak)                  */
00386 
00387         A->left = X->right;       /* LINK(A,ak) = LINK(X,-ak)         */
00388         if( A->left != NULL )
00389         {
00390           A->left->parent = A;
00391           A->left->F.l = -1;
00392         }
00393             
00394         B->right = X->left;       /* LINK(B,-ak) = LINK(X,ak)         */
00395         if( B->right != NULL )
00396         {
00397           B->right->parent = B;
00398           B->right->F.l = 1;
00399         }
00400             
00401         X->left = B;              /* LINK(X,ak) = B                   */
00402         if( X->left != NULL )
00403         {
00404           X->left->parent = X;
00405           X->left->F.l = -1;
00406         }
00407             
00408         X->right = A;             /* LINK(X,-ak) = A                  */
00409         if( X->right != NULL )
00410         {
00411           X->right->parent = X;
00412           X->right->F.l = 1;
00413         }
00414     
00415         if( X->F.b == 1 )         /* (X.B == -ak)                     */
00416         {
00417           B->F.b = -1;            /* B->B = ak                        */
00418           A->F.b = 0;             /* A->B = 0                         */
00419         }  
00420         else if( X->F.b == -1 )   /* (X.B == ak )                     */
00421         {
00422           B->F.b = 0;             /* B->B = 0                         */
00423           A->F.b = 1;             /* A->B = -ak                       */
00424         }
00425         else           /* (X.B == 0), (Anm: ist der Fall, wenn X == Q)*/ 
00426         {
00427           B->F.b = 0;             /* B->B = 0                         */
00428           A->F.b = 0;             /* A->B = 0                         */
00429         }
00430         X->F.b = 0;               /* X->B = 0                         */
00431 
00432         ak = ak_1;                          /* k-- */
00433         Pk = Pk_1;
00434           
00435         if( ak == -1 )                      /* Wurzel Teilbaum = X */
00436         {
00437           Pk->left = X;
00438           if( Pk->left != NULL )
00439           {
00440             Pk->left->parent = Pk;
00441             Pk->left->F.l = -1;
00442           }
00443         }  
00444         else
00445         {
00446           Pk->right = X;  
00447           if( Pk->right != NULL )
00448           {
00449             Pk->right->parent = Pk;
00450             Pk->right->F.l = 1;
00451           }
00452         }
00453 
00454         return;   /*** fertig ***/
00455       }
00456     }
00457   }
00458 
00459 
00460   else         /*** Ausfuehrung fuer (ak == 1) ***/
00461   {
00462     A = Pk;
00463     Pk_1 = Pk->parent;
00464     ak_1 = Pk->F.l;
00465     
00466     if( A->F.b == -1 )            /* (A->B == -ak)   */    
00467     {
00468       A->F.b = 0;
00469       return;                    /*** fertig ***/
00470     }
00471     else                          /* A->B == ak      */
00472     {
00473       B = Pk->right;              /* B = LINK(A,ak)  */
00474 
00475       if( B->F.b == 1 )           /* (B->B == ak) => Single Rotation */
00476       {
00477         A->right = B->left;       /* LINK(A,ak) = LINK(B,-ak) */     
00478         if( A->right != NULL )
00479         {
00480           A->right->parent = A;
00481           A->right->F.l = 1;
00482         }
00483         
00484         B->left = A;              /* LINK(B,-ak) = A  */
00485         if( B->left != NULL )
00486         {
00487           B->left->parent = B;
00488           B->left->F.l = -1;
00489         }
00490         
00491         A->F.b = B->F.b = 0;
00492 
00493         ak = ak_1;                       /* k-- */
00494         Pk = Pk_1;
00495           
00496         if( ak == -1 )                      /* Wurzel Teilbaum = B */
00497         {
00498           Pk->left = B;
00499           if( Pk->left != NULL )
00500           {
00501             Pk->left->parent = Pk;
00502             Pk->left->F.l = -1;
00503           }
00504         }  
00505         else
00506         {
00507           Pk->right = B;  
00508           if( Pk->right != NULL )
00509           {
00510             Pk->right->parent = Pk;
00511             Pk->right->F.l = 1;
00512           }
00513         }
00514 
00515         return;   /*** fertig ***/
00516       }
00517       else                        /* (B->B == -ak) => Double Rotation */
00518       {
00519         X = B->left;              /* X = LINK(B,-ak)                  */
00520 
00521         A->right = X->left;       /* LINK(A,ak) = LINK(X,-ak)         */
00522         if( A->right != NULL )
00523         {
00524           A->right->parent = A;
00525           A->right->F.l = 1;
00526         }
00527 
00528         B->left = X->right;       /* LINK(B,-ak) = LINK(X,ak)         */
00529         if( B->left != NULL )
00530         {
00531           B->left->parent = B;
00532           B->left->F.l = -1;
00533         }
00534     
00535         X->right = B;             /* LINK(X,ak) = B                   */
00536         if( X->right != NULL )
00537         {
00538           X->right->parent = X;
00539           X->right->F.l = 1;
00540         }
00541             
00542         X->left = A;              /* LINK(X,-ak) = A                  */
00543         if( X->left != NULL )
00544         {
00545           X->left->parent = X;
00546           X->left->F.l = -1;
00547         }
00548         
00549         if( X->F.b == -1 )        /* (X.B == -ak)                     */
00550         {
00551           B->F.b = 1;             /* B->B = ak                        */
00552           A->F.b = 0;             /* A->B = 0                         */
00553         }  
00554         else if( X->F.b == 1 )    /* (X.B == ak )                     */
00555         {
00556           B->F.b = 0;             /* B->B = 0                         */
00557           A->F.b = -1;            /* A->B = -ak                       */
00558         }
00559         else           /* (X.B == 0), (Anm: ist der Fall, wenn X == Q)*/ 
00560         {
00561           B->F.b = 0;             /* B->B = 0                         */
00562           A->F.b = 0;             /* A->B = 0                         */
00563         }
00564         X->F.b = 0;               /* X->B = 0                         */
00565 
00566         ak = ak_1;                          /* k-- */
00567         Pk = Pk_1;
00568           
00569         if( ak == -1 )                      /* Wurzel Teilbaum = X */
00570         {
00571           Pk->left = X;
00572           if( Pk->left != NULL )
00573           {
00574             Pk->left->parent = Pk;
00575             Pk->left->F.l = -1;
00576           }
00577         }  
00578         else
00579         {
00580           Pk->right = X;  
00581           if( Pk->right != NULL )
00582           {
00583             Pk->right->parent = Pk;
00584             Pk->right->F.l = 1;
00585           }
00586         }
00587 
00588         return;   /*** fertig ***/
00589       }
00590     }
00591   }
00592 }

template bool LinearSearch const Ptr< float > &    p,
const Ptr< float > &    xold,
float    fold,
const Ptr< float > &    g,
const Ptr< float > &    x1,
const Ptr< float > &    x2,
newton_info< float > &    I,
bool &    found,
bool &    check,
Ptr< float > &    x,
float *    fx
 

template<class T>
bool LinearSearch const Ptr< T > &    p,
const Ptr< T > &    xold,
  fold,
const Ptr< T > &    g,
const Ptr< T > &    x1,
const Ptr< T > &    x2,
newton_info< T > &    I,
bool &    found,
bool &    check,
Ptr< T > &    x,
T *    fx
 

Definition at line 50 of file guma_newton.cpp.

00061                                                {i+1}-x_{i}| < TOLX)          */
00062               Ptr<T>&  x,          /* return: point in domain */
00063               T       *fx          /* return: function value there */
00064             )
00065 {
00066   T sum, slope, test, temp, alamin, alam, alphamin, alpha, stpmax;
00067   T a, b, alam2, disc, f2, fold2, rhs1, rhs2, tmplam;
00068   int i, n;
00069   T f;
00070   
00071   found = false;
00072   n = I.dim;
00073 
00074   // maximale Schrittweite bestimmen
00075 
00076   alphamin = 1.0;
00077   
00078   for( i = 0; i < n; i++ )
00079   {
00080     if( xold[i] + p[i] < x1[i] )
00081       alpha = (x1[i] - xold[i]) / p[i];
00082     else if( xold[i] + p[i] > x2[i] )
00083       alpha = (x2[i] - xold[i]) / p[i];
00084     else
00085       alpha = 1.0;
00086 
00087     if( rtr<T>::fabs(alpha) == 0.0 )
00088     {
00089       p[i] = 0.0;
00090       alpha = 1.0;   
00091     }
00092   
00093     if( alpha < alphamin )
00094       alphamin = alpha;  
00095   }        
00096     
00097   for( sum = 0.0, i = 0; i < n; i++ )
00098     sum += p[i] * p[i];
00099 
00100   stpmax = rtr<T>::fabs(alphamin) * rtr<T>::sqrt(sum);
00101 
00102   /*-------------------------------------------------------------*/
00103 
00104   for( sum = 0.0, i = 0; i < n; i++ )
00105     sum += p[i] * p[i];
00106   sum = rtr<T>::sqrt( sum );  
00107   
00108   if( sum > stpmax )
00109     for( i = 0; i < n; i++ )
00110       p[i] *= stpmax / sum;      /* Skalieren, falls Schritt zu gross */
00111       
00112   for( slope = 0.0, i = 0; i < n; i++ )
00113     slope += g[i] * p[i];      
00114       
00115   test = 0.0;
00116   
00117   for( i = 0; i < n; i++ )
00118   {
00119     temp = rtr<T>::fabs(p[i]) / Max(rtr<T>::fabs(xold[i]),(T)1);     
00120     if( temp > test ) test = temp;
00121   }
00122   if( test == (T)0 ) test = rtr<T>::tiny();
00123   
00124   alamin = I.tolx / test;
00125   alam = (T)1;              /* Im ersten Durchgang volle Schrittweite */
00126       
00127   for( ;; )
00128   {
00129     for( i = 0; i < n; i++ )            
00130     {
00131       x[i] = xold[i] + alam * p[i];
00132 
00133       if( x[i] < x1[i] ) x[i] = x1[i];
00134       else if( x[i] > x2[i] ) x[i] = x2[i];
00135     } 
00136 
00137     found = I.calcf( x, &f );
00138     if( found ) { check = false; break; }
00139     
00140     if( alam < alamin )           /* Konvergenz von dx,                     */
00141     {                             /* aufrufendes Programm sollte Konvergenz */
00142       for( i = 0; i < n; i++ )    /* verifizieren                           */
00143         x[i] = xold[i];
00144       check = true;
00145       break;  
00146     }
00147 
00148     if( f <= fold + I.alf * alam * slope )  /* Funktionswert nimmt stark */
00149     { check = false;  break; }              /* genug ab */
00150 
00151     if( alam == (T)1 )                             /* falls 1.Durchgang */
00152       tmplam = -slope / ((T)2 * (f-fold-slope));
00153     else  
00154     {
00155       rhs1 = f - fold - alam * slope;
00156       rhs2 = f2 - fold2 - alam2 * slope;
00157       a = (rhs1/(alam*alam) - rhs2/(alam2*alam2)) / (alam-alam2);
00158       b = (-alam2*rhs1/(alam*alam) + alam*rhs2/(alam2*alam2)) / (alam-alam2);
00159        
00160       if( a == (T)0 )
00161         tmplam = -slope/((T)2*b);
00162       else
00163       {
00164         disc = b*b - (T)3*a*slope;
00165 
00166         if( disc < (T)0 )     /* roundoff problem */
00167           return false;    
00168 
00169         tmplam = (-b + rtr<T>::sqrt(disc)) / ((T)3*a);
00170       }
00171       
00172       if( tmplam > (T)0.5 * alam )
00173         tmplam = (T)0.5 * alam;        /* lambda <= 0.5 * lambda1  */            
00174     }        
00175     
00176     alam2 = alam;
00177     f2 = f;
00178     fold2 = fold;
00179     alam = Max( tmplam, (T)0.1*alam );   /* lambda >= 0.1 * lambda1  */ 
00180   }  
00181     
00182   *fx = f;
00183   return true;  
00184 }    

template GULAPI void LUBackSubstitution int    nRowsCols,
Ptr< int > &    index,
Ptr< Ptr< double > > &    A,
Ptr< double > &    b
 

template GULAPI void LUBackSubstitution int    nRowsCols,
Ptr< int > &    index,
Ptr< Ptr< float > > &    A,
Ptr< float > &    b
 

template<class T>
GULAPI void guma::LUBackSubstitution int    nRowsCols,
Ptr< int > &    index,
Ptr< Ptr< T > > &    A,
Ptr< T > &    b
 

Solve system of linear equations with help of LU-Decomposition (given in A).

Definition at line 237 of file guma_lineq.cpp.

00239 {
00240   int ii,i,j,ip,n;
00241   T sum;
00242   
00243   n = nRowsCols-1;
00244 
00245   ii = -1;
00246 
00247   for( i = 0; i <= n; i++ )
00248   {
00249     ip = index[i];
00250     sum = b[ip];
00251     b[ip] = b[i];
00252     
00253     if( ii >= 0 )
00254     {
00255       for( j = ii; j <= i-1; j++ )
00256         sum -= A[i][j] * b[j];
00257     }
00258     else 
00259       if( sum != 0.0 )
00260         ii = i;
00261 
00262     b[i] = sum;    
00263   }
00264   for( i = n; i >= 0; i-- )
00265   {
00266     sum = b[i];
00267     
00268     for( j = i+1; j <= n; j++ )
00269       sum -= A[i][j] * b[j];
00270       
00271     b[i] = sum / A[i][i];  
00272   }
00273 }

template GULAPI bool LUDecomposition int    nRowsCols,
Ptr< Ptr< double > > &    A,
int *    perm_sign,
Ptr< int > &    index
 

template GULAPI bool LUDecomposition int    nRowsCols,
Ptr< Ptr< float > > &    A,
int *    perm_sign,
Ptr< int > &    index
 

template<class T>
GULAPI bool guma::LUDecomposition int    nRowsCols,
Ptr< Ptr< T > > &    A,
int *    perm_sign,
Ptr< int > &    index
 

Decompose a matrix into lower and upper triangular matrix.

the function throws an exception when an singular matrix is encountered (for convenience, so that not only the calling program can react to this, but also functions higher in the call stack)

Definition at line 155 of file guma_lineq.cpp.

00157 {
00158   Ptr<T> vv;
00159   T big,sum,dummy,temp;
00160   int i,j,k,imax,n,d;
00161 
00162   n = nRowsCols - 1;
00163   vv.reserve_pool(n+1); /* vv will contain pivot scale factor for each row */
00164   d = 1;
00165   
00166   for( i = 0; i <= n; i++ )
00167   {
00168     big = 0.0;
00169     for( j = 0; j <= n; j++ )
00170     {
00171       if( (temp = rtr<T>::fabs(A[i][j])) > big )
00172         big = temp;
00173     }    
00174     if( big == 0.0 )  
00175       return false;
00176 
00177     vv[i] = (T)1 / big;
00178   }  
00179   for( j = 0; j <= n; j++ )    /* loop over columns */
00180   {
00181     for( i = 0; i < j; i++ )
00182     {
00183       sum = A[i][j];
00184       for( k = 0; k < i; k++ )
00185         sum -= A[i][k] * A[k][j];
00186       A[i][j] = sum;
00187     }
00188     big = 0.0;
00189     
00190     for( i = j; i <= n; i++ )
00191     {
00192       sum = A[i][j];
00193       for( k = 0; k < j; k++ )
00194         sum -= A[i][k] * A[k][j];
00195       A[i][j] = sum;
00196       
00197       if( (dummy = vv[i] * rtr<T>::fabs(sum)) >= big ) // search pivot element
00198       {
00199         big = dummy;
00200         imax = i;
00201       }
00202     }   
00203     if( j != imax ) /* pivot element not on diagonal */
00204     {
00205       for( k = 0; k <= n; k++ )
00206         Swap( A[imax][k], A[j][k] );  /* swap rows */
00207  
00208       d = -d;  
00209       vv[imax] = vv[j];  /* swap scale factors */
00210     }
00211     index[j] = imax;
00212  
00213     if( A[j][j] == 0.0 )
00214       A[j][j] = rtr<T>::tiny();
00215       
00216     if( j != n )          /* divide  by pivot element */
00217     {
00218       dummy = (T)1 / A[j][j];
00219       for( i = j+1; i <= n; i++ )
00220         A[i][j] *= dummy;
00221     }  
00222   }    /* next column */ 
00223 
00224   *perm_sign = d;
00225   return true;
00226 }                                          

template bool Newton Ptr< double > &    x,
const Ptr< double > &    x1,
const Ptr< double > &    x2,
newton_info< double > &    I,
int    maxits
 

template bool Newton Ptr< float > &    x,
const Ptr< float > &    x1,
const Ptr< float > &    x2,
newton_info< float > &    I,
int    maxits
 

template<class T>
bool guma::Newton Ptr< T > &    x,
const Ptr< T > &    x1,
const Ptr< T > &    x2,
newton_info< T > &    I,
int    maxits
 

Definition at line 215 of file guma_newton.cpp.

00221 {
00222   int its, i, j, n;
00223   T f, fold, sum, temp, test;
00224   bool result, found, check;
00225   Ptr<int> indx;
00226   Ptr<T> g,p,xold;
00227   Ptr< Ptr<T> > A;
00228   int sign;
00229 
00230   n = I.dim;
00231 
00232   A.reserve_pool(n);
00233   for( i = 0; i < n; i++ )
00234     A[i].reserve_pool(n);
00235 
00236   indx.reserve_pool(n);
00237   g.reserve_pool(n);
00238   p.reserve_pool(n);
00239   xold.reserve_pool(n);
00240      
00241   /* ------- Hauptschleife: ---------------------------------------- */  
00242 
00243   found = I.calcf( x, &f );
00244   if( found ) { return true; }
00245 
00246   for( its = 1; its < maxits; its++ )
00247   { 
00248     for( i = 0; i < n; i++ )              /* Gradient von f=1/2*F*F */
00249     {                                     /* berechnen (=> df = F*J */
00250       for( sum = 0.0, j = 0; j < n; j++ )
00251         sum += I.fvec[j] * I.fjac[j][i];
00252       g[i] = sum;  
00253     }
00254 
00255     for( i = 0; i < n; i++ )
00256       xold[i] = x[i];
00257     fold = f;
00258     
00259     for( i = 0; i < n; i++ )
00260       p[i] = -I.fvec[i];              /* rechte Seite der Gleichung */
00261 
00262     MCopy(n,n,I.fjac,A);
00263     result = LUDecomposition( n, A, &sign, indx );
00264     if( !result ) return(false);
00265     LUBackSubstitution( n, indx, A, p );
00266 
00267     /* ------------------------------------------------------------------- */
00268 
00269     result = LinearSearch( p, xold, fold, g, x1, x2, I, found, check, x, &f );  
00270     // if( (!result) || check ) return false;
00271     if( !result ) return false;
00272 
00273     // convergence of dx may happen when there is no better solution then a
00274     // point on the border of the surface, so for the time beeing i am
00275     // simply ignoring the 'check' flag (i am not sure, if this is allright
00276     // in all cases)
00277 
00278     if( found ) { return true; }
00279 
00280     test = 0.0;
00281     for( i = 0; i < n; i++ )
00282     {
00283       temp = (rtr<T>::fabs(x[i]-xold[i])) / Max(rtr<T>::fabs(x[i]),(T)1);
00284       if( temp > test ) test = temp;
00285     }  
00286     if( test < I.tolx ) return true;
00287   }
00288 
00289   /* maximum iterations exceeded */
00290   return false;
00291 }    

GULAPI void guma::PseudoDes gul::uint32   lword,
gul::uint32   irword
 

Definition at line 119 of file guma_random.cpp.

Referenced by guma::random_des::des_random().

00120 {
00121   static uint32 c1[4] = {
00122     0xbaa96887L, 0x1e17d32cL, 0x03bcdc3cL, 0x0f33d1b2L };
00123   static uint32 c2[4] = {
00124     0x4b0f3b58L, 0xe874f0c3L, 0x6955c5a6L, 0x55a7ca46L };
00125     
00126   uint32 i,ia,ib,iswap,itmph=0,itmpl=0;
00127 
00128   for( i = 0; i < 4; i++ )
00129   {
00130     ia = (iswap=(*irword)) ^ c1[i];
00131     itmpl = ia & 0xffff;
00132     itmph = ia >> 16;
00133     ib = itmpl*itmpl + ~(itmph*itmph);
00134     ia = (ib>>16) | ((ib&0xffff)<<16);
00135     *irword = (*lword) ^ ((ia ^ c2[i]) + itmpl*itmph);
00136     *lword = iswap;
00137   }
00138 }

GULAPI void guma::PtrHeapSort size_t    nelem,
void **    elptr,
int(*    usrfunc)(void *, void *, void *),
void *    usrdata
 

Definition at line 93 of file guma_sorting.cpp.

00095 {
00096   void **ra, *rra;
00097   size_t n = nelem, l, ir, i, j;
00098 
00099   ra = elptr;
00100 
00101   if( n < 2 ) return;
00102   l = (n >> 1) + 1;
00103   ir = n;
00104   
00105   for(;;)
00106   {
00107     if( l > 1 )
00108     {
00109       rra = ra[l-2];
00110       l--;    
00111     }
00112     else
00113     {
00114       rra = ra[ir-1];
00115       ra[ir-1] = ra[0];
00116       
00117       if( --ir == 1 )
00118       {
00119         ra[0] = rra;
00120         break;
00121       }
00122     }
00123     i = l;
00124     j = l+l;
00125 
00126     while( j <= ir )
00127     {
00128       if( (j < ir) &&
00129           (usrfunc( ra[j-1], ra[j], usrdata ) < 0) )
00130         j++;
00131   
00132       if( usrfunc( rra, ra[j-1], usrdata) < 0 )
00133       {
00134         ra[i-1] = ra[j-1];
00135         i = j;
00136         j <<= 1;
00137       }
00138       else
00139         j = ir + 1;
00140     }
00141 
00142     ra[i-1] = rra;
00143   }
00144 }

template<class T>
T Pythagoras const T &    a,
const T &    b
[inline]
 

Calculate (a^2 + b^2)^{1/2}, with precautions to avoid destructive over- or underflow.

Definition at line 99 of file guma_lineq.h.

00100 {
00101   T absa,absb;
00102   
00103   absa = rtr<T>::fabs(a);
00104   absb = rtr<T>::fabs(b);
00105   if( absa > absb ) 
00106     return absa * rtr<T>::sqrt((T)1+Square(absb/absa));
00107   
00108   return absb == (T)0 ? (T)0 : absb * rtr<T>::sqrt((T)1+Square(absa/absb));
00109 }

GULAPI int guma::SearchElementInBBT BBTNode   head,
void *    key,
int compare(void *, void *)   ,
BBTNode **    element
 

Definition at line 183 of file guma_sorting.cpp.

Referenced by gul::RefMap::SearchNode(), gul::Map< kdnnrec< U, V > >::SearchNode(), and gugr::edge_interval_tree::SearchNode().

00186 {
00187   int result;
00188   BBTNode *P,*el;
00189   
00190   el = head;
00191   result = 1;
00192   P = head->right;
00193 
00194   while( P != NULL )      /* Knoten suchen */
00195   {               
00196     el = P;
00197     result = compare( key, P->key );
00198 
00199     if( result < 0 )
00200     {     
00201       P = P->left;
00202     }
00203     else if( result > 0 )
00204     {
00205       P = P->right;      
00206     }
00207     else
00208       break;
00209   }
00210 
00211   *element = el;
00212   return(result);
00213 }  

GULAPI BBTNode * guma::SearchPredecessorInBBT BBTNode   element,
BBTNode   head
 

Definition at line 249 of file guma_sorting.cpp.

Referenced by gul::RefMap::Predecessor(), and gul::Map< kdnnrec< U, V > >::Predecessor().

00250 {
00251   BBTNode *N = element, *R, *P;
00252   
00253   if( N->left )
00254   {
00255     N = N->left;
00256     for(;;)
00257     {
00258       R = N->right;
00259       if( R == NULL ) return N;
00260       N = R;
00261     } 
00262   }
00263   else
00264   {
00265     for(;;)
00266     {
00267       P = N->parent;
00268       if( P == head ) return NULL;
00269       if( N->F.l == +1 ) return P;
00270       N = P;
00271     }
00272   }
00273 }

GULAPI BBTNode * guma::SearchSuccessorInBBT BBTNode   element,
BBTNode   head
 

Definition at line 219 of file guma_sorting.cpp.

Referenced by gul::RefMap::Successor(), and gul::Map< kdnnrec< U, V > >::Successor().

00220 {
00221   BBTNode *N = element, *L, *P;
00222   
00223   if( N->right )
00224   {
00225     N = N->right;
00226     for(;;)
00227     {
00228       L = N->left;
00229       if( L == NULL ) return N;
00230       N = L;
00231     } 
00232   }
00233   else
00234   {
00235     for(;;)
00236     {
00237       if( N == head ) return NULL;
00238       P = N->parent;
00239       if( N->F.l == -1 ) return P;
00240       N = P;
00241     }
00242   }
00243 }

template GULAPI void SVBackSubstitution int    m,
int    n,
Ptr< Ptr< double > > &    u,
Ptr< double > &    w,
Ptr< Ptr< double > > &    v,
Ptr< double > &    b
 

template GULAPI void SVBackSubstitution int    m,
int    n,
Ptr< Ptr< float > > &    u,
Ptr< float > &    w,
Ptr< Ptr< float > > &    v,
Ptr< float > &    b
 

template<class T>
GULAPI void guma::SVBackSubstitution int    m,
int    n,
Ptr< Ptr< T > > &    u,
Ptr< T > &    w,
Ptr< Ptr< T > > &    v,
Ptr< T > &    b
 

Solve system of linear equations, when a Singular Value Decomposition is given.

Definition at line 764 of file guma_lineq.cpp.

00767 {
00768   int jj,j,i;
00769   T s;
00770   Ptr<T> tmp;
00771   
00772   tmp.reserve_pool(n);
00773   
00774   for( j = 1; j <= n; j++ )
00775   {
00776     s = 0.0;
00777     if( w[j-1] != 0.0 )
00778     {
00779       for( i = 1; i <= m; i++ )
00780         s += u[i-1][j-1] * b[i-1];
00781        s /= w[j-1];
00782     }
00783     tmp[j-1] = s;
00784   }  
00785   for( j = 1; j <= n; j++ )
00786   {
00787     s = 0.0;
00788     for ( jj = 1; jj <= n; jj++ )
00789       s += v[j-1][jj-1] * tmp[jj-1];
00790     b[j-1] = s;
00791   }      
00792   return;
00793 }          

template GULAPI void SVBackSubstitution int    m,
int    n,
Ptr< Ptr< double > > &    u,
Ptr< double > &    w,
Ptr< Ptr< double > > &    v,
Ptr< double > &    b,
Ptr< double > &    x
 

template GULAPI void SVBackSubstitution int    m,
int    n,
Ptr< Ptr< float > > &    u,
Ptr< float > &    w,
Ptr< Ptr< float > > &    v,
Ptr< float > &    b,
Ptr< float > &    x
 

template<class T>
GULAPI void guma::SVBackSubstitution int    m,
int    n,
Ptr< Ptr< T > > &    u,
Ptr< T > &    w,
Ptr< Ptr< T > > &    v,
Ptr< T > &    b,
Ptr< T > &    x
 

Solve system of linear equations, when a Singular Value Decomposition is given.

Definition at line 718 of file guma_lineq.cpp.

00722 {
00723   int jj,j,i;
00724   T s;
00725   Ptr<T> tmp;
00726   
00727   tmp.reserve_pool(n);
00728   
00729   for( j = 1; j <= n; j++ )
00730   {
00731     s = 0.0;
00732     if( w[j-1] != 0.0 )
00733     {
00734       for( i = 1; i <= m; i++ )
00735         s += u[i-1][j-1] * b[i-1];
00736        s /= w[j-1];
00737     }
00738     tmp[j-1] = s;
00739   }  
00740   for( j = 1; j <= n; j++ )
00741   {
00742     s = 0.0;
00743     for ( jj = 1; jj <= n; jj++ )
00744       s += v[j-1][jj-1] * tmp[jj-1];
00745     x[j-1] = s;
00746   }      
00747   return;
00748 }          

template GULAPI void SVDecomposition int    m,
int    n,
Ptr< Ptr< double > > &    a,
Ptr< double > &    w,
Ptr< Ptr< double > > &    v
 

template GULAPI void SVDecomposition int    m,
int    n,
Ptr< Ptr< float > > &    a,
Ptr< float > &    w,
Ptr< Ptr< float > > &    v
 

template<class T>
GULAPI void guma::SVDecomposition int    m,
int    n,
Ptr< Ptr< T > > &    a,
Ptr< T > &    w,
Ptr< Ptr< T > > &    v
 

Singular Value Decomposition.

=============================

A = U * W * V^{T} with

A = m x n Matrix (m >= n) U = m x n Matrix W = n x n Matrix V = n x n Matrix

U,V orthogonal ( i.e. U^{T} * U = (1), V^{T} * V = (1) ) W diagonal matrix, containing the singular values.

Definition at line 445 of file guma_lineq.cpp.

00447 {
00448   int flag,i,its,j,jj,k,l,nm;
00449   T anorm,c,f,g,h,s,scale,x,y,z;
00450   Ptr<T> rv1;
00451 
00452   rv1.reserve_pool(n+1);
00453 
00454 /* ----- Householder reduction to bidiagonal form ------------------- */
00455 
00456   g = scale = anorm = 0.0;
00457   
00458   for( i = 1; i <= n; i++ )
00459   {
00460     l = i+1;
00461     rv1[i-1] = scale * g;
00462     g = s = scale = 0.0;
00463     
00464     if( i <= m )
00465     {
00466       for( k = i; k <=m; k++ )
00467         scale += rtr<T>::fabs( a[k-1][i-1] );
00468       if( scale != 0.0 )
00469       {
00470         for( k = i; k <= m; k++ )
00471         {
00472           a[k-1][i-1] /= scale;
00473           s += a[k-1][i-1] * a[k-1][i-1];
00474         }
00475         f = a[i-1][i-1];
00476         g = -Sign( rtr<T>::sqrt(s), f );
00477         h = f*g - s;
00478         a[i-1][i-1] = f-g;
00479         
00480         for( j=l; j<=n; j++ )
00481         {
00482           for( s=0.0,k=i; k<=m; k++ )
00483             s += a[k-1][i-1] * a[k-1][j-1];
00484           f = s / h;
00485           for( k = i; k <= m; k++ )
00486             a[k-1][j-1] += f * a[k-1][i-1];  
00487         }    
00488         for( k = i; k <=m; k++ )
00489           a[k-1][i-1] *= scale;
00490       }
00491     }
00492     w[i-1] = scale * g;
00493     g = s = scale = 0.0;
00494     
00495     if( (i <= m) && (i != n) )
00496     {
00497       for( k = l; k <= n; k++ )
00498         scale += rtr<T>::fabs( a[i-1][k-1] );
00499         
00500       if( scale != 0.0 )
00501       {  
00502         for( k = l; k <= n; k++ )
00503         {
00504           a[i-1][k-1] /= scale;
00505           s += a[i-1][k-1] * a[i-1][k-1];
00506         }
00507 
00508         f = a[i-1][l-1];
00509         g = -Sign( rtr<T>::sqrt(s), f );
00510         h = f*g - s;
00511         a[i-1][l-1] = f-g;
00512         
00513         for( k = l; k <= n; k++ )
00514           rv1[k-1] = a[i-1][k-1] / h;
00515           
00516         for( j = l; j <= m; j++ )
00517         {
00518           for( s = 0.0,k=l; k <= n; k++ )
00519             s += a[j-1][k-1] * a[i-1][k-1];
00520           for( k = l; k <= n; k++ )
00521             a[j-1][k-1] += s * rv1[k-1];
00522         }      
00523         
00524         for( k = l; k <= n; k++ )
00525           a[i-1][k-1] *= scale;          
00526       }  
00527     }
00528     anorm = Max( anorm, (rtr<T>::fabs(w[i-1]) + rtr<T>::fabs(rv1[i-1])) );
00529   }  
00530  /* ------- akkumulation of right side transformations ------------- */
00531 
00532   for( i = n; i >= 1; i-- ) 
00533   {
00534     if( i < n )
00535     {
00536       if( g != 0.0 )
00537       {
00538         for( j = l; j <= n; j++ )
00539           v[j-1][i-1] = (a[i-1][j-1] / a[i-1][l-1]) / g;
00540         for( j = l; j <= n; j++ )
00541         {
00542           for( s=0.0,k=l; k<=n; k++ )
00543             s += a[i-1][k-1] * v[k-1][j-1];
00544           for( k = l; k <= n; k++ )
00545             v[k-1][j-1] += s * v[k-1][i-1];
00546         }          
00547       }
00548       for( j = l; j <= n; j++ )
00549         v[i-1][j-1] = v[j-1][i-1] = 0.0;
00550     }
00551     v[i-1][i-1] = 1.0;
00552     g = rv1[i-1];
00553     l = i;
00554   }    
00555 /* -------- accumulation of left side transformations --------------- */
00556 
00557   for( i = Min(m,n); i >=1; i-- ) 
00558   {
00559     l = i+1;
00560     g = w[i-1];
00561     
00562     for( j = l; j <= n; j++ )
00563       a[i-1][j-1] = 0.0;
00564       
00565     if( g != 0.0 )
00566     {
00567       g = (T)1 / g;
00568       
00569       for( j = l; j <= n; j++ )
00570       {
00571         for( s=0.0,k=l; k <= m; k++ )
00572           s += a[k-1][i-1] * a[k-1][j-1];
00573         
00574         f = (s/a[i-1][i-1]) * g;
00575 
00576         for( k = i; k <= m; k++ )
00577           a[k-1][j-1] += f * a[k-1][i-1];
00578       }
00579 
00580       for( j = i; j <= m; j++ )
00581         a[j-1][i-1] *= g;      
00582     }  
00583     else
00584       for( j = i; j <= m; j++ )
00585         a[j-1][i-1] = 0.0;
00586         
00587     a[i-1][i-1] += 1.0;    
00588   }        
00589 /* -------- Diagonalize the bidiagonal form --------------------- */
00590     
00591   for( k = n; k >= 1; k-- )      
00592   {
00593     for( its = 1; its <= 30; its++ )
00594     {
00595       flag = 1;
00596       
00597       for( l = k; l >= 1; l-- )
00598       {
00599         nm = l-1;
00600         if( rtr<T>::fabs(rv1[l-1]) + anorm == anorm )
00601         {
00602           flag = 0;
00603           break;
00604         }  
00605         if( rtr<T>::fabs(w[nm-1]) + anorm == anorm )
00606           break;
00607       } 
00608       if( flag != 0 )
00609       {
00610         c = 0.0;
00611         s = 1.0;
00612         for( i = l; i <= k; i++ )
00613         {
00614           f = s * rv1[i-1];
00615           rv1[i-1] = c * rv1[i-1];
00616           
00617           if( rtr<T>::fabs(f) + anorm == anorm )
00618             break;
00619             
00620           g = w[i-1];
00621           h = Pythagoras( f, g );
00622           w[i-1] = h;
00623           h = (T)1 / h;
00624           c = g * h;
00625           s = -f * h;
00626           
00627           for( j = 1; j <= m; j++ )
00628           {
00629             y = a[j-1][nm-1];
00630             z = a[j-1][i-1];
00631             a[j-1][nm-1] = y * c + z * s;
00632             a[j-1][i-1] = z * c - y * s;
00633           }
00634         }
00635       }
00636       z = w[k-1];
00637       if( l == k )
00638       {
00639         if( z < 0.0 )
00640         {
00641           w[k-1] = -z;
00642           for( j = 1; j <= n; j++ )
00643             v[j-1][k-1] = -v[j-1][k-1];
00644         }
00645         break;
00646       }              
00647       if( its == 30 )
00648         throw InternalError();
00649       
00650       x = w[l-1];
00651       nm = k-1;
00652       y = w[nm-1];
00653       g = rv1[nm-1];
00654       h = rv1[k-1];
00655       f = ((y-z)*(y+z)+(g-h)*(g+h))/((T)2*h*y);
00656       g = Pythagoras( f, (T)1 );
00657       f = ((x-z)*(x+z) + h*((y/(f+Sign(g,f)))-h)) / x;
00658       c = s = 1.0;
00659       
00660       for( j = l; j <= nm; j++ )
00661       {
00662         i = j+1;
00663         g = rv1[i-1];
00664         y = w[i-1];
00665         h = s * g;
00666         g = c * g;
00667         z = Pythagoras( f, h );
00668         rv1[j-1] = z;
00669         c = f/z;
00670         s = h/z;
00671         f = x*c + g*s;
00672         g = g*c - x*s;
00673         h = y*s;
00674         y *= c;
00675         
00676         for( jj = 1; jj <= n; jj++ )
00677         {
00678           x = v[jj-1][j-1];
00679           z = v[jj-1][i-1];
00680           v[jj-1][j-1] = x*c + z*s;
00681           v[jj-1][i-1] = z*c - x*s;
00682         }
00683         z = Pythagoras( f, h );
00684         w[j-1] = z;
00685         if( z != 0.0 )
00686         {
00687           z = (T)1 / z;
00688           c = f*z;
00689           s = h*z;
00690         }
00691         f = c*g + s*y;
00692         x = c*y - s*g;
00693         
00694         for( jj = 1; jj <= m; jj++ )
00695         {
00696           y = a[jj-1][j-1];
00697           z = a[jj-1][i-1];
00698           a[jj-1][j-1] = y*c + z*s;
00699           a[jj-1][i-1] = z*c - y*s;
00700         }
00701       }
00702       rv1[l-1] = 0.0;
00703       rv1[k-1] = f;
00704       w[k-1] = x;
00705     }
00706   }
00707 }    

template int SVDIntersectLines point< double >    P1,
point< double >    T1,
point< double >    P2,
point< double >    T2,
double *    alpha1,
double *    alpha2,
point< double > *    P
 

template int SVDIntersectLines point< float >    P1,
point< float >    T1,
point< float >    P2,
point< float >    T2,
float *    alpha1,
float *    alpha2,
point< float > *    P
 

template<class T>
int guma::SVDIntersectLines point< T >    P1,
point< T >    T1,
point< T >    P2,
point< T >    T2,
T *    alpha1,
T *    alpha2,
point< T > *    P
 

Intersect two lines in 3-dimensions, using singular decomposition.

(remark: this is a overkill, if you alredy know that the two lines intersect (but on the other hand this is the first oppurtinity to do something senseful with the above SVD algorithm:)))))

retcode = 0 => intersection point found retcode = 1 => lines are parallel retcode = 2 => lines are not parallel, but don't intersect either (what's the english word for "windschief" ?) In the last two cases the solution minimizes |x|^2 or |Ax + b|, and the midst of the two points on the two lines is returned.

Definition at line 858 of file guma_lineq.cpp.

00861 {
00862   Ptr< Ptr<T> > u,v; 
00863   Ptr<T> w, x, b;
00864   point<T> L1,L2;
00865   int code,i;
00866 
00867   u.reserve_pool(3);
00868   for( i = 0; i < 3; i++ )
00869     u[i].reserve_pool(2);
00870   v.reserve_pool(2);
00871   for( i = 0; i < 2; i++ )
00872     v[i].reserve_pool(2);
00873   w.reserve_pool(2);
00874   x.reserve_pool(2);
00875   b.reserve_pool(3);
00876 
00877   code = 0;
00878 
00879   u[0][0] = T1.x;  u[0][1] = -T2.x;
00880   u[1][0] = T1.y;  u[1][1] = -T2.y;
00881   u[2][0] = T1.z;  u[2][1] = -T2.z;
00882 
00883   SVDecomposition( 3, 2, u, w, v );
00884   
00885   if( SVZero( 2, w ) ) // are the lines parallel ?
00886     code = 1;  
00887     
00888   b[0] = P2.x - P1.x;
00889   b[1] = P2.y - P1.y;
00890   b[2] = P2.z - P1.z;
00891 
00892   SVBackSubstitution( 3, 2, u, w, v, b, x );
00893 
00894   L1.x = P1.x + x[0] * T1.x; 
00895   L1.y = P1.y + x[0] * T1.y; 
00896   L1.z = P1.z + x[0] * T1.z; 
00897 
00898   L2.x = P2.x + x[1] * T2.x; 
00899   L2.y = P2.y + x[1] * T2.y; 
00900   L2.z = P2.z + x[1] * T2.z; 
00901 
00902   // not parallel, but points too far away from each other ?
00903   if( !code && !rel_equal(L1, L2, rtr<T>::zero_tol() ) )
00904     code = 2;
00905 
00906   P->x = (L1.x + L2.x) / (T)2; 
00907   P->y = (L1.y + L2.y) / (T)2; 
00908   P->z = (L1.z + L2.z) / (T)2; 
00909 
00910   *alpha1 = x[0];
00911   *alpha2 = x[1];
00912 
00913   return code;
00914 }

template GULAPI bool SVZero int    n,
Ptr< double > &    w
 

template GULAPI bool SVZero int    n,
Ptr< float > &    w
 

template<class T>
GULAPI bool guma::SVZero int    n,
Ptr< T > &    w
 

Sets very small singular values to zero.

This avoids disastrous rounding errors, when the coefficient matrix of a system of linear equations is ill-conditioned. If some singular values were zero, or had to be set to zero, the function returns false, else it returns true

Definition at line 809 of file guma_lineq.cpp.

00810 {
00811   T wmax,wmin;
00812   int j;
00813   bool well_conditioned;
00814   T limit = (T)n * rtr<T>::epsilon();
00815 
00816   wmax = wmin = rtr<T>::fabs(w[0]);
00817   for( j = 2; j <= n; j++ )
00818   {
00819     if( rtr<T>::fabs(w[j-1]) > wmax ) wmax = rtr<T>::fabs(w[j-1]);
00820     else if( rtr<T>::fabs(w[j-1]) < wmin ) wmin = rtr<T>::fabs(w[j-1]);
00821   }
00822   // ill conditioned ?
00823   if( (wmax == 0.0) ||
00824       (wmin / wmax < limit) )
00825     well_conditioned = false;   
00826   else
00827     well_conditioned = true;
00828 
00829   /*
00830   cout << "wmin/wmax = " << wmin / wmax << "\n";
00831   */
00832                                     
00833   wmin = wmax * limit;
00834   
00835   for( j = 1; j <= n; j++ )
00836     if( wmin > rtr<T>::fabs(w[j-1]) ) w[j-1] = 0.0;
00837 
00838   return well_conditioned;
00839 }    


Generated on Mon Jan 21 04:18:02 2002 for GUL 0.6 - Geometry Utility Library by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001