public void ReadRowsInSecondScanDoNotUseOriginalReaderForEmptyRowsArray()
        {
            // arrange
            const int    rows    = 0;
            const int    columns = 0;
            const double density = 0.01;

            var originalVectors            = SparseVectorHelper.GenerateSparseVectors(rows, columns, density, () => SparseVectorHelper.RandomInInterval(-100, 100, 2)).ToArray();
            var originalReader             = new InMemorySparseMatrixReader(originalVectors);
            var originalReaderWithCounters = new SparseMatrixReaderWithMemberInvocationCounters <double>(originalReader);

            using (var cachedReader = new CachedMatrixMarketReader <double>(originalReaderWithCounters))
            {
                // act
                foreach (var row in cachedReader.ReadRows())
                {
                }
                foreach (var row in cachedReader.ReadRows())
                {
                }

                // assert
                Assert.AreEqual(1, originalReaderWithCounters.ColumnsCountInvocations);
                Assert.AreEqual(1, originalReaderWithCounters.RowsCountInvocations);
                Assert.AreEqual(1, originalReaderWithCounters.ElementsCountInvocations);
                Assert.AreEqual(1, originalReaderWithCounters.ReadRowsInvocations);
            }
        }
        public void MatrixMarketReaderReadSameVectorsAsMatrixMarketWriterWrited()
        {
            // arrange
            const int    rows    = 100;
            const int    columns = 100;
            const double density = 0.01;

            var originalVectors = SparseVectorHelper.GenerateSparseVectors(rows, columns, density, () => SparseVectorHelper.RandomInInterval(-100, 100, 2)).ToArray();

            // act

            //      write
            byte[] memory;
            int    rowsWrited;
            int    columnsWrited;
            long   elementsWrited;

            using (var stream = new MemoryStream())
                using (var writer = new MatrixMarketWriter <double>(stream))
                {
                    writer.Write(originalVectors);
                    stream.Flush();

                    memory         = stream.ToArray();
                    rowsWrited     = writer.RowsCount;
                    columnsWrited  = writer.ColumnsCount;
                    elementsWrited = writer.ElementsCount;
                }

            //      read
            SparseVector <double>[] readedVectors;
            int  rowsToRead;
            int  columnsToRead;
            long elementToRead;

            using (var stream = new MemoryStream(memory, false))
                using (var reader = new MatrixMarketReader <double>(stream))
                {
                    rowsToRead    = reader.RowsCount;
                    columnsToRead = reader.ColumnsCount;
                    elementToRead = reader.ElementsCount;
                    readedVectors = reader.ReadRows().ToArray();
                }

            string text;

            using (var stream = new MemoryStream(memory, false))
                using (var reader = new StreamReader(stream))
                {
                    text = reader.ReadToEnd();
                }

            // assert
            Assert.AreEqual(rowsWrited, rowsToRead, string.Format("Rows count does not equal:\r\n{0}", text));
            Assert.AreEqual(columnsWrited, columnsToRead, string.Format("Columns count does not equal:\r\n{0}", text));
            Assert.AreEqual(elementsWrited, elementToRead, string.Format("Elements count does not equal:\r\n{0}", text));
            Assert.IsTrue(originalVectors.SequenceEqual(readedVectors), string.Format("Vectors do not equal:\r\n{0}", text));
        }
        public void EqualsReturnsFalseForDifferentTypeArgument()
        {
            // arrange
            var originalVector = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var sv             = new SparseVector <double>(originalVector);

            // act
            var falseResult1 = sv.Equals(string.Empty);

            // assert
            Assert.IsFalse(falseResult1);
        }
        public void EnumeratorReturnsOnlyNonZeroValuePairsOrderedByIndexAscending()
        {
            // arrange
            var originalVector     = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var sv                 = new SparseVector <double>(originalVector);
            var nonZeroValuesPairs = originalVector.Where(pair => pair.Value != 0.0).OrderBy(pair => pair.Key).ToArray();

            // act

            // assert
            Assert.IsTrue(sv.SequenceEqual(nonZeroValuesPairs));
        }
        public void IndexedPropertyGetAccessorReturnsWhatWasSavedThroughConstructor()
        {
            // arrange
            var originalVector = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));

            // act
            var sv = new SparseVector <double>(originalVector);

            // assert
            foreach (var element in originalVector)
            {
                Assert.AreEqual(element.Value, sv[element.Key]);
            }
        }
        public void GetHashCodeReturnsSameHashCodeForEqualSparseVectors()
        {
            // arrange
            var originalVector     = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var originalVectorCopy = originalVector.ToArray();
            var sv1 = new SparseVector <double>(originalVector);
            var sv2 = new SparseVector <double>(originalVectorCopy);

            // act
            var hc1 = sv1.GetHashCode();
            var hc2 = sv2.GetHashCode();

            // assert
            Assert.AreEqual(hc1, hc2);
        }
        public void EqualsReturnsTrueForSameReferenceObjects()
        {
            // arrange
            var originalVector        = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var sv1                   = new SparseVector <double>(originalVector);
            SparseVector <double> sv2 = sv1;

            // act
            var trueResult1 = sv1.Equals(sv2);
            var trueResult2 = sv1.Equals((object)sv2);

            // assert
            Assert.IsTrue(trueResult1);
            Assert.IsTrue(trueResult2);
        }
        public void EqualsReturnsFalseForNullArgument()
        {
            // arrange
            var originalVector        = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var sv1                   = new SparseVector <double>(originalVector);
            SparseVector <double> sv2 = null;

            // act
            var falseResult1 = sv1.Equals(sv2);
            var falseResult2 = sv1.Equals((object)sv2);

            // assert
            Assert.IsFalse(falseResult1);
            Assert.IsFalse(falseResult2);
        }
        public void EqualOperatorReturnsTrueForEqualSparseVectors()
        {
            // arrange
            var originalVector     = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));
            var originalVectorCopy = originalVector.ToArray();
            var sv1 = new SparseVector <double>(originalVector);
            var sv2 = new SparseVector <double>(originalVectorCopy);

            // act
            var trueResult  = sv1 == sv2;
            var falseResult = sv1 != sv2;

            // assert
            Assert.IsTrue(trueResult);
            Assert.IsFalse(falseResult);
        }
        public void NonZeroValuesCountReturnsOnlyNonZeroElementsCount()
        {
            // arrange
            var originalVector = SparseVectorHelper.GenerateRandomVector(1000, 0.7, () => SparseVectorHelper.RandomInInterval(-100, 100, 2));

            var nonZeroElementsCount = originalVector.Count(arg => arg.Value != 0.0);

            var sv = new SparseVector <double>();

            // act
            foreach (var element in originalVector)
            {
                sv[element.Key] = element.Value;
            }

            // assert
            Assert.AreEqual(nonZeroElementsCount, sv.NonZeroValuesCount);
        }
        public void ReadRowsReturnSameVectorsInFirstScanForEmptyRowsArray()
        {
            // arrange
            const int    rows    = 0;
            const int    columns = 0;
            const double density = 0.01;

            var originalVectors = SparseVectorHelper.GenerateSparseVectors(rows, columns, density, () => SparseVectorHelper.RandomInInterval(-100, 100, 2)).ToArray();
            var originalReader  = new InMemorySparseMatrixReader(originalVectors);

            using (var cachedReader = new CachedMatrixMarketReader <double>(originalReader))
            {
                // act
                var firstScanResults = originalReader.ReadRows().ZipFull(cachedReader.ReadRows(), (originalVector, cachedVector) => originalVector == cachedVector).All(b => b);

                // assert
                Assert.IsTrue(firstScanResults);
            }
        }
