public void LearnPerformsTheCorrectCalls()
        {
            // Arrange
            var model = CreateFullyConnectedNeuralNetworkModel();
            var batch = CreateBatch();

            mockModelExecuter.Setup(m => m.Execute(It.IsAny <FullyConnectedNeuralNetworkModel>(), It.IsAny <double[]>()))
            .Returns(activationCountsPerLayer.Select(l => CreateAndInitializeDoubleArray(l, () => 0.5)).ToArray());
            // Setup 1 member of the population to return the desired output for the batches
            mockModelExecuter.Setup(m => m.Execute(It.Is <FullyConnectedNeuralNetworkModel>(it => it.Equals(population[1])), batch[0].Inputs))
            .Returns(new[] { batch[0].Outputs });
            mockModelExecuter.Setup(m => m.Execute(It.Is <FullyConnectedNeuralNetworkModel>(it => it.Equals(population[1])), batch[1].Inputs))
            .Returns(new[] { batch[1].Outputs });

            mockPopulationBreeder.Setup(m => m.CreateNextGeneration(It.Is <FullyConnectedNeuralNetworkModel[]>(it => it.Length == 2), populationSize))
            .Returns(() => CreateManyFullyConnectedNeuralNetworkModel(populationSize - selectionSize));

            sut.Initialize(model);
            population.Add(model);

            // Act
            sut.Learn(batch);

            // Assert
            mockModelExecuter.Verify(m => m.Execute(It.IsAny <FullyConnectedNeuralNetworkModel>(), It.IsAny <double[]>()), Times.Exactly(6));
            mockModelExecuter.Verify(m => m.Execute(It.Is <FullyConnectedNeuralNetworkModel>(it => it.Equals(population[1])), batch[0].Inputs), Times.Once);
            mockModelExecuter.Verify(m => m.Execute(It.Is <FullyConnectedNeuralNetworkModel>(it => it.Equals(population[1])), batch[1].Inputs), Times.Once);
            mockPopulationBreeder.Verify(m => m.CreateNextGeneration(It.Is <FullyConnectedNeuralNetworkModel[]>(it => it.Length == 2), populationSize), Times.Once);
            sut.Model.Should().BeSameAs(population[1]);
        }
        public void CallCreateNextGeneration()
        {
            // Arrange
            var model = modelInitializer.CreateModel(activationCountsPerLayer, activationFunction);

            sut.Initialize(model);

            // Act
            // sut.CreateNextGeneration();

            // Assert
        }
        public void InitializeCorrectlySetsTheModel()
        {
            // Arrange
            var model = CreateFullyConnectedNeuralNetworkModel();
            var activationCountsPerLayer = new[] { 4, 3 };
            Expression <Func <IModelInitializer, FullyConnectedNeuralNetworkModel> > createModelFunction = m => m.CreateModel(activationCountsPerLayer, model.ActivationFunction);

            mockModelInitializer.Setup(createModelFunction)
            .Returns(CreateFullyConnectedNeuralNetworkModel);

            // Act
            sut.Initialize(model);

            // Assert
            mockModelInitializer.Verify(createModelFunction, Times.Exactly(populationSize - 1));
            sut.Model.Should().BeSameAs(model);
        }