sealed abstract class Interval[A] extends Serializable
Interval represents a set of values, usually numbers.
Intervals have upper and lower bounds. Each bound can be one of four kinds:
* Closed: The boundary value is included in the interval. * Open: The boundary value is excluded from the interval. * Unbound: There is no boundary value. * Empty: The interval itself is empty.
When the underlying type of the interval supports it, intervals may be used in arithmetic. There are several possible interpretations of interval arithmetic: the interval can represent uncertainty about a single value (for instance, a quantity +/- tolerance in engineering) or it can represent all values in the interval simultaneously. In this implementation we have chosen to use the probabillistic interpretation.
One common pitfall with interval arithmetic is that many familiar algebraic relations do not hold. For instance, given two intervals a and b:
a == b does not imply a * a == a * b
Consider a = b = [-1, 1]. Since any number times itself is non-negative, a * a = [0, 1]. However, a * b = [-1, 1], since we may actually have a=1 and b=-1.
These situations will result in loss of precision (in the form of wider intervals). The result is not wrong per se, but less acccurate than it could be.
These intervals should not be used with floating point bounds, as proper rounding is not implemented. Generally, the JVM is not an easy platform to perform robust arithmetic, as the IEEE 754 rounding modes cannot be set.
- Self Type
- Interval[A]
- Alphabetic
- By Inheritance
- Interval
- Serializable
- Serializable
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
- def &(rhs: Interval[A]): Interval[A]
- def *(rhs: A)(implicit ev: Semiring[A]): Interval[A]
- def *(rhs: Interval[A])(implicit ev: Semiring[A]): Interval[A]
- def +(rhs: A)(implicit ev: AdditiveSemigroup[A]): Interval[A]
- def +(rhs: Interval[A])(implicit ev: AdditiveSemigroup[A]): Interval[A]
- def -(rhs: A)(implicit ev: AdditiveGroup[A]): Interval[A]
- def -(rhs: Interval[A])(implicit ev: AdditiveGroup[A]): Interval[A]
- def --(rhs: Interval[A]): List[Interval[A]]
- def /(rhs: A)(implicit ev: Field[A]): Interval[A]
- def /(rhs: Interval[A])(implicit ev: Field[A]): Interval[A]
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def \(rhs: Interval[A]): List[Interval[A]]
- def abs(implicit m: AdditiveGroup[A]): Interval[A]
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
- def bottom(epsilon: A)(implicit r: AdditiveGroup[A]): Option[A]
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def combine(rhs: Interval[A])(f: (A, A) ⇒ A): Interval[A]
- def contains(t: A): Boolean
- def crosses(t: A): Boolean
- def crossesZero(implicit ev: AdditiveMonoid[A]): Boolean
- def dist(min: A, max: A, epsilon: A)(implicit u: Uniform[A], r: AdditiveGroup[A]): Dist[A]
- def doesNotContain(t: A): Boolean
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
- def fold[B](f: (Bound[A], Bound[A]) ⇒ B): B
- def foldOver[B](init: B, step: A)(f: (B, A) ⇒ B)(implicit ev: AdditiveMonoid[A], nt: NumberTag[A]): B
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- def hasAbove(t: A): Boolean
- def hasAtOrAbove(t: A): Boolean
- def hasAtOrBelow(t: A): Boolean
- def hasBelow(t: A): Boolean
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- def intersect(rhs: Interval[A]): Interval[A]
- def intersects(rhs: Interval[A]): Boolean
- def isAt(t: A): Boolean
- def isBounded: Boolean
-
final
def
isClosed(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
isClosedLower(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
isClosedUpper(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
- def isEmpty: Boolean
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
isOpen(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
isOpenLower(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
isOpenUpper(flags: Int): Boolean
- Attributes
- protected[this]
- Annotations
- @inline()
- def isPoint: Boolean
- def isProperSubsetOf(rhs: Interval[A]): Boolean
- def isProperSupersetOf(rhs: Interval[A]): Boolean
- def isSubsetOf(rhs: Interval[A]): Boolean
- def isSupersetOf(rhs: Interval[A]): Boolean
-
def
iterator(step: A)(implicit ev: AdditiveMonoid[A], nt: NumberTag[A]): Iterator[A]
Build an Iterator[A] from an Interval[A] and a (step: A) parameter.
Build an Iterator[A] from an Interval[A] and a (step: A) parameter.
A positive 'step' means we are proceeding from the lower bound up, and a negative 'step' means we are proceeding from the upper bound down. In each case, the interval must be bounded on the side we are starting with (though it may be unbound on the opposite side). A zero 'step' is not allowed.
The step is repeatedly added to the starting parameter as long as the sum remains within the interval. This means that arithmetic error can accumulate (e.g. with doubles). However, this method does overflow checking to ensure that Intervals parameterized on integer types will behave correctly.
Users who want to avoid using arithmetic error should consider starting with an Interval[Rational], calling iterator with the exact step desired, then mapping to the original type (e.g. Double). For example:
val ns = Interval.closed(Rational(0), Rational(5)) val it = ns.iterator(Rational(1, 7)).map(_.toDouble)
This method provides some of the same functionality as Scala's NumericRange class.
- def loop(step: A)(f: (A) ⇒ Unit)(implicit ev: AdditiveMonoid[A], nt: NumberTag[A]): Unit
-
final
def
lowerFlag(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
lowerFlagToUpper(flags: Int): Int
- Attributes
- protected[this]
-
def
lowerPairBelow(lower1: A, flags1: Int, lower2: A, flags2: Int): Boolean
- Attributes
- protected[this]
- def mapAroundZero[B](f: (Interval[A]) ⇒ B)(implicit ev: AdditiveMonoid[A]): (B, B)
- def mapBounds[B](f: (A) ⇒ B)(implicit arg0: Order[B]): Interval[B]
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def nonEmpty: Boolean
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- def nroot(k: Int)(implicit r: Ring[A], n: NRoot[A]): Interval[A]
-
def
overlap(rhs: Interval[A]): Overlap[A]
Result of overlapping this interval with another one.
Result of overlapping this interval with another one. Can be one of the following: - Equal if intervals are equal - Disjoint if intervals are notEmpty don't intersect - PartialOverlap if intervals intersect and neither is a subset of another - Subset if one interval (possibly empty) is a subset of another
Except for Equal, both original intervals are bound to respective result fields, allowing to determine exact overlap type.
For example (pseudo-code): { val a = [5, 6] val b = (0, 1)
// this returns Disjoint(b, a). Note a and b placement here, it means that b is strictly less then a. a.overlap(b) }
- def pow(k: Int)(implicit r: Ring[A]): Interval[A]
- def reciprocal(implicit ev: Field[A]): Interval[A]
-
final
def
reverseFlags(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
reverseLowerFlag(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
reverseUpperFlag(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
- def split(t: A): (Interval[A], Interval[A])
- def splitAtZero(implicit ev: AdditiveMonoid[A]): (Interval[A], Interval[A])
- def sqrt(implicit r: Ring[A], n: NRoot[A]): Interval[A]
-
final
def
swapFlags(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- Interval → AnyRef → Any
- def top(epsilon: A)(implicit r: AdditiveGroup[A]): Option[A]
-
def
translate(p: Polynomial[A])(implicit ev: Field[A]): Interval[A]
Apply the given polynomial to the interval.
Apply the given polynomial to the interval.
For every point contained in the interval, this method maps that point through the given polynomial. The resulting interval is the set of all the translated points. I.e.
result = { p(x) | x ∈ interval }
- def unary_-()(implicit ev: AdditiveGroup[A]): Interval[A]
- def unary_~(): List[Interval[A]]
- def union(rhs: Interval[A]): Interval[A]
-
final
def
upperFlag(flags: Int): Int
- Attributes
- protected[this]
- Annotations
- @inline()
-
final
def
upperFlagToLower(flags: Int): Int
- Attributes
- protected[this]
-
def
upperPairAbove(upper1: A, flags1: Int, upper2: A, flags2: Int): Boolean
- Attributes
- protected[this]
- def vmax(rhs: Interval[A])(implicit m: AdditiveMonoid[A]): Interval[A]
- def vmin(rhs: Interval[A])(implicit m: AdditiveMonoid[A]): Interval[A]
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def |(rhs: Interval[A]): Interval[A]
- def ∈:(a: A): Boolean
- def ∉:(a: A): Boolean
- def ∋(rhs: A): Boolean
- def ∌(rhs: A): Boolean
- def ∩(rhs: Interval[A]): Interval[A]
- def ∪(rhs: Interval[A]): Interval[A]
- def ⊂(rhs: Interval[A]): Boolean
- def ⊃(rhs: Interval[A]): Boolean
- def ⊆(rhs: Interval[A]): Boolean
- def ⊇(rhs: Interval[A]): Boolean