Changeset 31870 in project


Ignore:
Timestamp:
11/19/14 00:55:40 (5 years ago)
Author:
Ivan Raikov
Message:

signal-diagram: updates to sml-lib files

Location:
release/4/signal-diagram/trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • release/4/signal-diagram/trunk/signal-diagram.scm

    r31765 r31870  
    1111;;  Developed by the Yale Haskell Group.
    1212;;
    13 ;; Copyright 2010-2014 Ivan Raikov
     13;; Copyright 2010-2014 Ivan Raikov.
    1414;;
    1515;; This program is free software: you can redistribute it and/or
  • release/4/signal-diagram/trunk/sml-lib/tensor/sparse.mlb

    r29960 r31870  
    11$(SML_LIB)/basis/basis.mlb
    22$(SML_LIB)/basis/unsafe.mlb
     3$(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb
    34tensor.mlb
    45DynArray.sml
     6IntMap.sml
    57sparse.sml
    68
  • release/4/signal-diagram/trunk/sml-lib/tensor/sparse.sml

    r30871 r31870  
    11
    22(*
    3  Copyright 2013 Ivan Raikov.
     3 Copyright 2013-2014 Ivan Raikov.
    44 All rights reserved.
    55
     
    103103        structure Number : NUMBER
    104104        structure Index : SPARSE_INDEX
     105        structure Map : ORD_MAP
    105106
    106107        type index = Index.t
     108        type storage = Index.storage
    107109        type elem = Number.t
    108110
     
    118120        val fromGenerator : index -> ((index -> elem) * index * (index option)) -> matrix
    119121        val fromGeneratorList : index -> ({f: (index -> elem), fshape: index, offset: index} list) -> matrix
     122        val fromMapGenerator : index -> ((int -> elem Map.map) * storage * index * (index option)) -> matrix
    120123        val insert : matrix * matrix -> matrix
    121124
     
    278281    structure Number = RTensor.Number
    279282    structure Index = SparseIndex
     283    structure Map = IntMap
    280284
    281285    type index   = Index.t
     286    type storage = Index.storage
    282287    type nonzero = Index.nonzero
    283288    type elem    = Number.t
     
    431436                        Array.array(cols,NONE)
    432437                    val nzcount = ref 0
    433                     val _ = Tensor.Index.app (List.rev shape_a)
    434                                       (fn (i) =>
    435                                           let
    436                                               val v = Tensor.sub (a, i)
    437                                           in
    438                                               if not (Number.== (v, zero))
    439                                               then
    440                                                   let
    441                                                       val (irow,icol) = dimVals i
    442                                                       val colv  = Array.sub (data, icol)
    443                                                       (*val col' = (irow,v) :: col*)
    444                                                   in
    445                                                       (case colv of
    446                                                           SOME col =>
    447                                                           (DynArray.update(col,DynArray.length col,(irow,v)))
    448                                                         | NONE => Array.update (data, icol, SOME (DynArray.fromList [(irow,v)]));
    449                                                        nzcount := (!nzcount) + 1)
    450                                                   end
    451                                               else ()
    452                                           end)
     438                    val _ = Tensor.Index.app
     439                                (List.rev shape_a)
     440                                (fn (i) =>
     441                                    let
     442                                        val v = Tensor.sub (a, i)
     443                                    in
     444                                        if not (Number.== (v, zero))
     445                                        then
     446                                            let
     447                                                val (irow,icol) = dimVals i
     448                                                val colv  = Array.sub (data, icol)
     449                                            (*val col' = (irow,v) :: col*)
     450                                            in
     451                                                (case colv of
     452                                                     SOME col =>
     453                                                     (DynArray.update(col,DynArray.length col,(irow,v)))
     454                                                   | NONE => Array.update (data, icol, SOME (DynArray.fromList [(irow,v)]));
     455                                                 nzcount := (!nzcount) + 1)
     456                                            end
     457                                        else ()
     458                                    end)
    453459                    val data'   = Tensor.Array.array (!nzcount, zero)
    454460                    val indices = IntArray.array (!nzcount, 0)
     
    480486                        Array.array(rows,NONE)
    481487                    val nzcount = ref 0
    482                     val _ = Tensor.Index.app shape_a
    483                                               (fn (i) =>
    484                                                   let
    485                                                       val v = Tensor.sub (a, i)
    486                                                   in
    487                                                       if not (Number.== (v, zero))
    488                                                       then
    489                                                           let
    490                                                               val (irow,icol) = dimVals i
    491                                                               val rowv  = Array.sub (data, irow)
    492                                                               (*val row' = (icol,v) :: row*)
    493                                                           in
    494                                                               (case rowv of
    495                                                                    (*Array.update(data,irow,row');*)
    496                                                                    SOME row => DynArray.update (row,DynArray.length row,(icol,v))
    497                                                                  | NONE => Array.update (data, irow, SOME (DynArray.fromList [(icol,v)]));
    498                                                                nzcount := (!nzcount) + 1)
    499                                                           end
    500                                                       else ()
    501                                                   end)
     488                    val _ =
     489                        Tensor.Index.app
     490                            shape_a
     491                            (fn (i) =>
     492                                let
     493                                    val v = Tensor.sub (a, i)
     494                                in
     495                                    if not (Number.== (v, zero))
     496                                    then
     497                                        let
     498                                            val (irow,icol) = dimVals i
     499                                            val rowv  = Array.sub (data, irow)
     500                                        (*val row' = (icol,v) :: row*)
     501                                        in
     502                                            (case rowv of
     503                                                 (*Array.update(data,irow,row');*)
     504                                                 SOME row => DynArray.update (row,DynArray.length row,(icol,v))
     505                                               | NONE => Array.update (data, irow, SOME (DynArray.fromList [(icol,v)]));
     506                                             nzcount := (!nzcount) + 1)
     507                                        end
     508                                    else ()
     509                                end)
    502510                    val data'   = Tensor.Array.array (!nzcount, zero)
    503511                    val indices = IntArray.array (!nzcount, 0)
     
    595603                        Array.array(rows,NONE)
    596604                    val nzcount = ref 0
    597                     val _ = Tensor.Index.app fshape
    598                                               (fn (i) =>
    599                                                   let
    600                                                       val v = f (i)
    601                                                   in
    602                                                       if not (Number.== (v, zero))
    603                                                       then
    604                                                           let
    605                                                               val (irow,icol) = dimVals i
    606                                                               val rowv  = Array.sub (data, irow)
    607                                                           in
    608                                                               (case rowv of
    609                                                                    SOME row => DynArray.update (row,DynArray.length row,(icol,v))
    610                                                                  | NONE => Array.update (data, irow, SOME (DynArray.fromList [(icol,v)]));
    611                                                                nzcount := (!nzcount) + 1)
    612                                                           end
    613                                                       else ()
    614                                                   end)
     605                    val _ = Tensor.Index.app
     606                                fshape
     607                                (fn (i) =>
     608                                    let
     609                                        val v = f (i)
     610                                    in
     611                                        if not (Number.== (v, zero))
     612                                        then
     613                                            let
     614                                                val (irow,icol) = dimVals i
     615                                                val rowv  = Array.sub (data, irow)
     616                                            in
     617                                                (case rowv of
     618                                                     SOME row => DynArray.update (row,DynArray.length row,(icol,v))
     619                                                   | NONE => Array.update (data, irow, SOME (DynArray.fromList [(icol,v)]));
     620                                                 nzcount := (!nzcount) + 1)
     621                                            end
     622                                        else ()
     623                                    end)
    615624                    val data'   = Tensor.Array.array (!nzcount, zero)
    616625                    val indices = IntArray.array (!nzcount, 0)
     
    639648
    640649
     650    fun fromMapGenerator shape (f: int -> elem Map.map, forder, fshape, offset) =
     651        (let
     652             val (rows,cols) = dimVals fshape
     653        in
     654            case Index.order of
     655                Index.CSC =>
     656                let
     657                    val nzcount = ref 0
     658                    val columnData: ((elem Map.map) option) Array.array  =
     659                        Array.array(cols,NONE)
     660
     661                    val _  =
     662                        case forder of
     663                            Index.CSC =>
     664                            Loop.app
     665                                (0, cols,
     666                                 (fn (icol) =>
     667                                     let
     668                                         val m = f icol
     669                                     in
     670                                         if not (Map.isEmpty m)
     671                                         then (Array.update (columnData,icol,SOME m);
     672                                               nzcount := (!nzcount) + Map.numItems (m))
     673                                         else ()
     674                                     end))
     675                            | Index.CSR =>
     676                            Loop.app
     677                                (0, rows,
     678                                 (fn (irow) =>
     679                                     let
     680                                         val m = f irow
     681                                     in
     682                                         IntMap.appi
     683                                             (fn (colind,v) =>
     684                                                 case Array.sub (columnData,colind) of
     685                                                     SOME m' =>
     686                                                     (let val m'' = Map.insert(m',irow,v)
     687                                                      in
     688                                                          Array.update (columnData,colind,SOME m'');
     689                                                          nzcount := (!nzcount) + 1
     690                                                      end)
     691                                                   | NONE => (Array.update (columnData,colind,
     692                                                                            SOME (IntMap.singleton(irow,v)));
     693                                                              nzcount := (!nzcount) + 1))
     694                                             m
     695                                     end))
     696
     697                    val data    = Tensor.Array.array (!nzcount, zero)
     698                    val indices = IntArray.array (!nzcount, 0)
     699                    val indptr  = IntArray.array (cols, 0)
     700                    val update  = IntArray.update
     701                    val fi      = Array.foldli
     702                                      (fn (n,SOME cols,i) =>
     703                                          let
     704                                              val i' = IntMap.foldri
     705                                                           (fn (rowind,v,i) =>
     706                                                               (Tensor.Array.update (data,i,v);
     707                                                                update (indices,i,rowind);
     708                                                                i+1))
     709                                                           i cols
     710                                          in
     711                                              (update (indptr,n,i); i')
     712                                          end
     713                                      | (n,NONE,i) => (update (indptr,n,i); i))
     714                                      0 columnData
     715                in
     716                    {shape=shape,
     717                     blocks=[SPARSE {offset=case offset of NONE => [0, 0] | SOME i => i,
     718                                     shape=fshape, nz={ indptr= indptr, indices=indices },
     719                                     data=data}]}
     720                end
     721              | Index.CSR =>
     722                let
     723
     724                    val nzcount = ref 0
     725                    val rowData: ((elem Map.map) option) Array.array  =
     726                        Array.array(cols,NONE)
     727
     728                    val _  =
     729                        case forder of
     730                            Index.CSR =>
     731                            Loop.app
     732                            (0, rows,
     733                             (fn (irow) =>
     734                                 let
     735                                     val m = f irow
     736                                 in
     737                                     if not (Map.isEmpty m)
     738                                     then (Array.update (rowData,irow,SOME m);
     739                                           nzcount := (!nzcount) + Map.numItems (m))
     740                                     else ()
     741                                 end))
     742                            | Index.CSC =>
     743                              Loop.app
     744                                (0, cols,
     745                                 (fn (icol) =>
     746                                     let
     747                                         val m = f icol
     748                                     in
     749                                         IntMap.appi
     750                                             (fn (rowind,v) =>
     751                                                 case Array.sub (rowData,rowind) of
     752                                                     SOME m' =>
     753                                                     (let val m'' = Map.insert(m',icol,v)
     754                                                      in
     755                                                          Array.update (rowData,rowind,SOME m'');
     756                                                          nzcount := (!nzcount) + 1
     757                                                      end)
     758                                                   | NONE => (Array.update (rowData,rowind,
     759                                                                            SOME (IntMap.singleton(icol,v)));
     760                                                              nzcount := (!nzcount) + 1))
     761                                             m
     762                                     end))
     763
     764                    val data    = Tensor.Array.array (!nzcount, zero)
     765                    val indices = IntArray.array (!nzcount, 0)
     766                    val indptr  = IntArray.array (rows, 0)
     767                    val update  = IntArray.update
     768                    val fi      = Array.foldli
     769                                      (fn (n,SOME rows,i) =>
     770                                          let
     771                                              val i' = IntMap.foldri
     772                                                           (fn (colind,v,i) =>
     773                                                               (Tensor.Array.update (data,i,v);
     774                                                                update (indices,i,colind);
     775                                                                i+1))
     776                                                           i rows
     777                                          in
     778                                              (update (indptr,n,i); i')
     779                                          end
     780                                      | (n,NONE,i) => (update (indptr,n,i); i))
     781                                      0 rowData
     782                in
     783                    {shape=shape,
     784                     blocks=[SPARSE {offset = case offset of NONE => [0,0] | SOME i => i,
     785                                     shape=fshape, nz={ indptr= indptr, indices=indices }, data=data}]}
     786                end
     787        end)
     788
     789
     790
    641791    fun insertBlock ({shape, blocks},b',boffset) =
    642792        let
     
    704854       {tensor,offset=[xoffset,yoffset],sparse) ...
    705855
    706      where xoffset and yoffset are the positions where to insert the
    707      given tensor. The tensors to be inserted must be non-overlapping.
    708      sparse is a boolean flag that indicates whether the tensor should
    709      be converted to sparse form.
     856      where xoffset and yoffset are the positions where to insert the
     857      given tensor. The tensors to be inserted must be non-overlapping.
     858      sparse is a boolean flag that indicates whether the tensor should
     859      be converted to sparse form.
    710860    *)
    711861
     
    738888                 end)
    739889                 (fromGenerator shape (f,fshape,SOME offset)) rst)
     890            | _ => raise Match
     891
     892    fun fromMapGeneratorList shape (gg: ({f: int -> elem Map.map, forder: storage, fshape: index, offset: index}) list) =
     893        case gg of
     894            ({f,forder,fshape,offset}::rst) =>
     895            (List.foldl
     896                 (fn ({f,forder,fshape,offset},S) =>
     897                     let
     898                         val {shape=_, blocks=bs} = fromMapGenerator shape (f,forder,fshape,SOME offset)
     899                         val b': block = case bs of
     900                                             [b] => b
     901                                           | _ => raise Match
     902                     in
     903                         insertBlock (S,b',offset)
     904                 end)
     905                 (fromMapGenerator shape (f,forder,fshape,SOME offset)) rst)
    740906            | _ => raise Match
    741907
  • release/4/signal-diagram/trunk/sml-lib/tensor/sparsetest.mlb

    r29960 r31870  
    44tensor.mlb
    55DynArray.sml
     6IntMap.sml
    67sparse.sml
    78sparsetest.sml
  • release/4/signal-diagram/trunk/sml-lib/tensor/sparsetest.sml

    r29960 r31870  
    3939    end
    4040
     41val _ = putStrLn TextIO.stdOut "SparseMatrix fromMapGenerator (CSC):"
     42
     43val seed   = Random.rand (13,17)
     44val prob   = 0.1
     45val SA     = SparseMatrix.fromMapGenerator
     46                 [10,10]
     47                 (fn (i) => foldl (fn((k,v),m) => IntMap.insert'((k,v),m))
     48                                  IntMap.empty
     49                                  (List.filter
     50                                       (fn(j,r) => Real.>= (r, prob))
     51                                       (List.tabulate (4, (fn(j) => (j,Random.randReal seed))))),
     52                  SparseMatrix.Index.CSC,
     53                  [4,4],
     54                  SOME [5,5])
     55
     56val _ = Loop.app
     57            (0,10,fn (i) =>
     58                    let
     59                        val _ = putStrLn TextIO.stdOut ("SparseMatrix slice column " ^ (Int.toString i) ^ ": ")
     60                        val sl = SparseMatrix.slice (SA,1,i)
     61                    in
     62                        SparseMatrix.sliceAppi
     63                            (fn (i,x) => putStrLn TextIO.stdOut ("[" ^ (Int.toString i) ^ "]: " ^ (Real.toString x)))
     64                            sl
     65                    end)
     66
     67val _ = Loop.app
     68            (0,10,fn (i) =>
     69                    let
     70                        val _ = putStrLn TextIO.stdOut ("SparseMatrix slice row " ^ (Int.toString i) ^ ": ")
     71                        val sl = SparseMatrix.slice (SA,0,i)
     72                    in
     73                        SparseMatrix.sliceAppi
     74                            (fn (i,x) => putStrLn TextIO.stdOut ("[" ^ (Int.toString i) ^ "]: " ^ (Real.toString x)))
     75                            sl
     76                    end)
     77
     78val _ = SparseMatrix.appi
     79            (fn (i,v) => (putStr TextIO.stdOut "SA[";
     80                          TensorFile.listLineWrite Int.toString TextIO.stdOut i;
     81                          putStrLn TextIO.stdOut ("]: " ^ (Real.toString v))))
     82            SA
     83
     84
     85val _ = putStrLn TextIO.stdOut "SparseMatrix fromMapGenerator (CSR):"
     86
     87val seed   = Random.rand (13,17)
     88val prob   = 0.1
     89val SA     = SparseMatrix.fromMapGenerator
     90                 [10,10]
     91                 (fn (i) => foldl (fn((k,v),m) => IntMap.insert'((k,v),m))
     92                                  IntMap.empty
     93                                  (List.filter
     94                                       (fn(j,r) => Real.>= (r, prob))
     95                                       (List.tabulate (4, (fn(j) => (j,Random.randReal seed))))),
     96                  SparseMatrix.Index.CSR,
     97                  [4,4],
     98                  SOME [5,5])
     99
     100val _ = Loop.app
     101            (0,10,fn (i) =>
     102                    let
     103                        val _ = putStrLn TextIO.stdOut ("SparseMatrix slice column " ^ (Int.toString i) ^ ": ")
     104                        val sl = SparseMatrix.slice (SA,1,i)
     105                    in
     106                        SparseMatrix.sliceAppi
     107                            (fn (i,x) => putStrLn TextIO.stdOut ("[" ^ (Int.toString i) ^ "]: " ^ (Real.toString x)))
     108                            sl
     109                    end)
     110
     111val _ = Loop.app
     112            (0,10,fn (i) =>
     113                    let
     114                        val _ = putStrLn TextIO.stdOut ("SparseMatrix slice row " ^ (Int.toString i) ^ ": ")
     115                        val sl = SparseMatrix.slice (SA,0,i)
     116                    in
     117                        SparseMatrix.sliceAppi
     118                            (fn (i,x) => putStrLn TextIO.stdOut ("[" ^ (Int.toString i) ^ "]: " ^ (Real.toString x)))
     119                            sl
     120                    end)
     121
     122val _ = SparseMatrix.appi
     123            (fn (i,v) => (putStr TextIO.stdOut "SA[";
     124                          TensorFile.listLineWrite Int.toString TextIO.stdOut i;
     125                          putStrLn TextIO.stdOut ("]: " ^ (Real.toString v))))
     126            SA
     127
    41128val _ = putStrLn TextIO.stdOut "SparseMatrix fromGenerator:"
    42129
     
    59146                    end)
    60147
     148val _ = Loop.app
     149            (0,10,fn (i) =>
     150                    let
     151                        val _ = putStrLn TextIO.stdOut ("SparseMatrix slice row " ^ (Int.toString i) ^ ": ")
     152                        val sl = SparseMatrix.slice (SA,0,i)
     153                    in
     154                        SparseMatrix.sliceAppi
     155                            (fn (i,x) => putStrLn TextIO.stdOut ("[" ^ (Int.toString i) ^ "]: " ^ (Real.toString x)))
     156                            sl
     157                    end)
     158
     159val _ = SparseMatrix.appi
     160            (fn (i,v) => (putStr TextIO.stdOut "SA[";
     161                          TensorFile.listLineWrite Int.toString TextIO.stdOut i;
     162                          putStrLn TextIO.stdOut ("]: " ^ (Real.toString v))))
     163            SA
    61164
    62165val _ = putStrLn TextIO.stdOut "SparseMatrix fromTensor:"
     
    110213                    end)
    111214
    112 val blocks = #blocks SA
    113215
    114216val _ = putStrLn TextIO.stdOut "SparseMatrix fromTensorList:"
     
    129231             ]
    130232
    131 val blocks = #blocks SB
    132233val _ = Loop.app
    133234            (0,10,fn (j) =>
    134235                    Loop.app (0,10,fn (i) =>
    135236                                     (
    136                                       print ("SA(" ^ (Int.toString i) ^ "," ^ (Int.toString j) ^ ") = ");
     237                                      print ("SB(" ^ (Int.toString i) ^ "," ^ (Int.toString j) ^ ") = ");
    137238                                      TensorFile.realWrite
    138239                                          (TextIO.stdOut)
     
    151252                            sl
    152253                    end)
     254
     255val SC = SparseMatrix.*> 2.0 SB
     256
     257val _ = Loop.app
     258            (0,10,fn (j) =>
     259                    Loop.app (0,10,fn (i) =>
     260                                     (
     261                                      print ("SC(" ^ (Int.toString i) ^ "," ^ (Int.toString j) ^ ") = ");
     262                                      TensorFile.realWrite
     263                                          (TextIO.stdOut)
     264                                          (SparseMatrix.sub (SC,[i,j]))
     265                                     )
     266            ))
Note: See TracChangeset for help on using the changeset viewer.