| Index: icu46/source/test/perf/perldriver/Dataset.pm
|
| ===================================================================
|
| --- icu46/source/test/perf/perldriver/Dataset.pm (revision 0)
|
| +++ icu46/source/test/perf/perldriver/Dataset.pm (revision 0)
|
| @@ -0,0 +1,139 @@
|
| +#!/usr/local/bin/perl
|
| +# ********************************************************************
|
| +# * COPYRIGHT:
|
| +# * Copyright (c) 2002, International Business Machines Corporation and
|
| +# * others. All Rights Reserved.
|
| +# ********************************************************************
|
| +
|
| +package Dataset;
|
| +use Statistics::Descriptive;
|
| +use Statistics::Distributions;
|
| +use strict;
|
| +
|
| +# Create a new Dataset with the given data.
|
| +sub new {
|
| + my ($class) = shift;
|
| + my $self = bless {
|
| + _data => \@_,
|
| + _scale => 1.0,
|
| + _mean => 0.0,
|
| + _error => 0.0,
|
| + }, $class;
|
| +
|
| + my $n = @_;
|
| +
|
| + if ($n >= 1) {
|
| + my $stats = Statistics::Descriptive::Full->new();
|
| + $stats->add_data(@{$self->{_data}});
|
| + $self->{_mean} = $stats->mean();
|
| +
|
| + if ($n >= 2) {
|
| + # Use a t distribution rather than Gaussian because (a) we
|
| + # assume an underlying normal dist, (b) we do not know the
|
| + # standard deviation -- we estimate it from the data, and (c)
|
| + # we MAY have a small sample size (also works for large n).
|
| + my $t = Statistics::Distributions::tdistr($n-1, 0.005);
|
| + $self->{_error} = $t * $stats->standard_deviation();
|
| + }
|
| + }
|
| +
|
| + $self;
|
| +}
|
| +
|
| +# Set a scaling factor for all data; 1.0 means no scaling.
|
| +# Scale must be > 0.
|
| +sub setScale {
|
| + my ($self, $scale) = @_;
|
| + $self->{_scale} = $scale;
|
| +}
|
| +
|
| +# Multiply the scaling factor by a value.
|
| +sub scaleBy {
|
| + my ($self, $a) = @_;
|
| + $self->{_scale} *= $a;
|
| +}
|
| +
|
| +# Return the mean.
|
| +sub getMean {
|
| + my $self = shift;
|
| + return $self->{_mean} * $self->{_scale};
|
| +}
|
| +
|
| +# Return a 99% error based on the t distribution. The dataset
|
| +# is desribed as getMean() +/- getError().
|
| +sub getError {
|
| + my $self = shift;
|
| + return $self->{_error} * $self->{_scale};
|
| +}
|
| +
|
| +# Divide two Datasets and return a new one, maintaining the
|
| +# mean+/-error. The new Dataset has no data points.
|
| +sub divide {
|
| + my $self = shift;
|
| + my $rhs = shift;
|
| +
|
| + my $minratio = ($self->{_mean} - $self->{_error}) /
|
| + ($rhs->{_mean} + $rhs->{_error});
|
| + my $maxratio = ($self->{_mean} + $self->{_error}) /
|
| + ($rhs->{_mean} - $rhs->{_error});
|
| +
|
| + my $result = Dataset->new();
|
| + $result->{_mean} = ($minratio + $maxratio) / 2;
|
| + $result->{_error} = $result->{_mean} - $minratio;
|
| + $result->{_scale} = $self->{_scale} / $rhs->{_scale};
|
| + $result;
|
| +}
|
| +
|
| +# subtracts two Datasets and return a new one, maintaining the
|
| +# mean+/-error. The new Dataset has no data points.
|
| +sub subtract {
|
| + my $self = shift;
|
| + my $rhs = shift;
|
| +
|
| + my $result = Dataset->new();
|
| + $result->{_mean} = $self->{_mean} - $rhs->{_mean};
|
| + $result->{_error} = $self->{_error} + $rhs->{_error};
|
| + $result->{_scale} = $self->{_scale};
|
| + $result;
|
| +}
|
| +
|
| +# adds two Datasets and return a new one, maintaining the
|
| +# mean+/-error. The new Dataset has no data points.
|
| +sub add {
|
| + my $self = shift;
|
| + my $rhs = shift;
|
| +
|
| + my $result = Dataset->new();
|
| + $result->{_mean} = $self->{_mean} + $rhs->{_mean};
|
| + $result->{_error} = $self->{_error} + $rhs->{_error};
|
| + $result->{_scale} = $self->{_scale};
|
| + $result;
|
| +}
|
| +
|
| +# Divides a dataset by a scalar.
|
| +# The new Dataset has no data points.
|
| +sub divideByScalar {
|
| + my $self = shift;
|
| + my $s = shift;
|
| +
|
| + my $result = Dataset->new();
|
| + $result->{_mean} = $self->{_mean}/$s;
|
| + $result->{_error} = $self->{_error}/$s;
|
| + $result->{_scale} = $self->{_scale};
|
| + $result;
|
| +}
|
| +
|
| +# Divides a dataset by a scalar.
|
| +# The new Dataset has no data points.
|
| +sub multiplyByScalar {
|
| + my $self = shift;
|
| + my $s = shift;
|
| +
|
| + my $result = Dataset->new();
|
| + $result->{_mean} = $self->{_mean}*$s;
|
| + $result->{_error} = $self->{_error}*$s;
|
| + $result->{_scale} = $self->{_scale};
|
| + $result;
|
| +}
|
| +
|
| +1;
|
|
|