|
From: <chr...@us...> - 2012-02-22 10:52:38
|
Revision: 3560
http://dlvhex.svn.sourceforge.net/dlvhex/?rev=3560&view=rev
Author: chrisr86
Date: 2012-02-22 10:52:27 +0000 (Wed, 22 Feb 2012)
Log Message:
-----------
prepare ProgramCtx for global nogood learning
Modified Paths:
--------------
dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineGuessAndCheckModelGenerator.h
dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuinePlainModelGenerator.h
dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineWellfoundedModelGenerator.h
dlvhex/branches/dlvhex-refactoring/include/dlvhex2/ProgramCtx.h
dlvhex/branches/dlvhex-refactoring/src/GenuineGuessAndCheckModelGenerator.cpp
dlvhex/branches/dlvhex-refactoring/src/GenuinePlainModelGenerator.cpp
dlvhex/branches/dlvhex-refactoring/src/GenuineWellfoundedModelGenerator.cpp
Modified: dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineGuessAndCheckModelGenerator.h
===================================================================
--- dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineGuessAndCheckModelGenerator.h 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineGuessAndCheckModelGenerator.h 2012-02-22 10:52:27 UTC (rev 3560)
@@ -80,7 +80,7 @@
public:
GenuineGuessAndCheckModelGenerator(Factory& factory, InterpretationConstPtr input);
- virtual ~GenuineGuessAndCheckModelGenerator() { DBGLOG(DBG, "Final Statistics:" << std::endl << solver->getStatistics()); }
+ virtual ~GenuineGuessAndCheckModelGenerator();
// generate and return next model, return null after last model
virtual InterpretationPtr generateNextModel();
Modified: dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuinePlainModelGenerator.h
===================================================================
--- dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuinePlainModelGenerator.h 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuinePlainModelGenerator.h 2012-02-22 10:52:27 UTC (rev 3560)
@@ -80,7 +80,7 @@
public:
GenuinePlainModelGenerator(Factory& factory, InterpretationConstPtr input);
- virtual ~GenuinePlainModelGenerator() { DBGLOG(DBG, "Final Statistics:" << std::endl << solver->getStatistics()); }
+ virtual ~GenuinePlainModelGenerator();
// generate and return next model, return null after last model
virtual InterpretationPtr generateNextModel();
Modified: dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineWellfoundedModelGenerator.h
===================================================================
--- dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineWellfoundedModelGenerator.h 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/include/dlvhex2/GenuineWellfoundedModelGenerator.h 2012-02-22 10:52:27 UTC (rev 3560)
@@ -63,7 +63,7 @@
// members
public:
GenuineWellfoundedModelGenerator(Factory& factory, InterpretationConstPtr input);
- virtual ~GenuineWellfoundedModelGenerator() { }
+ virtual ~GenuineWellfoundedModelGenerator();
// generate and return next model, return null after last model
virtual InterpretationPtr generateNextModel();
Modified: dlvhex/branches/dlvhex-refactoring/include/dlvhex2/ProgramCtx.h
===================================================================
--- dlvhex/branches/dlvhex-refactoring/include/dlvhex2/ProgramCtx.h 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/include/dlvhex2/ProgramCtx.h 2012-02-22 10:52:27 UTC (rev 3560)
@@ -46,6 +46,7 @@
#include "dlvhex2/EvalGraphBuilder.h"
#include "dlvhex2/ModelBuilder.h"
#include "dlvhex2/Registry.h"
+#include "dlvhex2/Nogood.h"
#include <boost/shared_ptr.hpp>
#include <boost/functional/factory.hpp>
@@ -115,6 +116,56 @@
Interpretation::Ptr edb;
std::vector<InterpretationPtr> edbList;
+ // global learning
+ class GlobalNogoodRepository : public NogoodContainer{
+ private:
+ NogoodSet ns;
+ std::vector<NogoodContainerPtr> listeners;
+
+ public:
+ int addNogood(Nogood ng){
+ // notify all listeners about new nogoods
+ DBGLOG(DBG, "Notifying " << listeners.size() << " listeners about new global nogood " << ng);
+ BOOST_FOREACH (NogoodContainerPtr listener, listeners){
+ listener->addNogood(ng);
+ }
+
+ // record global nogood
+ return ns.addNogood(ng);
+ }
+
+ void removeNogood(int index){
+ DBGLOG(DBG, "Removing global nogood " << ns.nogoods[index]);
+ ns.removeNogood(index);
+ }
+
+ int getNogoodCount(){
+ DBGLOG(DBG, "Have " << ns.nogoods.size() << " global nogoods");
+ return ns.nogoods.size();
+ }
+
+ void addNogoodListener(NogoodContainerPtr nc, bool copyExistingNogoods = true){
+ DBGLOG(DBG, "Adding global nogood listener");
+ listeners.push_back(nc);
+
+ // notify about existing nogoods
+ if(copyExistingNogoods){
+ DBGLOG(DBG, "Notifying new listener about " << ns.nogoods.size() << " existing global nogoods");
+ BOOST_FOREACH (Nogood ng, ns.nogoods){
+ nc->addNogood(ng);
+ }
+ }
+ }
+
+ void removeNogoodListener(NogoodContainerPtr nc){
+ DBGLOG(DBG, "Removing global nogood listener");
+ while (std::find(listeners.begin(), listeners.end(), nc) != listeners.end()){
+ listeners.erase(std::find(listeners.begin(), listeners.end(), nc));
+ }
+ }
+ };
+ GlobalNogoodRepository globalNogoods;
+
// maxint setting, this is ID_FAIL if it is not specified, an integer term otherwise
uint32_t maxint;
Modified: dlvhex/branches/dlvhex-refactoring/src/GenuineGuessAndCheckModelGenerator.cpp
===================================================================
--- dlvhex/branches/dlvhex-refactoring/src/GenuineGuessAndCheckModelGenerator.cpp 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/src/GenuineGuessAndCheckModelGenerator.cpp 2012-02-22 10:52:27 UTC (rev 3560)
@@ -580,14 +580,24 @@
// OrdinaryASPProgram gprogram = grounder->getGroundProgram();
// igas = InternalGroundDASPSolverPtr(new InternalGroundDASPSolver(factory.ctx, gprogram));
solver = GenuineSolver::getInstance(factory.ctx, program);
+ factory.ctx.globalNogoods.addNogoodListener(solver);
if (factory.ctx.config.getOption("ExternalLearningPartial")){
solver->addExternalLearner(this);
}
+//Nogood ng1;
+//ng1.insert(solver->createLiteral(11));
+//factory.ctx.globalNogoods.addNogood(ng1);
+
firstLearnCall = true;
}
}
+GenuineGuessAndCheckModelGenerator::~GenuineGuessAndCheckModelGenerator(){
+ factory.ctx.globalNogoods.removeNogoodListener(solver);
+ DBGLOG(DBG, "Final Statistics:" << std::endl << solver->getStatistics());
+}
+
namespace
{
Modified: dlvhex/branches/dlvhex-refactoring/src/GenuinePlainModelGenerator.cpp
===================================================================
--- dlvhex/branches/dlvhex-refactoring/src/GenuinePlainModelGenerator.cpp 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/src/GenuinePlainModelGenerator.cpp 2012-02-22 10:52:27 UTC (rev 3560)
@@ -162,7 +162,12 @@
OrdinaryASPProgram program(reg, factory.xidb, postprocessedInput, factory.ctx.maxint, mask);
solver = GenuineSolver::getInstance(factory.ctx, program);
+ factory.ctx.globalNogoods.addNogoodListener(solver);
+//Nogood ng1;
+//ng1.insert(solver->createLiteral(29));
+//factory.ctx.globalNogoods.addNogood(ng1);
+
// grounder = InternalGrounderPtr(new InternalGrounder(factory.ctx, program));
// if (factory.ctx.config.getOption("Instantiate")){
// std::cout << "% Component " << &(factory.ci) << std::endl;
@@ -177,6 +182,11 @@
// currentanswer = 0;
}
+GenuinePlainModelGenerator::~GenuinePlainModelGenerator(){
+ factory.ctx.globalNogoods.removeNogoodListener(solver);
+ DBGLOG(DBG, "Final Statistics:" << std::endl << solver->getStatistics());
+}
+
GenuinePlainModelGenerator::InterpretationPtr
GenuinePlainModelGenerator::generateNextModel()
{
Modified: dlvhex/branches/dlvhex-refactoring/src/GenuineWellfoundedModelGenerator.cpp
===================================================================
--- dlvhex/branches/dlvhex-refactoring/src/GenuineWellfoundedModelGenerator.cpp 2012-02-21 19:10:59 UTC (rev 3559)
+++ dlvhex/branches/dlvhex-refactoring/src/GenuineWellfoundedModelGenerator.cpp 2012-02-22 10:52:27 UTC (rev 3560)
@@ -126,6 +126,9 @@
{
}
+GenuineWellfoundedModelGenerator::~GenuineWellfoundedModelGenerator(){
+}
+
GenuineWellfoundedModelGenerator::InterpretationPtr
GenuineWellfoundedModelGenerator::generateNextModel()
{
@@ -215,6 +218,7 @@
// InternalGroundDASPSolver igas(factory.ctx, gprogram);
GenuineSolverPtr solver = GenuineSolver::getInstance(factory.ctx, program);
+ factory.ctx.globalNogoods.addNogoodListener(solver);
// there must be either no or exactly one answer set
InterpretationPtr model = solver->projectToOrdinaryAtoms(solver->getNextModel());
@@ -233,6 +237,7 @@
dst->getStorage().swap(model->getStorage());
DBGLOG(DBG,"after evaluating ASP: dst is " << *dst);
DBGLOG(DBG, "Final Statistics:" << std::endl << solver->getStatistics());
+ factory.ctx.globalNogoods.removeNogoodListener(solver);
}
// check whether new interpretation is superset of old one
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|