source: project/release/4/9ML-toolkit/trunk/templates/Sim.sml.tmpl @ 29944

Last change on this file since 29944 was 29944, checked in by Ivan Raikov, 7 years ago

9ML-toolkit: separating the network code generation templates into those supporting electrical synapses and those that do not

File size: 5.2 KB
Line 
1(*
2 
3val _ =
4    let
5        val tasks =
6            List.tabulate
7                (Ntasks,
8                 fn (i) =>
9                 let
10                     val prio = Int.mod (Random.randNat seed, Nprio)
11                     val r  = Real.fromInt i
12                 in
13                     (prio, r)
14                 end)
15                                     
16        val pq = foldl PQ.insert PQ.empty tasks
17        (* or val pq = PQ.fromList tasks *)
18
19        fun aux pq' =
20            case PQ.next pq' of
21                NONE => ()
22              | SOME ((prio, r), pq'') => (
23                  print (Int.toString prio ^ ", " ^ (Real.toString r) ^ "\n");
24                  aux pq''
25              )
26    in
27        aux pq
28    end
29*)
30
31structure Sim{{group.name}} =
32struct
33
34fun putStrLn out str =
35    (TextIO.output (out, str);
36     TextIO.output (out, "\n"))
37   
38fun putStr out str =
39    (TextIO.output (out, str))
40   
41   
42fun showBoolean b = (if b then "1" else "0")
43                   
44                   
45fun showReal n =
46    let open StringCvt
47        open Real
48    in
49        (if n < 0.0 then "-" else "") ^ (fmt (FIX (SOME 12)) (abs n))
50    end
51
52
53exception Index
54
55fun start (tmax, N, S, D, E, Pn, initial_vector, psr_initial_vector, frun, fresponse, ftime, fspikes, finfo, out) =
56
57let
58    val I0 = RTensor.new([N,1],0.0)
59
60    val sub = Unsafe.Real64Array.sub
61    val isub = Unsafe.IntArray.sub
62    val update = Unsafe.Real64Array.update
63
64       
65    fun netrun (I::D,state_vector,psr_state_vector) =
66        let
67           
68            val (I',psr_state_vector_i)  = fresponse I psr_state_vector
69           
70            val state_vector_i = frun I' state_vector
71
72            val t_i = ftime state_vector_i
73
74            val (spike_i, log_spike_i) = fspikes state_vector_i
75               
76            val _   = finfo (state_vector_i, out)
77                             
78            val I''  = if (List.null spike_i)
79                        then NONE
80                        else SOME
81                                 (let
82                                      val T = Real64Array.array (N, 0.0)
83                                  in
84                                      List.app
85                                          (fn (W) =>
86                                              List.app
87                                                  (fn (i,nv) =>
88                                                      let
89                                                          val sl = SparseMatrix.slice (W,1,i)
90                                                      in
91                                                          SparseMatrix.sliceAppi
92                                                              (fn (i,x) => update (T,i,Real.+ (Real.* (nv,x), sub(T,i))))
93                                                              sl
94                                                      end)
95                                                  spike_i)
96                                          S;
97                                      RTensor.fromArray ([N,1], T)
98                                  end)
99
100            val _ = if not (List.null log_spike_i)
101                    then (putStr out ((showReal t_i) ^ " ");
102                          TensorFile.intListLineWrite out (List.map (fn (i,n) => (i+1)) log_spike_i))
103                    else (putStrLn out ("# " ^ (showReal t_i)))
104                         
105        in
106            if t_i  > tmax
107            then (putStrLn out "# All done!"; state_vector_i)
108            else netrun (D@[I''],state_vector_i,psr_state_vector_i)
109        end
110      | netrun ([],state_vector,psr_state_vector) = raise Index
111in
112    netrun (D,initial_vector,psr_initial_vector)
113end
114
115fun timing (action) =
116    let
117        val timer = Timer.startCPUTimer ()
118        val result = action ()
119        val times = Timer.checkCPUTimer timer
120    in
121        (result, Time.+ (#usr times, #sys times))
122    end
123
124fun main (name,args) =
125    let
126        open {{group.name}}
127        fun finfo (_,out) = ()
128    in
129        (let
130            val     _ = putStrLn TextIO.stdOut ("starting fprojection...")
131            val ((S,E),t) = timing fevent_projection
132            val     _ = putStrLn TextIO.stdOut ("fprojection took " ^ (Time.toString t) ^ " s")
133            val out   = TextIO.openOut (label ^ ".dat")
134        in
135            List.app (fn (s) => putStrLn out ("# " ^ s))
136                     ([
137                         label,
138                         {% for p in dict (group.properties) %}
139                         ("{{p.name}} = {{p.value.exprML}}"){% if not loop.last %},{% endif %}
140                         {% endfor %}
141                     ]);
142            let
143                val _     = putStrLn TextIO.stdOut ("starting simulation...")
144                val (_,t) = timing (fn () => start (1200.0, N, S, E, D, Pn, initial, psr_initial, frun, fresponse, ftime, fspikes, finfo, out))
145            in
146                putStrLn TextIO.stdOut ("simulation took " ^ (Time.toString t) ^ " s")
147            end;
148           
149            TextIO.flushOut (out);
150            TextIO.closeOut (out)
151        end)
152    end
153   
154
155end
156
157val _ = let val name = CommandLine.name()
158            val args = CommandLine.arguments()
159            val env  = Posix.ProcEnv.environ()
160        in
161            Sim{{group.name}}.main (name, args)
162        end
Note: See TracBrowser for help on using the repository browser.