44 #include "emmintrin.h"
53 #define Eps 0.0000000001
87 #define equal(A, B, I) (fabs((A)->x[I] - (B)->x[I]) < Eps)
96 #define objective(Z, A, O) HV(Z, A)
114 static sureInline(
void) projectZero(
point* res,
point* pvt,
unsigned int oct,
point* zero)
125 res->x[i] = pvt->x[i];
127 res->x[i] = zero->x[i];
133 static sureInline(
void) projectOne(
point* res,
point* pvt,
unsigned int oct,
point* one)
144 res->x[i] = one->x[i];
146 res->x[i] = pvt->x[i];
158 static sureInline(
int) classify(
point* pvt,
point* a)
170 if(a->x[i] > pvt->x[i])
187 static sureInline(
double) HV(
point* zero,
point* one)
201 z = (__m128d*)&(zero->x[0]);
202 o = (__m128d*)&(one->x[0]);
206 while(d < ((
D+1) >> 1))
208 c = _mm_mul_pd(c, _mm_sub_pd(z[d], o[d]));
238 one->x[
D] = one->x[
D-1];
239 pt->x[
D] = pt->x[
D-1];
240 zero->x[
D] = zero->x[
D-1];
243 z = (__m128d*)&(zero->x[0]);
244 p = (__m128d*)&(pt->x[0]);
245 o = (__m128d*)&(one->x[0]);
246 c = _mm_set1_pd(DBL_MAX);
249 while(d < ((
D+1) >> 1))
251 s = _mm_sub_pd(o[d], z[d]);
252 t = _mm_sub_pd(p[d], z[d]);
253 t = _mm_div_pd(t, s);
255 c = _mm_min_pd(c, t);
295 a = (__m128d*)&(A->x[0]);
296 b = (__m128d*)&(B->x[0]);
297 r = (__m128d*)&(res->x[0]);
300 while(d < ((
D+1) >> 1))
302 r[d] = _mm_min_pd(a[d], b[d]);
314 static sureInline(
void) swap(
int* idx,
int n,
int j)
void randomPoint(point *p)
double * V
A volume value for every dimension + 1.
struct point __attribute__((aligned(16))) point
All points must be aligned for SSE2.
void parsePoint(char *S, point *p, double max)
Point is an array of coordinates, in a struct for simple and fast copy.