'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' + 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)