internal void Initialize(
            LearningRule rule, 
            ValueSpace<double> valueSpace,
            InputValueIndexes[] inputValueIndexes,
            OutputValueIndexes[] outputValueIndexes)
        {
            Contract.Requires(rule != null);
            Contract.Requires(valueSpace != null);
            Contract.Requires(inputValueIndexes != null);
            Contract.Requires(outputValueIndexes != null);
            Contract.Requires(inputValueIndexes.Length == outputValueIndexes.Length);

            Rule = rule;
            ValueSpace = valueSpace;
            this.inputValueIndexes = inputValueIndexes;
            this.outputValueIndexes = outputValueIndexes;
            ValueCount = inputValueIndexes.Length;

            InitializeNewRun(true);
        }
 unsafe protected virtual void InitializeNewRun(double* values, InputValueIndexes* inputValueIndexes, OutputValueIndexes* outputValueIndexes)
 {
 } 
 unsafe protected virtual void BackwardIteration(bool isBatchIteration, double* values, InputValueIndexes* inputValueIndexes, OutputValueIndexes* outputValueIndexes)
 {
 } 
 unsafe protected virtual void ForwardIteration(bool isNewBatch, double* values, InputValueIndexes* inputValueIndexes)
 {
 }