summaryrefslogtreecommitdiff
path: root/src/theory/quantifiers/instantiate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/theory/quantifiers/instantiate.cpp')
-rw-r--r--src/theory/quantifiers/instantiate.cpp95
1 files changed, 80 insertions, 15 deletions
diff --git a/src/theory/quantifiers/instantiate.cpp b/src/theory/quantifiers/instantiate.cpp
index 53e9c6832..d40a2c13d 100644
--- a/src/theory/quantifiers/instantiate.cpp
+++ b/src/theory/quantifiers/instantiate.cpp
@@ -37,7 +37,7 @@ Instantiate::Instantiate(QuantifiersEngine* qe, context::UserContext* u)
: d_qe(qe),
d_term_db(nullptr),
d_term_util(nullptr),
- d_total_inst_count_debug(0),
+ d_total_inst_debug(u),
d_c_inst_match_trie_dom(u)
{
}
@@ -264,9 +264,8 @@ bool Instantiate::addInstantiation(
return false;
}
- d_total_inst_debug[q]++;
+ d_total_inst_debug[q] = d_total_inst_debug[q] + 1;
d_temp_inst_debug[q]++;
- d_total_inst_count_debug++;
if (Trace.isOn("inst"))
{
Trace("inst") << "*** Instantiate " << q << " with " << std::endl;
@@ -466,6 +465,16 @@ Node Instantiate::getTermForType(TypeNode tn)
bool Instantiate::printInstantiations(std::ostream& out)
{
+ if (options::printInstMode() == options::PrintInstMode::NUM)
+ {
+ return printInstantiationsNum(out);
+ }
+ Assert(options::printInstMode() == options::PrintInstMode::LIST);
+ return printInstantiationsList(out);
+}
+
+bool Instantiate::printInstantiationsList(std::ostream& out)
+{
bool useUnsatCore = false;
std::vector<Node> active_lemmas;
if (options::trackInstLemmas() && getUnsatCoreLemmas(active_lemmas))
@@ -473,35 +482,89 @@ bool Instantiate::printInstantiations(std::ostream& out)
useUnsatCore = true;
}
bool printed = false;
+ bool isFull = options::printInstFull();
if (options::incrementalSolving())
{
for (std::pair<const Node, inst::CDInstMatchTrie*>& t : d_c_inst_match_trie)
{
- bool firstTime = true;
- t.second->print(out, t.first, firstTime, useUnsatCore, active_lemmas);
- if (!firstTime)
+ std::stringstream qout;
+ if (!printQuant(t.first, qout, isFull))
+ {
+ continue;
+ }
+ std::stringstream sout;
+ t.second->print(sout, t.first, useUnsatCore, active_lemmas);
+ if (!sout.str().empty())
{
+ out << "(instantiations " << qout.str() << std::endl;
+ out << sout.str();
out << ")" << std::endl;
+ printed = true;
}
- printed = printed || !firstTime;
}
}
else
{
for (std::pair<const Node, inst::InstMatchTrie>& t : d_inst_match_trie)
{
- bool firstTime = true;
- t.second.print(out, t.first, firstTime, useUnsatCore, active_lemmas);
- if (!firstTime)
+ std::stringstream qout;
+ if (!printQuant(t.first, qout, isFull))
+ {
+ continue;
+ }
+ std::stringstream sout;
+ t.second.print(sout, t.first, useUnsatCore, active_lemmas);
+ if (!sout.str().empty())
{
+ out << "(instantiations " << qout.str() << std::endl;
+ out << sout.str();
out << ")" << std::endl;
+ printed = true;
}
- printed = printed || !firstTime;
}
}
+ out << std::endl;
return printed;
}
+bool Instantiate::printInstantiationsNum(std::ostream& out)
+{
+ if (d_total_inst_debug.empty())
+ {
+ return false;
+ }
+ bool isFull = options::printInstFull();
+ for (NodeUIntMap::iterator it = d_total_inst_debug.begin();
+ it != d_total_inst_debug.end();
+ ++it)
+ {
+ std::stringstream ss;
+ if (printQuant((*it).first, ss, isFull))
+ {
+ out << "(num-instantiations " << ss.str() << " " << (*it).second << ")"
+ << std::endl;
+ }
+ }
+ return true;
+}
+
+bool Instantiate::printQuant(Node q, std::ostream& out, bool isFull)
+{
+ if (isFull)
+ {
+ out << q;
+ return true;
+ }
+ quantifiers::QuantAttributes* qa = d_qe->getQuantAttributes();
+ Node name = qa->getQuantName(q);
+ if (name.isNull())
+ {
+ return false;
+ }
+ out << name;
+ return true;
+}
+
void Instantiate::getInstantiatedQuantifiedFormulas(std::vector<Node>& qs)
{
if (options::incrementalSolving())
@@ -726,7 +789,7 @@ void Instantiate::debugPrint()
// debug information
if (Trace.isOn("inst-per-quant-round"))
{
- for (std::pair<const Node, int>& i : d_temp_inst_debug)
+ for (std::pair<const Node, uint32_t>& i : d_temp_inst_debug)
{
Trace("inst-per-quant-round") << " * " << i.second << " for " << i.first
<< std::endl;
@@ -739,10 +802,12 @@ void Instantiate::debugPrintModel()
{
if (Trace.isOn("inst-per-quant"))
{
- for (std::pair<const Node, int>& i : d_total_inst_debug)
+ for (NodeUIntMap::iterator it = d_total_inst_debug.begin();
+ it != d_total_inst_debug.end();
+ ++it)
{
- Trace("inst-per-quant") << " * " << i.second << " for " << i.first
- << std::endl;
+ Trace("inst-per-quant")
+ << " * " << (*it).second << " for " << (*it).first << std::endl;
}
}
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback