{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MagicHash             #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds             #-}
{-# LANGUAGE RecordWildCards       #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE StandaloneDeriving    #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeOperators         #-}
{-# LANGUAGE UnboxedTuples         #-}
{-# LANGUAGE UndecidableInstances  #-}

module Numeric.Matrix.Bidiagonal
  ( BiDiag (..), biDiag, bidiagonalHouseholder
  ) where

import Control.Monad
import Control.Monad.ST
import Data.Kind
import Numeric.Basics
import Numeric.DataFrame.ST
import Numeric.DataFrame.SubSpace
import Numeric.DataFrame.Type
import Numeric.Dimensions
import Numeric.Matrix.Internal
import Numeric.Scalar.Internal
import Numeric.Subroutine.Householder
import Numeric.Vector.Internal


-- | Put two vectors on the main and first upper diagonal.
biDiag :: forall (t :: Type) (n :: Nat) (m :: Nat)
        . (PrimBytes t, Num t)
       => Dims '[n,m]
       -> Vector t (Min n m)
       -> Vector t (Min n m)
       -> Matrix t n m
biDiag :: Dims '[n, m]
-> Vector t (Min n m) -> Vector t (Min n m) -> Matrix t n m
biDiag (dn :: Dim y
dn@Dim y
D :* dm :: Dim y
dm@Dim y
D :* TypedList Dim ys
U) Vector t (Min n m)
a Vector t (Min n m)
b = (forall s. ST s (Matrix t n m)) -> Matrix t n m
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Matrix t n m)) -> Matrix t n m)
-> (forall s. ST s (Matrix t n m)) -> Matrix t n m
forall a b. (a -> b) -> a -> b
$ do
    dnm :: Dim (Min n m)
dnm@Dim (Min n m)
D <- Dim (Min n m) -> ST s (Dim (Min n m))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Dim (Min n m) -> ST s (Dim (Min n m)))
-> Dim (Min n m) -> ST s (Dim (Min n m))
forall a b. (a -> b) -> a -> b
$ Dim y -> Dim y -> Dim (Min y y)
forall (n :: Nat) (m :: Nat). Dim n -> Dim m -> Dim (Min n m)
minDim Dim y
dn Dim y
dm
    STDataFrame s t '[n, m]
