@Override protected void doResidual() {
parameters.getConstraintError();
inputData.zeroThreshold = settings.thresholdsZero [Math.min(settings.thresholdsZero .length-1, pyramidLevel)];
inputData.outlierThreshold = settings.thresholdsOutlier[Math.min(settings.thresholdsOutlier.length-1, pyramidLevel)];
if (settings.thresholdsMulRMSE) {
inputData.zeroThreshold *= RMSE;
inputData.outlierThreshold *= RMSE;
}
inputData.pyramidLevel = pyramidLevel;
context.acquireGLObject(maskCL[pyramidLevel]);
((ImageTransformerCL)transformer).transform(templateCL[pyramidLevel], targetCL[pyramidLevel], null,
transformedCL[pyramidLevel], residualCL[pyramidLevel], maskCL[pyramidLevel],
parametersArray, null, inputData, outputData);
context.releaseGLObject(maskCL[pyramidLevel]);
outputData.readBuffer(context);
double dstDstDot = outputData.dstDstDot.get(0);
int dstCount = outputData.dstCount;
RMSE = dstCount < n ? Double.NaN : Math.sqrt(dstDstDot/dstCount);
residualUpdateNeeded = false;
}
}