source: project/release/4/9ML-toolkit/trunk/sml-lib/nodegraph.sml @ 29995

Last change on this file since 29995 was 29995, checked in by Ivan Raikov, 8 years ago

9ML-toolkit: added SML support libraries

File size: 2.2 KB
Line 
1(* Electrical synapses graph structure *)
2
3
4signature NODE_GRAPH =
5sig
6    type index = int
7    type rangemap = {localStart: int, localEnd: int, globalStart: int} list
8
9    val nodeGraph : (string * SparseMatrix.matrix * rangemap) -> 
10                    (index, real, unit) Graph.graph
11                   
12    val junctionMatrix : ((index, real, unit) Graph.graph) -> SparseMatrix.matrix
13
14
15end
16
17structure NodeGraph: NODE_GRAPH =
18struct
19
20type index    = int
21type rangemap = {localStart: int, localEnd: int, globalStart: int} list
22
23exception Index
24
25fun nodeGraph (modelname, S, rangemap) =
26    let
27        fun mapIndex m i = case List.find (fn {localStart,localEnd,globalStart} => 
28                                              (i >= localStart andalso i < localEnd)) m of
29                               SOME ({localStart,localEnd,globalStart}) => globalStart + (i-localStart)
30                             | NONE => raise Index
31       
32        val [N,_] = SparseMatrix.shape S
33       
34        val G as Graph.GRAPH g = 
35            DirectedGraph.graph(modelname,(),N) :
36            (index,real,unit) Graph.graph
37
38        val idxs  = List.tabulate (N, fn (i) => i)
39        val gidxs = List.tabulate (N, fn (i) => mapIndex rangemap i)
40
41        val _ = ListPair.app (#add_node g) (gidxs,idxs)
42
43        val add_edge = #add_edge g
44
45        val _ = List.app
46                    (fn (s) => 
47                        let
48                            val sl = SparseMatrix.slice (S,1,s)
49                        in
50                            SparseMatrix.sliceAppi
51                                (fn (t,v) => add_edge (mapIndex rangemap s, mapIndex rangemap t,v))
52                                sl
53                        end)
54                    idxs
55
56    in
57        G
58    end
59
60
61fun junctionMatrix (Graph.GRAPH g) =
62    let
63        fun nodeCoeffs n = 
64            let
65                val out  = (#out_edges g) n
66                val self = Real.- (~1.0, foldl (fn ((s,t,v),ax) => Real.+(v,ax)) 0.0 out)
67            in
68                (n, (n,self) :: (map (fn (s,t,v) => (t,v)) out))
69            end
70
71        val lst = ref []
72           
73    in
74        ((#forall_nodes g) (fn (n,_) => (lst := ((nodeCoeffs n) :: !lst)));
75         SparseMatrix.fromLists (!lst))
76    end
77   
78
79
80end
Note: See TracBrowser for help on using the repository browser.