rPtr <- Matrix t n m -> ST s (STDataFrame s t '[n, m])
forall k t (ns :: [k]) s.
(Dimensions ns, PrimArray t (DataFrame t ns)) =>
DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame Matrix t n m
0
    [Word] -> (Word -> ST s ()) -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Word
0 .. Dim (Min n m) -> Word
forall k (x :: k). Dim x -> Word
dimVal Dim (Min n m)
dnm Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1] ((Word -> ST s ()) -> ST s ()) -> (Word -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \Word
i -> do
      STDataFrame s t '[n, m]
-> Idxs '[n, m] -> DataFrame t '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Idxs ns -> DataFrame t '[] -> ST s ()
writeDataFrame STDataFrame s t '[n, m]
rPtr (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U) (DataFrame t '[] -> ST s ()) -> DataFrame t '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Vector t (Min n m)
a Vector t (Min n m) -> Word -> DataFrame t '[]
forall k k (t :: k) (d :: k) (ds :: [k]).
IndexFrame t d ds =>
DataFrame t (d : ds) -> Word -> DataFrame t ds
! Word
i
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word
iWord -> Word -> Word
forall a. Num a => a -> a -> a
+Word
1 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Dim y -> Word
forall k (x :: k). Dim x -> Word
dimVal Dim y
dm) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        STDataFrame s t '[n, m]
-> Idxs '[n, m] -> DataFrame t '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Idxs ns -> DataFrame t '[] -> ST s ()
writeDataFrame STDataFrame s t '[n, m]
rPtr (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
iWord -> Word -> Word
forall a. Num a => a -> a -> a
+Word
1) Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U) (DataFrame t '[] -> ST s ()) -> DataFrame t '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Vector t (Min n m)
b Vector t (Min n m) -> Word -> DataFrame t '[]
forall k k (t :: k) (d :: k) (ds :: [k]).
IndexFrame t d ds =>
DataFrame t (d : ds) -> Word -> DataFrame t ds
! Word
i
    STDataFrame s t '[n, m] -> ST s (Matrix t n m)
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame STDataFrame s t '[n, m]
rPtr

-- | Decomposition of a matrix \( A = U B V^\intercal \) such that
--   \( U \) and \( V \) are orthogonal and \( B \) is bidiagonal.
data BiDiag (t :: Type) (n :: Nat)  (m :: Nat)
  = BiDiag
  { BiDiag t n m -> Matrix t n n
bdU     :: Matrix t n n
    -- ^ \( U \) left orthogonal matrix
  , BiDiag t n m -> Scalar t
bdUDet  :: Scalar t
    -- ^ A shortcut for evaluating a determinant of \( |U| = \pm 1 \)
  , BiDiag t n m -> Vector t (Min n m)
bdAlpha :: Vector t (Min n m)
    -- ^ Main diagonal of \( B \)
  , BiDiag t n m -> Vector t (Min n m)
bdBeta  :: Vector t (Min n m)
    -- ^ First upper diagonal of \( B \);
    --   its last element equals zero if \( n \geq m \)
  , BiDiag t n m -> Matrix t m m
bdV     :: Matrix t m m
    -- ^ \( B \) left orthogonal matrix
  , BiDiag t n m -> Scalar t
bdVDet  :: Scalar t
    -- ^ A shortcut for evaluating a determinant of \( |V| = \pm 1 \)
  }

deriving instance ( Show t, PrimBytes t
                  , KnownDim n, KnownDim m, KnownDim (Min n m))
                  => Show (BiDiag t n m)
deriving instance ( Eq t, PrimBytes t
                  , KnownDim n, KnownDim m, KnownDim (Min n m)
                  , KnownBackend t '[Min n m])
                  => Eq (BiDiag t n m)

{- |
Decompose a matrix \( A = U B V^\intercal \) such that
\( U \) and \( V \) are orthogonal and \( B \) is bidiagonal.

The first returned number
 -}
bidiagonalHouseholder ::
       forall (t :: Type) (n :: Nat) (m :: Nat)
     . (PrimBytes t, Ord t, Epsilon t, KnownDim n, KnownDim m)
    => Matrix t n m
    -> BiDiag t n m
bidiagonalHouseholder :: Matrix t n m -> BiDiag t n m
bidiagonalHouseholder Matrix t n m
a = (forall s. ST s (BiDiag t n m)) -> BiDiag t n m
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (BiDiag t n m)) -> BiDiag t n m)
-> (forall s. ST s (BiDiag t n m)) -> BiDiag t n m
forall a b. (a -> b) -> a -> b
$ do
      Dim (Min' n m (CmpNat n m))
D <- Dim (Min' n m (CmpNat n m)) -> ST s (Dim (Min' n m (CmpNat n m)))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Dim (Min' n m (CmpNat n m)) -> ST s (Dim (Min' n m (CmpNat n m))))
-> Dim (Min' n m (CmpNat n m))
-> ST s (Dim (Min' n m (CmpNat n m)))
forall a b. (a -> b) -> a -> b
$ Dim n -> Dim m -> Dim (Min' n m (CmpNat n m))
forall (n :: Nat) (m :: Nat). Dim n -> Dim m -> Dim (Min n m)
minDim (KnownDim n => Dim n
forall k (n :: k). KnownDim n => Dim n
dim @n) (KnownDim m => Dim m
forall k (n :: k). KnownDim n => Dim n
dim @m)
      STDataFrame s t '[n]
tmpNPtr <- ST s (STDataFrame s t '[n])
forall k t (ns :: [k]) s.
(PrimBytes t, Dimensions ns) =>
ST s (STDataFrame s t ns)
newDataFrame
      STDataFrame s t '[m]
tmpMPtr <- ST s (STDataFrame s t '[m])
forall k t (ns :: [k]) s.
(PrimBytes t, Dimensions ns) =>
ST s (STDataFrame s t ns)
newDataFrame
      STDataFrame s t '[n, n]
uPtr <- DataFrame t '[n, n] -> ST s (STDataFrame s t '[n, n])
forall k t (ns :: [k]) s.
(Dimensions ns, PrimArray t (DataFrame t ns)) =>
DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame DataFrame t '[n, n]
forall t (n :: Nat). SquareMatrix t n => Matrix t n n
eye
      STDataFrame s t '[n, m]
bPtr <- Matrix t n m -> ST s (STDataFrame s t '[n, m])
forall k t (ns :: [k]) s.
(Dimensions ns, PrimArray t (DataFrame t ns)) =>
DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame Matrix t n m
a
      STDataFrame s t '[m, m]
vPtr <- DataFrame t '[m, m] -> ST s (STDataFrame s t '[m, m])
forall k t (ns :: [k]) s.
(Dimensions ns, PrimArray t (DataFrame t ns)) =>
DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame DataFrame t '[m, m]
forall t (n :: Nat). SquareMatrix t n => Matrix t n n
eye
      (Bool
ud, Bool
vd) <-
        let f :: (Bool, Bool) -> Word -> ST s (Bool, Bool)
f (Bool
ud, Bool
vd) Word
i = do
              Bool
ud' <- STDataFrame s t '[n]
-> STDataFrame s t '[n, n]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
forall s t (n :: Nat) (m :: Nat).
(PrimBytes t, Ord t, Epsilon t, KnownDim n, KnownDim m) =>
STDataFrame s t '[n]
-> STDataFrame s t '[n, n]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
householderReflectionInplaceL STDataFrame s t '[n]
tmpNPtr STDataFrame s t '[n, n]
uPtr STDataFrame s t '[n, m]
bPtr
                     (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U)
              Bool
vd' <- STDataFrame s t '[m]
-> STDataFrame s t '[m, m]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
forall s t (n :: Nat) (m :: Nat).
(PrimBytes t, Ord t, Epsilon t, KnownDim n, KnownDim m) =>
STDataFrame s t '[m]
-> STDataFrame s t '[m, m]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
householderReflectionInplaceR STDataFrame s t '[m]
tmpMPtr STDataFrame s t '[m, m]
vPtr STDataFrame s t '[n, m]
bPtr
                     (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U)
              (Bool, Bool) -> ST s (Bool, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
ud Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
ud', Bool
vd Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
vd')
        in ((Bool, Bool) -> Word -> ST s (Bool, Bool))
-> (Bool, Bool) -> [Word] -> ST s (Bool, Bool)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM (Bool, Bool) -> Word -> ST s (Bool, Bool)
f (Bool
False, Bool
False) [Word
1 .. Word
lim Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1]

      Bool
udn <- STDataFrame s t '[n]
-> STDataFrame s t '[n, n]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
forall s t (n :: Nat) (m :: Nat).
(PrimBytes t, Ord t, Epsilon t, KnownDim n, KnownDim m) =>
STDataFrame s t '[n]
-> STDataFrame s t '[n, n]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
householderReflectionInplaceL STDataFrame s t '[n]
tmpNPtr STDataFrame s t '[n, n]
uPtr STDataFrame s t '[n, m]
bPtr
                     (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
lim Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
lim Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U)
      Bool
vdn <- if (Word
m Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
lim)
             then STDataFrame s t '[m]
-> STDataFrame s t '[m, m]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
forall s t (n :: Nat) (m :: Nat).
(PrimBytes t, Ord t, Epsilon t, KnownDim n, KnownDim m) =>
STDataFrame s t '[m]
-> STDataFrame s t '[m, m]
-> STDataFrame s t '[n, m]
-> Idxs '[n, m]
-> ST s Bool
householderReflectionInplaceR STDataFrame s t '[m]
tmpMPtr STDataFrame s t '[m, m]
vPtr STDataFrame s t '[n, m]
bPtr
                     (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
lim Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1) Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
lim Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U)
             else Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
      DataFrame t '[n, n]
bdU <- STDataFrame s t '[n, n] -> ST s (DataFrame t '[n, n])
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame STDataFrame s t '[n, n]
uPtr
      DataFrame t '[m, m]
bdV <- STDataFrame s t '[m, m] -> ST s (DataFrame t '[m, m])
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame STDataFrame s t '[m, m]
vPtr
      Matrix t n m
b <- STDataFrame s t '[n, m] -> ST s (Matrix t n m)
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame STDataFrame s t '[n, m]
bPtr
      let bdAlpha :: DataFrame t '[Min' n m (CmpNat n m)]
bdAlpha = (Idxs '[Min' n m (CmpNat n m)] -> DataFrame t '[])
-> DataFrame t '[Min' n m (CmpNat n m)]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
(SubSpace t as bs asbs, Dimensions as) =>
(Idxs as -> DataFrame t bs) -> DataFrame t asbs
iwgen @t @'[Min n m]
            (\(Idx i :* U) -> Idxs '[n, m] -> Matrix t n m -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Idxs as -> DataFrame t asbs -> DataFrame t bs
index (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U) Matrix t n m
b)
          bdBeta :: DataFrame t '[Min' n m (CmpNat n m)]
