@jrc03c/js-math-tools
Version:
some math tools for JS
198 lines (190 loc) • 6.42 kB
JavaScript
import { DataFrame, Series } from "./dataframe/index.mjs"
import { distance } from "./distance.mjs"
import { expect, test } from "@jrc03c/fake-jest"
import { forEach } from "./for-each.mjs"
import { inverse } from "./inverse.mjs"
import { isEqual } from "./is-equal.mjs"
import { map } from "./map.mjs"
import { normal } from "./normal.mjs"
test("tests that matrix inverses can be computed correctly", () => {
const a = [
[
-0.12127276865371786, 0.350462020751606, 2.033820010116211,
-1.5906820964850246, 0.9549990962633509, 1.0563472041311566,
-0.2838203403742434, 1.3707782253300411, 1.622606915732567,
-0.2894553459667626,
],
[
0.6283567655683346, -0.05378083885120789, -0.4068512848445372,
0.47085164587108475, -0.18004479675949386, -0.8656953167443983,
-0.8829266076364897, 1.220685541538935, -0.8370283632775997,
2.1034565085174255,
],
[
-0.5169550447562502, 1.250244032193986, -1.7193827264638923,
1.7345740827112006, 1.5008300276140447, -0.36408750244467775,
0.8200130544380111, 0.7369631380671903, 0.42753301164014545,
-0.3871003831307085,
],
[
-0.35932354896169616, 0.5944291074936798, -1.226075745336058,
0.6365940303639955, -0.43775496238171835, -1.0754867555875103,
0.036225355429846985, 1.2892733156165652, -1.050613498967157,
0.5479986993411962,
],
[
0.07675268157861377, -0.5947571933685282, -0.7445428503374395,
1.9918774121138052, 0.8453612367911146, 0.5671564099506075,
0.25408316803207387, -0.786789988085405, -0.10642522081882128,
-0.5122874181637658,
],
[
-0.4542872493007708, -0.1966076324526236, 0.6566951039753979,
1.1068215956457024, 1.478039754461216, 1.6325934409933445,
0.7974690373746759, 0.15528201251718243, 1.0369245833921903,
-0.5097058275773475,
],
[
2.672109271681275, 1.0202962476005109, 0.5272862020609522,
-0.2253713609530309, -0.8495805729937016, 0.07121190328203315,
1.4152871040010053, 1.9802771690721999, -1.3232293410716363,
0.5060073574777028,
],
[
-0.7348482740158297, -0.5380235120402064, -1.6514784051899483,
0.7052050455353287, 0.3107375402680251, -2.1899390745543257,
-0.2879162593417391, -0.49670215279419466, 0.9042017864093781,
-1.17046261457406,
],
[
-0.2001541441202924, -0.5874975349760433, -0.08904725577125114,
-0.7383950722849536, -1.3494249031948142, 1.2072461978342148,
-2.225978278957183, -0.8192352487136791, -2.7226689915552145,
0.6197074179150885,
],
[
2.242537205158909, 0.8280458021148995, -0.33741721482649684,
0.6642282182682274, 0.10317388406934891, 0.46255680799966753,
1.2027817044785476, -0.9380607605534776, -0.5821876054057862,
0.6688264916524803,
],
]
const bTrue = [
[
-3.330734918728712, 1.6246884433654796, 4.336844501137978,
-8.270256745441682, -0.43267180133720645, -2.567772346071238,
2.3060566295119926, -2.0314137142936373, -0.4126521119816963,
-4.470500407595614,
],
[
-0.695441286723933, 0.13754698886349223, 2.6991262803694585,
-3.638629590136261, 2.667630925712928, -4.921436245402135,
0.4524011694942488, -3.354061273027393, -1.32501838048097,
-2.8816369179718904,
],
[
11.302573070463922, -4.853423636642639, -12.841640841230252,
23.973715007850647, 4.681747117533911, 4.244997566949547,
-6.5693173397022475, 4.878382502768662, 0.4239324849683974,
13.016021933985343,
],
[
-3.0081220404528146, 1.2634265339463673, 4.9236314870785405,
-8.477849917161295, 2.9384551300761217, -6.282905413755231,
1.8452017649214887, -4.750738410741077, -1.8289529547544807,
-6.032089081721212,
],
[
16.661315124388643, -6.809806981277019, -20.971138422991714,
38.53680997033632, 0.48475022638373955, 14.744308780934743,
-9.802191821939534, 12.970136181454945, 3.5311342754103916,
23.365019808719502,
],
[
-11.17650990278, 4.704298628492781, 13.473701352917564,
-24.954500426052455, -2.624921243208278, -6.671761046190921,
6.583278134453461, -6.8125898214912075, -1.2126449161556494,
-14.261714995887775,
],
[
4.546154161491146, -2.2076852912248697, -7.06720975048238,
12.528071239994203, -1.4322549457320386, 6.456554841914442,
-2.9420910205361297, 4.808647098386483, 1.318201007412577,
7.798692478049673,
],
[
-4.024737907440915, 1.8458772588483001, 4.8408874472337855,
-8.931359378529827, -1.1741863105071253, -2.0410090768084643,
2.6529997325969683, -2.1493488607174345, -0.3564019038046241,
-5.320605321870062,
],
[
-15.131894278191274, 6.5440048946550595, 19.041174248938542,
-35.17974097968441, -1.6390308470210209, -11.999903293554787,
8.894043126844627, -10.774440435815743, -2.8224089602315137,
-20.654501788075436,
],
[
-1.1144989395418734, 0.7314067216624279, 0.739015756598578,
-1.6167697136054344, -1.1655797199752465, 0.5043869115263531,
0.274058273300666, -0.18723218337165703, 0.020989025284069398,
-0.5978719935960377,
],
]
const bPred = inverse(a)
expect(distance(bPred, bTrue)).toBeLessThan(1e-5)
const c = new DataFrame(a)
c.columns = map(c.columns, (v, i) => "cCol" + i)
c.index = map(c.index, (v, i) => "cRow" + i)
const dTrue = c.copy()
dTrue.values = bTrue
const dPred = inverse(c)
expect(isEqual(dPred.columns, dTrue.columns)).toBe(true)
expect(isEqual(dPred.index, dTrue.index)).toBe(true)
expect(distance(dPred.values, dTrue.values)).toBeLessThan(1e-5)
expect(
isEqual(
inverse([
[2n, 3n],
[4n, 5n],
]),
inverse([
[2, 3],
[4, 5],
]),
),
).toBe(true)
const wrongs = [
0,
1,
2.3,
-2.3,
Infinity,
-Infinity,
NaN,
"foo",
true,
false,
null,
undefined,
Symbol.for("Hello, world!"),
x => x,
function (x) {
return x
},
{ hello: "world" },
normal(100),
normal([2, 3, 4, 5]),
normal([10, 20]),
normal([20, 10]),
// non-invertible matrix:
[
[2, 3],
[4, 6],
],
new Series(normal(100)),
]
forEach(wrongs, item => {
expect(() => inverse(item)).toThrow()
})
})