GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/arith/callbacks.cpp Lines: 100 114 87.7 %
Date: 2021-09-13 Branches: 106 448 23.7 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Tim King, Haniel Barbosa, 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
 * [[ Add one-line brief description here ]]
14
 *
15
 * [[ Add lengthier description here ]]
16
 * \todo document this file
17
 */
18
19
#include "theory/arith/callbacks.h"
20
21
#include "expr/skolem_manager.h"
22
#include "proof/proof_node.h"
23
#include "theory/arith/proof_macros.h"
24
#include "theory/arith/theory_arith_private.h"
25
26
namespace cvc5 {
27
namespace theory {
28
namespace arith {
29
30
9917
SetupLiteralCallBack::SetupLiteralCallBack(TheoryArithPrivate& ta)
31
9917
  : d_arith(ta)
32
9917
{}
33
20271
void SetupLiteralCallBack::operator()(TNode lit){
34
40542
  TNode atom = (lit.getKind() == kind::NOT) ? lit[0] : lit;
35
20271
  if(!d_arith.isSetup(atom)){
36
20271
    d_arith.setupAtom(atom);
37
  }
38
20271
}
39
40
9917
DeltaComputeCallback::DeltaComputeCallback(const TheoryArithPrivate& ta)
41
9917
  : d_ta(ta)
42
9917
{}
43
27865
Rational DeltaComputeCallback::operator()() const{
44
27865
  return d_ta.deltaValueForTotalOrder();
45
}
46
47
39668
TempVarMalloc::TempVarMalloc(TheoryArithPrivate& ta)
48
39668
: d_ta(ta)
49
39668
{}
50
ArithVar TempVarMalloc::request(){
51
  NodeManager* nm = NodeManager::currentNM();
52
  SkolemManager* sm = nm->getSkolemManager();
53
  Node skolem = sm->mkDummySkolem("tmpVar", nm->realType());
54
  return d_ta.requestArithVar(skolem, false, true);
55
}
56
void TempVarMalloc::release(ArithVar v){
57
  d_ta.releaseArithVar(v);
58
}
59
60
9917
BasicVarModelUpdateCallBack::BasicVarModelUpdateCallBack(TheoryArithPrivate& ta)
61
9917
  : d_ta(ta)
62
9917
{}
63
6425628
void BasicVarModelUpdateCallBack::operator()(ArithVar x){
64
6425628
  d_ta.signal(x);
65
6425628
}
66
67
49585
RaiseConflict::RaiseConflict(TheoryArithPrivate& ta)
68
49585
  : d_ta(ta)
69
49585
{}
70
71
71187
void RaiseConflict::raiseConflict(ConstraintCP c, InferenceId id) const{
72
71187
  Assert(c->inConflict());
73
71187
  d_ta.raiseConflict(c, id);
74
71187
}
75
76
39668
FarkasConflictBuilder::FarkasConflictBuilder()
77
  : d_farkas()
78
  , d_constraints()
79
  , d_consequent(NullConstraint)
80
39668
  , d_consequentSet(false)
81
{
82
39668
  reset();
83
39668
}
84
85
876097
bool FarkasConflictBuilder::underConstruction() const{
86
876097
  return d_consequent != NullConstraint;
87
}
88
89
71187
bool FarkasConflictBuilder::consequentIsSet() const{
90
71187
  return d_consequentSet;
91
}
92
93
110855
void FarkasConflictBuilder::reset(){
94
110855
  d_consequent = NullConstraint;
95
110855
  d_constraints.clear();
96
110855
  d_consequentSet = false;
97
110855
  ARITH_PROOF(d_farkas.clear());
98
110855
  Assert(!underConstruction());
99
110855
}
100
101
/* Adds a constraint to the constraint under construction. */
102
973348
void FarkasConflictBuilder::addConstraint(ConstraintCP c, const Rational& fc){
103
973348
  Assert(
104
      !ARITH_PROOF_ON()
105
      || (!underConstruction() && d_constraints.empty() && d_farkas.empty())
106
      || (underConstruction() && d_constraints.size() + 1 == d_farkas.size()));
107
973348
  Assert(ARITH_PROOF_ON() || d_farkas.empty());
108
973348
  Assert(c->isTrue());
109
110
973348
  if(d_consequent == NullConstraint){
111
71187
    d_consequent = c;
112
  } else {
113
902161
    d_constraints.push_back(c);
114
  }
115
973348
  ARITH_PROOF(d_farkas.push_back(fc));
116
973348
  Assert(!ARITH_PROOF_ON() || d_constraints.size() + 1 == d_farkas.size());
117
973348
  Assert(ARITH_PROOF_ON() || d_farkas.empty());
118
973348
}
119
120
973348
void FarkasConflictBuilder::addConstraint(ConstraintCP c, const Rational& fc, const Rational& mult){
121
973348
  Assert(!mult.isZero());
122
973348
  if (ARITH_PROOF_ON() && !mult.isOne())
123
  {
124
217896
    Rational prod = fc * mult;
125
108948
    addConstraint(c, prod);
126
  }
127
  else
128
  {
129
864400
    addConstraint(c, fc);
130
  }
131
973348
}
132
133
71187
void FarkasConflictBuilder::makeLastConsequent(){
134
71187
  Assert(!d_consequentSet);
135
71187
  Assert(underConstruction());
136
137
71187
  if(d_constraints.empty()){
138
    // no-op
139
2748
    d_consequentSet = true;
140
  } else {
141
68439
    Assert(d_consequent != NullConstraint);
142
68439
    ConstraintCP last = d_constraints.back();
143
68439
    d_constraints.back() = d_consequent;
144
68439
    d_consequent = last;
145
68439
    ARITH_PROOF(std::swap(d_farkas.front(), d_farkas.back()));
146
68439
    d_consequentSet = true;
147
  }
148
149
71187
  Assert(!d_consequent->negationHasProof());
150
71187
  Assert(d_consequentSet);
151
71187
}
152
153
/* Turns the vector under construction into a conflict */
154
71187
ConstraintCP FarkasConflictBuilder::commitConflict(){
155
71187
  Assert(underConstruction());
156
71187
  Assert(!d_constraints.empty());
157
71187
  Assert(
158
      !ARITH_PROOF_ON()
159
      || (!underConstruction() && d_constraints.empty() && d_farkas.empty())
160
      || (underConstruction() && d_constraints.size() + 1 == d_farkas.size()));
161
71187
  Assert(ARITH_PROOF_ON() || d_farkas.empty());
162
71187
  Assert(d_consequentSet);
163
164
71187
  ConstraintP not_c = d_consequent->getNegation();
165
71187
  RationalVectorCP coeffs = ARITH_NULLPROOF(&d_farkas);
166
71187
  not_c->impliedByFarkas(d_constraints, coeffs, true );
167
168
71187
  reset();
169
71187
  Assert(!underConstruction());
170
71187
  Assert(not_c->inConflict());
171
71187
  Assert(!d_consequentSet);
172
71187
  return not_c;
173
}
174
175
9917
RaiseEqualityEngineConflict::RaiseEqualityEngineConflict(TheoryArithPrivate& ta)
176
9917
  : d_ta(ta)
177
9917
{}
178
179
/* If you are not an equality engine, don't use this! */
180
2335
void RaiseEqualityEngineConflict::raiseEEConflict(
181
    Node n, std::shared_ptr<ProofNode> pf) const
182
{
183
2335
  d_ta.raiseBlackBoxConflict(n, pf);
184
2335
}
185
186
9917
BoundCountingLookup::BoundCountingLookup(TheoryArithPrivate& ta)
187
9917
: d_ta(ta)
188
9917
{}
189
190
const BoundsInfo& BoundCountingLookup::boundsInfo(ArithVar basic) const{
191
  return d_ta.boundsInfo(basic);
192
}
193
194
BoundCounts BoundCountingLookup::atBounds(ArithVar basic) const{
195
  return boundsInfo(basic).atBounds();
196
}
197
BoundCounts BoundCountingLookup::hasBounds(ArithVar basic) const {
198
  return boundsInfo(basic).hasBounds();
199
}
200
201
}  // namespace arith
202
}  // namespace theory
203
29514
}  // namespace cvc5