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
|