Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/compiler/fields/test-kernel.sml
ViewVC logotype

Annotation of /trunk/src/compiler/fields/test-kernel.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3349 - (view) (download)

1 : jhr 140 (* test-kenel.sml
2 :     *
3 : jhr 3349 * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 : jhr 140 * All rights reserved.
7 :     *
8 :     * Text driver for the kernel code.
9 :     *)
10 :    
11 :     structure Test =
12 :     struct
13 :    
14 :     structure R = Rational
15 :     structure K = Kernel
16 :    
17 : jhr 153 fun eval ({isOdd, isCont, segs}, x) = let
18 :     fun eval' x = let
19 :     val {whole, frac} = Real.split x
20 :     val i = Real.trunc whole
21 :     fun evalPoly [] = 0.0
22 :     | evalPoly (c::r) = R.toReal c + x * evalPoly r
23 :     in
24 :     evalPoly (List.nth(segs, i)) handle _ => 0.0
25 :     end
26 : jhr 140 in
27 : jhr 153 if (x >= 0.0) then eval' x
28 :     else if isOdd then ~(eval' (~x))
29 :     else eval' (~x)
30 : jhr 140 end
31 :    
32 : jhr 153
33 :     local
34 :     (* Path to Ploticus command *)
35 :     val plPath = "/usr/local/bin/pl"
36 :     val env = [
37 :     "PLOTICUS_PREFABS=/usr/local/src/ploticus/prefabs"
38 :     ];
39 :     in
40 :     fun ploticus args outFn = let
41 :     val proc = Unix.executeInEnv (plPath, args, env)
42 :     val outS = Unix.textOutstreamOf proc
43 :     in
44 :     outFn outS;
45 :     TextIO.closeOut outS;
46 :     Unix.reap proc
47 :     end
48 :    
49 :     fun output mergedData outS = let
50 :     fun plotRow (x, l) = (
51 :     TextIO.output(outS, Format.format "%f" [Format.REAL x]);
52 :     List.app (fn t => TextIO.output(outS, Format.format " %f" [Format.REAL t])) l;
53 :     TextIO.output(outS, "\n"))
54 :     in
55 :     List.app plotRow mergedData
56 :     end
57 :    
58 :     (* command-line arguments for ploticus *)
59 :     fun args (file, name) = [
60 :     "-prefab", "lines",
61 :     "-eps",
62 :     "-o", file,
63 :     "-font", "/Times-Roman",
64 :     "-textsize", "12",
65 :     "data=-",
66 :     "rectangle= 0 1.0 5.5 5.5",
67 :     "legend= max-1 max",
68 :     "x=1",
69 :     "xlbl=X",
70 :     "xnearest=1",
71 :     "y=2",
72 :     "y2=3",
73 :     "y3=4",
74 :     "y4=5",
75 :     "ylbl=Y",
76 :     "ynearest=1",
77 :     "pointsym=none",
78 :     "pointsym2=none",
79 :     "pointsym3=none",
80 :     "pointsym4=none",
81 :     "name= D0",
82 :     "name2= D1",
83 :     "name3= D2",
84 :     "name4= D3",
85 :     "title= "^name
86 :     ];
87 :    
88 :     end;
89 :    
90 :     (* given a kernel, kernel and its derivatives *)
91 :     fun plotKernel kern = let
92 :     val s = Kernel.support kern
93 :     val curve0 = Kernel.curve(kern, 0)
94 :     val curve1 = Kernel.curve(kern, 1)
95 :     val curve2 = Kernel.curve(kern, 2)
96 :     val curve3 = Kernel.curve(kern, 3)
97 :     val maxX = Real.fromInt s
98 :     val step = 1.0 / 64.0
99 :     fun lp (x, rows) = if (x <= maxX)
100 :     then let
101 :     val rows = (x, [eval(curve0, x), eval(curve1, x), eval(curve2, x), eval(curve3, x)]) :: rows
102 :     in
103 :     lp (x+step, rows)
104 :     end
105 :     else List.rev rows
106 :     val rows = lp (~maxX, [])
107 :     val name = K.name kern
108 :     in
109 :     ploticus (args (name ^ ".eps", name)) (output rows);
110 :     OS.Process.system (concat["/usr/bin/open ", name, ".eps"])
111 :     end
112 :    
113 : jhr 155 fun polyToString poly = let
114 :     fun c2s c = Format.format "%g" [Format.REAL(R.toReal c)]
115 :     fun toS ([c], l) = c2s c :: l
116 :     | toS (c::r, l) = c2s c :: " + x*(" :: toS(r, ")"::l)
117 :     in
118 :     String.concat (toS (poly, []))
119 :     end
120 :    
121 :     fun printKernel (kern, k) = let
122 :     val {isCont, isOdd, segs} = K.curve(kern, k)
123 :     val name = if (k > 0)
124 :     then concat(K.name kern::List.tabulate(k, fn _ => "'"))
125 :     else K.name kern
126 :     fun lp (_, []) = ()
127 :     | lp (i, poly::rest) = (
128 :     print(concat[
129 :     " ", name, "(x) = ", polyToString poly, " for ",
130 :     Int.toString i, " <= x < ", Int.toString(i+1), "\n"
131 :     ]);
132 :     lp (i+1, rest))
133 :     in
134 :     print(name ^ ":\n");
135 :     lp (0, segs);
136 :     if (isOdd)
137 :     then print(concat[" ", name, "(x) = -", name, "(-x) for x < 0\n"])
138 :     else print(concat[" ", name, "(x) = ", name, "(-x) for x < 0\n"])
139 :     end
140 :    
141 : jhr 140 end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0