package scala.collection.parallel.benchmarks package misc import collection._ //immutable._ import collection.parallel._//immutable._ class SeqCoder(words: List[String]) { private val m = Map( '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ") /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */ private val charCode: Map[Char, Char] = for ((digit, letters) <- m; letter <- letters) yield letter -> digit /** Maps a word to the digit string it represents, * e.g. `Java` -> `5282` */ private def wordCode(word: String): String = word.toUpperCase map charCode /** A map from digit strings to the words that represent * them e.g. `5282` -> List(`Java`, `Kata`, `Lava`, ...) */ val wordsForNum: Map[String, Seq[String]] = (words groupBy wordCode).map(t => (t._1, t._2.toSeq)) withDefaultValue Seq() /** All ways to encode a number as a list of words */ def encode(number: String): Set[Seq[String]] = if (number.isEmpty) Set(Seq()) else { val splits = (1 to number.length).toSet // for { // split <- splits // word <- wordsForNum(number take split) // rest <- encode(number drop split) // } yield word :: rest val r = splits.flatMap(split => { val wfn = wordsForNum(number take split).flatMap(word => { val subs = encode(number drop split) subs.map(rest => word +: rest) }) wfn }) r } /** Maps a number to a list of all word phrases that can * represent it */ def translate(number: String) = encode(number)// map (_ mkString " ") def ??? : Nothing = throw new UnsupportedOperationException } class ParCoder(words: List[String]) { private val m = Map( '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ") /** Invert the mnemonics map to give a map from chars 'A' ... 'Z' to '2' ... '9' */ private val charCode: Map[Char, Char] = for ((digit, letters) <- m; letter <- letters) yield letter -> digit /** Maps a word to the digit string it represents, * e.g. `Java` -> `5282` */ private def wordCode(word: String): String = word.toUpperCase map charCode /** A map from digit strings to the words that represent * them e.g. `5282` -> List(`Java`, `Kata`, `Lava`, ...) */ val wordsForNum: Map[String, Seq[String]] = (words groupBy wordCode).map(t => (t._1, t._2)) withDefaultValue Seq() /** All ways to encode a number as a list of words */ def encode(number: String): Set[Seq[String]] = if (number.length > 12) { if (number.isEmpty) ParSet(ParSeq()) else { val splits = (1 to number.length).toParSet for { split <- splits word <- wordsForNum(number take split) rest <- encode(number drop split) } yield word +: rest } } else { if (number.isEmpty) Set(Seq()) else { val splits = (1 to number.length).toSet for { split <- splits word <- wordsForNum(number take split) rest <- encode(number drop split) } yield word +: rest } } /** Maps a number to a list of all word phrases that can * represent it */ def translate(number: String) = { encode(number)// map (_ mkString " ") } def ??? : Nothing = throw new UnsupportedOperationException } object Coder extends BenchCompanion { def benchName = "Coder" def collectionName = "General" def apply(sz: Int, p: Int, what: String) = new Coder(sz, p, what) override def defaultSize = 100 } class Coder(val size: Int, val parallelism: Int, val runWhat: String) extends Bench { def companion = Coder var seqcoder: SeqCoder = null var parcoder: ParCoder = null override def repetitionsPerRun = 1 val code = "23284374729473626268379762538" reset def runseq { val translations = seqcoder.translate(code) //println(translations) } def runpar { val translations = parcoder.translate(code) //println(translations) } def reset = runWhat match { case "seq" => seqcoder = new SeqCoder(Dictionary.wordlist) val t = seqcoder.translate(code) println("Translation check: " + t.size) //println(t) case "par" => collection.parallel.tasksupport.environment.asInstanceOf[concurrent.forkjoin.ForkJoinPool].setParallelism(parallelism) parcoder = new ParCoder(Dictionary.wordlist) val t = parcoder.translate(code) println("Translation check: " + t.size) //println(t) } def comparisonMap = Map() }