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.
144 lines
3.6 KiB
144 lines
3.6 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
var DIMENSION = 'd'
|
||
|
var AXIS = 'ax'
|
||
|
var VISIT = 'vv'
|
||
|
var FLIP = 'fp'
|
||
|
|
||
|
var ELEM_SIZE = 'es'
|
||
|
|
||
|
var RED_START = 'rs'
|
||
|
var RED_END = 're'
|
||
|
var RED_BOXES = 'rb'
|
||
|
var RED_INDEX = 'ri'
|
||
|
var RED_PTR = 'rp'
|
||
|
|
||
|
var BLUE_START = 'bs'
|
||
|
var BLUE_END = 'be'
|
||
|
var BLUE_BOXES = 'bb'
|
||
|
var BLUE_INDEX = 'bi'
|
||
|
var BLUE_PTR = 'bp'
|
||
|
|
||
|
var RETVAL = 'rv'
|
||
|
|
||
|
var INNER_LABEL = 'Q'
|
||
|
|
||
|
var ARGS = [
|
||
|
DIMENSION,
|
||
|
AXIS,
|
||
|
VISIT,
|
||
|
RED_START,
|
||
|
RED_END,
|
||
|
RED_BOXES,
|
||
|
RED_INDEX,
|
||
|
BLUE_START,
|
||
|
BLUE_END,
|
||
|
BLUE_BOXES,
|
||
|
BLUE_INDEX
|
||
|
]
|
||
|
|
||
|
function generateBruteForce(redMajor, flip, full) {
|
||
|
var funcName = 'bruteForce' +
|
||
|
(redMajor ? 'Red' : 'Blue') +
|
||
|
(flip ? 'Flip' : '') +
|
||
|
(full ? 'Full' : '')
|
||
|
|
||
|
var code = ['function ', funcName, '(', ARGS.join(), '){',
|
||
|
'var ', ELEM_SIZE, '=2*', DIMENSION, ';']
|
||
|
|
||
|
var redLoop =
|
||
|
'for(var i=' + RED_START + ',' + RED_PTR + '=' + ELEM_SIZE + '*' + RED_START + ';' +
|
||
|
'i<' + RED_END +';' +
|
||
|
'++i,' + RED_PTR + '+=' + ELEM_SIZE + '){' +
|
||
|
'var x0=' + RED_BOXES + '[' + AXIS + '+' + RED_PTR + '],' +
|
||
|
'x1=' + RED_BOXES + '[' + AXIS + '+' + RED_PTR + '+' + DIMENSION + '],' +
|
||
|
'xi=' + RED_INDEX + '[i];'
|
||
|
|
||
|
var blueLoop =
|
||
|
'for(var j=' + BLUE_START + ',' + BLUE_PTR + '=' + ELEM_SIZE + '*' + BLUE_START + ';' +
|
||
|
'j<' + BLUE_END + ';' +
|
||
|
'++j,' + BLUE_PTR + '+=' + ELEM_SIZE + '){' +
|
||
|
'var y0=' + BLUE_BOXES + '[' + AXIS + '+' + BLUE_PTR + '],' +
|
||
|
(full ? 'y1=' + BLUE_BOXES + '[' + AXIS + '+' + BLUE_PTR + '+' + DIMENSION + '],' : '') +
|
||
|
'yi=' + BLUE_INDEX + '[j];'
|
||
|
|
||
|
if(redMajor) {
|
||
|
code.push(redLoop, INNER_LABEL, ':', blueLoop)
|
||
|
} else {
|
||
|
code.push(blueLoop, INNER_LABEL, ':', redLoop)
|
||
|
}
|
||
|
|
||
|
if(full) {
|
||
|
code.push('if(y1<x0||x1<y0)continue;')
|
||
|
} else if(flip) {
|
||
|
code.push('if(y0<=x0||x1<y0)continue;')
|
||
|
} else {
|
||
|
code.push('if(y0<x0||x1<y0)continue;')
|
||
|
}
|
||
|
|
||
|
code.push('for(var k='+AXIS+'+1;k<'+DIMENSION+';++k){'+
|
||
|
'var r0='+RED_BOXES+'[k+'+RED_PTR+'],'+
|
||
|
'r1='+RED_BOXES+'[k+'+DIMENSION+'+'+RED_PTR+'],'+
|
||
|
'b0='+BLUE_BOXES+'[k+'+BLUE_PTR+'],'+
|
||
|
'b1='+BLUE_BOXES+'[k+'+DIMENSION+'+'+BLUE_PTR+'];'+
|
||
|
'if(r1<b0||b1<r0)continue ' + INNER_LABEL + ';}' +
|
||
|
'var ' + RETVAL + '=' + VISIT + '(')
|
||
|
|
||
|
if(flip) {
|
||
|
code.push('yi,xi')
|
||
|
} else {
|
||
|
code.push('xi,yi')
|
||
|
}
|
||
|
|
||
|
code.push(');if(' + RETVAL + '!==void 0)return ' + RETVAL + ';}}}')
|
||
|
|
||
|
return {
|
||
|
name: funcName,
|
||
|
code: code.join('')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function bruteForcePlanner(full) {
|
||
|
var funcName = 'bruteForce' + (full ? 'Full' : 'Partial')
|
||
|
var prefix = []
|
||
|
var fargs = ARGS.slice()
|
||
|
if(!full) {
|
||
|
fargs.splice(3, 0, FLIP)
|
||
|
}
|
||
|
|
||
|
var code = ['function ' + funcName + '(' + fargs.join() + '){']
|
||
|
|
||
|
function invoke(redMajor, flip) {
|
||
|
var res = generateBruteForce(redMajor, flip, full)
|
||
|
prefix.push(res.code)
|
||
|
code.push('return ' + res.name + '(' + ARGS.join() + ');')
|
||
|
}
|
||
|
|
||
|
code.push('if(' + RED_END + '-' + RED_START + '>' +
|
||
|
BLUE_END + '-' + BLUE_START + '){')
|
||
|
|
||
|
if(full) {
|
||
|
invoke(true, false)
|
||
|
code.push('}else{')
|
||
|
invoke(false, false)
|
||
|
} else {
|
||
|
code.push('if(' + FLIP + '){')
|
||
|
invoke(true, true)
|
||
|
code.push('}else{')
|
||
|
invoke(true, false)
|
||
|
code.push('}}else{if(' + FLIP + '){')
|
||
|
invoke(false, true)
|
||
|
code.push('}else{')
|
||
|
invoke(false, false)
|
||
|
code.push('}')
|
||
|
}
|
||
|
code.push('}}return ' + funcName)
|
||
|
|
||
|
var codeStr = prefix.join('') + code.join('')
|
||
|
var proc = new Function(codeStr)
|
||
|
return proc()
|
||
|
}
|
||
|
|
||
|
|
||
|
exports.partial = bruteForcePlanner(false)
|
||
|
exports.full = bruteForcePlanner(true)
|