-- GENERATED by C->Haskell Compiler, version 0.28.3 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}
{-# LANGUAGE CPP                      #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LANGUAGE ForeignFunctionInterface #-}
-- |
-- Module      : Foreign.CUDA.Solver.Internal.Types
-- Copyright   : [2017] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Foreign.CUDA.Solver.Internal.Types (

  -- Dense
  BLAS.Fill(..),
  BLAS.Operation(..),
  BLAS.Side(..),
  EigType(..),
  EigMode(..),

  -- Sparse
  Sparse.MatrixDescriptor(..),

  -- Refactorisation
  MatrixFormat(..),
  NumericBoost(..),
  ResetFastMode(..),
  FactorizationAlgorithm(..),
  TriangularSolveAlgorithm(..),
  UnitDiagonal(..),

) where



-- friends
import Foreign.CUDA.BLAS                                  as BLAS
import Foreign.CUDA.BLAS.Sparse.Matrix.Descriptor         as Sparse

-- other
import Prelude
import Foreign.Ptr



{-# LINE 45 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}



-- | This type indicates which type of eigenvalue solver is used. It corresponds
-- to the parameters used by legacy LAPACK implementations:
--
--    * @EigType1@: \( A*x = lambda*B*x \)
--    * @EigType2@: \( A*B*x = lambda*x \)
--    * @EigType3@: \( B*A*x = lambda*x \)
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverEigType>
--
data EigType = EigType1
             | EigType2
             | EigType3
  deriving (Eq,Show)
instance Enum EigType where
  succ EigType1 = EigType2
  succ EigType2 = EigType3
  succ EigType3 = error "EigType.succ: EigType3 has no successor"

  pred EigType2 = EigType1
  pred EigType3 = EigType2
  pred EigType1 = error "EigType.pred: EigType1 has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from EigType3

  fromEnum EigType1 = 1
  fromEnum EigType2 = 2
  fromEnum EigType3 = 3

  toEnum 1 = EigType1
  toEnum 2 = EigType2
  toEnum 3 = EigType3
  toEnum unmatched = error ("EigType.toEnum: Cannot match " ++ show unmatched)

{-# LINE 63 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}



-- | This type indicates whether eigenvectors are computed.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverEigMode>
--
data EigMode = NoVector
             | Vector
  deriving (Eq,Show)
instance Enum EigMode where
  succ NoVector = Vector
  succ Vector = error "EigMode.succ: Vector has no successor"

  pred Vector = NoVector
  pred NoVector = error "EigMode.pred: NoVector has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from Vector

  fromEnum NoVector = 0
  fromEnum Vector = 1

  toEnum 0 = NoVector
  toEnum 1 = Vector
  toEnum unmatched = error ("EigMode.toEnum: Cannot match " ++ show unmatched)

{-# LINE 78 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}



-- | Indicates the input/output matrix format
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfMatrixFormat>
--
data MatrixFormat = CSR
                  | CSC
  deriving (Eq,Show)
instance Enum MatrixFormat where
  succ CSR = CSC
  succ CSC = error "MatrixFormat.succ: CSC has no successor"

  pred CSC = CSR
  pred CSR = error "MatrixFormat.pred: CSR has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from CSC

  fromEnum CSR = 0
  fromEnum CSC = 1

  toEnum 0 = CSR
  toEnum 1 = CSC
  toEnum unmatched = error ("MatrixFormat.toEnum: Cannot match " ++ show unmatched)

{-# LINE 87 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}


-- | Indicates whether numeric boosting of the pivot was used during
-- refactorisation.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfNumericBoostReport>
--
data NumericBoost = BoostNotUsed
                  | BoostUsed
  deriving (Eq,Show)
instance Enum NumericBoost where
  succ BoostNotUsed = BoostUsed
  succ BoostUsed = error "NumericBoost.succ: BoostUsed has no successor"

  pred BoostUsed = BoostNotUsed
  pred BoostNotUsed = error "NumericBoost.pred: BoostNotUsed has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from BoostUsed

  fromEnum BoostNotUsed = 0
  fromEnum BoostUsed = 1

  toEnum 0 = BoostNotUsed
  toEnum 1 = BoostUsed
  toEnum unmatched = error ("NumericBoost.toEnum: Cannot match " ++ show unmatched)

{-# LINE 96 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}


-- | Indicates whether fast mode should be used in
-- 'Foreign.CUDA.Solver.Refactorisation.resetValues'. Fast mode requires extra
-- memory.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfResetValuesFastMode>
--
data ResetFastMode = FastModeOff
                   | FastModeOn
  deriving (Eq,Show)
instance Enum ResetFastMode where
  succ FastModeOff = FastModeOn
  succ FastModeOn = error "ResetFastMode.succ: FastModeOn has no successor"

  pred FastModeOn = FastModeOff
  pred FastModeOff = error "ResetFastMode.pred: FastModeOff has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from FastModeOn

  fromEnum FastModeOff = 0
  fromEnum FastModeOn = 1

  toEnum 0 = FastModeOff
  toEnum 1 = FastModeOn
  toEnum unmatched = error ("ResetFastMode.toEnum: Cannot match " ++ show unmatched)

{-# LINE 106 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}


-- | Indicates which (internal) algorithm is used for refactorisation in the
-- 'Foreign.CUDA.Solver.Refactorisation.refactor' routine.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfFactorization>
--
data FactorizationAlgorithm = FactorizationAlg0
                            | FactorizationAlg1
                            | FactorizationAlg2
  deriving (Eq,Show)
instance Enum FactorizationAlgorithm where
  succ FactorizationAlg0 = FactorizationAlg1
  succ FactorizationAlg1 = FactorizationAlg2
  succ FactorizationAlg2 = error "FactorizationAlgorithm.succ: FactorizationAlg2 has no successor"

  pred FactorizationAlg1 = FactorizationAlg0
  pred FactorizationAlg2 = FactorizationAlg1
  pred FactorizationAlg0 = error "FactorizationAlgorithm.pred: FactorizationAlg0 has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from FactorizationAlg2

  fromEnum FactorizationAlg0 = 0
  fromEnum FactorizationAlg1 = 1
  fromEnum FactorizationAlg2 = 2

  toEnum 0 = FactorizationAlg0
  toEnum 1 = FactorizationAlg1
  toEnum 2 = FactorizationAlg2
  toEnum unmatched = error ("FactorizationAlgorithm.toEnum: Cannot match " ++ show unmatched)

{-# LINE 115 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}


-- | Indicates which (internal) algorithm is used for the triangular solve
-- routine 'Foreign.CUDA.Solver.Refactorisation.triangularSolve'.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfTriangularSolve>
--
data TriangularSolveAlgorithm = TriangularSolveAlg0
                              | TriangularSolveAlg1
                              | TriangularSolveAlg2
                              | TriangularSolveAlg3
  deriving (Eq,Show)
instance Enum TriangularSolveAlgorithm where
  succ TriangularSolveAlg0 = TriangularSolveAlg1
  succ TriangularSolveAlg1 = TriangularSolveAlg2
  succ TriangularSolveAlg2 = TriangularSolveAlg3
  succ TriangularSolveAlg3 = error "TriangularSolveAlgorithm.succ: TriangularSolveAlg3 has no successor"

  pred TriangularSolveAlg1 = TriangularSolveAlg0
  pred TriangularSolveAlg2 = TriangularSolveAlg1
  pred TriangularSolveAlg3 = TriangularSolveAlg2
  pred TriangularSolveAlg0 = error "TriangularSolveAlgorithm.pred: TriangularSolveAlg0 has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from TriangularSolveAlg3

  fromEnum TriangularSolveAlg0 = 0
  fromEnum TriangularSolveAlg1 = 1
  fromEnum TriangularSolveAlg2 = 2
  fromEnum TriangularSolveAlg3 = 3

  toEnum 0 = TriangularSolveAlg0
  toEnum 1 = TriangularSolveAlg1
  toEnum 2 = TriangularSolveAlg2
  toEnum 3 = TriangularSolveAlg3
  toEnum unmatched = error ("TriangularSolveAlgorithm.toEnum: Cannot match " ++ show unmatched)

{-# LINE 124 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}


-- | Indicates whether and where the unit diagonal is stored in the input/output
-- triangular factors.
--
-- <http://docs.nvidia.com/cuda/cusolver/index.html#cusolverRfUnitDiagonal>
--
data UnitDiagonal = StoredL
                  | StoredU
                  | AssumedL
                  | AssumedU
  deriving (Eq,Show)
instance Enum UnitDiagonal where
  succ StoredL = StoredU
  succ StoredU = AssumedL
  succ AssumedL = AssumedU
  succ AssumedU = error "UnitDiagonal.succ: AssumedU has no successor"

  pred StoredU = StoredL
  pred AssumedL = StoredU
  pred AssumedU = AssumedL
  pred StoredL = error "UnitDiagonal.pred: StoredL has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from AssumedU

  fromEnum StoredL = 0
  fromEnum StoredU = 1
  fromEnum AssumedL = 2
  fromEnum AssumedU = 3

  toEnum 0 = StoredL
  toEnum 1 = StoredU
  toEnum 2 = AssumedL
  toEnum 3 = AssumedU
  toEnum unmatched = error ("UnitDiagonal.toEnum: Cannot match " ++ show unmatched)

{-# LINE 133 "./Foreign/CUDA/Solver/Internal/Types.chs" #-}