|
From: <mm...@us...> - 2012-12-04 15:53:40
|
Revision: 3305
http://dmcs.svn.sourceforge.net/dmcs/?rev=3305&view=rev
Author: mmsc
Date: 2012-12-04 15:53:28 +0000 (Tue, 04 Dec 2012)
Log Message:
-----------
Add a simple caching.
Modified Paths:
--------------
dmcs/branches/dmcs1.5/include/mcs/NewContext.h
dmcs/branches/dmcs1.5/src/mcs/CycleBreaker.cpp
dmcs/branches/dmcs1.5/src/mcs/NewContext.cpp
dmcs/branches/dmcs1.5/src/mcs/NormalContext.cpp
Modified: dmcs/branches/dmcs1.5/include/mcs/NewContext.h
===================================================================
--- dmcs/branches/dmcs1.5/include/mcs/NewContext.h 2012-12-04 11:13:39 UTC (rev 3304)
+++ dmcs/branches/dmcs1.5/include/mcs/NewContext.h 2012-12-04 15:53:28 UTC (rev 3305)
@@ -34,6 +34,7 @@
#include "dmcs/Instantiator.h"
#include "mcs/BeliefTable.h"
#include "mcs/BridgeRuleEvaluator.h"
+#include "mcs/CachePosition.h"
#include "mcs/QueryPlan.h"
#include "network/RequestDispatcher.h"
#include "mcs/StreamingJoiner.h"
@@ -70,12 +71,17 @@
NewBeliefState*
next_guess(NewBeliefState* current_guess,
NewBeliefState* guessing_input);
+
+ NewBeliefState*
+ jump_guess(NewBeliefState* guessing_input,
+ std::size_t step);
bool
compute(NewBeliefState* input,
std::size_t& k1,
std::size_t& k2,
std::size_t parent_qid,
+ std::size_t current_step,
EvaluatorPtr eval,
NewConcurrentMessageDispatcherPtr md);
@@ -87,6 +93,7 @@
bool
read_and_send_k1_k2(std::size_t parent_qid,
+ std::size_t current_step,
bool normal_solve,
std::size_t& k1,
std::size_t& k2,
@@ -103,6 +110,7 @@
protected:
std::size_t ctx_id;
std::size_t ctx_offset;
+ CachePosition cache;
ReturnPlanMapPtr return_plan;
ContextQueryPlanMapPtr queryplan_map;
BridgeRuleTablePtr bridge_rules;
Modified: dmcs/branches/dmcs1.5/src/mcs/CycleBreaker.cpp
===================================================================
--- dmcs/branches/dmcs1.5/src/mcs/CycleBreaker.cpp 2012-12-04 11:13:39 UTC (rev 3304)
+++ dmcs/branches/dmcs1.5/src/mcs/CycleBreaker.cpp 2012-12-04 15:53:28 UTC (rev 3305)
@@ -118,19 +118,35 @@
// different from non-cycle-breaking task, we will guess for all input here,
// including the bridge atoms from neighbors that might not be involved in the current cycle.
- NewBeliefState* current_guess = new NewBeliefState(BeliefStateOffset::instance()->NO_BLOCKS(),
- BeliefStateOffset::instance()->SIZE_BS());
+ NewBeliefState* current_guess;
+
+ std::size_t current_step = cache.find_position(k1);
+ DBGLOG(DBG, "CycleBreaker::startup: current_step = " << current_step);
+ if (current_step == 0)
+ {
+ current_guess = new NewBeliefState(BeliefStateOffset::instance()->NO_BLOCKS(),
+ BeliefStateOffset::instance()->SIZE_BS());
- (*current_guess) = (*starting_guess);
+ (*current_guess) = (*starting_guess);
+ DBGLOG(DBG, "CycleBreaker::startup: starting_guess = " << *current_guess);
+ }
+ else
+ {
+ current_guess = jump_guess(total_guessing_input, current_step);
+ DBGLOG(DBG, "CycleBreaker::startup: jump_guess = " << *current_guess);
+ }
+
DBGLOG(DBG, "CycleBreaker::startup: starting guess = " << *current_guess);
do
{
- if (compute(current_guess, k1, k2, parent_qid, eval, md)) break;
+ if (compute(current_guess, k1, k2, parent_qid, current_step, eval, md)) break;
+
+ current_step++;
current_guess = next_guess(current_guess, total_guessing_input);
if (current_guess)
{
- DBGLOG(DBG, "CycleBreaker::startup: current guess = " << *current_guess);
+ DBGLOG(DBG, "CycleBreaker::startup: next guess = " << *current_guess);
}
else
{
Modified: dmcs/branches/dmcs1.5/src/mcs/NewContext.cpp
===================================================================
--- dmcs/branches/dmcs1.5/src/mcs/NewContext.cpp 2012-12-04 11:13:39 UTC (rev 3304)
+++ dmcs/branches/dmcs1.5/src/mcs/NewContext.cpp 2012-12-04 15:53:28 UTC (rev 3305)
@@ -68,6 +68,7 @@
std::size_t& k1,
std::size_t& k2,
std::size_t parent_qid,
+ std::size_t current_step,
EvaluatorPtr eval,
NewConcurrentMessageDispatcherPtr md)
{
@@ -86,12 +87,87 @@
int timeout = 0;
md->send(NewConcurrentMessageDispatcher::EVAL_IN_MQ, eval->getInQueue(), heads, timeout);
- return read_and_send_k1_k2(parent_qid, true, k1, k2, eval, md);
+ return read_and_send_k1_k2(parent_qid, current_step, true, k1, k2, eval, md);
}
NewBeliefState*
+NewContext::jump_guess(NewBeliefState* guessing_input,
+ std::size_t step)
+{
+ NewBeliefState* guess = new NewBeliefState(BeliefStateOffset::instance()->NO_BLOCKS(),
+ BeliefStateOffset::instance()->SIZE_BS());
+ (*guess) = (*starting_guess);
+
+ if (step == 0)
+ {
+ return guess;
+ }
+
+ std::size_t n = BeliefStateOffset::instance()->NO_BLOCKS();
+ std::size_t s = BeliefStateOffset::instance()->SIZE_BS();
+
+ // convert step to binary, store in a vector
+ std::vector<bool> bin_step;
+
+ while (step > 0)
+ {
+ bool rem = ((step%2) == 1);
+ bin_step.push_back(rem);
+ step /= 2;
+ }
+
+ std::vector<bool>::const_iterator it = bin_step.begin();
+ std::size_t first_bit_set = guessing_input->getFirst();
+ assert (first_bit_set % (s+1) == 0);
+ std::size_t bit = first_bit_set;
+
+ // now turn on/off corresponding bits based on the stored binary representation of step
+ do
+ {
+ bit = guessing_input->getNext(bit);
+
+ if (bit % (s+1) != 0)
+ {
+ if (*it)
+ {
+ guess->set(bit, NewBeliefState::DMCS_TRUE);
+ }
+ else
+ {
+ guess->set(bit, NewBeliefState::DMCS_FALSE);
+ }
+
+ it++;
+ if (it == bin_step.end())
+ {
+ break;
+ }
+ }
+ }
+ while (bit);
+
+
+ while (bit)
+ {
+ bit = guessing_input->getNext(bit);
+ if (bit % (s+1) != 0)
+ {
+ guess->set(bit, NewBeliefState::DMCS_FALSE);
+ }
+ }
+
+ if (it != bin_step.end())
+ {
+ delete guess;
+ guess = NULL;
+ }
+
+ return guess;
+}
+
+NewBeliefState*
NewContext::next_guess(NewBeliefState* current_guess,
NewBeliefState* guessing_input)
{
@@ -142,8 +218,10 @@
}
+
bool
NewContext::read_and_send_k1_k2(std::size_t parent_qid,
+ std::size_t current_step,
bool normal_solve,
std::size_t& k1,
std::size_t& k2,
@@ -179,6 +257,12 @@
assert (models_counter < k1);
k2 -= models_counter;
k1 -= models_counter;
+
+ if (current_step > 0)
+ {
+ DBGLOG(DBG, "NewContext::read_and_send_k1_k2(): update cache with (" << current_step << "," << models_counter << ")");
+ cache.update_cache(current_step, models_counter);
+ }
}
else if (models_sent < k2 - k1 + 1)
// the number models returned by the Evaluator is in between k1,k2.
Modified: dmcs/branches/dmcs1.5/src/mcs/NormalContext.cpp
===================================================================
--- dmcs/branches/dmcs1.5/src/mcs/NormalContext.cpp 2012-12-04 11:13:39 UTC (rev 3304)
+++ dmcs/branches/dmcs1.5/src/mcs/NormalContext.cpp 2012-12-04 15:53:28 UTC (rev 3305)
@@ -246,11 +246,22 @@
{
if (must_guess(input))
{
- NewBeliefState* current_guess = new NewBeliefState(BeliefStateOffset::instance()->NO_BLOCKS(),
- BeliefStateOffset::instance()->SIZE_BS());
+ NewBeliefState* current_guess;
+
+ std::size_t current_step = cache.find_position(k1);
+
+ if (current_step == 0)
+ {
+ current_guess = new NewBeliefState(BeliefStateOffset::instance()->NO_BLOCKS(),
+ BeliefStateOffset::instance()->SIZE_BS());
+
+ (*current_guess) = (*starting_guess);
+ }
+ else
+ {
+ current_guess = jump_guess(total_guessing_input, current_step);
+ }
- (*current_guess) = (*starting_guess);
-
// iterate over all possible guesses or until k1 --> k2 models were computed
DBGLOG(DBG, "NormalContext::process_input(). Total guessing input = " << *total_guessing_input);
DBGLOG(DBG, "NormalContext::process_input(). input = " << *input);
@@ -267,12 +278,13 @@
DBGLOG(DBG, "NormalContext::process_input(). input = " << *input);
DBGLOG(DBG, "NormalContext::process_input(). combined input = " << *combined_input);
- if (compute(combined_input, k1, k2, parent_qid, eval, md))
+ if (compute(combined_input, k1, k2, parent_qid, current_step, eval, md))
{
computed_k1_k2 = true;
break;
}
+ current_step++;
current_guess = next_guess(current_guess, total_guessing_input);
if (current_guess)
{
@@ -296,7 +308,9 @@
}
else
{
- return compute(input, k1, k2, parent_qid, eval, md);
+ // disable caching
+ std::size_t current_step_zero = 0;
+ return compute(input, k1, k2, parent_qid, current_step_zero, eval, md);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|