@@ -22,8 +22,10 @@ static bool is_in_infinite_loop_cq(double *elems, int nelems);
22
22
double
23
23
get_mean (double * elems , int nelems )
24
24
{
25
- double sum = 0 ;
26
- int i ;
25
+ double sum = 0 ;
26
+ int i ;
27
+
28
+ AssertArg (nelems > 0 );
27
29
28
30
for (i = 0 ; i < nelems ; ++ i )
29
31
sum += elems [i ];
@@ -37,7 +39,9 @@ get_mean(double *elems, int nelems)
37
39
double
38
40
get_estimation (double * elems , int nelems )
39
41
{
40
- int start ;
42
+ int start ;
43
+
44
+ AssertArg (nelems > 0 );
41
45
42
46
if (nelems > auto_tuning_window_size )
43
47
start = nelems - auto_tuning_window_size ;
@@ -53,11 +57,16 @@ get_estimation(double *elems, int nelems)
53
57
bool
54
58
is_stable (double * elems , int nelems )
55
59
{
56
- double est ;
60
+ double est ,
61
+ last ;
62
+
63
+ AssertArg (nelems > 1 );
57
64
58
65
est = get_mean (elems , nelems - 1 );
59
- return (est * 1.1 > elems [nelems - 1 ] || est + 0.1 > elems [nelems - 1 ]) &&
60
- (est * 0.9 < elems [nelems - 1 ] || est - 0.1 < elems [nelems - 1 ]);
66
+ last = elems [nelems - 1 ];
67
+
68
+ return (est * 1.1 > last || est + 0.1 > last ) &&
69
+ (est * 0.9 < last || est - 0.1 < last );
61
70
}
62
71
63
72
/*
@@ -89,7 +98,7 @@ is_in_infinite_loop_cq(double *elems, int nelems)
89
98
return false;
90
99
91
100
return !converged_cq (elems , nelems ) &&
92
- !converged_cq (elems , nelems - auto_tuning_window_size );
101
+ !converged_cq (elems , nelems - auto_tuning_window_size );
93
102
}
94
103
95
104
/*
@@ -142,16 +151,19 @@ automatical_query_tuning(int query_hash, QueryStat * stat)
142
151
stat -> execution_time_with_aqo_size ) +
143
152
get_estimation (stat -> planning_time_with_aqo ,
144
153
stat -> planning_time_with_aqo_size );
154
+
145
155
t_not_aqo = get_estimation (stat -> execution_time_without_aqo ,
146
156
stat -> execution_time_without_aqo_size ) +
147
157
get_estimation (stat -> planning_time_without_aqo ,
148
158
stat -> planning_time_without_aqo_size );
159
+
149
160
p_use = t_not_aqo / (t_not_aqo + t_aqo );
150
161
p_use = 1 / (1 + exp ((p_use - 0.5 ) / unstability ));
151
162
p_use -= 1 / (1 + exp (-0.5 / unstability ));
152
163
p_use /= 1 - 2 / (1 + exp (-0.5 / unstability ));
153
164
154
- use_aqo = ((double ) rand () / RAND_MAX < p_use );
165
+ /* borrowed from drandom() in float.c */
166
+ use_aqo = (random () / ((double ) MAX_RANDOM_VALUE + 1 )) < p_use ;
155
167
learn_aqo = use_aqo ;
156
168
}
157
169
0 commit comments