in modules/ml-ext/ml/src/main/java/org/apache/ignite/ml/tree/impurity/util/StepFunction.java [56:122]
public StepFunction<T> add(StepFunction<T> b) {
int resSize = 0, leftPtr = 0, rightPtr = 0;
double previousPnt = 0;
while (leftPtr < x.length || rightPtr < b.x.length) {
if (rightPtr >= b.x.length || (leftPtr < x.length && x[leftPtr] < b.x[rightPtr])) {
if (resSize == 0 || x[leftPtr] != previousPnt) {
previousPnt = x[leftPtr];
resSize++;
}
leftPtr++;
}
else {
if (resSize == 0 || b.x[rightPtr] != previousPnt) {
previousPnt = b.x[rightPtr];
resSize++;
}
rightPtr++;
}
}
double[] resX = new double[resSize];
T[] resY = Arrays.copyOf(y, resSize);
leftPtr = 0;
rightPtr = 0;
for (int i = 0; leftPtr < x.length || rightPtr < b.x.length; i++) {
if (rightPtr >= b.x.length || (leftPtr < x.length && x[leftPtr] < b.x[rightPtr])) {
boolean override = i > 0 && x[leftPtr] == resX[i - 1];
int target = override ? i - 1 : i;
resY[target] = override ? resY[target] : null;
resY[target] = i > 0 ? resY[i - 1] : null;
resY[target] = resY[target] == null ? y[leftPtr] : resY[target].add(y[leftPtr]);
if (leftPtr > 0)
resY[target] = resY[target].subtract(y[leftPtr - 1]);
resX[target] = x[leftPtr];
i = target;
leftPtr++;
}
else {
boolean override = i > 0 && b.x[rightPtr] == resX[i - 1];
int target = override ? i - 1 : i;
resY[target] = override ? resY[target] : null;
resY[target] = i > 0 ? resY[i - 1] : null;
resY[target] = resY[target] == null ? b.y[rightPtr] : resY[target].add(b.y[rightPtr]);
if (rightPtr > 0)
resY[target] = resY[target].subtract(b.y[rightPtr - 1]);
resX[target] = b.x[rightPtr];
i = target;
rightPtr++;
}
}
return new StepFunction<>(resX, resY);
}