0 | module Data.NumIdr.Vector
3 | import Data.Permutation
4 | import Data.NumIdr.Interfaces
5 | import public Data.NumIdr.Array
12 | Vector : Nat -> Type -> Type
13 | Vector n = Array [n]
19 | dim : Vector n a -> Nat
23 | dimEq : (v : Vector n a) -> n = dim v
24 | dimEq v = cong head $
shapeEq v
34 | vector : {default B rep : Rep} -> RepConstraint rep a => Vect n a -> Vector n a
35 | vector v = rewrite sym (lengthCorrect v)
36 | in array {rep,s=[length v]} $
37 | rewrite lengthCorrect v in v
41 | toVect : Vector n a -> Vect n a
42 | toVect v = replace {p = flip Vect a} (believe_me $
Refl {x=()}) $
43 | Vect.fromList $
Prelude.toList v
47 | basis : {default B rep : Rep} -> RepConstraint rep a =>
48 | Num a => {n : _} -> (i : Fin n) -> Vector n a
49 | basis i = fromFunction {rep} _ (\[j] => if i == j then 1 else 0)
53 | basisX : {default B rep : Rep} -> RepConstraint rep a =>
54 | {n : _} -> Num a => Vector (1 + n) a
55 | basisX = basis {rep} FZ
59 | basisY : {default B rep : Rep} -> RepConstraint rep a =>
60 | {n : _} -> Num a => Vector (2 + n) a
61 | basisY = basis {rep} (FS FZ)
65 | basisZ : {default B rep : Rep} -> RepConstraint rep a =>
66 | {n : _} -> Num a => Vector (3 + n) a
67 | basisZ = basis {rep} (FS (FS FZ))
71 | unit2D : {default B rep : Rep} -> RepConstraint rep Double =>
72 | (ang : Double) -> Vector 2 Double
73 | unit2D ang = vector {rep} [cos ang, sin ang]
81 | unit3D : {default B rep : Rep} -> RepConstraint rep Double =>
82 | (pol, az : Double) -> Vector 3 Double
83 | unit3D pol az = vector {rep} [cos az * sin pol, sin az * sin pol, cos pol]
96 | index : Fin n -> Vector n a -> a
97 | index n = Array.index [n]
103 | (!!) : Vector n a -> Fin n -> a
109 | indexNB : Nat -> Vector n a -> Maybe a
110 | indexNB n = Array.indexNB [n]
117 | (!?) : Vector n a -> Nat -> Maybe a
118 | (!?) = flip indexNB
125 | (.x) : Vector (1 + n) a -> a
130 | (.y) : Vector (2 + n) a -> a
131 | (.y) = index (FS FZ)
135 | (.z) : Vector (3 + n) a -> a
136 | (.z) = index (FS (FS FZ))
146 | swizzle : Vect n (Fin m) -> Vector m a -> Vector n a
147 | swizzle p v = rewrite sym (lengthCorrect p)
148 | in fromFunction {rep=_} @{getRepC v} [length p] (\[i] =>
149 | index (index (rewrite sym (lengthCorrect p) in i) p) v)
154 | swapCoords : (i,j : Fin n) -> Vector n a -> Vector n a
155 | swapCoords = swapInAxis 0
159 | permuteCoords : Permutation n -> Vector n a -> Vector n a
160 | permuteCoords = permuteInAxis 0
170 | (++) : Vector m a -> Vector n a -> Vector (m + n) a
175 | dot : Num a => Vector n a -> Vector n a -> a
176 | dot = sum .: zipWith (*)
181 | perp : Neg a => Vector 2 a -> Vector 2 a -> a
182 | perp a b = a.x * b.y - a.y * b.x
187 | cross : Neg a => Vector 3 a -> Vector 3 a -> Vector 3 a
188 | cross v1 v2 = let [a, b, c] = toVect v1
189 | [x, y, z] = toVect v2
190 | in vector [b*z - c*y, c*x - a*z, a*y - b*x]
194 | triple : Neg a => Vector 3 a -> Vector 3 a -> Vector 3 a -> a
195 | triple a b c = a `dot` (b `cross` c)