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); } }
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); } } }