packages feed

lapack-0.4: test/Numeric/LAPACK/Matrix/Banded/Naive.hs

{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Matrix.Banded.Naive where

import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Layout as Layout
import qualified Numeric.LAPACK.Matrix.Extent as Extent
import qualified Numeric.LAPACK.Matrix as Matrix
import Numeric.LAPACK.Matrix.Layout (Order)

import qualified Numeric.Netlib.Class as Class

import qualified Type.Data.Num.Unary as Unary

import qualified Data.Array.Comfort.Storable as Array
import qualified Data.Array.Comfort.Shape as Shape
import Data.Array.Comfort.Storable ((!))


toFull ::
   (Unary.Natural sub, Unary.Natural super,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.Indexed height, Shape.Indexed width, Class.Floating a) =>
   Matrix.Banded sub super meas vert horiz height width a ->
   Matrix.Full meas vert horiz height width a
toFull = ArrMatrix.lift1 $ \a ->
   case Array.shape a of
      shape@(Layout.Banded _offDiag order extent) ->
         Array.sample (Layout.Full order extent) $ \ix ->
            let bix = uncurry Layout.InsideBox ix
            in if Shape.inBounds shape bix then a!bix else 0

forceOrder ::
   (Unary.Natural sub, Unary.Natural super,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.Indexed height, Shape.Indexed width, Class.Floating a) =>
   Order ->
   Matrix.Banded sub super meas vert horiz height width a ->
   Matrix.Banded sub super meas vert horiz height width a
forceOrder newOrder = ArrMatrix.lift1 $ \a ->
   case Array.shape a of
      shape ->
         Array.sample (shape{Layout.bandedOrder = newOrder}) $ \ix ->
            case ix of
               Layout.InsideBox _ _ -> a!ix
               _ ->
                  if newOrder == Layout.bandedOrder shape
                     then a!ix
                     else 0