Skip to content

Instantly share code, notes, and snippets.

@byronyi
Last active January 26, 2016 15:00
Show Gist options
  • Save byronyi/565ce3ab6c3050bd8f4c to your computer and use it in GitHub Desktop.
Save byronyi/565ce3ab6c3050bd8f4c to your computer and use it in GitHub Desktop.
def getSchedule(flows: Iterable[Flow], priorities: Iterable[Int], bandwidth: Long): Map[Flow, Long] = {
val priorityQueue = priorities.zip(flows).groupBy(_._1).toArray.sortBy(_._1).map(_._2.map(_._2))
val egressFree = flows.map(_.srcIp).map((_, bandwidth)).toMap
val ingressFree = flows.map(_.dstIp).map((_, bandwidth)).toMap
priorityQueue.flatMap(queue => {
val egressNumFlows = queue.groupBy(_.srcIp).mapValues(_.size)
val ingressNumFlows = queue.groupBy(_.dstIp).mapValues(_.size)
queue.map(flow => {
val rate = math.min(egressFree.getOrElse(flow.srcIp, 0L) / egressNumFlows(flow.srcIp),
ingressFree.getOrElse(flow.dstIp, 0L) / ingressNumFlows(flow.dstIp))
egressFree(flow.srcIp) -= rate
ingressFree(flow.srcIp) -= rate
(flow, rate)
})
}).toMap
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment