void CompressInterface::rearrangeCnfFactor(CFactor &cnfClause) { State state(cnfClause.vars()); vector<size_t> (cnfClause.vars().size()); vector<size_t> pos,neg,sigma; for (size_t i=0; i<cnfClause.states(); i++) { if (cnfClause[i] == 1) { for (vector<Var>::const_iterator varIter=cnfClause.vars().begin(); varIter!=cnfClause.vars().end();varIter++) { if (state(*varIter) == 0) { pos.push_back(varIter - cnfClause.vars().begin()); } else { neg.push_back(varIter - cnfClause.vars().begin()); } } break; } else if (cnfClause[i] == 0) { //TODO handle factors which contain zero states // in such cases the possible zero state could have been clamped; // possible solutions: // i) restore factor from backup (requires to clamp factors accordingly) // ii) cache zero states in advance return; } state++; } sigma.insert(sigma.begin(),pos.begin(), pos.end()); sigma.insert(sigma.begin() + pos.size(),neg.begin(), neg.end()); cnfClause.sigma() = sigma; }
CFactorGraph CompressInterface::createCFactorGraph() { createVarClustering(); createFacClustering(); // create lifted fg here vector<CFactor> superFacs; // clusterIdx => facIdx for (map<size_t,size_t>::iterator facIter = _facRepr.begin(); facIter != _facRepr.end(); facIter++) { VarSet superVarSet; foreach (const dai::BipartiteGraph::Neighbor &tmpVar, _cfg.nbF(facIter->second)) { Var varCluster = _varRepr[_varColorVec[tmpVar]]; if (!superVarSet.contains(varCluster)) { superVarSet |= Var(varCluster); } } CFactor superFac = CFactor(superVarSet, _cfg.factor(facIter->second).p()); superFac.sigma() = _cfg.factor(facIter->second).sigma(); superFac.position() = _cfg.factor(facIter->second).position(); superFac.counts() = createCounts(facIter->second, superVarSet); superFacs.push_back(superFac); } return CFactorGraph(superFacs); }