ruda-solver 0.1.0

Explicit scientific solvers: real/complex/sparse host algebra and opt-in small batched device kernels
Documentation
// SPDX-License-Identifier: Apache-2.0
// GENERATED by tools/science/oracle.py --generate-fixtures.
// Expected numbers come from NumPy linalg; tests still require Rust execution.
use super::*;
#[test] fn numpy_fixture_00_lu() {
let a=matrix(1,1,&[0.6846336979857788]);
let b=matrix(1,2,&[-1.9892408415219838,1.1000791593070742]);
let x=Lu::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[-2.9055549666550364,1.6068142169214772],2e-10);
}
#[test] fn numpy_fixture_01_cholesky() {
let a=matrix(1,1,&[5.023368481287225]);
let b=matrix(1,2,&[0.8913329228392014,1.4603016036614063]);
let x=Cholesky::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.17743729653907447,0.29070166942784337],2e-10);
}
#[test] fn numpy_fixture_02_qr() {
let a=matrix(4,1,&[-2.2299028644981598,-0.3054050795003124,-0.9381896470446348,0.5895571665752661]);
let b=matrix(4,2,&[1.5259102785789191,0.1431162183279346,-0.7137242602499253,-0.3783340592345341,-0.4145786741980473,0.8625337299983835,-0.9395775737666261,0.6640560203999273]);
let x=Qr::factor(a.view(),Default::default()).unwrap().least_squares(b.view()).unwrap().solution;
close(x.values(),&[-0.5322363024452826,-0.09872244717975726],2e-10);
}
#[test] fn numpy_fixture_03_eigen() {
let a=matrix(1,1,&[0.41600105646863206]);
let result=symmetric_eigen(a.view(),Default::default()).unwrap();
close(&result.values,&[0.41600105646863206],2e-10);
let av=multiply(&a,&result.vectors); let n=a.rows(); for i in 0..n{for j in 0..n{assert!((av.data[i*n+j]-result.vectors.data[i*n+j]*result.values[j]).abs()<1e-9);}}
}
#[test] fn numpy_fixture_04_lu() {
let a=matrix(2,2,&[2.1586484272967907,3.0638473028206628,4.270072749033427,0.01577440790658954]);
let b=matrix(2,2,&[-0.501707290445032,0.5000818838683194,1.092470424612034,-0.6478674716569747]);
let x=Lu::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.25711765331004777,-0.15272328348607353,-0.3449042344310533,0.27082216493401484],2e-10);
}
#[test] fn numpy_fixture_05_cholesky() {
let a=matrix(2,2,&[4.462213088261286,-2.1351841124318307,-2.1351841124318307,5.42176526090088]);
let b=matrix(2,2,&[0.36792892822306966,-1.980451789282599,-0.03701616031637343,0.16471969926873742]);
let x=Cholesky::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.09757471935879852,-0.5289704446807145,0.03159927108409348,-0.17793643651758267],2e-10);
}
#[test] fn numpy_fixture_06_qr() {
let a=matrix(5,2,&[-1.2469501153981424,-0.5608740358921424,1.0877008153798582,-0.09350600992159355,-0.25083750813147293,-1.7284295377067656,1.4089579851308023,-0.623567054613303,0.6508231092444892,-1.3746015631990103]);
let b=matrix(5,2,&[-0.019783091466049528,-0.3655022973169176,0.9045248842349103,0.3861714441912084,-1.3619952008496286,-0.6521738324913977,-1.8965334177471889,-0.2499735980756164,2.197255829179697,-0.6946389863838248]);
let x=Qr::factor(a.view(),Default::default()).unwrap().least_squares(b.view()).unwrap().solution;
close(x.values(),&[0.032643369078788155,0.10851162577540821,0.08357520873021897,0.44503448446041016],2e-10);
}
#[test] fn numpy_fixture_07_eigen() {
let a=matrix(2,2,&[0.25554034274169674,-0.33983715605891135,-0.33983715605891135,0.4078375698713301]);
let result=symmetric_eigen(a.view(),Default::default()).unwrap();
close(&result.values,&[-0.016575173322210562,0.6799530859352374],2e-10);
let av=multiply(&a,&result.vectors); let n=a.rows(); for i in 0..n{for j in 0..n{assert!((av.data[i*n+j]-result.vectors.data[i*n+j]*result.values[j]).abs()<1e-9);}}
}
#[test] fn numpy_fixture_08_lu() {
let a=matrix(3,3,&[1.2636442543286215,0.7686056670021719,5.405409503678776,0.65884277768114,7.053138547997501,-1.1137927823871379,7.269111026865869,-1.567109937155866,1.4611355099933183]);
let b=matrix(3,2,&[0.784384136010052,-1.3794402817996676,0.30103578768638606,-0.16727501995325453,-1.0967220736812364,1.5029795045155239]);
let x=Lu::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[-0.16702811287764896,0.24668552298606555,0.08544598703842053,-0.09405361742025707,0.1720080561271338,-0.29949125613777],2e-10);
}
#[test] fn numpy_fixture_09_cholesky() {
let a=matrix(3,3,&[6.00960415865627,-1.5556041272066843,-1.0373456763869533,-1.5556041272066843,4.376258684458658,1.5674365793405562,-1.0373456763869533,1.5674365793405562,5.789170923174024]);
let b=matrix(3,2,&[-0.6795376804026221,-1.1282431309459244,-0.35460520961058195,-0.7429218271355347,-0.6775137385750972,0.11312608397717878]);
let x=Cholesky::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[-0.1581794056487555,-0.25080543307989633,-0.09433602432845452,-0.27664437394294206,-0.11983317387629629,0.04950219424290286],2e-10);
}
#[test] fn numpy_fixture_10_qr() {
let a=matrix(6,3,&[-1.083825963423345,-0.33792785048050406,-0.6257203671672478,0.4779302818343571,0.6929088358055573,-0.289936200215876,1.063438803767313,0.7607632642778244,-0.19883481591016716,0.813543437431755,-1.5792381424509123,0.9719317712116603,-1.7751559064957214,1.4974453979162963,1.6195337111091768,0.15543792606623155,0.05825807547474478,1.237083795237941]);
let b=matrix(6,2,&[-0.5661786693781415,-0.28686763459800985,0.23428074059041928,1.0832180211726676,0.8172733795859007,-1.0574049775469232,0.20012539216591943,-0.3710531593250717,1.5037435253832387,-0.45120105974335806,0.9698149461342226,-1.043965894648364]);
let x=Qr::factor(a.view(),Default::default()).unwrap().least_squares(b.view()).unwrap().solution;
close(x.values(),&[0.24447192219731897,-0.10084434249707919,0.5052096206923586,0.0014819653398189803,0.6984930722097988,-0.4393479856503356],2e-10);
}
#[test] fn numpy_fixture_11_eigen() {
let a=matrix(3,3,&[1.6011770002633818,-0.32884995394783273,1.0054383962578313,-0.32884995394783273,0.23407334630426488,0.11500395594627993,1.0054383962578313,0.11500395594627993,-0.3950085356442926]);
let result=symmetric_eigen(a.view(),Default::default()).unwrap();
close(&result.values,&[-0.8639650695442582,0.24711209027701758,2.057094790190595],2e-10);
let av=multiply(&a,&result.vectors); let n=a.rows(); for i in 0..n{for j in 0..n{assert!((av.data[i*n+j]-result.vectors.data[i*n+j]*result.values[j]).abs()<1e-9);}}
}
#[test] fn numpy_fixture_12_lu() {
let a=matrix(5,5,&[-1.7057182225281122,1.030367515136487,0.8057247725755751,0.1665355018855121,8.524670011260808,1.8968392300430503,-0.27626479734604664,0.01571252732187458,8.78777457788248,0.5716268378534324,-1.4485126837989746,-0.4998926338119353,10.053777261681558,1.3872962868882375,1.94527625278528,-1.5683652506832872,10.211919674644538,0.4005974309340407,0.12930595333173422,-0.4888566736297555,9.007301396160582,0.1546932869316854,-1.6581738263309238,-0.9644946231521772,0.08592551464896243]);
let b=matrix(5,2,&[0.2711658221361614,1.5981539074111262,1.325931413820567,-0.8827898458345245,-2.979211976411336,2.3522738062461426,0.20022369865038384,-1.6420251040964529,0.055995601850662234,-1.1094554441958142]);
let x=Lu::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[-0.038931443578827704,-0.09697454120118595,0.02699742137338889,-0.17369184990043515,-0.33182170921117654,0.19123770385333552,0.15753895138483012,-0.09657220818208036,0.04904161987748664,0.17287553053787466],2e-10);
}
#[test] fn numpy_fixture_13_cholesky() {
let a=matrix(5,5,&[12.033245879532146,-6.025106310978179,0.8155022629790735,0.021573119332108225,-0.38321986863431157,-6.025106310978179,14.629972805835765,-0.36902195975223395,3.162300683423485,-2.601228532941306,0.8155022629790735,-0.36902195975223395,7.804797612822705,2.119450502798967,-1.5844178903617603,0.021573119332108225,3.162300683423485,2.119450502798967,11.446181672730095,-3.400515038439273,-0.38321986863431157,-2.601228532941306,-1.5844178903617603,-3.400515038439273,10.54994975598726]);
let b=matrix(5,2,&[1.5169309168485627,-0.10373803255931366,0.5262412206882439,0.02010989232947906,0.7914060083213547,-0.43158178734006347,-0.17838026526967307,-0.3990886395955963,-0.7108128242909205,-0.08047340877777362]);
let x=Cholesky::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.17932561560751584,-0.005827394493897786,0.12253352901551262,0.0002266781452428828,0.10203613902464571,-0.0509568638455922,-0.08097622197582276,-0.033252895554989656,-0.04142644847389544,-0.026154710209353157],2e-10);
}
#[test] fn numpy_fixture_14_qr() {
let a=matrix(8,5,&[-0.8367358043964047,1.0953431663233382,-0.07254972096751712,0.1974773826186469,0.8730093891030618,1.0996222165323983,-0.09400241414265721,1.2977641578905192,1.1673549305029818,0.7975692738206519,1.2435662645243262,0.06152172189383744,-0.1406743939666183,-1.4594894294165999,0.5246382181449722,-0.8662484051741901,-1.2385432228990425,-1.5741743911810093,1.1519137807053306,-0.632114120398742,-0.37747777645104513,0.4629679396055614,-0.61530263870014,0.11331292849743253,0.6016572228081076,0.0980018685968253,0.5055809163351652,1.2128746377484405,-0.4238138337820605,0.4067997847192495,2.0400997375399275,0.8002688748904185,-0.3076203891402818,1.1981414042969363,0.16148792576625687,1.711666032746244,0.5777668543674558,2.008708366929634,0.7166686563179655,0.5082712598386047]);
let b=matrix(8,2,&[-0.016294510818463278,-2.6681720011473864,-0.1445380618991189,0.258411977011842,-0.7663946189051597,0.45732273457546535,2.6141057025585313,1.0423523350514485,-0.26402942813697117,-0.19024640321491698,1.6574243644026676,0.5191208163175832,1.3366506474569182,0.4887977093321885,0.10973003043865683,0.1742606172412508]);
let x=Qr::factor(a.view(),Default::default()).unwrap().least_squares(b.view()).unwrap().solution;
close(x.values(),&[0.015066221761184122,0.6263792965095178,0.019820298750664076,-0.995992954636852,-0.1477199916798163,0.04437296559275058,0.7086711934267739,-0.08499772864169378,-0.376970448704125,-0.44697230046615444],2e-10);
}
#[test] fn numpy_fixture_15_eigen() {
let a=matrix(5,5,&[-1.0470239209662582,-0.4699259287823457,1.582046283920214,0.12520497724070517,0.8144260886677798,-0.4699259287823457,1.854343952834897,-0.6919115557255477,-0.49864911283503616,-0.40018770396014025,1.582046283920214,-0.6919115557255477,1.056512496787805,0.09719751870772195,-1.581853384304805,0.12520497724070517,-0.49864911283503616,0.09719751870772195,1.1962201531997099,0.6065965777552931,0.8144260886677798,-0.40018770396014025,-1.581853384304805,0.6065965777552931,-0.7399808874289359]);
let result=symmetric_eigen(a.view(),Default::default()).unwrap();
close(&result.values,&[-2.998639207689394,-0.3636509529314238,0.8258071367932635,1.9980228855468505,2.8585319327079226],2e-10);
let av=multiply(&a,&result.vectors); let n=a.rows(); for i in 0..n{for j in 0..n{assert!((av.data[i*n+j]-result.vectors.data[i*n+j]*result.values[j]).abs()<1e-9);}}
}
#[test] fn numpy_fixture_16_lu() {
let a=matrix(8,8,&[-1.3370878377048598,-0.5763151457624169,0.41579064138278393,1.4076750058657796,0.004449098915787962,1.1746380776105878,0.3424219398774429,16.002610024525485,0.2143304230901775,0.10251936905047541,-2.631852817663464,0.839877452917896,-0.299291110757346,-0.11848045355656683,16.41197062449268,-0.4828108902538219,0.3232918495840813,0.5528224993251442,-1.3463235956538122,1.1014567723180915,-0.33534090931112254,17.377009153786968,-1.2871772989568413,1.1396038755205717,-0.9342375376913228,-0.5012304492400967,-0.9439995958792754,0.3508665089474215,15.56913728695487,-0.10685151290623236,1.750115375797649,-1.0652525165892046,0.39418829776355574,-0.19597680427560046,0.5864934375893592,14.97360463186516,0.9348360752155044,0.1834090525537017,2.507893134143283,-0.5279255025571366,-0.27066281428845607,-1.2828116313625217,15.859553900835207,1.2093396044003712,0.40644818875834215,0.5418128686379259,-1.6529566749038807,-0.3817749007994213,-0.4807210224341987,16.462693909698622,-2.2271077772150014,-0.5045143417137984,-1.7446067220824701,-1.1533871344149684,2.2181330577146583,0.11418505580823564,17.167158775936176,0.5208780945986576,-0.2475424046007095,0.7853846560257021,0.2733794910951527,0.034271596576557546,-0.015816045860055708,-0.35899420158815787]);
let b=matrix(8,2,&[-1.025529938632796,1.3574210066077663,0.2499296248649294,0.6045964116496683,1.1220462657886932,1.3754410973639788,0.7546357854600426,-1.2888435849311852,-0.893015409855768,-0.6955712607889473,0.8379705600462252,-0.7065031097935693,-0.41328720466623253,1.14457550129004,0.3872010344277502,-0.7785597378447502]);
let x=Lu::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.02483010714707903,-0.042615110207182255,-0.011674065937758058,0.053699271150484604,0.055229670267576345,-0.03247385806406021,-0.0733768146985418,-0.04217135955433417,0.04771284547818159,-0.08252265072065573,0.0805346421771437,0.07407711937703584,0.027160075605765246,0.03544015334866179,-0.06391723962394048,0.08157871232781902],2e-10);
}
#[test] fn numpy_fixture_17_cholesky() {
let a=matrix(8,8,&[14.987324347027727,0.1720651648200264,-0.31372928498969366,-0.3091366896773496,2.4203318789629944,-0.6466074817115035,-2.0795831748908475,-3.109782174703559,0.1720651648200264,15.803494260095583,-0.8912854691521385,-1.5265895923979005,-3.1504576301451785,3.0461751280419764,5.5448388897898,-0.5032752765908929,-0.31372928498969366,-0.8912854691521385,13.199121075486419,-2.7164674368466457,-2.009664423747584,0.23161752804778227,1.0435216106538259,-1.577593630976874,-0.3091366896773496,-1.5265895923979005,-2.7164674368466457,16.428865944032722,-6.082560205975492,-4.5855330483042,3.1172005436240884,-1.2207518515917075,2.4203318789629944,-3.1504576301451785,-2.009664423747584,-6.082560205975492,38.3657378297306,3.001606744376544,-11.349773884732924,8.679225304134954,-0.6466074817115035,3.0461751280419764,0.23161752804778227,-4.5855330483042,3.001606744376544,16.19176916833532,-2.373020016386326,2.8013897130457805,-2.0795831748908475,5.5448388897898,1.0435216106538259,3.1172005436240884,-11.349773884732924,-2.373020016386326,18.70972559552702,-2.941465727182764,-3.109782174703559,-0.5032752765908929,-1.577593630976874,-1.2207518515917075,8.679225304134954,2.8013897130457805,-2.941465727182764,14.065499699830514]);
let b=matrix(8,2,&[0.4229904270021291,1.4611659350653494,0.02724185201527629,-0.3096872325149164,-1.8187904166262208,-0.34278480991988697,0.8172864932034031,0.31368819410989807,-0.5116928929631296,-0.03270297025024536,2.249805124816329,0.24243450524299567,-0.48326477881310165,0.9373686573228456,2.1944205983342835,0.7992453602223029]);
let x=Cholesky::factor(a.view(),Default::default()).unwrap().solve(b.view()).unwrap();
close(x.values(),&[0.08152500373855978,0.13617841599373234,-0.0354334967046165,-0.061094643525042236,-0.11821417164453689,-0.023256688648742346,0.057575339641091954,0.0060483001269247974,-0.07222858910757972,-0.012157975388776264,0.14851183277574126,0.032394833948889555,-0.0062302050775164455,0.09670608533115939,0.17819678458178473,0.10393558258154542],2e-10);
}
#[test] fn numpy_fixture_18_qr() {
let a=matrix(11,8,&[-0.4694869691310574,-0.008167207573755768,-0.8892489421056792,0.7402193781520621,0.5947870946140601,-0.279925426681729,-1.4122865639615552,1.514218251379215,2.893239015723974,-1.1107052869235856,0.8132748335623082,-0.7287393150046084,0.30338910570171945,0.840615141971311,0.5489604688300067,0.7004798316023577,0.2759114351931872,0.20357351287413283,-1.6242129539197745,0.6105637977981329,-1.2067697082778601,0.6881561736576285,1.1151623861751965,2.248864073133639,-0.2595554164284248,0.12239216224842356,-0.8920043882790473,-0.7836786135648304,-0.31180901742016515,-1.856948490185749,-0.06585948983140555,-2.1647187894165776,-0.2694318051368193,0.906278021715851,-0.05478069108194342,-0.20299501470744574,0.08129264766734867,0.3199552517696913,0.6371881266471232,-1.3169605391756223,-0.7982669363870033,0.5033020481209082,1.2079564527810174,-0.6595664263906581,-0.7840547254941675,0.6710836101414909,0.6360893092941868,1.06300749924174,-0.5232914359865898,0.8390832159822837,-0.4453807530208679,-0.4587389220868953,0.7478511193061116,-0.8947638215258162,-0.14037017759050982,0.5913764875177624,-0.6276411631823495,-0.22548510727252116,1.0026686242827458,-2.2962852582039552,-0.11502272060323211,-1.105803226698607,0.12414970358930645,-0.19775960999644057,-1.637696209131053,0.4207576980881389,-0.00020698687174513066,0.48385386220031673,0.09474547538434468,-1.3120825257822533,-1.6343458931329131,-1.1827175865534516,-0.11760965122645005,-0.5863849432948799,0.3522195475339481,1.1561605376569313,-2.694186139738388,-0.4862115883325624,-0.1958583615407907,-0.38428942543377725,-1.7335297302531754,0.6634368444876433,2.0222124267850217,0.9569410262915344,0.6664756295192941,1.2805239917926328,-0.04085907610217194,-0.21620460910471914]);
let b=matrix(11,2,&[1.676133236268218,-0.5173726745833221,-0.46388166465866953,0.5145671613223065,1.4462365742844465,0.11566013432358169,1.1055986549756067,-0.5217774174282842,0.17033919279627208,-0.9502136895260295,0.3886984729565757,-1.482429156913355,-0.8243612665719667,0.47698967148819527,-0.37133594452952606,0.13531526253905352,-0.24187098535661095,3.0765820172964964,0.2855915689338924,-0.39853340590547015,-0.7829657641607922,0.8062136057711103]);
let x=Qr::factor(a.view(),Default::default()).unwrap().least_squares(b.view()).unwrap().solution;
close(x.values(),&[-0.29492999999509584,0.05118204145582884,-0.11347541721055437,-0.23442031103603495,-1.0299884795625234,0.5488051329393152,-0.791809648147834,0.8302888919693485,-0.6603783926214106,0.5943618255183096,1.1359023934623826,-1.0408305532097706,-0.9133751835341141,0.21969146811144355,-0.1350939435152614,0.19453238468207656],2e-10);
}
#[test] fn numpy_fixture_19_eigen() {
let a=matrix(8,8,&[1.2757527564543634,-0.5618937711463526,-1.3273585901174623,-1.7011230230072447,-0.9801187084575715,0.011060371792734697,-0.12822380409656778,0.35709374150432793,-0.5618937711463526,0.1365877562841058,0.23326440593890393,-0.6672357764432233,-0.5039035261727902,-0.4129252232958026,0.46047374162638677,0.4676178425614704,-1.3273585901174623,0.23326440593890393,1.6775246127691104,-0.12443689933180037,-0.3256975953773268,1.7331815396536427,-0.03986072007856539,-0.6456894569476821,-1.7011230230072447,-0.6672357764432233,-0.12443689933180037,0.1859324705056236,0.8709619427452566,0.3337507461951352,0.7241129752480945,-0.7934684308376515,-0.9801187084575715,-0.5039035261727902,-0.3256975953773268,0.8709619427452566,-0.9747663981521422,-0.523263642080992,-0.12978254808919729,0.12603571018146578,0.011060371792734697,-0.4129252232958026,1.7331815396536427,0.3337507461951352,-0.523263642080992,0.22259571084117952,-0.7964820005587474,-0.4729950461687768,-0.12822380409656778,0.46047374162638677,-0.03986072007856539,0.7241129752480945,-0.12978254808919729,-0.7964820005587474,-0.29857274536268924,-0.41362859445691325,0.35709374150432793,0.4676178425614704,-0.6456894569476821,-0.7934684308376515,0.12603571018146578,-0.4729950461687768,-0.41362859445691325,0.7849971813445019]);
let result=symmetric_eigen(a.view(),Default::default()).unwrap();
close(&result.values,&[-2.2327707554133367,-1.8249491849783437,-0.8748305119691947,-0.6832016831398594,0.6371456480851814,1.3777355477744249,2.542284435119643,4.068637849205539],2e-10);
let av=multiply(&a,&result.vectors); let n=a.rows(); for i in 0..n{for j in 0..n{assert!((av.data[i*n+j]-result.vectors.data[i*n+j]*result.values[j]).abs()<1e-9);}}
}