GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/engine_output_channel.cpp Lines: 73 93 78.5 %
Date: 2021-08-16 Branches: 76 228 33.3 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Andrew Reynolds, Tim King, Morgan Deters
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * The theory engine output channel.
14
 */
15
16
#include "theory/engine_output_channel.h"
17
18
#include "expr/skolem_manager.h"
19
#include "prop/prop_engine.h"
20
#include "smt/smt_statistics_registry.h"
21
#include "theory/theory_engine.h"
22
23
using namespace cvc5::kind;
24
25
namespace cvc5 {
26
namespace theory {
27
28
128125
EngineOutputChannel::Statistics::Statistics(theory::TheoryId theory)
29
256250
    : conflicts(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
30
256250
                                                    + "conflicts")),
31
256250
      propagations(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
32
256250
                                                       + "propagations")),
33
256250
      lemmas(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
34
256250
                                                 + "lemmas")),
35
256250
      requirePhase(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
36
256250
                                                       + "requirePhase")),
37
256250
      restartDemands(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
38
256250
                                                         + "restartDemands")),
39
128125
      trustedConflicts(smtStatisticsRegistry().registerInt(
40
256250
          getStatsPrefix(theory) + "trustedConflicts")),
41
256250
      trustedLemmas(smtStatisticsRegistry().registerInt(getStatsPrefix(theory)
42
896875
                                                        + "trustedLemmas"))
43
{
44
128125
}
45
46
128125
EngineOutputChannel::EngineOutputChannel(TheoryEngine* engine,
47
128125
                                         theory::TheoryId theory)
48
128125
    : d_engine(engine), d_statistics(theory), d_theory(theory)
49
{
50
128125
}
51
52
159801
void EngineOutputChannel::safePoint(Resource r)
53
{
54
159801
  spendResource(r);
55
159801
  if (d_engine->d_interrupted)
56
  {
57
    throw theory::Interrupted();
58
  }
59
159801
}
60
61
1222
void EngineOutputChannel::lemma(TNode lemma, LemmaProperty p)
62
{
63
1222
  trustedLemma(TrustNode::mkTrustLemma(lemma), p);
64
1222
}
65
66
9781547
bool EngineOutputChannel::propagate(TNode literal)
67
{
68
19563094
  Trace("theory::propagate") << "EngineOutputChannel<" << d_theory
69
9781547
                             << ">::propagate(" << literal << ")" << std::endl;
70
9781547
  ++d_statistics.propagations;
71
9781547
  d_engine->d_outputChannelUsed = true;
72
9781547
  return d_engine->propagate(literal, d_theory);
73
}
74
75
void EngineOutputChannel::conflict(TNode conflictNode)
76
{
77
  Trace("theory::conflict")
78
      << "EngineOutputChannel<" << d_theory << ">::conflict(" << conflictNode
79
      << ")" << std::endl;
80
  ++d_statistics.conflicts;
81
  d_engine->d_outputChannelUsed = true;
82
  TrustNode tConf = TrustNode::mkTrustConflict(conflictNode);
83
  d_engine->conflict(tConf, d_theory);
84
}
85
86
void EngineOutputChannel::demandRestart()
87
{
88
  NodeManager* nm = NodeManager::currentNM();
89
  SkolemManager* sm = nm->getSkolemManager();
90
  Node restartVar = sm->mkDummySkolem(
91
      "restartVar",
92
      nm->booleanType(),
93
      "A boolean variable asserted to be true to force a restart");
94
  Trace("theory::restart") << "EngineOutputChannel<" << d_theory
95
                           << ">::restart(" << restartVar << ")" << std::endl;
96
  ++d_statistics.restartDemands;
97
  lemma(restartVar, LemmaProperty::REMOVABLE);
98
}
99
100
37233
void EngineOutputChannel::requirePhase(TNode n, bool phase)
101
{
102
74466
  Trace("theory") << "EngineOutputChannel::requirePhase(" << n << ", " << phase
103
37233
                  << ")" << std::endl;
104
37233
  ++d_statistics.requirePhase;
105
37233
  d_engine->getPropEngine()->requirePhase(n, phase);
106
37233
}
107
108
2178
void EngineOutputChannel::setIncomplete(IncompleteId id)
109
{
110
2178
  Trace("theory") << "setIncomplete(" << id << ")" << std::endl;
111
2178
  d_engine->setIncomplete(d_theory, id);
112
2178
}
113
114
5510398
void EngineOutputChannel::spendResource(Resource r)
115
{
116
5510398
  d_engine->spendResource(r);
117
5510398
}
118
119
49265
void EngineOutputChannel::handleUserAttribute(const char* attr,
120
                                              theory::Theory* t)
121
{
122
49265
  d_engine->handleUserAttribute(attr, t);
123
49265
}
124
125
107928
void EngineOutputChannel::trustedConflict(TrustNode pconf)
126
{
127
107928
  Assert(pconf.getKind() == TrustNodeKind::CONFLICT);
128
215856
  Trace("theory::conflict")
129
107928
      << "EngineOutputChannel<" << d_theory << ">::trustedConflict("
130
107928
      << pconf.getNode() << ")" << std::endl;
131
107928
  if (pconf.getGenerator() != nullptr)
132
  {
133
13989
    ++d_statistics.trustedConflicts;
134
  }
135
107928
  ++d_statistics.conflicts;
136
107928
  d_engine->d_outputChannelUsed = true;
137
107928
  d_engine->conflict(pconf, d_theory);
138
107928
}
139
140
309588
void EngineOutputChannel::trustedLemma(TrustNode plem, LemmaProperty p)
141
{
142
619176
  Trace("theory::lemma") << "EngineOutputChannel<" << d_theory
143
309588
                         << ">::trustedLemma(" << plem << ")" << std::endl;
144
309588
  Assert(plem.getKind() == TrustNodeKind::LEMMA);
145
309588
  if (plem.getGenerator() != nullptr)
146
  {
147
40345
    ++d_statistics.trustedLemmas;
148
  }
149
309588
  ++d_statistics.lemmas;
150
309588
  d_engine->d_outputChannelUsed = true;
151
309588
  if (isLemmaPropertySendAtoms(p))
152
  {
153
1198
    d_engine->ensureLemmaAtoms(plem.getNode(), d_theory);
154
  }
155
  // now, call the normal interface for lemma
156
309590
  d_engine->lemma(plem,
157
                  p,
158
                  d_theory);
159
309586
}
160
161
}  // namespace theory
162
29340
}  // namespace cvc5