Blatt05 Testcase

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Blatt05 Testcase

Weitere Testcases duerfen hier natuerlich gerne veroeffentlicht werden.

Attachment:
publictestcase1.cpp: https://fsi.cs.fau.de/unb-attachments/post_78016/publictestcase1.cpp



Mal ne Frage,

bei mir schlägt der 1.Test testbasicConvert() fehl, und zwar an dieser Stelle:

    c.setIdentity();
    CRSMatrix m2(c);
    for (unsigned int i = 0; i < size; i++) {
		if (m2.getValues()[i] != 1.0f)	return false;
		//HIER HIER HIER
		if (m2.getColIndices()[i] != (float)i)	return false;
                // ENDE HIER
    }
Die Matrix ist eine Einheitsmatrix, die CRS Matrix dazu müsste also wie folgt aussehen:
Values: 1 1 1 1 1 1 ...
ColIndices: 1 2 3 4 5 6
if (m2.getColIndices()[i] != (float)i)	return false;
das hier gibt aber für i=0 ein false, da colIndices an erster Stelle keine 0 hat, sondern eine 1. Aber die ColINdices Spalte müsste eigentlich stimmen.

ist der Test an dieser Stelle falsch, oder bin ich n depp?

Danke für eure Hilfe schomal

sollte dann so sein:
if (m2.getColIndices()[i] != (float)i+1)	return false;



Die Indizierung geht bei 0 los.
→ Die ColumnIndices muessen sein: 0 1 2 3 4 5 …

Selbiges gilt auch fuer den RowPtr.

Depperl Test
Wahrscheinlich wenig hilfreich, sollte aber trotzdem funktionieren…

Solver solver;

std::cout << "DAU - Test\n";
CRSMatrix dau1(1,1);
dau1.setEntry(0,0,27.0f);

CRSMatrix b1(1,1);
b1.setEntry(0,0,1134.0f);

Matrix res1;
solver.solveSystem(dau1.convertToMatrix(),b1.convertToMatrix(),res1);
std::cout << "Antwort: " << res1;

naja…


warum gehts bei 0 los? Das ein Array normal bei 0 losgeht ist klar. Aber das ColumnArray müsste an colind[0] 1 enthalten.
also 1. Zeile, 1.Spalte → colInd[0]=1 oder etwa nicht?

Auf dem Übungsblatt war ein Beispiel, bei dem war es jedenfalls genauso, und selbst wiki meint es so.


Auf dem Uebungsblatt steht eben so als Konvention, dass alle Indices stets bei 0 beginnen. Im Beispiel auf dem Blatt beginnt der ColIdx ebenfalls bei 0.


Ne auf dem übungsblatt ist es eben nicht so. Das is ja grad das verwirrende, dass wir es in der Übung anders implementiern sollen als wirs in der Vorlesung gezeigt kriegen. Ich hab das erst nachm tausendsten Anschauen des Beispiels gemerkt, dass die Indices verschoben sind.


Die Vorlesung hält’s halt eher mathematisch und beginnt die Indizierung bei 1; im Code ist, informatik-typisch, die Indizierung ab 0 sinnvoller. Dafür ist ja auch extra ein Beispiel auf dem Blatt, das es genau so macht, und sogar zusätzlich noch ein Hinweis, dass die Indizes bei 0 beginnen. Sollte also keine große Verwirrung stiften…


Zum Glück hab ich die Aufgabe gemacht, bevor die Vorlesungsfolien online gestellt wurden :smiley:


mal wieder sehr clever das Ganze, so soll es sein.


Ist schon witzig, wie sich manche mittlerweile auf AlgoKS eingeschossen haben.
Im Anhang der relevante Teil des Aufgabenblatts; alle Stellen, an denen man auf den ersten Blick erkennt, wo die Indizes beginnen müssen, sind rot markiert.

Der Transfer von der Vorlesung, d.h. die Verschiebung der Indizes um 1, dürfte gerade so noch machbar sein. Sorry, wenn ich mich langsam etwas sarkastisch anhöre, aber ihr wollt jetzt schon bemängeln, dass Prof. Greiner in der Vorlesung ab 1 zählt (und wir euch für die Implementierung ab 0 zählen lassen, weil das im Code schöner ist)?

Attachment:
blatt5.png: https://fsi.cs.fau.de/unb-attachments/post_78094/blatt5.png


Ich hab auch nen Testcase geschieben.
Es wird hauptsaechlich set/getEntry getestet*.
Fuer den Solver ist auch ein Test dabei, bei dem Blatt4/Aufgabe0 gerechnet wird.
Die Tests pruefen nicht die interne Struktur.
Es sind keine Random-Tests…

Link:
http://wwwcip.informatik.uni-erlangen.de/~simlstro/algoks/main.cpp

*)
ich hatte nen Fehler in Methode getEntry, die bei mir relativ unuebersichtlich ist (C-Arrays…)
…ich fuehl mich richtig schmutzig, wenn ich getEntry anschau^^…


Netter Test. ich habs mal mit meiner Loesung durchlaufen lassen und es funktioniert :wink:


Wow, du machst dir ja Mühe mit dem Test… Thx :wink:


@_stromi: Thx hat mir nen doofen Fehler aufgezeigt :slight_smile:


Danke. Aber was hat das Epsilon : 1.52588e-05 bei mir zu bedeuten?


Falsch initialisiert? Hatte ich auch. Matrix.cpp geändert und _data[i] = 0.0f; gesetzt.


const float EPSILON = 1.f/(1<<16);
bool equal( Matrix const &a, Matrix const &b, float eps = EPSILON );
[...]
cout << "epsilon: " << EPSILON << endl;

Sollen wir zum prüfen auf 0

if(abs(d) > numeric_limits::epsilon())

oder

if(d != 0.0f)

verwenden ?