diff options
Diffstat (limited to 'testsuite/tests/programs/barton-mangler-bug/Plot.lhs')
-rw-r--r-- | testsuite/tests/programs/barton-mangler-bug/Plot.lhs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/testsuite/tests/programs/barton-mangler-bug/Plot.lhs b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs new file mode 100644 index 0000000000..8db1066aef --- /dev/null +++ b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs @@ -0,0 +1,79 @@ +The functions in this file (well, the single function) will allow the +user to plot different functions using the Gnuplot program. In fact, +all it really does is output a number of points on the list and allow +the user to activate Gnuplot and use the plotting program to get the +appropriate output. + +The first line just gives the module name. For the moment, I don't +anticipate using any modules (although this may change). + +> module Plot where + +Now we give the type of the function. This consists of a file name, a +list of values, and a function that goes from the appropriate types. + +> plot2d:: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b) +> => String -> [(a, b)] -> [a] -> (a -> b) -> String +> plot2d fl expected inp f = plot2d' expected inp f + +> plot2d':: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b) +> => [(a, b)] -> [a] -> (a -> b) -> String +> plot2d' [] [] f = [] +> plot2d' ((e1, e2):es) (x:xs) f +> | (e1 `isSame` x) && (e2 `isSame` x') +> = (show e1) ++ +> " " ++ +> (show e2) ++ +> "\n" ++ +> plot2d' es xs f +> | otherwise +> = "Mismatch: " ++ +> (show e1) ++ +> " " ++ +> (show e2) ++ +> " " ++ +> (show x) ++ +> " " ++ +> (show x') ++ +> "\n" ++ +> plot2d' es xs f +> where x' = f x +> plot2d' es [] _ = "Extra expected: " ++ show es +> plot2d' [] xs _ = "Extra results: " ++ show xs + +> isSame :: (Fractional a, Ord a) => a -> a -> Bool +> x `isSame` y = abs (x - y) < 0.00001 + +And now, let's create a function to make a range out of a triple of a +start point, an end point, and an increment. + +> createRange:: (Num a, Ord a) => a -> a -> a -> [a] +> createRange s e i = if s > e then [] +> else s : createRange (s+i) e i + +We now settle down to a couple of more specific functions that do +things that are more unique to gnuplot. First, we have something that +creates the appropriate gnuplot command file. + +> createGnuPlot:: Show a => String -> a -> a -> String +> createGnuPlot fl s e = +> "set terminal latex\n" ++ +> "set output \"" ++ +> (fl ++ ".tex\"\n") ++ +> "set nokey\n" ++ +> "plot [" ++ +> (show s) ++ +> ":" ++ +> (show e) ++ +> "] \"" ++ +> (fl ++ ".plt\"") ++ +> " with lines\n" + +And now we create a fairly specific plotExam function that takes a +string, a function, and two floats and produces the correct files + +> plotExam:: String -> [(Float, Float)] -> Float -> Float -> (Float -> Float) +> -> String +> plotExam fl expected s e f = plot2d (fl++".plt") expected r f ++ +> createGnuPlot fl s e +> where r = createRange s e ((e - s) / 2500) |