public override Expression Reduce() {
Contract.Ensures(Contract.Result<Expression>() != null);
var gen = ReductionExpressionGenerator;
var halfCount = Components.Length / 2;
var deltas = new Expression[halfCount];
for (int i = 0; i < halfCount; i++) {
Contract.Assume(halfCount + i < Components.Length);
deltas[i] = ReductionExpressionGenerator.GenerateOrThrow(
"SUBTRACT",
Components[i],
Components[halfCount + i]);
}
return gen.Generate("SQUAREDMAGNITUDE", deltas)
?? new SquaredMagnitudeExpression(deltas, gen);
}