public static MatrixMultiplier GetMatrixMultiplier(MultiplicationMethod method) { MatrixMultiplier multiplier = null; switch (method) { case MultiplicationMethod.Simple: multiplier = new SimpleMultiplier(); break; case MultiplicationMethod.Winograd: multiplier = new WinogradMultiplier(); break; case MultiplicationMethod.EnhancedWinograd: multiplier = new EnhancedWinogradMultiplier(); break; } return(multiplier); }
static void TestEnhancedWinograd() { // Testing even size Matrix m1 = new Matrix(4, 4); Matrix m2 = new Matrix(4, 4); Matrix.GenerateRandom(m1, 0, 16); Matrix.GenerateRandom(m2, 0, 16); //FillSequentially(m1, 1, 1); //FillSequentially(m2, 16, -1); Matrix correctResult = new SimpleMultiplier().Multiply(m1, m2); Matrix testResult = new EnhancedWinogradMultiplier().Multiply(m1, m2); Console.WriteLine("Testing even-sized matrixes"); Console.WriteLine("\nFirst matrix: "); Console.WriteLine(m1); Console.WriteLine("\nSecond matrix: "); Console.WriteLine(m2); Console.WriteLine("\nTest result: "); Console.WriteLine(testResult); bool correct = correctResult.Equals(testResult); Console.WriteLine(correct ? "CORRECT" : "WRONG RESULT!"); if (!correct) { Console.WriteLine("\nEstimated result: "); Console.WriteLine(correctResult); } // Testing odd size m1 = new Matrix(3, 3); m2 = new Matrix(3, 3); Matrix.GenerateRandom(m1, 0, 9); Matrix.GenerateRandom(m2, 0, 9); //FillSequentially(m1, 1, 1); //FillSequentially(m2, 9, -1); correctResult = new SimpleMultiplier().Multiply(m1, m2); EnhancedWinogradMultiplier enhancedWinogradMultiplier = new EnhancedWinogradMultiplier(); testResult = enhancedWinogradMultiplier.Multiply(m1, m2); Console.WriteLine("\nTesting odd-sized matrixes"); Console.WriteLine("\nFirst matrix: "); Console.WriteLine(m1); Console.WriteLine("\nSecond matrix: "); Console.WriteLine(m2); Console.WriteLine("\nTest result: "); Console.WriteLine(testResult); correct = correctResult.Equals(testResult); Console.WriteLine(correct ? "CORRECT" : "WRONG RESULT!"); if (!correct) { Console.WriteLine("\nEstimated result: "); Console.WriteLine(correctResult); } }