コード例 #1
0
 ostream& output(ostream& str) const
 {
  CALLM(_name,"output(ostream& str) const");
  str << '{';
  for (const CarrierType* el = _registered.begin(); el < _registered.end(); el++)
   {
    str << scoreOf(*el) << '*' << *el;
    if (el != _registered.last()) str << ' ';
   };  
  return str << '}';
 };
コード例 #2
0
void Solver::decideLiteral() {
	// establish another decision stack level
	stack_.push_back(
			StackLevel(stack_.top().currentRemainingComponent(),
					literal_stack_.size(),
					component_analyzer_.component_stack_size()));
	float score;
	float max_score_remembered = -1;
	float max_score_forgotten = -1;
	unsigned max_score_var = 0;
	unsigned max_score_var_remembered = 0;
	unsigned max_score_var_forgotten = 0;
	for (auto it =
			component_analyzer_.superComponentOf(stack_.top()).varsBegin();
			*it != varsSENTINEL; it++) {
		score = scoreOf(*it);
		if (rememberedVarNums.find(*it) != rememberedVarNums.end()) {
			if (score > max_score_remembered) {
				max_score_remembered = score;
				max_score_var_remembered = *it;
			}
		} else {
			if (score > max_score_forgotten) {
				max_score_forgotten = score;
				max_score_var_forgotten = *it;
			}
		}

	}

	if (max_score_var_remembered != 0 ) {
		max_score_var = max_score_var_remembered;
	} else if (max_score_var_forgotten != 0 ) {
		max_score_var = max_score_var_forgotten;
	} else assert(0);

	// this assert should always hold,
	// if not then there is a bug in the logic of countSAT();
	assert(max_score_var != 0);

	LiteralID theLit(max_score_var,
			literal(LiteralID(max_score_var, true)).activity_score_
					> literal(LiteralID(max_score_var, false)).activity_score_);

	setLiteralIfFree(theLit);
	statistics_.num_decisions_++;

	if (statistics_.num_decisions_ % 128 == 0)
		decayActivities();

	assert(
			stack_.top().remaining_components_ofs() <= component_analyzer_.component_stack_size());
}