#ifndef MAXPP_PROBLEMINSTANCE_HPP
#define MAXPP_PROBLEMINSTANCE_HPP
#include <vector>
#include <cstdint>
#include "clause.hpp"
#include "global.hpp"
#include "touchedlist.hpp"
namespace maxPreprocessor {
class ProblemInstance {
private:
std::vector<int> isLabel; public:
int objectives;
std::vector<Clause> clauses;
std::vector<std::vector<int> > litClauses;
std::vector<int> removedClauses;
int vars;
int excessVar;
TouchedList tl;
private:
void init(uint64_t topWeight);
public:
ProblemInstance(const std::vector<std::vector<int> >& clauses_, const std::vector<uint64_t>& weights_, uint64_t topWeight);
ProblemInstance(const std::vector<std::vector<int> >& clauses_, const std::vector<std::pair<uint64_t, uint64_t> >& weights_, uint64_t topWeight);
ProblemInstance(const std::vector<std::vector<int> >& clauses_, const std::vector<std::vector<uint64_t> >& weights_, uint64_t topWeight);
int labelPolarity(int var, int objective) const; int slabelPolarity(int var) const; int labelIndexMask(int var) const; bool isLabelVar(int var) const; bool isLabelVar(int var, int objective) const;
bool isLitLabel(int lit) const; bool isLitLabel(int lit, int objective) const;
int labelObjectives(int var) const; int labelObjective(int var) const;
void unLabel(int lbl);
void unLabelPolarity(int lbl, int polarity);
void unLabel(int lbl, int objective);
void mkLabel(int lbl, int objective, int polarity);
void updateLabelMask(int lbl);
bool isClauseRemoved(int clauseId) const;
bool isVarRemoved(int var) const;
int litLabelIndexMask(int lit) const; bool isLabelClause(int clauseId) const;
uint64_t labelWeight(int lbl, int objective) const;
const std::vector<uint64_t>& labelLitWeights(int lbl) const;
bool wDominates(const std::vector<uint64_t>& w1, const std::vector<uint64_t>& w2) const;
bool wEqual(const std::vector<uint64_t>& w1, const std::vector<uint64_t>& w2) const;
void populateLitClauses(int clauseId);
void removeClauseFromLitClause(int clauseId, int lit);
void removeClauseFromLitClauses(int clauseId);
void removeClause(int clauseId);
void pourAllWeight(int clauseFrom, int clauseTo);
std::vector<uint64_t> substractWeights(int clause1, int clause2);
void addClause(const std::vector<int>& clause, const std::vector<uint64_t>& weight = std::vector<uint64_t>());
int addVar();
void addLiteralToClause(int lit, int clause, bool touch = true);
void removeLiteralFromClause(int lit, int clause, bool touch = true);
void replaceLiteralInClause(int lit1, int lit2, int clause, bool touch = true);
bool canSubsume2(uint64_t h1, uint64_t h2);
bool canSubsume1(int clause1, int clause2);
bool canSubsume(int clause1, int clause2);
int getExcessVar();
uint64_t getWeightSum(int objective);
std::vector<uint64_t> getWeightSums();
void printClauses(std::ostream& out);
};
}
#endif