-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.cpp
64 lines (58 loc) · 1.54 KB
/
utils.cpp
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
54
55
56
57
58
59
60
61
62
63
64
//
// Created by wcbao on 2017/5/15.
//
#include <cmath>
#include <cstdlib>
#include "utils.hpp"
using std::vector;
double gaussian_rand(double mu, double sigma) {
static double V1, V2, S;
static int phase = 0;
double X;
if ( phase == 0 ) {
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
} while(S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);
} else
X = V2 * sqrt(-2 * log(S) / S);
phase = 1 - phase;
return X * sigma + mu;
}
vector<double> gaussian_filler(int N, double mu, double sigma) {
vector<double> filler;
for (int i = 0; i < N; ++i) {
filler.push_back(gaussian_rand(mu, sigma));
}
return filler;
}
vector<double> uniform_filler(int N, double min_value, double max_value) {
vector<double> filler;
for (int i = 0; i < N; ++i) {
double x = (double)rand() / RAND_MAX;
x = x / RAND_MAX * (max_value - min_value) + min_value;
filler.push_back(x);
}
return filler;
}
double euclidean_distance(const vector<double> &A, const vector<double> &B) {
double loss = 0;
assert(A.size() == B.size());
for (int i = 0; i < (int)A.size(); ++i) {
loss += (A[i] - B[i]) * (A[i] - B[i]) / 2.0;
}
return loss;
}
double fast_power(double x, int p) {
double res = 1;
while(p) {
if (p&1) res = res * x;
x = x * x;
p >>= 1;
}
return res;
}