当前位置: 首页>>代码示例>>C++>>正文


C++ XorClause::getData方法代码示例

本文整理汇总了C++中XorClause::getData方法的典型用法代码示例。如果您正苦于以下问题:C++ XorClause::getData方法的具体用法?C++ XorClause::getData怎么用?C++ XorClause::getData使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在XorClause的用法示例。


在下文中一共展示了XorClause::getData方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: getTwoLongXor

/**
@brief Returns the 2-long xor clause that has been made of the longer xor-clause under current assignement

We KNOW that the xorclause "c" passed as a parameter must be 2-long. We just
need it so that we can work with it. We KNOW it's 2-long because of the
data structures and functions in place

@p[in] c MUST be a 2-long xor clause under current assignement
 */
FailedLitSearcher::TwoLongXor FailedLitSearcher::getTwoLongXor(const XorClause& c) {
    TwoLongXor tmp;
    uint32_t num = 0;
    tmp.inverted = c.xorEqualFalse();

    for (const Lit *l = c.getData(), *end = l + c.size(); l != end; l++) {
        if (solver.assigns[l->var()] == l_Undef) {
            assert(num < 2);
            tmp.var[num] = l->var();
            num++;
        } else {
            tmp.inverted ^= (solver.assigns[l->var()] == l_True);
        }
    }

#ifdef VERBOSE_DEUBUG
    if (num != 2) {
        std::cout << "Num:" << num << std::endl;
        c.plainPrint();
    }
#endif

    std::sort(&tmp.var[0], &tmp.var[0] + 2);
    assert(num == 2);
    return tmp;
}
开发者ID:zenna,项目名称:halisi,代码行数:35,代码来源:FailedLitSearcher.cpp

示例2: handleUpdatedClause

/**
@brief Helper function for replace_set()
*/
bool VarReplacer::handleUpdatedClause(XorClause& c, const Var origVar1, const Var origVar2)
{
    uint32_t origSize = c.size();
    std::sort(c.getData(), c.getDataEnd());
    Lit p;
    uint32_t i, j;
    for (i = j = 0, p = lit_Undef; i != c.size(); i++) {
        if (c[i].var() == p.var()) {
            //added, but easily removed
            j--;
            p = lit_Undef;
            if (!solver.assigns[c[i].var()].isUndef())
                c.invert(solver.assigns[c[i].var()].getBool());
        } else if (solver.assigns[c[i].var()].isUndef()) //just add
            c[j++] = p = c[i];
        else c.invert(solver.assigns[c[i].var()].getBool()); //modify xorEqualFalse instead of adding
    }
    c.shrink(i - j);

    //Even if i==j, the clause *has* changed
    c.setChanged();

    #ifdef VERBOSE_DEBUG
    cout << "xor-clause after replacing: ";
    c.plainPrint();
    #endif

    switch (c.size()) {
    case 0:
        solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
        if (!c.xorEqualFalse()) {
            solver.ok = false;
        }
        return true;
    case 1:
        solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
        solver.uncheckedEnqueue(Lit(c[0].var(), c.xorEqualFalse()));
        solver.ok = (solver.propagate<false>().isNULL());
        return true;
    case 2: {
        solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
        c[0] = c[0].unsign() ^ c.xorEqualFalse();
        c[1] = c[1].unsign();
        addBinaryXorClause(c[0], c[1]);
        return true;
    }
    default:
        solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
        solver.attachClause(c);
        return false;
    }

    assert(false);
    return false;
}
开发者ID:audemard,项目名称:CVC4,代码行数:58,代码来源:VarReplacer.cpp

示例3: cleanClause

inline bool ClauseCleaner::cleanClause(XorClause& c)
{
  Lit* i, *j, *end;
  Var origVar1 = c[0].var();
  Var origVar2 = c[1].var();
  uint32_t origSize = c.size();
  for (i = j = c.getData(), end = i + c.size(); i != end; i++)
  {
    const lbool& val = solver.assigns[i->var()];
    if (val.isUndef())
    {
      *j = *i;
      j++;
    }
    else
      c.invert(val.getBool());
  }
  c.shrink(i - j);

  assert(c.size() != 1);
  switch (c.size())
  {
    case 0:
    {
      solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
      return true;
    }
    case 2:
    {
      c[0] = c[0].unsign();
      c[1] = c[1].unsign();
      solver.varReplacer->replace(c, c.xor_clause_inverted(), c.getGroup());
      solver.detachModifiedClause(origVar1, origVar2, origSize, &c);
      return true;
    }
    default:
    {
      if (i - j > 0)
      {
        c.setStrenghtened();
        solver.clauses_literals -= i - j;
      }
      return false;
    }
  }

  assert(false);
  return false;
}
开发者ID:jamesbornholt,项目名称:stp,代码行数:49,代码来源:ClauseCleaner.cpp


注:本文中的XorClause::getData方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。