//ACHTUNG: //Dies ist ein sehr einfacher Testcase fuer die CRSMatrixklasse, indem einige Basisfaelle geprueft werden. //Es wird fuer keinerlei Korrektheit dieser Faelle, sowie dieser Datei garantiert! Es soll lediglich eine kleine //Hilfestellung zur Bearbeitung der Aufgaben bieten. Die zur Korrektur verwendeten Testfaelle unterscheiden sich //noch einmal grundlegend von denen in dieser Datei. Speziell Zahlen sind natuerlich nicht gleich! #include #include "matrix.h" #include "crsmatrix.h" bool testBasicConvert() { unsigned int size = 100; Matrix c(size, size); c.setZero(); CRSMatrix m0(size,size); Matrix re = m0.convertToMatrix(); if (!(re == c)) return false; CRSMatrix m1(c); if (m1.getRowPtr()[0] != 0) return false; if (m1.getWidth() != c.getWidth() && m1.getHeight() != c.getHeight()) return false; re = m1.convertToMatrix(); if (!(re == c)) return false; c.setIdentity(); CRSMatrix m2(c); for (unsigned int i = 0; i < size; i++) { if (m2.getValues()[i] != 1.0f) return false; if (m2.getColIndices()[i] != (float)i) return false; } for (unsigned int i = 0; i < size + 1; i++) { if (m2.getRowPtr()[i] != (float)i) return false; } re = m2.convertToMatrix(); if (!(re == c)) return false; return true; } bool testBasicGetEntry() { unsigned int size = 100; Matrix c(size, size); c.setZero(); CRSMatrix m1(c); for (unsigned int i = 0; i < size; i++) { for (unsigned int j = 0; j < size; j++) { if (m1.getEntry(i,j) != 0.0f) return false; } } c.setIdentity(); CRSMatrix m2(c); for (unsigned int i = 0; i < size; i++) { for (unsigned int j = 0; j < size; j++) { if (i == j) { if (m2.getEntry(i,j) != 1.0f) return false; } else { if (m2.getEntry(i,j) != 0.0f) return false; } } } return true; } bool testBasicSetEntry() { unsigned int size = 100; CRSMatrix m(size,size); Matrix sol(size,size); for (unsigned int i = size; i > 0; i--) { for (unsigned int j = size; j > 0; j--) { float value; if ((i % 2 == 0) || (j % 2 == 0)) value = 0.0f; else value = (float)(i+j); m.setEntry(i-1,j-1, value); sol.setEntry(i-1,j-1, value); } } Matrix re = m.convertToMatrix(); if (!(re == sol)) return false; CRSMatrix m1(size,size); m1.setEntry(3,3, 1.0f); if (m1.getValues()[0] != 1.0f) return false; if (m1.getColIndices()[0] != 3) return false; for (unsigned int i = 0; i < 3 + 1; i++) if (m1.getRowPtr()[i] != 0) return false; for (unsigned int i = 3 + 1; i < size+1; i++) if (m1.getRowPtr()[i] != 1) return false; return true; } bool testBasicMult() { //ACHTUNG: //hier wird kein Zeitlimit getestet - im echten Testcase allerdings schon: Also bitte die Struktur von CRS nutzen! unsigned int size = 100; Matrix c1(size, size); for (unsigned int i = 0; i < size; i++) { for (unsigned int j = 0; j < size; j++) { c1.setEntry(i,j, i+j); } } CRSMatrix m1(c1); Matrix re1 = m1 * c1; Matrix re2 = m1.naiveMult(c1); if (!(re1 == re2)) return false; return true; } int main() { if (!(testBasicConvert())) { std::cout << "TestBasicConvert failed" << std::endl; } else { std::cout << "TestBasicConvered passed OK" << std::endl; } if (!(testBasicGetEntry())) { std::cout << "TestBasicGetEntry failed" << std::endl; } else { std::cout << "TestBasicGetEntry passed OK" << std::endl; } if (!(testBasicSetEntry())) { std::cout << "TestBasicSetEntry failed" << std::endl; } else { std::cout << "TestBasicSetEntry passed OK" << std::endl; } if (!(testBasicMult())) { std::cout << "TestBasicMult failed" << std::endl; } else { std::cout << "TestBasicMult passed OK" << std::endl; } return 0; }