annotate yetilab/vector/vector.yeti @ 254:5eb57c649de0 sparse

Using hashes is simpler, but turns out to be mostly no faster and sometimes much slower. Not one to merge back.
author Chris Cannam
date Tue, 21 May 2013 17:40:33 +0100
parents 9fe3192cce38
children de770971a628
rev   line source
Chris@47 1
Chris@222 2 module yetilab.vector.vector;
Chris@5 3
Chris@222 4 load yetilab.vector.vectortype;
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@251 43 //!!! this is reversed from std.at, fix
Chris@214 44 at' n v is number -> ~double[] -> 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@211 73 rangeOf start len v is number -> number -> ~double[] -> ~double[] =
Chris@211 74 Arrays#copyOfRange(v, start, start + len);
Chris@211 75
Chris@236 76 slice v start end is ~double[] -> number -> number -> ~double[] =
Chris@236 77 rangeOf start (end - start) v;
Chris@236 78
Chris@211 79 resizedTo n v is number -> ~double[] -> ~double[] =
Chris@211 80 Arrays#copyOf(v, n);
Chris@211 81
Chris@211 82 concat vv is list?<~double[]> -> ~double[] =
Chris@211 83 (len = sum (map length' vv);
Chris@211 84 vout = zeros len;
Chris@211 85 var base = 0;
Chris@211 86 for vv do v:
Chris@211 87 vlen = length' v;
Chris@211 88 for [0..vlen-1] do i: vout[base + i] := v[i] done;
Chris@211 89 base := base + vlen;
Chris@211 90 done;
Chris@211 91 vout);
Chris@208 92
Chris@5 93 {
Chris@211 94 zeros,
Chris@211 95 consts,
Chris@211 96 ones,
Chris@211 97 vector v = v,
Chris@211 98 primitive = copyOf,
Chris@211 99 floats,
Chris@211 100 fromFloats,
Chris@211 101 fromList,
Chris@211 102 list = list',
Chris@211 103 array = array',
Chris@211 104 length = length',
Chris@211 105 empty? = empty?',
Chris@214 106 at = at',
Chris@211 107 equal,
Chris@226 108 equalUnder,
Chris@211 109 rangeOf,
Chris@236 110 slice,
Chris@211 111 resizedTo,
Chris@211 112 concat,
Chris@47 113 } as {
Chris@211 114 zeros is number -> vector,
Chris@211 115 consts is number -> number -> vector,
Chris@211 116 ones is number -> vector,
Chris@211 117 vector is ~double[] -> vector,
Chris@211 118 primitive is vector -> ~double[],
Chris@211 119 floats is vector -> ~float[],
Chris@211 120 fromFloats is ~float[] -> vector,
Chris@211 121 fromList is list?<number> -> vector,
Chris@211 122 list is vector -> list<number>,
Chris@211 123 array is vector -> array<number>,
Chris@211 124 length is vector -> number,
Chris@211 125 empty? is vector -> boolean,
Chris@214 126 at is number -> vector -> number,
Chris@211 127 equal is vector -> vector -> boolean,
Chris@226 128 equalUnder is (number -> number -> boolean) -> vector -> vector -> boolean,
Chris@211 129 rangeOf is number -> number -> vector -> vector, //!!! not well-named now vector arg is at the end
Chris@236 130 slice is vector -> number -> number -> vector, //!!! duplication with rangeOf (std module function on arrays is called slice though)
Chris@211 131 resizedTo is number -> vector -> vector,
Chris@211 132 concat is list?<vector> -> vector,
Chris@5 133 }
Chris@5 134
Chris@27 135
Chris@47 136