Mercurial > hg > may
changeset 235:619061a34099 sparse
Sparse enumerate
author | Chris Cannam |
---|---|
date | Sun, 19 May 2013 21:13:48 +0100 |
parents | 51c5ce72832e |
children | ccca84efa36a |
files | yetilab/matrix/matrix.yeti |
diffstat | 1 files changed, 40 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/yetilab/matrix/matrix.yeti Sun May 19 19:16:18 2013 +0100 +++ b/yetilab/matrix/matrix.yeti Sun May 19 21:13:48 2013 +0100 @@ -109,6 +109,33 @@ DenseCols (array (map vec.vector m)) fi; +enumerateSparse m = + (enumerate vv ix ptr jn n = + case vv of + v::rest: + { v, i = ix[n], j = jn } :. + if n + 1 >= head ptr + then \(enumerate rest ix (tail ptr) (jn + 1) (n + 1)) + else \(enumerate rest ix ptr jn (n + 1)) + fi; + _: []; + esac; + case m of + SparseCSC { values, rowi, colp, rows }: + enumerate (list values) rowi (list colp) 0 0; + SparseCSR { values, coli, rowp, rows }: + map do { i, j, v }: { i = j, j = i, v } done + (enumerate (list values) coli (list rowp) 0 0); + esac); + +makeSparse type data = + case type of + RowMajor (): + SparseCSR { values = vec.zeros 0, coli = array [], rowp = array [] }; + ColMajor (): + SparseCSC { values = vec.zeros 0, rowi = array [], colp = array [] }; + esac; + constMatrix n = generate do row col: n done; randomMatrix = generate do row col: Math#random() done; identityMatrix = constMatrix 1; @@ -124,12 +151,20 @@ esac; flipped m = - if isRowMajor? m then - generate do row col: getAt row col m done (size m); + if isSparse? m then + if isRowMajor? m then + makeSparse (ColMajor ()) (enumerateSparse m) + else + makeSparse (RowMajor ()) (enumerateSparse m) + fi else - transposed - (generate do row col: getAt col row m done - { rows = (width m), columns = (height m) }); + if isRowMajor? m then + generate do row col: getAt row col m done (size m); + else + transposed + (generate do row col: getAt col row m done + { rows = (width m), columns = (height m) }); + fi fi; toRowMajor m = @@ -160,15 +195,6 @@ equal = equal' vec.equal; -/*!!! not needed now it's immutable? -copyOf m = - (copyOfData d = (array (map vec.copyOf d)); - case m of - DenseRows d: DenseRows (copyOfData d); - DenseCols d: DenseCols (copyOfData d); - esac); -*/ - newMatrix type data = //!!! NB does not copy data (tagger = case type of RowMajor (): RowM; ColumnMajor (): DenseCols esac; if empty? data or vec.empty? (head data)