@Override
  public final double[] closestPoint(double[] y) {
    if (n != y.length - 1) throw new RuntimeException("y is the wrong length");

    Anstar.project(y, y);

    VectorFunctions.round(y, u);
    double m = VectorFunctions.sum(u);
    for (int i = 0; i < n + 1; i++) {
      z[i].value = Math.signum(m) * (y[i] - u[i]);
      z[i].index = i;
    }

    Arrays.sort(z);
    for (int i = 0; i < Math.abs(m); i++) u[z[i].index] -= Math.signum(m);

    return u;
  }