2012-08-13 13 views
6

Estoy usando QuickCheck para probar mi código para algunos cálculos numéricos. Básicamente tengo una función exacta y varias aproximaciones que son mucho más eficientes.Comprobación rápida para pruebas no booleanas

Actualmente estoy poniendo en práctica las propiedades que desea probar algo como:

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

pero sería muy agradable saber exactamente cómo precisa cada uno de los algoritmos de aproximación es y compararlos entre sí. Una manera fácil de hacerlo sería obtener informes de la media y la desviación estándar del lado izquierdo de la desigualdad. ¿Es esto de alguna manera posible?

+3

Bueno, todavía se puede emplear el marco de QuickCheck para la generación de entradas aleatorias. Para calcular las estadísticas, es posible que le guste el paquete [statistics] (http://hackage.haskell.org/package/statistics) obviamente nombrado. –

+0

Creo que necesita alguna prueba de que 'aproximadamente 'no será un factor * x * de la respuesta correcta, con ese conocimiento la propiedad quickcheck es trivial. Es decir, podría ayudar analizar su función aproximada teóricamente. – Tarrasch

+1

@Tarrasch Estoy de acuerdo en que tal prueba sería agradable, pero lamentablemente estos algoritmos suelen funcionar bastante bien, pero tienen un peor rendimiento en el peor de los casos. Algo así como una heurística para los problemas NP-completos. –

Respuesta

2

Si solo necesita que se imprima, debe verificar las devoluciones de llamada de QuickCheck que se realizan después de una única prueba. Su definición se encuentra en Test.QuickCheck.Property

De lo contrario, podría utilizar la función collect :: (Show a, Testable prop) => a -> prop -> Property ubicada en Test.QuickCheck.Property.

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

De esta manera usted GELD al menos una cadena que representa la aproximación y también llegar a saber cuántas de las pruebas individuales dan la misma aproximación.

Incluso podría deshacerse de la calidad de aproximación y simplemente enumerar los factores haciendo:

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