GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/decision_strategy.cpp Lines: 59 62 95.2 %
Date: 2021-05-24 Branches: 85 160 53.1 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Andrew Reynolds, Aina Niemetz
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
 * Implementation of base classes for decision strategies used by theory
14
 * solvers for use in the DecisionManager of TheoryEngine.
15
 */
16
17
#include "theory/decision_strategy.h"
18
19
#include "theory/rewriter.h"
20
21
using namespace cvc5::kind;
22
23
namespace cvc5 {
24
namespace theory {
25
26
5065
DecisionStrategyFmf::DecisionStrategyFmf(context::Context* satContext,
27
5065
                                         Valuation valuation)
28
    : d_valuation(valuation),
29
      d_has_curr_literal(false, satContext),
30
5065
      d_curr_literal(0, satContext)
31
{
32
5065
}
33
34
4097
void DecisionStrategyFmf::initialize() { d_literals.clear(); }
35
36
1620154
Node DecisionStrategyFmf::getNextDecisionRequest()
37
{
38
3240308
  Trace("dec-strategy-debug")
39
1620154
      << "Get next decision request " << identify() << "..." << std::endl;
40
1620154
  if (d_has_curr_literal.get())
41
  {
42
1549379
    Trace("dec-strategy-debug") << "...already has decision" << std::endl;
43
1549379
    return Node::null();
44
  }
45
  bool success;
46
70775
  unsigned curr_lit = d_curr_literal.get();
47
45743
  do
48
  {
49
116518
    success = true;
50
    // get the current literal
51
198050
    Node lit = getLiteral(curr_lit);
52
233032
    Trace("dec-strategy-debug")
53
116516
        << "...check literal #" << curr_lit << " : " << lit << std::endl;
54
    // if out of literals, we are done in the current SAT context
55
116516
    if (!lit.isNull())
56
    {
57
      bool value;
58
113905
      if (!d_valuation.hasSatValue(lit, value))
59
      {
60
34984
        Trace("dec-strategy-debug") << "...not assigned, return." << std::endl;
61
        // if it has not been decided, return it
62
34984
        return lit;
63
      }
64
78921
      else if (!value)
65
      {
66
91486
        Trace("dec-strategy-debug")
67
45743
            << "...assigned false, increment." << std::endl;
68
        // asserted false, the current literal is incremented
69
45743
        curr_lit = d_curr_literal.get() + 1;
70
45743
        d_curr_literal.set(curr_lit);
71
        // repeat
72
45743
        success = false;
73
      }
74
      else
75
      {
76
33178
        Trace("dec-strategy-debug") << "...already assigned true." << std::endl;
77
      }
78
    }
79
    else
80
    {
81
2611
      Trace("dec-strategy-debug") << "...exhausted literals." << std::endl;
82
    }
83
81532
  } while (!success);
84
  // the current literal has been decided with the right polarity, we are done
85
35789
  d_has_curr_literal = true;
86
35789
  return Node::null();
87
}
88
89
1162
bool DecisionStrategyFmf::getAssertedLiteralIndex(unsigned& i) const
90
{
91
1162
  if (d_has_curr_literal.get())
92
  {
93
1162
    i = d_curr_literal.get();
94
1162
    return true;
95
  }
96
  return false;
97
}
98
99
395
Node DecisionStrategyFmf::getAssertedLiteral()
100
{
101
395
  if (d_has_curr_literal.get())
102
  {
103
395
    Assert(d_curr_literal.get() < d_literals.size());
104
395
    return getLiteral(d_curr_literal.get());
105
  }
106
  return Node::null();
107
}
108
109
125491
Node DecisionStrategyFmf::getLiteral(unsigned n)
110
{
111
  // allocate until the index is valid
112
131990
  while (n >= d_literals.size())
113
  {
114
13000
    Node lit = mkLiteral(d_literals.size());
115
6499
    if (!lit.isNull())
116
    {
117
5785
      lit = Rewriter::rewrite(lit);
118
    }
119
6499
    d_literals.push_back(lit);
120
  }
121
118990
  Node ret = d_literals[n];
122
118990
  if (!ret.isNull())
123
  {
124
    // always ensure it is in the CNF stream
125
116379
    ret = d_valuation.ensureLiteral(ret);
126
  }
127
118990
  return ret;
128
}
129
130
2142
DecisionStrategySingleton::DecisionStrategySingleton(
131
    const char* name,
132
    Node lit,
133
    context::Context* satContext,
134
2142
    Valuation valuation)
135
2142
    : DecisionStrategyFmf(satContext, valuation), d_name(name), d_literal(lit)
136
{
137
2142
}
138
139
2766
Node DecisionStrategySingleton::mkLiteral(unsigned n)
140
{
141
2766
  if (n == 0)
142
  {
143
2052
    return d_literal;
144
  }
145
714
  return Node::null();
146
}
147
148
Node DecisionStrategySingleton::getSingleLiteral() { return d_literal; }
149
150
}  // namespace theory
151
28191
}  // namespace cvc5