forked from attractivechaos/klib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kmath.h
53 lines (38 loc) · 1.47 KB
/
kmath.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef AC_KMATH_H
#define AC_KMATH_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**********************************
* Pseudo-random number generator *
**********************************/
typedef uint64_t krint64_t;
struct _krand_t;
typedef struct _krand_t krand_t;
#define kr_drand(_kr) ((kr_rand(_kr) >> 11) * (1.0/9007199254740992.0))
#define kr_sample(_kr, _k, _cnt) ((*(_cnt))++ < (_k)? *(_cnt) - 1 : kr_rand(_kr) % *(_cnt))
krand_t *kr_srand(krint64_t seed);
krint64_t kr_rand(krand_t *kr);
/**************************
* Non-linear programming *
**************************/
#define KMIN_RADIUS 0.5
#define KMIN_EPS 1e-7
#define KMIN_MAXCALL 50000
typedef double (*kmin_f)(int, double*, void*);
typedef double (*kmin1_f)(double, void*);
double kmin_hj(kmin_f func, int n, double *x, void *data, double r, double eps, int max_calls); // Hooke-Jeeves'
double kmin_brent(kmin1_f func, double a, double b, void *data, double tol, double *xmin); // Brent's 1-dimenssion
/*********************
* Special functions *
*********************/
double kf_lgamma(double z); // log gamma function
double kf_erfc(double x); // complementary error function
double kf_gammap(double s, double z); // regularized lower incomplete gamma function
double kf_gammaq(double s, double z); // regularized upper incomplete gamma function
double kf_betai(double a, double b, double x); // regularized incomplete beta function
#ifdef __cplusplus
}
#endif
#endif