bdBeta  = (Idxs '[Min' n m (CmpNat n m)] -> DataFrame t '[])
-> DataFrame t '[Min' n m (CmpNat n m)]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
(SubSpace t as bs asbs, Dimensions as) =>
(Idxs as -> DataFrame t bs) -> DataFrame t asbs
iwgen @t @'[Min n m]
            (\(Idx i :* U) -> if Word
iWord -> Word -> Word
forall a. Num a => a -> a -> a
+Word
1 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
m then Idxs '[n, m] -> Matrix t n m -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Idxs as -> DataFrame t asbs -> DataFrame t bs
index (Word -> Idx n
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx Word
i Idx n -> TypedList Idx '[m] -> Idxs '[n, m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* Word -> Idx m
forall k (d :: k). BoundedDim d => Word -> Idx d
Idx (Word
iWord -> Word -> Word
forall a. Num a => a -> a -> a
+Word
1) Idx m -> TypedList Idx '[] -> TypedList Idx '[m]
forall k (f :: k -> *) (xs :: [k]) (y :: k) (ys :: [k]).
(xs ~ (y : ys)) =>
f y -> TypedList f ys -> TypedList f xs
:* TypedList Idx '[]
forall k (f :: k -> *) (xs :: [k]). (xs ~ '[]) => TypedList f xs
U) Matrix t n m
b else DataFrame t '[]
0)
          bdUDet :: DataFrame t '[]
bdUDet = if Bool
ud Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
udn then -DataFrame t '[]
1 else DataFrame t '[]
1
          bdVDet :: DataFrame t '[]
bdVDet = if Bool
vd Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
vdn then -DataFrame t '[]
1 else DataFrame t '[]
1
      BiDiag t n m -> ST s (BiDiag t n m)
forall (m :: * -> *) a. Monad m => a -> m a
return BiDiag :: forall t (n :: Nat) (m :: Nat).
Matrix t n n
-> Scalar t
-> Vector t (Min n m)
-> Vector t (Min n m)
-> Matrix t m m
-> Scalar t
-> BiDiag t n m
BiDiag {DataFrame t '[n, n]
DataFrame t '[m, m]
DataFrame t '[Min' n m (CmpNat n m)]
DataFrame t '[]
bdVDet :: DataFrame t '[]
bdUDet :: DataFrame t '[]
bdBeta :: DataFrame t '[Min' n m (CmpNat n m)]
bdAlpha :: DataFrame t '[Min' n m (CmpNat n m)]
bdV :: DataFrame t '[m, m]
bdU :: DataFrame t '[n, n]
bdVDet :: DataFrame t '[]
bdV :: DataFrame t '[m, m]
bdBeta :: DataFrame t '[Min' n m (CmpNat n m)]
bdAlpha :: DataFrame t '[Min' n m (CmpNat n m)]
bdUDet :: DataFrame t '[]
bdU :: DataFrame t '[n, n]
..}
  where
    n :: Word
n = KnownDim n => Word
forall k (n :: k). KnownDim n => Word
dimVal' @n
    m :: Word
m = KnownDim m => Word
forall k (n :: k). KnownDim n => Word
dimVal' @m
    lim :: Word
lim = Word -> Word -> Word
forall a. Ord a => a -> a -> a
max Word
1 (Word -> Word -> Word
forall a. Ord a => a -> a -> a
min Word
n Word
m)