void ModelEnumerator::initProjection(SharedContext& ctx) { if (!project_) { return; } project_->clear(); const SymbolTable& index = ctx.symbolTable(); if (index.type() == SymbolTable::map_indirect) { for (SymbolTable::const_iterator it = index.begin(); it != index.end(); ++it) { if (!it->second.name.empty() && it->second.name[0] != '_') { addProjectVar(ctx, it->second.lit.var(), true); } } for (VarVec::const_iterator it = project_->begin(), end = project_->end(); it != end; ++it) { ctx.unmark(*it); } } else { for (Var v = 1; v < index.size(); ++v) { addProjectVar(ctx, v, false); } } // tag projection nogoods with step literal (if any). addProjectVar(ctx, ctx.stepLiteral().var(), false); if (project_->empty()) { // We project to the empty set. Add true-var so that // we can distinguish this case from unprojected search project_->push_back(0); } }