module Numeric.LAPACK.Permutation (
   Plain.Permutation,
   Plain.Shape(Shape), Plain.Element(Element),
   Plain.size,
   Plain.identity,
   Mod.Inversion(NonInverted,Inverted),
   Plain.fromPivots,
   Plain.toPivots,
   toMatrix,
   Plain.Sign(Positive,Negative),
   Plain.determinant,
   Plain.numberFromSign,
   Plain.transpose,
   Plain.inversionFromTransposition,
   Plain.multiply,
   apply,
   ) where

import qualified Numeric.LAPACK.Permutation.Private as Plain
import qualified Numeric.LAPACK.Matrix.Array.Private as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Modifier as Mod
import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent
import Numeric.LAPACK.Permutation.Private (Permutation)
import Numeric.LAPACK.Matrix.Array.Private (Full, Square)

import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Shape as Shape


toMatrix :: (Shape.C sh, Class.Floating a) => Permutation sh -> Square sh a
toMatrix :: Permutation sh -> Square sh a
toMatrix = Array (Full Shape Small Small sh sh) a -> Square sh a
forall pack prop lower upper meas vert horiz height width a.
FromPlain pack prop lower upper meas vert horiz height width =>
PlainArray pack prop lower upper meas vert horiz height width a
-> ArrayMatrix pack prop lower upper meas vert horiz height width a
ArrMatrix.lift0 (Array (Full Shape Small Small sh sh) a -> Square sh a)
-> (Permutation sh -> Array (Full Shape Small Small sh sh) a)
-> Permutation sh
-> Square sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Permutation sh -> Array (Full Shape Small Small sh sh) a
forall sh a. (C sh, Floating a) => Permutation sh -> Square sh a
Plain.toMatrix

apply ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
   Mod.Inversion -> Permutation height ->
   Full meas vert horiz height width a ->
   Full meas vert horiz height width a
apply :: Inversion
-> Permutation height
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
apply Inversion
inverted = (Array (Full meas vert horiz height width) a
 -> Array (Full meas vert horiz height width) a)
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall packA propA lowerA upperA measA vertA horizA heightA widthA
       packB propB lowerB upperB measB vertB horizB heightB widthB a b.
(ToPlain
   packA propA lowerA upperA measA vertA horizA heightA widthA,
 FromPlain
   packB propB lowerB upperB measB vertB horizB heightB widthB) =>
(PlainArray
   packA propA lowerA upperA measA vertA horizA heightA widthA a
 -> PlainArray
      packB propB lowerB upperB measB vertB horizB heightB widthB b)
-> ArrayMatrix
     packA propA lowerA upperA measA vertA horizA heightA widthA a
-> ArrayMatrix
     packB propB lowerB upperB measB vertB horizB heightB widthB b
ArrMatrix.lift1 ((Array (Full meas vert horiz height width) a
  -> Array (Full meas vert horiz height width) a)
 -> Full meas vert horiz height width a
 -> Full meas vert horiz height width a)
-> (Permutation height
    -> Array (Full meas vert horiz height width) a
    -> Array (Full meas vert horiz height width) a)
-> Permutation height
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inversion
-> Permutation height
-> Array (Full meas vert horiz height width) a
-> Array (Full meas vert horiz height width) a
forall meas vert horiz height width a.
(Measure meas, C vert, C horiz, C height, Eq height, C width,
 Floating a) =>
Inversion
-> Permutation height
-> Full meas vert horiz height width a
-> Full meas vert horiz height width a
Plain.apply Inversion
inverted