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.
167 lines
4.1 KiB
167 lines
4.1 KiB
"use strict"
|
|
|
|
var twoProduct = require("two-product")
|
|
var robustSum = require("robust-sum")
|
|
var robustDiff = require("robust-subtract")
|
|
var robustScale = require("robust-scale")
|
|
|
|
var NUM_EXPAND = 6
|
|
|
|
function cofactor(m, c) {
|
|
var result = new Array(m.length-1)
|
|
for(var i=1; i<m.length; ++i) {
|
|
var r = result[i-1] = new Array(m.length-1)
|
|
for(var j=0,k=0; j<m.length; ++j) {
|
|
if(j === c) {
|
|
continue
|
|
}
|
|
r[k++] = m[i][j]
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
function matrix(n) {
|
|
var result = new Array(n)
|
|
for(var i=0; i<n; ++i) {
|
|
result[i] = new Array(n)
|
|
for(var j=0; j<n; ++j) {
|
|
result[i][j] = ["m", j, "[", (n-i-2), "]"].join("")
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
function generateSum(expr) {
|
|
if(expr.length === 1) {
|
|
return expr[0]
|
|
} else if(expr.length === 2) {
|
|
return ["sum(", expr[0], ",", expr[1], ")"].join("")
|
|
} else {
|
|
var m = expr.length>>1
|
|
return ["sum(", generateSum(expr.slice(0, m)), ",", generateSum(expr.slice(m)), ")"].join("")
|
|
}
|
|
}
|
|
|
|
function makeProduct(a, b) {
|
|
if(a.charAt(0) === "m") {
|
|
if(b.charAt(0) === "w") {
|
|
var toks = a.split("[")
|
|
return ["w", b.substr(1), "m", toks[0].substr(1)].join("")
|
|
} else {
|
|
return ["prod(", a, ",", b, ")"].join("")
|
|
}
|
|
} else {
|
|
return makeProduct(b, a)
|
|
}
|
|
}
|
|
|
|
function sign(s) {
|
|
if(s & 1 !== 0) {
|
|
return "-"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
function determinant(m) {
|
|
if(m.length === 2) {
|
|
return [["diff(", makeProduct(m[0][0], m[1][1]), ",", makeProduct(m[1][0], m[0][1]), ")"].join("")]
|
|
} else {
|
|
var expr = []
|
|
for(var i=0; i<m.length; ++i) {
|
|
expr.push(["scale(", generateSum(determinant(cofactor(m, i))), ",", sign(i), m[0][i], ")"].join(""))
|
|
}
|
|
return expr
|
|
}
|
|
}
|
|
|
|
function makeSquare(d, n) {
|
|
var terms = []
|
|
for(var i=0; i<n-2; ++i) {
|
|
terms.push(["prod(m", d, "[", i, "],m", d, "[", i, "])"].join(""))
|
|
}
|
|
return generateSum(terms)
|
|
}
|
|
|
|
function orientation(n) {
|
|
var pos = []
|
|
var neg = []
|
|
var m = matrix(n)
|
|
for(var i=0; i<n; ++i) {
|
|
m[0][i] = "1"
|
|
m[n-1][i] = "w"+i
|
|
}
|
|
for(var i=0; i<n; ++i) {
|
|
if((i&1)===0) {
|
|
pos.push.apply(pos,determinant(cofactor(m, i)))
|
|
} else {
|
|
neg.push.apply(neg,determinant(cofactor(m, i)))
|
|
}
|
|
}
|
|
var posExpr = generateSum(pos)
|
|
var negExpr = generateSum(neg)
|
|
var funcName = "exactInSphere" + n
|
|
var funcArgs = []
|
|
for(var i=0; i<n; ++i) {
|
|
funcArgs.push("m" + i)
|
|
}
|
|
var code = ["function ", funcName, "(", funcArgs.join(), "){"]
|
|
for(var i=0; i<n; ++i) {
|
|
code.push("var w",i,"=",makeSquare(i,n),";")
|
|
for(var j=0; j<n; ++j) {
|
|
if(j !== i) {
|
|
code.push("var w",i,"m",j,"=scale(w",i,",m",j,"[0]);")
|
|
}
|
|
}
|
|
}
|
|
code.push("var p=", posExpr, ",n=", negExpr, ",d=diff(p,n);return d[d.length-1];}return ", funcName)
|
|
var proc = new Function("sum", "diff", "prod", "scale", code.join(""))
|
|
return proc(robustSum, robustDiff, twoProduct, robustScale)
|
|
}
|
|
|
|
function inSphere0() { return 0 }
|
|
function inSphere1() { return 0 }
|
|
function inSphere2() { return 0 }
|
|
|
|
var CACHED = [
|
|
inSphere0,
|
|
inSphere1,
|
|
inSphere2
|
|
]
|
|
|
|
function slowInSphere(args) {
|
|
var proc = CACHED[args.length]
|
|
if(!proc) {
|
|
proc = CACHED[args.length] = orientation(args.length)
|
|
}
|
|
return proc.apply(undefined, args)
|
|
}
|
|
|
|
function generateInSphereTest() {
|
|
while(CACHED.length <= NUM_EXPAND) {
|
|
CACHED.push(orientation(CACHED.length))
|
|
}
|
|
var args = []
|
|
var procArgs = ["slow"]
|
|
for(var i=0; i<=NUM_EXPAND; ++i) {
|
|
args.push("a" + i)
|
|
procArgs.push("o" + i)
|
|
}
|
|
var code = [
|
|
"function testInSphere(", args.join(), "){switch(arguments.length){case 0:case 1:return 0;"
|
|
]
|
|
for(var i=2; i<=NUM_EXPAND; ++i) {
|
|
code.push("case ", i, ":return o", i, "(", args.slice(0, i).join(), ");")
|
|
}
|
|
code.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return testInSphere")
|
|
procArgs.push(code.join(""))
|
|
|
|
var proc = Function.apply(undefined, procArgs)
|
|
|
|
module.exports = proc.apply(undefined, [slowInSphere].concat(CACHED))
|
|
for(var i=0; i<=NUM_EXPAND; ++i) {
|
|
module.exports[i] = CACHED[i]
|
|
}
|
|
}
|
|
|
|
generateInSphereTest() |