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

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

9ML-toolkit: additions to electrical synapses infrastructure

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