Hello,
I'm using the MKL in the Composer 16update 3 release and I notice a weird behaviour of the df?dSearchCells1D routine when a sitePoint is equal to the last breakPoint.
I did a little test :
const int NBBreakpoint = 3; const int NBSite = 7; double *breakpoints = new double[NBBreakpoint]; double *sites = new double[NBSite]; int *cellIds = new int[NBSite]; int *expectedCellIds = new int[NBSite]; // ref values const double minBreakpoint = 0.0; const double maxBreakpoint = 2.0; breakpoints[0] = minBreakpoint; breakpoints[1] = (maxBreakpoint - minBreakpoint) * 0.5; breakpoints[2] = maxBreakpoint; // Sites values sites[0] = minBreakpoint - (maxBreakpoint - minBreakpoint) * 0.25; // before the first breakpoint sites[1] = minBreakpoint; // first breakpoint sites[2] = minBreakpoint + (maxBreakpoint - minBreakpoint) * 0.25; // between first and second breakpoints sites[3] = breakpoints[1]; // second breakpoint sites[4] = minBreakpoint + (maxBreakpoint - minBreakpoint) * 0.75; // between second and last breakpoints sites[5] = maxBreakpoint; // last breakpoint sites[6] = maxBreakpoint + (maxBreakpoint - minBreakpoint) * 0.25; // after the last breakpoint DFTaskPtr task; auto status = dfdNewTask1D(&task, NBBreakpoint, breakpoints, DF_NON_UNIFORM_PARTITION, 0, nullptr, DF_MATRIX_STORAGE_ROWS); status = dfdSearchCells1D(task, DF_METHOD_STD, NBSite, sites, DF_NON_UNIFORM_PARTITION, nullptr, cellIds); for (int i = 0; i < NBSite; ++i) printf("site: %lf\tcellId: %d\n", sites[i], cellIds[i]);
Here is my output with Composer 16:
site: -0.500000 cellId: 0
site: 0.000000 cellId: 1
site: 0.500000 cellId: 1
site: 1.000000 cellId: 2
site: 1.500000 cellId: 2
site: 2.000000 cellId: 3
site: 2.500000 cellId: 3
So, the behaviour was clear and consistent:
// dfdSearchCells1D returns: // 0 if site is less than first breakpoint // i+1 if breakpoint[i] <= site < breakpoint[i+1]
But here is my output with Composer 16 update 3:
site: -0.500000 cellId: 0
site: 0.000000 cellId: 1
site: 0.500000 cellId: 1
site: 1.000000 cellId: 2
site: 1.500000 cellId: 2
site: 2.000000 cellId: 2
site: 2.500000 cellId: 3
I am expecting to get 3 as result for ''site = 2.0 = maxBreakpoint''.
Itis annoying that there is not anymore consistency. Now, in my case, I have to check manually if my site is or not on the last breakpoint.
Is that a bug or the expected behaviour ? (the documentation is really really poor about this routine....)
Thanks in advance for your answer,
Guix