0 | module Data.NumIdr.Homogeneous
3 | import Data.NumIdr.Interfaces
4 | import Data.NumIdr.Vector
5 | import Data.NumIdr.Matrix
21 | HMatrix : Nat -> Nat -> Type -> Type
22 | HMatrix m n = Matrix (S m) (S n)
26 | HMatrix' : Nat -> Type -> Type
27 | HMatrix' n = HMatrix n n
35 | HVector : Nat -> Type -> Type
36 | HVector n = Vector (S n)
46 | vectorToH : Num a => Vector n a -> HVector n a
47 | vectorToH v = rewrite plusCommutative 1 n in v ++ vector [1]
52 | vectorToHLinear : Num a => Vector n a -> HVector n a
53 | vectorToHLinear v = rewrite plusCommutative 1 n in v ++ vector [0]
57 | hvector : Num a => Vect n a -> HVector n a
58 | hvector v = rewrite plusCommutative 1 n in vector (v ++ [1])
63 | hvectorLinear : Num a => Vect n a -> HVector n a
64 | hvectorLinear v = rewrite plusCommutative 1 n in vector (v ++ [0])
69 | fromHomogeneous : HVector n a -> Vector n a
70 | fromHomogeneous {n} v with (viewShape v)
71 | _ | Shape [S n] = resizeLTE [n] v {ok = [lteSuccRight reflexive]}
76 | hmatrix : Num a => Matrix m n a -> Vector m a -> HMatrix m n a
77 | hmatrix {m,n} mat tr with (viewShape mat)
78 | _ | Shape [m,n] = indexSet [last,last] 1 $
79 | resize [S m, S n] 0 $
80 | mat `hconcat` hstack [tr]
84 | matrixToH : Num a => Matrix m n a -> HMatrix m n a
85 | matrixToH {m,n} mat with (viewShape mat)
86 | _ | Shape [m,n] = indexSet [last,last] 1 $
resize [S m, S n] 0 mat
91 | isHMatrix : Eq a => Num a => Matrix m n a -> Bool
92 | isHMatrix {m,n} mat with (viewShape mat)
93 | isHMatrix {m=Z,n} mat | Shape [Z,n] = False
94 | isHMatrix {m=S m,n=Z} mat | Shape [S m,Z] = False
95 | isHMatrix {m=S m,n=S n} mat | Shape [S m,S n] =
96 | getRow last mat == resize _ 1 (zeros [n])
101 | getMatrix : HMatrix m n a -> Matrix m n a
102 | getMatrix {m,n} mat with (viewShape mat)
103 | _ | Shape [S m, S n] = resizeLTE [m,n] mat
104 | {ok = [lteSuccRight reflexive,lteSuccRight reflexive]}
108 | getTranslationVector : HMatrix m n a -> Vector m a
109 | getTranslationVector {m,n} mat with (viewShape mat)
110 | _ | Shape [S m, S n] = resizeLTE [m] {ok = [lteSuccRight reflexive]} $
121 | scalingH : {default B rep : Rep} -> RepConstraint rep a =>
122 | {n : _} -> Num a => a -> HMatrix' n a
123 | scalingH x = indexSet [last,last] 1 $
repeatDiag {rep} x 0
127 | translationH : Num a => Vector n a -> HMatrix' n a
128 | translationH {n} v with (viewShape v)
129 | _ | Shape [n] = hmatrix identity v
134 | rotate2DH : {default B rep : Rep} -> RepConstraint rep Double =>
135 | Double -> HMatrix' 2 Double
136 | rotate2DH = matrixToH . rotate2D {rep}
140 | rotate3DXH : {default B rep : Rep} -> RepConstraint rep Double =>
141 | Double -> HMatrix' 3 Double
142 | rotate3DXH = matrixToH . rotate3DX {rep}
146 | rotate3DYH : {default B rep : Rep} -> RepConstraint rep Double =>
147 | Double -> HMatrix' 3 Double
148 | rotate3DYH = matrixToH . rotate3DY {rep}
152 | rotate3DZH : {default B rep : Rep} -> RepConstraint rep Double =>
153 | Double -> HMatrix' 3 Double
154 | rotate3DZH = matrixToH . rotate3DZ {rep}
158 | reflectH : {n : _} -> Neg a => Fin n -> HMatrix' n a
159 | reflectH i = indexSet [weaken i,weaken i] (-
1) identity
162 | reflectXH : {n : _} -> Neg a => HMatrix' (1 + n) a
163 | reflectXH = reflectH 0
166 | reflectYH : {n : _} -> Neg a => HMatrix' (2 + n) a
167 | reflectYH = reflectH 1
170 | reflectZH : {n : _} -> Neg a => HMatrix' (3 + n) a
171 | reflectZH = reflectH 2