UNPKG

robust-linear-solve

Version:
71 lines (63 loc) 1.7 kB
"use strict" var determinant = require("robust-determinant") var NUM_EXPAND = 6 function generateSolver(n) { var funcName = "robustLinearSolve" + n + "d" var code = ["function ", funcName, "(A,b){return ["] for(var i=0; i<n; ++i) { code.push("det([") for(var j=0; j<n; ++j) { if(j > 0) { code.push(",") } code.push("[") for(var k=0; k<n; ++k) { if(k > 0) { code.push(",") } if(k === i) { code.push("+b[", j, "]") } else { code.push("+A[", j, "][", k, "]") } } code.push("]") } code.push("]),") } code.push("det(A)]}return ", funcName) var proc = new Function("det", code.join("")) if(n < 6) { return proc(determinant[n]) } return proc(determinant) } function robustLinearSolve0d() { return [ 0 ] } function robustLinearSolve1d(A, b) { return [ [ b[0] ], [ A[0][0] ] ] } var CACHE = [ robustLinearSolve0d, robustLinearSolve1d ] function generateDispatch() { while(CACHE.length < NUM_EXPAND) { CACHE.push(generateSolver(CACHE.length)) } var procArgs = [] var code = ["function dispatchLinearSolve(A,b){switch(A.length){"] for(var i=0; i<NUM_EXPAND; ++i) { procArgs.push("s" + i) code.push("case ", i, ":return s", i, "(A,b);") } code.push("}var s=CACHE[A.length];if(!s)s=CACHE[A.length]=g(A.length);return s(A,b)}return dispatchLinearSolve") procArgs.push("CACHE", "g", code.join("")) var proc = Function.apply(undefined, procArgs) module.exports = proc.apply(undefined, CACHE.concat([CACHE, generateSolver])) for(var i=0; i<NUM_EXPAND; ++i) { module.exports[i] = CACHE[i] } } generateDispatch()