CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
qbf_qube_core.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: CM Wintersteiger
6
7\*******************************************************************/
8
9#include "qbf_qube_core.h"
10
11#include <cstdlib>
12#include <cstring>
13#include <fstream>
14
15#include <util/arith_tools.h>
16#include <util/invariant.h>
17
19 : qdimacs_coret(message_handler)
20{
21 break_lines=false;
22 qbf_tmp_file="qube.qdimacs";
23}
24
28
29std::string qbf_qube_coret::solver_text() const
30{
31 return "QuBE w/ toplevel assignments";
32}
33
35{
36 if(no_clauses()==0)
38
39 {
40 log.status() << "QuBE: " << no_variables() << " variables, " << no_clauses()
41 << " clauses" << messaget::eom;
42 }
43
44 std::string result_tmp_file="qube.out";
45
46 {
47 std::ofstream out(qbf_tmp_file.c_str());
48
49 // write it
50 break_lines=false;
52 }
53
54 std::string options;
55
56 // solve it
57 int res=system((
58 "QuBE "+options+" "+qbf_tmp_file+" > "+result_tmp_file).c_str());
59 CHECK_RETURN(0==res);
60
61 bool result=false;
62
63 // read result
64 {
65 std::ifstream in(result_tmp_file.c_str());
66
67 bool result_found=false;
68 while(in)
69 {
70 std::string line;
71
72 std::getline(in, line);
73
74 if(!line.empty() && line[line.size() - 1] == '\r')
75 line.resize(line.size()-1);
76
77 if(line[0]=='V')
78 {
79 mp_integer b(line.substr(2).c_str());
80 if(b<0)
81 assignment[numeric_cast_v<std::size_t>(b.negate())] = false;
82 else
84 }
85 else if(line=="s cnf 1")
86 {
87 result=true;
88 result_found=true;
89 break;
90 }
91 else if(line=="s cnf 0")
92 {
93 result=false;
94 result_found=true;
95 break;
96 }
97 }
98
99 if(!result_found)
100 {
101 log.error() << "QuBE failed: unknown result" << messaget::eom;
102 return resultt::P_ERROR;
103 }
104 }
105
106 int remove_result=remove(result_tmp_file.c_str());
107 if(remove_result!=0)
108 {
109 log.error() << "Remove failed: " << std::strerror(errno) << messaget::eom;
110 return resultt::P_ERROR;
111 }
112
113 remove_result=remove(qbf_tmp_file.c_str());
114 if(remove_result!=0)
115 {
116 log.error() << "Remove failed: " << std::strerror(errno) << messaget::eom;
117 return resultt::P_ERROR;
118 }
119
120 if(result)
121 {
122 log.status() << "QuBE: TRUE" << messaget::eom;
124 }
125 else
126 {
127 log.status() << "QuBE: FALSE" << messaget::eom;
129 }
130}
131
136
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
size_t no_clauses() const override
virtual size_t no_variables() const override
Definition cnf.h:42
bool break_lines
Definition dimacs_cnf.h:42
mstreamt & error() const
Definition message.h:391
static eomt eom
Definition message.h:289
mstreamt & status() const
Definition message.h:406
resultt
Definition prop.h:101
messaget log
Definition prop.h:134
std::string solver_text() const override
qbf_qube_coret(message_handlert &message_handler)
assignmentt assignment
virtual resultt prop_solve()
~qbf_qube_coret() override
modeltypet m_get(literalt a) const override
bool is_in_core(literalt l) const override
std::string qbf_tmp_file
virtual void write_qdimacs_cnf(std::ostream &out)
#define CHECK_RETURN(CONDITION)
Definition invariant.h:495
#define UNIMPLEMENTED
Definition invariant.h:558