annotate yetilab/vector.yeti @ 294:9bc985b602b3

Remove dependency from framer on filter (avoiding circular dependency)
author Chris Cannam
date Fri, 31 May 2013 17:34:37 +0100
parents 21ec05237c1a
children 249c84b5493b
rev   line source
Chris@47 1
Chris@273 2 module yetilab.vector;
Chris@5 3
Chris@273 4 load yetilab.vector.type;
Chris@9 5
Chris@211 6 import java.util: Arrays;
Chris@26 7
Chris@211 8 //!!! This is supposed to be 100% immutable and without copying when duplicating for read only
Chris@211 9
Chris@211 10 zeros n =
Chris@211 11 new double[n];
Chris@211 12
Chris@211 13 consts m n =
Chris@211 14 (a = zeros n;
Chris@211 15 for [0..n-1] do i:
Chris@211 16 a[i] := m;
Chris@211 17 done;
Chris@211 18 a);
Chris@211 19
Chris@211 20 ones = consts 1.0;
Chris@211 21
Chris@211 22 fromList l is list?<number> -> ~double[] =
Chris@211 23 (arr = array(l);
Chris@211 24 len = length arr;
Chris@211 25 v = zeros len;
Chris@211 26 for [0..len-1] do i:
Chris@211 27 v[i] := arr[i];
Chris@211 28 done;
Chris@211 29 v);
Chris@211 30
Chris@211 31 list' a is ~double[] -> list<number> =
Chris@211 32 list a;
Chris@211 33
Chris@211 34 array' a is ~double[] -> array<number> =
Chris@211 35 array a;
Chris@211 36
Chris@211 37 length' =
Chris@211 38 length . list';
Chris@211 39
Chris@211 40 empty?' =
Chris@211 41 empty? . list';
Chris@211 42
Chris@260 43 //!!! doc note: argument order chosen for consistency with std module function
Chris@260 44 at' v n is ~double[] -> number -> number =
Chris@214 45 v[n];
Chris@214 46
Chris@211 47 floats a is ~double[] -> ~float[] =
Chris@211 48 (len = length' a;
Chris@211 49 f = new float[len];
Chris@211 50 for [0..len-1] do i:
Chris@211 51 f[i] := a[i];
Chris@211 52 done;
Chris@211 53 f);
Chris@211 54
Chris@211 55 fromFloats ff is ~float[] -> ~double[] =
Chris@211 56 (len = length (list ff);
Chris@211 57 a = new double[len];
Chris@211 58 for [0..len-1] do i:
Chris@211 59 a[i] := ff[i];
Chris@211 60 done;
Chris@211 61 a);
Chris@211 62
Chris@211 63 equal v1 v2 =
Chris@211 64 list' v1 == list' v2;
Chris@211 65
Chris@226 66 equalUnder comparator v1 v2 =
Chris@226 67 length' v1 == length' v2 and
Chris@226 68 all id (map2 comparator (list' v1) (list' v2));
Chris@226 69
Chris@211 70 copyOf v is ~double[] -> ~double[] =
Chris@211 71 Arrays#copyOf(v, list' v |> length);
Chris@211 72
Chris@260 73 //!!! doc note: argument order chosen for consistency with std module function
Chris@236 74 slice v start end is ~double[] -> number -> number -> ~double[] =
Chris@276 75 if start < 0 then slice v 0 end
Chris@276 76 elif start > length' v then slice v (length' v) end
Chris@276 77 else
Chris@276 78 if end < start then slice v start start
Chris@276 79 elif end > length' v then slice v start (length' v)
Chris@276 80 else
Chris@276 81 Arrays#copyOfRange(v, start, end);
Chris@276 82 fi
Chris@276 83 fi;
Chris@236 84
Chris@211 85 resizedTo n v is number -> ~double[] -> ~double[] =
Chris@211 86 Arrays#copyOf(v, n);
Chris@211 87
Chris@265 88 reversed v is ~double[] -> ~double[] =
Chris@265 89 (len = length (list v);
Chris@265 90 a = new double[len];
Chris@265 91 for [0..len-1] do i:
Chris@265 92 a[len-i-1] := v[i];
Chris@265 93 done;
Chris@265 94 a);
Chris@265 95
Chris@290 96 concat vv is list?<~double[]> -> ~double[] = //!!! doc: concat is obviously not lazy (unlike std module)
Chris@211 97 (len = sum (map length' vv);
Chris@211 98 vout = zeros len;
Chris@211 99 var base = 0;
Chris@211 100 for vv do v:
Chris@211 101 vlen = length' v;
Chris@211 102 for [0..vlen-1] do i: vout[base + i] := v[i] done;
Chris@211 103 base := base + vlen;
Chris@211 104 done;
Chris@211 105 vout);
Chris@208 106
Chris@269 107 repeated v n is ~double[] -> number -> ~double[] =
Chris@269 108 concat (map \(v) [1..n]);
Chris@269 109
Chris@5 110 {
Chris@211 111 zeros,
Chris@211 112 consts,
Chris@211 113 ones,
Chris@211 114 vector v = v,
Chris@211 115 primitive = copyOf,
Chris@211 116 floats,
Chris@211 117 fromFloats,
Chris@211 118 fromList,
Chris@211 119 list = list',
Chris@211 120 array = array',
Chris@211 121 length = length',
Chris@211 122 empty? = empty?',
Chris@214 123 at = at',
Chris@211 124 equal,
Chris@226 125 equalUnder,
Chris@236 126 slice,
Chris@211 127 resizedTo,
Chris@265 128 reversed,
Chris@269 129 repeated,
Chris@211 130 concat,
Chris@47 131 } as {
Chris@211 132 zeros is number -> vector,
Chris@211 133 consts is number -> number -> vector,
Chris@211 134 ones is number -> vector,
Chris@211 135 vector is ~double[] -> vector,
Chris@211 136 primitive is vector -> ~double[],
Chris@211 137 floats is vector -> ~float[],
Chris@211 138 fromFloats is ~float[] -> vector,
Chris@211 139 fromList is list?<number> -> vector,
Chris@211 140 list is vector -> list<number>,
Chris@211 141 array is vector -> array<number>,
Chris@211 142 length is vector -> number,
Chris@211 143 empty? is vector -> boolean,
Chris@260 144 at is vector -> number -> number,
Chris@211 145 equal is vector -> vector -> boolean,
Chris@226 146 equalUnder is (number -> number -> boolean) -> vector -> vector -> boolean,
Chris@260 147 slice is vector -> number -> number -> vector,
Chris@211 148 resizedTo is number -> vector -> vector,
Chris@265 149 reversed is vector -> vector,
Chris@269 150 repeated is vector -> number -> vector,
Chris@211 151 concat is list?<vector> -> vector,
Chris@5 152 }
Chris@5 153
Chris@27 154
Chris@47 155