NAME

Number::Interval - Implement a representation of a numeric interval

SYNOPSIS

use Number::Interval;

$i = new Number::Interval( Min => -4, Max => 20);
$i = new Number::Interval( Min => 0 );

$is = $i->contains( $value );
$status = $i->intersection( $i2 );

print "$i";

DESCRIPTION

Simple class to implement a closed or open interval. Can be used to compare different intervals, determine set membership, calculate intersections and provide default stringification methods.

Intervals can be bound or unbound. If max is less than min the interval is inverted.

METHODS

Constructor

new

Create a new object. Can be populated when supplied with keys Max and Min.

$r = new Number::Interval();

This interval is Inf.

$r = new Number::Interval( Max => 5 );

This interval is > 5.

$r = new Number::Interval( Max => 5, Min => 22 );

This interval is > 22 and < 5.

By default the interval does not include the bounds themselves. They can be included by using the IncMax and IncMin keys.

$r = new Number::Interval( Max => 5, IncMax => 1 );

The above interval is >=5

Positive-definite intervals allow the stringification to ignore the lower bound if it is 0 (even if set explicitly).

$r = new Number::Interval( Max => 5, IncMax => 1, Min => 0, 
                           PosDef => 1);

The keys are case-insensitive.

copy

Copy the contents of the current object into a new object and return it.

$new = $r->copy;

Accessors

max

Return (or set) the upper end of the interval.

$max = $r->max;
$r->max(22.0);

undef indicates that the interval has no upper bound.

min

Return (or set) the lower end of the interval.

$min = $r->min;
$r->min( undef );

undef indicates that the interval has no lower bound.

inc_max

Return (or set) the boolean indicating whether the maximum bound of the interval should be included in the bound definition. If true, the bounds will be >= max.

$inc = $r->inc_max;
$r->inc_max( 1 );

Default is false (not included).

inc_min

Return (or set) the boolean indicating whether the minimum bound of the interval should be included in the bound definition. If true, the bounds will be <= min.

$inc = $r->inc_min;
$r->inc_min( 1 );

Default is false (not included).

pos_def

Indicate that the interval is positive definite. This helps the stringification method to determine whether the lower bound should be included

$r->pos_def( 1 );

If set to true, automatically sets the lower bound to 0 if the lower bound is not explicitly defined.

minmax

Return (or set) the minimum and maximum values of the interval as an array.

$r->minmax( 1, 5 );
@interval = $r->minmax;

Returns reference to an array in a scalar context.

minmax_hash

Return (or set) the minimum and maximum values of the interval as an hash.

$r->minmax_hash( min => 1, max => 5 );
%interval = $r->minmax_hash;

Returns reference to an hash in a scalar context.

min or max can be ommitted. The returned hash contains min and max keys but only if they have defined values.

sizeof

Returns the size of the interval.

$sizeof = $r->sizeof;

If either of the lower or upper ends are unbounded, then undef will be returned.

General

stringify

Convert the object into a string representation for display. Usually called via a stringify overload.

isinverted

Determine whether the interval is inverted. This is true if both max and min are supplied but max is less than min. For all other cases (including unbound single-sided intervals) this will return false.

isbound

Returns true if the interval is bound by an upper and lower limit. An inverted interval would be bounded but inverted.

equate

Compare with another Interval object. Returns true if they are the same. False otherwise.

notequal

Inverse of equate. Used by the tied interface to implement !=.

$i1 != $i2
contains

Determine whether a supplied value is within the defined intervals.

$is = $i->contains( $value );

If both intervals are undefined, always returns true.

Note: If the min == max, returns true if the supplied value is that value, but only if either IncMin or IncMax is true. This is a change in version 0.06: previously this method returned true in this case regardless of IncMin and IncMax setttings.

If the interval is positive definite, always returns false if the supplied value is negative.

intersection

Given another Interval object, modify the existing interval to include the additional constraints. For example, if the current object has a interval of -3 to 10, and it is merged with an external object that has a interval of 0 to 20 then the interval of the current object will be converted to 0 to 10 since that is consistent with both intervals.

$status = $interval->intersection( $newinterval );

Returns true if the intersection was successful. If the intervals are incompatible (no intersection) or if no object was supplied returns false and the object is not modified.

Intersections of an inverted interval with a non-inverted interval can, in some circumstances, result in an intersection covering two distinct bound intervals. This class can not yet support multiple intervals (that would make the intersection method even more of a nightmare) so the routine dies if such a situation arises.

NOTES

The default interval is not inclusive of the bounds.

COPYRIGHT

Copyright (C) 2009-2011 Science and Technology Facilities Council. Copyright (C) 2002-2005 Particle Physics and Astronomy Research Council. All Rights Reserved.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place,Suite 330, Boston, MA 02111-1307, USA

AUTHOR

Tim Jenness <tjenness@cpan.org>.