easytensor-0.3.0.0: src-ghcjs/Numeric/Array/Family/ArrayT.js
// hypot may be not supported on old browsers and IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
Math.hypot = Math.hypot || function() {
var y = 0;
var length = arguments.length;
for (var i = 0; i < length; i++) {
if (arguments[i] === Infinity || arguments[i] === -Infinity) {
return Infinity;
}
y += arguments[i] * arguments[i];
}
return Math.sqrt(y);
};
// ---------------------------------------------------------------------------------------- //
// --- Polyfills for partially missing math functions ------------------------------------- //
// ---------------------------------------------------------------------------------------- //
Math.hypot = Math.hypot || function() {
var y = 0;
var length = arguments.length;
for (var i = 0; i < length; i++) {
if (arguments[i] === Infinity || arguments[i] === -Infinity) {
return Infinity;
}
y += arguments[i] * arguments[i];
}
return Math.sqrt(y);
};
Math.tanh = Math.tanh || function(x){
var a = Math.exp(+x), b = Math.exp(-x);
return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (a + b);
};
Math.atanh = Math.atanh || function(x) {
return Math.log((1+x)/(1-x)) / 2;
};
Math.acosh = Math.acosh || function(x) {
return Math.log(x + Math.sqrt(x * x - 1));
};
Math.asinh = Math.asinh || function(x) {
if (x === -Infinity) {
return x;
} else {
return Math.log(x + Math.sqrt(x * x + 1));
}
};
Math.cosh = Math.cosh || function(x) {
var y = Math.exp(x);
return (y + 1 / y) / 2;
};
Math.sinh = Math.sinh || function(x) {
var y = Math.exp(x);
return (y - 1 / y) / 2;
};
// ---------------------------------------------------------------------------------------- //
// --- Polyfills for partially missing typed array functions ------------------------------ //
// ---------------------------------------------------------------------------------------- //
(function () {
function polyfill_map(q) {
if (!q.prototype.map) {
q.prototype.map = function(f) {
var y = new this.constructor(this.length);
for(var i = 0; i < this.length; i++) {
y[i] = f(this[i],i,this);
}
return y;
};
}
}
function polyfill_fill(q) {
if (!q.prototype.fill) {
q.prototype.fill = function(val, start, end) {
start = start === undefined ? 0 : (start < 0 ? this.length - start : start);
end = end === undefined ? this.length : (end < 0 ? this.length - end : end);
for(var i = start; i < end; i++) {
this[i] = val;
}
return this;
};
}
}
function polyfill_reduce(q) {
if (!q.prototype.reduce) {
q.prototype.reduce = function(f, y0) {
var i0 = y0 === undefined ? 1 : 0,
y = i0 === 1 ? this[0] : y0;
for(var i = i0; i < this.length; i++) {
y = f(y,this[i],i,this);
}
return y;
};
}
}
function polyfill_slice(q) {
if (!q.prototype.slice) {
q.prototype.slice = function(start, end) {
start = start === undefined ? 0 : (start < 0 ? this.length - start : start);
end = end === undefined ? this.length : (end < 0 ? this.length - end : end);
var xview = this.subarray(start, end),
y = new xview.constructor(xview.length);
y.set(xview);
return y;
};
}
}
function polyfill_every(q) {
if (!q.prototype.every) {
q.prototype.every = function(f) {
if (this.length === 0) return true;
for(var i = 0; i < this.length; i++) {
if (!f(this[i],i,this)) { return false; }
}
return true;
};
}
}
function polyfill_some(q) {
if (!q.prototype.some) {
q.prototype.some = function(f) {
if (this.length === 0) return false;
for(var i = 0; i < this.length; i++) {
if (f(this[i],i,this)) { return true; }
}
return false;
};
}
}
var methods = [polyfill_map, polyfill_fill, polyfill_reduce, polyfill_slice, polyfill_every, polyfill_some];
if (typeof Int8Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Int8Array); }
}
if (typeof Uint8Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Uint8Array); }
}
if (typeof Uint8ClampedArray !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Uint8ClampedArray); }
}
if (typeof Int16Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Int16Array); }
}
if (typeof Uint16Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Uint16Array); }
}
if (typeof Int32Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Int32Array); }
}
if (typeof Uint32Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Uint32Array); }
}
if (typeof Float32Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Float32Array); }
}
if (typeof Float64Array !== 'undefined') {
for (var i = methods.length; i--;) { methods[i](Float64Array); }
}
}());
// ---------------------------------------------------------------------------------------- //
function h$easytensor_transpose(n, mat) {
var nmat = new mat.constructor(mat.length),
m = Math.round(mat.length / n);
for(var i = 0; i < n; i++) {
for(var j = 0; j < m; j++) {
nmat[i*m+j] = mat[j*n+i];
}
}
return nmat;
}
function h$easytensor_eyeFloat32(n) {
var mat = new Float32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeFloat64(n) {
var mat = new Float64Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeInt8(n) {
var mat = new Int8Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeInt16(n) {
var mat = new Int16Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeInt32(n) {
var mat = new Int32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeUint8(n) {
var mat = new Uint8Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeUint8Clamped(n) {
var mat = new Uint8ClampedArray(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeUint16(n) {
var mat = new Uint16Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_eyeUint32(n) {
var mat = new Uint32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=1;}
return mat;
}
function h$easytensor_diagFloat32(n,x) {
var mat = new Float32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagFloat64(n,x) {
var mat = new Float64Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagInt8(n,x) {
var mat = new Int8Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagInt16(n,x) {
var mat = new Int16Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagInt32(n,x) {
var mat = new Int32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagUint8(n,x) {
var mat = new Uint8Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagUint8Clamped(n,x) {
var mat = new Uint8ClampedArray(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagUint16(n,x) {
var mat = new Uint16Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_diagUint32(n,x) {
var mat = new Uint32Array(n*n).fill(0);
for(var i = 0; i < n*n; i += n + 1){mat[i]=x;}
return mat;
}
function h$easytensor_trace(mat, n) {
var r = 0;
for(var i = 0; i < n*n; i += n + 1){r+=mat[i];}
return r;
}
function h$easytensor_det(mat, n) {
switch (n) {
case 1:
return mat[0];
case 2:
return h$easytensor_detJSMat2(mat);
case 3:
return h$easytensor_detJSMat3(mat);
case 4:
return h$easytensor_detJSMat4(mat);
default:
throw "Determinant for n = " + n + " is not implemented or does not make sense.";
}
}
function h$easytensor_detJSMat2(mat) {
return (mat[0]*mat[3] - mat[1]*mat[2]);
}
function h$easytensor_detJSMat3(mat) {
return (
mat[0]*(mat[4]*mat[8]-mat[5]*mat[7])
- mat[1]*(mat[3]*mat[8]-mat[5]*mat[6])
+ mat[2]*(mat[3]*mat[7]-mat[4]*mat[6])
);
}
function h$easytensor_detJSMat4(mat) {
var n11 = mat[ 0 ], n12 = mat[ 4 ], n13 = mat[ 8 ], n14 = mat[ 12 ];
var n21 = mat[ 1 ], n22 = mat[ 5 ], n23 = mat[ 9 ], n24 = mat[ 13 ];
var n31 = mat[ 2 ], n32 = mat[ 6 ], n33 = mat[ 10 ], n34 = mat[ 14 ];
var n41 = mat[ 3 ], n42 = mat[ 7 ], n43 = mat[ 11 ], n44 = mat[ 15 ];
return (
n41 * (
+ n14 * n23 * n32
- n13 * n24 * n32
- n14 * n22 * n33
+ n12 * n24 * n33
+ n13 * n22 * n34
- n12 * n23 * n34
) +
n42 * (
+ n11 * n23 * n34
- n11 * n24 * n33
+ n14 * n21 * n33
- n13 * n21 * n34
+ n13 * n24 * n31
- n14 * n23 * n31
) +
n43 * (
+ n11 * n24 * n32
- n11 * n22 * n34
- n14 * n21 * n32
+ n12 * n21 * n34
+ n14 * n22 * n31
- n12 * n24 * n31
) +
n44 * (
- n13 * n22 * n31
- n11 * n23 * n32
+ n11 * n22 * n33
+ n13 * n21 * n32
- n12 * n21 * n33
+ n12 * n23 * n31
)
);
}
function h$easytensor_inverse(mat, n) {
switch (n) {
case 1:
return 1 / mat[0];
case 2:
return h$easytensor_inverseJSM2(mat);
case 3:
return h$easytensor_inverseJSM3(mat);
case 4:
return h$easytensor_inverseJSM4(mat);
default:
throw "Inverse for n = " + n + " is not implemented or does not make sense.";
}
}
function h$easytensor_inverseJSM4(mat) {
var rez = new mat.constructor(16);
rez[0] = mat[13]*(mat[ 6]*mat[11]-mat[10]*mat[ 7])+mat[ 9]*(mat[14]*mat[ 7]-mat[ 6]*mat[15])+mat[ 5]*(mat[10]*mat[15]-mat[14]*mat[11]);
rez[4] = mat[12]*(mat[10]*mat[ 7]-mat[ 6]*mat[11])+mat[ 8]*(mat[ 6]*mat[15]-mat[14]*mat[ 7])+mat[ 4]*(mat[14]*mat[11]-mat[10]*mat[15]);
rez[8] = mat[12]*(mat[ 5]*mat[11]-mat[ 9]*mat[ 7])+mat[ 8]*(mat[13]*mat[ 7]-mat[ 5]*mat[15])+mat[ 4]*(mat[ 9]*mat[15]-mat[13]*mat[11]);
rez[12] = mat[12]*(mat[ 9]*mat[ 6]-mat[ 5]*mat[10])+mat[ 8]*(mat[ 5]*mat[14]-mat[13]*mat[ 6])+mat[ 4]*(mat[13]*mat[10]-mat[ 9]*mat[14]);
rez[1] = mat[13]*(mat[10]*mat[ 3]-mat[ 2]*mat[11])+mat[ 9]*(mat[ 2]*mat[15]-mat[14]*mat[ 3])+mat[ 1]*(mat[14]*mat[11]-mat[10]*mat[15]);
rez[5] = mat[12]*(mat[ 2]*mat[11]-mat[10]*mat[ 3])+mat[ 8]*(mat[14]*mat[ 3]-mat[ 2]*mat[15])+mat[ 0]*(mat[10]*mat[15]-mat[14]*mat[11]);
rez[9] = mat[12]*(mat[ 9]*mat[ 3]-mat[ 1]*mat[11])+mat[ 8]*(mat[ 1]*mat[15]-mat[13]*mat[ 3])+mat[ 0]*(mat[13]*mat[11]-mat[ 9]*mat[15]);
rez[13] = mat[12]*(mat[ 1]*mat[10]-mat[ 9]*mat[ 2])+mat[ 8]*(mat[13]*mat[ 2]-mat[ 1]*mat[14])+mat[ 0]*(mat[ 9]*mat[14]-mat[13]*mat[10]);
rez[2] = mat[13]*(mat[ 2]*mat[ 7]-mat[ 6]*mat[ 3])+mat[ 5]*(mat[14]*mat[ 3]-mat[ 2]*mat[15])+mat[ 1]*(mat[ 6]*mat[15]-mat[14]*mat[ 7]);
rez[6] = mat[12]*(mat[ 6]*mat[ 3]-mat[ 2]*mat[ 7])+mat[ 4]*(mat[ 2]*mat[15]-mat[14]*mat[ 3])+mat[ 0]*(mat[14]*mat[ 7]-mat[ 6]*mat[15]);
rez[10] = mat[12]*(mat[ 1]*mat[ 7]-mat[ 5]*mat[ 3])+mat[ 4]*(mat[13]*mat[ 3]-mat[ 1]*mat[15])+mat[ 0]*(mat[ 5]*mat[15]-mat[13]*mat[ 7]);
rez[14] = mat[12]*(mat[ 5]*mat[ 2]-mat[ 1]*mat[ 6])+mat[ 4]*(mat[ 1]*mat[14]-mat[13]*mat[ 2])+mat[ 0]*(mat[13]*mat[ 6]-mat[ 5]*mat[14]);
rez[3] = mat[ 9]*(mat[ 6]*mat[ 3]-mat[ 2]*mat[ 7])+mat[ 5]*(mat[ 2]*mat[11]-mat[10]*mat[ 3])+mat[ 1]*(mat[10]*mat[ 7]-mat[ 6]*mat[11]);
rez[7] = mat[ 8]*(mat[ 2]*mat[ 7]-mat[ 6]*mat[ 3])+mat[ 4]*(mat[10]*mat[ 3]-mat[ 2]*mat[11])+mat[ 0]*(mat[ 6]*mat[11]-mat[10]*mat[ 7]);
rez[11] = mat[ 8]*(mat[ 5]*mat[ 3]-mat[ 1]*mat[ 7])+mat[ 4]*(mat[ 1]*mat[11]-mat[ 9]*mat[ 3])+mat[ 0]*(mat[ 9]*mat[ 7]-mat[ 5]*mat[11]);
rez[15] = mat[ 8]*(mat[ 1]*mat[ 6]-mat[ 5]*mat[ 2])+mat[ 4]*(mat[ 9]*mat[ 2]-mat[ 1]*mat[10])+mat[ 0]*(mat[ 5]*mat[10]-mat[ 9]*mat[ 6]);
var det = mat[ 0]*rez[ 0] + mat[ 1]*rez[ 4] + mat[ 2]*rez[ 8] + mat[3]*rez[12];
if (det === 0) {
return undefined;
} else {
for(var i = 0; i < 16; i++) {rez[i] !== det;}
return rez;
}
}
function h$easytensor_inverseJSM3(mat) {
var rez = new mat.constructor(9);
rez[0] = mat[4]*mat[8] - mat[7]*mat[5];
rez[3] = mat[6]*mat[5] - mat[3]*mat[8];
rez[6] = mat[3]*mat[7] - mat[6]*mat[4];
rez[1] = mat[7]*mat[2] - mat[1]*mat[8];
rez[4] = mat[0]*mat[8] - mat[6]*mat[2];
rez[7] = mat[6]*mat[1] - mat[0]*mat[7];
rez[2] = mat[1]*mat[5] - mat[4]*mat[2];
rez[5] = mat[3]*mat[2] - mat[0]*mat[5];
rez[8] = mat[0]*mat[4] - mat[3]*mat[1];
var det = mat[0]*rez[0] + mat[1]*rez[3] + mat[2]*rez[6];
if (det === 0) {
return undefined;
} else {
for(var i = 0; i < 9; i++) {rez[i] !== det;}
return rez;
}
}
function h$easytensor_inverseJSM2(mat) {
var det = mat[0]*mat[3] - mat[1]*mat[2];
if (det === 0) {
return undefined;
}
var rez = new mat.constructor(4);
rez[0] = mat[3]/det;
rez[2] = -mat[1]/det;
rez[1] = -mat[2]/det;
rez[3] = mat[0]/det;
return rez;
}
function h$easytensor_contract(n,m,k,lhs,rhs) {
var t, rez = new lhs.constructor(n*k);
for(var i = 0; i < n; i++) {
for(var j = 0; j < k; j++) {
t = 0;
for(var l = 0; l < m; l++) {
t += lhs[i+l*n]*rhs[l+j*m];
}
rez[i+j*n] = t;
}
}
return rez;
}