StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
2.4 KiB
156 lines
2.4 KiB
"use strict"
|
|
|
|
module.exports = robustSubtract
|
|
|
|
//Easy case: Add two scalars
|
|
function scalarScalar(a, b) {
|
|
var x = a + b
|
|
var bv = x - a
|
|
var av = x - bv
|
|
var br = b - bv
|
|
var ar = a - av
|
|
var y = ar + br
|
|
if(y) {
|
|
return [y, x]
|
|
}
|
|
return [x]
|
|
}
|
|
|
|
function robustSubtract(e, f) {
|
|
var ne = e.length|0
|
|
var nf = f.length|0
|
|
if(ne === 1 && nf === 1) {
|
|
return scalarScalar(e[0], -f[0])
|
|
}
|
|
var n = ne + nf
|
|
var g = new Array(n)
|
|
var count = 0
|
|
var eptr = 0
|
|
var fptr = 0
|
|
var abs = Math.abs
|
|
var ei = e[eptr]
|
|
var ea = abs(ei)
|
|
var fi = -f[fptr]
|
|
var fa = abs(fi)
|
|
var a, b
|
|
if(ea < fa) {
|
|
b = ei
|
|
eptr += 1
|
|
if(eptr < ne) {
|
|
ei = e[eptr]
|
|
ea = abs(ei)
|
|
}
|
|
} else {
|
|
b = fi
|
|
fptr += 1
|
|
if(fptr < nf) {
|
|
fi = -f[fptr]
|
|
fa = abs(fi)
|
|
}
|
|
}
|
|
if((eptr < ne && ea < fa) || (fptr >= nf)) {
|
|
a = ei
|
|
eptr += 1
|
|
if(eptr < ne) {
|
|
ei = e[eptr]
|
|
ea = abs(ei)
|
|
}
|
|
} else {
|
|
a = fi
|
|
fptr += 1
|
|
if(fptr < nf) {
|
|
fi = -f[fptr]
|
|
fa = abs(fi)
|
|
}
|
|
}
|
|
var x = a + b
|
|
var bv = x - a
|
|
var y = b - bv
|
|
var q0 = y
|
|
var q1 = x
|
|
var _x, _bv, _av, _br, _ar
|
|
while(eptr < ne && fptr < nf) {
|
|
if(ea < fa) {
|
|
a = ei
|
|
eptr += 1
|
|
if(eptr < ne) {
|
|
ei = e[eptr]
|
|
ea = abs(ei)
|
|
}
|
|
} else {
|
|
a = fi
|
|
fptr += 1
|
|
if(fptr < nf) {
|
|
fi = -f[fptr]
|
|
fa = abs(fi)
|
|
}
|
|
}
|
|
b = q0
|
|
x = a + b
|
|
bv = x - a
|
|
y = b - bv
|
|
if(y) {
|
|
g[count++] = y
|
|
}
|
|
_x = q1 + x
|
|
_bv = _x - q1
|
|
_av = _x - _bv
|
|
_br = x - _bv
|
|
_ar = q1 - _av
|
|
q0 = _ar + _br
|
|
q1 = _x
|
|
}
|
|
while(eptr < ne) {
|
|
a = ei
|
|
b = q0
|
|
x = a + b
|
|
bv = x - a
|
|
y = b - bv
|
|
if(y) {
|
|
g[count++] = y
|
|
}
|
|
_x = q1 + x
|
|
_bv = _x - q1
|
|
_av = _x - _bv
|
|
_br = x - _bv
|
|
_ar = q1 - _av
|
|
q0 = _ar + _br
|
|
q1 = _x
|
|
eptr += 1
|
|
if(eptr < ne) {
|
|
ei = e[eptr]
|
|
}
|
|
}
|
|
while(fptr < nf) {
|
|
a = fi
|
|
b = q0
|
|
x = a + b
|
|
bv = x - a
|
|
y = b - bv
|
|
if(y) {
|
|
g[count++] = y
|
|
}
|
|
_x = q1 + x
|
|
_bv = _x - q1
|
|
_av = _x - _bv
|
|
_br = x - _bv
|
|
_ar = q1 - _av
|
|
q0 = _ar + _br
|
|
q1 = _x
|
|
fptr += 1
|
|
if(fptr < nf) {
|
|
fi = -f[fptr]
|
|
}
|
|
}
|
|
if(q0) {
|
|
g[count++] = q0
|
|
}
|
|
if(q1) {
|
|
g[count++] = q1
|
|
}
|
|
if(!count) {
|
|
g[count++] = 0.0
|
|
}
|
|
g.length = count
|
|
return g
|
|
} |