#ifndef __GlobalSubsumption__
#define __GlobalSubsumption__
#include "Forwards.hpp"
#include "Shell/Options.hpp"
#include "Kernel/Grounder.hpp"
#include "SAT/ProofProducingSATSolver.hpp"
#include "InferenceEngine.hpp"
namespace Saturation { class Splitter; }
namespace Inferences
{
using namespace Kernel;
using namespace Indexing;
using namespace Saturation;
using namespace SAT;
class GlobalSubsumption : public ForwardSimplificationEngine
{
public:
GlobalSubsumption(const Options& opts);
void attach(SaturationAlgorithm* salg) override;
void detach() override;
bool perform(Clause* cl, Clause*& replacement, ClauseIterator& premises) override;
Clause* perform(Clause* cl, Stack<Unit*>& prems);
private:
struct Unit2ClFn;
ScopedPtr<ProofProducingSATSolver> _solver;
ScopedPtr<GlobalSubsumptionGrounder> _grounder;
bool _randomizeMinim;
DHMap<unsigned, unsigned> _splits2vars;
DHMap<unsigned, unsigned> _vars2splits;
protected:
unsigned splitLevelToVar(SplitLevel lev) {
unsigned* pvar;
if(_splits2vars.getValuePtr(lev, pvar)) {
*pvar = _solver->newVar();
ALWAYS(_vars2splits.insert(*pvar,lev));
}
return *pvar;
}
bool isSplitLevelVar(unsigned var, SplitLevel& lev) {
return _vars2splits.find(var,lev);
}
};
};
#endif