73inline T ABS(
const T x )
75 return( x >= T( 0 ) ? x : -x );
81inline T sgn(
const T x )
83 return( x ? ( x > T( 0 ) ? T( 1 ) : T( -1 ) ) : T( 0 ) );
92inline T min(
const T x ,
const T y )
94 return( x <= y ? x : y );
98inline T max(
const T x ,
const T y )
100 return( x >= y ? x : y );
107inline T min(
const T x ,
const T y )
109 return( x <= y ? x : y );
113inline T max(
const T x ,
const T y )
115 return( x >= y ? x : y );
124inline void Swap( T &v1 , T &v2 )
134template<
class T1,
class T2 >
135inline T1 CeilDiv(
const T1 x ,
const T2 y )
176inline T Norm(
const T *g ,
Index n )
182 const T tmp = *(g++);
198 const T tmp = g[ h ];
208inline T OneNorm(
const T *g ,
Index n )
236inline T INFNorm(
const T *g ,
Index n )
242 const T tmp = *(g++);
259 const T tmp = g[ h ];
271inline T SumV(
const T *g ,
Index n )
299inline T MaxVecV(
const T *g ,
Index n )
314inline T MinVecV(
const T *g ,
Index n )
335 for(
Index i = maxi ; ++i < n ; )
354 for(
Index i = mini ; ++i < n ; )
367template<
class T1,
class T2 >
368inline T1 ScalarProduct(
const T1 *g1 ,
const T2 *g2 ,
Index n )
374 t += (*(g1++)) * (*(g2++));
381template<
class T1,
class T2 >
382inline T1 ScalarProduct(
const T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
388 t += (*(g1++)) * g2[ h ];
395template<
class T1,
class T2 >
396inline T1 ScalarProduct(
const T1 *g1 ,
cIndex_Set B1 ,
421 t += (*(g1++)) * (*(g2++));
436template<
class T1,
class T2 >
437inline T1 ScalarProductB(
const T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
443 t += g1[ h ] * (*(g2++));
451template<
class T1,
class T2 >
452inline T1 ScalarProductBB(
const T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
458 t += g1[ h ] * g2[ h ];
471inline void VectAssign( T *
const g ,
const T x ,
cIndex n )
475 for( T *tg = g + n ; tg > g ; )
482inline void VectAssign( T *
const g ,
const T x ,
cIndex_Set B )
492template<
class T1,
class T2 >
493inline void VectAssign( T1 *g1 ,
const T2 *g2 ,
Index n )
517template<
class T1,
class T2 >
518inline void VectAssign( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
528template<
class T1,
class T2 >
552 (*(g1++)) = (*(g2++));
563template<
class T1,
class T2 >
564inline void VectAssign( T1 *g1 ,
cIndex_Set B1 ,
const T2 *g2 ,
588template<
class T1 ,
class T2 ,
class T3 >
589inline void VectAssign( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
Index n )
594 *(g1++) = x * (*(g2++));
599template<
class T1 ,
class T2 ,
class T3 >
600inline void VectAssign( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
605 *(g1++) = x * g2[ h ];
610template<
class T1 ,
class T2 ,
class T3 >
611inline void VectAssign( T1 *g1 ,
cIndex_Set B1 ,
const T3 x ,
const T2 *g2 ,
632 (*(g1++)) = x * (*(g2++));
643template<
class T1 ,
class T2 ,
class T3 >
644inline void VectAssign( T1 *g1 ,
cIndex_Set B1 ,
const T3 x ,
const T2 *g2 ,
660 *(g1++) = x * (*(g2++));
669inline void VectAssignB( T *
const g ,
const T x ,
cIndex_Set B )
686 for(
Index i = 0 ; i < n ; )
698template<
class T1,
class T2 >
699inline void VectAssignB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
709template<
class T1,
class T2 >
716 for(
Index i = 0 ; i < n ; )
727template<
class T1,
class T2 >
728inline void VectAssignB( T1 *g1 ,
const T2 *g2 ,
734 g1[ h ] = x * (*(g2++));
739template<
class T1,
class T2 >
740inline void VectAssignB( T1 *g1 ,
const T2 *g2 ,
const T1 x ,
cIndex_Set B ,
741 cIndex n ,
const T1 gg = 0 )
746 for(
Index i = 0 ; i < n ; )
749 *(g1++) = x * (*(g2++));
758template<
class T1,
class T2 >
759inline void VectAssignBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
769template<
class T1,
class T2 >
770inline void VectAssignBB( T1 *g1 ,
const T2 *g2 ,
const T1 x ,
cIndex_Set B )
775 g1[ h ] = x * g2[ h ];
781template<
class T1,
class T2 >
782inline void VectMAssign( T1 *g1 ,
const T2 *g2 ,
Index n )
792template<
class T1,
class T2 >
793inline void VectMAssign( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
803template<
class T1,
class T2 >
824 (*(g1++)) = - (*(g2++));
835template<
class T1,
class T2 >
836inline void VectMAssign( T1 *g1 ,
cIndex_Set B1 ,
const T2 *g2 ,
860template<
class T1,
class T2 >
861inline void VectMAssignB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
871template<
class T1,
class T2 >
878 for(
Index i = 0 ; i < n ; )
889template<
class T1,
class T2 >
890inline void VectMAssignBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
902inline void VectSum( T *
const g ,
const T x ,
cIndex n )
906 for( T *tg = g + n ; tg > g ; )
924inline void VectSum( T *
const g ,
const T x ,
cIndex_Set B )
934template<
class T1,
class T2 >
935inline void VectSum( T1 *g1 ,
const T2 *g2 ,
Index n )
945template<
class T1,
class T2 >
946inline void VectSum( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
956template<
class T1,
class T2 >
977 (*(g1++)) += (*(g2++));
988template<
class T1 ,
class T2 ,
class T3 >
989inline void VectSum( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
Index n )
994 *(g1++) += x * (*(g2++));
999template<
class T1 ,
class T2 ,
class T3 >
1000inline void VectSum( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1010template<
class T1 ,
class T2 ,
class T3 >
1011inline void VectSum( T1 *g1 ,
cIndex_Set B1 ,
const T3 x ,
const T2 *g2 ,
1032 (*(g1++)) += x * (*(g2++));
1044inline void VectSumB( T *g ,
const T x ,
cIndex_Set B ,
cIndex n ,
const T gg )
1049 for(
Index i = 0 ; i < n ; )
1060template<
class T1,
class T2 >
1061inline void VectSumB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1071template<
class T1,
class T2 >
1078 for(
Index i = 0 ; i < n ; )
1089template<
class T1 ,
class T2 ,
class T3 >
1090inline void VectSumB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1095 g1[ h ] += x * (*(g2++));
1100template<
class T1 ,
class T2 ,
class T3 >
1101inline void VectSumB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B ,
1107 for(
Index i = 0 ; i < n ; )
1109 *(g1++) += x * (*(g2++));
1118template<
class T1,
class T2 >
1119inline void VectSumBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1129template<
class T1 ,
class T2 ,
class T3 >
1130inline void VectSumBB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1135 g1[ h ] += x * g2[ h ];
1142inline void VectSubtract( T *
const g ,
const T x ,
cIndex n )
1147 for( T *tg = g + n ; tg > g ; )
1165inline void VectSubtract( T *
const g ,
const T x ,
cIndex_Set B )
1175template<
class T1,
class T2 >
1176inline void VectSubtract( T1 *g1 ,
const T2 *g2 ,
Index n )
1186template<
class T1,
class T2 >
1187inline void VectSubtract( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1197template<
class T1,
class T2 >
1198inline void VectSubtract( T1 *g1 ,
cIndex_Set B1 ,
const T2 *g2 ,
1219 (*(g1++)) -= (*(g2++));
1237 for(
Index i = 0 ; i < n ; )
1248template<
class T1,
class T2 >
1249inline void VectSubtractB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1259template<
class T1,
class T2 >
1260inline void VectSubtractB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B ,
cIndex n ,
1266 for(
Index i = 0 ; i < n ; )
1277template<
class T1,
class T2 >
1278inline void VectSubtractBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1290inline void VectScale( T *g ,
const T x ,
Index n )
1301inline void VectScale( T *g ,
const T x ,
cIndex_Set B )
1311template<
class T1,
class T2 >
1312inline void VectScale( T1 *g1 ,
const T2 *g2 ,
Index n )
1322template<
class T1,
class T2 >
1323inline void VectScale( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1333template<
class T1,
class T2 >
1354 (*(g1++)) *= (*(g2++));
1365template<
class T1 ,
class T2 ,
class T3 >
1366inline void VectScale( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
Index n )
1371 *(g1++) *= x * (*(g2++));
1376template<
class T1 ,
class T2 ,
class T3 >
1377inline void VectScale( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1387template<
class T1 ,
class T2 ,
class T3 >
1388inline void VectScale( T1 *g1 ,
cIndex_Set B1 ,
const T3 x ,
const T2 *g2 ,
1409 (*(g1++)) *= x * (*(g2++));
1420template<
class T1,
class T2 >
1421inline void VectScaleB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1431template<
class T1 ,
class T2 ,
class T3 >
1432inline void VectScaleB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1437 g1[ h ] *= x * (*(g2++));
1442template<
class T1,
class T2 >
1443inline void VectScaleBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1453template<
class T1 ,
class T2 ,
class T3 >
1454inline void VectScaleBB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1459 g1[ h ] *= x * g2[ h ];
1466inline void VectIScale( T *g ,
const T x ,
Index n )
1478inline void VectIScale( T *g ,
const T x ,
cIndex_Set B )
1488template<
class T1,
class T2 >
1489inline void VectIScale( T1 *g1 ,
const T2 *g2 ,
Index n )
1499template<
class T1,
class T2 >
1500inline void VectIScale( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1510template<
class T1,
class T2 >
1531 (*(g1++)) /= (*(g2++));
1542template<
class T1 ,
class T2 ,
class T3 >
1543inline void VectIScale( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
Index n )
1548 *(g1++) /= ( x * (*(g2++)) );
1553template<
class T1 ,
class T2 ,
class T3 >
1554inline void VectIScale( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1559 *(g1++) /= ( x * g2[ h ] );
1564template<
class T1 ,
class T2 ,
class T3 >
1565inline void VectIScale( T1 *g1 ,
cIndex_Set B1 ,
const T3 x ,
const T2 *g2 ,
1586 (*(g1++)) /= ( x * (*(g2++)) );
1597template<
class T1,
class T2 >
1598inline void VectIScaleB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1608template<
class T1 ,
class T2 ,
class T3 >
1609inline void VectIScaleB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1614 g1[ h ] /= x * (*(g2++));
1619template<
class T1,
class T2 >
1620inline void VectIScaleBB( T1 *g1 ,
const T2 *g2 ,
cIndex_Set B )
1630template<
class T1 ,
class T2 ,
class T3 >
1631inline void VectIScaleBB( T1 *g1 ,
const T2 *g2 ,
const T3 x ,
cIndex_Set B )
1636 g1[ h ] *= x * g2[ h ];
1642template<
class T1,
class T2 >
1643inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T1 x ,
Index n )
1648 *(g++) = *(g1++) + x;
1653template<
class T1 ,
class T2 ,
class T3 >
1654inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
Index n )
1659 *(g++) = *(g1++) + *(g2++);
1664template<
class T1 ,
class T2 ,
class T3 >
1665inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
cIndex_Set B )
1670 *(g++) = *(g1++) + g2[ h ];
1675template<
class T1 ,
class T2 ,
class T3 >
1676inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
const T3 x ,
1682 *(g++) = *(g1++) + x * (*(g2++));
1687template<
class T1,
class T2 >
1688inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T2 x1 ,
const T1 x ,
Index n )
1693 *(g++) = x1 * (*(g1++)) + x;
1698template<
class T1 ,
class T2 ,
class T3 >
1699inline void VectAdd( T1 *g ,
const T2 *g1 ,
const T2 x1 ,
const T3 *g2 ,
1700 const T3 x2 ,
Index n )
1705 *(g++) = x1 * (*(g1++)) + x2 * (*(g2++));
1711template<
class T1 ,
class T2 ,
class T3 >
1712inline void VectDiff( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
Index n )
1717 *(g++) = *(g1++) - *(g2++);
1722template<
class T1 ,
class T2 ,
class T3 >
1723inline void VectDiff( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
cIndex_Set B )
1728 *(g++) = *(g1++) - g2[ h ];
1734template<
class T1,
class T2 >
1735inline void VectMult( T1 *g ,
const T2 *g1 ,
const T1 x ,
Index n )
1740 *(g++) = *(g1++) * x;
1745template<
class T1 ,
class T2 ,
class T3 >
1746inline void VectMult( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
Index n )
1751 *(g++) = *(g1++) * (*(g2++));
1756template<
class T1 ,
class T2 ,
class T3 >
1757inline void VectMult( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
cIndex_Set B )
1762 *(g++) = *(g1++) * g2[ h ];
1767template<
class T1 ,
class T2 ,
class T3 ,
class T4 >
1768inline void VectMult( T1 *g ,
const T2 x ,
const T3 *g1 ,
const T4 *g2 ,
1774 *(g++) = x * (*(g1++)) * (*(g2++));
1779template<
class T1 ,
class T2 ,
class T3 ,
class T4 >
1780inline void VectMult( T1 *g ,
const T2 x ,
const T3 *g1 ,
const T4 *g2 ,
1786 *(g++) = x * (*(g1++)) * g2[ h ];
1792template<
class T1 ,
class T2 ,
class T3 >
1793inline void VectDivide( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
Index n )
1798 *(g++) = *(g1++) / (*(g2++));
1803template<
class T1 ,
class T2 ,
class T3 >
1804inline void VectDivide( T1 *g ,
const T2 *g1 ,
const T3 *g2 ,
cIndex_Set B )
1809 *(g++) = *(g1++) / g2[ h ];
1814template<
class T1 ,
class T2 ,
class T3 ,
class T4 >
1815inline void VectDivide( T1 *g ,
const T2 x ,
const T3 *g1 ,
const T4 *g2 ,
1821 *(g++) = x * ( (*(g1++)) / (*(g2++)) );
1826template<
class T1 ,
class T2 ,
class T3 ,
class T4 >
1827inline void VectDivide( T1 *g ,
const T2 x ,
const T3 *g1 ,
const T4 *g2 ,
1833 *(g++) = x * ( (*(g1++)) / g2[ h ] );
1840inline void VectXcg( T *g1 , T *g2 ,
Index n )
1844 for( ; n-- ; g1++ , g2++ )
1851inline void VectXcg( T *g1 , T *g2 ,
cIndex_Set B )
1856 Swap( *g1 , g2[ h ] );
1862inline void VectXcgB( T *g1 , T *g2 ,
cIndex_Set B )
1867 Swap( g1[ h ] , *g2 );
1873inline void VectXcgBB( T *g1 , T *g2 ,
cIndex_Set B )
1878 Swap( g1[ h ] , g2[ h ] );
1898 for( ; n ; n-- , g++ )
1906 for( Bs++ ; --n ; g++ , Bs++ )
1926 for( ; n ; n-- , g++ )
1934 for( Bs++ ; --n ; g++ , Bs++ )
1954 for( ; n ; n-- , g++ )
1955 if( ABS( *g ) >= eps )
1962 for( Bs++ ; --n ; g++ , Bs++ )
1963 if( ABS( *g ) >= eps ) {
2001 T *g1 = g + k + m - 1;
2006 for(
Index h = *(--B1) ;; )
2007 if( h == --g2 - g ) {
2017 for( ; --g2 > g1 ; )
2023 for(
Index h = *(--B) ; --g2 > g1 ; )
2034 VectAssign( g + k , T( 0 ) , n - k );
2052 for(
Index h = *(B++) ; h < Inf< Index >() ; j++ ) {
2054 g[ i++ ] = g[ j++ ];
2059 VectAssign( g + i , g + j , n - j );
2074inline void Merge( T *g ,
const T *g2 ,
const T *g3 ,
const T Stp )
2086 if( ( *(g++) = i ) >= Stp )
2092 if( ( *(g++) = j ) >= Stp )
2106inline void ShiftVect( T *g ,
Index n )
2110 for( T *t = g ; n-- ; t = g )
2121 for( T *t = g + k ; n-- ; )
2128inline void RotateVect( T *g ,
Index n )
2134 for( T *t = g ; n-- ; t = g )
2143inline void ShiftRVect( T *g ,
Index n )
2147 for( T *t = ( g += n ) ; n-- ; t = g )
2154inline void ShiftRVect( T *g ,
Index n ,
cIndex k )
2159 for( T *t = g + k ; n-- ; )
2166inline void RotateRVect( T *g ,
Index n )
2173 for( ; n-- ; t = g )
2190inline Index Match(
const T *g ,
const T x ,
cIndex n )
2196 for( ; ( i < n ) && ( *(g++) != x ) ; )
2205inline bool EqualVect(
const T *g1 ,
const T *g2 ,
Index n )
2210 if( *(g1++) != *(g2++) )
2219inline bool EqualVect(
const T *g1 ,
const T *g2 ,
cIndex n ,
cIndex_Set B )
2226 for( ; i < h ; i++ )
2230 if( *(g1++) != *(g2++) )
2234 for( ; i < n ; i++ )
2245inline Index BinSearch(
const T *Set ,
Index Stop ,
const T What )
2255 for(
Index Strt = 0 ; Strt != Stop ; ) {
2256 if( Set[ i ] == What )
2259 if( Set[ i ] > What )
2264 i = ( Strt + Stop ) / 2;
2274inline Index BinSearch1(
const T *Set ,
Index Stop ,
const T What )
2280 for(
Index h ; ( h = Set[ i ] ) != What ; ) {
2286 i = ( Strt + Stop ) / 2;
2296inline Index BinSearch2(
const T *Set ,
Index Stop ,
const T What )
2302 for(
Index Strt = 0 ; Strt != Stop ; ) {
2303 if( Set[ i ] > What )
2308 i = ( Strt + Stop ) / 2;
2319inline void HeapIns( T *H ,
const T x ,
Index n )
2325 for( H-- , n++ ;;) {
2327 if( ( ! p ) || ( H[ p ] <= x ) )
2351 for(
Index i = 0 ; i < n ; ) {
2360 if( H[ k ] < H[ j ] )
2363 if( H[ i ] <= H[ j ] )
2366 Swap( H[ i ] , H[ j ] );
const Index cIndex
a read-only Index
Definition OPTtypes.h:64
cIndex * cIndex_Set
read-only array
Definition OPTtypes.h:65
Index * Index_Set
set (array) of indices
Definition OPTtypes.h:61
unsigned int Index
Index in a vector ( >= 0 )
Definition OPTtypes.h:60
static constexpr T Inf(void) noexcept
Inf< T >() = infinity value for T.
Definition OPTUtils.h:357