r76825 - in /branches/upstream/libmath-vecstat-perl/current: MANIFEST Makefile.PL README VecStat.pm t/ t/VecStat.t

gregoa at users.alioth.debian.org gregoa at users.alioth.debian.org
Thu Jun 30 16:43:06 UTC 2011


Author: gregoa
Date: Thu Jun 30 16:43:04 2011
New Revision: 76825

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=76825
Log:
Load /tmp/tmp.o8qYoIkln4/to_upload/Math-VecStat-0.08 into
branches/upstream/libmath-vecstat-perl/current.

Added:
    branches/upstream/libmath-vecstat-perl/current/MANIFEST
    branches/upstream/libmath-vecstat-perl/current/Makefile.PL
    branches/upstream/libmath-vecstat-perl/current/README
    branches/upstream/libmath-vecstat-perl/current/VecStat.pm
    branches/upstream/libmath-vecstat-perl/current/t/
    branches/upstream/libmath-vecstat-perl/current/t/VecStat.t

Added: branches/upstream/libmath-vecstat-perl/current/MANIFEST
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libmath-vecstat-perl/current/MANIFEST?rev=76825&op=file
==============================================================================
--- branches/upstream/libmath-vecstat-perl/current/MANIFEST (added)
+++ branches/upstream/libmath-vecstat-perl/current/MANIFEST Thu Jun 30 16:43:04 2011
@@ -1,0 +1,5 @@
+MANIFEST
+Makefile.PL
+VecStat.pm
+README
+t/VecStat.t

Added: branches/upstream/libmath-vecstat-perl/current/Makefile.PL
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libmath-vecstat-perl/current/Makefile.PL?rev=76825&op=file
==============================================================================
--- branches/upstream/libmath-vecstat-perl/current/Makefile.PL (added)
+++ branches/upstream/libmath-vecstat-perl/current/Makefile.PL Thu Jun 30 16:43:04 2011
@@ -1,0 +1,12 @@
+use ExtUtils::MakeMaker;
+use Config;
+
+$Version = '0.08';
+
+WriteMakefile(
+               'NAME'     => 'Math::VecStat',
+               'LINKTYPE' => '$(INST_PM)',,
+               'VERSION'  => $Version,
+               'dist'     => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
+               'clean' 	  => {'FILES' => '*~'},
+);

Added: branches/upstream/libmath-vecstat-perl/current/README
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libmath-vecstat-perl/current/README?rev=76825&op=file
==============================================================================
--- branches/upstream/libmath-vecstat-perl/current/README (added)
+++ branches/upstream/libmath-vecstat-perl/current/README Thu Jun 30 16:43:04 2011
@@ -1,0 +1,25 @@
+Perl Module Math::VecStat - 0.05
+
+Some basic statistics on vectors (min,max,average,....).
+
+     Copyright (c) 1995,1996,1997 John A.R. Williams
+     Copyright (c) 2000 Andrea Spinelli
+     All rights reserved.
+     This program is free software; you can redistribute it and/or
+     modify it under the same terms as Perl itself.
+
+To install, unzip and untar the archive. In the directory created type
+
+	perl Makefile.PL
+	make install
+
+To execute tests:
+
+	perl Makefile.PL
+	make test
+
+Documentation is in the module file and will be added onto
+perllocal.pod as usual.
+
+You may contact Andrea Spinelli, who is currently maintaining
+the archive, at spinellia at acm.org

