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

org.aiddl.common.scala.reasoning.resource.SchFileLoader.scala Maven / Gradle / Ivy

package org.aiddl.common.scala.reasoning.resource

import scala.io.Source
import scala.collection.mutable.HashMap

import org.aiddl.core.scala.function.Function
import org.aiddl.core.scala.representation._
import org.aiddl.common.scala.Common.NIL
import org.aiddl.common.scala.reasoning.resource.ResourceTerm._
import org.aiddl.common.scala.reasoning.temporal.Timepoint
import org.aiddl.common.scala.reasoning.temporal.UnaryConstraint.Duration
import org.aiddl.common.scala.reasoning.temporal.IntervalDistanceConstraint.StSt

class SchFileLoader extends Function {

  def apply( fName: String ) = {
    var constraints: Set[Term] = Set.empty
    var capacities: Set[Term] = Set.empty
    var usages: Set[Term] = Set.empty
    var usageMap: HashMap[Term, Set[Term]] = new HashMap
    var i = 1
    var numActivities = 0
    var numResources = 0

    for (line <- Source.fromFile(fName).getLines) {
      val elems = line.replace("\t", " ").trim().split(" ")
      if ( i == 1 ) {
        numActivities = elems(0).toInt
        numResources = elems(1).toInt
      } else if ( i <= numActivities + 3 ) {
        val from = Sym(s"a${elems(0)}")
        val count = elems(2).toInt
        for ( j <- 3 until (count+3) ) {
          val to = Sym(s"a${elems(j)}")
          val delta = Num( elems(j+count).substring(1).replace("]", "").toInt )
          constraints += Tuple(StSt, from, to, Tuple(delta, InfPos()))
        }
      } else if ( i > numActivities + 3 && i <= 2*numActivities + 3) {
        val duration = Num(elems(2).toInt)
        constraints += Tuple(Duration, Sym(s"a${elems(0)}"), Tuple(duration, duration))
        for ( j <- 1 to numResources ) {
          val usage = elems(2+j).toInt
          val resource = Sym(s"r$j")
          val activity = Sym(s"a${elems(0)}")
          if ( usage > 0) {
            val pre = usageMap.getOrElseUpdate(resource, Set.empty)
            usageMap.put(resource, pre + KeyVal(activity, Num(usage)))
          }
        }
      } else {
        for ( j <- 1 to numResources ) {
          val cap = Num(elems(j-1).toInt)
          val resource = Sym(s"r$j")
          capacities += KeyVal(resource, SetTerm(KeyVal(Sym("min"), Num(0)), KeyVal(Sym("max"), cap)))
          usages += KeyVal(resource, SetTerm(usageMap(resource)))
        }
      }
    }
    SetTerm(
      KeyVal(Capacity, SetTerm(capacities)),
      KeyVal(Usage, SetTerm(usages)),
      KeyVal(Constraints, SetTerm(constraints))
    )
  }

  def apply( args: Term ): Term = this(args)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy