blob: ce4202ae2efd184719d80633ccfd1aee525a0ff8 [file] [log] [blame]
package io.prediction.commons.settings
import io.prediction.commons.Spec
import org.specs2._
import org.specs2.specification.Step
import com.mongodb.casbah.Imports._
class ParamGenInfosSpec extends Specification {
def is = s2"""
PredictionIO ParamGenInfos Specification
ParamGenInfos can be implemented by:
- MongoParamGenInfos ${mongoParamGenInfos}
"""
def mongoParamGenInfos = s2"""
MongoParamGenInfos should
- behave like any ParamGenInfos implementation ${paramGenInfos(newMongoParamGenInfos)}
- (database cleanup) ${Step(Spec.mongoClient(mongoDbName).dropDatabase())}
"""
def paramGenInfos(paramGenInfos: ParamGenInfos) = s2"""
create and get a parameter generator info ${insertAndGet(paramGenInfos)}
update a parameter generator info ${update(paramGenInfos)}
delete a parameter generator info ${delete(paramGenInfos)}
backup and restore parameter generator info ${backuprestore(paramGenInfos)}
"""
val mongoDbName = "predictionio_mongoparamgeninfos_test"
def newMongoParamGenInfos = new mongodb.MongoParamGenInfos(Spec.mongoClient(mongoDbName))
def insertAndGet(paramGenInfos: ParamGenInfos) = {
val mapk = ParamGenInfo(
id = "map-k",
name = "Mean Average Precision",
description = None,
commands = Some(Seq(
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtKDataPreparator --hdfs --test_dbType $appdataTestDbType$ --test_dbName $appdataTestDbName$ --test_dbHost $appdataTestDbHost$ --test_dbPort $appdataTestDbPort$ --training_dbType $appdataTrainingDbType$ --training_dbName $appdataTrainingDbName$ --training_dbHost $appdataTrainingDbHost$ --training_dbPort $appdataTrainingDbPort$ --modeldata_dbType $modeldataTrainingDbType$ --modeldata_dbName $modeldataTrainingDbName$ --modeldata_dbHost $modeldataTrainingDbHost$ --modeldata_dbPort $modeldataTrainingDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$ --goalParam $goalParam$",
"java -Dio.prediction.base=$base$ $configFile$ -Devalid=$evalid$ -Dalgoid=$algoid$ -Dk=$kParam$ -Dmetricid=$metricid$ -Dhdfsroot=$hdfsRoot$ -jar $topkJar$",
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtK --hdfs --dbType $settingsDbType$ --dbName $settingsDbName$ --dbHost $settingsDbHost$ --dbPort $settingsDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$")),
paramdefaults = Map("k" -> 20),
paramnames = Map("k" -> "k"),
paramdescription = Map("k" -> "Averaging window size"),
paramorder = Seq("k"))
paramGenInfos.insert(mapk)
paramGenInfos.get("map-k") must beSome(mapk)
}
def update(paramGenInfos: ParamGenInfos) = {
val mapk = ParamGenInfo(
id = "u-map-k",
name = "Mean Average Precision",
description = None,
commands = Some(Seq(
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtKDataPreparator --hdfs --test_dbType $appdataTestDbType$ --test_dbName $appdataTestDbName$ --test_dbHost $appdataTestDbHost$ --test_dbPort $appdataTestDbPort$ --training_dbType $appdataTrainingDbType$ --training_dbName $appdataTrainingDbName$ --training_dbHost $appdataTrainingDbHost$ --training_dbPort $appdataTrainingDbPort$ --modeldata_dbType $modeldataTrainingDbType$ --modeldata_dbName $modeldataTrainingDbName$ --modeldata_dbHost $modeldataTrainingDbHost$ --modeldata_dbPort $modeldataTrainingDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$ --goalParam $goalParam$",
"java -Dio.prediction.base=$base$ $configFile$ -Devalid=$evalid$ -Dalgoid=$algoid$ -Dk=$kParam$ -Dmetricid=$metricid$ -Dhdfsroot=$hdfsRoot$ -jar $topkJar$",
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtK --hdfs --dbType $settingsDbType$ --dbName $settingsDbName$ --dbHost $settingsDbHost$ --dbPort $settingsDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$")),
paramdefaults = Map("k" -> 20),
paramnames = Map("k" -> "k"),
paramdescription = Map("k" -> "Averaging window size"),
paramorder = Seq("k"))
paramGenInfos.insert(mapk)
val updatedMapk = mapk.copy(
paramdefaults = mapk.paramdefaults ++ Map("f" -> 20),
paramnames = mapk.paramnames ++ Map("f" -> "Foo"),
paramdescription = mapk.paramdescription ++ Map("f" -> "FooBar"),
paramorder = Seq("f", "k"))
paramGenInfos.update(updatedMapk)
paramGenInfos.get("u-map-k") must beSome(updatedMapk)
}
def delete(paramGenInfos: ParamGenInfos) = {
val mapk = ParamGenInfo(
id = "foo",
name = "Mean Average Precision",
description = None,
commands = Some(Seq(
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtKDataPreparator --hdfs --test_dbType $appdataTestDbType$ --test_dbName $appdataTestDbName$ --test_dbHost $appdataTestDbHost$ --test_dbPort $appdataTestDbPort$ --training_dbType $appdataTrainingDbType$ --training_dbName $appdataTrainingDbName$ --training_dbHost $appdataTrainingDbHost$ --training_dbPort $appdataTrainingDbPort$ --modeldata_dbType $modeldataTrainingDbType$ --modeldata_dbName $modeldataTrainingDbName$ --modeldata_dbHost $modeldataTrainingDbHost$ --modeldata_dbPort $modeldataTrainingDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$ --goalParam $goalParam$",
"java -Dio.prediction.base=$base$ $configFile$ -Devalid=$evalid$ -Dalgoid=$algoid$ -Dk=$kParam$ -Dmetricid=$metricid$ -Dhdfsroot=$hdfsRoot$ -jar $topkJar$",
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtK --hdfs --dbType $settingsDbType$ --dbName $settingsDbName$ --dbHost $settingsDbHost$ --dbPort $settingsDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$")),
paramdefaults = Map("k" -> 20),
paramnames = Map("k" -> "k"),
paramdescription = Map("k" -> "Averaging window size"),
paramorder = Seq("k"))
paramGenInfos.insert(mapk)
paramGenInfos.delete("foo")
paramGenInfos.get("foo") must beNone
}
def backuprestore(paramGenInfos: ParamGenInfos) = {
val mapkbk = ParamGenInfo(
id = "backup",
name = "Mean Average Precision",
description = None,
commands = Some(Seq(
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtKDataPreparator --hdfs --test_dbType $appdataTestDbType$ --test_dbName $appdataTestDbName$ --test_dbHost $appdataTestDbHost$ --test_dbPort $appdataTestDbPort$ --training_dbType $appdataTrainingDbType$ --training_dbName $appdataTrainingDbName$ --training_dbHost $appdataTrainingDbHost$ --training_dbPort $appdataTrainingDbPort$ --modeldata_dbType $modeldataTrainingDbType$ --modeldata_dbName $modeldataTrainingDbName$ --modeldata_dbHost $modeldataTrainingDbHost$ --modeldata_dbPort $modeldataTrainingDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$ --goalParam $goalParam$",
"java -Dio.prediction.base=$base$ $configFile$ -Devalid=$evalid$ -Dalgoid=$algoid$ -Dk=$kParam$ -Dmetricid=$metricid$ -Dhdfsroot=$hdfsRoot$ -jar $topkJar$",
"$hadoop$ jar $pdioEvalJar$ io.prediction.metrics.scalding.itemrec.map.MAPAtK --hdfs --dbType $settingsDbType$ --dbName $settingsDbName$ --dbHost $settingsDbHost$ --dbPort $settingsDbPort$ --hdfsRoot $hdfsRoot$ --appid $appid$ --engineid $engineid$ --evalid $evalid$ --metricid $metricid$ --algoid $algoid$ --kParam $kParam$")),
paramdefaults = Map("k" -> 20),
paramnames = Map("k" -> "k"),
paramdescription = Map("k" -> "Averaging window size"),
paramorder = Seq("k"))
paramGenInfos.insert(mapkbk)
val fn = "paramgeninfos.json"
val fos = new java.io.FileOutputStream(fn)
try {
fos.write(paramGenInfos.backup())
} finally {
fos.close()
}
paramGenInfos.restore(scala.io.Source.fromFile(fn)(scala.io.Codec.UTF8).mkString.getBytes("UTF-8")) map { data =>
data must contain(mapkbk)
} getOrElse 1 === 2
}
}