#ifndef __PredicateSplitPassiveClauseContainers__
#define __PredicateSplitPassiveClauseContainers__
#include <memory>
#include <vector>
#include "ClauseContainer.hpp"
namespace Saturation {
class PredicateSplitPassiveClauseContainer
: public PassiveClauseContainer
{
public:
PredicateSplitPassiveClauseContainer(bool isOutermost, const Shell::Options& opt, std::string name, std::vector<std::unique_ptr<PassiveClauseContainer>> queues, std::vector<float> cutoffs, std::vector<int> ratios, bool layeredArrangement);
~PredicateSplitPassiveClauseContainer() override;
void add(Clause* cl) override;
void remove(Clause* cl) override;
Clause* popSelected() override;
bool isEmpty() const override;
unsigned sizeEstimate() const override;
private:
bool _randomize;
std::vector<unsigned> _ratios;
unsigned _ratioSum;
std::vector<std::unique_ptr<PassiveClauseContainer>> _queues;
std::vector<float> _cutoffs;
std::vector<unsigned> _invertedRatios;
std::vector<unsigned> _balances;
bool _layeredArrangement;
unsigned bestQueue(float featureValue) const;
virtual float evaluateFeature(Clause* cl) const = 0;
virtual float evaluateFeatureEstimate(unsigned numPositiveLiterals, const Inference& inf) const = 0;
public:
void simulationInit() override;
bool simulationHasNext() override;
void simulationPopSelected() override;
bool setLimitsToMax() override;
bool setLimitsFromSimulation() override;
void onLimitsUpdated() override;
private:
std::vector<unsigned> _simulationBalances;
public:
bool mayBeAbleToDiscriminateChildrenOnLimits() const override;
bool allChildrenNecessarilyExceedLimits(Clause* cl, unsigned upperBoundNumSelLits) const override;
bool mayBeAbleToDiscriminateClausesUnderConstructionOnLimits() const override;
bool exceedsAgeLimit(unsigned numPositiveLiterals, const Inference& inference, bool& andThatsIt) const override;
bool exceedsWeightLimit(unsigned w, unsigned numPositiveLiterals, const Inference& inference) const override;
bool limitsActive() const override;
bool exceedsAllLimits(Clause* c) const override;
};
class TheoryMultiSplitPassiveClauseContainer : public PredicateSplitPassiveClauseContainer
{
public:
TheoryMultiSplitPassiveClauseContainer(bool isOutermost, const Shell::Options &opt, std::string name, std::vector<std::unique_ptr<PassiveClauseContainer>> queues);
private:
float evaluateFeature(Clause* cl) const override;
float evaluateFeatureEstimate(unsigned numPositiveLiterals, const Inference& inf) const override;
};
class AvatarMultiSplitPassiveClauseContainer : public PredicateSplitPassiveClauseContainer
{
public:
AvatarMultiSplitPassiveClauseContainer(bool isOutermost, const Shell::Options &opt, std::string name, std::vector<std::unique_ptr<PassiveClauseContainer>> queues);
private:
float evaluateFeature(Clause* cl) const override;
float evaluateFeatureEstimate(unsigned numPositiveLiterals, const Inference& inf) const override;
};
class SineLevelMultiSplitPassiveClauseContainer : public PredicateSplitPassiveClauseContainer
{
public:
SineLevelMultiSplitPassiveClauseContainer(bool isOutermost, const Shell::Options &opt, std::string name, std::vector<std::unique_ptr<PassiveClauseContainer>> queues);
private:
float evaluateFeature(Clause* cl) const override;
float evaluateFeatureEstimate(unsigned numPositiveLiterals, const Inference& inf) const override;
};
class PositiveLiteralMultiSplitPassiveClauseContainer : public PredicateSplitPassiveClauseContainer
{
public:
PositiveLiteralMultiSplitPassiveClauseContainer(bool isOutermost, const Shell::Options &opt, std::string name, std::vector<std::unique_ptr<PassiveClauseContainer>> queues);
private:
float evaluateFeature(Clause* cl) const override;
float evaluateFeatureEstimate(unsigned numPositiveLiterals, const Inference& inf) const override;
};
};
#endif