45 #include "emmintrin.h"
49 #define Eps 0.0000000001
75 #define equal(A, B, I) (fabs((A)->x[I] - (B)->x[I]) < Eps)
84 #define objective(Z, A, O) HV(Z, A)
102 static sureInline(
void) projectZero(
point* res,
point* pvt,
unsigned int oct,
point* zero)
113 res->x[i] = pvt->x[i];
115 res->x[i] = zero->x[i];
121 static sureInline(
void) projectOne(
point* res,
point* pvt,
unsigned int oct,
point* one)
132 res->x[i] = one->x[i];
134 res->x[i] = pvt->x[i];
146 static sureInline(
int) classify(
point* pvt,
point* a)
158 if(a->x[i] > pvt->x[i])
169 #define SSED ((D+1)/2)
178 static sureInline(
double) HV(
point* zero,
point* one)
192 memcpy(z, &(zero->x[0]),
SSED*
sizeof(__m128d));
193 memcpy(o, &(one->x[0]),
SSED*
sizeof(__m128d));
200 while(d < ((
D+1) >> 1))
202 c = _mm_mul_pd(c, _mm_sub_pd(z[d], o[d]));
232 one->x[
D] = one->x[
D-1];
233 pt->x[
D] = pt->x[
D-1];
234 zero->x[
D] = zero->x[
D-1];
241 memcpy(z, &(zero->x[0]),
SSED*
sizeof(__m128d));
242 memcpy(o, &(one->x[0]),
SSED*
sizeof(__m128d));
243 memcpy(p, &(pt->x[0]),
SSED*
sizeof(__m128d));
245 c = _mm_set1_pd(DBL_MAX);
248 while(d < ((
D+1) >> 1))
250 s = _mm_sub_pd(o[d], z[d]);
251 t = _mm_sub_pd(p[d], z[d]);
252 t = _mm_div_pd(t, s);
254 c = _mm_min_pd(c, t);
294 memcpy(a, &(A->x[0]),
SSED*
sizeof(__m128d));
295 memcpy(b, &(B->x[0]),
SSED*
sizeof(__m128d));
302 while(d < ((
D+1) >> 1))
304 r[d] = _mm_min_pd(a[d], b[d]);
308 memcpy(&(res->x[0]), r,
SSED*
sizeof(__m128d));
318 static sureInline(
void) swap(
int* idx,
int n,
int j)
#define D
D is the number of dimensions.
void randomPoint(point *p)
double * V
A volume value for every dimension + 1.
#define SSED
Used to guarantee aligned points.
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.