#ifndef __SineUtils__
#define __SineUtils__
#include "Forwards.hpp"
#include "Lib/DArray.hpp"
#include "Lib/Stack.hpp"
namespace Shell {
using namespace Lib;
using namespace Kernel;
class SineSymbolExtractor
{
public:
typedef unsigned SymId;
typedef VirtualIterator<SymId> SymIdIterator;
SymId getSymIdBound();
SymIdIterator extractSymIds(Unit* u);
static void decodeSymId(SymId s, bool& pred, unsigned& functor);
bool validSymId(SymId s);
private:
void addSymIds(Term* term,DHSet<SymId>& ids);
void addSymIds(Literal* lit,DHSet<SymId>& ids);
void extractFormulaSymbols(Formula* f,DHSet<SymId>& itms);
};
class SineBase
{
protected:
typedef SineSymbolExtractor::SymId SymId;
typedef SineSymbolExtractor::SymIdIterator SymIdIterator;
void initGeneralityFunction(UnitList* units);
DArray<unsigned> _gen;
SineSymbolExtractor _symExtr;
};
class SineSelector
: public SineBase
{
public:
SineSelector(const Options& opt);
SineSelector(bool onIncluded, float tolerance, unsigned depthLimit,
unsigned genThreshold=0, bool justForSineLevels=false);
bool perform(UnitList*& units); void perform(Problem& prb);
~SineSelector() {
DArray<UnitList*>::Iterator it(_def);
while (it.hasNext()) {
UnitList::destroy(it.next());
}
}
private:
void init();
void updateDefRelation(Unit* u);
bool _onIncluded;
bool _strict;
unsigned _genThreshold;
float _tolerance;
unsigned _depthLimit;
bool _justForSineLevels;
DArray<UnitList*> _def;
Stack<Unit*> _unitsWithoutSymbols;
};
class SineTheorySelector
: public SineBase
{
public:
SineTheorySelector(const Options& opt);
void initSelectionStructure(UnitList* units);
void perform(UnitList*& units);
private:
static const unsigned short maxTolerance=50;
static const unsigned short strictTolerance=10;
void handlePossibleSignatureChange();
void updateDefRelation(Unit* u);
unsigned _genThreshold;
struct DEntry
{
DEntry(unsigned short minTolerance, Unit* unit) : minTolerance(minTolerance), unit(unit) {}
unsigned short minTolerance;
Unit* unit;
};
typedef List<DEntry> DEntryList;
DArray<DEntryList*> _def;
Stack<Unit*> _unitsWithoutSymbols;
const Options& _opt;
};
}
#endif