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

scroll.internal.formal.FormalUtils.scala Maven / Gradle / Ivy

The newest version!
package scroll.internal.formal

/**
  * Collection of some helper functions for the formal representation of CROM.
  */
object FormalUtils {

  /**
    * @param sets the list of sets to check
    * @tparam T the type of the contained elements
    * @return true iff the given sets are mutually disjoint to each other
    */
  def mutualDisjoint[T](sets: List[List[T]]): Boolean = {
    val all = sets.flatMap(_.distinct)
    all.lengthCompare(all.distinct.size) == 0
  }

  /**
    * @return true iff the mapping in foo provides a total function in the domain of 'domain'
    */
  def totalFunction[T, RT](domain: List[T], foo: Map[T, List[RT]]): Boolean = domain.toSet.subsetOf(foo.keySet)

  /**
    * @return true iff the provided list only contains true, false otherwise
    */
  def all(on: List[Boolean]): Boolean = !on.contains(false)

  /**
    * @return true iff the provided list contains true at least once, false otherwise.
    */
  def any(on: List[Boolean]): Boolean = on.contains(true)

  def atoms[T >: Null <: AnyRef](a: AnyRef): List[T] = a match {
    case elem: String => List(elem).asInstanceOf[List[T]]
    case elem: FormalRoleGroup => elem.rolegroups.flatMap(atoms).distinct
    case _ => throw new IllegalArgumentException(s"Can't handle: '$a'")
  }

  def evaluate[NT >: Null <: AnyRef, RT >: Null <: AnyRef, CT >: Null <: AnyRef, RST >: Null <: AnyRef](a: AnyRef, croi: FormalCROI[NT, RT, CT, RST], o: NT, c: CT): Int = a match {
    case _: String if any(croi.r.filter(croi.type1(_) == a).map(rr => croi.plays.contains((o, c, rr)))) => 1
    case _: String => 0
    case elem: FormalRoleGroup =>
      val sum = elem.rolegroups.map(evaluate(_, croi, o, c)).sum
      if (elem.lower <= sum && sum <= elem.upper) 1 else 0
    case _ => throw new IllegalArgumentException(s"Can't handle: '$a'")
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy