protected IterativeLearning start() {
		this.stopped = false;
		this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(LearningEvent.INIT_LEARNING, this));
		while (!this.isStopped()) {
			this.onBeforeEpoch();
			this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(IterativeLearningEvent.START_EPOCH, this));
			this.doLearningEpoch();
			this.currentEpoch++;
			if (this.batchMode == true)
				this.doBatchWeightsUpdate();
			this.onAfterEpoch();
			this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(IterativeLearningEvent.END_EPOCH, this));
			if (this.hasReachedStopCondition() || this.isStopped()) {
				this.onStop();
				this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(IterativeLearningEvent.STOP_LEARNING, this));
				break;
			} else if (this.currentEpoch == Integer.MAX_VALUE)
				this.currentEpoch = 1;
			if (this.paused) {
				this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(IterativeLearningEvent.PAUSE_LEARNING, this));
				synchronized (this) {
					while (this.paused)
						try {
							this.wait();
						} catch (InterruptedException e) {
						}
				}
				this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(IterativeLearningEvent.RESUME_LEARNING, this));
			}
		}
		this.eventDispatcher.dispatchEvent(new IterativeLearningEvent(LearningEvent.COMPLETE_LEARNING, this));
		return this;
	}