// Test libstd linear algebra matinv(), solve(), svd() externs
#include "libstd.oah"
proc main()
{
var a, udv, inv, b, x, zero;
using namespace linalg;
a = [[7,9,8],[3,4,5],[6,2,1]];
b = [1,2,3];
zero = 0 .reshape(3,3);
// Test int=>float
io::FltFormatChar = 'F';
io::FieldWidth = 8;
io::NumDigits = 5;
inv = matinv(a);
"Int inverse:\n", inv, '\n';
udv = svd(a);
"Int U:\n", udv[0], '\n';
"Int D: ", udv[1], '\n';
"Int V:\n", udv[2], '\n';
x = solve(a, b);
"Int X: ", x, '\n';
inv = matinv(udv);
"Int UDV inverse:\n", inv, '\n';
x = solve(udv, b);
"Int UDV X: ", x, '\n';
// Next, test Double=>Double
io::FieldWidth = 15;
io::NumDigits = 12;
inv = matinv(Double(a));
"Double inverse:\n", inv, '\n';
udv = svd(Double(a));
"Double U:\n", udv[0], '\n';
"Double D: ", udv[1], '\n';
"Double V:\n", udv[2], '\n';
x = solve(Double(a),Double(b));
"Double X: ", x, '\n';
inv = matinv(udv);
"Double UDV inverse:\n", inv, '\n';
x = solve(udv, b);
"Double UDV X: ", x, '\n';
// Test errors
try { inv = matinv(zero); } catch (e) { "Zero inv: ", e, '\n'; }
try { udv = svd(zero); } catch (e) { "Zero svd: ", e, '\n'; }
try { x = solve(zero,b); } catch (e) { "Zero solve: ", e, '\n'; }
}