SMT-RAT  24.02
Toolbox for Strategic and Parallel Satisfiability-Modulo-Theories Solving
Projection_F.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <iostream>
4 #include <map>
5 #include <vector>
6 
7 #include "../common.h"
8 #include "../debug/DotHelper.h"
9 #include "BaseProjection.h"
10 #include "ProjectionComparator.h"
11 
12 namespace smtrat {
13 namespace cad {
14 namespace full {
15  using Polynomial = std::optional<std::pair<UPoly,Origin>>;
16 }
17  inline std::ostream& operator<<(std::ostream& os, const full::Polynomial& p) {
18  if (!p) return os << "--";
19  return os << p->first << " " << p->second;
20  }
21 
22  template<typename Settings, Backtracking BT>
23  class Projection<Incrementality::FULL, BT, Settings>: public BaseProjection<Settings> {
24  private:
26  using typename Super::Constraints;
27  using Super::mConstraints;
28  using Super::mLiftingQueues;
29  using Super::mOperator;
30  using Super::callRemoveCallback;
31  using Super::canBePurgedByBounds;
32  using Super::getID;
33  using Super::freeID;
34  using Super::var;
35  public:
36  using Super::dim;
37  using Super::size;
38  private:
39 
40  template<typename S, Backtracking B>
41  friend std::ostream& operator<<(std::ostream& os, const Projection<Incrementality::FULL, B, S>& p);
42  // A projection candidate: a level to project into and two ids that refer to the level above.
43  struct QueueEntry {
44  std::size_t level;
45  std::size_t first;
46  std::size_t second;
47  QueueEntry(std::size_t l, std::size_t f, std::size_t s): level(l), first(f), second(s) {}
48  friend std::ostream& operator<<(std::ostream& os, const QueueEntry& qe) {
49  return os << "(" << qe.first << "," << qe.second << ")@" << qe.level;
50  }
51  };
52  struct ProjectionCandidateComparator {
53  public:
54  using PolyGetter = std::function<UPoly(std::size_t, std::size_t)>;
57  ProjectionCandidateComparator(const ProjectionCandidateComparator& pcc): mPG(pcc.mPG) {}
58  bool operator()(const QueueEntry& lhs, const QueueEntry& rhs) const {
59  assert(mPG);
60  UPoly lp = mPG(lhs.level, lhs.first);
61  UPoly lq = mPG(lhs.level, lhs.second);
62  UPoly rp = mPG(rhs.level, rhs.first);
63  UPoly rq = mPG(rhs.level, rhs.second);
64  return mComparator(cad::candidate(lp, lq, lhs.level), cad::candidate(rp, rq, rhs.level));
65  //return rp < lp;
66  }
67  private:
70  };
71 
72  struct PurgedPolynomials {
73  private:
74  struct PurgedLevel {
75  mutable carl::Bitset evaluated;
76  mutable carl::Bitset purged;
77  carl::Bitset bounds;
78  std::vector<QueueEntry> entries;
79  };
80  std::vector<PurgedLevel> mData;
81  std::function<bool(std::size_t,std::size_t)> mCanBePurged;
82 
83  auto& data(std::size_t level) {
84  assert(/*level >= 0 &&*/ level < mData.size());
85  return mData[level];
86  }
87  const auto& data(std::size_t level) const {
88  assert(/*level >= 0 &&*/ level < mData.size());
89  return mData[level];
90  }
91  public:
92  template<typename PurgeCheck>
93  explicit PurgedPolynomials(const PurgeCheck& pc): mCanBePurged(pc) {}
94  void reset(std::size_t dim) {
95  mData.clear();
96  mData.resize(dim);
97  }
98  void add(const QueueEntry& qe) {
99  assert(qe.level < mData.size());
100  data(qe.level).entries.push_back(qe);
101  }
102  void remove(std::size_t level, std::size_t id) {
103  assert(/*level >= 0 &&*/ level < mData.size());
104  data(level).evaluated.reset(id);
105  data(level).purged.reset(id);
106  auto it = std::remove_if(data(level).entries.begin(), data(level).entries.end(), [level,id](const QueueEntry& qe){
107  return (qe.level == level) && (qe.first == id || qe.second == id);
108  });
109  data(level).entries.erase(it, data(level).entries.end());
110  }
111  void setBound(std::size_t level, std::size_t id, bool isBound) {
112  assert(level > 0 && level <= mData.size());
113  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Setting " << level << "/" << id << " is a bound to " << isBound);
114  data(level).bounds.set(id, isBound);
115  }
116  bool isPurged(std::size_t level, std::size_t id) const {
117  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Checking whether " << level << "/" << id << " is purged.");
118  assert(/*level >= 0 &&*/ level < mData.size());
119  if (data(level).bounds.test(id)) {
120  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Do not purge as " << level << "/" << id << " is a bound.");
121  return false;
122  }
123  if (!data(level).evaluated.test(id)) {
124  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Checking if " << level << "/" << id << " can be purged.");
125  data(level).purged.set(id, mCanBePurged(level, id));
126  data(level).evaluated.set(id);
127  }
128  return data(level).purged.test(id);
129  }
130  bool isPurged(const QueueEntry& qe) const {
131  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Is " << qe << " purged?");
132  assert(/*qe.level >= 0 &&*/ qe.level < mData.size());
133  if (qe.level == 0) {
134  assert(qe.first == qe.second);
135  return mCanBePurged(0, qe.first);
136  }
137  return isPurged(qe.level, qe.first) || isPurged(qe.level, qe.second);
138  }
139  template<typename Restorer>
140  void restore(const Restorer& r) {
141  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Resetting evaluation data and restoring entries.");
142  for (auto& lvl: mData) {
143  lvl.evaluated = carl::Bitset();
144  lvl.purged = carl::Bitset();
145  }
146  for (auto& lvl: mData) {
147  auto it = std::remove_if(lvl.entries.begin(), lvl.entries.end(),
148  [this,&r](const QueueEntry& qe){
149  if (isPurged(qe)) return false;
150  r(qe);
151  return true;
152  });
153  lvl.entries.erase(it, lvl.entries.end());
154  }
155  }
156  };
157 
158  // Maps polynomials to a (per level) unique ID.
159  std::vector<std::map<UPoly,std::size_t>> mPolynomialIDs;
160  // Stores polynomials with their origins, being pairs of polynomials from the level above.
161  std::vector<std::vector<full::Polynomial>> mPolynomials;
162  // Stores the projection queue for all candidates
164 
165  PurgedPolynomials mPurgedPolys;
166 
167  std::string logPrefix(std::size_t level) const {
168  return std::string(dim() - level, '\t');
169  }
170 
171  /**
172  * Add projection candidates for a new polynomial.
173  * @param level Level of the projection candidate
174  * @param id Id of the new polynomial
175  */
176  void insertIntoProjectionQueue(std::size_t level, std::size_t id) {
177  assert(level < dim());
178  for (const auto& it: mPolynomialIDs[level]) {
179  mProjectionQueue.emplace(level, it.second, id);
180  }
181  }
182  /**
183  * Remove projection candidates involving a specific polynomial.
184  * @param level Level of the removed polynomial.
185  * @parem id Id of the removed polynomial.
186  */
187  void removeFromProjectionQueue(std::size_t level, std::size_t id) {
188  assert(level < dim());
189  mProjectionQueue.removeIf([level,id](const QueueEntry& qe){ return (qe.level == level) && (qe.first == id || qe.second == id); });
190  if (Settings::simplifyProjectionByBounds) {
191  mPurgedPolys.remove(level, id);
192  }
193  }
194  /// Inserts a polynomial with the given origin into the given level.
195  carl::Bitset insertPolynomialTo(std::size_t level, const UPoly& p, const Origin::BaseType& origin, bool setBound = false) {
196  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "Receiving " << p << " for level " << level);
197  if (projection::canBeRemoved(p)) {
198  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> but is safely removed.");
199  return carl::Bitset();
200  }
201  if ((level < dim()) && projection::canBeForwarded(level, p)) {
202  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> but is forwarded to " << (level+1));
203  return insertPolynomialTo(level + 1, carl::switch_main_variable(p, var(level + 1)), origin, setBound);
204  }
205  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "Inserting " << p << " into level " << level);
206  assert(level <= dim());
207  auto it = mPolynomialIDs[level].find(p);
208  if (it != mPolynomialIDs[level].end()) {
209  assert(mPolynomials[level][it->second]);
210  mPolynomials[level][it->second]->second += origin;
211  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Polynomial was already present, merged origins");
212  return carl::Bitset();
213  }
214  std::size_t id = getID(level);
215  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Got new id " << id);
216  if (id >= mPolynomials[level].size()) mPolynomials[level].resize(id + 1);
217  assert(!mPolynomials[level][id]);
218  mPolynomials[level][id] = std::make_pair(p, Origin(origin));
219  mLiftingQueues[level - 1].insert(id);
220  mPolynomialIDs[level].emplace(p, id);
221  if (setBound) {
222  mPurgedPolys.setBound(level, id, true);
223  }
224  if (level < dim()) {
225  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Inserting " << id << " into queue for level " << (level+1));
226  insertIntoProjectionQueue(level, id);
227  }
228  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Done.");
229  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Now:" << std::endl << *this);
230  return carl::Bitset({level});
231  }
232  /// Removes the polynomial given by the iterator from all datastructures.
233  template<typename Iterator>
234  Iterator removePolynomialByIT(std::size_t level, Iterator it) {
235  assert(it != mPolynomialIDs[level].end());
236  std::size_t id = it->second;
237  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "Removing " << id << " on " << level);
238  assert(mPolynomials[level][id]);
239  if (level < dim()) {
240  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Purging from queue on level " << (level+1));
241  removeFromProjectionQueue(level, id);
242  }
243  SMTRAT_LOG_DEBUG("smtrat.cad.projection", logPrefix(level) << "-> Removing polynomial");
244  mLiftingQueues[level - 1].erase(id);
245  mPolynomials[level][id] = std::nullopt;
246  freeID(level, id);
247  return mPolynomialIDs[level].erase(it);
248  }
249 
250  carl::Bitset project(const ConstraintSelection&) {
251  while (!mProjectionQueue.empty()) {
252  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Projecting" << std::endl << *this);
253  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Using next projection candidate " << mProjectionQueue.top());
254  QueueEntry qe = mProjectionQueue.top();
255  mProjectionQueue.pop();
256  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Checking if can be purged: " << Settings::simplifyProjectionByBounds);
257  if (Settings::simplifyProjectionByBounds && mPurgedPolys.isPurged(qe)) {
258  mPurgedPolys.add(qe);
259  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Purged.");
260  } else {
261  carl::Bitset res = projectCandidate(qe);
262  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> res = " << res);
263  if (res.any()) return res;
264  }
265  }
266  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Projection is finished.");
267  return carl::Bitset();
268  }
269  carl::Bitset projectCandidate(const QueueEntry& qe) {
270  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Projecting " << qe);
271  assert(qe.level < dim());
272  if (qe.level == 0) {
273  assert(qe.first == qe.second);
274  assert(mPolynomials[qe.level][qe.first]);
275  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Moving into level 1: " << mPolynomials[qe.level][qe.first]->first);
276  insertPolynomialTo(1, mPolynomials[qe.level][qe.first]->first, Origin::BaseType(qe.level, qe.first));
277  return carl::Bitset({1});
278  }
279  carl::Bitset res;
280  if (qe.first == qe.second) {
281  assert(qe.first < mPolynomials[qe.level].size());
282  assert(mPolynomials[qe.level][qe.first]);
283  const auto& p = *mPolynomials[qe.level][qe.first];
284  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Projecting single " << p << " into " << qe.level);
285  mOperator(Settings::projectionOperator, p.first, var(qe.level + 1),
286  [&](const UPoly& np){ res |= insertPolynomialTo(qe.level + 1, np, Origin::BaseType(qe.level, qe.first)); }
287  );
288  } else {
289  assert(qe.first < mPolynomials[qe.level].size());
290  assert(qe.second < mPolynomials[qe.level].size());
291  assert(mPolynomials[qe.level][qe.first] && mPolynomials[qe.level][qe.second]);
292  const auto& p = *mPolynomials[qe.level][qe.first];
293  const auto& q = *mPolynomials[qe.level][qe.second];
294  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Projecting paired " << p << ", " << q << " into " << qe.level);
295  mOperator(Settings::projectionOperator, p.first, q.first, var(qe.level + 1),
296  [&](const UPoly& np){ res |= insertPolynomialTo(qe.level + 1, np, Origin::BaseType(qe.level, qe.first, qe.second)); }
297  );
298  }
299  return res;
300  }
301 
302  public:
304  Super(c),
305  mProjectionQueue(ProjectionCandidateComparator([&](std::size_t level, std::size_t id){ return getPolynomialById(level, id); })),
306  mPurgedPolys([this](std::size_t level, std::size_t id){
307  return canBePurgedByBounds(getPolynomialById(level, id));
308  })
309  {}
310  void reset() {
311  Super::reset();
312  mPolynomialIDs.clear();
313  mPolynomialIDs.resize(dim() + 1);
314  mPolynomials.clear();
315  mPolynomials.resize(dim() + 1);
316  mProjectionQueue.clear();
317  mPurgedPolys.reset(dim() + 1);
318  }
319  carl::Bitset addPolynomial(const UPoly& p, std::size_t cid, bool isBound) override {
320  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Adding " << p << " with id " << cid);
321  if (cid >= mPolynomials[0].size()) {
322  mPolynomials[0].resize(cid + 1);
323  }
324  assert(!mPolynomials[0][cid]);
325  mPolynomials[0][cid] = std::make_pair(p, Origin());
326  mPolynomialIDs[0].emplace(p, cid);
327  if (isBound) {
328  insertPolynomialTo(1, p, Origin::BaseType(0,cid), true);
329  } else {
330  mProjectionQueue.emplace(0, cid, cid);
331  }
332  return carl::Bitset();
333  }
334  void removePolynomial(const UPoly& p, std::size_t cid, bool isBound) override {
335  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "Removing " << cid);
336  assert(mPolynomials[0][cid]);
337  assert(mPolynomials[0][cid]->first == p);
338  mPolynomials[0][cid] = std::nullopt;
339  removeFromProjectionQueue(0, cid);
340  carl::Bitset filter = carl::Bitset().set(cid);
341  for (std::size_t level = 1; level <= dim(); level++) {
342  for (std::size_t lvl = level; lvl <= dim(); lvl++) {
343  for (auto it = mPolynomialIDs[level].begin(); it != mPolynomialIDs[level].end(); it++) {
344  assert(mPolynomials[level][it->second]);
345  mPolynomials[level][it->second]->second.erase(level, filter);
346  }
347  }
348  carl::Bitset removed;
349  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Purging from level " << level << " with filter " << filter);
350  for (auto it = mPolynomialIDs[level].begin(); it != mPolynomialIDs[level].end();) {
351  std::size_t id = it->second;
352  assert(mPolynomials[level][id]);
353  if (mPolynomials[level][id]->second.empty()) {
354  SMTRAT_LOG_DEBUG("smtrat.cad.projection", "-> Purging " << id << " from level " << level);
355  removed.set(id);
356  it = removePolynomialByIT(level, it);
357  } else {
358  it++;
359  }
360  }
361  SMTRAT_LOG_TRACE("smtrat.cad.projection", "Calling callback for level " << level << ", removed [" << removed << "]");
362  callRemoveCallback(level, removed);
363  filter = removed;
364  }
365  if (Settings::simplifyProjectionByBounds && isBound) {
366  mPurgedPolys.restore([this](const QueueEntry& qe) {
367  mProjectionQueue.push(qe);
368  });
369  }
370  }
371 
372  std::size_t size(std::size_t level) const override {
373  assert(level <= dim());
374  return mPolynomialIDs[level].size();
375  }
376  bool empty(std::size_t level) const override {
377  assert(level <= dim());
378  return mPolynomialIDs[level].empty();
379  }
380 
381  carl::Bitset projectNewPolynomial(const ConstraintSelection& cs = carl::Bitset(true)) {
382  return project(cs);
383  }
384 
385  bool hasPolynomialById(std::size_t level, std::size_t id) const override {
386  assert(level <= dim());
387  assert(id < mPolynomials[level].size());
388  return bool(mPolynomials[level][id]);
389  }
390  const UPoly& getPolynomialById(std::size_t level, std::size_t id) const override {
391  assert(level <= dim());
392  assert(id < mPolynomials[level].size());
393  assert(mPolynomials[level][id]);
394  return mPolynomials[level][id]->first;
395  }
396 
397  void exportAsDot(std::ostream& out) const override {
399  std::size_t originID = 0;
400  for (std::size_t level = 0; level <= dim(); level++) {
401  debug::DotSubgraph dsg("level_" + std::to_string(level));
402  for (std::size_t id = 0; id < mPolynomials[level].size(); id++) {
403  const auto& p = mPolynomials[level][id];
404  if (!p) continue;
405  out << "\t\tp_" << level << "_" << id << " [label=\"" << p->first << "\"];" << std::endl;
406  dsg.add("p_" + std::to_string(level) + "_" + std::to_string(id));
407  for (const auto& origin: p->second) {
408  std::string target = (origin.level == 0 ? "orig_" : "p_" + std::to_string(origin.level-1) + "_");
409  if (origin.first != origin.second) {
410  out << "\t\torigin_" << originID << " [label=\"\", shape=point];" << std::endl;
411  out << "\t\torigin_" << originID << " -> p_" << level << "_" << id << ";" << std::endl;
412  out << "\t\t" << target << origin.first << " -> origin_" << originID << ";" << std::endl;
413  out << "\t\t" << target << origin.second << " -> origin_" << originID << ";" << std::endl;
414  } else {
415  out << "\t\t" << target << origin.first << " -> p_" << level << "_" << id << ";" << std::endl;
416  }
417  originID++;
418  }
419  }
420  out << "\t" << dsg << std::endl;
421  }
422  }
423 
424  Origin getOrigin(std::size_t level, std::size_t id) const override {
425  assert(level < mPolynomials.size());
426  assert(id < mPolynomials[level].size());
427  assert(mPolynomials[level][id]);
428  return mPolynomials[level][id]->second;
429  }
430  };
431 
432  template<typename S, Backtracking B>
433  std::ostream& operator<<(std::ostream& os, const Projection<Incrementality::FULL, B, S>& p) {
434  for (std::size_t level = 0; level <= p.dim(); level++) {
435  if (level == 0) os << level << std::endl;
436  else os << level << " / " << p.var(level) << std::endl;
437  os << "\tP: " << p.mPolynomials[level] << std::endl;
438  if (level > 0) {
439  os << "\tL: " << p.mLiftingQueues[level - 1] << std::endl;
440  }
441  }
442  os << "Q: " << p.mProjectionQueue << std::endl;
443  return os;
444  }
445 }
446 }
ProjectionOperator mOperator
The projection operator.
const Constraints & mConstraints
std::size_t dim() const
Returns the dimension of the projection.
std::size_t size() const
void freeID(std::size_t level, std::size_t id)
Frees a currently used polynomial id for the given level.
std::size_t getID(std::size_t level)
Returns a fresh polynomial id for the given level.
virtual const UPoly & getPolynomialById(std::size_t level, std::size_t id) const =0
Retrieves a polynomial from its id.
std::vector< PolynomialLiftingQueue< BaseProjection > > mLiftingQueues
List of lifting queues that can be used for incremental projection.
carl::Variable var(std::size_t level) const
Returns the variable that corresponds to the given level, that is the variable eliminated in this lev...
bool canBePurgedByBounds(const UPoly &p) const
Checks whether a polynomial can safely be ignored due to the bounds.
void callRemoveCallback(std::size_t level, const SampleLiftedWith &slw) const
bool isPurged(std::size_t level, std::size_t id)
void exportAsDot(std::ostream &out) const
This class represents one or more origins of some object.
Definition: Origin.h:21
void removeFromProjectionQueue(std::size_t level, std::size_t id)
Remove projection candidates involving a specific polynomial.
Definition: Projection_F.h:187
std::vector< std::map< UPoly, std::size_t > > mPolynomialIDs
Definition: Projection_F.h:159
void exportAsDot(std::ostream &out) const override
Definition: Projection_F.h:397
Iterator removePolynomialByIT(std::size_t level, Iterator it)
Removes the polynomial given by the iterator from all datastructures.
Definition: Projection_F.h:234
void removePolynomial(const UPoly &p, std::size_t cid, bool isBound) override
Removes the given polynomial from the projection.
Definition: Projection_F.h:334
void insertIntoProjectionQueue(std::size_t level, std::size_t id)
Add projection candidates for a new polynomial.
Definition: Projection_F.h:176
carl::Bitset project(const ConstraintSelection &)
Definition: Projection_F.h:250
carl::Bitset insertPolynomialTo(std::size_t level, const UPoly &p, const Origin::BaseType &origin, bool setBound=false)
Inserts a polynomial with the given origin into the given level.
Definition: Projection_F.h:195
std::vector< std::vector< full::Polynomial > > mPolynomials
Definition: Projection_F.h:161
Origin getOrigin(std::size_t level, std::size_t id) const override
Definition: Projection_F.h:424
carl::Bitset addPolynomial(const UPoly &p, std::size_t cid, bool isBound) override
Adds the given polynomial to the projection.
Definition: Projection_F.h:319
const UPoly & getPolynomialById(std::size_t level, std::size_t id) const override
Retrieves a polynomial from its id.
Definition: Projection_F.h:390
PriorityQueue< QueueEntry, ProjectionCandidateComparator > mProjectionQueue
Definition: Projection_F.h:163
std::size_t size(std::size_t level) const override
Definition: Projection_F.h:372
bool hasPolynomialById(std::size_t level, std::size_t id) const override
Definition: Projection_F.h:385
carl::Bitset projectNewPolynomial(const ConstraintSelection &cs=carl::Bitset(true))
Definition: Projection_F.h:381
int var(Lit p)
Definition: SolverTypes.h:64
std::optional< std::pair< UPoly, Origin > > Polynomial
Definition: Projection_F.h:15
bool canBeRemoved(const UPoly &p)
Checks whether a polynomial can safely be ignored.
bool canBeForwarded(std::size_t, const UPoly &p)
Checks whether a polynomial can safely be forwarded to the next level.
std::ostream & operator<<(std::ostream &os, const SampleIteratorQueue< I, C > &siq)
carl::UnivariatePolynomial< Poly > UPoly
Definition: common.h:17
projection_compare::Candidate< Poly > candidate(const Poly &p, const Poly &q, std::size_t level)
Incrementality
Definition: Settings.h:7
carl::Bitset ConstraintSelection
Definition: common.h:12
PositionIteratorType Iterator
Definition: Common.h:49
std::optional< FormulaT > qe(const FormulaT &input)
Definition: qe.cpp:14
Class to create the formulas for axioms.
const settings::Settings & Settings()
Definition: Settings.h:96
#define SMTRAT_LOG_TRACE(channel, msg)
Definition: logging.h:36
#define SMTRAT_LOG_DEBUG(channel, msg)
Definition: logging.h:35
void setBound(std::size_t level, std::size_t id, bool isBound)
Definition: Projection_F.h:111
friend std::ostream & operator<<(std::ostream &os, const QueueEntry &qe)
Definition: Projection_F.h:48
void add(const std::string &n)
Definition: DotHelper.h:14