robust-linear-solve
Version:
Exactly solve a low dimensional linear system
64 lines (54 loc) • 1.94 kB
JavaScript
"use strict"
var robustScale = require("robust-scale")
var robustSum = require("robust-sum")
var robustCompre = require("robust-compare")
var validate = require("validate-robust-sequence")
var compress = require("robust-compress")
var tape = require("tape")
var robustLinSolve = require("../linsolve")
tape("robust-linear-solve", function(t) {
function verify(A, b, unsolvable, label) {
if(!label) {
label = "hardcoded: "
}
var x = robustLinSolve(A, b)
t.equals(x.length, A.length + 1, label + "check vector length")
for(var i=0; i<x.length; ++i) {
t.ok(validate(x[i]), label + "check valid sequence")
t.ok(x[i].length <= compress(x[i]).length, label + "check compression")
}
if(unsolvable) {
t.same(x[A.length], [0], "check system unsolvable")
} else {
for(var i=0; i<A.length; ++i) {
var bi = robustScale(x[A.length], b[i])
var ai = [ 0 ]
for(var j=0; j<A.length; ++j) {
ai = robustSum(ai, robustScale(x[j], A[i][j]))
}
t.equals(robustCompre(ai, bi), 0, label + "check component " + i + " equal")
}
}
}
verify([[1]], [1])
verify([[1,0], [0,1]], [1, 2])
verify([[1,0], [0,0]], [1,2], true)
//Fuzz 1D
for(var i=0; i<10; ++i) {
verify([[Math.random()-0.5]], [Math.random()-0.5], false, "fuzz1d: ")
}
//Fuzz 2D
for(var i=0; i<10; ++i) {
verify([[Math.random()-0.5, Math.random()-0.5],
[Math.random()-0.5, Math.random()-0.5]],
[Math.random()-0.5, Math.random()-0.5], false, "fuzz2d: ")
}
//Fuzz 3D
for(var i=0; i<10; ++i) {
verify([[Math.random()-0.5, Math.random()-0.5, Math.random()-0.5],
[Math.random()-0.5, Math.random()-0.5, Math.random()-0.5],
[Math.random()-0.5, Math.random()-0.5, Math.random()-0.5]],
[Math.random()-0.5, Math.random()-0.5, Math.random()-0.5], false, "fuzz3d: ")
}
t.end()
})