44 #include "emmintrin.h"
48 #define Eps 0.0000000001
74 #define equal(A, B, I) (fabs((A)->x[I] - (B)->x[I]) < Eps)
83 #define objective(Z, A, O) HV(Z, A)
101 static sureInline(
void) projectZero(
point* res,
point* pvt,
unsigned int oct,
point* zero)
112 res->x[i] = pvt->x[i];
114 res->x[i] = zero->x[i];
120 static sureInline(
void) projectOne(
point* res,
point* pvt,
unsigned int oct,
point* one)
131 res->x[i] = one->x[i];
133 res->x[i] = pvt->x[i];
145 static sureInline(
int) classify(
point* pvt,
point* a)
157 if(a->x[i] > pvt->x[i])
174 static sureInline(
double) HV(
point* zero,
point* one)
188 z = (__m128d*)&(zero->x[0]);
189 o = (__m128d*)&(one->x[0]);
193 while(d < ((
D+1) >> 1))
195 c = _mm_mul_pd(c, _mm_sub_pd(z[d], o[d]));
225 one->x[
D] = one->x[
D-1];
226 pt->x[
D] = pt->x[
D-1];
227 zero->x[
D] = zero->x[
D-1];
230 z = (__m128d*)&(zero->x[0]);
231 p = (__m128d*)&(pt->x[0]);
232 o = (__m128d*)&(one->x[0]);
233 c = _mm_set1_pd(DBL_MAX);
236 while(d < ((
D+1) >> 1))
238 s = _mm_sub_pd(o[d], z[d]);
239 t = _mm_sub_pd(p[d], z[d]);
240 t = _mm_div_pd(t, s);
242 c = _mm_min_pd(c, t);
282 a = (__m128d*)&(A->x[0]);
283 b = (__m128d*)&(B->x[0]);
284 r = (__m128d*)&(res->x[0]);
287 while(d < ((
D+1) >> 1))
289 r[d] = _mm_min_pd(a[d], b[d]);
#define D
D is the number of dimensions.
void randomPoint(point *p)
double * V
A volume value for every dimension + 1.
void parsePoint(char *S, point *p, double max)
Point is an array of coordinates, in a struct for simple and fast copy.
The definition of a point stucture.