2012-08-13 14 views
6

Ich verwende QuickCheck, um meinen Code für einige numerische Berechnungen zu testen. Im Grunde habe ich eine genaue Funktion und mehrere Annäherungen davon, die viel effizienter sind.Quickcheck für nicht boolesche Tests

Ich führe derzeit die Eigenschaften I zu testen, wie etwas will:

prop_blah input = (abs $ (exact input)-(approx input)) < threshold 

Aber es wäre wirklich schön, genau zu wissen, wie genau jede der Approximationsalgorithmen und vergleichen sie miteinander. Ein einfacher Weg, dies zu tun, wäre, Berichte über die mittlere und Standardabweichung der linken Seite der Ungleichung zu erhalten. Ist das irgendwie möglich?

+3

Nun, können Sie immer noch Quick Check der Rahmen für die Erzeugung von Zufallseingänge verwenden. Für die Berechnung von Statistiken magst du das offensichtlich genannte [statistics] (http://hackage.haskell.org/package/statistics) -Paket. –

+0

Ich denke, Sie brauchen einen Beweis, dass 'approx 'kein Faktor * x * von der richtigen Antwort entfernt ist, mit diesem Wissen ist die Quickcheck-Eigenschaft trivial. Das heißt, es könnte helfen, Ihre approximative Funktion theoretisch zu analysieren. – Tarrasch

+1

@Tarrasch Ich stimme zu, dass solch ein Beweis wäre schön, aber leider diese Algorithmen in der Regel ziemlich gut, aber schlechte Worst-Case-Leistung haben. So ähnlich wie eine Heuristik für NP-vollständige Probleme. –

Antwort

2

Wenn Sie es nur zum Ausdrucken benötigen, sollten Sie QuickCheck Callbacks überprüfen, die nach einem einzigen Test durchgeführt werden. Ihre Definition befindet sich in Test.QuickCheck.Property

Andernfalls können Sie die Funktion collect :: (Show a, Testable prop) => a -> prop -> Property in Test.QuickCheck.Property verwenden.

let a = (abs $ (exact input)-(approx input)) 
in collect a (a < threshold) 

So kann man zumindest eine String-Darstellung der Annäherung und geld auch kennen lernen, wie viele der einzelnen Tests die gleiche Annäherung geben.

Sie selbst Loswerden der Approximationsqualität bekommen konnte und in der Liste nur die Faktoren zu tun:

prop = collect (abs $ (exact input)-(approx input)) True