Added: branches/upstream/libmath-vecstat-perl/current/VecStat.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libmath-vecstat-perl/current/VecStat.pm?rev=76825&op=file
==============================================================================
--- branches/upstream/libmath-vecstat-perl/current/VecStat.pm (added)
+++ branches/upstream/libmath-vecstat-perl/current/VecStat.pm Thu Jun 30 16:43:04 2011
@@ -1,0 +1,347 @@
+
+require Exporter;
+package Math::VecStat;
+ at Math::VecStat::ISA=qw(Exporter);
+ at EXPORT_OK=qw(max min maxabs minabs sum average
+	vecprod ordered convolute
+	sumbyelement diffbyelement
+	allequal median);
+$Math::VecStat::VERSION = '0.08';
+
+use strict;
+
+sub max {
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  my $i=$#{$v};
+  my $j=$i;
+  my $m=$v->[$i];
+  while (--$i >= 0) { if ($v->[$i] > $m) { $m=$v->[$i]; $j=$i; }}
+  return wantarray ? ($m,$j): $m;
+}
+
+sub min {
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  my $i=$#{$v};
+  my $j=$i;
+  my $m=$v->[$i];
+  while (--$i >= 0) { if ($v->[$i] < $m) { $m=$v->[$i]; $j=$i; }}
+  return wantarray ? ($m,$j): $m;
+}
+
+sub maxabs {
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  my $i=$#{$v};
+  my $j=$i;
+  my $m=abs($v->[$i]);
+  while (--$i >= 0) { if (abs($v->[$i]) > $m) { $m=abs($v->[$i]); $j=$i}}
+  return (wantarray ? ($m,$j) : $m);
+}
+
+sub minabs {
+   my $v=ref($_[0]) ? $_[0] : \@_;
+   my $i=$#{$v};
+   my $j=$i;
+   my $m=abs($v->[$i]);
+   while (--$i >= 0) { if (abs($v->[$i]) < $m) { $m=abs($v->[$i]); $j=$i}}
+   return (wantarray ? ($m,$j) : $m);
+}
+
+sub sum {
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  my $s=0;
+  foreach(@{$v}) { $s+=$_; }
+  return $s;
+}
+
+# spinellia at acm.org, handle the empty array case
+sub average {
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  return undef unless $#{$v} >= 0;
+  return $#{$v}==-1 ? 0 : sum($v)/(1+$#{$v});
+}
+
+sub vecprod {
+  my $c = shift;
+  my $v=ref($_[0]) ? $_[0] : \@_;
+  return undef unless $#{$v} >= 0;
+  my @result = map( $_ * $c, @{$v} );
+  return \@result;
+}
+
+sub ordered
+{
+	my $v=ref($_[0]) ? $_[0] : \@_;
+	if( scalar( @{$v} ) < 2 ){ return 1; }
+	for(my $i=0; $i<$#{$v}; $i++ ){
+		return 0 if $v->[$i] > $v->[$i+1];
+	}
+	return 1;
+}
+
+sub allequal
+{
+	my($v,$u) = @_;
+	return undef unless (defined($v) and defined($u)); # this is controversial
+	return undef unless ($#{$v} == $#{$u});
+	my $i= @{$v};
+	while (--$i >= 0) { return 0 unless( $v->[$i] == $u->[$i]); }
+	return 1;
+}
+
+sub sumbyelement
+{
+	my($v,$u) = @_;
+
+	return undef unless ($#{$v} == $#{$u});
+	my @summed;
+	my $i= @{$v};
+	while (--$i >= 0) { $summed[$i] = $v->[$i] + $u->[$i]; }
+	return \@summed;
+}
+
+sub diffbyelement
+{
+	my($v,$u) = @_;
+
+	return undef unless ($#{$v} == $#{$u});
+	my @summed;
+	my $i= @{$v};
+	while (--$i >= 0) { $summed[$i] = $v->[$i] - $u->[$i]; }
+	return \@summed;
+}
+
+sub convolute
+{
+	my($v,$u) = @_;
+
+	return undef unless ($#{$v} == $#{$u});
+	my @conv;
+	my $i= @{$v};
+	while (--$i >= 0) { $conv[$i] = $v->[$i]*$u->[$i]; }
+	return \@conv;
+}
+
+sub _justToAvoidWarnings
+{
+	my $a = $Math::VecStat::VERSION;
+}
+
+sub median
+{
+	my $v=ref($_[0]) ? $_[0] : \@_;
+	my $n = scalar @{$v};
+
+# generate a list of [value,index] pairs
+	my @tras =	map( [$v->[$_],$_], 0..$#{$v} );
+# sort by ascending value, then by original position
+# suggested by david at jamesgang.com
+	my @sorted = sort { ($a->[0] <=> $b->[0])
+		or ($a->[1] <=> $b->[1]) } @tras;
+# find the middle ordinal
+	my $med = int( $n / 2 );
+
+# when there are several identical median values
+# we arbitrarily (but consistently) choose the first one
+# in the original array
+
+	while( ($med >= 1) && ($sorted[$med]->[0] == $sorted[$med-1]->[0]) ){
+		$med--;
+	}
+
+	return $sorted[$med];
+}
+
+
+1;
+
+__END__
+
+# $Id: VecStat.pm,v 1.5 1997/02/26 17:20:37 willijar Exp $
+
+=head1 NAME
+
+    Math::VecStat - Some basic numeric stats on vectors
+
+=head1 SYNOPSIS
+
+    use Math::VecStat qw(max min maxabs minabs sum average);
+    $max=max(@vector);
+    $max=max(\@vector);
+    ($max,$imax)=max(@vector);
+    ($max,$imax)=max(\@vector);
+    $min=min(@vector);
+    $min=min(\@vector);
+    ($max,$imin)=min(@vector);
+    ($max,$imin)=min(\@vector);
+    $max=maxabs(@vector);
+    $max=maxabs(\@vector);
+    ($max,$imax)=maxabs(@vector);
+    ($max,$imax)=maxabs(\@vector);
+    $min=minabs(@vector);
+    $min=minabs(\@vector);
+    ($max,$imin)=minabs(@vector);
+    ($max,$imin)=minabs(\@vector);
+    $sum=sum($v1,$v2,...);
+    $sum=sum(@vector);
+    $sum=sum(\@vector);
+    $average=average($v1,$v2,...);
+    $av=average(@vector);
+    $av=average(\@vector);
+    $ref=vecprod($scalar,\@vector);
+    $ok=ordered(@vector);
+    $ok=ordered(\@vector);
+    $ref=sumbyelement(\@vector1,\@vector2);
+    $ref=diffbyelement(\@vector1,\@vector2);
+    $ok=allequal(\@vector1,\@vector2);
+    $ref=convolute(\@vector1,\@vector2);
+
+=head1 DESCRIPTION
+
+This package provides some basic statistics on numerical
+vectors. All the subroutines can take
+a reference to the vector to be operated
+on. In some cases a copy of the vector is acceptable,
+but is not recommended for efficiency.
+
+=over 5
+
+=item  max(@vector), max(\@vector)
+
+return the maximum value of given values or vector. In an array
+context returns the value and the index in the array where it
+occurs.
+
+=item min(@vector), min(\@vector)
+
+return the minimum value of given values or vector, In an array
+context returns the value and the index in the array where it
+occurs.
+
+
+=item maxabs(@vector), maxabs(\@vector)
+
+return the maximum value of absolute of the given values or vector. In
+an array context returns the value and the index in the array where it
+occurs.
+
+=item minabs(@vector), minabs(\@vector)
+
+return the minimum value of the absolute of the given values or
+vector. In an array context returns the value and the index in the
+array where it occurs.
+
+=item sum($v1,$v2,...), sum(@vector), sum(\@vector)
+
+return the sum of the given values or vector
+
+=item average($v1,$v2,..), average(@vector), average(\@vector)
+
+return the average of the given values or vector
+
+=item vecprod($a,$v1,$v2,..), vecprod($a, at vector), vecprod( $a, \@vector )
+
+return a vector built by multiplying the scalar $a by each element of the
+ at vector.
+
+=item ordered($v1,$v2,..), ordered(@vector), ordered(\@vector)
+
+return nonzero iff the vector is nondecreasing with respect to its index.
+To be used like
+
+  if( ordered( $lowBound, $value, $highBound ) ){
+
+instead of the (slightly) more clumsy
+
+  if( ($lowBound <= $value) && ($value <= $highBound) ) {
+
+=item sumbyelement( \@array1, \@array2 ), diffbyelement(\@array1,\@array2)
+
+return the element-by-element sum or difference of two
+identically-sized vectors. Given
+
+  $s = sumbyelement( [10,20,30], [1,2,3] );
+  $d = diffbyelement( [10,20,30], [1,2,3] );
+
+C<$s> will be C<[11,22,33]>, C<$d> will be C<[9,18,27]>.
+
+=item allequal( \@array1, \@array2 )
+
+returns true if and only if the two arrays are numerically identical.
+
+=item convolute( \@array1, \@array2 )
+
+return a reference to an array containing the element-by-element
+product of the two input arrays. I.e.,
+
+  $r = convolute( [1,2,3], [-1,2,1] );
+
+returns a reference to
+
+  [-1,4,3]
+
+=item median
+
+evaluates the median, i.e. an element which separates the population
+in two halves.  It returns a reference to a list whose first element
+is the median value and the second element is the index of the
+median element in the original vector.
+
+  $a = Math::VecStat::median( [9,8,7,6,5,4,3,2,1] );
+
+returns the list reference
+
+  [ 5, 4 ]
+
+i.e. the median value is 5 and it is found at position 4 of the
+original array.
+
+If there are several elements of the array
+having the median value, e.g. [1,3,3,3,5].  In this case
+we choose always the first element in the original vector
+which is a median. In the example, we return [3,1].
+
+=head1 HISTORY
+
+ $Log: VecStat.pm,v $
+ Revision 1.9  2003/04/20 00:49:00 spinellia at acm.org
+ Perl 5.8 broke test 36, exposing inconsistency in C<median>.  Fixed, thanks to david at jamesgang.com.
+
+ Revision 1.8  2001/01/26 11:10:00 spinellia at acm.org
+ Added function median.
+ Fixed test, thanks to Andreas Marcel Riechert <riechert at pobox.com>
+
+ Revision 1.7  2000/10/24 15:28:00  spinellia at acm.org
+ Added functions allequal diffbyelement
+ Created a reasonable test suite.
+
+ Revision 1.6  2000/06/29 16:06:37  spinellia at acm.org
+ Added functions vecprod, convolute, sumbyelement
+
+ Revision 1.5  1997/02/26 17:20:37  willijar
+ Added line before pod header so pod2man installs man page correctly
+
+ Revision 1.4  1996/02/20 07:53:10  willijar
+ Added ability to return index in array contex to max and min
+ functions. Added minabs and maxabs functions.
+ Thanks to Mark Borges <mdb at cdc.noaa.gov> for these suggestions.
+
+ Revision 1.3  1996/01/06 11:03:30  willijar
+ Fixed stupid bug that crept into looping in min and max functions
+
+ Revision 1.2  1995/12/26 09:56:38  willijar
+ Oops - removed xy data functions.
+
+ Revision 1.1  1995/12/26 09:39:07  willijar
+ Initial revision
+
+=head1 BUGS
+
+Let me know. I welcome any appropriate additions for this package.
+
+=head1 AUTHORS
+
+John A.R. Williams <J.A.R.Williams at aston.ac.uk>
+Andrea Spinelli <spinellia at acm.org>
+
+=cut
+

Added: branches/upstream/libmath-vecstat-perl/current/t/VecStat.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libmath-vecstat-perl/current/t/VecStat.t?rev=76825&op=file
==============================================================================
--- branches/upstream/libmath-vecstat-perl/current/t/VecStat.t (added)
+++ branches/upstream/libmath-vecstat-perl/current/t/VecStat.t Thu Jun 30 16:43:04 2011
@@ -1,0 +1,186 @@
+
+print "1..40\n";
+
+$main::testct = 1;
+
+use Math::VecStat qw(min max ordered allequal
+	minabs maxabs
+	sumbyelement diffbyelement
+	convolute vecprod
+	average median
+);
+# require 'VecStat.pm';
+
+# function t moved here to stop complaints
+# thanks to Andreas Marcel Riechert <riechert at pobox.com>
+
+sub t()
+{
+	printf "%sok %d\n", ($main::ok?'':'not '), $main::testct++;
+}
+
+##################################
+# min (1-5)
+##################################
+
+# basic test
+$main::ok = (Math::VecStat::min( 1, 2, 3 ) == 1 );
+t();
+
+# negative values
+$main::ok = (Math::VecStat::min( 1, 2, -3 ) == -3 );
+t();
+
+# empty arg list
+$main::ok = not defined(Math::VecStat::min());
+t();
+
+# empty array
+$main::ok = not defined(Math::VecStat::min([]));
+t();
+
+# floats
+$main::ok = (abs(Math::VecStat::min( 1.1, 0.5, 3.2 ) - 0.5) < 1e-6 );
+t();
+
+##################################
+# max (6-10)
+##################################
+
+# basic test
+$main::ok = (Math::VecStat::max( 1, 2, 3 ) == 3 );
+t();
+
+# negative values
+$main::ok = (Math::VecStat::max( 1, 2, -3 ) == 2 );
+t();
+
+# empty arg list
+$main::ok = not defined(Math::VecStat::max());
+t();
+
+# empty array
+$main::ok = not defined(Math::VecStat::max([]));
+t();
+
+# floats
+$main::ok = (abs(Math::VecStat::max( 1.1, 0.5, 3.2 ) - 3.2) < 1e-6 );
+t();
+
+##################################
+# ordered (11-15)
+##################################
+
+# basic test
+$main::ok = ordered(1,2,3);
+t();
+
+$main::ok = ordered(1,1,1);
+t();
+
+$main::ok = not ordered(1,2,0);
+t();
+
+$main::ok = ordered( -3.1, -1.9, 0 );
+t();
+
+$main::ok = not ordered( -3.1, -1.9, -5.0 );
+t();
+
+##################################
+# allequal (16-20)
+##################################
+
+$main::ok = allequal( [1,2,3,4,5], [1,2,3,4,5] );
+t();
+
+$main::ok = allequal( [], [] );
+t();
+
+$main::ok = not allequal( [1,2,3,4,5], [1,2,3,4,6] );
+t();
+
+$main::ok = not allequal( [7,2,3,4], [1,2,3,4] );
+t();
+
+$main::ok = not allequal( [1,2,3], [1,2,3,4] );
+t();
+
+##################################
+# {sum,diff}byelement (21-25)
+##################################
+
+$main::ok = allequal( sumbyelement( [10,20,30], [1,2,3] ), [11,22,33] );
+t();
+
+$main::ok = allequal( diffbyelement( [10,20,30], [1,2,3] ), [9,18,27] );
+t();
+
+$main::ok = allequal( sumbyelement( [], [] ), [] );
+t();
+
+$main::ok = (maxabs( diffbyelement( [1.03,1.97,3.01],[1,2,3] ) ) < 0.1 );
+t();
+
+$main::ok = (minabs( diffbyelement( [1.03,1.97,3.01],[1,2,3] ) ) > 1e-3 );
+t();
+
+##################################
+# convolute (26-30)
+##################################
+
+$main::ok = allequal( convolute( [1,2,3], [-1,2,1] ), [-1,4,3]);
+t();
+
+# pro domo sua
+$main::ok = not allequal( [], [1] );
+t();
+
+$main::ok = not allequal( [2], [] );
+t();
+
+$main::ok = allequal( convolute( [], [] ), []);
+t();
+
+$main::ok = (maxabs( diffbyelement( convolute( [1.1,2.2,3.3], [2.0,3.0,4.0] ),
+		[2.2,6.6,13.2] ) ) < 1e-6);
+t();
+
+##################################
+# average (31-35)
+##################################
+
+$main::ok = ( abs( average( 10.1, 4.9, -0.1) - 5.0) < 0.1 );
+t();
+
+$main::ok = not defined( average([]) );
+t();
+
+$main::ok = ( abs( average( [10.1, 4.9, -0.1] ) - 5.0) < 0.1 );
+t();
+
+$main::ok = average( 2.78 ) == 2.78;
+t();
+
+$main::ok = average( 0.0 ) == 0.0;
+t();
+
+my $a = median( [1,1,2,3,4,3,2,3,4,5] );
+$main::ok = ($a->[0] == 3) && ($a->[1] == 3);
+t();
+
+$a = median( [1,1,2,4,3,3,2,3,4,5] );
+$main::ok = ($a->[0] == 3) && ($a->[1] == 4);
+t();
+
+$a = median( [1,3,3,3,5] );
+$main::ok = ($a->[0] == 3) && ($a->[1] == 1);
+t();
+
+$a = median( [1,2,2,3] );
+$main::ok = ($a->[0] == 2) && ($a->[1] == 1);
+t();
+
+$a = median( [4,4,4,4] );
+$main::ok = ($a->[0] == 4) && ($a->[1] == 0);
+t();




More information about the Pkg-perl-cvs-commits mailing list