本文整理汇总了C++中ASTVec::size方法的典型用法代码示例。如果您正苦于以下问题:C++ ASTVec::size方法的具体用法?C++ ASTVec::size怎么用?C++ ASTVec::size使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ASTVec
的用法示例。
在下文中一共展示了ASTVec::size方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
// Does some simple caching of prior results.
void
Cpp_interface::checkSat(const ASTVec & assertionsSMT2)
{
if (ignoreCheckSatRequest)
return;
bm.GetRunTimes()->stop(RunTimes::Parsing);
checkInvariant();
assert(assertionsSMT2.size() == cache.size());
Entry& last_run = cache.back();
if ((last_run.node_number != assertionsSMT2.back().GetNodeNum()) && (last_run.result == SOLVER_SATISFIABLE))
{
// extra asserts might have been added to it,
// flipping from sat to unsat. But never from unsat to sat.
last_run.result = SOLVER_UNDECIDED;
}
// We might have run this query before, or it might already be shown to be unsat. If it was sat,
// we've stored the result (but not the model), so we can shortcut and return what we know.
if (!((last_run.result == SOLVER_SATISFIABLE) || last_run.result == SOLVER_UNSATISFIABLE))
{
resetSolver();
ASTNode query;
if (assertionsSMT2.size() > 1)
query = nf->CreateNode(AND, assertionsSMT2);
else if (assertionsSMT2.size() == 1)
query = assertionsSMT2[0];
else
query = bm.ASTTrue;
SOLVER_RETURN_TYPE last_result = GlobalSTP->TopLevelSTP(query, bm.ASTFalse);
// Store away the answer. Might be timeout, or error though..
last_run = Entry(last_result);
last_run.node_number = assertionsSMT2.back().GetNodeNum();
// It's satisfiable, so everything beneath it is satisfiable too.
if (last_result == SOLVER_SATISFIABLE)
{
for (int i = 0; i < cache.size(); i++)
{
assert(cache[i].result != SOLVER_UNSATISFIABLE);
cache[i].result = SOLVER_SATISFIABLE;
}
}
}
if (bm.UserFlags.quick_statistics_flag)
{
bm.GetRunTimes()->print();
}
(GlobalSTP->tosat)->PrintOutput(last_run.result);
bm.GetRunTimes()->start(RunTimes::Parsing);
}
示例2: searchTerm
bool PropagateEqualities::searchTerm(const ASTNode& lhs, const ASTNode& rhs)
{
const unsigned width = lhs.GetValueWidth();
if (lhs == rhs)
return true;
if (lhs.GetKind() == SYMBOL)
return simp->UpdateSubstitutionMap(lhs, rhs); // checks whether it's been
// solved for, or if the RHS
// contains the LHS.
if (lhs.GetKind() == BVUMINUS)
return searchTerm(lhs[0], nf->CreateTerm(BVUMINUS, width, rhs));
if (lhs.GetKind() == BVNEG)
return searchTerm(lhs[0], nf->CreateTerm(BVNEG, width, rhs));
if (lhs.GetKind() == BVXOR || lhs.GetKind() == BVPLUS)
for (size_t i = 0; i < lhs.Degree(); i++)
{
ASTVec others;
for (size_t j = 0; j < lhs.Degree(); j++)
if (j != i)
others.push_back(lhs[j]);
ASTNode new_rhs;
if (lhs.GetKind() == BVXOR)
{
others.push_back(rhs);
assert(others.size() > 1);
new_rhs = nf->CreateTerm(lhs.GetKind(), width, others);
}
else if (lhs.GetKind() == BVPLUS)
{
if (others.size() > 1)
new_rhs = nf->CreateTerm(BVPLUS, width, others);
else
new_rhs = others[0];
new_rhs = nf->CreateTerm(BVUMINUS, width, new_rhs);
new_rhs = nf->CreateTerm(BVPLUS, width, new_rhs, rhs);
}
else
FatalError("sdafasfsdf2q3234423");
bool result = searchTerm(lhs[i], new_rhs);
if (result)
return true;
}
if (lhs.Degree() == 2 && lhs.GetKind() == BVMULT && lhs[0].isConstant() &&
simp->BVConstIsOdd(lhs[0]))
return searchTerm(lhs[1],
nf->CreateTerm(BVMULT, width,
simp->MultiplicativeInverse(lhs[0]), rhs));
return false;
}
示例3: CreateTerm
ASTNode NodeFactory::CreateTerm(Kind kind, unsigned int width,
const ASTNode& child0, const ASTVec &children)
{
ASTVec child;
child.reserve(children.size() + 1);
child.push_back(child0);
child.insert(child.end(), children.begin(), children.end());
return CreateTerm(kind, width, child);
}
示例4: CreateNode
ASTNode NodeFactory::CreateNode(Kind kind, const ASTNode& child0,
const ASTVec & back_children)
{
ASTVec front_children;
front_children.reserve(1 + back_children.size());
front_children.push_back(child0);
front_children.insert(front_children.end(), back_children.begin(),
back_children.end());
return CreateNode(kind, front_children);
}
示例5: searchXOR
bool PropagateEqualities::searchXOR(const ASTNode& lhs, const ASTNode& rhs)
{
Kind k = lhs.GetKind();
if (lhs == rhs)
return true;
if (k == SYMBOL)
return simp->UpdateSubstitutionMap(
lhs, rhs); // checks whether it's been solved for or loops.
if (k == NOT)
return searchXOR(lhs[0], nf->CreateNode(NOT, rhs));
bool result = false;
if (k == XOR)
for (size_t i = 0; i < lhs.Degree(); i++)
{
ASTVec others;
for (size_t j = 0; j < lhs.Degree(); j++)
if (j != i)
others.push_back(lhs[j]);
others.push_back(rhs);
assert(others.size() > 1);
ASTNode new_rhs = nf->CreateNode(XOR, others);
result = searchXOR(lhs[i], new_rhs);
if (result)
return result;
}
if (k == EQ && lhs[0].GetValueWidth() == 1)
{
bool result =
searchTerm(lhs[0], nf->CreateTerm(ITE, 1, rhs, lhs[1],
nf->CreateTerm(BVNEG, 1, lhs[1])));
if (!result)
result =
searchTerm(lhs[1], nf->CreateTerm(ITE, 1, rhs, lhs[0],
nf->CreateTerm(BVNEG, 1, lhs[0])));
}
return result;
}
示例6: assert
/* The most complicated handling is for EXTRACTS. If a variable has parents that
* are all extracts and each of those extracts is disjoint (i.e. reads different bits)
* Then each of the extracts are replaced by a fresh variable. This is the only case
* where a variable with multiple distinct parents is replaced by a fresh variable.
* + We perform this check upfront, so will miss any extra cases the the unconstrained
* variable elimination introduces.
* + It's all or nothing. So even if there's an extract of [0:2] [1:2] and [3:5], we wont
* replace the [3:5] (even though it could be).
*/
void
RemoveUnconstrained::splitExtractOnly(vector<MutableASTNode*> extracts)
{
assert(extracts.size() >0);
// Going to be rebuilt later anyway, so discard.
vector<MutableASTNode*> variables;
for (int i =0; i <extracts.size(); i++)
{
ASTNode& var = extracts[i]->n;
assert(var.GetKind() == SYMBOL);
const int size = var.GetValueWidth();
std::vector<ASTNode> toVar(size);
// Create a mutable copy that we can iterate over.
vector <MutableASTNode*> mut;
mut.insert(mut.end(), extracts[i]->parents.begin(), extracts[i]->parents.end());
for (vector<MutableASTNode*>::iterator it = mut.begin(); it != mut.end(); it++)
{
ASTNode parent_node = (*it)->n;
assert(((**it)).children[0] == extracts[i]);
assert(!parent_node.IsNull());
assert(parent_node.GetKind() == BVEXTRACT);
int lb = parent_node[2].GetUnsignedConst();
// Replace each parent with a fresh.
toVar[lb] = replaceParentWithFresh(**it,variables);
}
ASTVec concatVec;
int empty =0;
for (int j=0; j < size;j++)
{
if (toVar[j].IsNull())
{
empty++;
continue;
}
if (empty > 0)
{
concatVec.push_back(bm.CreateFreshVariable(0, empty, "extract_unc"));
empty = 0;
}
concatVec.push_back(toVar[j]);
//cout << toVar[j];
assert(toVar[j].GetValueWidth() > 0);
j+=toVar[j].GetValueWidth()-1;
}
if (empty> 0)
{
concatVec.push_back(bm.CreateFreshVariable(0, empty, "extract_unc"));
}
ASTNode concat = concatVec[0];
for (int i=1; i < concatVec.size();i++)
{
assert(!concat.IsNull());
concat = bm.CreateTerm(BVCONCAT, concat.GetValueWidth() + concatVec[i].GetValueWidth(),concatVec[i], concat);
}
replace(var,concat);
}
}
示例7: if
ASTNode
RemoveUnconstrained::topLevel_other(const ASTNode &n, Simplifier *simplifier)
{
if (n.GetKind() == SYMBOL)
return n; // top level is an unconstrained symbol/.
simplifier_convenient = simplifier;
ASTNodeSet noCheck; // We don't want to check some expensive nodes over and over again.
vector<MutableASTNode*> variable_array;
MutableASTNode* topMutable = MutableASTNode::build(n);
vector<MutableASTNode*> extracts;
topMutable->getDisjointExtractVariables(extracts);
if (extracts.size() > 0)
{
splitExtractOnly(extracts);
}
topMutable->getAllUnconstrainedVariables(variable_array);
for (int i =0; i < variable_array.size() ; i++)
{
// Don't make this is a reference. If the vector gets resized, it will point to
// memory that no longer contains the object.
MutableASTNode& muteNode = *variable_array[i];
const ASTNode var = muteNode.n;
assert(var.GetKind() == SYMBOL);
if (!muteNode.isUnconstrained())
continue;
MutableASTNode& muteParent = muteNode.getParent();
if (noCheck.find(muteParent.n) != noCheck.end())
{
continue;
}
vector <MutableASTNode*> mutable_children = muteParent.children;
//nb. The children might be dirty. i.e. not have substitutions written through them yet.
ASTVec children;
children.reserve(mutable_children.size());
for (int j = 0; j <mutable_children.size(); j++ )
children.push_back(mutable_children[j]->n);
const size_t numberOfChildren = children.size();
const Kind kind = muteNode.getParent().n.GetKind();
unsigned width = muteNode.getParent().n.GetValueWidth();
unsigned indexWidth = muteNode.getParent().n.GetIndexWidth();
ASTNode other;
MutableASTNode* muteOther;
if(numberOfChildren == 2)
{
if (children[0] != var)
{
other = children[0];
muteOther = mutable_children[0];
}
else
{
other = children[1];
muteOther = mutable_children[1];
}
if (kind != AND && kind != OR && kind != BVOR && kind != BVAND)
if (other == var)
continue; // Most rules don't like duplicate variables.
}
else
{
if (kind != AND && kind != OR && kind != BVOR && kind != BVAND)
{
int found = 0;
for (int i = 0; i < numberOfChildren; i++)
{
if (children[i] == var)
found++;
}
if (found != 1)
continue; // Most rules don't like duplicate variables.
}
}
/*
cout << i << " " << kind << " " << variable_array.size() << " " << mutable_children.size() << endl;
cout << "children[0]" << children[0] << endl;
cout << "children[1]" << children[1] << endl;
cout << muteParent.n << endl;
*/
//.........这里部分代码省略.........
示例8: TopLevelSTPAux
//UserGuided abstraction refinement
SOLVER_RETURN_TYPE
STP::
UserGuided_AbsRefine(SATSolver& NewSolver,
const ASTNode& original_input)
{
ASTVec v = bm->GetAsserts_WithKey(0);
if(v.empty())
{
FatalError("UserGuided_AbsRefine: Something is seriously wrong."\
"The input set is empty");
}
ASTNode sureAddInput =
(v.size() == 1) ? v[0] : bm->CreateNode(AND, v);
SOLVER_RETURN_TYPE res = SOLVER_UNDECIDED;
res = TopLevelSTPAux(NewSolver, sureAddInput, original_input);
if(SOLVER_UNDECIDED != res)
{
return res;
}
//Do refinement here
if(AND != original_input.GetKind())
{
FatalError("UserGuided_AbsRefine: The input must be an AND");
}
ASTVec RefineFormulasVec;
ASTVec RemainingFormulasVec;
ASTNode asttrue = bm->CreateNode(TRUE);
ASTNode astfalse = bm->CreateNode(FALSE);
for(int count=0; count < bm->UserFlags.num_absrefine; count++)
{
RemainingFormulasVec.clear();
RemainingFormulasVec.push_back(asttrue);
RefineFormulasVec.clear();
RefineFormulasVec.push_back(asttrue);
ASTVec InputKids = original_input.GetChildren();
for(ASTVec::iterator it = InputKids.begin(), itend = InputKids.end();
it!=itend;it++)
{
Ctr_Example->ClearComputeFormulaMap();
if(astfalse == Ctr_Example->ComputeFormulaUsingModel(*it))
{
RefineFormulasVec.push_back(*it);
}
else
{
RemainingFormulasVec.push_back(*it);
}
}
ASTNode RefineFormulas =
(RefineFormulasVec.size() == 1) ?
RefineFormulasVec[0] : bm->CreateNode(AND, RefineFormulasVec);
res = TopLevelSTPAux(NewSolver, RefineFormulas, original_input);
if(SOLVER_UNDECIDED != res)
{
return res;
}
}
ASTNode RemainingFormulas =
(RemainingFormulasVec.size() == 1) ?
RemainingFormulasVec[0] : bm->CreateNode(AND, RemainingFormulasVec);
res = TopLevelSTPAux(NewSolver, RemainingFormulas, original_input);
if(SOLVER_UNDECIDED != res)
{
return res;
}
FatalError("TopLevelSTPAux: reached the end without proper conclusion:"
"either a divide by zero in the input or a bug in STP");
return SOLVER_ERROR;
} //End of UserGuided_AbsRefine()
示例9: main
int main(int argc, char** argv)
{
extern int smt2parse();
extern int smt2lex_destroy(void);
extern FILE* smt2in;
STPMgr stp;
STPMgr* mgr = &stp;
Cpp_interface interface(*mgr, mgr->defaultNodeFactory);
interface.startup();
interface.ignoreCheckSat();
stp::GlobalParserInterface = &interface;
Simplifier* simp = new Simplifier(mgr);
ArrayTransformer* at = new ArrayTransformer(mgr, simp);
AbsRefine_CounterExample* abs = new AbsRefine_CounterExample(mgr, simp, at);
ToSATAIG* tosat = new ToSATAIG(mgr, at);
GlobalSTP = new STP(mgr, simp, at, tosat, abs);
srand(time(NULL));
stp::GlobalParserBM = &stp;
stp.UserFlags.disableSimplifications();
stp.UserFlags.bitConstantProp_flag = true;
// Parse SMTLIB2-----------------------------------------
mgr->GetRunTimes()->start(RunTimes::Parsing);
if (argc > 1)
{
smt2in = fopen(argv[1], "r");
smt2parse();
}
else
{
smt2in = NULL; // from stdin.
smt2parse();
}
smt2lex_destroy();
//-----------------------------------------------------
ASTNode n;
ASTVec v = interface.GetAsserts();
if (v.size() > 1)
n = interface.CreateNode(AND, v);
else
n = v[0];
// Apply cbitp ----------------------------------------
simplifier::constantBitP::ConstantBitPropagation cb(
simp, mgr->defaultNodeFactory, n);
if (cb.isUnsatisfiable())
n = mgr->ASTFalse;
else
n = cb.topLevelBothWays(n, true, true);
if (simp->hasUnappliedSubstitutions())
{
n = simp->applySubstitutionMap(n);
simp->haveAppliedSubstitutionMap();
}
// Print back out.
printer::SMTLIB2_PrintBack(cout, n);
cout << "(check-sat)\n";
cout << "(exit)\n";
return 0;
}
示例10: propagate
//.........这里部分代码省略.........
a[1][0][1].GetKind() == SYMBOL)
{
const ASTNode& symbol = a[1][0][1];
const ASTNode newN = nf->CreateTerm(
ITE, 1, a[0], a[1][0][0], nf->CreateTerm(BVNEG, 1, a[1][0][0]));
if (simp->UpdateSolverMap(symbol, newN))
{
assert(false);
output = ASTTrue;
}
}
else if (a[0].GetKind() == EQ && a[0][0].GetValueWidth() == 1 &&
a[0][1].GetKind() == SYMBOL)
{
// XOR ((= 1 v) ... )
const ASTNode& symbol = a[0][1];
const ASTNode newN = nf->CreateTerm(
ITE, 1, a[1], nf->CreateTerm(BVNEG, 1, a[0][0]), a[0][0]);
if (simp->UpdateSolverMap(symbol, newN))
{
assert(false);
output = ASTTrue;
}
}
else if (a[1].GetKind() == EQ && a[1][0].GetValueWidth() == 1 &&
a[1][1].GetKind() == SYMBOL)
{
const ASTNode& symbol = a[1][1];
const ASTNode newN = nf->CreateTerm(
ITE, 1, a[0], nf->CreateTerm(BVNEG, 1, a[1][0]), a[1][0]);
if (simp->UpdateSolverMap(symbol, newN))
{
assert(false);
output = ASTTrue;
}
}
else
return output;
}
else
{
ASTNode symbol, rhs;
if (to == 1)
{
symbol = a[0];
rhs = a[1];
}
else
{
symbol = a[1];
rhs = a[0];
}
assert(symbol.GetKind() == SYMBOL);
if (simp->UpdateSolverMap(symbol, nf->CreateNode(NOT, rhs)))
{
assert(false);
output = ASTTrue;
}
}
#endif
}
else if (AND == k)
{
const ASTVec& c = a.GetChildren();
ASTVec o;
o.reserve(c.size());
for (ASTVec::const_iterator it = c.begin(), itend = c.end(); it != itend;
it++)
{
if (always_true)
simp->UpdateAlwaysTrueFormSet(*it);
ASTNode aaa = propagate(*it, at);
if (ASTTrue != aaa)
{
if (ASTFalse == aaa)
return ASTFalse;
else
o.push_back(aaa);
}
}
if (o.size() == 0)
output = ASTTrue;
else if (o.size() == 1)
output = o[0];
else if (o != c)
output = nf->CreateNode(AND, o);
else
output = a;
}
return output;
}
示例11: main
int Main::main(int argc, char** argv)
{
unique_ptr<SimplifyingNodeFactory> simplifyingNF(
new SimplifyingNodeFactory(*bm->hashingNodeFactory, *bm));
bm->defaultNodeFactory = simplifyingNF.get();
unique_ptr<Simplifier> simp(new Simplifier(bm));
unique_ptr<ArrayTransformer> arrayTransformer(
new ArrayTransformer(bm, simp.get()));
unique_ptr<ToSAT> tosat(new ToSAT(bm));
unique_ptr<AbsRefine_CounterExample> Ctr_Example(
new AbsRefine_CounterExample(bm, simp.get(), arrayTransformer.get()));
int ret = create_and_parse_options(argc, argv);
if (ret != 0)
{
return ret;
}
STP* stp = new STP(bm, simp.get(), arrayTransformer.get(), tosat.get(),
Ctr_Example.get());
GlobalSTP = stp;
// If we're not reading the file from stdin.
if (!infile.empty())
read_file();
// want to print the output always from the commandline.
bm->UserFlags.print_output_flag = true;
ASTVec* AssertsQuery = new ASTVec;
bm->GetRunTimes()->start(RunTimes::Parsing);
parse_file(AssertsQuery);
bm->GetRunTimes()->stop(RunTimes::Parsing);
GlobalSTP = NULL;
/* The SMTLIB2 has a command language. The parser calls all the functions,
* so when we get to here the parser has already called "exit". i.e. if the
* language is smt2 then all the work has already been done, and all we need
* to do is cleanup...
* */
if (!bm->UserFlags.smtlib2_parser_flag)
{
if (AssertsQuery->empty())
FatalError("Input is Empty. Please enter some asserts and query\n");
if (AssertsQuery->size() != 2)
FatalError("Input must contain a query\n");
ASTNode asserts = (*AssertsQuery)[0];
ASTNode query = (*AssertsQuery)[1];
if (onePrintBack)
{
print_back(query, asserts);
}
else
{
SOLVER_RETURN_TYPE ret = stp->TopLevelSTP(asserts, query);
if (bm->UserFlags.quick_statistics_flag)
{
bm->GetRunTimes()->print();
}
stp->tosat->PrintOutput(ret);
}
asserts = ASTNode();
query = ASTNode();
}
// Previously we used fast-exit to avoid destroying lots of objects, for example in the node manager.
// We use unique_ptr now on lots of stuff, so there seems little difference in the time it takes to
// exit normally vs. not.
//if (bm->UserFlags.isSet("fast-exit", "0"))
// exit(0);
//Cleanup
AssertsQuery->clear();
delete AssertsQuery;
_empty_ASTVec.clear();
delete stp;
CNFClearMemory();
return 0;
}
示例12: if
// NB: This expects that the constructor was called with teh same node. Sorry.
ASTNode
ConstantBitPropagation::topLevelBothWays(const ASTNode& top)
{
assert(top.GetSTPMgr()->UserFlags.bitConstantProp_flag);
assert (BOOLEAN_TYPE == top.GetType());
propagate();
status = NO_CHANGE;
//Determine what must always be true.
ASTNodeMap fromTo = getAllFixed();
if (debug_cBitProp_messages)
{
cerr << "Number removed by bottom UP:" << fromTo.size() << endl;
}
setNodeToTrue(top);
if (debug_cBitProp_messages)
{
cerr << "starting propagation" << endl;
printNodeWithFixings();
cerr << "Initial Tree:" << endl;
cerr << top;
}
propagate();
if (debug_cBitProp_messages)
{
cerr << "status:" << status <<endl;
cerr << "ended propagation" << endl;
printNodeWithFixings();
}
// propagate may have stopped with a conflict.
if (CONFLICT == status)
return top.GetSTPMgr()->CreateNode(FALSE);
ASTVec toConjoin;
// go through the fixedBits. If a node is entirely fixed.
// "and" it onto the top. Creates redundancy. Check that the
// node doesn't already depend on "top" directly.
for (NodeToFixedBitsMap::NodeToFixedBitsMapType::iterator it = fixedMap->map->begin(); it != fixedMap->map->end(); it++) // iterates through all the pairs of node->fixedBits.
{
const FixedBits& bits = *it->second;
if (!bits.isTotallyFixed())
continue;
const ASTNode& node = (it->first);
// Don't constrain nodes we already know all about.
if (node.isConstant())
continue;
// other nodes will contain the same information (the extract doesn't change the fixings).
if (BVEXTRACT == node.GetKind() || BVCONCAT == node.GetKind())
continue;
// toAssign: conjoin it with the top level.
// toReplace: replace all references to it (except the one conjoined to the top) with this.
ASTNode propositionToAssert;
ASTNode constantToReplaceWith;
// skip the assigning and replacing.
bool doAssign = true;
{
// If it is already contained in the fromTo map, then it's one of the values
// that have fully been determined (previously). Not conjoined.
if (fromTo.find(node) != fromTo.end())
continue;
ASTNode constNode = bitsToNode(node,bits);
if (node.GetType() == BOOLEAN_TYPE)
{
if (SYMBOL == node.GetKind())
{
bool r = simplifier->UpdateSubstitutionMap(node, constNode);
assert(r);
doAssign = false;
}
else if (bits.getValue(0))
{
propositionToAssert = node;
constantToReplaceWith = constNode;
}
else
{
propositionToAssert = nf->CreateNode(NOT, node);
constantToReplaceWith = constNode;
}
}
else if (node.GetType() == BITVECTOR_TYPE)
{
//.........这里部分代码省略.........