9 #include <sys/resource.h>
10 #include <sys/times.h>
15 enum{ ICUT = 0, ICONV, ICONC };
16 const double PI = 4.0*std::atan(1.0);
22 return( x>=0? 1.: -1. );
39 template <
typename U>
inline U bilin
40 (
const U&x,
const U&y,
const unsigned int N=0 )
47 (
const double x,
const double a )
50 return std::exp( - a / x );
64 return x*std::log( x );
67 inline double monomial
68 (
const unsigned int n,
const double*x,
const int*k)
75 return std::pow( x[0], k[0] );
77 return std::pow( x[0], k[0] ) * monomial( n-1, x+1, k+1 );
84 return ( x>=0? 1: 0. );
91 return ( x>=0? 0: 1. );
95 (
const unsigned int n,
const double*x )
98 if( n == 0 )
return 0.;
99 if( n == 1 )
return x[0];
100 return std::max( x[0], max( n-1, x+1 ));
104 (
const unsigned int n,
const double*x )
107 if( n == 0 )
return 0.;
108 if( n == 1 )
return x[0];
109 return std::min( x[0], min( n-1, x+1 ));
112 inline unsigned int argmin
113 (
const unsigned int n,
const double*x )
116 if( n == 0 || !x )
return 0;
117 unsigned int minndx = 0;
118 double minval = x[0];
119 for(
unsigned int j=1; j<n; j++ )
120 if( minval > x[j] ){ minval = x[j]; minndx = j; }
124 inline unsigned int argmax
125 (
const unsigned int n,
const double*x )
128 if( n == 0 || !x )
return 0;
129 unsigned int maxndx = 0;
130 double maxval = x[0];
131 for(
unsigned int j=1; j<n; j++ )
132 if( maxval < x[j] ){ maxval = x[j]; maxndx = j; }
137 (
const double cond,
const double expr1,
const double expr2 )
140 return ( cond<=0? expr1: expr2 );
144 (
const double cond,
const double expr1,
const double expr2 )
147 return ( cond>=0? expr1: expr2 );
151 (
const double a,
const double b,
const double c )
154 if(( b <= a && a <= c ) || ( c <= a && a <= b ))
return a;
155 if(( a <= b && b <= c ) || ( c <= b && b <= a ))
return b;
160 (
const double CONV,
const double CONC,
const double CUT,
170 if ( CUT < CONV ) {
id = ICONV;
return CONV; }
171 else if ( CUT > CONC ) {
id = ICONC;
return CONC; }
172 else {
id = ICUT;
return CUT; }
178 if (
id == ICONV )
return CONV;
179 else if (
id == ICUT )
return CUT;
184 (
const double *DCONV,
const double *DCONC,
const int k,
const int id )
188 if (
id == ICONV )
return DCONV[k];
189 else if (
id == ICUT )
return 0.;
190 else return DCONC[k];
194 (
const double *DCONV,
const double *DCONC,
const double *DCUT,
195 const int k,
const int id )
198 if (
id == ICONV )
return DCONV[k];
199 else if (
id == ICUT )
return DCUT[k];
200 else return DCONC[k];
226 (
const double real1,
const double real2,
const double atol=machprec(),
227 const double rtol=machprec() )
231 double gap = std::fabs(real1-real2);
232 double ave = 0.5*std::fabs(real1+real2);
233 return( gap<atol+ave*rtol?
true:
false );
241 getrusage (RUSAGE_SELF, &ruse);
242 return ((
double)(ruse.ru_utime.tv_sec + ruse.ru_utime.tv_usec / 1e6));