18 #ifndef __MATHEMATICS_H_
19 #define __MATHEMATICS_H_
31 #include <sys/types.h>
41 #define cygwin_log2 log2
48 #if _GLIBCXX_USE_C99_MATH
49 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
54 using std::fpclassify;
62 using std::isgreaterequal;
64 using std::islessequal;
65 using std::islessgreater;
66 using std::isunordered;
78 #define isfinite _isfinite
84 #define NAN (strtod("NAN",NULL))
88 #define RNG_SEED_SIZE 256
91 #define RADIX_STACK_SIZE 512
94 #define radix_push(a, n, i) sp->sa = a, sp->sn = n, (sp++)->si = i
95 #define radix_pop(a, n, i) a = (--sp)->sa, n = sp->sn, i = sp->si
97 #ifndef DOXYGEN_SHOULD_SKIP_THIS
99 template <
class T>
struct radix_stack_t
112 template <
class T1,
class T2>
struct thread_qsort
122 int32_t* qsort_threads;
128 #endif // DOXYGEN_SHOULD_SKIP_THIS
155 static inline T
min(T a, T b)
157 return (a<=b) ? a : b;
162 static inline T
max(T a, T b)
164 return (a>=b) ? a : b;
169 static inline T
clamp(T value, T lb, T ub)
218 else return (a<0) ? (-1) : (+1);
223 static inline void swap(T &a,T &b)
233 static inline T
sq(T x)
277 tmp.i = 0x5f3759d5 - (tmp.i >> 1);
279 x = x*(1.5f - xhalf*x*x);
295 static inline int32_t
pow(int32_t x, int32_t n)
372 for (
int i=1; i<len; i++)
373 area += 0.5*(xy[2*i]-xy[2*(i-1)])*(xy[2*i+1]+xy[2*(i-1)+1]);
377 for (
int i=1; i<len; i++)
378 area += 0.5*(xy[2*i+1]-xy[2*(i-1)+1])*(xy[2*i]+xy[2*(i-1)]);
387 for (
int i=2; i<=n; i++)
397 gettimeofday(&tv, NULL);
398 seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec);
402 #if !defined(CYGWIN) && !defined(__INTERIX)
411 #if defined(CYGWIN) || defined(__INTERIX)
418 static inline uint64_t
random(uint64_t min_value, uint64_t max_value)
420 uint64_t ret = min_value + (uint64_t) ((max_value-min_value+1) * (
random() / (RAND_MAX+1.0)));
421 ASSERT(ret>=min_value && ret<=max_value);
425 static inline int64_t
random(int64_t min_value, int64_t max_value)
427 int64_t ret = min_value + (int64_t) ((max_value-min_value+1) * (
random() / (RAND_MAX+1.0)));
428 ASSERT(ret>=min_value && ret<=max_value);
432 static inline uint32_t
random(uint32_t min_value, uint32_t max_value)
434 uint32_t ret = min_value + (uint32_t) ((max_value-min_value+1) * (
random() / (RAND_MAX+1.0)));
435 ASSERT(ret>=min_value && ret<=max_value);
439 static inline int32_t
random(int32_t min_value, int32_t max_value)
441 int32_t ret = min_value + (int32_t) ((max_value-min_value+1) * (
random() / (RAND_MAX+1.0)));
442 ASSERT(ret>=min_value && ret<=max_value);
448 float32_t ret = min_value + ((max_value-min_value) * (
random() / (1.0*RAND_MAX)));
450 if (ret<min_value || ret>max_value)
451 SG_SPRINT(
"min_value:%10.10f value: %10.10f max_value:%10.10f", min_value, ret, max_value);
452 ASSERT(ret>=min_value && ret<=max_value);
458 float64_t ret = min_value + ((max_value-min_value) * (
random() / (1.0*RAND_MAX)));
460 if (ret<min_value || ret>max_value)
461 SG_SPRINT(
"min_value:%10.10f value: %10.10f max_value:%10.10f", min_value, ret, max_value);
462 ASSERT(ret>=min_value && ret<=max_value);
468 floatmax_t ret = min_value + ((max_value-min_value) * (
random() / (1.0*RAND_MAX)));
470 if (ret<min_value || ret>max_value)
471 SG_SPRINT(
"min_value:%10.10f value: %10.10f max_value:%10.10f", min_value, ret, max_value);
472 ASSERT(ret>=min_value && ret<=max_value);
488 rand_u =
random(-1.0, 1.0);
489 rand_v =
random(-1.0, 1.0);
490 rand_s = rand_u*rand_u + rand_v*rand_v;
491 }
while ((rand_s == 0) || (rand_s >= 1));
494 ret = rand_u*
sqrt(-2.0*
log(rand_s)/rand_s);
495 ret = std_dev*ret + mean;
510 rand_u =
random(-1.0, 1.0);
511 rand_v =
random(-1.0, 1.0);
512 rand_s = rand_u*rand_u + rand_v*rand_v;
513 }
while ((rand_s == 0) || (rand_s >= 1));
515 ret = rand_u*
sqrt(-2.0*
log(rand_s)/rand_s);
516 ret = std_dev*ret + mean;
566 for (int32_t i = 0; i < n; i++)
568 for (int32_t i = 0; i < n; i++)
573 static inline int64_t
nchoosek(int32_t n, int32_t k)
577 for (int32_t i=n-k+1; i<=n; i++)
586 static void sort(int32_t *a, int32_t cols, int32_t sort_col=0);
603 static inline uint8_t
byte(T word, uint16_t p)
605 return (word >> (
sizeof(T)-p-1) * 8) & 0xff;
611 static size_t count[256], nc, cmin;
615 T *an, *aj, *pile[256];
630 for (ak = array; ak < an; ak++) {
658 for (cp = count + cmin; nc > 0; cp++) {
673 pile[cp - count] = ak += *cp;
697 for (r = *aj; aj < (ak = --pile[c =
byte(r, i)]);)
712 for (int32_t i=0; i<size-1; i++)
716 while (j >= 0 && output[j] > value)
718 output[j+1] = output[j];
736 for (i=0; i<vector.
vlen; ++i)
738 if (vector[i]>element)
758 static void qsort(T* output, int32_t size)
765 if (output[0] > output [1])
766 swap(output[0],output[1]);
770 T
split=output[size/2];
773 int32_t right=size-1;
777 while (output[left] < split)
779 while (output[right] > split)
784 swap(output[left],output[right]);
791 qsort(output,right+1);
794 qsort(&output[left],size-left);
814 if (*vector[0]>*vector[1])
815 swap(vector[0],vector[1]);
818 T*
split=vector[length/2];
821 int32_t right=length-1;
825 while (*vector[left]<*split)
827 while (*vector[right]>*split)
832 swap(vector[left],vector[right]);
839 qsort(vector,right+1);
842 qsort(&vector[left],length-left);
846 template <
class T>
static void display_bits(T word, int32_t width=8*
sizeof(T))
849 for (
int i=0; i<width; i++)
851 T mask = ((T) 1)<<(
sizeof(T)*8-1);
869 template <
class T1,
class T2>
870 static void qsort_index(T1* output, T2* index, uint32_t size);
877 template <
class T1,
class T2>
879 T1* output, T2* index, int32_t size);
888 template <
class T1,
class T2>
889 inline static void parallel_qsort_index(T1* output, T2* index, uint32_t size, int32_t n_threads, int32_t limit=262144)
892 thread_qsort<T1,T2> t;
898 t.num_threads=n_threads;
899 parallel_qsort_index<T1,T2>(&t);
903 template <
class T1,
class T2>
910 static void min(
float64_t* output, T* index, int32_t size);
916 float64_t* output, T* index, int32_t size, int32_t n);
934 int32_t middle=(start+end)/2;
936 if (output[middle]>elem)
938 else if (output[middle]<elem)
953 if (ind >= 0 && output[ind] == elem)
970 int32_t end=length-1;
977 int32_t middle=(start+end)/2;
979 if (*vector[middle]>*elem)
981 else if (*vector[middle]<*elem)
990 if (start>=0&&*vector[start]==*elem)
998 T* output, int32_t size, T elem)
1002 if (output[ind]<=elem)
1004 if (ind>0 && output[ind-1] <= elem)
1012 char * seq1,
char* seq2, int32_t l1, int32_t l2,
float64_t gapCost);
1031 inline static uint32_t get_log_accuracy()
1033 return CMath::LOGACCURACY;
1040 #if defined(isfinite) && !defined(SUNOS)
1051 if (fpclass(f) == FP_NINF || fpclass(f) == FP_PINF)
1090 SG_SWARNING(
"INVALID second operand to logsum(%f,%f) expect undefined results\n", p, q);
1095 return diff >
LOGRANGE? p : p + logtable[(int)(diff * LOGACCURACY)];
1096 return -diff >
LOGRANGE? q : q + logtable[(int)(-diff * LOGACCURACY)];
1100 static void init_log_table();
1103 static int32_t determine_logrange();
1106 static int32_t determine_logaccuracy(int32_t range);
1123 #ifdef USE_LOGSUMARRAY
1129 static inline float64_t logarithmic_sum_array(
1143 if (len%2==1) pp++ ;
1144 for (
register int32_t j=0; j < len>>1; j++)
1147 return logarithmic_sum_array(p,len%2 + (len>>1)) ;
1149 #endif //USE_LOGSUMARRAY
1153 inline virtual const char*
get_name()
const {
return "Mathematics"; }
1185 static int32_t LOGACCURACY;
1193 template <
class T1,
class T2>
1196 struct thread_qsort<T1,T2>* ps=(thread_qsort<T1,T2>*) p;
1197 T1* output=ps->output;
1198 T2* index=ps->index;
1199 uint32_t size=ps->size;
1200 int32_t* qsort_threads=ps->qsort_threads;
1201 int32_t sort_limit=ps->sort_limit;
1202 int32_t num_threads=ps->num_threads;
1206 if (output[0] > output [1])
1208 swap(output[0], output[1]);
1209 swap(index[0], index[1]);
1214 T1
split=output[size/2];
1217 int32_t right=size-1;
1221 while (output[left] < split)
1223 while (output[right] > split)
1228 swap(output[left], output[right]);
1229 swap(index[left], index[right]);
1234 bool lthread_start=
false;
1235 bool rthread_start=
false;
1238 struct thread_qsort<T1,T2> t1;
1239 struct thread_qsort<T1,T2> t2;
1241 if (right+1> 1 && (right+1< sort_limit || *qsort_threads >= num_threads-1))
1243 else if (right+1> 1)
1250 t1.qsort_threads=qsort_threads;
1251 t1.sort_limit=sort_limit;
1252 t1.num_threads=num_threads;
1253 if (pthread_create(<hread, NULL, parallel_qsort_index<T1,T2>, &t1) != 0)
1255 lthread_start=
false;
1262 if (size-left> 1 && (size-left< sort_limit || *qsort_threads >= num_threads-1))
1263 qsort_index(&output[left],&index[left], size-left);
1264 else if (size-left> 1)
1268 t2.output=&output[left];
1269 t2.index=&index[left];
1271 t2.qsort_threads=qsort_threads;
1272 t2.sort_limit=sort_limit;
1273 t2.num_threads=num_threads;
1274 if (pthread_create(&rthread, NULL, parallel_qsort_index<T1,T2>, &t2) != 0)
1276 rthread_start=
false;
1278 qsort_index(&output[left],&index[left], size-left);
1284 pthread_join(lthread, NULL);
1290 pthread_join(rthread, NULL);
1297 template <
class T1,
class T2>
1305 if (output[0] > output [1])
1307 swap(output[0],output[1]);
1308 swap(index[0],index[1]);
1313 T1
split=output[size/2];
1316 int32_t right=size-1;
1320 while (output[left] < split)
1322 while (output[right] > split)
1327 swap(output[left],output[right]);
1328 swap(index[left],index[right]);
1338 qsort_index(&output[left],&index[left], size-left);
1341 template <
class T1,
class T2>
1346 if (output[0] < output [1])
1348 swap(output[0],output[1]);
1349 swap(index[0],index[1]);
1355 T1
split=output[size/2];
1358 int32_t right=size-1;
1362 while (output[left] > split)
1364 while (output[right] < split)
1369 swap(output[left],output[right]);
1370 swap(index[left],index[right]);
1387 for (int32_t i=0; i<n; i++)
1388 min(&output[i], &index[i], size-i) ;
1400 int32_t min_index=0;
1401 for (int32_t i=1; i<size; i++)
1403 if (output[i]<min_elem)
1409 swap(output[0], output[min_index]);
1410 swap(index[0], index[min_index]);