1 | function ArrayMax(array){ //{{{
|
---|
2 | //Calculate array max using for loop instead of Math.max.apply(null, array) to avoid recursive stack overflow in mobile browsers
|
---|
3 |
|
---|
4 | var max=-Infinity;
|
---|
5 |
|
---|
6 | for (var i=0;i<array.length; i++) {
|
---|
7 | max=Math.max(max,array[i]);
|
---|
8 | }
|
---|
9 |
|
---|
10 | return max;
|
---|
11 | } //}}}
|
---|
12 | function ArrayMax2D(array){ //{{{
|
---|
13 |
|
---|
14 | var max=-Infinity;
|
---|
15 |
|
---|
16 | for (var i=0;i<array.length;i++){
|
---|
17 | var subarray=array[i];
|
---|
18 | max=Math.max(max,ArrayMax(subarray));
|
---|
19 | }
|
---|
20 |
|
---|
21 | return max;
|
---|
22 | } //}}}
|
---|
23 | function ArrayMin(array){ //{{{
|
---|
24 | //Calculate array min using for loop instead of Math.min.apply(null, array) to avoid recursive stack overflow in mobile browsers
|
---|
25 |
|
---|
26 | var min=Infinity;
|
---|
27 |
|
---|
28 | for (var i=0;i<array.length; i++) {
|
---|
29 | min=Math.min(min,array[i]);
|
---|
30 | }
|
---|
31 |
|
---|
32 | return min;
|
---|
33 | } //}}}
|
---|
34 | function ArrayMin2D(array){ //{{{
|
---|
35 |
|
---|
36 | var min=Infinity;
|
---|
37 |
|
---|
38 | for (var i=0;i<array.length;i++){
|
---|
39 | var subarray=array[i];
|
---|
40 | min=Math.min(min,ArrayMin(subarray));
|
---|
41 | }
|
---|
42 |
|
---|
43 | return min;
|
---|
44 | } //}}}
|
---|
45 | function ArraySum(array){ //{{{
|
---|
46 | var sum=0;
|
---|
47 | for(var i=0;i<array.length;i++)sum+=array[i];
|
---|
48 | return sum;
|
---|
49 | } //}}}
|
---|
50 | function ArrayXPY(){ //{{{
|
---|
51 | if (arguments.length<2)throw Error("ArrayXPY error message: sum has to be for at least two arrays!");
|
---|
52 |
|
---|
53 | //check internal consistency of arrays provided!:
|
---|
54 | var firstarray=arguments[0];
|
---|
55 | var firstsize=firstarray.length;
|
---|
56 |
|
---|
57 | for(var a=1;a<arguments.length;a++){
|
---|
58 | var array=arguments[a];
|
---|
59 | if(array.length!=firstsize)throw Error("ArrayXPY error message: arrays provided as arguments are not of the same length!");
|
---|
60 | }
|
---|
61 |
|
---|
62 | //do the sum:
|
---|
63 | var sum=NewArrayFill(firstsize,0);
|
---|
64 | for(var a=0;a<arguments.length;a++){
|
---|
65 | var array=arguments[a];
|
---|
66 | for(var i=0;i<array.length;i++){
|
---|
67 | sum[i]+=array[i];
|
---|
68 | }
|
---|
69 | }
|
---|
70 | return sum;
|
---|
71 |
|
---|
72 | } //}}}
|
---|
73 | function ArrayOr(){ //{{{
|
---|
74 | if (arguments.length<2)throw Error("ArrayOr error message: sum has to be for at least two arrays!");
|
---|
75 |
|
---|
76 | //check internal consistency of arrays provided!:
|
---|
77 | var firstarray=arguments[0];
|
---|
78 | var firstsize=firstarray.length;
|
---|
79 |
|
---|
80 | for(var a=1;a<arguments.length;a++){
|
---|
81 | var array=arguments[a];
|
---|
82 | if(array.length!=firstsize)throw Error("ArrayOr error message: arrays provided as arguments are not of the same length!");
|
---|
83 | }
|
---|
84 |
|
---|
85 | //do the or:
|
---|
86 | var or=NewArrayFill(firstsize,0);
|
---|
87 | for(var a=0;a<arguments.length;a++){
|
---|
88 | var array=arguments[a];
|
---|
89 | for(var i=0;i<array.length;i++){
|
---|
90 | or[i] = or[i] | array[i];
|
---|
91 | }
|
---|
92 | }
|
---|
93 | return or;
|
---|
94 |
|
---|
95 | } //}}}
|
---|
96 | function ArrayTranspose(array) { //{{{
|
---|
97 | return Object.keys(array[0]).map(function(column) {
|
---|
98 | return array.map(function(row) {
|
---|
99 | return row[column];
|
---|
100 | });
|
---|
101 | });
|
---|
102 | } //}}}
|
---|
103 | function ArrayConcat(a, b) { //{{{
|
---|
104 | // Make sure that both typed arrays are of the same type
|
---|
105 | if(Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {
|
---|
106 | throw 'The types of the two arguments passed for parameters a and b do not match.';
|
---|
107 | }
|
---|
108 | var c;
|
---|
109 | if(a instanceof Float64Array) {
|
---|
110 | c = new a.constructor(a.length + b.length);
|
---|
111 | c.set(a);
|
---|
112 | c.set(b, a.length);
|
---|
113 | }
|
---|
114 | else {
|
---|
115 | c = clone(a).concat(clone(b));
|
---|
116 | }
|
---|
117 | return c;
|
---|
118 | } //}}}
|
---|
119 | function ListToMatrix(list, elementsPerSubArray) { //{{{
|
---|
120 | var matrix = [], i, k;
|
---|
121 |
|
---|
122 | for (i = 0, k = -1; i < list.length; i++) {
|
---|
123 | if (i % elementsPerSubArray === 0) {
|
---|
124 | k++;
|
---|
125 | matrix[k] = [];
|
---|
126 | }
|
---|
127 |
|
---|
128 | matrix[k].push(list[i]);
|
---|
129 | }
|
---|
130 |
|
---|
131 | return matrix;
|
---|
132 | } //}}}
|
---|
133 | function MatrixToList(matrixin) { //{{{
|
---|
134 |
|
---|
135 | var matrix=matrixin;
|
---|
136 |
|
---|
137 | if (!IsArray(matrix[0])) return matrix;
|
---|
138 | else{
|
---|
139 | var width = matrix[0].length;
|
---|
140 | var length = matrix.length;
|
---|
141 | var list= new Array(width*length);
|
---|
142 |
|
---|
143 | for(var i=0;i<length;i++){
|
---|
144 | for(var j=0;j<width;j++){
|
---|
145 | list[i*width+j]=matrix[i][j];
|
---|
146 | }
|
---|
147 | }
|
---|
148 | return list;
|
---|
149 | }
|
---|
150 | } //}}}
|
---|
151 | function IsArray(object) { //{{{
|
---|
152 |
|
---|
153 | var type=Object.prototype.toString.call( object );
|
---|
154 | if( type === '[object Array]' ) return 1;
|
---|
155 | if( type === '[object Float64Array]' ) return 1;
|
---|
156 | if( type === '[object Float32Array]' ) return 1;
|
---|
157 | if( type === '[object Int32Array]' ) return 1;
|
---|
158 | if( type === '[object Int16Array]' ) return 1;
|
---|
159 | if( type === '[object Uint32Array]' ) return 1;
|
---|
160 | if( type === '[object Uint16Array]' ) return 1;
|
---|
161 | if( type === '[object Uint8Array]' ) return 1;
|
---|
162 | return 0;
|
---|
163 |
|
---|
164 | } //}}}
|
---|
165 | function ArrayNot(array) { //{{{
|
---|
166 |
|
---|
167 | var notarray=array.slice();
|
---|
168 | for (var i=0;i<array.length;i++)notarray[i]=-array[i];
|
---|
169 | return notarray;
|
---|
170 | } //}}}
|
---|
171 | function ArrayCopy(array) { //{{{
|
---|
172 |
|
---|
173 | var copy=[];
|
---|
174 | for(var i=0;i<array.length;i++)copy[i]=array[i];
|
---|
175 | return copy;
|
---|
176 | } //}}}
|
---|
177 | function ArrayPow(array,coefficient) { //{{{
|
---|
178 |
|
---|
179 | var powarray=array.slice();
|
---|
180 | for (var i=0;i<array.length;i++)powarray[i]=Math.pow(array[i],coefficient);
|
---|
181 | return powarray;
|
---|
182 | } //}}}
|
---|
183 | function ArraySqrt(array) { //{{{
|
---|
184 |
|
---|
185 | var sqrtarray=array.slice();
|
---|
186 | for (var i=0;i<array.length;i++)sqrtarray[i]=Math.sqrt(array[i]);
|
---|
187 | return sqrtarray;
|
---|
188 | } //}}}
|
---|
189 | function ArrayScale(array,alpha) { //{{{
|
---|
190 |
|
---|
191 | var scalearray=array.slice();
|
---|
192 | for (var i=0;i<array.length;i++)scalearray[i]=array[i]*alpha;
|
---|
193 | return scalearray;
|
---|
194 | } //}}}
|
---|
195 | function ArrayMag(array1,array2) { //{{{
|
---|
196 |
|
---|
197 | var arraymag=NewArrayFill(array1.length,0);
|
---|
198 | for (var i=0;i<array1.length;i++)arraymag[i]=Math.sqrt(Math.pow(array1[i],2)+Math.pow(array2[i],2));
|
---|
199 | return arraymag;
|
---|
200 | } //}}}
|
---|
201 | function ArrayAnyNaN(array) { //{{{
|
---|
202 |
|
---|
203 | if(IsArray(array[0])){
|
---|
204 | for(var i=0;i<array.length;i++){
|
---|
205 | for(var j=0;j<array[0].length;j++){
|
---|
206 | if (Number.isNaN(array[i][j])) return 1;
|
---|
207 | }
|
---|
208 | }
|
---|
209 | }
|
---|
210 | else{
|
---|
211 | for(var i=0;i<array.length;i++){
|
---|
212 | if (Number.isNaN(array[i])) return 1;
|
---|
213 | }
|
---|
214 | }
|
---|
215 | return 0;
|
---|
216 | } //}}}
|
---|
217 | function ArrayUnique(arr) { //{{{
|
---|
218 |
|
---|
219 | return arr.reverse().filter(function (e, i, arr) {
|
---|
220 | return arr.indexOf(e, i+1) === -1;
|
---|
221 | }).reverse();
|
---|
222 | } //}}}
|
---|
223 | function ArraySort(array) { //{{{
|
---|
224 |
|
---|
225 | return array.sort(function(a, b) {
|
---|
226 | return a - b;
|
---|
227 | });
|
---|
228 |
|
---|
229 | } //}}}
|
---|
230 | function ArrayAnyEqual(array,value) { //{{{
|
---|
231 |
|
---|
232 | if(!Number.isNaN(value)){
|
---|
233 | for(var i=0;i<array.length;i++){
|
---|
234 | if (array[i]==value)return 1;
|
---|
235 | }
|
---|
236 | }
|
---|
237 | else{
|
---|
238 | for(var i=0;i<array.length;i++){
|
---|
239 | if (Number.isNaN(array[i]))return 1;
|
---|
240 | }
|
---|
241 | }
|
---|
242 | return 0;
|
---|
243 | } //}}}
|
---|
244 | function ArrayAnyBelowOrEqual(array,value) { //{{{
|
---|
245 |
|
---|
246 | for(var i=0;i<array.length;i++){
|
---|
247 | if (array[i]<=value)return 1;
|
---|
248 | }
|
---|
249 | return 0;
|
---|
250 | } //}}}
|
---|
251 | function ArrayAnyBelowStrict(array,value) { //{{{
|
---|
252 |
|
---|
253 | for(var i=0;i<array.length;i++){
|
---|
254 | if (array[i]<value)return 1;
|
---|
255 | }
|
---|
256 | return 0;
|
---|
257 | } //}}}
|
---|
258 | function ArrayAnyAboveOrEqual(array,value) { //{{{
|
---|
259 |
|
---|
260 | for(var i=0;i<array.length;i++){
|
---|
261 | if (array[i]>=value)return 1;
|
---|
262 | }
|
---|
263 | return 0;
|
---|
264 | } //}}}
|
---|
265 | function ArrayAnyAboveStrict(array,value) { //{{{
|
---|
266 |
|
---|
267 | for(var i=0;i<array.length;i++){
|
---|
268 | if (array[i]>value)return 1;
|
---|
269 | }
|
---|
270 | return 0;
|
---|
271 | } //}}}
|
---|
272 | function ArrayAnd(array1,array2) { //{{{
|
---|
273 |
|
---|
274 | var array=array1;
|
---|
275 | for (var i=0;i<array1.length;i++)array[i]=array1[i] & array2[i];
|
---|
276 | return array;
|
---|
277 | } //}}}
|
---|
278 | function ArrayIsMember(array1,array2) { //{{{
|
---|
279 |
|
---|
280 | var array=NewArrayFill(array1.length,0);
|
---|
281 | for (var i=0;i<array1.length;i++){
|
---|
282 | for(var j=0;j<array2.length;j++){
|
---|
283 | if (array1[i] == array2[j]){
|
---|
284 | array[i]=1;
|
---|
285 | break;
|
---|
286 | }
|
---|
287 | }
|
---|
288 | }
|
---|
289 | return array;
|
---|
290 | } //}}}
|
---|
291 | function NewArrayFill(size,value) { //{{{
|
---|
292 | var array = new Array(size);
|
---|
293 |
|
---|
294 | for (var i = 0; i < size; i++) {
|
---|
295 | array[i] = value;
|
---|
296 | }
|
---|
297 |
|
---|
298 | return array;
|
---|
299 | } //}}}
|
---|
300 | function NewArrayFill2D(rows,cols,value) { //{{{
|
---|
301 | var arr=new Array(rows);
|
---|
302 |
|
---|
303 | for (var i=0;i<rows;i++) {
|
---|
304 | arr[i] = NewArrayFill(cols,value);
|
---|
305 | }
|
---|
306 |
|
---|
307 | return arr;
|
---|
308 | } //}}}
|
---|
309 | function NewArrayFillIncrement(size,start,increment) { //{{{
|
---|
310 | var array=new Array(size);
|
---|
311 |
|
---|
312 | for(var i=0;i<size;i++){
|
---|
313 | array[i]=start+i*increment;
|
---|
314 | }
|
---|
315 |
|
---|
316 | return array;
|
---|
317 | } //}}}
|
---|
318 | function ArrayFind(array,value) { //{{{
|
---|
319 | var count=0;
|
---|
320 | var indices=[];
|
---|
321 |
|
---|
322 | for (var i=0;i<array.length;i++){
|
---|
323 | if(array[i]===value){
|
---|
324 | indices.push(count);
|
---|
325 | }
|
---|
326 | count++;
|
---|
327 | }
|
---|
328 | return indices;
|
---|
329 | } //}}}
|
---|
330 | function ArrayFind2D(array,value) { //{{{
|
---|
331 | var count=0;
|
---|
332 | var indices=[];
|
---|
333 |
|
---|
334 | for (var i=0;i<array.length;i++){
|
---|
335 | for (var j=0;j<array[i].length;j++){
|
---|
336 | if(array[i][j]===value){
|
---|
337 | indices.push(count);
|
---|
338 | }
|
---|
339 | count++;
|
---|
340 | }
|
---|
341 | }
|
---|
342 | return indices;
|
---|
343 | } //}}}
|
---|
344 | function ArrayFindNot(array,value) { //{{{
|
---|
345 | var count=0;
|
---|
346 | var indices=[];
|
---|
347 |
|
---|
348 | for (var i=0;i<array.length;i++){
|
---|
349 | if(array[i]!==value){
|
---|
350 | indices.push(count);
|
---|
351 | }
|
---|
352 | count++;
|
---|
353 | }
|
---|
354 | return indices;
|
---|
355 | } //}}}
|
---|
356 | function ArrayFindNot2D(array,value) { //{{{
|
---|
357 | var count=0;
|
---|
358 | var indices=[];
|
---|
359 |
|
---|
360 | for (var i=0;i<array.length;i++){
|
---|
361 | for (var j=0;j<array[i].length;j++){
|
---|
362 | if(array[i][j]!==value){
|
---|
363 | indices.push(count);
|
---|
364 | }
|
---|
365 | count++;
|
---|
366 | }
|
---|
367 | }
|
---|
368 | return indices;
|
---|
369 | } //}}}
|
---|
370 | function Create2DArray(rows,cols) { //{{{
|
---|
371 | var arr=new Array(rows);
|
---|
372 |
|
---|
373 | for (var i=0;i<rows;i++) {
|
---|
374 | arr[i] = new Array(cols);
|
---|
375 | }
|
---|
376 |
|
---|
377 | return arr;
|
---|
378 | } //}}}
|
---|
379 | function MapIsEmpty(map) { //{{{
|
---|
380 | for (var key in map){
|
---|
381 | if(map.hasOwnProperty(key)){
|
---|
382 | return false;
|
---|
383 | }
|
---|
384 | }
|
---|
385 | return true;
|
---|
386 | } //}}}
|
---|
387 | function clone(obj) {//{{{
|
---|
388 |
|
---|
389 | var copy;
|
---|
390 |
|
---|
391 | // Handle the 3 simple types, and null or undefined
|
---|
392 | if (null == obj || "object" != typeof obj) return obj;
|
---|
393 |
|
---|
394 | // Handle Date
|
---|
395 | if (obj instanceof Date) {
|
---|
396 | copy = new Date();
|
---|
397 | copy.setTime(obj.getTime());
|
---|
398 | return copy;
|
---|
399 | }
|
---|
400 |
|
---|
401 | // Handle Array
|
---|
402 | if (obj instanceof Array) {
|
---|
403 | copy = [];
|
---|
404 | for (var i = 0, len = obj.length; i < len; i++) {
|
---|
405 | copy[i] = clone(obj[i]);
|
---|
406 | }
|
---|
407 | return copy;
|
---|
408 | }
|
---|
409 |
|
---|
410 | // Handle Object
|
---|
411 | if (obj instanceof Object) {
|
---|
412 | copy = {};
|
---|
413 | for (var attr in obj) {
|
---|
414 | if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
|
---|
415 | }
|
---|
416 | return copy;
|
---|
417 | }
|
---|
418 |
|
---|
419 | throw new Error("Unable to copy obj! Its type isn't supported.");
|
---|
420 | } //}}}
|
---|
421 | function FloatFix(pointer,size) {//{{{
|
---|
422 |
|
---|
423 | var buffer=new Float64Array(size);
|
---|
424 | for(var i=0;i<size;i++)buffer[i]=pointer[i];
|
---|
425 | return buffer;
|
---|
426 |
|
---|
427 |
|
---|
428 | } //}}}
|
---|
429 | function NullFix(pointer,value) {//{{{
|
---|
430 |
|
---|
431 | if(pointer==null)return value;
|
---|
432 | else{
|
---|
433 | //check that the pointer values are not null:
|
---|
434 | if(IsArray(pointer)){
|
---|
435 | if(IsArray(pointer[0])){
|
---|
436 | for(var i=0;i<pointer.length;i++){
|
---|
437 | for(var j=0;j<pointer[0].length;j++){
|
---|
438 | if(pointer[i][j]==null)pointer[i][j]=value;
|
---|
439 | }
|
---|
440 | }
|
---|
441 | }
|
---|
442 | else{
|
---|
443 | for(var i=0;i<pointer.length;i++){
|
---|
444 | if(pointer[i]==null)pointer[i]=value;
|
---|
445 | }
|
---|
446 | }
|
---|
447 | }
|
---|
448 | return pointer;
|
---|
449 | }
|
---|
450 |
|
---|
451 | } //}}}
|
---|