accelerate-arithmetic 0.0.1 → 0.1
raw patch · 14 files changed
+533/−919 lines, 14 filesdep −accelerate-cudadep −cublasdep −cudadep ~QuickCheckdep ~acceleratedep ~basePVP ok
version bump matches the API change (PVP)
Dependencies removed: accelerate-cuda, cublas, cuda, hmatrix, pooled-io, random, timeit
Dependency ranges changed: QuickCheck, accelerate, base, utility-ht
API changes (from Hackage documentation)
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: accDivMod :: Integral a => a -> a -> (a, a)
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: columnFromVector :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: extrudeMatrix :: (Shape ix, Slice ix, Elt a) => Exp ix -> Matrix Z a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: extrudeVector :: (Shape ix, Slice ix, Elt a) => Exp ix -> Vector Z a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: flattenMatrix :: (Slice ix, Shape ix, Elt a) => Matrix ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: flattenMatrixBackPermute :: (Slice ix, Shape ix, Elt a) => Matrix ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: flattenMatrixReshape :: (Slice ix, Shape ix, Elt a) => Matrix ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: gatherFromVector :: (Shape ix, Elt a) => Scalar ix Int -> Vector Z a -> Scalar ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: identity :: (Shape ix, Slice ix, IsNum a, Elt a) => Exp ((ix :. Int) :. Int) -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: matrixShape :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> (Exp ix :. Exp Int) :. Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: multiplyMatrixMatrix :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Matrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: multiplyMatrixVector :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Vector ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: newtonInverse :: (Shape ix, Slice ix, IsNum a, Elt a) => Exp Int -> Matrix ix a -> Matrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: newtonInverseStep :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Matrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: numCols :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: numElems :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: numRows :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: outer :: (Shape ix, Slice ix, IsNum a, Elt a) => Vector ix a -> Vector ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: restoreMatrix :: (Slice ix, Shape ix, Elt a) => Exp Int -> Vector ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: restoreMatrixBackPermute :: (Slice ix, Shape ix, Elt a) => Exp Int -> Vector ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: restoreMatrixReshape :: (Slice ix, Shape ix, Elt a) => Exp Int -> Vector ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: scaleRows :: (Slice ix, Shape ix, Elt a, IsNum a) => Vector ix a -> Matrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: swapIndex :: (Exp ix :. Exp Int) :. Exp Int -> (Exp ix :. Exp Int) :. Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: transpose :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: type Matrix ix a = Acc (Array ((ix :. Int) :. Int) a)
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: type Scalar ix a = Acc (Array ix a)
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: type Vector ix a = Acc (Array (ix :. Int) a)
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: vectorFromColumn :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: vectorShape :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Exp ix :. Exp Int
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: withMatrixIndex :: (Shape ix, Slice ix, Lift Exp a) => ((Exp ix :. Exp Int) :. Exp Int -> a) -> (Exp ((ix :. Int) :. Int) -> Exp (Plain a))
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: withVectorIndex :: (Shape ix, Slice ix, Lift Exp a) => (Exp ix :. Exp Int -> a) -> (Exp (ix :. Int) -> Exp (Plain a))
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: zipExtrudedMatrixWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Matrix Z a -> Matrix ix b -> Matrix ix c
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: zipExtrudedVectorWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Vector Z a -> Vector ix b -> Vector ix c
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: zipScalarMatrixWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Scalar ix a -> Matrix ix b -> Matrix ix c
- Data.Array.Accelerate.Arithmetic.LinearAlgebra: zipScalarVectorWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Scalar ix a -> Vector ix b -> Vector ix c
- Data.Array.Accelerate.Arithmetic.Sparse: ColumnMatrix :: Exp Int -> Matrix ix (Int, a) -> ColumnMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: RowMatrix :: Exp Int -> Matrix ix (Int, a) -> RowMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: columnMatrix :: ColumnMatrix ix a -> Matrix ix (Int, a)
- Data.Array.Accelerate.Arithmetic.Sparse: data ColumnMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: data RowMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: matchMatrices :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix (Int, a) -> Matrix ix (Int, a) -> Matrix (ix :. Int) ((Int, Int), a)
- Data.Array.Accelerate.Arithmetic.Sparse: multiplyColumnMatrixVector :: (Shape ix, Slice ix, IsNum a, Elt a) => ColumnMatrix ix a -> Vector ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.Sparse: multiplyMatrixMatrix :: (Shape ix, Slice ix, IsNum a, Elt a) => ColumnMatrix ix a -> RowMatrix ix a -> Matrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: multiplyRowMatrixVector :: (Shape ix, Slice ix, IsNum a, Elt a) => RowMatrix ix a -> Vector ix a -> Vector ix a
- Data.Array.Accelerate.Arithmetic.Sparse: numCols :: RowMatrix ix a -> Exp Int
- Data.Array.Accelerate.Arithmetic.Sparse: numRows :: ColumnMatrix ix a -> Exp Int
- Data.Array.Accelerate.Arithmetic.Sparse: realIndex :: (Shape ix, Slice ix, Elt a) => Matrix ix (Int, a) -> Matrix ix (ix :. Int)
- Data.Array.Accelerate.Arithmetic.Sparse: rowMatrix :: RowMatrix ix a -> Matrix ix (Int, a)
- Data.Array.Accelerate.Arithmetic.Sparse: scaleRowRows :: (Slice ix, Shape ix, Elt a, IsNum a) => Vector ix a -> RowMatrix ix a -> RowMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: transposeColumnMatrix :: (Shape ix, Slice ix, IsNum a, Elt a) => ColumnMatrix ix a -> RowMatrix ix a
- Data.Array.Accelerate.Arithmetic.Sparse: transposeRowMatrix :: (Shape ix, Slice ix, IsNum a, Elt a) => RowMatrix ix a -> ColumnMatrix ix a
+ Data.Array.Accelerate.LinearAlgebra: columnFromVector :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: extrudeMatrix :: (Shape ix, Slice ix, Elt a) => Exp ix -> Matrix Z a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: extrudeVector :: (Shape ix, Slice ix, Elt a) => Exp ix -> Vector Z a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra: flattenMatrix :: (Slice ix, Shape ix, Elt a) => Matrix ix a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra: gatherFromVector :: (Shape ix, Elt a) => Scalar ix Int -> Vector Z a -> Scalar ix a
+ Data.Array.Accelerate.LinearAlgebra: identity :: (Shape ix, Slice ix, IsNum a, Elt a) => Exp ((ix :. Int) :. Int) -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: matrixShape :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> (Exp ix :. Exp Int) :. Exp Int
+ Data.Array.Accelerate.LinearAlgebra: multiplyMatrixMatrix :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Matrix ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: multiplyMatrixVector :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Vector ix a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra: newtonInverse :: (Shape ix, Slice ix, IsNum a, Elt a) => Exp Int -> Matrix ix a -> Matrix ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: newtonInverseStep :: (Shape ix, Slice ix, IsNum a, Elt a) => Matrix ix a -> Matrix ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: numCols :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Exp Int
+ Data.Array.Accelerate.LinearAlgebra: numElems :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Exp Int
+ Data.Array.Accelerate.LinearAlgebra: numRows :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Exp Int
+ Data.Array.Accelerate.LinearAlgebra: outer :: (Shape ix, Slice ix, IsNum a, Elt a) => Vector ix a -> Vector ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: restoreMatrix :: (Slice ix, Shape ix, Elt a) => Exp Int -> Vector ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: scaleRows :: (Slice ix, Shape ix, Elt a, IsNum a) => Vector ix a -> Matrix ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: transpose :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra: type Matrix ix a = Acc (Array ((ix :. Int) :. Int) a)
+ Data.Array.Accelerate.LinearAlgebra: type Scalar ix a = Acc (Array ix a)
+ Data.Array.Accelerate.LinearAlgebra: type Vector ix a = Acc (Array (ix :. Int) a)
+ Data.Array.Accelerate.LinearAlgebra: vectorFromColumn :: (Shape ix, Slice ix, Elt a) => Matrix ix a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra: vectorShape :: (Shape ix, Slice ix, Elt a) => Vector ix a -> Exp ix :. Exp Int
+ Data.Array.Accelerate.LinearAlgebra: withMatrixIndex :: (Shape ix, Slice ix, Lift Exp a) => ((Exp ix :. Exp Int) :. Exp Int -> a) -> (Exp ((ix :. Int) :. Int) -> Exp (Plain a))
+ Data.Array.Accelerate.LinearAlgebra: withVectorIndex :: (Shape ix, Slice ix, Lift Exp a) => (Exp ix :. Exp Int -> a) -> (Exp (ix :. Int) -> Exp (Plain a))
+ Data.Array.Accelerate.LinearAlgebra: zipExtrudedMatrixWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Matrix Z a -> Matrix ix b -> Matrix ix c
+ Data.Array.Accelerate.LinearAlgebra: zipExtrudedVectorWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Vector Z a -> Vector ix b -> Vector ix c
+ Data.Array.Accelerate.LinearAlgebra: zipScalarMatrixWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Scalar ix a -> Matrix ix b -> Matrix ix c
+ Data.Array.Accelerate.LinearAlgebra: zipScalarVectorWith :: (Slice ix, Shape ix, Elt a, Elt b, Elt c) => (Exp a -> Exp b -> Exp c) -> Scalar ix a -> Vector ix b -> Vector ix c
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Banded: Symmetric :: (Matrix ix a) -> Symmetric ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Banded: flattenSymmetric :: (Slice ix, Shape ix, Elt a, IsNum a) => Symmetric ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Banded: newtype Symmetric ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: Columns :: Exp Int -> Matrix ix (Int, a) -> Columns ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: Rows :: Exp Int -> Matrix ix (Int, a) -> Rows ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: columnMatrix :: Columns ix a -> Matrix ix (Int, a)
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: data Columns ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: data Rows ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: multiplyColumnsRows :: (Shape ix, Slice ix, IsNum a, Elt a) => Columns ix a -> Rows ix a -> Matrix ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: multiplyColumnsVector :: (Shape ix, Slice ix, IsNum a, Elt a) => Columns ix a -> Vector ix a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: multiplyRowsVector :: (Shape ix, Slice ix, IsNum a, Elt a) => Rows ix a -> Vector ix a -> Vector ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: numCols :: Rows ix a -> Exp Int
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: numRows :: Columns ix a -> Exp Int
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: realBandedGramian :: (Shape ix, Slice ix, IsNum a, Elt a) => Exp Int -> Rows ix a -> Symmetric ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: rowMatrix :: Rows ix a -> Matrix ix (Int, a)
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: scaleRowRows :: (Slice ix, Shape ix, Elt a, IsNum a) => Vector ix a -> Rows ix a -> Rows ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: transposeColumns :: (Shape ix, Slice ix, IsNum a, Elt a) => Columns ix a -> Rows ix a
+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse: transposeRows :: (Shape ix, Slice ix, IsNum a, Elt a) => Rows ix a -> Columns ix a
- Data.Array.Accelerate.Arithmetic.Interpolation: sampleBasisFunctions13 :: (Slice ix, Shape ix, Elt a, IsFloating a, Num a) => Interpolator13 (Exp a) -> Vector Z a -> Vector ix a -> RowMatrix ix a
+ Data.Array.Accelerate.Arithmetic.Interpolation: sampleBasisFunctions13 :: (Slice ix, Shape ix, Elt a, IsFloating a, Num a) => Interpolator13 (Exp a) -> Vector Z a -> Vector ix a -> Rows ix a
Files
- accelerate-arithmetic.cabal +15/−33
- benchmark/CUBLASBatched.hs +0/−269
- benchmark/NewtonInverse.hs +0/−224
- private/Data/Array/Accelerate/LinearAlgebra/Private.hs +254/−0
- src/Data/Array/Accelerate/Arithmetic/Example.hs +8/−8
- src/Data/Array/Accelerate/Arithmetic/Interpolation.hs +5/−5
- src/Data/Array/Accelerate/Arithmetic/LinearAlgebra.hs +0/−254
- src/Data/Array/Accelerate/Arithmetic/Sparse.hs +0/−115
- src/Data/Array/Accelerate/LinearAlgebra.hs +35/−0
- src/Data/Array/Accelerate/LinearAlgebra/Matrix/Banded.hs +26/−0
- src/Data/Array/Accelerate/LinearAlgebra/Matrix/Sparse.hs +148/−0
- test/Test.hs +1/−0
- test/Test/Data/Array/Accelerate/Arithmetic/LinearAlgebra.hs +2/−2
- test/Test/Data/Array/Accelerate/Arithmetic/Sparse.hs +39/−9
accelerate-arithmetic.cabal view
@@ -1,10 +1,10 @@ Name: accelerate-arithmetic-Version: 0.0.1+Version: 0.1 License: BSD3 License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Henning Thielemann <haskell@henning-thielemann.de>-Homepage: http://code.haskell.org/~thielema/accelerate-arithmetic/+Homepage: http://hub.darcs.net/thielema/accelerate-arithmetic/ Category: Math Synopsis: Linear algebra and interpolation using the Accelerate framework Description:@@ -17,66 +17,48 @@ Build-Type: Simple Source-Repository this- Tag: 0.0.1+ Tag: 0.1 Type: darcs- Location: http://code.haskell.org/~thielema/accelerate-arithmetic/+ Location: http://hub.darcs.net/thielema/accelerate-arithmetic/ Source-Repository head Type: darcs- Location: http://code.haskell.org/~thielema/accelerate-arithmetic/+ Location: http://hub.darcs.net/thielema/accelerate-arithmetic/ Library Build-Depends: accelerate-utility >=0.1 && <0.2, accelerate >=0.15 && <0.16, utility-ht >=0.0.8 && <0.1,- QuickCheck >=2.4 && <2.8,- base >=4.5 && <4.8+ QuickCheck >=2.4 && <3,+ base >=4.5 && <4.10 GHC-Options: -Wall -fwarn-missing-import-lists- Hs-Source-Dirs: src+ Hs-Source-Dirs: src, private Default-Language: Haskell98 Exposed-Modules:- Data.Array.Accelerate.Arithmetic.LinearAlgebra- Data.Array.Accelerate.Arithmetic.Sparse Data.Array.Accelerate.Arithmetic.Interpolation+ Data.Array.Accelerate.LinearAlgebra+ Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse+ Data.Array.Accelerate.LinearAlgebra.Matrix.Banded Other-Modules: Data.Array.Accelerate.Arithmetic.Example+ Data.Array.Accelerate.LinearAlgebra.Private Test-Suite test Type: exitcode-stdio-1.0 Main-Is: Test.hs GHC-Options: -Wall -fwarn-missing-import-lists- Hs-Source-Dirs: test+ Hs-Source-Dirs: test, private Default-Language: Haskell98 Build-Depends: accelerate-arithmetic,+ accelerate-utility, accelerate, QuickCheck, base Other-Modules:+ Data.Array.Accelerate.LinearAlgebra.Private Test.Data.Array.Accelerate.Arithmetic.LinearAlgebra Test.Data.Array.Accelerate.Arithmetic.Sparse Test.Data.Array.Accelerate.Arithmetic.Utility--Benchmark newton-inverse- Type: exitcode-stdio-1.0- Main-Is: NewtonInverse.hs- Hs-Source-Dirs: benchmark- Other-Modules: CUBLASBatched- Default-Language: Haskell98- GHC-Options: -Wall -threaded- GHC-Prof-Options: -fprof-auto- Build-Depends:- accelerate-arithmetic,- accelerate-utility,- accelerate-cuda >=0.15 && <0.16,- cublas >=0.2.0.2 && <0.3,- cuda >=0.5 && <0.7,- accelerate,- pooled-io >=0.0 && <0.1,- timeit >=1.0 && <1.1,- hmatrix >=0.15.2 && <0.16,- random >=1.0.1 && <1.1,- utility-ht,- base
− benchmark/CUBLASBatched.hs
@@ -1,269 +0,0 @@-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE FlexibleContexts #-}-module CUBLASBatched where--import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as ALinAlg--import qualified Data.Array.Accelerate.Utility.Lift.Acc as Acc-import Data.Array.Accelerate.Utility.Lift.Acc (acc, expr)--import Data.Array.Accelerate.Array.Sugar (EltRepr)-import Data.Array.Accelerate (Array, DIM3, Acc, Z (..), (:.) (..), Exp)-import qualified Data.Array.Accelerate.CUDA.Foreign as AF-import qualified Data.Array.Accelerate.CUDA as AC-import qualified Data.Array.Accelerate as A--import qualified Foreign.CUDA.Cublas as Cublas-import Foreign.CUDA.Ptr (DevicePtr, castDevPtr, advanceDevPtr)--import Foreign.C.Types (CFloat, CDouble)-import Foreign.Storable (Storable)--import Data.Tuple.HT (uncurry3)---type Matrix ix = Array (ix :. Int :. Int)-type Vector ix = Array (ix :. Int)-type Scalar ix = Array ix--mul ::- (A.Shape ix, A.Slice ix, Eq ix, Element a, A.Elt a, A.IsNum a) =>- Cublas.Handle ->- Exp a ->- ALinAlg.Matrix ix a -> ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a-mul handle alpha a b =- A.foreignAcc- (AF.CUDAForeignAcc "mul" $ uncurry3 $ mulPlain handle)- (Acc.modify (expr,acc,acc) $ \(alpha0, a0, b0) ->- A.map (alpha0 *) $- ALinAlg.multiplyMatrixMatrix a0 b0)- $- A.lift (A.unit alpha, a, b)--mulPlain ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- A.Scalar a -> Matrix ix a -> Matrix ix a ->- AF.CIO (Matrix ix a)-mulPlain handle alpha a b = do- let (aNumMatrices :. n :. k) = A.arrayShape a- let (bNumMatrices :. _k :. m) = A.arrayShape b- let numMatrices =- if aNumMatrices == bNumMatrices- then aNumMatrices- else error "mul: mismatching shapes of matrix arrays"- c <- AF.allocateArray (numMatrices :. n :. m)- (pas, lda) <- arrayPtrs a- (pbs, ldb) <- arrayPtrs b- (pcs, ldc) <- arrayPtrs c- AF.liftIO $- Cublas.gemmBatched handle Cublas.N Cublas.N m n k- (storableFromScalar alpha)- pbs ldb- pas lda- 0- pcs ldc- (A.arraySize numMatrices)- return c--mac ::- (A.Shape ix, A.Slice ix, Eq ix, Element a, A.Elt a, A.IsNum a) =>- Cublas.Handle ->- Exp a -> ALinAlg.Matrix ix a -> ALinAlg.Matrix ix a ->- Exp a -> ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a-mac handle alpha a b beta c =- A.foreignAcc- (AF.CUDAForeignAcc "mac" $- \((alpha0, a0, b0), (beta0, c0)) ->- macPlain handle alpha0 a0 b0 beta0 c0)- (Acc.modify ((expr,acc,acc),(expr,acc)) $- \((alpha0, a0, b0), (beta0, c0)) ->- A.zipWith (+)- (A.map (alpha0 *) $- ALinAlg.multiplyMatrixMatrix a0 b0)- (A.map (beta0 *) c0))- $- A.lift ((A.unit alpha, a, b), (A.unit beta, c))--macPlain ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- A.Scalar a -> Matrix ix a -> Matrix ix a ->- A.Scalar a -> Matrix ix a ->- AF.CIO (Matrix ix a)-macPlain handle alpha a b beta c = do- let (aNumMatrices :. n :. k ) = A.arrayShape a- let (bNumMatrices :. _k :. m ) = A.arrayShape b- let (cNumMatrices :. n' :. m') = A.arrayShape c- let numMatrices =- if aNumMatrices == bNumMatrices- &&- aNumMatrices == cNumMatrices- then aNumMatrices- else error "mac: mismatching shapes of matrix arrays"- d <- AF.allocateArray (numMatrices :. n' :. m')- AF.copyArray c d- (pas, lda) <- arrayPtrs a- (pbs, ldb) <- arrayPtrs b- (pds, ldd) <- arrayPtrs d- AF.liftIO $- Cublas.gemmBatched handle Cublas.N Cublas.N m n k- (storableFromScalar alpha)- pbs ldb- pas lda- (storableFromScalar beta)- pds ldd- (A.arraySize numMatrices)- return d--lu ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- ALinAlg.Matrix ix a ->- (ALinAlg.Matrix ix a, ALinAlg.Vector ix Int, ALinAlg.Scalar ix Int)-lu handle =- A.unlift- .- A.foreignAcc- (AF.CUDAForeignAcc "lu" $ luPlain handle)- (error "Requires CUDA backend")--luPlain ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- Matrix ix a ->- AF.CIO (Matrix ix a, Vector ix Int, Scalar ix Int)-luPlain handle a = do- let sh@(numMatrices :. n :. k) = A.arrayShape a- let size =- if n == k- then n- else error "lu: matrices must have square shape"- b <- AF.allocateArray sh- AF.copyArray a b- (pbs, ldb) <- arrayPtrs b-- pivot <- AF.allocateArray (numMatrices :. size)- pivotPtr <- fmap (castDevPtr . snd) $ AF.devicePtrsOfArray pivot-- info <- AF.allocateArray numMatrices- infoPtr <- fmap (castDevPtr . snd) $ AF.devicePtrsOfArray info-- AF.liftIO $- Cublas.getrfBatched handle size- pbs ldb- pivotPtr infoPtr- (A.arraySize numMatrices)- return (b, pivot, info)---luInv ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- (ALinAlg.Matrix ix a, ALinAlg.Vector ix Int, ALinAlg.Scalar ix Int) ->- ALinAlg.Matrix ix a-luInv handle =- A.foreignAcc- (AF.CUDAForeignAcc "luInv" $ luInvPlain handle)- (error "Requires CUDA backend")- .- A.lift--luInvPlain ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- (Matrix ix a, Vector ix Int, Scalar ix Int) ->- AF.CIO (Matrix ix a)-luInvPlain handle (a, pivot, info) = do- let sh@(numMatrices :. n :. k) = A.arrayShape a- let size =- if n == k- then n- else error "luInv: matrices must have square shape"- c <- AF.allocateArray sh- AF.copyArray a c- (pas, lda) <- arrayPtrs a- (pcs, ldc) <- arrayPtrs c-- pivotPtr <- fmap (castDevPtr . snd) $ AF.devicePtrsOfArray pivot- infoPtr <- fmap (castDevPtr . snd) $ AF.devicePtrsOfArray info-- AF.liftIO $- Cublas.getriBatched handle size- pas lda- pivotPtr- pcs ldc- infoPtr- (A.arraySize numMatrices)- return c---inv ::- (A.Shape ix, Eq ix, Element a, A.Elt a) =>- Cublas.Handle ->- ALinAlg.Matrix ix a ->- (ALinAlg.Matrix ix a, ALinAlg.Scalar ix Int)-inv handle a =- let sol@(_,_,info) = lu handle a- in (luInv handle sol, info)---type Element a =- (AF.DevicePtrs (EltRepr a) ~ ((), DevicePtr a),- Fractional (StorableOf a),- Cublas.Cublas (StorableOf a),- Storable (StorableOf a),- Real a)--type family StorableOf float-type instance StorableOf Float = CFloat-type instance StorableOf Double = CDouble--storableFromScalar ::- (Real a, StorableOf a ~ b, Fractional b) => A.Scalar a -> b-storableFromScalar x = realToFrac $ A.indexArray x Z--arrayPtrs ::- (Storable a, StorableOf e ~ a,- A.Shape ix,- AF.DevicePtrs (EltRepr e) ~ ((), DevicePtr e)) =>- Array (ix :. Int :. Int) e -> AF.CIO ([DevicePtr a], Int)-arrayPtrs arr = do- let (numMatrices :. n :. k) = A.arrayShape arr- pa <- fmap (castDevPtr . snd) $ AF.devicePtrsOfArray arr- return (genPointers (n*k) pa (A.arraySize numMatrices), k)--genPointers ::- (Storable a) =>- Int -> DevicePtr a -> Int -> [DevicePtr a]-genPointers size p n =- take n $ iterate (flip advanceDevPtr size) p---genMatrices :: (Acc (Array DIM3 Double), Acc (Array DIM3 Double))-genMatrices = (a,b)- where- a = A.generate (A.constant sha) $ \ix ->- let (Z :. i :. j :. k) = unlift ix- in A.fromIntegral (i+j+k)- b = A.generate (A.constant shb) $ \ix ->- let (Z :. i :. j :. k) = unlift ix- in A.fromIntegral (i+j+k)- numMats = 100 :: Int- sha = Z :. numMats :. (3 :: Int) :. (4 :: Int)- shb = Z :. numMats :. (4 :: Int) :. (2 :: Int)- unlift :: Exp (Z :. Int :. Int :. Int)- -> Z :. Exp Int :. Exp Int :. Exp Int- unlift = A.unlift--test :: IO ()-test = do- handle <- Cublas.create- print genMatrices- print $ AC.run $- case genMatrices of- (a,b) -> mul handle 1 a b
− benchmark/NewtonInverse.hs
@@ -1,224 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE FlexibleContexts #-}-module Main where--import qualified CUBLASBatched as Batched-import qualified Foreign.CUDA.Cublas as Cublas--import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as ALinAlg-import qualified Data.Array.Accelerate.Utility.Loop as Loop-import qualified Data.Array.Accelerate.CUDA as CUDA-import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate (All(All), Z(Z), (:.)((:.)))--import qualified Control.Concurrent.PooledIO.Independent as Pooled--import qualified Data.Packed.Matrix as Matrix-import qualified Data.Packed.Vector as Vector-import qualified Numeric.Container as Container-import qualified Numeric.LinearAlgebra.Algorithms as HMLinAlg--import Numeric.Container (Container, (<>))-import Data.Packed.Matrix (Matrix)-import Data.Packed.Vector (Vector)--import qualified System.Random as Rnd-import System.TimeIt (timeIt)--import Text.Printf (printf)--import qualified Data.List.HT as ListHT-import Data.Function.HT (nest)-import Data.Tuple.HT (mapPair)----newtonInverseStep ::- (Num a, Container Vector a, Container.Product a) =>- Matrix a -> Matrix a -> Matrix a-newtonInverseStep a x =- Container.sub- (Container.scale 2 x)- (x <> a <> x)--newtonInverse ::- (Num a, Container Vector a, Container.Product a) =>- Int -> Matrix a -> Matrix a -> Matrix a-newtonInverse count start a =- nest count (newtonInverseStep a) start---newtonInverseCUBLASStep, newtonInverseCUBLASStepMul ::- (A.Shape ix, A.Slice ix, Eq ix, Batched.Element a, A.IsNum a, A.Elt a) =>- Cublas.Handle ->- ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a-newtonInverseCUBLASStep h a x =- Batched.mac h (-1) x (Batched.mul h 1 a x) 2 x--newtonInverseCUBLASStepMul h a x =- A.zipWith (-) (A.map (2*) x) $- Batched.mul h 1 x $ Batched.mul h 1 a x--newtonInverseCUBLAS ::- (A.Shape ix, A.Slice ix, Eq ix, Batched.Element a, A.IsNum a, A.Elt a) =>- Cublas.Handle ->- A.Exp Int ->- ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a ->- ALinAlg.Matrix ix a-newtonInverseCUBLAS h n seed a =- Loop.nest n (newtonInverseCUBLASStep h a) seed---randomMatrixInv :: Int -> (Matrix Double, Matrix Double)-randomMatrixInv size =- let x =- Matrix.fromLists $ take size $ ListHT.sliceVertical size $- Rnd.randomRs (-1,1::Double) $ Rnd.mkStdGen 42- in (x, HMLinAlg.inv x)---parallel :: [a] -> (Int -> a -> IO ()) -> IO ()-parallel xs f = Pooled.run $ zipWith f [0 ..] xs--disturbedMatrices ::- (Container Vector a) =>- Matrix a -> [a] -> [Matrix a]-disturbedMatrices x yelems =- let size = Matrix.rows x- in map (Container.add x . Matrix.fromLists) $- ListHT.sliceVertical size $- ListHT.sliceVertical size $- yelems--mainHMatrixDirect ::- (Show a, Container Vector a, HMLinAlg.Field a) =>- String ->- Int -> (Matrix a, Matrix a) -> [a] -> IO ()-mainHMatrixDirect typ numberOfMatrices (x, _xinv) yelems = do- let yinvs = map HMLinAlg.inv $ disturbedMatrices x yelems- putStrLn $ "hmatrix-direct-" ++ typ- timeIt $ parallel (take numberOfMatrices yinvs) $ \ n y ->- writeFile (printf "/tmp/hmatrix-direct-%s%03d.txt" typ n) $ show y--mainHMatrix ::- (Show a, Container Vector a, Container.Product a) =>- String ->- Int -> Int -> (Matrix a, Matrix a) -> [a] -> IO ()-mainHMatrix typ numberOfMatrices newtonIts (x, xinv) yelems = do- let yinvs = map (newtonInverse newtonIts xinv) $ disturbedMatrices x yelems- putStrLn $ "hmatrix-" ++ typ- timeIt $ parallel (take numberOfMatrices yinvs) $ \ n y ->- writeFile (printf "/tmp/hmatrix-%s%03d.txt" typ n) $ show y---mainCUDA ::- (A.Elt a, A.IsNum a, Container.Element a) =>- String ->- Int -> Int -> (Matrix a, Matrix a) -> [a] -> IO ()-mainCUDA typ numberOfMatrices newtonIts (xm, xinvm) yelems = do- let size = Matrix.rows xm- matrixAccFromHM =- A.fromList (Z :. size :. size) .- Vector.toList . Matrix.flatten- xarr = matrixAccFromHM xm- xinvarr = matrixAccFromHM xinvm-- let ysarr =- A.fromList (Z :. numberOfMatrices :. size :. size) yelems- rep = A.replicate (A.lift $ Z :. numberOfMatrices :. All :. All)- yinvs =- CUDA.run1- (\args ->- case A.unlift args of- (x, xinv, ys) ->- ALinAlg.newtonInverse (A.constant newtonIts) (rep xinv) $- A.zipWith (+) ys (rep x))- (xarr, xinvarr, ysarr)-- putStrLn $ "cuda-" ++ typ- timeIt $ writeFile ("/tmp/cuda-"++typ++".txt") $ show yinvs---mainCUBLASDirect ::- (Batched.Element a, Container.Element a, A.IsNum a, A.Elt a) =>- String ->- Int -> (Matrix a, Matrix a) -> [a] -> IO ()-mainCUBLASDirect typ numberOfMatrices (xm, _xinvm) yelems = do- let size = Matrix.rows xm- matrixAccFromHM =- A.fromList (Z :. size :. size) .- Vector.toList . Matrix.flatten- xarr = matrixAccFromHM xm-- handle <- Cublas.create- let ysarr =- A.fromList (Z :. numberOfMatrices :. size :. size) yelems- rep = A.replicate (A.lift $ Z :. numberOfMatrices :. All :. All)- yinvs =- CUDA.run1- (\args ->- case A.unlift args of- (x, ys) ->- fst $ Batched.inv handle $ A.zipWith (+) ys (rep x))- (xarr, ysarr)-- putStrLn $ "cublas-direct-" ++ typ- timeIt $ writeFile ("/tmp/cublas-direct-"++typ++".txt") $ show yinvs---mainCUBLAS ::- (Batched.Element a, Container.Element a, A.IsNum a, A.Elt a) =>- String ->- Int -> Int -> (Matrix a, Matrix a) -> [a] -> IO ()-mainCUBLAS typ numberOfMatrices newtonIts (xm, xinvm) yelems = do- let size = Matrix.rows xm- matrixAccFromHM =- A.fromList (Z :. size :. size) .- Vector.toList . Matrix.flatten- xarr = matrixAccFromHM xm- xinvarr = matrixAccFromHM xinvm-- handle <- Cublas.create- let ysarr =- A.fromList (Z :. numberOfMatrices :. size :. size) yelems- rep = A.replicate (A.lift $ Z :. numberOfMatrices :. All :. All)- yinvs =- CUDA.run1- (\args ->- case A.unlift args of- (x, xinv, ys) ->- newtonInverseCUBLAS handle (A.constant newtonIts) (rep xinv) $- A.zipWith (+) ys (rep x))- (xarr, xinvarr, ysarr)-- putStrLn $ "cublas-" ++ typ- timeIt $ writeFile ("/tmp/cublas-"++typ++".txt") $ show yinvs---main :: IO ()-main = do- let n = 96- let sz = 50- let its = 20- let xmsDouble = randomMatrixInv sz- ysDouble = Rnd.randomRs (-0.01,0.01::Double) $ Rnd.mkStdGen 23- let xmsFloat =- mapPair- (Container.cmap realToFrac, Container.cmap realToFrac)- xmsDouble- ysFloat :: [Float]- ysFloat = map realToFrac ysDouble- mainHMatrixDirect "double" n xmsDouble ysDouble--- mainHMatrixDirect "float" n xmsFloat ysFloat- mainHMatrix "double" n its xmsDouble ysDouble- mainHMatrix "float" n its xmsFloat ysFloat- mainCUBLASDirect "double" n xmsDouble ysDouble- mainCUBLASDirect "float" n xmsFloat ysFloat- mainCUBLAS "double" n its xmsDouble ysDouble- mainCUBLAS "float" n its xmsFloat ysFloat- mainCUDA "double" n its xmsDouble ysDouble- mainCUDA "float" n its xmsFloat ysFloat
+ private/Data/Array/Accelerate/LinearAlgebra/Private.hs view
@@ -0,0 +1,254 @@+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+module Data.Array.Accelerate.LinearAlgebra.Private where++import qualified Data.Array.Accelerate.Utility.Loop as Loop+import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp+import qualified Data.Array.Accelerate.Utility.Arrange as Arrange+import qualified Data.Array.Accelerate as A+import Data.Array.Accelerate+ (Acc, Array, Exp, Any(Any), All(All), Z(Z), (:.)((:.)))++++type Scalar ix a = Acc (Array ix a)+type Vector ix a = Acc (Array (ix :. Int) a)+type Matrix ix a = Acc (Array (ix :. Int :. Int) a)++transpose ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Matrix ix a -> Matrix ix a+transpose m =+ A.backpermute+ (A.lift $ swapIndex $ matrixShape m)+ (A.lift . swapIndex . A.unlift)+ m++swapIndex ::+ Exp ix :. Exp Int :. Exp Int ->+ Exp ix :. Exp Int :. Exp Int+swapIndex (ix :. r :. c) = (ix :. c :. r)+++numElems :: (A.Shape ix, A.Slice ix, A.Elt a) => Vector ix a -> Exp Int+numElems m = case vectorShape m of _ix :. n -> n++numRows :: (A.Shape ix, A.Slice ix, A.Elt a) => Matrix ix a -> Exp Int+numRows m = case matrixShape m of _ix :. rows :. _cols -> rows++numCols :: (A.Shape ix, A.Slice ix, A.Elt a) => Matrix ix a -> Exp Int+numCols m = case matrixShape m of _ix :. _rows :. cols -> cols++vectorShape ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Vector ix a -> Exp ix :. Exp Int+vectorShape m = A.unlift $ A.shape m++matrixShape ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Matrix ix a -> Exp ix :. Exp Int :. Exp Int+matrixShape m = A.unlift $ A.shape m++withVectorIndex ::+ (A.Shape ix, A.Slice ix, A.Lift Exp a) =>+ (Exp ix :. Exp Int -> a) ->+ (Exp (ix :. Int) -> Exp (A.Plain a))+withVectorIndex f = A.lift . f . A.unlift++withMatrixIndex ::+ (A.Shape ix, A.Slice ix, A.Lift Exp a) =>+ (Exp ix :. Exp Int :. Exp Int -> a) ->+ (Exp (ix :. Int :. Int) -> Exp (A.Plain a))+withMatrixIndex f = A.lift . f . A.unlift+++outer ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Vector ix a -> Vector ix a -> Matrix ix a+outer x y =+ A.zipWith (*)+ (A.replicate (A.lift $ Any :. All :. numElems y) x)+ (A.replicate (A.lift $ Any :. numElems x :. All) y)++multiplyMatrixVector ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Matrix ix a ->+ Vector ix a ->+ Vector ix a+multiplyMatrixVector m v =+ case matrixShape m of+ (_ix :. rows :. _cols) ->+ A.fold1 (+) $+ A.zipWith (*) m+ (A.replicate (A.lift $ Any :. rows :. All) v)++multiplyMatrixMatrix ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Matrix ix a ->+ Matrix ix a ->+ Matrix ix a+multiplyMatrixMatrix x y =+ case (matrixShape x, matrixShape y) of+ (_ :. rows :. _cols, _ :. _rows :. cols) ->+ A.fold1 (+) $ transpose $+ A.zipWith (*)+ (A.replicate (A.lift $ Any :. All :. All :. cols) x)+ (A.replicate (A.lift $ Any :. rows :. All :. All) y)++newtonInverseStep ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Matrix ix a ->+ Matrix ix a ->+ Matrix ix a+newtonInverseStep a x =+ A.zipWith (-) (A.map (2*) x) $+ multiplyMatrixMatrix x $ multiplyMatrixMatrix a x++identity ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Exp (ix :. Int :. Int) -> Matrix ix a+identity sh =+ A.generate sh+ (withMatrixIndex $+ \(_ :. r :. c) -> A.fromIntegral $ A.boolToInt (r A.==* c))++newtonInverse ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Exp Int ->+ Matrix ix a ->+ Matrix ix a ->+ Matrix ix a+newtonInverse n seed a =+ Loop.nest n (newtonInverseStep a) seed++++scaleRows ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.IsNum a) =>+ Vector ix a -> Matrix ix a -> Matrix ix a+scaleRows s x =+ zipScalarVectorWith (*) s x++++zipScalarVectorWith ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>+ (Exp a -> Exp b -> Exp c) ->+ Scalar ix a -> Vector ix b -> Vector ix c+zipScalarVectorWith f x ys =+ case vectorShape ys of+ _ix :. dim ->+ A.zipWith f (A.replicate (A.lift (Any :. dim)) x) ys++zipScalarMatrixWith ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>+ (Exp a -> Exp b -> Exp c) ->+ Scalar ix a -> Matrix ix b -> Matrix ix c+zipScalarMatrixWith f x ys =+ case matrixShape ys of+ _ix :. rows :. cols ->+ A.zipWith f+ (A.replicate (A.lift (Any :. rows :. cols)) x) ys++++columnFromVector ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Vector ix a -> Matrix ix a+columnFromVector a = A.reshape (Exp.indexCons (A.shape a) 1) a++{- |+input must be a matrix with exactly one column+-}+vectorFromColumn ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Matrix ix a -> Vector ix a+vectorFromColumn a = A.reshape (A.indexTail $ A.shape a) a++++flattenMatrix, flattenMatrixReshape, flattenMatrixBackPermute ::+ (A.Slice ix, A.Shape ix, A.Elt a) =>+ Matrix ix a -> Vector ix a+flattenMatrix = flattenMatrixBackPermute++flattenMatrixReshape m =+ case matrixShape m of+ ix :. rows :. cols ->+ A.reshape (A.lift $ ix :. rows*cols) m++accDivMod :: Integral a => a -> a -> (a, a)+accDivMod x y = (div x y, mod x y)++flattenMatrixBackPermute m =+ case matrixShape m of+ ix :. rows :. cols ->+ A.backpermute+ (A.lift $ ix :. rows*cols)+ (withVectorIndex $+ \(vix :. n) -> case accDivMod n cols of (r,c) -> vix :. r :. c)+ m+++restoreMatrix, restoreMatrixReshape, restoreMatrixBackPermute ::+ (A.Slice ix, A.Shape ix, A.Elt a) =>+ Exp Int -> Vector ix a -> Matrix ix a+restoreMatrix = restoreMatrixBackPermute++restoreMatrixReshape cols v =+ case vectorShape v of+ ix :. n ->+ A.reshape (A.lift $ ix :. div n cols :. cols) v++restoreMatrixBackPermute cols v =+ case vectorShape v of+ ix :. n ->+ A.backpermute+ (A.lift $ ix :. div n cols :. cols)+ (withMatrixIndex $ \(vix :. k :. j) -> vix :. k*cols+j)+ v++++extrudeVector ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Exp ix -> Vector Z a -> Vector ix a+extrudeVector shape y =+ -- A.replicate (A.lift $ shape :. All) y+ A.backpermute+ (A.lift $ shape :. numElems y)+ (A.index1 . A.indexHead)+ y++extrudeMatrix ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Exp ix -> Matrix Z a -> Matrix ix a+extrudeMatrix shape y =+ A.backpermute+ (A.lift $ shape :. numRows y :. numCols y)+ (withMatrixIndex $ \(_:.r:.c) -> Z:.r:.c)+ y++zipExtrudedVectorWith ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>+ (Exp a -> Exp b -> Exp c) ->+ Vector Z a ->+ Vector ix b ->+ Vector ix c+zipExtrudedVectorWith f x y =+ A.zipWith f (extrudeVector (A.indexTail $ A.shape y) x) y++zipExtrudedMatrixWith ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>+ (Exp a -> Exp b -> Exp c) ->+ Matrix Z a ->+ Matrix ix b ->+ Matrix ix c+zipExtrudedMatrixWith f x y =+ A.zipWith f (extrudeMatrix (A.indexTail $ A.indexTail $ A.shape y) x) y++gatherFromVector ::+ (A.Shape ix, A.Elt a) =>+ Scalar ix Int -> Vector Z a -> Scalar ix a+gatherFromVector indices =+ Arrange.gather (A.map A.index1 indices)
src/Data/Array/Accelerate/Arithmetic/Example.hs view
@@ -1,8 +1,8 @@ module Data.Array.Accelerate.Arithmetic.Example where import qualified Data.Array.Accelerate.Arithmetic.Interpolation as Ip-import qualified Data.Array.Accelerate.Arithmetic.Sparse as Sparse-import Data.Array.Accelerate.Arithmetic.LinearAlgebra (Vector, )+import qualified Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse as Sparse+import Data.Array.Accelerate.LinearAlgebra (Vector, ) import qualified Data.Array.Accelerate.Interpreter as AI import qualified Data.Array.Accelerate as A@@ -11,9 +11,9 @@ exampleSparseColumnMatrix :: IO () exampleSparseColumnMatrix = do- let m :: Sparse.ColumnMatrix Z Double+ let m :: Sparse.Columns Z Double m =- Sparse.ColumnMatrix (A.lift (3::Int)) $+ Sparse.Columns (A.lift (3::Int)) $ A.use $ A.fromList (Z :. 2 :. 5) $ (0,1) : (2,2) : (1,3) : (0,4) : (2,5) : (1,6) : (2,7) : (0,8) : (2,9) : (1,10) :@@ -22,13 +22,13 @@ v :: Vector Z Double v = A.use $ A.fromList (Z :. 5) [1,10,100,1000,10000] - print $ AI.run $ Sparse.multiplyColumnMatrixVector m v+ print $ AI.run $ Sparse.multiplyColumnsVector m v exampleSparseRowMatrix :: IO () exampleSparseRowMatrix = do- let m :: Sparse.RowMatrix Z Double+ let m :: Sparse.Rows Z Double m =- Sparse.RowMatrix (A.lift (5::Int)) $+ Sparse.Rows (A.lift (5::Int)) $ A.use $ A.fromList (Z :. 3 :. 2) $ (0,1) : (0,2) : (3,3) : (1,4) :@@ -38,7 +38,7 @@ v :: Vector Z Double v = A.use $ A.fromList (Z :. 5) [1,10,100,1000,10000] - print $ AI.run $ Sparse.multiplyRowMatrixVector m v+ print $ AI.run $ Sparse.multiplyRowsVector m v exampleLookup :: IO () exampleLookup = do
src/Data/Array/Accelerate/Arithmetic/Interpolation.hs view
@@ -4,12 +4,12 @@ Interpolator13, sampleBasisFunctions13, ) where -import qualified Data.Array.Accelerate.Arithmetic.Sparse as Sparse-import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg+import qualified Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse as Sparse+import qualified Data.Array.Accelerate.LinearAlgebra as LinAlg import qualified Data.Array.Accelerate.Utility.Arrange as Arrange import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp import qualified Data.Array.Accelerate.Utility.Loop as Loop-import Data.Array.Accelerate.Arithmetic.LinearAlgebra+import Data.Array.Accelerate.LinearAlgebra (Scalar, Vector, numElems, extrudeVector, ) import qualified Data.Array.Accelerate as A@@ -68,9 +68,9 @@ sampleBasisFunctions13 :: (A.Slice ix, A.Shape ix, A.Elt a, A.IsFloating a, Num a) => Interpolator13 (Exp a) ->- Vector Z a -> Vector ix a -> Sparse.RowMatrix ix a+ Vector Z a -> Vector ix a -> Sparse.Rows ix a sampleBasisFunctions13 interpolate nodes zs =- Sparse.RowMatrix (numElems nodes) $+ Sparse.Rows (numElems nodes) $ let indices = lookupInterval (extrudeVector (A.shape zs) nodes) zs minIx = 1 maxIx = numElems nodes - 3
− src/Data/Array/Accelerate/Arithmetic/LinearAlgebra.hs
@@ -1,254 +0,0 @@-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE FlexibleContexts #-}-module Data.Array.Accelerate.Arithmetic.LinearAlgebra where--import qualified Data.Array.Accelerate.Utility.Loop as Loop-import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp-import qualified Data.Array.Accelerate.Utility.Arrange as Arrange-import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate- (Acc, Array, Exp, Any(Any), All(All), Z(Z), (:.)((:.)))----type Scalar ix a = Acc (Array ix a)-type Vector ix a = Acc (Array (ix :. Int) a)-type Matrix ix a = Acc (Array (ix :. Int :. Int) a)--transpose ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Matrix ix a -> Matrix ix a-transpose m =- A.backpermute- (A.lift $ swapIndex $ matrixShape m)- (A.lift . swapIndex . A.unlift)- m--swapIndex ::- Exp ix :. Exp Int :. Exp Int ->- Exp ix :. Exp Int :. Exp Int-swapIndex (ix :. r :. c) = (ix :. c :. r)---numElems :: (A.Shape ix, A.Slice ix, A.Elt a) => Vector ix a -> Exp Int-numElems m = case vectorShape m of _ix :. n -> n--numRows :: (A.Shape ix, A.Slice ix, A.Elt a) => Matrix ix a -> Exp Int-numRows m = case matrixShape m of _ix :. rows :. _cols -> rows--numCols :: (A.Shape ix, A.Slice ix, A.Elt a) => Matrix ix a -> Exp Int-numCols m = case matrixShape m of _ix :. _rows :. cols -> cols--vectorShape ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Vector ix a -> Exp ix :. Exp Int-vectorShape m = A.unlift $ A.shape m--matrixShape ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Matrix ix a -> Exp ix :. Exp Int :. Exp Int-matrixShape m = A.unlift $ A.shape m--withVectorIndex ::- (A.Shape ix, A.Slice ix, A.Lift Exp a) =>- (Exp ix :. Exp Int -> a) ->- (Exp (ix :. Int) -> Exp (A.Plain a))-withVectorIndex f = A.lift . f . A.unlift--withMatrixIndex ::- (A.Shape ix, A.Slice ix, A.Lift Exp a) =>- (Exp ix :. Exp Int :. Exp Int -> a) ->- (Exp (ix :. Int :. Int) -> Exp (A.Plain a))-withMatrixIndex f = A.lift . f . A.unlift---outer ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Vector ix a -> Vector ix a -> Matrix ix a-outer x y =- A.zipWith (*)- (A.replicate (A.lift $ Any :. All :. numElems y) x)- (A.replicate (A.lift $ Any :. numElems x :. All) y)--multiplyMatrixVector ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Matrix ix a ->- Vector ix a ->- Vector ix a-multiplyMatrixVector m v =- case matrixShape m of- (_ix :. rows :. _cols) ->- A.fold1 (+) $- A.zipWith (*) m- (A.replicate (A.lift $ Any :. rows :. All) v)--multiplyMatrixMatrix ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Matrix ix a ->- Matrix ix a ->- Matrix ix a-multiplyMatrixMatrix x y =- case (matrixShape x, matrixShape y) of- (_ :. rows :. _cols, _ :. _rows :. cols) ->- A.fold1 (+) $ transpose $- A.zipWith (*)- (A.replicate (A.lift $ Any :. All :. All :. cols) x)- (A.replicate (A.lift $ Any :. rows :. All :. All) y)--newtonInverseStep ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Matrix ix a ->- Matrix ix a ->- Matrix ix a-newtonInverseStep a x =- A.zipWith (-) (A.map (2*) x) $- multiplyMatrixMatrix x $ multiplyMatrixMatrix a x--identity ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Exp (ix :. Int :. Int) -> Matrix ix a-identity sh =- A.generate sh- (withMatrixIndex $- \(_ :. r :. c) -> A.fromIntegral $ A.boolToInt (r A.==* c))--newtonInverse ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Exp Int ->- Matrix ix a ->- Matrix ix a ->- Matrix ix a-newtonInverse n seed a =- Loop.nest n (newtonInverseStep a) seed----scaleRows ::- (A.Slice ix, A.Shape ix, A.Elt a, A.IsNum a) =>- Vector ix a -> Matrix ix a -> Matrix ix a-scaleRows s x =- zipScalarVectorWith (*) s x----zipScalarVectorWith ::- (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>- (Exp a -> Exp b -> Exp c) ->- Scalar ix a -> Vector ix b -> Vector ix c-zipScalarVectorWith f x ys =- case vectorShape ys of- _ix :. dim ->- A.zipWith f (A.replicate (A.lift (Any :. dim)) x) ys--zipScalarMatrixWith ::- (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>- (Exp a -> Exp b -> Exp c) ->- Scalar ix a -> Matrix ix b -> Matrix ix c-zipScalarMatrixWith f x ys =- case matrixShape ys of- _ix :. rows :. cols ->- A.zipWith f- (A.replicate (A.lift (Any :. rows :. cols)) x) ys----columnFromVector ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Vector ix a -> Matrix ix a-columnFromVector a = A.reshape (Exp.indexCons (A.shape a) 1) a--{- |-input must be a matrix with exactly one column--}-vectorFromColumn ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Matrix ix a -> Vector ix a-vectorFromColumn a = A.reshape (A.indexTail $ A.shape a) a----flattenMatrix, flattenMatrixReshape, flattenMatrixBackPermute ::- (A.Slice ix, A.Shape ix, A.Elt a) =>- Matrix ix a -> Vector ix a-flattenMatrix = flattenMatrixBackPermute--flattenMatrixReshape m =- case matrixShape m of- ix :. rows :. cols ->- A.reshape (A.lift $ ix :. rows*cols) m--accDivMod :: Integral a => a -> a -> (a, a)-accDivMod x y = (div x y, mod x y)--flattenMatrixBackPermute m =- case matrixShape m of- ix :. rows :. cols ->- A.backpermute- (A.lift $ ix :. rows*cols)- (withVectorIndex $- \(vix :. n) -> case accDivMod n cols of (r,c) -> vix :. r :. c)- m---restoreMatrix, restoreMatrixReshape, restoreMatrixBackPermute ::- (A.Slice ix, A.Shape ix, A.Elt a) =>- Exp Int -> Vector ix a -> Matrix ix a-restoreMatrix = restoreMatrixBackPermute--restoreMatrixReshape cols v =- case vectorShape v of- ix :. n ->- A.reshape (A.lift $ ix :. div n cols :. cols) v--restoreMatrixBackPermute cols v =- case vectorShape v of- ix :. n ->- A.backpermute- (A.lift $ ix :. div n cols :. cols)- (withMatrixIndex $ \(vix :. k :. j) -> vix :. k*cols+j)- v----extrudeVector ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Exp ix -> Vector Z a -> Vector ix a-extrudeVector shape y =- -- A.replicate (A.lift $ shape :. All) y- A.backpermute- (A.lift $ shape :. numElems y)- (A.index1 . A.indexHead)- y--extrudeMatrix ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Exp ix -> Matrix Z a -> Matrix ix a-extrudeMatrix shape y =- A.backpermute- (A.lift $ shape :. numRows y :. numCols y)- (withMatrixIndex $ \(_:.r:.c) -> Z:.r:.c)- y--zipExtrudedVectorWith ::- (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>- (Exp a -> Exp b -> Exp c) ->- Vector Z a ->- Vector ix b ->- Vector ix c-zipExtrudedVectorWith f x y =- A.zipWith f (extrudeVector (A.indexTail $ A.shape y) x) y--zipExtrudedMatrixWith ::- (A.Slice ix, A.Shape ix, A.Elt a, A.Elt b, A.Elt c) =>- (Exp a -> Exp b -> Exp c) ->- Matrix Z a ->- Matrix ix b ->- Matrix ix c-zipExtrudedMatrixWith f x y =- A.zipWith f (extrudeMatrix (A.indexTail $ A.indexTail $ A.shape y) x) y--gatherFromVector ::- (A.Shape ix, A.Elt a) =>- Scalar ix Int -> Vector Z a -> Scalar ix a-gatherFromVector indices =- Arrange.gather (A.map A.index1 indices)
− src/Data/Array/Accelerate/Arithmetic/Sparse.hs
@@ -1,115 +0,0 @@-{-# LANGUAGE TypeOperators #-}-module Data.Array.Accelerate.Arithmetic.Sparse where--import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg-import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp-import qualified Data.Array.Accelerate.Utility.Arrange as Arrange-import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate.Utility.Lift.Exp (expr, )--import Data.Array.Accelerate.Arithmetic.LinearAlgebra- (Matrix, Vector, matrixShape, )-import Data.Array.Accelerate- (Exp, Any(Any), All(All), (:.)((:.)), )---{- |-Sparse matrix with a definite number of non-zero entries per column.--}-data ColumnMatrix ix a =- ColumnMatrix {numRows :: Exp Int, columnMatrix :: Matrix ix (Int, a)}--realIndex ::- (A.Shape ix, A.Slice ix, A.Elt a) =>- Matrix ix (Int, a) ->- Matrix ix (ix :. Int)-realIndex m =- A.zipWith Exp.indexCons- (A.generate (A.shape m) (A.indexTail . A.indexTail))- (A.map A.fst m)--multiplyColumnMatrixVector ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- ColumnMatrix ix a ->- Vector ix a ->- Vector ix a-multiplyColumnMatrixVector (ColumnMatrix rows m) v =- Arrange.scatter (+)- (realIndex m)- (case matrixShape m of- sh :. _rows :. _cols -> A.fill (A.lift $ sh :. rows) 0) $- A.zipWith (*)- (A.map A.snd m)- (A.replicate (A.lift $ Any :. LinAlg.numRows m :. All) v)--transposeColumnMatrix ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- ColumnMatrix ix a ->- RowMatrix ix a-transposeColumnMatrix (ColumnMatrix n x) =- RowMatrix n $ LinAlg.transpose x---{- |-Sparse matrix with a definite number of non-zero entries per row.--}-data RowMatrix ix a =- RowMatrix {numCols :: Exp Int, rowMatrix :: Matrix ix (Int, a)}--multiplyRowMatrixVector ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- RowMatrix ix a ->- Vector ix a ->- Vector ix a-multiplyRowMatrixVector (RowMatrix _cols m) v =- A.fold1 (+) $- A.zipWith (*) (A.map A.snd m) $- Arrange.gather (realIndex m) v--transposeRowMatrix ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- RowMatrix ix a ->- ColumnMatrix ix a-transposeRowMatrix (RowMatrix n x) =- (ColumnMatrix n $ LinAlg.transpose x)--multiplyMatrixMatrix ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- ColumnMatrix ix a ->- RowMatrix ix a ->- Matrix ix a-multiplyMatrixMatrix- (ColumnMatrix rows x) (RowMatrix cols y) =- case matchMatrices x y of- m ->- let global = A.indexTail . A.indexTail . A.indexTail- in Arrange.scatter (+)- (Arrange.mapWithIndex- (\mix tix ->- A.lift $ global mix :. A.fst tix :. A.snd tix) $- A.map A.fst m)- (A.fill (A.lift $ global (A.shape m) :. rows :. cols) 0)- (A.map A.snd m)--matchMatrices ::- (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>- Matrix ix (Int, a) ->- Matrix ix (Int, a) ->- Matrix (ix :. Int) ((Int, Int), a)-matchMatrices x y =- case (matrixShape x, matrixShape y) of- (_ :. xRows :. _xCols, _ :. _yRows :. yCols) ->- -- it must be xCols == yRows- A.zipWith- (Exp.modify2 (expr,expr) (expr,expr) $- \(n,xi) (m,yi) -> ((n, m), xi*yi))- (A.replicate (A.lift $ Any :. All :. All :. yCols) x)- (A.replicate (A.lift $ Any :. xRows :. All :. All) y)---scaleRowRows ::- (A.Slice ix, A.Shape ix, A.Elt a, A.IsNum a) =>- Vector ix a -> RowMatrix ix a -> RowMatrix ix a-scaleRowRows s (RowMatrix n x) =- RowMatrix n $- LinAlg.zipScalarVectorWith (\si xi -> Exp.mapSnd (si*) xi) s x
+ src/Data/Array/Accelerate/LinearAlgebra.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+module Data.Array.Accelerate.LinearAlgebra (+ LinAlg.Scalar,+ LinAlg.Vector,+ LinAlg.Matrix,+ LinAlg.transpose,+ LinAlg.numElems,+ LinAlg.numRows,+ LinAlg.numCols,+ LinAlg.vectorShape,+ LinAlg.matrixShape,+ LinAlg.withVectorIndex,+ LinAlg.withMatrixIndex,+ LinAlg.outer,+ LinAlg.multiplyMatrixVector,+ LinAlg.multiplyMatrixMatrix,+ LinAlg.newtonInverse,+ LinAlg.newtonInverseStep,+ LinAlg.identity,+ LinAlg.scaleRows,+ LinAlg.zipScalarVectorWith,+ LinAlg.zipScalarMatrixWith,+ LinAlg.columnFromVector,+ LinAlg.vectorFromColumn,+ LinAlg.flattenMatrix,+ LinAlg.restoreMatrix,+ LinAlg.extrudeVector,+ LinAlg.extrudeMatrix,+ LinAlg.zipExtrudedVectorWith,+ LinAlg.zipExtrudedMatrixWith,+ LinAlg.gatherFromVector,+ ) where++import qualified Data.Array.Accelerate.LinearAlgebra.Private as LinAlg
+ src/Data/Array/Accelerate/LinearAlgebra/Matrix/Banded.hs view
@@ -0,0 +1,26 @@+module Data.Array.Accelerate.LinearAlgebra.Matrix.Banded (+ Symmetric(..),+ flattenSymmetric,+ ) where++import Data.Array.Accelerate.LinearAlgebra (Matrix, matrixShape)++import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp+import qualified Data.Array.Accelerate as A+import Data.Array.Accelerate.Utility.Lift.Exp (expr)+import Data.Array.Accelerate ((:.)((:.)), (>*), (!), (?))+++newtype Symmetric ix a = Symmetric (Matrix ix a)++flattenSymmetric ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.IsNum a) =>+ Symmetric ix a -> Matrix ix a+flattenSymmetric (Symmetric m) =+ case matrixShape m of+ (sh :. rows :. width) ->+ A.generate (A.lift $ sh :. rows :. rows) $+ Exp.modify (expr:.expr:.expr) $ \(ix:.k0:.j0) ->+ let k = min k0 j0+ j = max k0 j0 - k+ in width >* j ? (m ! A.lift(ix:.k:.j), 0)
+ src/Data/Array/Accelerate/LinearAlgebra/Matrix/Sparse.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE TypeOperators #-}+module Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse (+ Columns(..),+ multiplyColumnsVector,+ transposeColumns,+ Rows(..),+ multiplyRowsVector,+ transposeRows,+ multiplyColumnsRows,+ realBandedGramian,+ scaleRowRows,+ ) where++import qualified Data.Array.Accelerate.LinearAlgebra.Matrix.Banded as BandMatrix+import qualified Data.Array.Accelerate.LinearAlgebra as LinAlg+import qualified Data.Array.Accelerate.Utility.Lift.Exp as Exp+import qualified Data.Array.Accelerate.Utility.Arrange as Arrange+import qualified Data.Array.Accelerate as A+import Data.Array.Accelerate.Utility.Lift.Exp (expr, )++import Data.Array.Accelerate.LinearAlgebra+ (Matrix, Vector, matrixShape, )+import Data.Array.Accelerate+ (Exp, Any(Any), All(All), (:.)((:.)), (>*), (?), )+++{- |+Sparse matrix with a definite number of non-zero entries per column.+-}+data Columns ix a =+ Columns {numRows :: Exp Int, columnMatrix :: Matrix ix (Int, a)}++realIndex ::+ (A.Shape ix, A.Slice ix, A.Elt a) =>+ Matrix ix (Int, a) ->+ Matrix ix (ix :. Int)+realIndex m =+ A.zipWith Exp.indexCons+ (A.generate (A.shape m) (A.indexTail . A.indexTail))+ (A.map A.fst m)++multiplyColumnsVector ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Columns ix a ->+ Vector ix a ->+ Vector ix a+multiplyColumnsVector (Columns rows m) v =+ Arrange.scatter (+)+ (realIndex m)+ (case matrixShape m of+ sh :. _rows :. _cols -> A.fill (A.lift $ sh :. rows) 0) $+ A.zipWith (*)+ (A.map A.snd m)+ (A.replicate (A.lift $ Any :. LinAlg.numRows m :. All) v)++transposeColumns ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Columns ix a ->+ Rows ix a+transposeColumns (Columns n x) =+ Rows n $ LinAlg.transpose x+++{- |+Sparse matrix with a definite number of non-zero entries per row.+-}+data Rows ix a =+ Rows {numCols :: Exp Int, rowMatrix :: Matrix ix (Int, a)}++multiplyRowsVector ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Rows ix a ->+ Vector ix a ->+ Vector ix a+multiplyRowsVector (Rows _cols m) v =+ A.fold1 (+) $+ A.zipWith (*) (A.map A.snd m) $+ Arrange.gather (realIndex m) v++transposeRows ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Rows ix a ->+ Columns ix a+transposeRows (Rows n x) =+ (Columns n $ LinAlg.transpose x)++multiplyColumnsRows ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Columns ix a ->+ Rows ix a ->+ Matrix ix a+multiplyColumnsRows (Columns rows x) (Rows cols y) =+ let (ixs,prods) = A.unzip $ matchMatrices x y+ global = A.indexTail . A.indexTail . A.indexTail+ in Arrange.scatter (+)+ (Arrange.mapWithIndex+ (Exp.modify2 expr (expr,expr) $ \mix (k,j) ->+ global mix :. k :. j) $+ ixs)+ (A.fill (A.lift $ global (A.shape prods) :. rows :. cols) 0)+ prods++{- |+Compute x^T*x, given that it has a band structure.+You must pass the band-width as parameter+and you must make sure that the Gramian stays within this band.+Otherwise you cause out-of-bounds array accesses.+So far, only correct for real matrices.+-}+realBandedGramian ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Exp Int ->+ Rows ix a ->+ BandMatrix.Symmetric ix a+realBandedGramian width (Rows cols y) =+ let (ixs,prods) = A.unzip $ matchMatrices (LinAlg.transpose y) y+ global = A.indexTail . A.indexTail . A.indexTail+ in BandMatrix.Symmetric $+ Arrange.scatter (+)+ (Arrange.mapWithIndex+ (Exp.modify2 expr (expr,expr) $ \mix (k,j) ->+ k>*j ? (A.ignore, A.lift $ global mix :. k :. j-k)) $+ ixs)+ (A.fill (A.lift $ global (A.shape prods) :. cols :. width) 0)+ prods++matchMatrices ::+ (A.Shape ix, A.Slice ix, A.IsNum a, A.Elt a) =>+ Matrix ix (Int, a) ->+ Matrix ix (Int, a) ->+ Matrix (ix :. Int) ((Int, Int), a)+matchMatrices x y =+ case (matrixShape x, matrixShape y) of+ (_ :. xRows :. _xCols, _ :. _yRows :. yCols) ->+ -- it must be xCols == yRows+ A.zipWith+ (Exp.modify2 (expr,expr) (expr,expr) $+ \(n,xi) (m,yi) -> ((n, m), xi*yi))+ (A.replicate (A.lift $ Any :. All :. All :. yCols) x)+ (A.replicate (A.lift $ Any :. xRows :. All :. All) y)+++scaleRowRows ::+ (A.Slice ix, A.Shape ix, A.Elt a, A.IsNum a) =>+ Vector ix a -> Rows ix a -> Rows ix a+scaleRowRows s (Rows n x) =+ Rows n $+ LinAlg.zipScalarVectorWith (\si xi -> Exp.mapSnd (si*) xi) s x
test/Test.hs view
@@ -10,6 +10,7 @@ test :: IO () test = mapM_ (\(msg,act) -> putStr (msg++": ") >> act) $ ("sparseMatrix", quickCheck (\(Mod.Blind x) -> Sparse.multiplication x)) :+ ("bandedGramian", quickCheck (\(Mod.Blind x) -> Sparse.bandedGramian x)) : ("flattenMatrix", quickCheck (\(Mod.Blind x) -> LinAlg.flattenMatrix x)) : ("restoreMatrix", quickCheck (\(Mod.Blind x) -> LinAlg.restoreMatrix x)) : ("flattenRestoreMatrix", quickCheck (\(Mod.Blind x) -> LinAlg.flattenRestoreMatrix x)) :
test/Test/Data/Array/Accelerate/Arithmetic/LinearAlgebra.hs view
@@ -1,9 +1,9 @@ module Test.Data.Array.Accelerate.Arithmetic.LinearAlgebra where -import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg+import qualified Data.Array.Accelerate.LinearAlgebra.Private as LinAlg import qualified Data.Array.Accelerate as A -import Data.Array.Accelerate.Arithmetic.LinearAlgebra (Matrix, numCols, )+import Data.Array.Accelerate.LinearAlgebra.Private (Matrix, numCols, ) import Data.Array.Accelerate (Z(Z), (:.)((:.)),) import Test.Data.Array.Accelerate.Arithmetic.Utility (arbitraryArray, (=!=), )
test/Test/Data/Array/Accelerate/Arithmetic/Sparse.hs view
@@ -4,11 +4,12 @@ import Test.Data.Array.Accelerate.Arithmetic.Utility (arbitraryArray, (=!=), ) -import qualified Data.Array.Accelerate.Arithmetic.Sparse as Sparse-import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg+import qualified Data.Array.Accelerate.LinearAlgebra.Matrix.Banded as BandMatrix+import qualified Data.Array.Accelerate.LinearAlgebra.Matrix.Sparse as Sparse+import qualified Data.Array.Accelerate.LinearAlgebra as LinAlg import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate (Z(Z), (:.)((:.)))+import Data.Array.Accelerate (Exp, Z(Z), (:.)((:.))) import qualified Test.QuickCheck as QC @@ -20,8 +21,8 @@ data CRVTriple a = CRVTriple- (Sparse.ColumnMatrix Z a)- (Sparse.RowMatrix Z a)+ (Sparse.Columns Z a)+ (Sparse.Rows Z a) (LinAlg.Vector Z a) instance (QC.Arbitrary a, A.Elt a) => QC.Arbitrary (CRVTriple a) where@@ -40,13 +41,42 @@ v <- arbitraryArray (Z :. nr) QC.arbitrary return $ CRVTriple- (Sparse.ColumnMatrix (A.lift nc) (A.use mc))- (Sparse.RowMatrix (A.lift nr) (A.use mr))+ (Sparse.Columns (A.lift nc) (A.use mc))+ (Sparse.Rows (A.lift nr) (A.use mr)) (A.use v) multiplication :: CRVTriple Word32 -> Bool multiplication (CRVTriple mc mr v) =- LinAlg.multiplyMatrixVector (Sparse.multiplyMatrixMatrix mc mr) v+ LinAlg.multiplyMatrixVector (Sparse.multiplyColumnsRows mc mr) v =!=- Sparse.multiplyColumnMatrixVector mc (Sparse.multiplyRowMatrixVector mr v)+ Sparse.multiplyColumnsVector mc (Sparse.multiplyRowsVector mr v)++++data BandGramian a = BandGramian (Exp Int) (Sparse.Rows Z a)++instance (QC.Arbitrary a, A.Elt a) => QC.Arbitrary (BandGramian a) where+ arbitrary = do+ width <- QC.choose (1,10)+ rows <- QC.choose (1,100)+ cols <- QC.choose (width,100)++ m <-+ fmap (A.fromList (Z :. rows :. width) . concat) $+ QC.vectorOf rows $+ liftM2+ (\start row -> zip [start..] row)+ (QC.choose (0,cols-width))+ (QC.vectorOf width QC.arbitrary)++ return $+ BandGramian (A.lift width)+ (Sparse.Rows (A.lift cols) (A.use m))+++bandedGramian :: BandGramian Word32 -> Bool+bandedGramian (BandGramian width m) =+ Sparse.multiplyColumnsRows (Sparse.transposeRows m) m+ =!=+ BandMatrix.flattenSymmetric (Sparse.realBandedGramian width m)