CBMC
Loading...
Searching...
No Matches
dimacs_cnf.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9
10#include "dimacs_cnf.h"
11
12#include <util/invariant.h>
13#include <util/magic.h>
14
15#include <iostream>
16
18 : cnf_clause_listt(message_handler), break_lines(false)
19{
20}
21
26
28{
30 return false;
31}
32
34 std::ostream &_out,
35 message_handlert &message_handler)
36 : cnft(message_handler), out(_out)
37{
38}
39
40void dimacs_cnft::write_dimacs_cnf(std::ostream &out) const
41{
43 write_clauses(out);
44}
45
46void dimacs_cnft::write_problem_line(std::ostream &out) const
47{
48 // We start counting at 1, thus there is one variable fewer.
49 out << "p cnf " << (no_variables()-1) << " "
50 << clauses.size() << "\n";
51}
52
54 const bvt &clause,
55 std::ostream &out,
56 bool break_lines)
57{
58 // The DIMACS CNF format allows line breaks in clauses:
59 // "Each clauses is terminated by the value 0. Unlike many formats
60 // that represent the end of a clause by a new-line character,
61 // this format allows clauses to be on multiple lines."
62 // Some historic solvers (zchaff e.g.) have silently swallowed
63 // literals in clauses that exceed some fixed buffer size.
64
65 // However, the SAT competition format does not allow line
66 // breaks in clauses, so we offer both options.
67
68 for(size_t j=0; j<clause.size(); j++)
69 {
70 out << clause[j].dimacs() << " ";
71 // newline to avoid overflow in sat checkers
72 if((j&15)==0 && j!=0 && break_lines)
73 out << "\n";
74 }
75
76 out << "0" << "\n";
77}
78
79void dimacs_cnft::write_clauses(std::ostream &out) const
80{
81 std::size_t count = 0;
82 std::stringstream output_block;
83 for(clausest::const_iterator it=clauses.begin();
84 it!=clauses.end(); it++)
85 {
87
88 // print the block once in a while
89 if(++count % CNF_DUMP_BLOCK_SIZE == 0)
90 {
91 out << output_block.str();
92 output_block.str("");
93 }
94 }
95
96 // make sure the final block is printed as well
97 out << output_block.str();
98}
99
101{
103}
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
Definition cnf.h:18
virtual size_t no_variables() const override
Definition cnf.h:42
std::ostream & out
Definition dimacs_cnf.h:74
dimacs_cnf_dumpt(std::ostream &_out, message_handlert &message_handler)
void lcnf(const bvt &bv) override
bool is_in_conflict(literalt l) const override
Returns true if an assumption is in the final conflict.
dimacs_cnft(message_handlert &)
void write_clauses(std::ostream &out) const
static void write_dimacs_clause(const bvt &, std::ostream &, bool break_lines)
bool break_lines
Definition dimacs_cnf.h:42
void set_assignment(literalt a, bool value) override
virtual void write_dimacs_cnf(std::ostream &out) const
void write_problem_line(std::ostream &out) const
std::vector< literalt > bvt
Definition literal.h:201
Magic numbers used throughout the codebase.
const std::size_t CNF_DUMP_BLOCK_SIZE
Definition magic.h:10
#define UNREACHABLE
This should be used to mark dead code.
Definition invariant.h:525
#define UNIMPLEMENTED
Definition invariant.h:558