1 |
|
/****************************************************************************** |
2 |
|
* Top contributors (to current version): |
3 |
|
* Tim King, Mathias Preiner, 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 |
|
* This is an implementation of the Simplex Module for the Simplex for |
14 |
|
* DPLL(T) decision procedure. |
15 |
|
* |
16 |
|
* This implements the Simplex module for the Simpelx for DPLL(T) decision |
17 |
|
* procedure. |
18 |
|
* See the Simplex for DPLL(T) technical report for more background.(citation?) |
19 |
|
* This shares with the theory a Tableau, and a PartialModel that: |
20 |
|
* - satisfies the equalities in the Tableau, and |
21 |
|
* - the assignment for the non-basic variables satisfies their bounds. |
22 |
|
* This is required to either produce a conflict or satisifying PartialModel. |
23 |
|
* Further, we require being told when a basic variable updates its value. |
24 |
|
* |
25 |
|
* During the Simplex search we maintain a queue of variables. |
26 |
|
* The queue is required to contain all of the basic variables that voilate |
27 |
|
* their bounds. |
28 |
|
* As elimination from the queue is more efficient to be done lazily, |
29 |
|
* we do not maintain that the queue of variables needs to be only basic |
30 |
|
* variables or only variables that satisfy their bounds. |
31 |
|
* |
32 |
|
* The simplex procedure roughly follows Alberto's thesis. (citation?) |
33 |
|
* There is one round of selecting using a heuristic pivoting rule. |
34 |
|
* (See PreferenceFunction Documentation for the available options.) |
35 |
|
* The non-basic variable is the one that appears in the fewest pivots. |
36 |
|
* (Bruno says that Leonardo invented this first.) |
37 |
|
* After this, Bland's pivot rule is invoked. |
38 |
|
* |
39 |
|
* During this proccess, we periodically inspect the queue of variables to |
40 |
|
* 1) remove now extraneous extries, |
41 |
|
* 2) detect conflicts that are "waiting" on the queue but may not be detected |
42 |
|
* by the current queue heuristics, and |
43 |
|
* 3) detect multiple conflicts. |
44 |
|
* |
45 |
|
* Conflicts are greedily slackened to use the weakest bounds that still |
46 |
|
* produce the conflict. |
47 |
|
* |
48 |
|
* Extra things tracked atm: (Subject to change at Tim's whims) |
49 |
|
* - A superset of all of the newly pivoted variables. |
50 |
|
* - A queue of additional conflicts that were discovered by Simplex. |
51 |
|
* These are theory valid and are currently turned into lemmas |
52 |
|
*/ |
53 |
|
|
54 |
|
#include "cvc5_private.h" |
55 |
|
|
56 |
|
#pragma once |
57 |
|
|
58 |
|
#include "theory/arith/simplex.h" |
59 |
|
#include "util/statistics_stats.h" |
60 |
|
|
61 |
|
namespace cvc5 { |
62 |
|
namespace theory { |
63 |
|
namespace arith { |
64 |
|
|
65 |
9923 |
class DualSimplexDecisionProcedure : public SimplexDecisionProcedure{ |
66 |
|
public: |
67 |
|
DualSimplexDecisionProcedure(LinearEqualityModule& linEq, ErrorSet& errors, RaiseConflict conflictChannel, TempVarMalloc tvmalloc); |
68 |
|
|
69 |
1707941 |
Result::Sat findModel(bool exactResult) override |
70 |
|
{ |
71 |
1707941 |
return dualFindModel(exactResult); |
72 |
|
} |
73 |
|
|
74 |
|
private: |
75 |
|
|
76 |
|
/** |
77 |
|
* Maps a variable to how many times they have been used as a pivot in the |
78 |
|
* simplex search. |
79 |
|
*/ |
80 |
|
DenseMultiset d_pivotsInRound; |
81 |
|
|
82 |
|
Result::Sat dualFindModel(bool exactResult); |
83 |
|
|
84 |
|
/** |
85 |
|
* This is the main simplex for DPLL(T) loop. |
86 |
|
* It runs for at most maxIterations. |
87 |
|
* |
88 |
|
* Returns true iff it has found a conflict. |
89 |
|
* d_conflictVariable will be set and the conflict for this row is reported. |
90 |
|
*/ |
91 |
|
bool searchForFeasibleSolution(uint32_t maxIterations); |
92 |
|
|
93 |
|
|
94 |
1000161 |
bool processSignals(){ |
95 |
1000161 |
TimerStat &timer = d_statistics.d_processSignalsTime; |
96 |
1000161 |
IntStat& conflictStat = d_statistics.d_recentViolationCatches; |
97 |
1000161 |
return standardProcessSignals(timer, conflictStat); |
98 |
|
} |
99 |
|
/** These fields are designed to be accessible to TheoryArith methods. */ |
100 |
9923 |
class Statistics { |
101 |
|
public: |
102 |
|
IntStat d_statUpdateConflicts; |
103 |
|
TimerStat d_processSignalsTime; |
104 |
|
IntStat d_simplexConflicts; |
105 |
|
IntStat d_recentViolationCatches; |
106 |
|
TimerStat d_searchTime; |
107 |
|
|
108 |
|
ReferenceStat<uint32_t> d_finalCheckPivotCounter; |
109 |
|
|
110 |
|
Statistics(uint32_t& pivots); |
111 |
|
} d_statistics; |
112 |
|
};/* class DualSimplexDecisionProcedure */ |
113 |
|
|
114 |
|
} // namespace arith |
115 |
|
} // namespace theory |
116 |
|
} // namespace cvc5 |