packages feed

lapack 0.3.1 → 0.3.2

raw patch · 45 files changed

+1124/−324 lines, 45 filesdep +doctest-exitcode-stdiodep ~basedep ~comfort-arraydep ~hypernew-component:exe:lapack-debug

Dependencies added: doctest-exitcode-stdio

Dependency ranges changed: base, comfort-array, hyper, random

Files

Changes.md view
@@ -1,5 +1,19 @@ # Change log for the `lapack` package +## 0.3.2++ * `Orthogonal`: `project`, `affineKernelFromSpan`, `affineSpanFromKernel`,+   `leastSquaresConstraint`, `gaussMarkovLinearModel`++ * `Symmetric.fromHermitian`, `Hermitian.fromSymmetric`++ * `instance Monoid Matrix`, especially `mempty`+   for matrices with static shapes.++ * `Extent.Dimensions`: turn from type family to data family++ * Start using `doctest-extract` for simple tests+ ## 0.3.1   * `Matrix.Symmetric`:
Makefile view
@@ -1,10 +1,16 @@ all:	ReadMe.html Changes.html -run-test:+run-test:	update-test 	runhaskell Setup configure --user --enable-tests -fbuildExamples 	runhaskell Setup build 	runhaskell Setup haddock 	./dist/build/lapack-test/lapack-test +run-test-cabal:	update-test+	cabal test --show-details=streaming++update-test:+	doctest-extract -i src/ -o test/ --module-prefix DocTest --library-main=Main $$(cat test-module.list)+ %.html: %.md-	pandoc --output=$@ $<+	pandoc --standalone --metadata pagetitle="$*" --output=$@ $<
ReadMe.md view
@@ -99,7 +99,7 @@ Vectors are `Storable.Array`s from the [comfort-array](https://hackage.haskell.org/package/comfort-array) package. An array can have a fancy shape-like a shape defined by an Haskell enumeration type,+like a shape defined by an enumeration type, the shape of two appended arrays, a shape that is compatible to a Haskell container type, a rectangular or triangular shape.@@ -157,7 +157,7 @@ ~~~~  The relations are defined using two type tags-in order to support matrix transposition flawlessly.+in order to support matrix transposition without hassle. Using `Small Small` for square matrices and `Big Big` for general matrices appears to be arbitrary, but is chosen such that altering `Small` to `Big`@@ -180,6 +180,8 @@ that always have a unit diagonal by construction. The property of a unit diagonal is preserved by some operations and enables some optimizations by LAPACK.+E.g. solving with a unit triangular matrix does not require division+and thus cannot fail due to division by zero. `NonUnit` is a bit of a misnomer. A `NonUnit` matrix can still have a unit diagonal, but in general it has not and no optimizations will take place.
+ bug/GGGLM.hs view
@@ -0,0 +1,19 @@+module Main where++import qualified Numeric.LAPACK.Orthogonal as Ortho+import qualified Numeric.LAPACK.Matrix as Matrix+import qualified Numeric.LAPACK.Vector as Vector+import Numeric.LAPACK.Matrix (shapeInt)++import Data.Array.Comfort.Shape ((:+:)((:+:)))+++main :: IO ()+main = do+   let ab = Matrix.fromList (shapeInt 0) (shapeInt 0 :+: shapeInt 3) ([]::[Double])+   let d = Vector.fromList (shapeInt 0) []+   let xy = Vector.fromList (shapeInt 0 :+: shapeInt 3) [-3,1,2]+   let a = Matrix.tallFromGeneral $ Matrix.takeLeft ab+   let b = Matrix.takeRight ab+   print $ Ortho.gaussMarkovLinearModel a b d+   print $ Ortho.project (Matrix.wideFromGeneral ab) d xy
lapack.cabal view
@@ -1,10 +1,11 @@+Cabal-Version:    2.2 Name:             lapack-Version:          0.3.1-License:          BSD3+Version:          0.3.2+License:          BSD-3-Clause License-File:     LICENSE Author:           Henning Thielemann <haskell@henning-thielemann.de> Maintainer:       Henning Thielemann <haskell@henning-thielemann.de>-Homepage:         http://hub.darcs.net/thielema/lapack/+Homepage:         https://hub.darcs.net/thielema/lapack/ Category:         Data Structures Synopsis:         Numerical Linear Algebra using LAPACK Description:@@ -17,7 +18,8 @@   .   * Based on @comfort-array@:     Allows to precisely express one-column or one-row matrices,-    as well as dense, square, triangular, banded, symmetric and block matrices.+    as well as dense, square, triangular, banded, symmetric, Hermitian,+    banded Hermitian, blocked and LU or QR decomposed matrices.   .   * Support all data types that are supported by LAPACK,     i.e. Float, Double, Complex Float, Complex Double@@ -40,22 +42,26 @@   .   See also: @hmatrix@. Tested-With:      GHC==7.4.2, GHC==7.8.4, GHC==8.2.2-Cabal-Version:    >=1.8 Build-Type:       Simple Extra-Source-Files:   ReadMe.md   Changes.md   Makefile+  test-module.list  Source-Repository this-  Tag:         0.3.1+  Tag:         0.3.2   Type:        darcs-  Location:    http://hub.darcs.net/thielema/lapack/+  Location:    https://hub.darcs.net/thielema/lapack/  Source-Repository head   Type:        darcs-  Location:    http://hub.darcs.net/thielema/lapack/+  Location:    https://hub.darcs.net/thielema/lapack/ +Flag debug+  Description: Compile programs for demonstrating bugs in the LAPACK implementation.+  Default: False+ Library   Build-Depends:     lapack-ffi >=0.0.1 && <0.1,@@ -77,6 +83,7 @@     utility-ht >=0.0.10 && <0.1,     base >=4.5 && <5 +  Default-Language: Haskell98   GHC-Options:      -Wall   Hs-Source-Dirs:   src   Exposed-Modules:@@ -107,6 +114,7 @@     Numeric.LAPACK.Format     Numeric.LAPACK.Output     Numeric.LAPACK.Example.EconomicAllocation+    Numeric.LAPACK.Example.DividedDifference   Other-Modules:     Numeric.LAPACK.Singular.Plain     Numeric.LAPACK.Orthogonal.Plain@@ -136,7 +144,6 @@     Numeric.LAPACK.Matrix.BandedHermitianPositiveDefinite.Linear     Numeric.LAPACK.Matrix.Shape.Private     Numeric.LAPACK.Matrix.Extent.Private-    Numeric.LAPACK.Matrix.Extent.Kind     Numeric.LAPACK.Matrix.Divide     Numeric.LAPACK.Matrix.Multiply     Numeric.LAPACK.Matrix.Class@@ -171,6 +178,7 @@     data-ref >=0.0.1 && <0.1,     unique-logic-tf >=0.5.1 && <0.6,     random >=1.1 && <1.2,+    doctest-exitcode-stdio >=0.0 && <0.1,     quickcheck-transformer >=0.3 && <0.4,     QuickCheck >=2.5 && <3,     ChasingBottoms >=1.2.2 && <1.4,@@ -181,12 +189,16 @@     utility-ht,     base +  Default-Language: Haskell98   GHC-Options:      -Wall   Hs-Source-Dirs:   test   Main-Is:          Main.hs   Other-Modules:+    DocTest.Numeric.LAPACK.Example.EconomicAllocation+    DocTest.Numeric.LAPACK.Example.DividedDifference+    DocTest.Numeric.LAPACK.Permutation.Private+    DocTest.Main     Test.Shape-    Test.Example     Test.Indexed     Test.Divide     Test.Multiply@@ -208,3 +220,16 @@     Test.Logic     Test.Format     Test.Utility++Executable lapack-debug+  Default-Language: Haskell98+  GHC-Options:      -Wall+  Hs-Source-Dirs:   bug+  Main-Is:          GGGLM.hs+  If flag(debug)+    Build-Depends:+      lapack,+      comfort-array,+      base+  Else+    Buildable: False
+ src/Numeric/LAPACK/Example/DividedDifference.hs view
@@ -0,0 +1,116 @@+{- |+This module demonstrates triangular matrices.++It verifies that the divided difference scheme+nicely fits into a triangular matrix,+where function addition is mapped to matrix addition+and function multiplication is mapped to matrix multiplication.++<http://en.wikipedia.org/wiki/Divided_difference>+-}+module Numeric.LAPACK.Example.DividedDifference where++import qualified Numeric.LAPACK.Matrix.Triangular as Triangular+import qualified Numeric.LAPACK.Matrix.Square as Square+import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape+import qualified Numeric.LAPACK.Matrix as Matrix+import qualified Numeric.LAPACK.Vector as Vector+import Numeric.LAPACK.Matrix (ShapeInt, (#+#), (#-#))+import Numeric.LAPACK.Vector (Vector, (|+|), (|-|))+import Numeric.LAPACK.Format ((##))++import qualified Data.Array.Comfort.Shape as Shape+import qualified Data.Array.Comfort.Storable as Array++import qualified Data.List as List+import Data.Semigroup ((<>))+++{- $setup+>>> import qualified Test.Utility as Util+>>> import Test.Utility (approxArray)+>>>+>>> import qualified Numeric.LAPACK.Vector as Vector+>>> import Numeric.LAPACK.Example.DividedDifference (dividedDifferencesMatrix)+>>> import Numeric.LAPACK.Matrix (ShapeInt, (#+#))+>>> import Numeric.LAPACK.Vector ((|+|))+>>>+>>> import qualified Data.Array.Comfort.Storable as Array+>>>+>>> import qualified Test.QuickCheck as QC+>>>+>>> import Control.Monad (liftM2)+>>> import Data.Tuple.HT (mapPair)+>>> import Data.Semigroup ((<>))+>>>+>>> type Vector = Vector.Vector ShapeInt Float+>>>+>>> genDD :: QC.Gen (Vector, (Vector, Vector))+>>> genDD = do+>>>    (ys0,ys1) <-+>>>       fmap (mapPair (Vector.autoFromList, Vector.autoFromList) .+>>>             unzip . take 10) $+>>>       QC.listOf $ liftM2 (,) (Util.genElement 10) (Util.genElement 10)+>>>    xs <- Util.genDistinct 10 10 $ Array.shape ys0+>>>    return (xs,(ys0,ys1))+-}+++size :: Vector ShapeInt a -> Int+size = Shape.zeroBasedSize . Array.shape++subSlices :: Int -> Vector ShapeInt Float -> Vector ShapeInt Float+subSlices k xs = Vector.drop k xs |-| Vector.take (size xs - k) xs++parameterDifferences :: Vector ShapeInt Float -> [Vector ShapeInt Float]+parameterDifferences xs = map (flip subSlices xs) [1 .. size xs - 1]++dividedDifferences ::+   Vector ShapeInt Float -> Vector ShapeInt Float -> [Vector ShapeInt Float]+dividedDifferences xs ys =+   scanl+      (\ddys dxs -> Vector.divide (subSlices 1 ddys) dxs)+      ys+      (parameterDifferences xs)++{- |+prop> QC.forAll genDD $ \(xs, (ys0,ys1)) -> approxArray (dividedDifferencesMatrix xs (ys0|+|ys1)) (dividedDifferencesMatrix xs ys0 #+# dividedDifferencesMatrix xs ys1)+prop> QC.forAll genDD $ \(xs, (ys0,ys1)) -> approxArray (dividedDifferencesMatrix xs (Vector.mul ys0 ys1)) (dividedDifferencesMatrix xs ys0 <> dividedDifferencesMatrix xs ys1)+-}+dividedDifferencesMatrix ::+   Vector ShapeInt Float -> Vector ShapeInt Float ->+   Triangular.Upper ShapeInt Float+dividedDifferencesMatrix xs ys =+   Triangular.upperFromList MatrixShape.RowMajor (Array.shape xs) $+   concat $ List.transpose $ map Vector.toList $ dividedDifferences xs ys+++parameterDifferencesMatrix ::+   Vector ShapeInt Float -> Triangular.Upper ShapeInt Float+parameterDifferencesMatrix xs =+   let ones = Vector.one $ Array.shape xs+       tp = Matrix.tensorProduct MatrixShape.RowMajor+   in Triangular.takeUpper $ Square.fromGeneral $ tp ones xs #-# tp xs ones+++main :: IO ()+main = do+   let xs  = Vector.autoFromList [0,1,4,9,16]+   let ys0 = Vector.autoFromList [3,1,4,1,5]+   let ys1 = Vector.autoFromList [2,7,1,8,1]++   mapM_ (## "%.4f") $ parameterDifferences xs+   parameterDifferencesMatrix xs ## "%.4f"++   let ddys0 = dividedDifferencesMatrix xs ys0+   let ddys1 = dividedDifferencesMatrix xs ys1+   ddys0 ## "%.4f"+   ddys1 ## "%.4f"+   putStrLn ""++   dividedDifferencesMatrix xs (ys0|+|ys1) ## "%.4f"+   ddys0 #+# ddys1 ## "%.4f"+   putStrLn ""++   dividedDifferencesMatrix xs (Vector.mul ys0 ys1) ## "%.4f"+   ddys0 <> ddys1 ## "%.4f"
src/Numeric/LAPACK/Example/EconomicAllocation.hs view
@@ -17,6 +17,17 @@ import Data.Array.Comfort.Shape ((:+:)((:+:)))  +{- $setup+>>> import Numeric.LAPACK.Example.EconomicAllocation+>>> import Test.Utility (approxVector)+>>>+>>> import qualified Numeric.LAPACK.Vector as Vector+>>> import Numeric.LAPACK.Vector ((+++))+>>>+>>> import qualified Data.Array.Comfort.Storable as Array+-}++ type ZeroInt2 = ShapeInt:+:ShapeInt type Vector sh = Vector.Vector sh Double type Matrix height width = Matrix.General height width Double@@ -75,6 +86,9 @@    in x |-| p #*| (k #-# Square.identityFrom k) #\| y  +{- |+prop> let result = iterated expenses0 balances0 in approxVector result $ compensated expenses0 balances0 +++ Vector.zero (Array.shape $ Vector.takeRight result)+-} main :: IO () main = do    iterated expenses0 balances0 ## "%10.2f"
src/Numeric/LAPACK/Linear/Plain.hs view
@@ -55,7 +55,8 @@ import Numeric.LAPACK.Matrix.Private (Full) import Numeric.LAPACK.Linear.Private (solver, withInfo) import Numeric.LAPACK.Vector (Vector)-import Numeric.LAPACK.Private (copyBlock, copyTransposed, copyToColumnMajor)+import Numeric.LAPACK.Private+         (copyBlock, copyTransposed, copyToColumnMajor, copyToColumnMajorTemp)  import qualified Numeric.LAPACK.FFI.Generic as LapackGen import qualified Numeric.BLAS.FFI.Generic as BlasGen@@ -166,11 +167,7 @@             Transposed -> 'T'       aPtr <-          case orderLU of-            RowMajor -> do-               aPtr <- ContT $ withForeignPtr lu-               atmpPtr <- Call.allocaArray (n*n)-               liftIO $ copyToColumnMajor orderLU n n aPtr atmpPtr-               return atmpPtr+            RowMajor -> copyToColumnMajorTemp orderLU n n lu             ColumnMajor -> ContT $ withForeignPtr lu       ldaPtr <- Call.leadingDim lda       ipivPtr <- fmap Perm.deconsElementPtr $ ContT $ withForeignPtr ipiv
src/Numeric/LAPACK/Matrix.hs view
@@ -50,6 +50,7 @@    Basic.OrderBias, leftBias, rightBias, contiguousBias,    (|||), beside,    (===), above,+   stack,     (|*-),    tensorProduct,@@ -605,6 +606,17 @@ contiguousBias = Basic.ContiguousBias  +stack ::+   (Extent.C vert, Extent.C horiz,+    Shape.C heightA, Eq heightA, Shape.C heightB, Eq heightB,+    Shape.C widthA, Eq widthA, Shape.C widthB, Eq widthB, Class.Floating a) =>+   Full vert horiz heightA widthA a -> General heightA widthB a ->+   General heightB widthA a -> Full vert horiz heightB widthB a ->+   Full vert horiz (heightA:+:heightB) (widthA:+:widthB) a+stack = ArrMatrix.lift4 Basic.stack+++ rowSums ::    (Extent.C vert, Extent.C horiz,     Shape.C height, Shape.C width, Class.Floating a) =>@@ -745,7 +757,7 @@ multiplySquare ::    (Multiply.MultiplySquare typ,     Type.HeightOf typ ~ height, Eq height, Shape.C width,-    Extent.C horiz, Extent.C vert, Class.Floating a) =>+    Extent.C vert, Extent.C horiz, Class.Floating a) =>    Mod.Transposition -> Type.Matrix typ a ->    Full vert horiz height width a -> Full vert horiz height width a multiplySquare = Multiply.transposableSquare
src/Numeric/LAPACK/Matrix/Array.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE UndecidableInstances #-} module Numeric.LAPACK.Matrix.Array (    Matrix(Array),    ArrayMatrix,@@ -178,6 +179,13 @@  instance (Multiply.MultiplySame sh) => Type.MultiplySame (Array sh) where    multiplySame = lift2 Multiply.same++-- requires UndecidableInstances+instance+   (Plain.SquareShape sh, Box.WidthOf sh ~ width, Shape.Static width) =>+      Type.StaticIdentity (Array sh) where+   staticIdentity =+      lift0 $ Plain.identityOrder MatrixShape.RowMajor Shape.static   zero ::
src/Numeric/LAPACK/Matrix/Basic.hs view
@@ -11,7 +11,7 @@          (Order(RowMajor, ColumnMajor), transposeFromOrder, flipOrder) import Numeric.LAPACK.Matrix.Modifier (Conjugation(NonConjugated)) import Numeric.LAPACK.Matrix.Private-         (Full, Tall, Wide, General, ShapeInt, revealOrder)+         (Full, Tall, Wide, General, fromFull, ShapeInt, revealOrder) import Numeric.LAPACK.Vector (Vector) import Numeric.LAPACK.Scalar (RealOf, zero, one) import Numeric.LAPACK.Shape.Private (Unchecked(Unchecked))@@ -347,6 +347,24 @@    Full Extent.Big horizC (heightA:+:heightB) width a above orderBias appendMode a b =    transpose $ beside orderBias appendMode (transpose a) (transpose b)++stack ::+   (Extent.C vert, Extent.C horiz,+    Shape.C heightA, Eq heightA, Shape.C heightB, Eq heightB,+    Shape.C widthA, Eq widthA, Shape.C widthB, Eq widthB, Class.Floating a) =>+   Full vert horiz heightA widthA a -> General heightA widthB a ->+   General heightB widthA a -> Full vert horiz heightB widthB a ->+   Full vert horiz (heightA:+:heightB) (widthA:+:widthB) a+stack a b c d =+   Array.mapShape+      (\(MatrixShape.Full order _) ->+         MatrixShape.Full order $+         Extent.stack+            (MatrixShape.fullExtent $ Array.shape a)+            (MatrixShape.fullExtent $ Array.shape d)) $+   above RightBias Extent.appendAny+      (beside RightBias Extent.appendAny (fromFull a) b)+      (beside RightBias Extent.appendAny c (fromFull d))   liftRowMajor ::
src/Numeric/LAPACK/Matrix/Divide.hs view
@@ -33,7 +33,7 @@    {-# MINIMAL solve | solveLeft,solveRight #-}    solve ::       (Type.HeightOf typ ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Transposition -> Matrix typ a ->       Full vert horiz height width a -> Full vert horiz height width a    solve NonTransposed a b = solveRight a b@@ -41,14 +41,14 @@     solveRight ::       (Type.HeightOf typ ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Matrix typ a ->       Full vert horiz height width a -> Full vert horiz height width a    solveRight = solve NonTransposed     solveLeft ::       (Type.WidthOf typ ~ width, Eq width, Shape.C height,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Full vert horiz height width a ->       Matrix typ a -> Full vert horiz height width a    solveLeft = Basic.swapMultiply $ solve Transposed@@ -61,14 +61,14 @@  (#\##) ::    (Solve typ, Type.HeightOf typ ~ height, Eq height, Shape.C width,-    Extent.C horiz, Extent.C vert, Class.Floating a) =>+    Extent.C vert, Extent.C horiz, Class.Floating a) =>    Matrix typ a ->    Full vert horiz height width a -> Full vert horiz height width a (#\##) = solveRight  (##/#) ::    (Solve typ, Type.WidthOf typ ~ width, Eq width, Shape.C height,-    Extent.C horiz, Extent.C vert, Class.Floating a) =>+    Extent.C vert, Extent.C horiz, Class.Floating a) =>    Full vert horiz height width a ->    Matrix typ a -> Full vert horiz height width a (##/#) = solveLeft
− src/Numeric/LAPACK/Matrix/Extent/Kind.hs
@@ -1,35 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE GADTs #-}-module Numeric.LAPACK.Matrix.Extent.Kind where---data General height width =-   General {-      generalHeight :: height,-      generalWidth :: width-   } deriving (Eq, Show)--data Tall height width =-   Tall {-      tallHeight :: height,-      tallWidth :: width-   } deriving (Eq, Show)--data Wide height width =-   Wide {-      wideHeight :: height,-      wideWidth :: width-   } deriving (Eq, Show)--data Square height width =-   (height ~ width) =>-   Square {-      squareSize :: height-   }--instance (Eq height, Eq width) => Eq (Square height width) where-   Square a == Square b  =  a==b--instance (Show height, Show width) => Show (Square height width) where-   showsPrec p (Square s) =-      showParen (p>10) (showString "Square " . showsPrec 11 s)
src/Numeric/LAPACK/Matrix/Extent/Private.hs view
@@ -4,7 +4,6 @@ {-# LANGUAGE GADTs #-} module Numeric.LAPACK.Matrix.Extent.Private where -import qualified Numeric.LAPACK.Matrix.Extent.Kind as EK import Numeric.LAPACK.Shape.Private (Unchecked(deconsUnchecked)) import Numeric.LAPACK.Wrapper (Flip(Flip, getFlip)) @@ -13,15 +12,10 @@ import Control.DeepSeq (NFData, rnf)  import Data.Maybe.HT (toMaybe)-import Data.Tuple.HT (swap) import Data.Eq.HT (equating)  -data Extent vertical horizontal height width =-   Extent {-      extentDir :: (vertical,horizontal),-      extentDim :: Dimensions vertical horizontal height width-   }+data family Extent vertical horizontal :: * -> * -> *  instance    (C vertical, C horizontal, NFData height, NFData width) =>@@ -29,10 +23,10 @@    rnf =       getAccessor $       switchTagPair-         (Accessor $ \(Extent o (EK.Square s)) -> rnf (o,s))-         (Accessor $ \(Extent o (EK.Wide h w)) -> rnf (o,(h,w)))-         (Accessor $ \(Extent o (EK.Tall h w)) -> rnf (o,(h,w)))-         (Accessor $ \(Extent o (EK.General h w)) -> rnf (o,(h,w)))+         (Accessor $ \(Square s) -> rnf s)+         (Accessor $ \(Wide h w) -> rnf (h,w))+         (Accessor $ \(Tall h w) -> rnf (h,w))+         (Accessor $ \(General h w) -> rnf (h,w))   data Big = Big deriving (Eq,Show)@@ -47,25 +41,42 @@ type Square sh = Extent Small Small sh sh  -type family Dimensions vertical horizontal :: * -> * -> *+data instance Extent Big Big height width =+   General {+      generalHeight :: height,+      generalWidth :: width+   } -type instance Dimensions Big Big = EK.General-type instance Dimensions Big Small = EK.Tall-type instance Dimensions Small Big = EK.Wide-type instance Dimensions Small Small = EK.Square+data instance Extent Big Small height width =+   Tall {+      tallHeight :: height,+      tallWidth :: width+   } +data instance Extent Small Big height width =+   Wide {+      wideHeight :: height,+      wideWidth :: width+   } +data instance Extent Small Small height width =+   (height ~ width) =>+   Square {+      squareSize :: height+   }++ general :: height -> width -> General height width-general h w = Extent (Big,Big) $ EK.General h w+general = General  tall :: height -> width -> Tall height width-tall h w = Extent (Big,Small) $ EK.Tall h w+tall = Tall  wide :: height -> width -> Wide height width-wide h w = Extent (Small,Big) $ EK.Wide h w+wide = Wide  square :: sh -> Square sh-square sh = Extent (Small,Small) $ EK.Square sh+square = Square   newtype Map vertA horizA vertB horizB height width =@@ -106,10 +117,10 @@ caseTallWide ge =    getCaseTallWide $    switchTagPair-      (CaseTallWide $ \(Extent _ (EK.Square sh)) -> Left $ tall sh sh)+      (CaseTallWide $ \(Square sh) -> Left $ tall sh sh)       (CaseTallWide Right)       (CaseTallWide Left)-      (CaseTallWide $ \(Extent _ (EK.General h w)) ->+      (CaseTallWide $ \(General h w) ->          if ge h w             then Left $ tall h w             else Right $ wide h w)@@ -138,8 +149,8 @@ generalizeTall =    getGenTall $    switchTagPair-      (GenTall id) (GenTall $ \(Extent _ (EK.Square s)) -> wide s s)-      (GenTall id) (GenTall $ \(Extent _ (EK.Tall h w)) -> general h w)+      (GenTall id) (GenTall $ \(Square s) -> wide s s)+      (GenTall id) (GenTall $ \(Tall h w) -> general h w)  newtype GenWide height width vert horiz =    GenWide {@@ -154,8 +165,8 @@    switchTagPair       (GenWide id)       (GenWide id)-      (GenWide $ \(Extent _ (EK.Square s)) -> tall s s)-      (GenWide $ \(Extent _ (EK.Wide h w)) -> general h w)+      (GenWide $ \(Square s) -> tall s s)+      (GenWide $ \(Wide h w) -> general h w)   newtype GenToTall height width vert horiz =@@ -169,8 +180,8 @@ genToTall =    getGenToTall $    switchTagPair-      (GenToTall $ \(Extent _ (EK.Square s)) -> tall s s)-      (GenToTall $ \(Extent _ (EK.Wide h w)) -> general h w)+      (GenToTall $ \(Square s) -> tall s s)+      (GenToTall $ \(Wide h w) -> general h w)       (GenToTall id)       (GenToTall id) @@ -186,16 +197,12 @@ genToWide =    getGenToWide $    switchTagPair-      (GenToWide $ \(Extent _ (EK.Square s)) -> wide s s)+      (GenToWide $ \(Square s) -> wide s s)       (GenToWide id)-      (GenToWide $ \(Extent _ (EK.Tall h w)) -> general h w)+      (GenToWide $ \(Tall h w) -> general h w)       (GenToWide id)  -squareSize :: Square sh -> sh-squareSize (Extent (Small,Small) (EK.Square sh)) = sh-- newtype Accessor a height width vert horiz =    Accessor {getAccessor :: Extent vert horiz height width -> a} @@ -203,19 +210,19 @@ height =    getAccessor $    switchTagPair-      (Accessor (\(Extent _ (EK.Square s)) -> s))-      (Accessor (EK.wideHeight . extentDim))-      (Accessor (EK.tallHeight . extentDim))-      (Accessor (EK.generalHeight . extentDim))+      (Accessor squareSize)+      (Accessor wideHeight)+      (Accessor tallHeight)+      (Accessor generalHeight)  width :: (C vert, C horiz) => Extent vert horiz height width -> width width =    getAccessor $    switchTagPair-      (Accessor (\(Extent _ (EK.Square s)) -> s))-      (Accessor (EK.wideWidth . extentDim))-      (Accessor (EK.tallWidth . extentDim))-      (Accessor (EK.generalWidth . extentDim))+      (Accessor (\(Square s) -> s))+      (Accessor wideWidth)+      (Accessor tallWidth)+      (Accessor generalWidth)   dimensions ::@@ -232,7 +239,7 @@  fromSquareLiberal :: (C vert, C horiz) =>    Extent Small Small height width -> Extent vert horiz height width-fromSquareLiberal x@(Extent _ (EK.Square _)) = genSquare $ height x+fromSquareLiberal (Square s) = genSquare s  squareFromGeneral ::    (C vert, C horiz, Eq size) =>@@ -258,10 +265,10 @@ transpose =    getTranspose $    switchTagPair-      (Transpose $ \(Extent o (EK.Square s)) -> Extent o (EK.Square s))-      (Transpose $ \(Extent o (EK.Wide h w)) -> Extent (swap o) (EK.Tall w h))-      (Transpose $ \(Extent o (EK.Tall h w)) -> Extent (swap o) (EK.Wide w h))-      (Transpose $ \(Extent o (EK.General h w)) -> Extent o (EK.General w h))+      (Transpose $ \(Square s) -> Square s)+      (Transpose $ \(Wide h w) -> Tall w h)+      (Transpose $ \(Tall h w) -> Wide w h)+      (Transpose $ \(General h w) -> General w h)   newtype Equal height width vert horiz =@@ -277,10 +284,11 @@    (==) =       getEqual $       switchTagPair-         (Equal $ equating extentDim)-         (Equal $ equating extentDim)-         (Equal $ equating extentDim)-         (Equal $ equating extentDim)+         (Equal $ \(Square a) (Square b) -> a==b)+         (Equal $ \a b -> equating wideHeight a b && equating wideWidth a b)+         (Equal $ \a b -> equating tallHeight a b && equating tallWidth a b)+         (Equal $ \a b ->+            equating generalHeight a b && equating generalWidth a b)   instance@@ -324,8 +332,8 @@ widen w =    getWiden $    switchTag-      (Widen (\(Extent o x) -> Extent o (x{EK.wideWidth = w})))-      (Widen (\(Extent o x) -> Extent o (x{EK.generalWidth = w})))+      (Widen (\x -> x{wideWidth = w}))+      (Widen (\x -> x{generalWidth = w}))  reduceWideHeight ::    (C vert) =>@@ -333,8 +341,8 @@ reduceWideHeight h =    getWiden $    switchTag-      (Widen (\(Extent o x) -> Extent o (x{EK.wideHeight = h})))-      (Widen (\(Extent o x) -> Extent o (x{EK.generalHeight = h})))+      (Widen (\x -> x{wideHeight = h}))+      (Widen (\x -> x{generalHeight = h}))   newtype Adapt heightA widthA heightB widthB vert horiz =@@ -351,10 +359,10 @@ reduceConsistent h w =    getAdapt $    switchTagPair-      (Adapt $ \(Extent o (EK.Square _)) -> Extent o (EK.Square h))-      (Adapt $ \(Extent o (EK.Wide _ _)) -> Extent o (EK.Wide h w))-      (Adapt $ \(Extent o (EK.Tall _ _)) -> Extent o (EK.Tall h w))-      (Adapt $ \(Extent o (EK.General _ _)) -> Extent o (EK.General h w))+      (Adapt $ \(Square _) -> Square h)+      (Adapt $ \(Wide _ _) -> Wide h w)+      (Adapt $ \(Tall _ _) -> Tall h w)+      (Adapt $ \(General _ _) -> General h w)   class (C vert, C horiz) => GeneralTallWide vert horiz where@@ -371,9 +379,9 @@ mapHeight f =    getAdapt $    switchTagGTW-      (Adapt $ \(Extent o (EK.Wide h w)) -> Extent o (EK.Wide (f h) w))-      (Adapt $ \(Extent o (EK.Tall h w)) -> Extent o (EK.Tall (f h) w))-      (Adapt $ \(Extent o (EK.General h w)) -> Extent o (EK.General (f h) w))+      (Adapt $ \(Wide h w) -> Wide (f h) w)+      (Adapt $ \(Tall h w) -> Tall (f h) w)+      (Adapt $ \(General h w) -> General (f h) w)  mapWidth ::    (GeneralTallWide vert horiz) =>@@ -382,12 +390,12 @@ mapWidth f =    getAdapt $    switchTagGTW-      (Adapt $ \(Extent o (EK.Wide h w)) -> Extent o (EK.Wide h (f w)))-      (Adapt $ \(Extent o (EK.Tall h w)) -> Extent o (EK.Tall h (f w)))-      (Adapt $ \(Extent o (EK.General h w)) -> Extent o (EK.General h (f w)))+      (Adapt $ \(Wide h w) -> Wide h (f w))+      (Adapt $ \(Tall h w) -> Tall h (f w))+      (Adapt $ \(General h w) -> General h (f w))  mapSquareSize :: (shA -> shB) -> Square shA -> Square shB-mapSquareSize f (Extent o (EK.Square s)) = Extent o (EK.Square (f s))+mapSquareSize f (Square s) = Square (f s)   mapWrap ::@@ -399,11 +407,10 @@ mapWrap fh fw =    getAdapt $    switchTagPair-      (Adapt $ \(Extent o (EK.Square h)) -> Extent o (EK.Square (fh h)))-      (Adapt $ \(Extent o (EK.Wide h w)) -> Extent o (EK.Wide (fh h) (fw w)))-      (Adapt $ \(Extent o (EK.Tall h w)) -> Extent o (EK.Tall (fh h) (fw w)))-      (Adapt $ \(Extent o (EK.General h w)) ->-                  Extent o (EK.General (fh h) (fw w)))+      (Adapt $ \(Square h) -> Square (fh h))+      (Adapt $ \(Wide h w) -> Wide (fh h) (fw w))+      (Adapt $ \(Tall h w) -> Tall (fh h) (fw w))+      (Adapt $ \(General h w) -> General (fh h) (fw w))  {- only admissible since GHC-7.8 mapUnwrap ::@@ -415,11 +422,10 @@ mapUnwrap fh fw =    getAdapt $    switchTagPair-      (Adapt $ \(Extent o (EK.Square h)) -> Extent o (EK.Square (fh h)))-      (Adapt $ \(Extent o (EK.Wide h w)) -> Extent o (EK.Wide (fh h) (fw w)))-      (Adapt $ \(Extent o (EK.Tall h w)) -> Extent o (EK.Tall (fh h) (fw w)))-      (Adapt $ \(Extent o (EK.General h w)) ->-                  Extent o (EK.General (fh h) (fw w)))+      (Adapt $ \(Square h) -> Square (fh h))+      (Adapt $ \(Wide h w) -> Wide (fh h) (fw w))+      (Adapt $ \(Tall h w) -> Tall (fh h) (fw w))+      (Adapt $ \(General h w) -> General (fh h) (fw w)) -}  recheck ::@@ -429,14 +435,11 @@ recheck =    getAdapt $    switchTagPair-      (Adapt $ \(Extent o (EK.Square h)) ->-         Extent o (EK.Square (deconsUnchecked h)))-      (Adapt $ \(Extent o (EK.Wide h w)) ->-         Extent o (EK.Wide (deconsUnchecked h) (deconsUnchecked w)))-      (Adapt $ \(Extent o (EK.Tall h w)) ->-         Extent o (EK.Tall (deconsUnchecked h) (deconsUnchecked w)))-      (Adapt $ \(Extent o (EK.General h w)) ->-         Extent o (EK.General (deconsUnchecked h) (deconsUnchecked w)))+      (Adapt $ \(Square h) -> Square (deconsUnchecked h))+      (Adapt $ \(Wide h w) -> Wide (deconsUnchecked h) (deconsUnchecked w))+      (Adapt $ \(Tall h w) -> Tall (deconsUnchecked h) (deconsUnchecked w))+      (Adapt $ \(General h w) ->+                              General (deconsUnchecked h) (deconsUnchecked w))   @@ -456,48 +459,18 @@ fuse =    getFuse $    switchTagPair-      (Fuse $-       \(Extent o (EK.Square s0)) (Extent _ (EK.Square s1)) ->-         toMaybe (s0==s1) $ Extent o (EK.Square s0))-      (Fuse $-       \(Extent o (EK.Wide h f0)) (Extent _ (EK.Wide f1 w)) ->-         toMaybe (f0==f1) $ Extent o (EK.Wide h w))-      (Fuse $-       \(Extent o (EK.Tall h f0)) (Extent _ (EK.Tall f1 w)) ->-         toMaybe (f0==f1) $ Extent o (EK.Tall h w))-      (Fuse $-       \(Extent o (EK.General h f0)) (Extent _ (EK.General f1 w)) ->-         toMaybe (f0==f1) $ Extent o (EK.General h w))+      (Fuse $ \(Square s0) (Square s1) -> toMaybe (s0==s1) $ Square s0)+      (Fuse $ \(Wide h f0) (Wide f1 w) -> toMaybe (f0==f1) $ Wide h w)+      (Fuse $ \(Tall h f0) (Tall f1 w) -> toMaybe (f0==f1) $ Tall h w)+      (Fuse $ \(General h f0) (General f1 w) -> toMaybe (f0==f1) $ General h w)  -newtype Kronecker heightA widthA heightB widthB vert horiz =-   Kronecker {-      getKronecker ::-         Extent vert horiz heightA widthA ->-         Extent vert horiz heightB widthB ->-         Extent vert horiz (heightA,heightB) (widthA,widthB)-   }- kronecker ::    (C vert, C horiz) =>    Extent vert horiz heightA widthA ->    Extent vert horiz heightB widthB ->    Extent vert horiz (heightA,heightB) (widthA,widthB)-kronecker =-   getKronecker $-   switchTagPair-      (Kronecker $-       \(Extent o (EK.Square s0)) (Extent _ (EK.Square s1)) ->-         Extent o (EK.Square (s0,s1)))-      (Kronecker $-       \(Extent o (EK.Wide h0 w0)) (Extent _ (EK.Wide h1 w1)) ->-         Extent o (EK.Wide (h0,h1) (w0,w1)))-      (Kronecker $-       \(Extent o (EK.Tall h0 w0)) (Extent _ (EK.Tall h1 w1)) ->-         Extent o (EK.Tall (h0,h1) (w0,w1)))-      (Kronecker $-       \(Extent o (EK.General h0 w0)) (Extent _ (EK.General h1 w1)) ->-         Extent o (EK.General (h0,h1) (w0,w1)))+kronecker = stackGen (,) (,)   @@ -561,6 +534,41 @@    AppendMode vertA vertB (Append vertA vertB) height widthA widthB appendAny =    getAppendAny $ switchTag (AppendAny appendLeftAux) (AppendAny appendRight)+++stack ::+   (C vert, C horiz) =>+   Extent vert horiz heightA widthA ->+   Extent vert horiz heightB widthB ->+   Extent vert horiz (heightA:+:heightB) (widthA:+:widthB)+stack = stackGen (:+:) (:+:)++newtype Stack f heightA widthA heightB widthB vert horiz =+   Stack {+      getStack ::+         Extent vert horiz heightA widthA ->+         Extent vert horiz heightB widthB ->+         Extent vert horiz (f heightA heightB) (f widthA widthB)+   }++stackGen ::+   (C vert, C horiz) =>+   (heightA -> heightB -> f heightA heightB) ->+   (widthA -> widthB -> f widthA widthB) ->+   Extent vert horiz heightA widthA ->+   Extent vert horiz heightB widthB ->+   Extent vert horiz (f heightA heightB) (f widthA widthB)+stackGen fh fw =+   getStack $+   switchTagPair+      (Stack $ \(Square sa) (Square sb) ->+         Square (fh sa sb))+      (Stack $ \(Wide ha wa) (Wide hb wb) ->+         Wide (fh ha hb) (fw wa wb))+      (Stack $ \(Tall ha wa) (Tall hb wb) ->+         Tall (fh ha hb) (fw wa wb))+      (Stack $ \(General ha wa) (General hb wb) ->+         General (fh ha hb) (fw wa wb))   
src/Numeric/LAPACK/Matrix/Hermitian.hs view
@@ -25,7 +25,7 @@    sumRank1, sumRank1NonEmpty,    sumRank2, sumRank2NonEmpty, -   toSquare,+   toSquare, fromSymmetric,    gramian,            gramianAdjoint,    congruenceDiagonal, congruenceDiagonalAdjoint,    congruence,         congruenceAdjoint,@@ -46,7 +46,7 @@ import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix import qualified Numeric.LAPACK.Matrix.Shape.Private as MatrixShape import qualified Numeric.LAPACK.Matrix.Extent as Extent-import Numeric.LAPACK.Matrix.Array.Triangular (Hermitian)+import Numeric.LAPACK.Matrix.Array.Triangular (Hermitian, Symmetric) import Numeric.LAPACK.Matrix.Array (Full, General, Square) import Numeric.LAPACK.Matrix.Shape.Private (Order) import Numeric.LAPACK.Matrix.Modifier (Transposition(NonTransposed, Transposed))@@ -186,9 +186,15 @@ sumRank2NonEmpty order (NonEmpty.Cons xy xys) =    sumRank2 order (Array.shape $ fst $ snd xy) (xy:xys) + toSquare ::    (Shape.C sh, Class.Floating a) => Hermitian sh a -> Square sh a toSquare = ArrMatrix.lift1 Basic.toSquare++fromSymmetric :: (Shape.C sh, Class.Real a) => Symmetric sh a -> Hermitian sh a+fromSymmetric =+   ArrMatrix.lift1 $ Array.mapShape MatrixShape.hermitianFromSymmetric+  {- | gramian A = A^H * A
src/Numeric/LAPACK/Matrix/Hermitian/Basic.hs view
@@ -428,7 +428,7 @@    \bPtr -> gramianIO order a bPtr $ gramianParameters order extent  gramianParameters ::-   (Extent.C horiz, Extent.C vert, Shape.C height, Shape.C width) =>+   (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width) =>    Order ->    Extent.Extent vert horiz height width ->    ((Int, Int), (Char, Char, Int))@@ -450,7 +450,7 @@    \bPtr -> gramianIO order a bPtr $ gramianAdjointParameters order extent  gramianAdjointParameters ::-   (Extent.C horiz, Extent.C vert, Shape.C height, Shape.C width) =>+   (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width) =>    Order ->    Extent.Extent vert horiz height width ->    ((Int, Int), (Char, Char, Int))
src/Numeric/LAPACK/Matrix/HermitianPositiveDefinite/Linear.hs view
@@ -61,8 +61,7 @@             LapackGen.pptrs uploPtr nPtr nrhsPtr apPtr xPtr ldxPtr  -inverse ::-   (Shape.C sh, Class.Floating a) => Hermitian sh a -> Hermitian sh a+inverse :: (Shape.C sh, Class.Floating a) => Hermitian sh a -> Hermitian sh a inverse    (Array shape@(MatrixShape.Hermitian order sh) a) =       Array.unsafeCreateWithSize shape $ \triSize bPtr -> do@@ -75,8 +74,7 @@          withInfo definiteMsg "pptrf" $ LapackGen.pptrf uploPtr nPtr bPtr          withInfo rankMsg "pptri" $ LapackGen.pptri uploPtr nPtr bPtr -decompose ::-   (Shape.C sh, Class.Floating a) => Hermitian sh a -> Upper sh a+decompose :: (Shape.C sh, Class.Floating a) => Hermitian sh a -> Upper sh a decompose    (Array (MatrixShape.Hermitian order sh) a) =       Array.unsafeCreateWithSize@@ -91,8 +89,7 @@          withInfo definiteMsg "pptrf" $ LapackGen.pptrf uploPtr nPtr bPtr  -determinant ::-   (Shape.C sh, Class.Floating a) => Hermitian sh a -> RealOf a+determinant :: (Shape.C sh, Class.Floating a) => Hermitian sh a -> RealOf a determinant =    getDeterminant $    Class.switchFloating
src/Numeric/LAPACK/Matrix/Multiply.hs view
@@ -75,7 +75,7 @@    {-# MINIMAL transposableSquare | fullSquare,squareFull #-}    transposableSquare ::       (Type.HeightOf typ ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Transposition -> Matrix typ a ->       Full vert horiz height width a -> Full vert horiz height width a    transposableSquare NonTransposed a b = squareFull a b@@ -84,14 +84,14 @@     squareFull ::       (Type.HeightOf typ ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Matrix typ a ->       Full vert horiz height width a -> Full vert horiz height width a    squareFull = transposableSquare NonTransposed     fullSquare ::       (Type.WidthOf typ ~ width, Eq width, Shape.C height,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Full vert horiz height width a ->       Matrix typ a -> Full vert horiz height width a    fullSquare b a =@@ -102,14 +102,14 @@  (#*##) ::    (MultiplySquare typ, Type.HeightOf typ ~ height, Eq height, Shape.C width,-    Extent.C horiz, Extent.C vert, Class.Floating a) =>+    Extent.C vert, Extent.C horiz, Class.Floating a) =>    Matrix typ a ->    Full vert horiz height width a -> Full vert horiz height width a (#*##) = squareFull  (##*#) ::    (MultiplySquare typ, Type.WidthOf typ ~ width, Eq width, Shape.C height,-    Extent.C horiz, Extent.C vert, Class.Floating a) =>+    Extent.C vert, Extent.C horiz, Class.Floating a) =>    Full vert horiz height width a ->    Matrix typ a -> Full vert horiz height width a (##*#) = fullSquare
src/Numeric/LAPACK/Matrix/Plain/Divide.hs view
@@ -50,7 +50,7 @@    {-# MINIMAL solve | solveLeft,solveRight #-}    solve ::       (Class.Floating a, Box.HeightOf shape ~ height, Eq height,-       Extent.C horiz, Extent.C vert, Shape.C width) =>+       Extent.C vert, Extent.C horiz, Shape.C width) =>       Transposition -> Array shape a ->       Full vert horiz height width a -> Full vert horiz height width a    solve NonTransposed a b = solveRight a b@@ -58,14 +58,14 @@     solveRight ::       (Class.Floating a, Box.HeightOf shape ~ height, Eq height,-       Extent.C horiz, Extent.C vert, Shape.C width) =>+       Extent.C vert, Extent.C horiz, Shape.C width) =>       Array shape a ->       Full vert horiz height width a -> Full vert horiz height width a    solveRight = solve NonTransposed     solveLeft ::       (Class.Floating a, Box.HeightOf shape ~ width, Eq width,-       Extent.C horiz, Extent.C vert, Shape.C height) =>+       Extent.C vert, Extent.C horiz, Shape.C height) =>       Full vert horiz height width a ->       Array shape a ->       Full vert horiz height width a
src/Numeric/LAPACK/Matrix/Plain/Multiply.hs view
@@ -104,7 +104,7 @@    {-# MINIMAL transposableSquare | fullSquare,squareFull #-}    transposableSquare ::       (Box.HeightOf shape ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Transposition -> Array shape a ->       Full vert horiz height width a -> Full vert horiz height width a    transposableSquare NonTransposed a b = squareFull a b@@ -112,14 +112,14 @@     squareFull ::       (Box.HeightOf shape ~ height, Eq height, Shape.C width,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Array shape a ->       Full vert horiz height width a -> Full vert horiz height width a    squareFull = transposableSquare NonTransposed     fullSquare ::       (Box.WidthOf shape ~ width, Eq width, Shape.C height,-       Extent.C horiz, Extent.C vert, Class.Floating a) =>+       Extent.C vert, Extent.C horiz, Class.Floating a) =>       Full vert horiz height width a ->       Array shape a -> Full vert horiz height width a    fullSquare = swapMultiply $ transposableSquare Transposed
src/Numeric/LAPACK/Matrix/Private.hs view
@@ -69,7 +69,7 @@   revealOrder ::-   (Extent.C horiz, Extent.C vert) =>+   (Extent.C vert, Extent.C horiz) =>    Full vert horiz height width a ->    Either (Array (height,width) a) (Array (width,height) a) revealOrder (Array (MatrixShape.Full order extent) a) =
src/Numeric/LAPACK/Matrix/Shape/Private.hs view
@@ -363,6 +363,10 @@    height = hermitianSize    width = hermitianSize +hermitianFromSymmetric :: Symmetric size -> Hermitian size+hermitianFromSymmetric (Triangular _diag _uplo order size) =+   Hermitian order size+ uploFromOrder :: Order -> Char uploFromOrder RowMajor = 'L' uploFromOrder ColumnMajor = 'U'@@ -413,6 +417,10 @@    type WidthOf (Triangular lo diag up size) = size    height = triangularSize    width = triangularSize++symmetricFromHermitian :: Hermitian size -> Symmetric size+symmetricFromHermitian (Hermitian order size) =+   Triangular NonUnit autoUplo order size   data Unit = Unit deriving (Eq, Show)
src/Numeric/LAPACK/Matrix/Square/Basic.hs view
@@ -196,13 +196,7 @@    Square sizeA a -> Full vert horiz sizeA sizeB a ->    Full horiz vert sizeB sizeA a -> Square sizeB a ->    Square (sizeA:+:sizeB) a-stack a b c d =-   fromGeneral $-   Basic.above Basic.RightBias Extent.appendAny-      (Basic.beside Basic.RightBias Extent.appendAny-         (Matrix.fromFull a) (Matrix.fromFull b))-      (Basic.beside Basic.RightBias Extent.appendAny-         (Matrix.fromFull c) (Matrix.fromFull d))+stack a b c d = Basic.stack a (Matrix.fromFull b) (Matrix.fromFull c) d   square :: (Shape.C sh, Class.Floating a) => Square sh a -> Square sh a
src/Numeric/LAPACK/Matrix/Square/Linear.hs view
@@ -14,7 +14,7 @@ import Numeric.LAPACK.Matrix.Shape.Private (transposeFromOrder) import Numeric.LAPACK.Matrix.Private (Full, Square, argSquare) import Numeric.LAPACK.Private-         (withAutoWorkspaceInfo, copyBlock, copyToTemp, copyToColumnMajor)+         (withAutoWorkspaceInfo, copyBlock, copyToTemp, copyToColumnMajorTemp)  import qualified Numeric.LAPACK.FFI.Generic as LapackGen import qualified Numeric.Netlib.Utility as Call@@ -55,14 +55,12 @@ _solve =    argSquare $ \orderA shA a ->    solver "Square.solve" shA $ \n nPtr nrhsPtr xPtr ldxPtr -> do-      aPtr <- ContT $ withForeignPtr a-      atmpPtr <- Call.allocaArray (n*n)+      aPtr <- copyToColumnMajorTemp orderA n n a       ldaPtr <- Call.leadingDim n       ipivPtr <- Call.allocaArray n       liftIO $ do-         copyToColumnMajor orderA n n aPtr atmpPtr          withInfo "gesv" $-            LapackGen.gesv nPtr nrhsPtr atmpPtr ldaPtr ipivPtr xPtr ldxPtr+            LapackGen.gesv nPtr nrhsPtr aPtr ldaPtr ipivPtr xPtr ldxPtr   inverse :: (Shape.C sh, Class.Floating a) => Square sh a -> Square sh a
src/Numeric/LAPACK/Matrix/Symmetric.hs view
@@ -13,6 +13,7 @@    split,     toSquare,+   fromHermitian,     gramian,            gramianTransposed,    congruenceDiagonal, congruenceDiagonalTransposed,@@ -26,7 +27,7 @@ import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix import qualified Numeric.LAPACK.Matrix.Shape.Private as MatrixShape import qualified Numeric.LAPACK.Matrix.Extent as Extent-import Numeric.LAPACK.Matrix.Array.Triangular (Symmetric)+import Numeric.LAPACK.Matrix.Array.Triangular (Symmetric, Hermitian) import Numeric.LAPACK.Matrix.Array (Full, General, Square) import Numeric.LAPACK.Matrix.Shape.Private (Order) import Numeric.LAPACK.Matrix.Private (ShapeInt)@@ -35,6 +36,7 @@  import qualified Numeric.Netlib.Class as Class +import qualified Data.Array.Comfort.Storable as Array import qualified Data.Array.Comfort.Shape as Shape import Data.Array.Comfort.Shape ((:+:)) @@ -60,6 +62,10 @@  toSquare :: (Shape.C sh, Class.Floating a) => Symmetric sh a -> Square sh a toSquare = Triangular.toSquare++fromHermitian :: (Shape.C sh, Class.Real a) => Hermitian sh a -> Symmetric sh a+fromHermitian =+   ArrMatrix.lift1 $ Array.mapShape MatrixShape.symmetricFromHermitian   identity :: (Shape.C sh, Class.Floating a) => Order -> sh -> Symmetric sh a
src/Numeric/LAPACK/Matrix/Symmetric/Basic.hs view
@@ -51,7 +51,7 @@    \bPtr -> gramianIO order a bPtr $ gramianParameters order extent  gramianParameters ::-   (Extent.C horiz, Extent.C vert, Shape.C height, Shape.C width) =>+   (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width) =>    Order ->    Extent.Extent vert horiz height width ->    ((Int, Int), (Char, Char, Int))@@ -73,7 +73,7 @@    \bPtr -> gramianIO order a bPtr $ gramianTransposedParameters order extent  gramianTransposedParameters ::-   (Extent.C horiz, Extent.C vert, Shape.C height, Shape.C width) =>+   (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width) =>    Order ->    Extent.Extent vert horiz height width ->    ((Int, Int), (Char, Char, Int))
src/Numeric/LAPACK/Matrix/Type.hs view
@@ -16,6 +16,7 @@  import qualified Data.Array.Comfort.Shape as Shape +import Data.Monoid (Monoid, mempty, mappend) import Data.Semigroup (Semigroup, (<>))  @@ -80,6 +81,22 @@ instance (Shape.C sh, Eq sh) => MultiplySame (Perm.Permutation sh) where    multiplySame (Permutation a) (Permutation b) =       Permutation $ Perm.multiply b a+++instance+   (MultiplySame typ, StaticIdentity typ, Class.Floating a) =>+      Monoid (Matrix typ a) where+   mappend = (<>)+   mempty = staticIdentity++class StaticIdentity typ where+   staticIdentity :: (Class.Floating a) => Matrix typ a++instance (Shape.Static shape) => StaticIdentity (Scale shape) where+   staticIdentity = Scale Shape.static 1++instance (Shape.Static sh) => StaticIdentity (Perm.Permutation sh) where+   staticIdentity = Permutation $ Perm.identity Shape.static   scaleWithCheck :: (Eq shape) =>
src/Numeric/LAPACK/Orthogonal.hs view
@@ -5,9 +5,15 @@    leastSquaresMinimumNormRCond,    pseudoInverseRCond, +   project,+   leastSquaresConstraint,+   gaussMarkovLinearModel,+    determinant,    determinantAbsolute,    complement,+   affineSpanFromKernel,+   affineKernelFromSpan,     householder,    householderTall,@@ -16,12 +22,17 @@ import qualified Numeric.LAPACK.Orthogonal.Householder as HH import qualified Numeric.LAPACK.Orthogonal.Plain as Plain +import qualified Numeric.LAPACK.Matrix.Multiply as Multiply import qualified Numeric.LAPACK.Matrix.Triangular as Triangular+import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix import qualified Numeric.LAPACK.Matrix.Basic as Basic+import qualified Numeric.LAPACK.Matrix.Type as Matrix import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent-import Numeric.LAPACK.Matrix.Array (Full, Tall, Square)+import qualified Numeric.LAPACK.Vector as Vector+import Numeric.LAPACK.Matrix.Array (Full, General, Tall, Wide, Square) import Numeric.LAPACK.Matrix.Private (ShapeInt)+import Numeric.LAPACK.Vector (Vector, (|-|)) import Numeric.LAPACK.Scalar (RealOf)  import qualified Numeric.Netlib.Class as Class@@ -94,6 +105,65 @@    Basic.uncheck . ArrMatrix.toVector  +{- |+@project b d x@ projects @x@ on the plane described by @B*x = d@.++@b@ must have full rank.+-}+project ::+   (Shape.C height, Eq height, Shape.C width, Eq width, Class.Floating a) =>+   Wide height width a -> Vector height a ->+   Vector width a -> Vector width a+project b d x =+   x+   |-|+   ArrMatrix.unliftColumn MatrixShape.ColumnMajor+      (minimumNorm b) (Multiply.matrixVector b x |-| d)+++{- |+@leastSquaresConstraint a c b d@ computes @x@+with minimal @|| c - A*x ||_2@ and constraint @B*x = d@.++@b@ must be wide and @a===b@ must be tall+and both matrices must have full rank.+-}+leastSquaresConstraint ::+   (Shape.C height, Eq height,+    Shape.C width, Eq width,+    Shape.C constraints, Eq constraints, Class.Floating a) =>+   General height width a -> Vector height a ->+   Wide constraints width a -> Vector constraints a ->+   Vector width a+leastSquaresConstraint a c b d =+   Plain.leastSquaresConstraint+      (ArrMatrix.toVector a) c+      (ArrMatrix.toVector b) d++{- |+@gaussMarkovLinearModel a b d@ computes @(x,y)@+with minimal @|| y ||_2@ and constraint @d = A*x + B*y@.++@a@ must be tall and @a|||b@ must be wide+and both matrices must have full rank.+-}+gaussMarkovLinearModel ::+   (Shape.C height, Eq height,+    Shape.C width, Eq width,+    Shape.C opt, Eq opt, Class.Floating a) =>+   Tall height width a -> General height opt a -> Vector height a ->+   (Vector width a, Vector opt a)+gaussMarkovLinearModel a b d =+   {-+   Fortran-LAPACK and OpenBLAS would leave Y uninitalized+   instead of setting Y to zeros.+   -}+   if Shape.size (Matrix.height a) == 0+      then (Vector.zero (Matrix.width a), Vector.zero (Matrix.width b))+      else Plain.gaussMarkovLinearModel+               (ArrMatrix.toVector a) (ArrMatrix.toVector b) d++ {- @(q,r) = householder a@ means that @q@ is unitary and @r@ is upper triangular and @a = multiply q r@.@@ -145,3 +215,41 @@    (Shape.C height, Shape.C width, Class.Floating a) =>    Tall height width a -> Tall height ShapeInt a complement = ArrMatrix.lift1 Plain.complement+++{- |+> affineSpanFromKernel a b == (c,d)++Means:+An affine subspace is given implicitly by {x : a#*|x == b}.+Convert this into an explicit representation {c#*|y|+|d : y}.+Matrix @a@ must have full rank,+otherwise the explicit representation will miss dimensions+and we cannot easily determine the origin @d@ as a minimum norm solution.+-}+affineSpanFromKernel ::+   (Shape.C width, Eq width, Shape.C height, Eq height, Class.Floating a) =>+   Wide height width a -> Vector height a ->+   (Tall width ShapeInt a, Vector width a)+affineSpanFromKernel a b =+   let qr = HH.fromMatrix $ ArrMatrix.lift1 Basic.adjoint a+   in (ArrMatrix.lift0 $ Plain.extractComplement qr,+       ArrMatrix.unliftColumn MatrixShape.ColumnMajor (HH.minimumNorm qr) b)++{- |+This conversion is somehow inverse to 'affineSpanFromKernel'.+However, it is not precisely inverse in either direction.+This is because both 'affineSpanFromKernel' and 'affineKernelFromSpan'+accept non-orthogonal matrices but always return orthogonal ones.++In @affineKernelFromSpan c d@,+matrix @c@ should have full rank,+otherwise the implicit representation will miss dimensions.+-}+affineKernelFromSpan ::+   (Shape.C width, Eq width, Shape.C height, Eq height, Class.Floating a) =>+   Tall height width a -> Vector height a ->+   (Wide ShapeInt height a, Vector ShapeInt a)+affineKernelFromSpan c d =+   let a = Basic.adjoint $ Plain.complement $ ArrMatrix.toVector c+   in (ArrMatrix.lift0 a, Basic.multiplyVector a d)
src/Numeric/LAPACK/Orthogonal/Plain.hs view
@@ -5,8 +5,12 @@    leastSquaresMinimumNormRCond,    pseudoInverseRCond, +   leastSquaresConstraint,+   gaussMarkovLinearModel,+    determinantAbsolute,    complement,+   extractComplement,    ) where  import qualified Numeric.LAPACK.Orthogonal.Private as HH@@ -17,11 +21,14 @@ import qualified Numeric.LAPACK.Matrix.Basic as Basic import qualified Numeric.LAPACK.Vector as Vector import Numeric.LAPACK.Matrix.Shape.Private (Order(RowMajor,ColumnMajor))-import Numeric.LAPACK.Matrix.Private (Full, Tall, ShapeInt, shapeInt)+import Numeric.LAPACK.Matrix.Private+         (Full, General, Tall, Wide, ShapeInt, shapeInt)+import Numeric.LAPACK.Vector (Vector) import Numeric.LAPACK.Scalar (RealOf, zero, absolute) import Numeric.LAPACK.Private          (lacgv, peekCInt,-          copySubMatrix, copyToTemp, copyToColumnMajor, copyToSubColumnMajor,+          copySubMatrix, copyToTemp,+          copyToColumnMajorTemp, copyToSubColumnMajor,           withAutoWorkspaceInfo, rankMsg, errorCodeMsg, createHigherArray)  import qualified Numeric.LAPACK.FFI.Generic as LapackGen@@ -30,6 +37,7 @@ import qualified Numeric.Netlib.Utility as Call import qualified Numeric.Netlib.Class as Class +import qualified Data.Array.Comfort.Storable.Unchecked.Monadic as ArrayIO import qualified Data.Array.Comfort.Storable.Unchecked as Array import qualified Data.Array.Comfort.Shape as Shape import Data.Array.Comfort.Storable.Unchecked (Array(Array))@@ -56,7 +64,7 @@    Full vert horiz width nrhs a leastSquares    (Array shapeA@(MatrixShape.Full orderA extentA) a)-   (Array shapeB@(MatrixShape.Full orderB extentB) b) =+   (Array        (MatrixShape.Full orderB extentB) b) =   case Extent.fuse (Extent.generalizeWide $ Extent.transpose extentA) extentB of   Nothing -> error "leastSquares: height shapes mismatch"@@ -76,15 +84,12 @@       nrhsPtr <- Call.cint nrhs       (transPtr,aPtr) <- adjointA orderA (m*n) a       ldaPtr <- Call.leadingDim lda-      bPtr <- ContT $ withForeignPtr b       ldbPtr <- Call.leadingDim ldb-      let bSize = Shape.size shapeB-      btmpPtr <- Call.allocaArray bSize-      liftIO $ copyToColumnMajor orderB ldb nrhs bPtr btmpPtr+      bPtr <- copyToColumnMajorTemp orderB ldb nrhs b       liftIO $ withAutoWorkspaceInfo rankMsg "gels" $          LapackGen.gels transPtr-            mPtr nPtr nrhsPtr aPtr ldaPtr btmpPtr ldbPtr-      liftIO $ copySubMatrix ldx nrhs ldb btmpPtr ldx xPtr+            mPtr nPtr nrhsPtr aPtr ldaPtr bPtr ldbPtr+      liftIO $ copySubMatrix ldx nrhs ldb bPtr ldx xPtr  minimumNorm ::    (Extent.C vert, Extent.C horiz,@@ -184,12 +189,9 @@ leastSquaresMinimumNormIO rcond shapeX orderA a orderB b m n nrhs =    createHigherArray shapeX m n nrhs $ \(tmpPtr,ldtmp) -> do -   let aSize = m*n    let lda = m    evalContT $ do-      aPtr <- ContT $ withForeignPtr a-      atmpPtr <- Call.allocaArray aSize-      liftIO $ copyToColumnMajor orderA m n aPtr atmpPtr+      aPtr <- copyToColumnMajorTemp orderA m n a       ldaPtr <- Call.leadingDim lda       ldtmpPtr <- Call.leadingDim ldtmp       bPtr <- ContT $ withForeignPtr b@@ -197,7 +199,7 @@       jpvtPtr <- Call.allocaArray n       liftIO $ pokeArray jpvtPtr (replicate n 0)       rankPtr <- Call.alloca-      gelsy m n nrhs atmpPtr ldaPtr tmpPtr ldtmpPtr jpvtPtr rcond rankPtr+      gelsy m n nrhs aPtr ldaPtr tmpPtr ldtmpPtr jpvtPtr rcond rankPtr       liftIO $ peekCInt rankPtr  @@ -259,6 +261,82 @@          MatrixShape.fullHeight $ Array.shape a  +leastSquaresConstraint ::+   (Shape.C height, Eq height,+    Shape.C width, Eq width,+    Shape.C constraints, Eq constraints, Class.Floating a) =>+   General height width a -> Vector height a ->+   Wide constraints width a -> Vector constraints a ->+   Vector width a+leastSquaresConstraint+   (Array (MatrixShape.Full orderA extentA) a) c+   (Array (MatrixShape.Full orderB extentB) b) d =++ let sameShape name shape0 shape1 =+      if shape0 == shape1+         then shape0+         else error $ "leastSquaresConstraint: " ++ name ++ " shapes mismatch"+     width = sameShape "width" (Extent.width extentA) (Extent.width extentB)+ in+   Array.unsafeCreate width $ \xPtr -> do++   let height = sameShape "height" (Extent.height extentA) (Array.shape c)+   let constraints =+         sameShape "constraints" (Extent.height extentB) (Array.shape d)+   let m = Shape.size height+   let n = Shape.size width+   let p = Shape.size constraints+   evalContT $ do+      mPtr <- Call.cint m+      nPtr <- Call.cint n+      pPtr <- Call.cint p+      aPtr <- copyToColumnMajorTemp orderA m n a+      ldaPtr <- Call.leadingDim m+      bPtr <- copyToColumnMajorTemp orderB p n b+      ldbPtr <- Call.leadingDim p+      cPtr <- copyToTemp m (Array.buffer c)+      dPtr <- copyToTemp p (Array.buffer d)+      liftIO $ withAutoWorkspaceInfo rankMsg "gglse" $+         LapackGen.gglse+            mPtr nPtr pPtr aPtr ldaPtr bPtr ldbPtr cPtr dPtr xPtr++gaussMarkovLinearModel ::+   (Shape.C height, Eq height,+    Shape.C width, Eq width,+    Shape.C opt, Eq opt, Class.Floating a) =>+   Tall height width a -> General height opt a -> Vector height a ->+   (Vector width a, Vector opt a)+gaussMarkovLinearModel+   (Array (MatrixShape.Full orderA extentA) a)+   (Array (MatrixShape.Full orderB extentB) b) d =++   let width = Extent.width extentA in+   let opt = Extent.width extentB in+   Array.unsafeCreateWithSizeAndResult width $ \m xPtr -> do+   ArrayIO.unsafeCreateWithSize opt $ \p yPtr -> do++   let sameHeight shape0 shape1 =+         if shape0 == shape1+            then shape0+            else error $ "gaussMarkovLinearModel: height shapes mismatch"+       height =+         sameHeight (Array.shape d) $+         sameHeight (Extent.height extentA) (Extent.height extentB)+   let n = Shape.size height+   evalContT $ do+      mPtr <- Call.cint m+      nPtr <- Call.cint n+      pPtr <- Call.cint p+      aPtr <- copyToColumnMajorTemp orderA n m a+      ldaPtr <- Call.leadingDim n+      bPtr <- copyToColumnMajorTemp orderB n p b+      ldbPtr <- Call.leadingDim n+      dPtr <- copyToTemp n (Array.buffer d)+      liftIO $ withAutoWorkspaceInfo rankMsg "ggglm" $+         LapackGen.ggglm+            nPtr mPtr pPtr aPtr ldaPtr bPtr ldbPtr dPtr xPtr yPtr++ determinantAbsolute ::    (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width,     Class.Floating a) =>@@ -272,7 +350,13 @@ complement ::    (Shape.C height, Shape.C width, Class.Floating a) =>    Tall height width a -> Tall height ShapeInt a-complement a =-   Basic.dropColumns (Shape.size $ MatrixShape.fullWidth $ Array.shape a) $+complement = extractComplement . HH.fromMatrix++extractComplement ::+   (Shape.C height, Shape.C width, Class.Floating a) =>+   HH.Tall height width a -> Tall height ShapeInt a+extractComplement qr =+   Basic.dropColumns+      (Shape.size $ MatrixShape.splitWidth $ Array.shape $ HH.split_ qr) $    Basic.mapWidth (shapeInt . Shape.size) $ Square.toFull $-   HH.extractQ $ HH.fromMatrix a+   HH.extractQ qr
src/Numeric/LAPACK/Orthogonal/Private.hs view
@@ -474,9 +474,9 @@    (vert ~ Extent.Small, horiz ~ Extent.Small,     Shape.C height, height ~ width) =>       Divide.Solve (Hh vert horiz height width) where-   solveRight = ArrMatrix.lift1 . leastSquares . mapExtent Extent.generalizeWide+   solveRight = ArrMatrix.lift1 . leastSquares . mapExtent Extent.fromSquare    solveLeft =       flip $ \a -> ArrMatrix.lift1 $          Basic.adjoint .-         minimumNorm (mapExtent Extent.generalizeWide a) .+         minimumNorm (mapExtent Extent.fromSquare a) .          Basic.adjoint
src/Numeric/LAPACK/Permutation/Private.hs view
@@ -44,6 +44,27 @@ import Prelude hiding (odd)  +{- $setup+>>> import qualified Test.QuickCheck as QC+>>> import Test.Permutation (genPerm, genPivots)+>>>+>>> import qualified Numeric.LAPACK.Permutation as Perm+>>> import Numeric.LAPACK.Permutation (Permutation, Inversion(NonInverted), determinant, multiply, transpose)+>>> import Numeric.LAPACK.Matrix (ShapeInt)+>>>+>>> import qualified Data.Array.Comfort.Storable as Array+>>> import Data.Eq.HT (equating)+>>> import Data.Semigroup ((<>))+>>>+>>> import Control.Applicative (liftA2)+>>>+>>> genPerm2 :: QC.Gen (Permutation ShapeInt, Permutation ShapeInt)+>>> genPerm2 = do+>>>    nat <- QC.arbitrary+>>>    liftA2 (,) (genPerm nat) (genPerm nat)+-}++ newtype Permutation sh = Permutation (Vector (Shape sh) (Element sh))    deriving (Show) @@ -62,6 +83,9 @@ identity :: (Shape.C sh) => sh -> Permutation sh identity shape = Permutation $ CheckedArray.sample (Shape shape) id +{- |+prop> QC.forAll QC.arbitraryBoundedEnum $ \inv -> QC.forAll (QC.arbitrary >>= genPivots) $ \xs -> Array.toList xs == Array.toList (Perm.toPivots inv (Perm.fromPivots inv xs))+-} fromPivots ::    (Shape.C sh) =>    Inversion -> Vector (Shape sh) (Element sh) -> Permutation sh@@ -140,6 +164,9 @@ {- We could also count the cycles of even number. This might be a little faster. -}+{- |+prop> QC.forAll genPerm2 $ \(p0,p1) -> determinant (multiply p0 p1) == determinant p0 <> determinant p1+-} determinant :: (Shape.C sh) => Permutation sh -> Sign determinant =    (\oddp -> if oddp then Negative else Positive) .@@ -166,6 +193,9 @@ dropEven xs = xs  +{- |+prop> QC.forAll genPerm2 $ \(p0,p1) -> equating (Array.toList . Perm.toPivots NonInverted) (transpose $ multiply p0 p1) (multiply (transpose p1) (transpose p0))+-} transpose :: (Shape.C sh) => Permutation sh -> Permutation sh transpose (Permutation perm) =    Permutation $ runST (MutArray.unsafeFreeze =<< transposeToMutable perm)
src/Numeric/LAPACK/Private.hs view
@@ -195,6 +195,16 @@            else copySubMatrix m n m aPtr ldb bPtr  +copyToColumnMajorTemp ::+   (Class.Floating a) =>+   Order -> Int -> Int -> ForeignPtr a -> ContT r IO (Ptr a)+copyToColumnMajorTemp order m n fptr = do+   ptr <- ContT $ withForeignPtr fptr+   tmpPtr <- Call.allocaArray (m*n)+   liftIO $ copyToColumnMajor order m n ptr tmpPtr+   return tmpPtr++ pointerSeq :: (Storable a) => Int -> Ptr a -> [Ptr a] pointerSeq k ptr = iterate (flip advancePtr k) ptr 
src/Numeric/LAPACK/Singular/Plain.hs view
@@ -30,7 +30,7 @@ import Numeric.LAPACK.Scalar (RealOf, zero) import Numeric.LAPACK.Private          (withAutoWorkspace, peekCInt, createHigherArray,-          copyToTemp, copyToColumnMajor, copyToSubColumnMajor)+          copyToTemp, copyToColumnMajorTemp, copyToSubColumnMajor)  import qualified Numeric.LAPACK.FFI.Complex as LapackComplex import qualified Numeric.LAPACK.FFI.Real as LapackReal@@ -325,15 +325,12 @@    createHigherArray shapeX m n nrhs $ \(tmpPtr,ldtmp) -> do     let mn = min m n-   let aSize = m*n    let lda = m    evalContT $ do       mPtr <- Call.cint m       nPtr <- Call.cint n       nrhsPtr <- Call.cint nrhs-      aPtr <- Call.allocaArray aSize-      liftIO $ withForeignPtr a $ \asrcPtr ->-         copyToColumnMajor orderA m n asrcPtr aPtr+      aPtr <- copyToColumnMajorTemp orderA m n a       ldaPtr <- Call.leadingDim lda       ldtmpPtr <- Call.leadingDim ldtmp       liftIO $ withForeignPtr b $ \bPtr ->
+ test-module.list view
@@ -0,0 +1,3 @@+Numeric.LAPACK.Permutation.Private+Numeric.LAPACK.Example.DividedDifference+Numeric.LAPACK.Example.EconomicAllocation
+ test/DocTest/Main.hs view
@@ -0,0 +1,14 @@+-- Do not edit! Automatically created with doctest-extract.+module DocTest.Main where++import qualified DocTest.Numeric.LAPACK.Permutation.Private+import qualified DocTest.Numeric.LAPACK.Example.DividedDifference+import qualified DocTest.Numeric.LAPACK.Example.EconomicAllocation++import qualified Test.DocTest.Driver as DocTest++main :: DocTest.T ()+main = do+    DocTest.Numeric.LAPACK.Permutation.Private.test+    DocTest.Numeric.LAPACK.Example.DividedDifference.test+    DocTest.Numeric.LAPACK.Example.EconomicAllocation.test
+ test/DocTest/Numeric/LAPACK/Example/DividedDifference.hs view
@@ -0,0 +1,47 @@+-- Do not edit! Automatically created with doctest-extract from src/Numeric/LAPACK/Example/DividedDifference.hs+{-# LINE 29 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}++module DocTest.Numeric.LAPACK.Example.DividedDifference where++import qualified Test.DocTest.Driver as DocTest++{-# LINE 30 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}+import     qualified Test.Utility as Util+import     Test.Utility (approxArray)++import     qualified Numeric.LAPACK.Vector as Vector+import     Numeric.LAPACK.Example.DividedDifference (dividedDifferencesMatrix)+import     Numeric.LAPACK.Matrix (ShapeInt, (#+#))+import     Numeric.LAPACK.Vector ((|+|))++import     qualified Data.Array.Comfort.Storable as Array++import     qualified Test.QuickCheck as QC++import     Control.Monad (liftM2)+import     Data.Tuple.HT (mapPair)+import     Data.Semigroup ((<>))++type     Vector = Vector.Vector ShapeInt Float++genDD     :: QC.Gen (Vector, (Vector, Vector))+genDD     = do+       (ys0,ys1) <-+          fmap (mapPair (Vector.autoFromList, Vector.autoFromList) .+                unzip . take 10) $+          QC.listOf $ liftM2 (,) (Util.genElement 10) (Util.genElement 10)+       xs <- Util.genDistinct 10 10 $ Array.shape ys0+       return (xs,(ys0,ys1))++test :: DocTest.T ()+test = do+ DocTest.printPrefix "Numeric.LAPACK.Example.DividedDifference:77: "+{-# LINE 77 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}+ DocTest.property+{-# LINE 77 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}+     (QC.forAll genDD $ \(xs, (ys0,ys1)) -> approxArray (dividedDifferencesMatrix xs (ys0|+|ys1)) (dividedDifferencesMatrix xs ys0 #+# dividedDifferencesMatrix xs ys1))+ DocTest.printPrefix "Numeric.LAPACK.Example.DividedDifference:78: "+{-# LINE 78 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}+ DocTest.property+{-# LINE 78 "src/Numeric/LAPACK/Example/DividedDifference.hs" #-}+     (QC.forAll genDD $ \(xs, (ys0,ys1)) -> approxArray (dividedDifferencesMatrix xs (Vector.mul ys0 ys1)) (dividedDifferencesMatrix xs ys0 <> dividedDifferencesMatrix xs ys1))
+ test/DocTest/Numeric/LAPACK/Example/EconomicAllocation.hs view
@@ -0,0 +1,23 @@+-- Do not edit! Automatically created with doctest-extract from src/Numeric/LAPACK/Example/EconomicAllocation.hs+{-# LINE 20 "src/Numeric/LAPACK/Example/EconomicAllocation.hs" #-}++module DocTest.Numeric.LAPACK.Example.EconomicAllocation where++import qualified Test.DocTest.Driver as DocTest++{-# LINE 21 "src/Numeric/LAPACK/Example/EconomicAllocation.hs" #-}+import     Numeric.LAPACK.Example.EconomicAllocation+import     Test.Utility (approxVector)++import     qualified Numeric.LAPACK.Vector as Vector+import     Numeric.LAPACK.Vector ((+++))++import     qualified Data.Array.Comfort.Storable as Array++test :: DocTest.T ()+test = do+ DocTest.printPrefix "Numeric.LAPACK.Example.EconomicAllocation:90: "+{-# LINE 90 "src/Numeric/LAPACK/Example/EconomicAllocation.hs" #-}+ DocTest.property+{-# LINE 90 "src/Numeric/LAPACK/Example/EconomicAllocation.hs" #-}+     (let result = iterated expenses0 balances0 in approxVector result $ compensated expenses0 balances0 +++ Vector.zero (Array.shape $ Vector.takeRight result))
+ test/DocTest/Numeric/LAPACK/Permutation/Private.hs view
@@ -0,0 +1,43 @@+-- Do not edit! Automatically created with doctest-extract from src/Numeric/LAPACK/Permutation/Private.hs+{-# LINE 47 "src/Numeric/LAPACK/Permutation/Private.hs" #-}++module DocTest.Numeric.LAPACK.Permutation.Private where++import qualified Test.DocTest.Driver as DocTest++{-# LINE 48 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+import     qualified Test.QuickCheck as QC+import     Test.Permutation (genPerm, genPivots)++import     qualified Numeric.LAPACK.Permutation as Perm+import     Numeric.LAPACK.Permutation (Permutation, Inversion(NonInverted), determinant, multiply, transpose)+import     Numeric.LAPACK.Matrix (ShapeInt)++import     qualified Data.Array.Comfort.Storable as Array+import     Data.Eq.HT (equating)+import     Data.Semigroup ((<>))++import     Control.Applicative (liftA2)++genPerm2     :: QC.Gen (Permutation ShapeInt, Permutation ShapeInt)+genPerm2     = do+       nat <- QC.arbitrary+       liftA2 (,) (genPerm nat) (genPerm nat)++test :: DocTest.T ()+test = do+ DocTest.printPrefix "Numeric.LAPACK.Permutation.Private:87: "+{-# LINE 87 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+ DocTest.property+{-# LINE 87 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+     (QC.forAll QC.arbitraryBoundedEnum $ \inv -> QC.forAll (QC.arbitrary >>= genPivots) $ \xs -> Array.toList xs == Array.toList (Perm.toPivots inv (Perm.fromPivots inv xs)))+ DocTest.printPrefix "Numeric.LAPACK.Permutation.Private:168: "+{-# LINE 168 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+ DocTest.property+{-# LINE 168 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+     (QC.forAll genPerm2 $ \(p0,p1) -> determinant (multiply p0 p1) == determinant p0 <> determinant p1)+ DocTest.printPrefix "Numeric.LAPACK.Permutation.Private:197: "+{-# LINE 197 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+ DocTest.property+{-# LINE 197 "src/Numeric/LAPACK/Permutation/Private.hs" #-}+     (QC.forAll genPerm2 $ \(p0,p1) -> equating (Array.toList . Perm.toPivots NonInverted) (transpose $ multiply p0 p1) (multiply (transpose p1) (transpose p0)))
test/Main.hs view
@@ -14,11 +14,12 @@ import qualified Test.Singular as Singular import qualified Test.Shape as Shape import qualified Test.Permutation as Permutation-import qualified Test.Example as Example+import qualified DocTest.Main as DocTestMain import Test.Format () import Test.Utility (Tagged(Tagged), prefix)  import qualified Test.QuickCheck as QC+import qualified Test.DocTest.Driver as DocTest  import Numeric.LAPACK.Scalar (RealOf) @@ -26,6 +27,15 @@  import Type.Base.Proxy (Proxy(Proxy)) +import System.Exit (exitFailure)++import Text.Printf (printf)++import qualified Control.Monad.Trans.Writer.Strict as MW+import qualified Control.Monad.Trans.Reader as MR+import Control.Monad.IO.Class (liftIO)+import Control.Monad (when, void)+ import qualified Data.List as List import Data.Complex (Complex) import Data.Tuple.HT (mapSnd)@@ -68,14 +78,28 @@ simpleTests :: [(String, QC.Property)] simpleTests =    prefix "Shape" Shape.tests ++-   prefix "Permutation" Permutation.tests ++-   prefix "Example" Example.tests ++    [] +++run :: MW.WriterT DocTest.Count IO () -> IO ()+run act = do+   count <- MW.execWriterT act+   putStrLn ""+   void $ printf "Total: %d\n" $ DocTest.numTotal count+   void $ printf "Failures: %d\n" $ DocTest.numFailures count+   when (DocTest.numFailures count > 0) exitFailure+ main :: IO () main =-   mapM_ (\(name,act) -> putStr (name ++ ": ") >> act) $+   run $+   (>> MR.runReaderT DocTestMain.main QC.stdArgs) $ -   map (mapSnd (QC.quickCheckWith (QC.stdArgs {QC.maxSuccess=200}))) tests+   mapM_+      (\(name,(args,act)) -> do+         liftIO (putStr (name ++ ": "))+         MR.runReaderT (DocTest.property act) args) $++   map (mapSnd ((,) (QC.stdArgs {QC.maxSuccess=200}))) tests    ++-   map (mapSnd QC.quickCheck) simpleTests+   map (mapSnd ((,) QC.stdArgs)) simpleTests
− test/Test/Example.hs
@@ -1,21 +0,0 @@-module Test.Example where--import qualified Test.Utility as Util--import qualified Numeric.LAPACK.Example.EconomicAllocation as Eco-import qualified Numeric.LAPACK.Vector as Vector--import qualified Data.Array.Comfort.Storable as Array--import qualified Test.QuickCheck as QC---tests :: [(String, QC.Property)]-tests =-   ("economicAllocation",-      QC.property $-         let iterated = Eco.iterated Eco.expenses0 Eco.balances0-         in Util.approxVector iterated-               (Vector.append (Eco.compensated Eco.expenses0 Eco.balances0) $-                Vector.zero $ Array.shape $ Vector.takeRight iterated)) :-   []
test/Test/Generator.hs view
@@ -429,6 +429,24 @@       Util.genArrayExtraDiag maxElem shape          (const $ fromReal <$> Util.genReal maxElem) +lscStack ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   Matrix (ShapeInt:+:ShapeInt) ShapeInt a+      (Matrix.Tall (ShapeInt:+:ShapeInt) ShapeInt a)+lscStack =+   condition+      (Util.fullRankTall . Matrix.transpose .+       Matrix.wideFromGeneral . Matrix.takeTop . Matrix.fromFull) $+   condition Util.fullRankTall $+   mapGen Util.genArray $+   shapeFromDims (uncurry . MatrixShape.tall) $+   Base $ do+      height <- newVariable+      width <- newVariableWith $ Logic.between height+      return+         ((height,width),+          liftA2 (,) (Logic.query height) (Logic.query width))+  {- There cannot be a pure/point function.
test/Test/Logic.hs view
@@ -87,6 +87,31 @@    assignmentM (liftZeroBased $ \a -> choose (\ maxk -> (a,maxk))) va vb    assignmentM (liftZeroBased $ \b -> choose (\_maxk -> (0,b))) vb va +{-+We cannot split this into something like++a <!= c <> c <!= a+b++because the solver might choose in this order++a+b=6:+:4+c=5++and then it is left with a>c from which it cannot recover.+-}+between :: Variable s (ShapeInt:+:ShapeInt) -> Variable s ShapeInt -> System s+between vab vc  =  AppMn.Cons $ do+   assignmentM+      (\(Shape.ZeroBased a :+: Shape.ZeroBased b) ->+         Shape.ZeroBased <$> choose (\_maxk -> (a,a+b)))+      vab vc+   assignmentM+      (\(Shape.ZeroBased c) ->+         liftA2 (:+:)+            (Shape.ZeroBased <$> choose (\_maxk -> (0,c)))+            (Shape.ZeroBased <$> choose (\ maxk -> (c,maxk))))+      vc vab+  class (Shape.C dim) => Dim dim where chooseDim :: M s dim instance (i ~ Int) => Dim (Shape.ZeroBased i) where
test/Test/Orthogonal.hs view
@@ -1,13 +1,14 @@ {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE FlexibleContexts #-} module Test.Orthogonal (testsVar) where  import qualified Test.Divide as Divide import qualified Test.Generator as Gen import qualified Test.Utility as Util-import Test.Generator ((<#*#>), (<#\#>))+import Test.Generator ((<#*#>), (<#\#>), (<-*#>), (<#*|>), (<|=|>)) import Test.Utility-         (approx, approxReal, approxArrayTol, approxMatrix,+         (approx, approxReal, approxArrayTol, approxMatrix, approxVectorTol,           Tagged, isIdentity, isUnitary, maybeConjugate)  import qualified Numeric.LAPACK.Orthogonal.Householder as HH@@ -20,13 +21,16 @@ import qualified Numeric.LAPACK.Matrix as Matrix import qualified Numeric.LAPACK.Vector as Vector import Numeric.LAPACK.Matrix.Square (Square)-import Numeric.LAPACK.Matrix (General, ShapeInt, (#*#), (##*#), (#*##), (#\##))+import Numeric.LAPACK.Matrix+         (General, ShapeInt, (#*#), (##*#), (#*##), (#\##), (#*|))+import Numeric.LAPACK.Vector (Vector, (|+|), (|-|)) import Numeric.LAPACK.Scalar (RealOf, absolute, selectReal)  import qualified Numeric.Netlib.Class as Class  import qualified Data.Array.Comfort.Storable as Array import qualified Data.Array.Comfort.Shape as Shape+import Data.Array.Comfort.Shape ((:+:))  import Control.Applicative (liftA2, (<$>)) import Data.Semigroup ((<>))@@ -240,6 +244,166 @@ complementOrthogonal = isUnitary (selectReal 1e-3 1e-7) . Ortho.complement  +affineSpanFromKernel ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Wide ShapeInt ShapeInt a, Vector ShapeInt a) -> Bool+affineSpanFromKernel (a, by) =+   let b = Vector.take (Shape.size $ Matrix.height a) by+       y = Vector.drop (Shape.size $ Matrix.height a) by+       (c,d) = Ortho.affineSpanFromKernel a b+   in approxVectorTol+         (selectReal 1e-3 1e-7)+         b+         (a#*|(c#*|y|+|d))++affineKernelFromSpan ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Tall ShapeInt ShapeInt a, Vector ShapeInt a, Vector ShapeInt a) ->+   Bool+affineKernelFromSpan (c,y,d) =+   let (a,b) = Ortho.affineKernelFromSpan c d+   in approxVectorTol+         (selectReal 1e-3 1e-7)+         b+         (a#*|(c#*|y|+|d))+++projectHit ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Wide ShapeInt ShapeInt a,+    Vector ShapeInt a,+    Vector ShapeInt a) ->+   Bool+projectHit (b,x,d) =+   approxVectorTol+      (selectReal 1e-3 1e-9)+      d+      (b #*| Ortho.project b d x)+++leastSquaresNoConstraint ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Tall ShapeInt ShapeInt a, Vector ShapeInt a) -> Bool+leastSquaresNoConstraint (a, b) =+   approxVectorTol+      (selectReal 0.1 1e-7)+      (ArrMatrix.unliftColumn MatrixShape.ColumnMajor (Ortho.leastSquares a) b)+      (Ortho.leastSquaresConstraint+         (Matrix.fromFull a) b+         (Matrix.zero $+          MatrixShape.wide MatrixShape.ColumnMajor Shape.Zero (Matrix.width a))+         (Vector.zero Shape.Zero))++leastSquaresConstraintUnique ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Vector ShapeInt a,+    Matrix.General ShapeInt ShapeInt a, Matrix.Square ShapeInt a,+    Vector ShapeInt a) ->+   Bool+leastSquaresConstraintUnique (c,a,b,d) =+   approxVectorTol+      (selectReal 0.1 1e-7)+      d+      (b #*| Ortho.leastSquaresConstraint a c (Matrix.generalizeTall b) d)++splitLSCStack ::+   (Shape.C height, Shape.C constraints, Shape.C width, Class.Floating a) =>+   Matrix.Tall (constraints:+:height) width a ->+   Vector (constraints:+:height) a ->+   ((Matrix.General height width a, Vector height a),+    (Matrix.Wide constraints width a, Vector constraints a))+splitLSCStack baTall dc =+   let ba = Matrix.fromFull baTall+       b = Matrix.wideFromGeneral $ Matrix.takeTop ba+       a = Matrix.takeBottom ba+       (d,c) = (Vector.takeLeft dc, Vector.takeRight dc)+   in ((a,c),(b,d))++leastSquaresConstraintAdmissible ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Tall (ShapeInt:+:ShapeInt) ShapeInt a,+    Vector (ShapeInt:+:ShapeInt) a) ->+   Bool+leastSquaresConstraintAdmissible (ba,dc) =+   let ((a,c),(b,d)) = splitLSCStack ba dc+   in approxVectorTol+         (selectReal 0.1 1e-7)+         d+         (b #*| Ortho.leastSquaresConstraint a c b d)++leastSquaresConstraintMinimal ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Tall (ShapeInt:+:ShapeInt) ShapeInt a,+    Vector ShapeInt a,+    Vector (ShapeInt:+:ShapeInt) a) ->+   Bool+leastSquaresConstraintMinimal (ba,x,dc) =+   let ((a,c),(b,d)) = splitLSCStack ba dc+   in Vector.norm2 (c |-| a #*| Ortho.leastSquaresConstraint a c b d)+      <=+      Vector.norm2 (c |-| a #*| Ortho.project b d x) + selectReal 1e-1 1e-10+++gaussMarkovLinearModelMinimumNorm ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar, Eq a) =>+   (Matrix.Wide ShapeInt ShapeInt a, Vector ShapeInt a) -> Bool+gaussMarkovLinearModelMinimumNorm (b, d) =+   let (x,y) =+         Ortho.gaussMarkovLinearModel+            (Matrix.zero $+             MatrixShape.tall MatrixShape.ColumnMajor+               (Matrix.height b) Shape.Zero)+            (Matrix.fromFull b) d+   in x == Vector.zero Shape.Zero+      &&+      approxVectorTol+         (selectReal 0.1 1e-7)+         y+         (ArrMatrix.unliftColumn MatrixShape.ColumnMajor+            (Ortho.minimumNorm b) d)++gaussMarkovLinearModelUnique ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar, Eq a) =>+   (Matrix.Square ShapeInt a, Vector ShapeInt a) -> Bool+gaussMarkovLinearModelUnique (a,d) =+   let (x,y) =+         Ortho.gaussMarkovLinearModel+            (Matrix.generalizeWide a)+            (Matrix.zero $+             MatrixShape.general MatrixShape.ColumnMajor+               (Matrix.height a) Shape.Zero)+            d+   in y == Vector.zero Shape.Zero+      &&+      approxVectorTol (selectReal 0.1 1e-7) d (a #*| x)++gaussMarkovLinearModelAdmissible ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Wide ShapeInt (ShapeInt:+:ShapeInt) a, Vector ShapeInt a) -> Bool+gaussMarkovLinearModelAdmissible (abWide,d) =+   let ab = Matrix.fromFull abWide+       a = Matrix.tallFromGeneral $ Matrix.takeLeft ab+       b = Matrix.takeRight ab+   in approxVectorTol+         (selectReal 0.1 1e-7)+         d+         (ab #*| uncurry Vector.append (Ortho.gaussMarkovLinearModel a b d))++gaussMarkovLinearModelMinimal ::+   (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>+   (Matrix.Wide ShapeInt (ShapeInt:+:ShapeInt) a,+    Vector ShapeInt a,+    Vector (ShapeInt:+:ShapeInt) a) -> Bool+gaussMarkovLinearModelMinimal (abWide,d,xy) =+   let ab = Matrix.fromFull abWide+       a = Matrix.tallFromGeneral $ Matrix.takeLeft ab+       b = Matrix.takeRight ab+   in Vector.norm2 (snd $ Ortho.gaussMarkovLinearModel a b d)+      <=+      Vector.norm2 (Vector.takeRight $ Ortho.project abWide d xy)+         + selectReal 1e-3 1e-10++ householderReconstruction ::    (Class.Floating a, RealOf a ~ ar, Class.Real ar) =>    Matrix.General ShapeInt ShapeInt a -> Bool@@ -392,6 +556,53 @@       checkForAll Gen.tall complementBiorthogonal) :    ("complementOrthogonal",       checkForAll Gen.tall complementOrthogonal) :++   ("affineSpanFromKernel",+      checkForAll+         ((,) <$> Gen.fullRankWide <#*|> Gen.vector) affineSpanFromKernel) :+   ("affineKernelFromSpan",+      checkForAll+         ((,,) <$> Gen.tall <#*|> Gen.vector <|=|> Gen.vector)+         affineKernelFromSpan) :++   ("projectHit",+      checkForAll+         ((,,) <$> Gen.fullRankWide <#*|> Gen.vector <|=|> Gen.vector)+         projectHit) :+   ("leastSquaresNoConstraint",+      checkForAll+         ((,) <$> Gen.transpose Gen.fullRankTall <#*|> Gen.vector)+         leastSquaresNoConstraint) :+   ("leastSquaresConstraintUnique",+      checkForAll+         ((,,,) <$>+            Gen.vector <-*#> Gen.matrix <-*#> Gen.invertible <|=|> Gen.vector)+         leastSquaresConstraintUnique) :+   ("leastSquaresConstraintAdmissible",+      checkForAll+         ((,) <$> Gen.transpose Gen.lscStack <#*|> Gen.vector)+         leastSquaresConstraintAdmissible) :+   ("leastSquaresConstraintMinimal",+      checkForAll+         ((,,) <$> Gen.lscStack <#*|> Gen.vector <|=|> Gen.vector)+         leastSquaresConstraintMinimal) :+   ("gaussMarkovLinearModelMinimumNorm",+      checkForAll+         ((,) <$> Gen.transpose Gen.fullRankWide <#*|> Gen.vector)+         gaussMarkovLinearModelMinimumNorm) :+   ("gaussMarkovLinearModelUnique",+      checkForAll+         ((,) <$> Gen.invertible <#*|> Gen.vector)+         gaussMarkovLinearModelUnique) :+   ("gaussMarkovLinearModelAdmissible",+      checkForAll+         ((,) <$> fmap Matrix.transpose Gen.lscStack <#*|> Gen.vector)+         gaussMarkovLinearModelAdmissible) :+   ("gaussMarkovLinearModelMinimal",+      checkForAll+         ((,,) <$> fmap Matrix.transpose Gen.lscStack+               <#*|> Gen.vector <|=|> Gen.vector)+         gaussMarkovLinearModelMinimal) :     ("triangularLeastSquares",       checkForAll genFullRankTallRHS triangularLeastSquares) :
test/Test/Permutation.hs view
@@ -20,13 +20,10 @@  import qualified Numeric.Netlib.Class as Class -import qualified Data.Array.Comfort.Storable as Array import qualified Data.Array.Comfort.Shape as Shape  import Control.Monad (forM)-import Control.Applicative (liftA2, (<$>))--import Data.Semigroup ((<>))+import Control.Applicative ((<$>))  import qualified Test.QuickCheck as QC @@ -44,27 +41,6 @@ genPerm = fmap (Perm.fromPivots NonInverted) . genPivots  -permutationPivots :: Inversion -> Pivots -> Bool-permutationPivots inv xs =-   Array.toList (Perm.toPivots inv (Perm.fromPivots inv xs))-   ==-   Array.toList xs--determinantMultiply :: (Permutation ShapeInt, Permutation ShapeInt) -> Bool-determinantMultiply (p0,p1) =-   Perm.determinant (Perm.multiply p0 p1)-   ==-   Perm.determinant p0 <> Perm.determinant p1--transposeMultiply :: (Permutation ShapeInt, Permutation ShapeInt) -> Bool-transposeMultiply (p0,p1) =-   (Array.toList $ Perm.toPivots NonInverted $-    Perm.transpose (Perm.multiply p0 p1))-   ==-   (Array.toList $ Perm.toPivots NonInverted $-    Perm.multiply (Perm.transpose p1) (Perm.transpose p0))-- genPermutation :: (Dim sh) => Gen.Matrix sh sh a (Permutation sh) genPermutation =    flip Gen.mapGen Gen.squareDim $ \_maxElem sh ->@@ -117,28 +93,6 @@    (Class.Floating a, Eq a) => Matrix (Permutation ShapeInt) a -> Bool determinantNumber p =    PermMatrix.determinant p == Square.determinant (PermMatrix.toMatrix p)---tests :: [(String, QC.Property)]-tests =-   ("permutationPivots",-      QC.property $-         QC.forAll QC.arbitraryBoundedEnum $ \inv ->-         QC.forAll (QC.arbitrary >>= genPivots) $ \pivot ->-            permutationPivots inv pivot) :-   ("determinantMultiply",-      QC.property $-         QC.forAll-            (do nat <- QC.arbitrary-                liftA2 (,) (genPerm nat) (genPerm nat))-            determinantMultiply) :-   ("transposeMultiply",-      QC.property $-         QC.forAll-            (do nat <- QC.arbitrary-                liftA2 (,) (genPerm nat) (genPerm nat))-            transposeMultiply) :-   []   
test/Test/Shape.hs view
@@ -99,19 +99,19 @@    Banded (MatrixShape.Banded sub super vert horiz height width)  instance-   (Extent.C horiz, Extent.C vert,+   (Extent.C vert, Extent.C horiz,     Show height, Show width, Shape.C height, Shape.C width) =>       Show (Banded vert horiz height width) where    showsPrec p (Banded sh) = showsPrec p sh  instance-   (Extent.C horiz, Extent.C vert, Shape.C height, Shape.C width) =>+   (Extent.C vert, Extent.C horiz, Shape.C height, Shape.C width) =>       Shape.C (Banded vert horiz height width) where    size (Banded sh) = Shape.size sh    uncheckedSize (Banded sh) = Shape.uncheckedSize sh  instance-   (Extent.C horiz, Extent.C vert,+   (Extent.C vert, Extent.C horiz,     Shape.Indexed height, Shape.Indexed width) =>       Shape.Indexed (Banded vert horiz height width) where    type Index (Banded vert horiz height width) =@@ -125,7 +125,7 @@    uncheckedSizeOffset (Banded sh) = Shape.uncheckedSizeOffset sh  instance-   (Extent.C horiz, Extent.C vert,+   (Extent.C vert, Extent.C horiz,     Shape.InvIndexed height, Shape.InvIndexed width) =>       Shape.InvIndexed (Banded vert horiz height width) where