From 090ba77cff3e6820256ccdb19beb8b3230d07907 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Wed, 19 Nov 2014 21:59:55 -0800 Subject: [PATCH 01/17] Cleaned up code for ContinuousLR factor (not supported yet) Code for ContinuousLRFactor are temporary and not supported yet. Should not appear in the master branch. --- .../datastore/SQLInferenceDataStore.scala | 77 +------------------ .../settings/models/FactorFunction.scala | 9 --- .../parsing/FactorFunctionParser.scala | 8 +- 3 files changed, 2 insertions(+), 92 deletions(-) diff --git a/src/main/scala/org/deepdive/inference/datastore/SQLInferenceDataStore.scala b/src/main/scala/org/deepdive/inference/datastore/SQLInferenceDataStore.scala index 75ab628a6..1faf8003c 100644 --- a/src/main/scala/org/deepdive/inference/datastore/SQLInferenceDataStore.scala +++ b/src/main/scala/org/deepdive/inference/datastore/SQLInferenceDataStore.scala @@ -106,7 +106,6 @@ trait SQLInferenceDataStore extends InferenceDataStore with Logging { case "EqualFactorFunction" => 3 case "IsTrueFactorFunction" => 4 case "MultinomialFactorFunction" => 5 - case "ContinuousLRFactorFunction" => 20 } } @@ -678,80 +677,7 @@ trait SQLInferenceDataStore extends InferenceDataStore with Logging { } val weightDesc = generateWeightDesc(factorDesc.weightPrefix, factorDesc.weight.variables) - if (factorDesc.func.getClass.getSimpleName == "ContinuousLRFactorFunction"){ - - log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") - if (isFixed || weightlist == ""){ - log.error("#########################################") - log.error("DO NOT SUPPORT FIXED ARRAY WEIGHT FOR NOW") - } else { // not fixed and has weight variables - execute(s"""DROP TABLE IF EXISTS ${weighttableForThisFactor} CASCADE; - CREATE TABLE ${weighttableForThisFactor} AS - SELECT ${weightlist}, ${cast(0, "bigint")} AS id, ${cast(isFixed, "int")} AS isfixed, ${initvalue} + 0.0 AS initvalue - FROM ${querytable} - GROUP BY ${weightlist};""") - - // handle weight id - if (usingGreenplum) { - executeQuery(s"""SELECT fast_seqassign('${weighttableForThisFactor}', ${cweightid});""") - } else { - execute(s"UPDATE ${weighttableForThisFactor} SET id = ${nextVal(weightidSequence)};") - } - - var min_weight_id = 0L - var max_weight_id = 0L - - issueQuery(s"""SELECT MIN(id) FROM ${weighttableForThisFactor};""") { rs => - min_weight_id = rs.getLong(1) - } - - issueQuery(s"""SELECT MAX(id) FROM ${weighttableForThisFactor};""") { rs => - max_weight_id = rs.getLong(1) - } - - execute(s"""UPDATE ${weighttableForThisFactor} SET - id = ${min_weight_id} + (id - ${min_weight_id})*4096 - ;""") - - issueQuery(s"""SELECT COUNT(*) FROM ${weighttableForThisFactor};""") { rs => - cweightid += rs.getLong(1) * 4096 - } - - execute(s""" - DROP TABLE IF EXISTS ${weighttableForThisFactor}_other CASCADE; - CREATE TABLE ${weighttableForThisFactor}_other (addid int); - """) - - var one_2_4096 = (1 to (4096-1)).map(v => s""" (${v}) """).mkString(", ") - - execute(s""" - INSERT INTO ${weighttableForThisFactor}_other VALUES ${one_2_4096}; - """) - - execute(s""" - INSERT INTO ${weighttableForThisFactor} - SELECT t0.feature, t0.id+t1.addid, t0.isfixed, NULL - FROM ${weighttableForThisFactor} t0, ${weighttableForThisFactor}_other t1; - """) - - execute(s"""INSERT INTO ${WeightsTable}(id, isfixed, initvalue) SELECT id, isfixed, initvalue FROM ${weighttableForThisFactor};""") - - // check null weight - val weightChecklist = factorDesc.weight.variables.map(v => s""" ${quoteColumn(v)} IS NULL """).mkString("AND") - issueQuery(s"SELECT COUNT(*) FROM ${querytable} WHERE ${weightChecklist}") { rs => - if (rs.getLong(1) > 0) { - throw new RuntimeException("Weight variable has null values") - } - } - - // dump factors - val weightjoinlist = factorDesc.weight.variables.map(v => s""" t0.${quoteColumn(v)} = t1.${quoteColumn(v)} """).mkString("AND") - du.unload(s"${outfile}", s"${groundingPath}/${outfile}", dbSettings, parallelGrounding, - s"""SELECT t0.id AS factor_id, t1.id AS weight_id, ${idcols} - FROM ${querytable} t0, ${weighttableForThisFactor} t1 - WHERE ${weightjoinlist} AND t1.initvalue IS NOT NULL;""") - } - } else if (factorDesc.func.getClass.getSimpleName != "MultinomialFactorFunction") { + if (factorDesc.func.getClass.getSimpleName != "MultinomialFactorFunction") { // branch if weight variables present val hasWeightVariables = !(isFixed || weightlist == "") @@ -785,7 +711,6 @@ trait SQLInferenceDataStore extends InferenceDataStore with Logging { SELECT id, isfixed, initvalue, ${weightDesc} FROM ${weighttableForThisFactor};""") // check null weight (only if there are weight variables) - // TODO BUG here: if (hasWeightVariables) { val weightChecklist = factorDesc.weight.variables.map(v => s""" ${quoteColumn(v)} IS NULL """).mkString("AND") issueQuery(s"SELECT COUNT(*) FROM ${querytable} WHERE ${weightChecklist}") { rs => diff --git a/src/main/scala/org/deepdive/settings/models/FactorFunction.scala b/src/main/scala/org/deepdive/settings/models/FactorFunction.scala index 2cb49a0bb..2a9494d5b 100644 --- a/src/main/scala/org/deepdive/settings/models/FactorFunction.scala +++ b/src/main/scala/org/deepdive/settings/models/FactorFunction.scala @@ -31,10 +31,6 @@ case class EqualFactorFunction(variables: Seq[FactorFunctionVariable]) extends F override def variableDataType = "Boolean" } -case class ContinuousLRFactorFunction(variables: Seq[FactorFunctionVariable]) extends FactorFunction { - override def variableDataType = "Boolean" -} - /* A factor function describing A == True. Restricted to one variable. */ case class IsTrueFactorFunction(variables: Seq[FactorFunctionVariable]) extends FactorFunction { override def variableDataType = "Boolean" @@ -50,11 +46,6 @@ case class MultinomialFactorFunction(variables: Seq[FactorFunctionVariable]) ext override def variableDataType = "Discrete" } -/* Dummy factor function */ -case class DummyFactorFunction(val variables: Seq[FactorFunctionVariable]) extends FactorFunction { - override def variableDataType = "Discrete" -} - /* A variable used in a Factor function */ case class FactorFunctionVariable(relation: String, field: String, isArray: Boolean = false, isNegated: Boolean = false, predicate: Option[Long] = None) { diff --git a/src/main/scala/org/deepdive/settings/parsing/FactorFunctionParser.scala b/src/main/scala/org/deepdive/settings/parsing/FactorFunctionParser.scala index 2985c4c56..3efe072cd 100644 --- a/src/main/scala/org/deepdive/settings/parsing/FactorFunctionParser.scala +++ b/src/main/scala/org/deepdive/settings/parsing/FactorFunctionParser.scala @@ -8,7 +8,6 @@ object FactorFunctionParser extends RegexParsers with Logging { def relationOrField = """[\w]+""".r def arrayDefinition = """\[\]""".r def equalPredicate = """[0-9]+""".r - // def factorFunctionName = "Imply" | "Or" | "And" | "Equal" | "IsTrue" def implyFactorFunction = ("Imply" | "IMPLY") ~> "(" ~> rep1sep(factorVariable, ",") <~ ")" ^^ { varList => ImplyFactorFunction(varList) @@ -31,11 +30,6 @@ object FactorFunctionParser extends RegexParsers with Logging { EqualFactorFunction(List(v1, v2)) } - def continuousLRFactorFunction = ("ContinuousLR" | "CONTINUOUSLR") ~> "(" ~> factorVariable ~ ("," ~> factorVariable) <~ ")" ^^ { - case v1 ~ v2 => - ContinuousLRFactorFunction(List(v1, v2)) - } - def isTrueFactorFunction = ("IsTrue" | "ISTRUE") ~> "(" ~> factorVariable <~ ")" ^^ { variable => IsTrueFactorFunction(List(variable)) } @@ -60,6 +54,6 @@ object FactorFunctionParser extends RegexParsers with Logging { } def factorFunc = implyFactorFunction | orFactorFunction | andFactorFunction | - equalFactorFunction | isTrueFactorFunction | xorFactorFunction | multinomialFactorFunction | continuousLRFactorFunction + equalFactorFunction | isTrueFactorFunction | xorFactorFunction | multinomialFactorFunction } \ No newline at end of file From c15132a5d5801dd0a5d719432349435c5eb3a022 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Wed, 19 Nov 2014 22:30:45 -0800 Subject: [PATCH 02/17] Fixed a build warning --- src/main/scala/org/deepdive/extraction/ProcessExecutor.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/scala/org/deepdive/extraction/ProcessExecutor.scala b/src/main/scala/org/deepdive/extraction/ProcessExecutor.scala index d8071c091..c94f71d34 100644 --- a/src/main/scala/org/deepdive/extraction/ProcessExecutor.scala +++ b/src/main/scala/org/deepdive/extraction/ProcessExecutor.scala @@ -8,6 +8,7 @@ import ProcessExecutor._ import scala.collection.mutable.ArrayBuffer import scala.concurrent._ import scala.concurrent.duration._ +import scala.language.postfixOps import scala.io.Source import scala.sys.process._ From fd3ed7ca3ab25710939caccca1d002d7a88100d9 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Wed, 19 Nov 2014 22:30:54 -0800 Subject: [PATCH 03/17] Skipped chunking test on GreenPlum Now `make test` calls both test/test_gp.sh and test/test_psql.sh, and the latter will call chunking test which has permission problems on GP. To make `make test` work on GP, we skip chunking test on GP in a hacky way. --- src/test/scala/integration/Chunking.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/scala/integration/Chunking.scala b/src/test/scala/integration/Chunking.scala index 9a1e48612..2685b48c2 100644 --- a/src/test/scala/integration/Chunking.scala +++ b/src/test/scala/integration/Chunking.scala @@ -226,7 +226,8 @@ class ChunkingApp extends FunSpec with Logging{ describe("Chunking with linear chain CRF") { it("should get F1 score > 0.8") { - + // Assume GP is not running on the system, or skip this test + assume("which gpfdist".! != 0) prepareData() DeepDive.run(config, "out/test_chunking") // Make sure the data is in the database From 57cb37079d97be95cf78aa2f171ee0daf5379b7f Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 00:11:52 -0800 Subject: [PATCH 04/17] Fixed a non-terminating bug in sampler When sampler throw PermissionDenied error, (+x not set), DeepDive will not terminate. Fixed this issue. --- .../org/deepdive/inference/Sampler.scala | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/scala/org/deepdive/inference/Sampler.scala b/src/main/scala/org/deepdive/inference/Sampler.scala index 412fa40ba..6cedfb5cf 100644 --- a/src/main/scala/org/deepdive/inference/Sampler.scala +++ b/src/main/scala/org/deepdive/inference/Sampler.scala @@ -25,26 +25,35 @@ class Sampler extends Actor with ActorLogging { val cmd = buildSamplerCmd(samplerCmd, samplerOptions, weightsFile, variablesFile, factorsFile, edgesFile, metaFile, outputDir, parallelGrounding) log.info(s"Executing: ${cmd.mkString(" ")}") - // We run the process, get its exit value, and print its output to the log file - val exitValue = cmd!(ProcessLogger( - out => log.info(out), - err => System.err.println(err) - )) - // Depending on the exit value we return success or kill the program - exitValue match { - case 0 => sender ! Success() - case _ => { - import scala.sys.process._ - import java.lang.management - import sun.management.VMManagement; - import java.lang.management.ManagementFactory; - import java.lang.management.RuntimeMXBean; - import java.lang.reflect.Field; - import java.lang.reflect.Method; - var pid = ManagementFactory.getRuntimeMXBean().getName().toString - val pattern = """\d+""".r - pattern.findAllIn(pid).foreach(id => s"kill -9 ${id}".!) + + // Handle the case where cmd! throw exception rather than return a value + try { + // We run the process, get its exit value, and print its output to the log file + val exitValue = cmd!(ProcessLogger( + out => log.info(out), + err => System.err.println(err) + )) + // Depending on the exit value we return success or kill the program + exitValue match { + case 0 => sender ! Success() + case _ => { + import scala.sys.process._ + import java.lang.management + import sun.management.VMManagement; + import java.lang.management.ManagementFactory; + import java.lang.management.RuntimeMXBean; + import java.lang.reflect.Field; + import java.lang.reflect.Method; + var pid = ManagementFactory.getRuntimeMXBean().getName().toString + val pattern = """\d+""".r + pattern.findAllIn(pid).foreach(id => s"kill -9 ${id}".!) + } } + } catch { + // If some exception is thrown, terminate DeepDive + case e: Throwable => + sender ! Status.Failure(e) + context.stop(self) } } From 2e668e25f2a5f7dc1258d2f5bba49d52163cddca Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 00:14:21 -0800 Subject: [PATCH 05/17] Update sampler for Mac to support -q/--quert --- util/sampler-dw-mac | Bin 291028 -> 291036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/util/sampler-dw-mac b/util/sampler-dw-mac index 85d3eb9c055844640c1940af39d2fbdb3b81beeb..378586c5a9372cd433e84c3f34e4edd247a43d7f 100755 GIT binary patch delta 94628 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 tWsm=RTUE=7}pTJ<M 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 From 347b8818b6ce84d53673d21bd797a0ec30a3b68b Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 00:14:40 -0800 Subject: [PATCH 06/17] Reduced test output by using -q in sampler --- src/test/scala/integration/BiasedCoin.scala | 2 ++ src/test/scala/integration/Chunking.scala | 2 ++ src/test/scala/integration/MysqlSpouseExample.scala | 2 ++ src/test/scala/integration/PostgresSpouseExample.scala | 2 ++ 4 files changed, 8 insertions(+) diff --git a/src/test/scala/integration/BiasedCoin.scala b/src/test/scala/integration/BiasedCoin.scala index ff680bd82..b0cd79fb0 100644 --- a/src/test/scala/integration/BiasedCoin.scala +++ b/src/test/scala/integration/BiasedCoin.scala @@ -60,6 +60,8 @@ class BiasedCoin extends FunSpec { case "true" | "1" | "True" | "TRUE" => "true" case _ => "false" }} + + deepdive.sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" """ diff --git a/src/test/scala/integration/Chunking.scala b/src/test/scala/integration/Chunking.scala index 9a1e48612..9f3050982 100644 --- a/src/test/scala/integration/Chunking.scala +++ b/src/test/scala/integration/Chunking.scala @@ -181,6 +181,8 @@ class ChunkingApp extends FunSpec with Logging{ case "true" | "1" | "True" | "TRUE" => "true" case _ => "false" }} + + sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" } """ diff --git a/src/test/scala/integration/MysqlSpouseExample.scala b/src/test/scala/integration/MysqlSpouseExample.scala index d089fb153..cc9f3d400 100644 --- a/src/test/scala/integration/MysqlSpouseExample.scala +++ b/src/test/scala/integration/MysqlSpouseExample.scala @@ -231,6 +231,8 @@ deepdive { calibration.holdout_fraction: 0.25 + sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" + } """ diff --git a/src/test/scala/integration/PostgresSpouseExample.scala b/src/test/scala/integration/PostgresSpouseExample.scala index 0d3f3ebea..92edd269c 100644 --- a/src/test/scala/integration/PostgresSpouseExample.scala +++ b/src/test/scala/integration/PostgresSpouseExample.scala @@ -188,6 +188,8 @@ deepdive { case _ => "false" }} + sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" + } """ From 3c1593fba287de2626a28c80b24b880a409d4831 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 00:55:04 -0800 Subject: [PATCH 07/17] Fixed a test bug when there is NULL in inference result When highest bucket has 0 incorrect values, it has a NULL in the result table, which leads to a test failure since x / (x + NULL) = NULL. F# Please enter the commit message for your changes. Lines starting --- src/test/scala/integration/MysqlSpouseExample.scala | 5 +++-- src/test/scala/integration/PostgresSpouseExample.scala | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/scala/integration/MysqlSpouseExample.scala b/src/test/scala/integration/MysqlSpouseExample.scala index cc9f3d400..d9609d8a0 100644 --- a/src/test/scala/integration/MysqlSpouseExample.scala +++ b/src/test/scala/integration/MysqlSpouseExample.scala @@ -240,7 +240,8 @@ deepdive { def processResults(): Double = { JdbcDataStore.init(config) var score = 0.0; - val checkQuery = """select num_correct / (num_correct + num_incorrect) + val checkQuery = """select num_correct / (num_correct + + CASE WHEN num_incorrect IS NULL THEN 0 ELSE num_incorrect END) from has_spouse_is_true_calibration where bucket = 9""" MysqlDataStore.withConnection { implicit conn => @@ -268,7 +269,7 @@ deepdive { // DeepDive.run will finally call JdbcDataStore.close()... val score = processResults() - assert(score > 0.9) + assert(score > 0.8) JdbcDataStore.close() } diff --git a/src/test/scala/integration/PostgresSpouseExample.scala b/src/test/scala/integration/PostgresSpouseExample.scala index 92edd269c..94cb83c45 100644 --- a/src/test/scala/integration/PostgresSpouseExample.scala +++ b/src/test/scala/integration/PostgresSpouseExample.scala @@ -197,7 +197,8 @@ deepdive { def processResults(): Double = { JdbcDataStore.init(config) var score = 0.0; - val checkQuery = """select num_correct::real / (num_correct + num_incorrect) + val checkQuery = """select num_correct::real / (num_correct + + CASE WHEN num_incorrect IS NULL THEN 0 ELSE num_incorrect END) from has_spouse_is_true_calibration where bucket = 9""" PostgresDataStore.withConnection { implicit conn => From 7ee698944315e6f61d2f394b7aba9cff1cdd1534 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 00:56:56 -0800 Subject: [PATCH 08/17] Fixed Akka non-terminating bugs DeepDive have suffered from non-terminating bugs. These types of bugs are because exceptions are thrown out of DeepDive.run, but the Akka actor is not shut down. We have been trying to capture these bugs by catching them everywhere and run a Context.shutdown, but the universal solution is catching any type of exception and shut down the Akka actor whenever an exception occurs. Added a try-catch block in DeepDive.run, and shut down the system when exceptions are thrown. This fixes config parsing failures and unpredictable exceptions. --- src/main/scala/org/deepdive/Context.scala | 3 +++ src/main/scala/org/deepdive/DeepDive.scala | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/scala/org/deepdive/Context.scala b/src/main/scala/org/deepdive/Context.scala index df1cc1dd9..0623af3b6 100644 --- a/src/main/scala/org/deepdive/Context.scala +++ b/src/main/scala/org/deepdive/Context.scala @@ -14,6 +14,9 @@ import scala.util.Try /* Describes the context of the DeepDive application */ object Context extends Logging { + // The akka actor is initialized when "Context.system" is first accessed. + // TODO: it might not be best to use a lazy val here, since we may want + // to run "DeepDive.run" multiple times, e.g. in tests. lazy val system = ActorSystem("deepdive") var outputDir = "out" // This needs to be variable since we might reassign it in relearnFrom feature diff --git a/src/main/scala/org/deepdive/DeepDive.scala b/src/main/scala/org/deepdive/DeepDive.scala index 1bb78cdb3..3c3743218 100644 --- a/src/main/scala/org/deepdive/DeepDive.scala +++ b/src/main/scala/org/deepdive/DeepDive.scala @@ -21,9 +21,12 @@ object DeepDive extends Logging { def run(config: Config, outputDir: String) { - // Get the actor system + // Initialize and get the actor system val system = Context.system + // catching all exceptions and terminate Akka + try { + // Load Settings val settings = Settings.loadFromConfig(config) // If relearn_from specified, set output dir to that dir and skip everything @@ -170,6 +173,14 @@ object DeepDive extends Logging { // Clean up resources Context.shutdown() + + // end try + } catch { + case e: Exception => + // In case of any exception + Context.shutdown() + throw e + } } } From e03a64e7b14b3567827425219992c5810bf80a1b Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 01:22:58 -0800 Subject: [PATCH 09/17] Fixed learning rates for tests Used previous learning rate, which is 0.5 --- src/test/resources/application.conf | 3 ++- src/test/scala/integration/BiasedCoin.scala | 2 -- src/test/scala/integration/Chunking.scala | 2 -- src/test/scala/integration/MysqlSpouseExample.scala | 2 -- src/test/scala/integration/PostgresSpouseExample.scala | 2 -- 5 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/test/resources/application.conf b/src/test/resources/application.conf index 5f2c90c4e..db53db322 100644 --- a/src/test/resources/application.conf +++ b/src/test/resources/application.conf @@ -15,6 +15,7 @@ deepdive { password: ${PGPASSWORD} } - sampler.sampler_args: "-l 300 -i 500 -s 1 --alpha 0.5" + # Use quiet output for tests + sampler.sampler_args: "-l 300 -i 500 -s 1 --alpha 0.5 --quiet" } diff --git a/src/test/scala/integration/BiasedCoin.scala b/src/test/scala/integration/BiasedCoin.scala index b0cd79fb0..ff680bd82 100644 --- a/src/test/scala/integration/BiasedCoin.scala +++ b/src/test/scala/integration/BiasedCoin.scala @@ -60,8 +60,6 @@ class BiasedCoin extends FunSpec { case "true" | "1" | "True" | "TRUE" => "true" case _ => "false" }} - - deepdive.sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" """ diff --git a/src/test/scala/integration/Chunking.scala b/src/test/scala/integration/Chunking.scala index 9f3050982..9a1e48612 100644 --- a/src/test/scala/integration/Chunking.scala +++ b/src/test/scala/integration/Chunking.scala @@ -181,8 +181,6 @@ class ChunkingApp extends FunSpec with Logging{ case "true" | "1" | "True" | "TRUE" => "true" case _ => "false" }} - - sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" } """ diff --git a/src/test/scala/integration/MysqlSpouseExample.scala b/src/test/scala/integration/MysqlSpouseExample.scala index d9609d8a0..c6609d620 100644 --- a/src/test/scala/integration/MysqlSpouseExample.scala +++ b/src/test/scala/integration/MysqlSpouseExample.scala @@ -231,8 +231,6 @@ deepdive { calibration.holdout_fraction: 0.25 - sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" - } """ diff --git a/src/test/scala/integration/PostgresSpouseExample.scala b/src/test/scala/integration/PostgresSpouseExample.scala index 94cb83c45..33f588fbf 100644 --- a/src/test/scala/integration/PostgresSpouseExample.scala +++ b/src/test/scala/integration/PostgresSpouseExample.scala @@ -188,8 +188,6 @@ deepdive { case _ => "false" }} - sampler.sampler_args: "--quiet -l 300 -s 1 -i 500 --alpha 0.1" - } """ From e8e28d5c53630801b94f4830dffe08f3a53267d6 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 02:13:14 -0800 Subject: [PATCH 10/17] Fixed a mistaken change in test --- src/test/scala/integration/MysqlSpouseExample.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/integration/MysqlSpouseExample.scala b/src/test/scala/integration/MysqlSpouseExample.scala index c6609d620..46479e06f 100644 --- a/src/test/scala/integration/MysqlSpouseExample.scala +++ b/src/test/scala/integration/MysqlSpouseExample.scala @@ -267,7 +267,7 @@ deepdive { // DeepDive.run will finally call JdbcDataStore.close()... val score = processResults() - assert(score > 0.8) + assert(score > 0.9) JdbcDataStore.close() } From b2652ef4eaae8aad96dbc24acb6bd8bfcad0178b Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 02:58:50 -0800 Subject: [PATCH 11/17] Add an integration test for Akka non-terminating issue Added `Brokentest.scala`, an integration test to detect non-termination. --- src/test/scala/integration/BrokenTest.scala | 57 +++++++++++++++++++++ test/test_gp.sh | 1 + test/test_mysql.sh | 1 + test/test_psql.sh | 1 + 4 files changed, 60 insertions(+) create mode 100644 src/test/scala/integration/BrokenTest.scala diff --git a/src/test/scala/integration/BrokenTest.scala b/src/test/scala/integration/BrokenTest.scala new file mode 100644 index 000000000..683c700aa --- /dev/null +++ b/src/test/scala/integration/BrokenTest.scala @@ -0,0 +1,57 @@ +package org.deepdive.test.integration + +import anorm._ +import akka.testkit._ +import com.typesafe.config._ +import org.deepdive.test._ +import org.deepdive.Context +import org.deepdive._ +import org.deepdive.datastore.{PostgresDataStore, JdbcDataStore} +import org.deepdive.test.helpers.TestHelper +import org.scalatest._ +import org.scalatest.concurrent.TimeLimitedTests +import org.scalatest.time.SpanSugar._ +import scalikejdbc.ConnectionPool +import scala.sys.process._ + +// A test for non-termination +class BrokenTest extends FunSpec with TimeLimitedTests { + + val timeLimit = 10000 millis + val badConfig = ConfigFactory.parseString(getBadConfig).withFallback(ConfigFactory.load) + + /** application.conf configuration + */ + def getBadConfig = TestHelper.getConfig + + s""" + deepdive.schema.variables { + coin.is_correct: BADCONFIG___ + } + + deepdive.extraction.extractors: { + } + + deepdive.inference.factors { + test { + input_query: ${"\"\"\""}select id as "coin.id", is_correct as "coin.is_correct" from coin${"\"\"\""} + function: "IsTrue(coin.is_correct)" + weight: "?" + } + } + + deepdive.inference.parallel_grounding: ${System.getenv("PARALLEL_GROUNDING") match { + case "true" | "1" | "True" | "TRUE" => "true" + case _ => "false" + }} + """ + + it("should not get stuck for bad configs") { + + intercept[RuntimeException] { + DeepDive.run(badConfig, "out/test_coin") + } + // should not timeout (10 seconds) + Context.system.awaitTermination() + } + +} diff --git a/test/test_gp.sh b/test/test_gp.sh index 0dc3678b2..5586006f0 100755 --- a/test/test_gp.sh +++ b/test/test_gp.sh @@ -57,6 +57,7 @@ createdb $DBNAME export SBT_OPTS="-XX:MaxHeapSize=256m -Xmx512m -XX:MaxPermSize=256m" # # Test argument "-- -oF" shows full stack trace when error occurs sbt "test-only org.deepdive.test.unit.* -- -oF" && \ +sbt "test-only org.deepdive.test.integration.BrokenTest -- -oF" && \ sbt "test-only org.deepdive.test.integration.BiasedCoin -- -oF" && \ sbt "test-only org.deepdive.test.integration.PostgresSpouseExample -- -oF" #sbt "test-only org.deepdive.test.integration.ChunkingApp -- -oF" # Having permission issues diff --git a/test/test_mysql.sh b/test/test_mysql.sh index 89c32a03f..cb638b102 100644 --- a/test/test_mysql.sh +++ b/test/test_mysql.sh @@ -54,6 +54,7 @@ export SBT_OPTS="-XX:MaxHeapSize=256m -Xmx512m -XX:MaxPermSize=256m" # # Test argument "-- -oF" shows full stack trace when error occurs # sbt "test-only org.deepdive.test.unit.* -- -oF" && sbt "test-only org.deepdive.test.integration.BiasedCoin -- -oF" && sbt "test-only org.deepdive.test.integration.ChunkingApp -- -oF" sbt "test-only org.deepdive.test.unit.*" && \ +sbt "test-only org.deepdive.test.integration.BrokenTest -- -oF" && \ sbt "test-only org.deepdive.test.integration.BiasedCoin -- -oF" && \ sbt "test-only org.deepdive.test.integration.MysqlSpouseExample -- -oF" && \ sbt "test-only org.deepdive.test.integration.ChunkingApp -- -oF" diff --git a/test/test_psql.sh b/test/test_psql.sh index 1f55e46a2..653f11f45 100755 --- a/test/test_psql.sh +++ b/test/test_psql.sh @@ -50,6 +50,7 @@ createdb $DBNAME export SBT_OPTS="-XX:MaxHeapSize=256m -Xmx512m -XX:MaxPermSize=256m" # # Test argument "-- -oF" shows full stack trace when error occurs sbt "test-only org.deepdive.test.unit.* -- -oF" && \ +sbt "test-only org.deepdive.test.integration.BrokenTest -- -oF" && \ sbt "test-only org.deepdive.test.integration.BiasedCoin -- -oF" && \ sbt "test-only org.deepdive.test.integration.PostgresSpouseExample -- -oF" && \ sbt "test-only org.deepdive.test.integration.ChunkingApp -- -oF" From b3fbf1393ba7d7a760c0f04a496e2ee2a2bd0f9d Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 12:01:46 -0800 Subject: [PATCH 12/17] Fixed non-termination for invalid inference rules --- .../org/deepdive/inference/InferenceManager.scala | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/scala/org/deepdive/inference/InferenceManager.scala b/src/main/scala/org/deepdive/inference/InferenceManager.scala index 42f1fc609..d0593d79d 100644 --- a/src/main/scala/org/deepdive/inference/InferenceManager.scala +++ b/src/main/scala/org/deepdive/inference/InferenceManager.scala @@ -59,10 +59,17 @@ trait InferenceManager extends Actor with ActorLogging { case InferenceManager.GroundFactorGraph(factorDescs, calibrationSettings, skipLearning, weightTable, parallelGrounding) => val _sender = sender - inferenceDataStore.asInstanceOf[SQLInferenceDataStore] - .groundFactorGraph(variableSchema, factorDescs, calibrationSettings, - skipLearning, weightTable, dbSettings, parallelGrounding) - sender ! "OK" + try { + inferenceDataStore.asInstanceOf[SQLInferenceDataStore] + .groundFactorGraph(variableSchema, factorDescs, calibrationSettings, + skipLearning, weightTable, dbSettings, parallelGrounding) + sender ! "OK" + } catch { + // If some exception is thrown, terminate DeepDive + case e: Throwable => + sender ! Status.Failure(e) + context.stop(self) + } // factorGraphBuilder ? FactorGraphBuilder.AddFactorsAndVariables( // factorDesc, holdoutFraction, batchSize) pipeTo _sender case InferenceManager.RunInference(factorDescs, holdoutFraction, holdoutQuery, From 6ea19fa7875fa5f309db9c7896d9b278bc0e7997 Mon Sep 17 00:00:00 2001 From: Zifei Shan Date: Thu, 20 Nov 2014 14:49:42 -0800 Subject: [PATCH 13/17] Added notes and discussions into comments for future reference --- src/main/scala/org/deepdive/Context.scala | 15 +++++++++++++++ src/main/scala/org/deepdive/DeepDive.scala | 10 ++++++++++ src/test/resources/application.conf | 4 +++- .../scala/integration/MysqlSpouseExample.scala | 6 ++++++ .../scala/integration/PostgresSpouseExample.scala | 6 ++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/scala/org/deepdive/Context.scala b/src/main/scala/org/deepdive/Context.scala index 0623af3b6..634f9f2c2 100644 --- a/src/main/scala/org/deepdive/Context.scala +++ b/src/main/scala/org/deepdive/Context.scala @@ -17,6 +17,21 @@ object Context extends Logging { // The akka actor is initialized when "Context.system" is first accessed. // TODO: it might not be best to use a lazy val here, since we may want // to run "DeepDive.run" multiple times, e.g. in tests. + /* Notes @zifei: + The difference between lazy val and val is, that a val is executed + when it is defined, and a lazy val is executed when it is accessed the + first time. + + We had encountered some problems when executing DeepDive.run several + times in integration tests. We have been using some hacks to fix it + (running these tests one by one in separate sbt commands). If we can + fix it, we can run all tests together. + + I have to investigate more into the alternative. A possible way might + be initializing Context.system explicitly every time DeepDive.run + executes (not sure how), or making Context a class rather than an + object. But I am not sure. + */ lazy val system = ActorSystem("deepdive") var outputDir = "out" // This needs to be variable since we might reassign it in relearnFrom feature diff --git a/src/main/scala/org/deepdive/DeepDive.scala b/src/main/scala/org/deepdive/DeepDive.scala index 3c3743218..decd4cf96 100644 --- a/src/main/scala/org/deepdive/DeepDive.scala +++ b/src/main/scala/org/deepdive/DeepDive.scala @@ -176,6 +176,16 @@ object DeepDive extends Logging { // end try } catch { + /* Notes @zifei: + This non-termination fix does not guarantee fixing all + non-termination errors, since we has multiple Akka actors + (InferenceManager, ExtractionManager, etc), and simply catching + errors in DeepDive class may not handle all cases. + + But this try-catch do fix some errors, e.g. invalid configuration + file (mandatory fields are not present) (in: Settings.loadFromConfig). + Tested in BrokenTest.scala + */ case e: Exception => // In case of any exception Context.shutdown() diff --git a/src/test/resources/application.conf b/src/test/resources/application.conf index db53db322..96fc54b83 100644 --- a/src/test/resources/application.conf +++ b/src/test/resources/application.conf @@ -15,7 +15,9 @@ deepdive { password: ${PGPASSWORD} } - # Use quiet output for tests + # Use quiet output for tests. Use 0.5 as learning rate for all tests + # gives more stable result than the default (0.1). May need to find + # a better default setting. sampler.sampler_args: "-l 300 -i 500 -s 1 --alpha 0.5 --quiet" } diff --git a/src/test/scala/integration/MysqlSpouseExample.scala b/src/test/scala/integration/MysqlSpouseExample.scala index 46479e06f..0f4e0b82c 100644 --- a/src/test/scala/integration/MysqlSpouseExample.scala +++ b/src/test/scala/integration/MysqlSpouseExample.scala @@ -238,6 +238,12 @@ deepdive { def processResults(): Double = { JdbcDataStore.init(config) var score = 0.0; + + // There is a chance that num_incorrect is 0 in bucket=9, in this case + // num_incorrect will be NULL rather than 0 in the + // has_spouse_is_true_calibration table. Not sure if there is a design + // decision there or is this a bug. But this query will try to compute + // X / (X + NULL) and get NULL as result, which breaks the result. val checkQuery = """select num_correct / (num_correct + CASE WHEN num_incorrect IS NULL THEN 0 ELSE num_incorrect END) from has_spouse_is_true_calibration where bucket = 9""" diff --git a/src/test/scala/integration/PostgresSpouseExample.scala b/src/test/scala/integration/PostgresSpouseExample.scala index 33f588fbf..006544bde 100644 --- a/src/test/scala/integration/PostgresSpouseExample.scala +++ b/src/test/scala/integration/PostgresSpouseExample.scala @@ -195,6 +195,12 @@ deepdive { def processResults(): Double = { JdbcDataStore.init(config) var score = 0.0; + + // There is a chance that num_incorrect is 0 in bucket=9, in this case + // num_incorrect will be NULL rather than 0 in the + // has_spouse_is_true_calibration table. Not sure if there is a design + // decision there or is this a bug. But this query will try to compute + // X / (X + NULL) and get NULL as result, which breaks the result. val checkQuery = """select num_correct::real / (num_correct + CASE WHEN num_incorrect IS NULL THEN 0 ELSE num_incorrect END) from has_spouse_is_true_calibration where bucket = 9""" From 0df80da4ad98fe522ccaf7cc1e1a5115fc21d546 Mon Sep 17 00:00:00 2001 From: Matteo Riondato Date: Tue, 25 Nov 2014 07:38:08 +0100 Subject: [PATCH 14/17] Add changelog (WIP) for point release --- doc/doc/changelog/0.04.1-alpha.md | 9 +++++++++ doc/index.md | 1 + 2 files changed, 10 insertions(+) create mode 100644 doc/doc/changelog/0.04.1-alpha.md diff --git a/doc/doc/changelog/0.04.1-alpha.md b/doc/doc/changelog/0.04.1-alpha.md new file mode 100644 index 000000000..6bf6e8e1b --- /dev/null +++ b/doc/doc/changelog/0.04.1-alpha.md @@ -0,0 +1,9 @@ +--- +layout: default +--- + +# Changelog for release 0.0.4.1-alpha (11/25/2014) + +This release focuses mostly on bug fixing. + +- diff --git a/doc/index.md b/doc/index.md index 8305136b7..48541e279 100644 --- a/doc/index.md +++ b/doc/index.md @@ -96,6 +96,7 @@ Riondato](http://cs.brown.edu/~matteo/). ### Updates & Changelog +- [Changelog for version 0.04.1-alpha](doc/changelog/0.04.1-alpha.html) (11/25/2014) - [Changelog for version 0.04-alpha](doc/changelog/0.04-alpha.html) (11/19/2014) - [Changelog for version 0.03.2-alpha](doc/changelog/0.03.2-alpha.html) (09/16/2014) - [Changelog for version 0.03.1-alpha](doc/changelog/0.03.1-alpha.html) (08/15/2014) From 940ffa31fa8b0da788da7e6984894b7787bc96e2 Mon Sep 17 00:00:00 2001 From: Matteo Riondato Date: Tue, 25 Nov 2014 07:40:03 +0100 Subject: [PATCH 15/17] Start filling changelog --- doc/doc/changelog/0.04.1-alpha.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/doc/changelog/0.04.1-alpha.md b/doc/doc/changelog/0.04.1-alpha.md index 6bf6e8e1b..a703e51fb 100644 --- a/doc/doc/changelog/0.04.1-alpha.md +++ b/doc/doc/changelog/0.04.1-alpha.md @@ -6,4 +6,6 @@ layout: default This release focuses mostly on bug fixing. -- +- Improve handling of failures in extractors and inference rules. +- Add support for running tests on GreenPlum. + From 5e221d3f9c944712896a184e4b2a3f0f9131f8cc Mon Sep 17 00:00:00 2001 From: Matteo Riondato Date: Tue, 25 Nov 2014 07:52:00 +0100 Subject: [PATCH 16/17] Mention -q, --quiet --- doc/doc/basics/sampler.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/doc/basics/sampler.md b/doc/doc/basics/sampler.md index f84c23fb5..959577f41 100644 --- a/doc/doc/basics/sampler.md +++ b/doc/doc/basics/sampler.md @@ -29,6 +29,9 @@ The sampler executable can be invoked independently of DeepDive. The following arguments to the sampler executable are used to specify input files, output file, and learning and inference parameters: + -q, --quiet + Quiet output + -c , --n_datacopy (Linux only) Number of data copies From 63951a1e51e178a39e0be1d6054c52e1b542c034 Mon Sep 17 00:00:00 2001 From: Matteo Riondato Date: Tue, 25 Nov 2014 07:52:05 +0100 Subject: [PATCH 17/17] Fill changelog --- doc/doc/changelog/0.04.1-alpha.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/doc/changelog/0.04.1-alpha.md b/doc/doc/changelog/0.04.1-alpha.md index a703e51fb..c3e649b47 100644 --- a/doc/doc/changelog/0.04.1-alpha.md +++ b/doc/doc/changelog/0.04.1-alpha.md @@ -4,8 +4,12 @@ layout: default # Changelog for release 0.0.4.1-alpha (11/25/2014) -This release focuses mostly on bug fixing. +This release focuses mostly on bug fixing and minor new features. - Improve handling of failures in extractors and inference rules. - Add support for running tests on GreenPlum. +- Add support for `-q`, `--quiet` in the DimmWitted sampler. This allows to + reduce the verbosity of the output. +- Remove some dead code. +- Fix a small bug in the `spouse_example` test.