@Override
    synchronized
    public double iterate(final int iterations, final double targeterror) {
        if (this.running) throw new NotAllowedWhileRunning();
        this.abort   = false;
        this.running = true;
        //
        this.preIterationsCheck();
        //
        this.started();
        //
        for (int i = 0; i < iterations; i++) {
            final double result = this.performIteration();
            if ((result < targeterror) || this.abort) {
                break;
            }
        }
        //
        this.finished();
        //
        this.running = false;
        return this.error;
    }