All Downloads are FREE. Search and download functionalities are using the official Maven repository.

spire.optional.intervalGeometricPartialOrder.scala Maven / Gradle / Ivy

package spire.optional

import spire.algebra._
import spire.math.Interval
import spire.syntax.order._

object intervalGeometricPartialOrder {
  import spire.math.interval._
  /** Interval partial order defined as follows:
    *
    * Involving empty intervals:
    *
    * - if I and J are empty, then I === J.
    * - if I (resp. J) is empty and J (resp. I) is non-empty,
    *   the ordering is undefined (preserving antisymmetry).
    *
    * For non-empty intervals:
    *
    * - I === J is standard Eq semantics (I, J are intersubstituable)
    * - I < J if all x \in I, y \in J have x < y
    * - I > J if all x \in I, y \in J have x > y
    */
  class IntervalGeometricPartialOrder[A: Order] extends PartialOrder[Interval[A]] {
    override def eqv(x: Interval[A], y: Interval[A]): Boolean = (x == y)

    def partialCompare(i: Interval[A], j: Interval[A]): Double = {
      import Double.NaN
      if (eqv(i, j)) return 0.0
      if (i.isEmpty || j.isEmpty)
        return NaN

      // test if i < j
      (i.upperBound, j.lowerBound) match {
        case (Open(x), Open(y)) if x <= y => return -1.0
        case (Open(x), Closed(y)) if x <= y => return -1.0
        case (Closed(x), Open(y)) if x <= y => return -1.0
        case (Closed(x), Closed(y)) if x < y => return -1.0
        case _ =>
      }
      // test if i > j
        (i.lowerBound, j.upperBound) match {
        case (Open(x), Open(y)) if x >= y => return 1.0
        case (Open(x), Closed(y)) if x >= y => return 1.0
        case (Closed(x), Open(y)) if x >= y => return 1.0
        case (Closed(x), Closed(y)) if x > y => return 1.0
        case _ =>
      }
      return NaN
    }
  }

  implicit def intervalGeometricPartialOrder[A: Order]: PartialOrder[Interval[A]] = new IntervalGeometricPartialOrder[A]
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy