14#ifndef ORTOOLS_SAT_LRAT_PROOF_HANDLER_H_
15#define ORTOOLS_SAT_LRAT_PROOF_HANDLER_H_
25#include "absl/container/flat_hash_map.h"
26#include "absl/container/flat_hash_set.h"
27#include "absl/log/check.h"
28#include "absl/strings/string_view.h"
29#include "absl/types/span.h"
50 std::string_view
filename()
const {
return filename_; }
55 absl::Span<const ClauseId> unit_ids,
56 absl::Span<const LratChecker::RatIds> rat,
57 bool exported =
false);
59 void ExportClause(ClauseId
id, absl::Span<const Literal> clause);
64 void WriteDeletedClauseIds();
66 std::string filename_;
67 std::ofstream ofstream_;
69 std::vector<ClauseId> deleted_clause_ids_;
83 bool Merge(absl::Span<const std::string> proof_filenames);
95 bool ReadPresolveProof(
const std::string& filename);
100 void SortAndAddSharedClause(GlobalId
id, std::vector<Literal>& literals);
104 bool RemapInferredClause(
int worker_index,
const std::string& filename,
106 bool RemapClauseIds(
int worker_index,
const std::string& filename,
107 google::protobuf::RepeatedField<int64_t>* clause_ids);
114 GlobalId NextGlobalId() {
return GlobalId(next_global_id_++); }
116 bool Error(std::string_view message)
const;
117 bool LratError()
const;
121 std::unique_ptr<LratChecker> lrat_checker_;
122 bool debug_crash_on_error_;
124 std::string merged_proof_filename_;
125 std::ofstream merged_proof_file_;
126 GlobalId next_global_id_;
128 absl::flat_hash_map<std::vector<Literal>, GlobalId> shared_clause_ids_;
129 std::vector<absl::flat_hash_map<ClauseId, GlobalId>> local_to_global_ids_;
130 std::vector<absl::flat_hash_set<ClauseId>> exported_local_ids_;
131 std::vector<LratProofStep> last_read_steps_;
133 std::vector<Literal> tmp_clause_;
134 std::vector<ClauseId> tmp_unit_ids_;
135 std::vector<LratChecker::RatIds> tmp_rat_ids_;
140class LratProofHandler {
143 static std::unique_ptr<LratProofHandler>
MaybeCreate(
163 absl::Span<const ClauseId> unit_ids,
164 bool exported =
false) {
168 absl::Span<const ClauseId> unit_ids,
169 absl::Span<const LratChecker::RatIds> rat,
170 bool exported =
false);
185 absl::Span<const Literal> new_clause,
186 absl::Span<const ClauseId> ids_for_proof,
204 bool ExportClause(ClauseId
id, absl::Span<const Literal> clause);
208 void PinClause(ClauseId
id, absl::Span<const Literal> clause);
216 void DeleteClause(ClauseId
id, absl::Span<const Literal> clause);
229 void Close(
bool model_is_unsat);
233 CHECK(lrat_checker_ !=
nullptr);
234 return lrat_checker_->GetClauseForDebug(
id);
242 bool LratError(absl::string_view message)
const;
247 std::unique_ptr<LratChecker> lrat_checker_;
248 std::unique_ptr<LratWriter> lrat_writer_;
249 std::unique_ptr<DratChecker> drat_checker_;
250 std::unique_ptr<DratWriter> drat_writer_;
251 double max_drat_time_in_seconds_ = std::numeric_limits<double>::infinity();
252 bool debug_crash_on_error_ =
false;
254 bool all_problem_clauses_loaded_ =
false;
255 int64_t num_assumed_clauses_ = 0;
258 std::vector<Literal> pinned_clause_;
259 bool delete_pinned_clause_ =
false;
263 std::vector<std::vector<Literal>> clauses_inferred_during_problem_loading_;
bool Merge(absl::Span< const std::string > proof_filenames)
void DeleteClause(ClauseId id, absl::Span< const Literal > clause)
bool ExportClause(ClauseId id, absl::Span< const Literal > clause)
bool AddProblemClause(ClauseId id, absl::Span< const Literal > clause)
DratChecker::Status Check()
void Close(bool model_is_unsat)
absl::Span< const Literal > GetLratClauseForDebug(ClauseId id) const
int64_t num_assumed_clauses() const
ClauseId AddAndProveInferredClauseByEnumeration(absl::Span< const Literal > new_clause, absl::Span< const ClauseId > ids_for_proof, const CompactVectorVector< int, Literal > &clauses_for_proof)
static std::unique_ptr< LratProofHandler > MaybeCreate(Model *model)
bool AddInferredClause(ClauseId id, absl::Span< const Literal > clause, absl::Span< const ClauseId > unit_ids, bool exported=false)
bool AddImportedClause(ClauseId id, absl::Span< const Literal > clause)
bool drat_output_enabled() const
DratChecker::Status Valid() const
void PinClause(ClauseId id, absl::Span< const Literal > clause)
void UnpinClause(ClauseId id)
bool lrat_check_enabled() const
bool AddAssumedClause(ClauseId id, absl::Span< const Literal > clause)
bool lrat_output_enabled() const
bool drat_check_enabled() const
LratWriter(std::string_view filename)
void AddInferredClause(ClauseId id, absl::Span< const Literal > clause, absl::Span< const ClauseId > unit_ids, absl::Span< const LratChecker::RatIds > rat, bool exported=false)
void ExportClause(ClauseId id, absl::Span< const Literal > clause)
void DeleteClause(ClauseId id)
void AddImportedClause(ClauseId id, absl::Span< const Literal > clause)
std::string_view filename() const
constexpr ClauseId kNoClauseId(0)
#define DEFINE_STRONG_INT_TYPE(type_name, value_type)