public Gradient gradientAt(Point point) { double[] ax = point.toArray(); double[] gradient = new double[n]; double sqrtSum = 0.0; double cosSum = 0.0; for (int i = 0; i < n; i++) { sqrtSum += ax[i] * ax[i]; cosSum += Math.cos(2 * Math.PI * ax[i]); } sqrtSum = Math.sqrt(sqrtSum); cosSum /= n; for (int i = 0; i < n; i++) gradient[i] = (2 * ax[i] * Math.exp(-0.1 * sqrtSum)) / sqrtSum + 0.5 * Math.exp(cosSum) * Math.PI * Math.sin(2 * Math.PI * ax[i]); return Gradient.valueOf(gradient); }