6 importJava "java.lang.System" where
8 copyFromVector :: Vector a -> Integer -> MVector a -> Integer -> Integer -> <Proc> ()
11 copyFromMVector :: MVector a -> Integer -> MVector a -> Integer -> Integer -> <Proc> ()
14 mvector :: VecComp a => [a] -> <Proc> MVector a
17 result = createMVector len
18 iterIList (setMVector result) l
22 vector :: VecComp a => [a] -> Vector a
23 vector l = runProc (freezeMVector (mvector l))
26 vectorF :: VecComp a => Integer -> (Integer -> <e> a) -> <e> Vector a
27 vectorF l f = runProc do
28 result = createMVector l
29 forN l $ \i -> setMVector result i (f i)
33 singletonVector :: VecComp a => a -> Vector a
34 singletonVector v = runProc do
35 result = createMVector 1
41 subVector :: Vector a -> Integer -> Integer -> Vector a
42 subVector src begin end = runProc do
44 result = createMVectorProto src len
45 copyFromVector src begin result 0 len
49 concatVector :: Vector a -> Vector a -> Vector a
50 concatVector a b = runProc do
53 result = createMVectorProto a (lenA + lenB)
54 copyFromVector a 0 result 0 lenA
55 copyFromVector b 0 result lenA lenB
59 mapVector :: VecComp a => VecComp b => (a -> b) -> Vector a -> Vector b
60 mapVector f a = vectorF (length a) (\i -> f (a!i))
63 zipVectorsWith :: VecComp a => VecComp b => VecComp c => (a -> b -> c) -> Vector a -> Vector b -> Vector c
64 zipVectorsWith f a b = vectorF (length a) (\i -> f (a!i) (b!i))
66 instance (VecComp a, Additive a) => Additive (Vector a) where
68 zero = runProc (freezeMVector (createMVector 0))
75 result = createMVectorProto a lenB
76 forN lenA $ \i -> setMVector result i (a!i + b!i)
77 copyFromVector b lenA result lenA (lenB-lenA)
81 result = createMVectorProto a lenA
82 forN lenB $ \i -> setMVector result i (a!i + b!i)
83 copyFromVector a lenB result lenB (lenA-lenB)
86 result = createMVectorProto a lenA
87 forN lenA $ \i -> setMVector result i (a!i + b!i)
90 instance (VecComp a, Ring a) => Ring (Vector a) where
97 result = createMVectorProto a lenB
98 forN lenA $ \i -> setMVector result i (a!i - b!i)
99 forN (lenB-lenA) $ \i -> setMVector result (lenA+i) (- b!(lenA+i))
103 result = createMVectorProto a lenA
104 forN lenB $ \i -> setMVector result i (a!i - b!i)
105 copyFromVector a lenB result lenB (lenA-lenB)
108 result = createMVectorProto a lenA
109 forN lenA $ \i -> setMVector result i (a!i - b!i)
112 neg = mapVector (\x -> -x)
113 one = fail "Unsupported operation one for Vector"
114 (*) = fail "Unsupported operation (*) for Vector"
115 fromInteger = fail "Unsupported operation fromInteger for Vector"
118 dotp :: Ring a => VecComp a => Vector a -> Vector a -> a
119 dotp a b = foldlN (\sum i -> sum + a!i * b!i) 0 (min (length a) (length b))
122 normSq a = foldlN (\sum i -> do v = a!i ; sum + v*v) 0 (length a)
125 norm a = sqrt (normSq a)
127 maxNorm a = foldlN (\cur i -> max cur (abs (a!i))) 0 (length a)
129 l1Norm a = foldlN (\cur i -> cur + abs (a!i)) 0 (length a)
132 (**) :: Ring a => VecComp a => a -> Vector a -> Vector a
133 s ** a = mapVector (\x -> s*x) a
135 instance (Show a, VecComp a) => Show (Vector a) where
136 s <+ v = s << "vector " <+ [v!i | i <- [0..lengthVector v-1]]
138 instance (VecComp a) => Sequence (Vector a) where
140 length = lengthVector
144 instance IndexedSequence Vector where
148 iterVector :: (a -> <e> b) -> Vector a -> <e> ()
149 iterVector f v = forN (lengthVector v) (\i -> f (getVector v i))
152 foldlVector :: (a -> b -> <e> a) -> a -> Vector b -> <e> a
153 foldlVector f initial v = foldlN (\cur i -> f cur (getVector v i)) initial (lengthVector v)
156 anyVector :: (a -> <e> Boolean) -> Vector a -> <e> Boolean
157 anyVector f v = anyN (\i -> f (getVector v i)) (lengthVector v)
160 allVector :: (a -> <e> Boolean) -> Vector a -> <e> Boolean
161 allVector f v = allN (\i -> f (getVector v i)) (lengthVector v)
164 mapFirstVector :: (a -> <e> Maybe b) -> Vector a -> <e> Maybe b
165 mapFirstVector f v = mapFirstN (\i -> f (getVector v i)) (lengthVector v)
168 containsVector :: a -> Vector a -> Boolean
169 containsVector x v = foldlN (\result i -> result || (v!i == x)) False (lengthVector v)
172 vectorToList :: Vector a -> [a]
173 vectorToList v = foldlN (\l i -> addList l (v ! i)) [] (lengthVector v)