-- |
-- Module      : Data.Manifold.Types.Stiefel
-- Copyright   : (c) Justus Sagemüller 2015
-- License     : GPL v3
-- 
-- Maintainer  : (@) jsag $ hvl.no
-- Stability   : experimental
-- Portability : portable
-- 
-- Stiefel manifolds are a generalisation of the concept of the 'UnitSphere'
-- in real vector spaces.
-- The /n/-th Stiefel manifold is the space of all possible configurations of
-- /n/ orthonormal vectors. In the case /n/ = 1, simply a single normalised vector,
-- i.e. a vector on the unit sphere.
-- 
-- Alternatively, the stiefel manifolds can be defined as quotient spaces under
-- scalings, and we prefer that definition since it doesn't require a notion of
-- unit length (which is only defined in inner-product spaces).

{-# LANGUAGE StandaloneDeriving, FlexibleContexts, UndecidableInstances #-}



module Data.Manifold.Types.Stiefel where


import Data.Maybe
import qualified Data.Vector as Arr

import Data.VectorSpace
import Data.AffineSpace
import Math.LinearMap.Category

import Data.Manifold.Types.Primitive ((^), empty, embed, coEmbed)
import Data.Manifold.PseudoAffine

import qualified Prelude as Hask hiding(foldl, sum, sequence)
import qualified Control.Applicative as Hask
import qualified Control.Monad       as Hask hiding(forM_, sequence)

import Control.Category.Constrained.Prelude hiding
     ((^), all, elem, sum, forM, Foldable(..), Traversable)
import Control.Arrow.Constrained
import Control.Monad.Constrained hiding (forM)
import Data.Foldable.Constrained


newtype Stiefel1 v = Stiefel1 { getStiefel1N :: DualVector v }
deriving instance (Show (DualVector v)) => Show (Stiefel1 v)