# this works as a bash include
#
#PRIO 1.1
#COMM Math::GeometNdPoint->dependent()
#COMM - try to trick it by inaccuracies in floating point arithmetics
#
perl -e '
  use lib shift();  # give include precedence to code directory, perl -I would not work!
  use strict;
  use MainLib::Data;
  use Math::GeometNdPoint;
  use Math::GeometNdTrform;
  use Math::Analysis;
  my $ndim=3;
  my @pt = map{ Math::GeometNdPoint->new($ndim,$_) }
    [  0,    1,    0 ],
    [  0.24, 0.26, 0.24 ],
    [  0,    0,    0 ],
    ;
  my $pi=3.14159265358979;
  my $pTrf = Math::GeometNdTrform->new_rotate($ndim,0,1,$pi/4);
  $pTrf->append( Math::GeometNdTrform->new_rotate($ndim,1,2,$pi/6) );

  my $bIndep;
  printf "  argument points: %s\n",
    join(q( ), map{ $_->string(-fmtfloat=>q(%.2f)) } @pt);
  my @vec = &geometnd_pts2vects(@pt,$pt[0]);
  printf "  argument vectors: %s\n",
    join(q( ), map{ $_->string(-label=>q(vector),-fmtfloat=>q(%.2f)) } @vec);
  $bIndep = &independent(@vec);
  printf "  independent (naive): %s %s\n", $bIndep, $bIndep?q(YES):q(NO);
  $bIndep = !&geometnd_dependent(@vec);
  printf "  independent (method): %s\n", $bIndep?q(YES):q(NO);

  foreach my $pPt (@pt){ $pPt->transform($pTrf) }
  printf "  argument points: %s\n",
    join(q( ), map{ $_->string(-fmtfloat=>q(%.2f)) } @pt);
  my @vec = &geometnd_pts2vects(@pt,$pt[0]);
  printf "  argument vectors: %s\n",
    join(q( ), map{ $_->string(-label=>q(vector),-fmtfloat=>q(%.2f)) } @vec);
  $bIndep = &independent(@vec);
  printf "  independent (naive): %s\n", $bIndep?q(YES):q(NO);
  $bIndep = !&geometnd_dependent(@vec);
  printf "  independent (method): %s\n", $bIndep?q(YES):q(NO);

  # determine independency for a set of vectors
  sub independent {
    my (@ArgVec) = @_;
    # construct matrix for determinant analysis
    my @WorkVec;
    foreach my $pVec (@ArgVec) {
      push @WorkVec, [ $pVec->coord() ];
    }
    return &determinant(\@WorkVec);
  }
  ' -- "$dircode"
