public void FirstTrainedVectorShouldGiveMatrixSize()
        {
            var bcmModel = new BcmModel();

            bcmModel.Teach(_firstVector);

            bcmModel.CorrelationMatrix.ColumnCount.ShouldBeEquivalentTo(6);
        }
        public void TrainShouldThrowExceptionIfVectorValuesAreNotEqualZeroOrOne()
        {
            var            bcmModel            = new BcmModel();
            Vector <float> vectorWithBadValues = Vector <float> .Build.DenseOfArray(new[] { 1f, 1, 4, 0, 0, 0 });

            Action trainingWithBadValues = () => bcmModel.Teach(vectorWithBadValues);

            trainingWithBadValues.ShouldThrow <ArgumentException>();
        }
        public void ReturnTrueIfFirstVectorIsKnown()
        {
            var bcmModel  = new BcmModel();
            var threshold = 2;

            bcmModel.Teach(_firstVector);
            bcmModel.Teach(_secondVector);

            bcmModel.Test(_firstVector, threshold).Should().BeTrue();
        }
        public void SecondTrainedVectorWithOtherLengthShouldThrowException()
        {
            var bcmModel = new BcmModel();
            var vectorWithOtherLength = Vector <float> .Build.Dense(8);

            bcmModel.Teach(_firstVector);

            Action trainingWithDifferentLengths = () => bcmModel.Teach(vectorWithOtherLength);

            trainingWithDifferentLengths.ShouldThrow <ArgumentException>();
        }
        public void ReturnFalseIfVectorIsNotKnown()
        {
            var bcmModel      = new BcmModel();
            var threshold     = 2;
            var unknownVector = Vector <float> .Build.DenseOfArray(new[] { 1f, 1, 1, 1, 0, 0 });

            bcmModel.Teach(_firstVector);
            bcmModel.Teach(_secondVector);

            bcmModel.Test(unknownVector, threshold).Should().BeFalse();
        }
        public void TrainShouldThrowExceptionIfMatrixAlreadyKnowsTwoVectors()
        {
            var bcmModel    = new BcmModel();
            var thirdVector = Vector <float> .Build.Dense(6);

            bcmModel.Teach(_firstVector);
            bcmModel.Teach(_secondVector);

            Action trainingWithKnownVector = () => bcmModel.Teach(thirdVector);

            trainingWithKnownVector.ShouldThrow <InvalidOperationException>();
        }
        public void TestMethodShouldThrowExceptionIfVectorHaveDifferentLength()
        {
            var bcmModel              = new BcmModel();
            var threshold             = 2;
            var vectorWithOtherLength = Vector <float> .Build.Dense(8);

            bcmModel.Teach(_firstVector);
            bcmModel.Teach(_secondVector);

            Action testingWithDifferentLengths = () => bcmModel.Test(vectorWithOtherLength, threshold);

            testingWithDifferentLengths.ShouldThrow <ArgumentException>();
        }
        public void SecondTrainedVectorShouldGiveRightMatrix()
        {
            var bcmModel      = new BcmModel();
            var correctMatrix = Matrix <float> .Build.DenseOfArray(new[, ]
            {
                { 1f, 1, 0, 0, 0, 0 },
                { 1, 1, 0, 0, 0, 1 },
                { 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0 },
                { 0, 1, 0, 0, 0, 1 }
            });

            bcmModel.Teach(_firstVector);
            bcmModel.Teach(_secondVector);

            bcmModel.CorrelationMatrix.ShouldBeEquivalentTo(correctMatrix);
        }