-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs
{-# LINE 60 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}

{-# OPTIONS_GHC -XTypeOperators #-}
module Test.Float.Numeric.BLAS.Matrix.RowMajor.Mutable where

import qualified Test.DocTest.Driver as DocTest

{-# LINE 62 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}
import     Test.Float.Numeric.BLAS.Matrix.RowMajor (forMatrix)
import     Test.Float.Numeric.BLAS.Vector.Slice (forSliced)
import     Test.Float.Numeric.BLAS.Vector (genVector, number_)
import     qualified Numeric.BLAS.Matrix.RowMajor.Mutable as MutMatrix
import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
import     qualified Numeric.BLAS.Vector.Symbolic as VectorSymb
import     qualified Numeric.BLAS.Vector.Slice as VectorSlice
import     qualified Numeric.BLAS.Subobject.View.Matrix as ViewMatrix
--     import qualified Numeric.BLAS.Subobject.Shape as Subshape
import     Numeric.BLAS.Vector ((.*|), (|+|))
--     import Numeric.Netlib.Modifier (Conjugation(NonConjugated,Conjugated))
import     qualified Data.Array.Comfort.Storable.Mutable as MutArray
import     qualified Data.Array.Comfort.Storable as Array
import     qualified Data.Array.Comfort.Shape as Shape
import     Data.Array.Comfort.Shape ((::+)((::+)))
import     qualified Test.QuickCheck as QC
import     Test.QuickCheck ((===))

test :: DocTest.T ()
test = do
 DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor.Mutable:127: "
{-# LINE 127 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}
 DocTest.property(
{-# LINE 127 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}
        
   QC.forAll number_ $ \alpha ->
   forSliced number_ $ \xs conjX ->
   forSliced number_ $ \ys conjY ->
   QC.forAll (genVector (VectorSlice.shape xs, VectorSlice.shape ys) number_) $
      \zs ->
   let xc = VectorSymb.maybeConjugate conjX xs in
   let yc = VectorSymb.maybeConjugate conjY ys in

   MutArray.runST (do
      zm <- MutArray.thaw zs
      MutMatrix.addTensorProduct alpha xc yc zm
      return zm)
   ===
   alpha .*| Matrix.tensorProduct xc yc |+| zs
  )
 DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor.Mutable:185: "
{-# LINE 185 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}
 DocTest.property(
{-# LINE 185 "src/Numeric/BLAS/Matrix/RowMajor/Mutable.hs" #-}
        
   QC.forAll number_ $ \alpha ->
   QC.forAll number_ $ \beta ->
   forMatrix number_ $ \a0 ->
   let (Shape.ZeroBased m, Shape.ZeroBased n) = Array.shape a0 in
   QC.forAll (QC.choose (0, m)) $ \mk ->
   QC.forAll (QC.choose (0, n)) $ \nk ->
   let splitHeight = Shape.ZeroBased mk ::+ Shape.ZeroBased (m-mk) in
   let splitWidth  = Shape.ZeroBased nk ::+ Shape.ZeroBased (n-nk) in
   let a = Array.reshape (splitHeight, splitWidth) a0 in
   QC.forAll (genVector (splitHeight, splitWidth) number_) $ \b ->

   alpha.*|a |+| beta.*|b
   ===
   MutArray.runST (do
      bmut <- MutArray.thaw b
      -- take quandrant in two steps in order to challenge submatrix selection
      let au = Matrix.takeTop a
      let al = Matrix.takeBottom a
      let focusA view = Matrix.viewMatrix view
      let focusB view = MutMatrix.viewMatrix view bmut
      let b0 = focusB (ViewMatrix.left  . ViewMatrix.top)
      let b1 = focusB (ViewMatrix.right . ViewMatrix.top)
      let b2 = focusB (ViewMatrix.left  . ViewMatrix.bottom)
      let b3 = focusB (ViewMatrix.right . ViewMatrix.bottom)
      MutMatrix.addSubmatrix alpha (focusA ViewMatrix.left  au) beta b0
      MutMatrix.addSubmatrix alpha (focusA ViewMatrix.right au) beta b1
      MutMatrix.addSubmatrix alpha (focusA ViewMatrix.left  al) beta b2
      MutMatrix.addSubmatrix alpha (focusA ViewMatrix.right al) beta b3
      return bmut)
  )