#!/usr/bin/perl -w
#                              -*- Mode: Perl -*- 
# $Basename$
# $Revision: 1.3 $
# Author          : Ulrich Pfeifer
# Created On      : Mon Apr 16 11:12:57 2001
# Last Modified By: Ulrich Pfeifer
# Last Modified On: Wed Oct 24 09:30:58 2001
# Language        : CPerl
# 
# (C) Copyright 2001, UUNET Deutschland GmbH, Germany
# 

use strict;
use Test;
BEGIN { plan tests => 11};

use Math::Matrix;

my $A = new Math::Matrix ([rand,rand,rand],
                          [rand,rand,rand],
                          [rand,rand,rand]);

my $B = $A->multiply_scalar(-2);

ok($B);

my $C = $A->add($B)->multiply_scalar(-1);

ok($C->equal($A));

my $l = $A->slice(0);
my $R = $A->slice(1,2);
my $D = $l->concat($R);

ok($D->equal($A));

my $v = new Math::Matrix ([rand,rand,rand]);
my $M = $A->concat($v->transpose);
my $x = $M->solve;

my $d = $A->determinant;
my $F = $v->transpose->concat($R);
my $e = $F->determinant;

#$x->transpose->print("The solution x");

ok(abs($e/$d-$x->[0][0]) < 0.000001);

ok(abs($A->transpose->slice(0)->dot_product($x)-$v->[0][0]) < 0.000001);

ok($x->absolute);

ok(abs($x->normalize->absolute-1) < 0.000001);

my $t = $R->transpose->cross_product();
ok($t);
my $o = $t->multiply($R);
ok($o->absolute < 0.000001);

my $E = Math::Matrix->new_identity(3);
my $G = $A->multiply($E);
ok($A->equal($G));

my $Ai = $A->invert;
my $P  = $A->multiply($Ai);
ok($P->equal($E));
