GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/decision_strategy.h Lines: 5 5 100.0 %
Date: 2021-09-15 Branches: 0 0 0.0 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Andrew Reynolds, Mathias Preiner
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
 * Base classes for decision strategies used by theory solvers
14
 * for use in the DecisionManager of TheoryEngine.
15
 */
16
17
#include "cvc5_private.h"
18
19
#ifndef CVC5__THEORY__DECISION_STRATEGY__H
20
#define CVC5__THEORY__DECISION_STRATEGY__H
21
22
#include "context/cdo.h"
23
#include "expr/node.h"
24
#include "smt/env_obj.h"
25
#include "theory/valuation.h"
26
27
namespace cvc5 {
28
namespace theory {
29
30
/**
31
 * Virtual base class for decision strategies.
32
 */
33
class DecisionStrategy : protected EnvObj
34
{
35
 public:
36
15147
  DecisionStrategy(Env& env) : EnvObj(env) {}
37
15142
  virtual ~DecisionStrategy() {}
38
  /**
39
   * Initalize this strategy, This is called once per satisfiability call by
40
   * the DecisionManager, prior to using this strategy.
41
   */
42
  virtual void initialize() = 0;
43
  /**
44
   * If this method returns a non-null node n, then n is the required next
45
   * decision of this strategy. It must be the case that n is a literal in
46
   * the current CNF stream.
47
   */
48
  virtual Node getNextDecisionRequest() = 0;
49
  /** identify this strategy (for debugging) */
50
  virtual std::string identify() const = 0;
51
};
52
53
/**
54
 * Decision strategy finite model finding.
55
 *
56
 * This is a virtual base class for decision strategies that follow the
57
 * "finite model finding" pattern for decisions. Such strategies have the
58
 * distinguishing feature that they are interested in a stream of literals
59
 * L_1, L_2, L_3, ... and so on. At any given time, they request that L_i is
60
 * asserted true for a minimal i.
61
 *
62
 * To enforce this strategy, this class maintains a SAT-context dependent
63
 * index d_curr_literal, which corresponds to the minimal index of a literal
64
 * in the above list that is not asserted false. A call to
65
 * getNextDecisionRequest increments this value until we find a literal L_j
66
 * that is not assigned false. If L_j is unassigned, we return it as a decision,
67
 * otherwise we return no decisions.
68
 */
69
class DecisionStrategyFmf : public DecisionStrategy
70
{
71
 public:
72
  DecisionStrategyFmf(Env& env, Valuation valuation);
73
5203
  virtual ~DecisionStrategyFmf() {}
74
  /** initialize */
75
  void initialize() override;
76
  /** get next decision request */
77
  Node getNextDecisionRequest() override;
78
  /** Make the n^th literal of this strategy */
79
  virtual Node mkLiteral(unsigned n) = 0;
80
  /**
81
   * This method returns true iff there exists a (minimal) i such that L_i
82
   * is a literal allocated by this class, and is asserted true in the current
83
   * context. If it returns true, the argument i is set to this i.
84
   */
85
  bool getAssertedLiteralIndex(unsigned& i) const;
86
  /**
87
   * This method returns the literal L_i allocated by this class that
88
   * has been asserted true in the current context and is such that i is
89
   * minimal. It returns null if no such literals exist.
90
   */
91
  Node getAssertedLiteral();
92
  /** Get the n^th literal of this strategy */
93
  Node getLiteral(unsigned lit);
94
95
 protected:
96
  /**
97
   * The valuation of this class, used for knowing what literals are asserted,
98
   * and with what polarity.
99
   */
100
  Valuation d_valuation;
101
  /**
102
   * The (SAT-context-dependent) flag that is true if there exists a literal
103
   * of this class that is asserted true in the current context, according to
104
   * d_valuation.
105
   */
106
  context::CDO<bool> d_has_curr_literal;
107
  /**
108
   * The (SAT-context-dependent) index of the current literal of this strategy.
109
   * This corresponds to the first literal that is not asserted false in the
110
   * current context, according to d_valuation.
111
   */
112
  context::CDO<unsigned> d_curr_literal;
113
  /** the list of literals of this strategy */
114
  std::vector<Node> d_literals;
115
};
116
117
/**
118
 * Special case of above where we only wish to allocate a single literal L_1.
119
 */
120
4410
class DecisionStrategySingleton : public DecisionStrategyFmf
121
{
122
 public:
123
  DecisionStrategySingleton(Env& env,
124
                            const char* name,
125
                            Node lit,
126
                            Valuation valuation);
127
  /**
128
   * Make the n^th literal of this strategy. This method returns d_literal if
129
   * n=0, null otherwise.
130
   */
131
  Node mkLiteral(unsigned n) override;
132
  /** Get single literal */
133
  Node getSingleLiteral();
134
  /** identify */
135
1659393
  std::string identify() const override { return d_name; }
136
137
 private:
138
  /** the name of this strategy */
139
  std::string d_name;
140
  /** the literal to decide on */
141
  Node d_literal;
142
};
143
144
}  // namespace theory
145
}  // namespace cvc5
146
147
#endif /* CVC5__THEORY__DECISION_STRATEGY__H */