{-# LANGUAGE DataKinds                 #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts          #-}
{-# LANGUAGE FlexibleInstances         #-}
{-# LANGUAGE GADTs                     #-}
{-# LANGUAGE MagicHash                 #-}
{-# LANGUAGE MultiParamTypeClasses     #-}
{-# LANGUAGE PatternSynonyms           #-}
{-# LANGUAGE PolyKinds                 #-}
{-# LANGUAGE ScopedTypeVariables       #-}
{-# LANGUAGE TypeApplications          #-}
{-# LANGUAGE TypeFamilies              #-}
{-# LANGUAGE TypeInType                #-}
{-# LANGUAGE TypeOperators             #-}
{-# LANGUAGE UnboxedTuples             #-}
{-# LANGUAGE UndecidableInstances      #-}
{-# LANGUAGE ViewPatterns              #-}

module Numeric.Vector.Internal
    (  -- * Type aliases
      Vector
    , Vec2f, Vec3f, Vec4f, Vec2d, Vec3d, Vec4d
    , Vec2i, Vec3i, Vec4i, Vec2w, Vec3w, Vec4w
      -- * Vector constructors
    , Vector2 (..), Vector3 (..), Vector4 (..)
    , DataFrame(Vec2, Vec3, Vec4)
      -- * Common operations
    , (.*.), dot, (·)
    , normL1, normL2, normLPInf, normLNInf, normLP
    , normalized
    , det2, cross, (×)
    ) where

import Data.Kind
import Numeric.DataFrame.SubSpace
import Numeric.DataFrame.Type
import Numeric.Scalar.Internal



type Vector (t :: l) (n :: k) = DataFrame t '[n]

type Vec2f = Vector Float 2
type Vec3f = Vector Float 3
type Vec4f = Vector Float 4
type Vec2d = Vector Double 2
type Vec3d = Vector Double 3
type Vec4d = Vector Double 4
type Vec2i = Vector Int 2
type Vec3i = Vector Int 3
type Vec4i = Vector Int 4
type Vec2w = Vector Word 2
type Vec3w = Vector Word 3
type Vec4w = Vector Word 4


pattern Vec4 :: Vector4 t => t -> t -> t -> t -> Vector t 4
pattern $bVec4 :: t -> t -> t -> t -> Vector t 4
$mVec4 :: forall r t.
Vector4 t =>
Vector t 4 -> (t -> t -> t -> t -> r) -> (Void# -> r) -> r
Vec4 a b c d <- (unpackV4# -> (# a, b, c, d #))
  where
    Vec4 = t -> t -> t -> t -> Vector t 4
forall t. Vector4 t => t -> t -> t -> t -> Vector t 4
vec4
{-# COMPLETE Vec4 #-}

pattern Vec3 :: Vector3 t => t -> t -> t -> Vector t 3
pattern $bVec3 :: t -> t -> t -> Vector t 3
$mVec3 :: forall r t.
Vector3 t =>
Vector t 3 -> (t -> t -> t -> r) -> (Void# -> r) -> r
Vec3 a b c <- (unpackV3# -> (# a, b, c #))
  where
    Vec3 = t -> t -> t -> Vector t 3
forall t. Vector3 t => t -> t -> t -> Vector t 3
vec3
{-# COMPLETE Vec3 #-}

pattern Vec2 :: Vector2 t => t -> t -> Vector t 2
pattern $bVec2 :: t -> t -> Vector t 2
$mVec2 :: forall r t.
Vector2 t =>
Vector t 2 -> (t -> t -> r) -> (Void# -> r) -> r
Vec2 a b <- (unpackV2# -> (# a, b #))
  where
    Vec2 = t -> t -> Vector t 2
forall t. Vector2 t => t -> t -> Vector t 2
vec2
{-# COMPLETE Vec2 #-}

-- | Packing and unpacking 2D vectors
class Vector2 t where
  -- | Compose a 2D vector
  vec2 :: t -> t -> Vector t 2
  -- | Unpack 2D vector elements
  unpackV2# :: Vector t 2 -> (# t, t #)

-- | Packing and unpacking 3D vectors
class Vector3 t where
  -- | Compose a 3D vector
  vec3 :: t -> t -> t -> Vector t 3
  -- | Unpack 3D vector elements
  unpackV3# :: Vector t 3 -> (# t, t, t #)

-- | Packing and unpacking 4D vectors
class Vector4 t where
  -- | Compose a 4D vector
  vec4 :: t -> t -> t -> t -> Vector t 4
  -- | Unpack 4D vector elements
  unpackV4# :: Vector t 4 -> (# t, t, t, t #)

instance {-# OVERLAPPABLE #-} SubSpace t '[2] '[] '[2] => Vector2 t where
  vec2 :: t -> t -> Vector t 2
vec2 t
a t
b = (Idxs '[2] -> DataFrame t '[]) -> Vector t 2
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 Idxs '[2] -> DataFrame t '[]
f
    where
      f :: Idxs '[2] -> DataFrame t '[]
f (Idx y
0 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
a
      f Idxs '[2]
_        = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
b
  {-# INLINE vec2 #-}
  unpackV2# :: Vector t 2 -> (# t, t #)
unpackV2# Vector t 2
v =
    (# DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 2 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
0 Vector t 2
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 2 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
1 Vector t 2
v) #)
  {-# INLINE unpackV2# #-}

instance {-# OVERLAPPABLE #-} SubSpace t '[3] '[] '[3] => Vector3 t where
  vec3 :: t -> t -> t -> Vector t 3
vec3 t
a t
b t
c = (Idxs '[3] -> DataFrame t '[]) -> Vector t 3
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 Idxs '[3] -> DataFrame t '[]
f
    where
      f :: Idxs '[3] -> DataFrame t '[]
f (Idx y
0 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
a
      f (Idx y
1 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
b
      f Idxs '[3]
_        = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
c
  {-# INLINE vec3 #-}
  unpackV3# :: Vector t 3 -> (# t, t, t #)
unpackV3# Vector t 3
v =
    (# DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 3 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
0 Vector t 3
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 3 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
1 Vector t 3
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 3 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
2 Vector t 3
v) #)
  {-# INLINE unpackV3# #-}

instance {-# OVERLAPPABLE #-} SubSpace t '[4] '[] '[4] => Vector4 t where
  vec4 :: t -> t -> t -> t -> Vector t 4
vec4 t
a t
b t
c t
d = (Idxs '[4] -> DataFrame t '[]) -> Vector t 4
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 Idxs '[4] -> DataFrame t '[]
f
    where
      f :: Idxs '[4] -> DataFrame t '[]
f (Idx y
0 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
a
      f (Idx y
1 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
b
      f (Idx y
2 :* TypedList Idx ys
U) = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
c
      f Idxs '[4]
_        = t -> DataFrame t '[]
forall t. t -> DataFrame t '[]
scalar t
d
  {-# INLINE vec4 #-}
  unpackV4# :: Vector t 4 -> (# t, t, t, t #)
unpackV4# Vector t 4
v =
    (# DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 4 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
0 Vector t 4
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 4 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
1 Vector t 4
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 4 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
2 Vector t 4
v)
     , DataFrame t '[] -> t
forall t. DataFrame t '[] -> t
unScalar (Int -> Vector t 4 -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
3 Vector t 4
v) #)
  {-# INLINE unpackV4# #-}



-- | Scalar product -- sum of Vecs' components products,
--                     propagated into whole Vec
(.*.) :: ( Num t
         , Num (Vector t n)
         , SubSpace t '[n] '[] '[n]
         )
      => Vector t (n :: Nat) -> Vector t n -> Vector t n
.*. :: Vector t n -> Vector t n -> Vector t n
(.*.) Vector t n
a Vector t n
b = Scalar t -> Vector t n
forall t (ds :: [Nat]).
PrimArray t (DataFrame t ds) =>
Scalar t -> DataFrame t ds
fromScalar (Scalar t -> Vector t n)
-> (Vector t n -> Scalar t) -> Vector t n -> Vector t n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scalar t -> Scalar t -> Scalar t)
-> Scalar t -> Vector t n -> Scalar t
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(b -> DataFrame t bs -> b) -> b -> DataFrame t asbs -> b
ewfoldl Scalar t -> Scalar t -> Scalar t
forall a. Num a => a -> a -> a
(+) Scalar t
0 (Vector t n -> Vector t n) -> Vector t n -> Vector t n
forall a b. (a -> b) -> a -> b
$ Vector t n
a Vector t n -> Vector t n -> Vector t n
forall a. Num a => a -> a -> a
* Vector t n
b
infixl 7 .*.

-- | Scalar product -- sum of Vecs' components products -- a scalar
dot :: ( Num t
       , Num (Vector t n)
       , SubSpace t '[n] '[] '[n]
       )
    => Vector t (n :: Nat) -> Vector t n -> Scalar t
dot :: Vector t n -> Vector t n -> Scalar t
dot Vector t n
a Vector t n
b = (Scalar t -> Scalar t -> Scalar t)
-> Scalar t -> Vector t n -> Scalar t
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(b -> DataFrame t bs -> b) -> b -> DataFrame t asbs -> b
ewfoldl Scalar t -> Scalar t -> Scalar t
forall a. Num a => a -> a -> a
(+) Scalar t
0 (Vector t n -> Scalar t) -> Vector t n -> Scalar t
forall a b. (a -> b) -> a -> b
$ Vector t n
a Vector t n -> Vector t n -> Vector t n
forall a. Num a => a -> a -> a
* Vector t n
b

-- | Dot product of two vectors
infixl 7 ·
(·) :: ( Num t
       , Num (Vector t n)
       , SubSpace t '[n] '[] '[n]
       )
    => Vector t (n :: Nat) -> Vector t n -> Scalar t
· :: Vector t n -> Vector t n -> Scalar t
(·) = Vector t n -> Vector t n -> Scalar t
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
dot
{-# INLINE (·) #-}


-- | Sum of absolute values
normL1 :: ( Num (DataFrame t ('[] :: [k])), SubSpace t '[n] '[] '[n] )
       => Vector t (n :: k) -> DataFrame t ('[] :: [k])
normL1 :: Vector t n -> DataFrame t '[]
normL1 = (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (\DataFrame t '[]
a -> (DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a
abs DataFrame t '[]
a DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
+)) DataFrame t '[]
0

-- | hypot function (square root of squares)
normL2 :: ( Floating (DataFrame t ('[] :: [k])), SubSpace t '[n] '[] '[n] )
       => Vector t (n :: k) -> DataFrame t ('[] :: [k])
normL2 :: Vector t n -> DataFrame t '[]
normL2 = DataFrame t '[] -> DataFrame t '[]
forall a. Floating a => a -> a
sqrt (DataFrame t '[] -> DataFrame t '[])
-> (Vector t n -> DataFrame t '[]) -> Vector t n -> DataFrame t '[]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (\DataFrame t '[]
a -> (DataFrame t '[]
aDataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
a DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
+)) DataFrame t '[]
0

-- | Normalize vector w.r.t. Euclidean metric (L2).
normalized :: forall (k :: Type) (t :: Type) (n :: k)
            . ( Floating (DataFrame t ('[] :: [k]))
              , SubSpace t '[n] '[] '[n] )
           => Vector t n -> Vector t n
normalized :: Vector t n -> Vector t n
normalized Vector t n
v = (DataFrame t '[] -> DataFrame t '[]) -> Vector t n -> Vector t n
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) s (bs' :: [k])
       (asbs' :: [k]).
(SubSpace t as bs asbs, SubSpace s as bs' asbs') =>
(DataFrame s bs' -> DataFrame t bs)
-> DataFrame s asbs' -> DataFrame t asbs
ewmap @t @'[n] @'[] (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
rn) Vector t n
v
  where
    rn :: DataFrame t '[]
rn = DataFrame t '[] -> DataFrame t '[]
forall a. Fractional a => a -> a
recip (DataFrame t '[] -> DataFrame t '[])
-> (DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[]
-> DataFrame t '[]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataFrame t '[] -> DataFrame t '[]
forall a. Floating a => a -> a
sqrt (DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> DataFrame t '[]
forall a b. (a -> b) -> a -> b
$ (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (\DataFrame t '[]
a -> (DataFrame t '[]
aDataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
a DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
+)) DataFrame t '[]
0 Vector t n
v

-- | Maximum of absolute values
normLPInf :: ( Ord (DataFrame t ('[] :: [k]))
             , Num (DataFrame t ('[] :: [k]))
             , SubSpace t '[n] '[] '[n] )
          => Vector t (n :: k) -> DataFrame t ('[] :: [k])
normLPInf :: Vector t n -> DataFrame t '[]
normLPInf = (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Ord a => a -> a -> a
max (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> (DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[]
-> DataFrame t '[]
-> DataFrame t '[]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a
abs) DataFrame t '[]
0

-- | Minimum of absolute values
normLNInf :: ( Ord (DataFrame t ('[] :: [k]))
             , Num (DataFrame t ('[] :: [k]))
             , SubSpace t '[n] '[] '[n] )
          => Vector t (n :: k) -> DataFrame t ('[] :: [k])
normLNInf :: Vector t n -> DataFrame t '[]
normLNInf Vector t n
x = (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Ord a => a -> a -> a
min (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> (DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[]
-> DataFrame t '[]
-> DataFrame t '[]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a
abs) (DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a
abs (DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> DataFrame t '[]
forall a b. (a -> b) -> a -> b
$ Int -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]).
SubSpace t as bs asbs =>
Int -> DataFrame t asbs -> DataFrame t bs
indexOffset Int
0 Vector t n
x) Vector t n
x

-- | Norm in Lp space
normLP :: (Floating (DataFrame t ('[] :: [k])), SubSpace t '[n] '[] '[n])
       => Int -> Vector t (n :: k) -> DataFrame t ('[] :: [k])
normLP :: Int -> Vector t n -> DataFrame t '[]
normLP Int
i' = (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Floating a => a -> a -> a
**DataFrame t '[]
ri) (DataFrame t '[] -> DataFrame t '[])
-> (Vector t n -> DataFrame t '[]) -> Vector t n -> DataFrame t '[]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[])
-> DataFrame t '[] -> Vector t n -> DataFrame t '[]
forall k t (as :: [k]) (bs :: [k]) (asbs :: [k]) b.
SubSpace t as bs asbs =>
(DataFrame t bs -> b -> b) -> b -> DataFrame t asbs -> b
ewfoldr (\DataFrame t '[]
a -> (DataFrame t '[]
aDataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Floating a => a -> a -> a
**DataFrame t '[]
i DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
+)) DataFrame t '[]
0
  where
    i :: DataFrame t '[]
i  = Int -> DataFrame t '[]
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i'
    ri :: DataFrame t '[]
ri = DataFrame t '[] -> DataFrame t '[]
forall a. Fractional a => a -> a
recip DataFrame t '[]
i
{-# INLINE [2] normLP #-}
{-# RULES
"normLP/L1" normLP 1 = normL1
"normLP/L2" normLP 2 = normL2
  #-}

-- | Take a determinant of a matrix composed from two 2D vectors.
--   Like a cross product in 2D.
det2 :: ( Num t, PrimBytes t )
     => Vector t 2 -> Vector t 2 -> Scalar t
det2 :: Vector t 2 -> Vector t 2 -> Scalar t
det2 (DF2 Scalar t
a0 Scalar t
a1) (DF2 Scalar t
b0 Scalar t
b1) = Scalar t
a0Scalar t -> Scalar t -> Scalar t
forall a. Num a => a -> a -> a
*Scalar t
b1 Scalar t -> Scalar t -> Scalar t
forall a. Num a => a -> a -> a
- Scalar t
b0Scalar t -> Scalar t -> Scalar t
forall a. Num a => a -> a -> a
*Scalar t
a1

-- | Cross product
cross :: ( Num t, PrimBytes t )
      => Vector t 3 -> Vector t 3 -> Vector t 3
cross :: Vector t 3 -> Vector t 3 -> Vector t 3
cross (DF3 DataFrame t '[]
a0 DataFrame t '[]
a1 DataFrame t '[]
a2) (DF3 DataFrame t '[]
b0 DataFrame t '[]
b1 DataFrame t '[]
b2)
  = DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[] -> Vector t 3
forall t (ds :: [Nat]).
(PrimBytes t, Dimensions (3 : ds), Dimensions ds,
 KnownBackend t ds) =>
DataFrame t ds
-> DataFrame t ds -> DataFrame t ds -> DataFrame t (3 : ds)
DF3 (DataFrame t '[]
a1DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b2 DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
- DataFrame t '[]
a2DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b1) (DataFrame t '[]
a2DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b0 DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
- DataFrame t '[]
a0DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b2) (DataFrame t '[]
a0DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b1 DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
- DataFrame t '[]
a1DataFrame t '[] -> DataFrame t '[] -> DataFrame t '[]
forall a. Num a => a -> a -> a
*DataFrame t '[]
b0)


-- | Cross product for two vectors in 3D
infixl 7 ×
(×) :: ( Num t, SubSpace t '[3] '[] '[3] )
    => Vector t 3 -> Vector t 3 -> Vector t 3
× :: Vector t 3 -> Vector t 3 -> Vector t 3
(×) = Vector t 3 -> Vector t 3 -> Vector t 3
forall t.
(Num t, PrimBytes t) =>
Vector t 3 -> Vector t 3 -> Vector t 3
cross
{-# INLINE (×) #-}