Exemple #12
0
        static void Main(string[] args)
        {
            const string matrixFileName = @"c:\temp\matrix.txt";
            const int    rows           = 10000;
            const int    columns        = 1000;
            const double density        = 0.01;

            const int featuresCount   = 10;
            const int iterationsCount = 30;

            Console.WriteLine("Generating matrix {0}x{1} with avg. {2} non-zero elements ({3}%)...", rows, columns, (long)((double)rows * columns * density), density * 100.0);
            using (var file = new FileStream(matrixFileName, FileMode.Create))
                using (var mmwriter = new MatrixMarketWriter <double>(file))
                {
                    var vectors = SparseVectorHelper.GenerateSparseVectors(rows, columns, density, () => SparseVectorHelper.RandomInInterval(0.01, 100, 2));
                    mmwriter.Write(vectors);
                }

            Console.WriteLine("Matrix factorization (features=" + featuresCount + ", iterations=" + iterationsCount + ")...");
            using (var file = new FileStream(matrixFileName, FileMode.Open))
                using (var mmreader = new MatrixMarketReader <double>(file))
                    using (var cachedReader = new CachedMatrixMarketReader <double>(mmreader))
                    {
                        var nmf = new NMF(cachedReader);

                        // act
                        var sw = Stopwatch.StartNew();
                        using (var factorization = nmf.Factorize(featuresCount, iterationsCount))
                        {
                            sw.Stop();
                            Console.WriteLine("Factorization time: " + sw.ElapsedMilliseconds + " ms.");

                            Console.WriteLine("Euclidean distance calculation...");
                            sw = Stopwatch.StartNew();
                            var euclideanDistance = nmf.GetEuclideanDistance(factorization);
                            sw.Stop();
                            Console.WriteLine("Euclidean distance calculation time: " + sw.ElapsedMilliseconds + " ms.");
                            Console.WriteLine("Factorization Euclidean distance: " + euclideanDistance);
                        }
                    }
        }