{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# LANGUAGE CPP #-}
#ifndef O_LIQUID
{-# LANGUAGE Safe #-}
#endif
#if __GLASGOW_HASKELL__ == 810
{-# OPTIONS_GHC -funfolding-keeness-factor=1 -funfolding-use-threshold=80 #-}
#endif
module Algebra.Geometric.Cl3.JonesCalculus
(
hpv, vpv,
dpv, apv,
rpv, lpv,
jv,
hpm, vpm,
dpm, apm,
rpm, lpm,
jm,
hpmRot,
qwp, hwp,
qwpRot, hwpRot,
wp,
wpRot,
refl,
#ifndef O_NO_RANDOM
randJonesVec,
randOrthogonalJonesVec,
#endif
factorize
) where
import safe Algebra.Geometric.Cl3 (Cl3(..), dag, bar, toR, toV3, toC, project)
#ifndef O_NO_RANDOM
import safe Algebra.Geometric.Cl3 (randUnitV3)
import System.Random (RandomGen)
#endif
e0 :: Cl3
e0 = Double -> Cl3
R Double
1
e1 :: Cl3
e1 = Double -> Double -> Double -> Cl3
V3 Double
1 Double
0 Double
0
e2 :: Cl3
e2 = Double -> Double -> Double -> Cl3
V3 Double
0 Double
1 Double
0
e3 :: Cl3
e3 = Double -> Double -> Double -> Cl3
V3 Double
0 Double
0 Double
1
i :: Cl3
i = Double -> Cl3
I Double
1
p1 :: Cl3
p1 = Cl3
0.5 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
e0 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
+ Cl3
e1)
p2 :: Cl3
p2 = Cl3
0.5 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
e0 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
+ Cl3
e2)
p3 :: Cl3
p3 = Cl3
0.5 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
e0 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
+ Cl3
e3)
hpv :: Cl3
hpv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3
e0 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
vpv :: Cl3
vpv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
exp ((-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
forall a. Floating a => a
pi Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
e2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
dpv :: Cl3
dpv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
exp ((-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
forall a. Floating a => a
piCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
e2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
apv :: Cl3
apv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
exp ((-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
forall a. Floating a => a
piCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (-Cl3
e2)) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
rpv :: Cl3
rpv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
exp ((-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
forall a. Floating a => a
piCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (-Cl3
e1)) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
lpv :: Cl3
lpv = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
exp ((-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (Cl3
forall a. Floating a => a
piCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
e1) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
jv :: Cl3 -> Cl3
jv (Cl3 -> Cl3
forall a. Num a => a -> a
signum(Cl3 -> Cl3) -> (Cl3 -> Cl3) -> Cl3 -> Cl3
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 -> Cl3
toV3 -> Cl3
v) | Cl3
v Cl3 -> Cl3 -> Bool
forall a. Eq a => a -> a -> Bool
== Cl3
e3 = Cl3
hpv
| Cl3
v Cl3 -> Cl3 -> Bool
forall a. Eq a => a -> a -> Bool
== -Cl3
e3 = Cl3
vpv
| Bool
otherwise = Cl3 -> Cl3
forall a. Num a => a -> a
signum (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ Cl3 -> Cl3
forall a. Floating a => a -> a
sqrt (Cl3
e3 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
v) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
p3
hpm :: Cl3
hpm = Cl3
p3
vpm :: Cl3
vpm = Cl3 -> Cl3
bar Cl3
p3
dpm :: Cl3
dpm = Cl3
p1
apm :: Cl3
apm = Cl3 -> Cl3
bar Cl3
p1
rpm :: Cl3
rpm = Cl3
p2
lpm :: Cl3
lpm = Cl3 -> Cl3
bar Cl3
p2
jm :: Cl3 -> Cl3
jm (Cl3 -> Cl3
forall a. Num a => a -> a
signum(Cl3 -> Cl3) -> (Cl3 -> Cl3) -> Cl3 -> Cl3
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 -> Cl3
toV3 -> Cl3
v) = Cl3 -> Cl3
project Cl3
v
rot :: Cl3 -> Cl3 -> Cl3
rot (Cl3 -> Cl3
toR -> Cl3
theta) (Cl3 -> Cl3
forall a. Num a => a -> a
signum(Cl3 -> Cl3) -> (Cl3 -> Cl3) -> Cl3 -> Cl3
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 -> Cl3
toV3 -> Cl3
axis) = Cl3 -> Cl3
forall a. Floating a => a -> a
exp (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ (-Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
theta Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
axis
rotIsh :: Cl3 -> Cl3
rotIsh (Cl3 -> Cl3
toR -> Cl3
theta) = Cl3 -> Cl3 -> Cl3
rot (Cl3
2Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
*Cl3
theta) Cl3
e2
hpmRot :: Cl3 -> Cl3
hpmRot (Cl3 -> Cl3
toR -> Cl3
theta) =
let roted :: Cl3
roted = Cl3 -> Cl3
rotIsh Cl3
theta
in Cl3
roted Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
hpm Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
dag Cl3
roted
qwp :: Cl3
qwp = Cl3
p3 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
- Cl3
i Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
bar Cl3
p3
qwpRot :: Cl3 -> Cl3
qwpRot (Cl3 -> Cl3
toR -> Cl3
theta) =
let roted :: Cl3
roted = Cl3 -> Cl3
rotIsh Cl3
theta
in Cl3
roted Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
qwp Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
dag Cl3
roted
hwp :: Cl3
hwp = Cl3
e3
hwpRot :: Cl3 -> Cl3
hwpRot (Cl3 -> Cl3
toR -> Cl3
theta) =
let roted :: Cl3
roted = Cl3 -> Cl3
rotIsh Cl3
theta
in Cl3
roted Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
hwp Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
dag Cl3
roted
wp :: Cl3 -> Cl3
wp (Cl3 -> Cl3
toR -> Cl3
phi) = Cl3 -> Cl3
forall a. Floating a => a -> a
exp (Cl3 -> Cl3) -> Cl3 -> Cl3
forall a b. (a -> b) -> a -> b
$ (Cl3
iCl3 -> Cl3 -> Cl3
forall a. Fractional a => a -> a -> a
/Cl3
2) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
phi Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
e3
wpRot :: Cl3 -> Cl3 -> Cl3
wpRot (Cl3 -> Cl3
toR -> Cl3
phi) (Cl3 -> Cl3
toR -> Cl3
theta) =
let roted :: Cl3
roted = Cl3 -> Cl3
rotIsh Cl3
theta
in Cl3
roted Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
wp Cl3
phi Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
dag Cl3
roted
refl :: Cl3
refl = Cl3
e3
factorize :: Cl3 -> (Cl3,Cl3,Cl3)
factorize :: Cl3 -> (Cl3, Cl3, Cl3)
factorize Cl3
jonesVec =
let c :: Cl3
c = Cl3 -> Cl3
toC Cl3
jonesVec
jonesVec' :: Cl3
jonesVec' = Cl3 -> Cl3
forall a. Fractional a => a -> a
recip Cl3
c Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
jonesVec
ampC :: Cl3
ampC = Cl3 -> Cl3
forall a. Num a => a -> a
abs Cl3
c
ampJonesVec' :: Cl3
ampJonesVec' = Cl3 -> Cl3
forall a. Num a => a -> a
abs Cl3
jonesVec'
normJonesVec :: Cl3
normJonesVec = Cl3 -> Cl3
forall a. Fractional a => a -> a
recip Cl3
ampJonesVec' Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
jonesVec'
amp :: Cl3
amp = Cl3
ampC Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
ampJonesVec'
normC :: Cl3
normC = Cl3 -> Cl3
forall a. Fractional a => a -> a
recip Cl3
ampC Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3
c
phi :: Cl3
phi = Cl3
2 Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* (-Cl3
i) Cl3 -> Cl3 -> Cl3
forall a. Num a => a -> a -> a
* Cl3 -> Cl3
forall a. Floating a => a -> a
log Cl3
normC
in (Cl3
amp, Cl3
phi, Cl3
normJonesVec)
#ifndef O_NO_RANDOM
randJonesVec :: RandomGen g => g -> (Cl3, g)
randJonesVec :: g -> (Cl3, g)
randJonesVec g
g =
let (Cl3
v3, g
g') = g -> (Cl3, g)
forall g. RandomGen g => g -> (Cl3, g)
randUnitV3 g
g
in (Cl3 -> Cl3
jv Cl3
v3,g
g')
randOrthogonalJonesVec :: RandomGen g => g -> ((Cl3, Cl3), g)
randOrthogonalJonesVec :: g -> ((Cl3, Cl3), g)
randOrthogonalJonesVec g
g =
let (Cl3
v3, g
g') = g -> (Cl3, g)
forall g. RandomGen g => g -> (Cl3, g)
randUnitV3 g
g
in ((Cl3 -> Cl3
jv Cl3
v3, Cl3 -> Cl3
jv (Cl3 -> Cl3
bar Cl3
v3)),g
g')
#endif