/// <summary>
 /// Creates a graph learning context
 /// </summary>
 /// <param name="learningRate">Initial learning rate</param>
 /// <param name="batchSize">Mini batch size</param>
 /// <param name="trainingErrorCalculation">How to calculate the training error</param>
 /// <param name="deferUpdates">True to defer updates (used when training recurrent neural networks)</param>
 /// <returns></returns>
 public ILearningContext CreateLearningContext(float learningRate, int batchSize,
                                               TrainingErrorCalculation trainingErrorCalculation = TrainingErrorCalculation.Fast,
                                               bool deferUpdates = false)
 {
     return(new LearningContext(LinearAlgebraProvider, learningRate, batchSize,
                                trainingErrorCalculation, deferUpdates));
 }
        /// <summary>
        /// Creates a graph training engine
        /// </summary>
        /// <param name="dataSource">Data source with training data</param>
        /// <param name="learningRate">Initial learning rate</param>
        /// <param name="batchSize">Mini batch size</param>
        /// <param name="trainingErrorCalculation">How to calculate the training error</param>
        /// <returns></returns>
        public IGraphTrainingEngine CreateTrainingEngine(IDataSource dataSource,
                                                         float learningRate = 0.1f, int batchSize = 128,
                                                         TrainingErrorCalculation trainingErrorCalculation = TrainingErrorCalculation.Fast)
        {
            var learningContext = new LearningContext(LinearAlgebraProvider, learningRate, batchSize,
                                                      trainingErrorCalculation, dataSource.IsSequential);

            return(new TrainingEngine(LinearAlgebraProvider, dataSource, learningContext, null));
        }
        /// <summary>
        /// Creates a graph training engine
        /// </summary>
        /// <param name="dataSource">Data source with training data</param>
        /// <param name="graph">The serialised graph to execute</param>
        /// <param name="trainingRate">Initial learning rate</param>
        /// <param name="batchSize">Mini batch size</param>
        /// <param name="trainingErrorCalculation">How to calculate the training error</param>
        /// <returns></returns>
        public IGraphTrainingEngine CreateTrainingEngine(IDataSource dataSource,
                                                         Models.ExecutionGraph graph, float trainingRate   = 0.1f, int batchSize = 128,
                                                         TrainingErrorCalculation trainingErrorCalculation = TrainingErrorCalculation.Fast)
        {
            var learningContext = new LearningContext(LinearAlgebraProvider, trainingRate, batchSize,
                                                      trainingErrorCalculation, dataSource.IsSequential);
            var input = this.CreateFrom(graph);

            return(new TrainingEngine(LinearAlgebraProvider, dataSource, learningContext, input));
        }