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

SCM Repository

[diderot] Diff of /trunk/src/basis/basis.sml
ViewVC logotype

Diff of /trunk/src/basis/basis.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 47, Tue Apr 13 14:57:27 2010 UTC revision 75, Mon May 24 20:41:18 2010 UTC
# Line 8  Line 8 
8    
9  structure Basis =  structure Basis =
10    struct    struct
11        local
12          structure N = BasisNames
13          structure Ty = Types
14          structure MV = MetaVar
15    
16          fun --> (tys1, ty) = Ty.T_Fun(tys1, [ty])
17          infix -->
18    
19          val N2 = Ty.DimConst 2
20          val N3 = Ty.DimConst 3
21    
22        (* short names for kinds *)
23          val TK : unit -> Ty.meta_var = Ty.TYPE o MV.newTyVar
24          val DK : unit -> Ty.meta_var = Ty.DIFF o MV.newDiffVar
25          val SK : unit -> Ty.meta_var = Ty.SHAPE o MV.newShapeVar
26          val NK : unit -> Ty.meta_var = Ty.DIM o MV.newDimVar
27    
28          fun ty t = ([], t)
29          fun all (kinds, mkTy) = let
30                val tvs = List.map (fn mk => mk()) kinds
31                in
32                  (tvs, mkTy tvs)
33                end
34          fun allNK mkTy = let
35                val tv = MV.newDimVar()
36                in
37                  ([Ty.DIM tv], mkTy tv)
38                end
39    
40        fun field (k, d, dd) = Ty.T_Field{diff=k, dim=d, shape=dd}
41        fun tensor ds = Ty.T_Tensor(Ty.Shape ds)
42    
43        in
44    
45      (* overloaded operators *)
46        val overloads = [
47      (*
48        val op_add = Atom.atom "+"
49        val op_sub = Atom.atom "-"
50        val op_mul = Atom.atom "*"
51        val op_div = Atom.atom "/"
52        val op_lt = Atom.atom "<"
53        val op_lte = Atom.atom "<="
54        val op_eql = Atom.atom "=="
55        val op_neq = Atom.atom "!="
56        val op_gte = Atom.atom ">="
57        val op_gt = Atom.atom ">"
58    *)
59            ]
60    
61      (* non-overloaded operators, etc. *)
62        val basis = [
63            (* operators *)
64              (N.op_at, all([DK, NK, SK],
65                fn [Ty.DIFF k, Ty.DIM d, Ty.SHAPE dd] => let
66                    val k = Ty.DiffVar(k, 0)
67                    val d = Ty.DimVar d
68                    val dd = Ty.ShapeVar dd
69                    in
70                      [field(k, d, dd), tensor[d]] --> Ty.T_Tensor dd
71                    end)),
72              (N.op_at, all([DK, NK, SK],
73                fn [Ty.DIFF k, Ty.DIM d, Ty.SHAPE dd] => let
74                    val k0 = Ty.DiffVar(k, 0)
75                    val km1 = Ty.DiffVar(k, ~1)
76                    val d = Ty.DimVar d
77                    val dd = Ty.ShapeVar dd
78                    in
79                      [field(k0, d, dd), tensor[d]]
80                        --> field(km1, d, Ty.ShapeExt(dd, d))
81                    end)),
82              (N.op_norm, all([SK],
83                fn [Ty.SHAPE dd] => [Ty.T_Tensor(Ty.ShapeVar dd)] --> Ty.realTy)),
84            (* functions *)
85              (N.fn_CL,     ty([tensor[N3, N3]] --> Ty.vec3Ty)),
86              (N.fn_convolve, all([DK, NK, SK],
87                fn [Ty.DIFF k, Ty.DIM d, Ty.SHAPE dd] => let
88                    val k = Ty.DiffVar(k, 0)
89                    val d = Ty.DimVar d
90                    val dd = Ty.ShapeVar dd
91                    in
92                      [Ty.T_Kernel k, Ty.T_Image{dim=d, shape=dd}]
93                        --> field(k, d, dd)
94                    end)),
95              (N.fn_cos,    ty([Ty.realTy] --> Ty.realTy)),
96              (N.fn_dot,    allNK(fn tv => [tensor[Ty.DimVar tv]]
97                              --> tensor[Ty.DimVar tv])),
98              (N.fn_inside, all([DK, NK, SK],
99                fn [Ty.DIFF k, Ty.DIM d, Ty.SHAPE dd] => let
100                    val k = Ty.DiffVar(k, 0)
101                    val d = Ty.DimVar d
102                    val dd = Ty.ShapeVar dd
103                    in
104                      [Ty.T_Tensor(Ty.Shape[d]), field(k, d, dd)]
105                        --> Ty.T_Bool
106                    end)),
107              (N.fn_load,   all([NK, SK],
108                fn [Ty.DIM d, Ty.SHAPE dd] => let
109                    val d = Ty.DimVar d
110                    val dd = Ty.ShapeVar dd
111                    in
112                      [Ty.T_String] --> Ty.T_Image{dim=d, shape=dd}
113                    end)),
114              (N.fn_pow,    ty([Ty.realTy, Ty.realTy] --> Ty.realTy)),
115    (*
116        val fn_principleEvec = Atom.atom "principleEvec"
117    *)
118              (N.fn_sin,    ty([Ty.realTy] --> Ty.realTy)),
119            (* kernels *)
120              (N.kn_bspln3, ty(Ty.T_Kernel(Ty.DiffConst 2))),
121              (N.kn_tent,   ty(Ty.T_Kernel(Ty.DiffConst 0)))
122            ]
123    
124        end (* local *)
125    end    end

Legend:
Removed from v.47  
changed lines
  Added in v.75

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