2012-08-13 14 views
6

Sto usando QuickCheck per testare il mio codice per alcuni calcoli numerici. Fondamentalmente ho una funzione esatta e diverse approssimazioni che sono molto più efficienti.Quickcheck per test non booleani

Attualmente sto attuando le proprietà che voglio provare qualcosa di simile:

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

ma sarebbe davvero bello sapere esattamente quanto esatto ciascuno degli algoritmi di approssimazione è e confrontarli tra loro. Un modo semplice per farlo sarebbe ottenere rapporti sulla deviazione media e standard della parte sinistra della disuguaglianza. È in qualche modo possibile?

+3

Beh, è ​​comunque possibile utilizzare quadro di QuickCheck per la generazione di input casuali. Per il calcolo delle statistiche, ti potrebbe piacere il pacchetto ovviamente [statistiche] (http://hackage.haskell.org/package/statistics). –

+0

Penso che sia necessario dimostrare che 'approx' non sarà un fattore * x * lontano dalla risposta corretta, con questa conoscenza la proprietà quickcheck è banale. Cioè, potrebbe aiutare ad analizzare la tua funzione approssimativa in teoria. – Tarrasch

+1

@Tarrasch Sono d'accordo sul fatto che una tale prova sarebbe piacevole, ma sfortunatamente questi algoritmi di solito funzionano abbastanza bene, ma hanno prestazioni peggiori nel peggiore dei casi. Una sorta di euristica per i problemi NP-completi. –

risposta

2

Se è necessario solo stamparlo, è necessario controllare i callback QuickCheck che vengono eseguiti dopo un singolo test. La loro definizione si trova in Test.QuickCheck.Property

In caso contrario, è possibile utilizzare la funzione collect :: (Show a, Testable prop) => a -> prop -> Property situata in Test.QuickCheck.Property.

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

In questo modo si Geld almeno una rappresentazione di stringa della approssimazione e anche arrivare a sapere quanti dei singoli test danno la stessa approssimazione.

Si potrebbe anche sbarazzarsi di qualità approssimazione e basta elencare i fattori facendo:

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