| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /****************************************************************************************[Dimacs.h]
- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson
- Copyright (c) 2007-2010, Niklas Sorensson
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
- associated documentation files (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge, publish, distribute,
- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all copies or
- substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
- NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
- OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- **************************************************************************************************/
- #ifndef Minisat_Dimacs_h
- #define Minisat_Dimacs_h
- #include <stdio.h>
- #include "utils/ParseUtils.h"
- #include "core/SolverTypes.h"
- namespace Minisat {
- //=================================================================================================
- // DIMACS Parser:
- template<class B, class Solver>
- static void readClause(B& in, Solver& S, vec<Lit>& lits) {
- int parsed_lit, var;
- lits.clear();
- for (;;){
- parsed_lit = parseInt(in);
- if (parsed_lit == 0) break;
- var = abs(parsed_lit)-1;
- while (var >= S.nVars()) S.newVar();
- lits.push( (parsed_lit > 0) ? mkLit(var) : ~mkLit(var) );
- }
- }
- template<class B, class Solver>
- static void parse_DIMACS_main(B& in, Solver& S) {
- vec<Lit> lits;
- int vars = 0;
- int clauses = 0;
- int cnt = 0;
- for (;;){
- skipWhitespace(in);
- if (*in == EOF) break;
- else if (*in == 'p'){
- if (eagerMatch(in, "p cnf")){
- vars = parseInt(in);
- clauses = parseInt(in);
- // SATRACE'06 hack
- // if (clauses > 4000000)
- // S.eliminate(true);
- }else{
- printf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3);
- }
- } else if (*in == 'c' || *in == 'p')
- skipLine(in);
- else{
- cnt++;
- readClause(in, S, lits);
- S.addClause_(lits); }
- }
- if (vars != S.nVars())
- fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of variables.\n");
- if (cnt != clauses)
- fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of clauses.\n");
- }
- // Inserts problem into solver.
- //
- template<class Solver>
- static void parse_DIMACS(gzFile input_stream, Solver& S) {
- StreamBuffer in(input_stream);
- parse_DIMACS_main(in, S); }
- //=================================================================================================
- template<class B, class Solver>
- static void simple_readClause(B& in, Solver& S, vec<Lit>& lits) {
- int parsed_lit, var;
- lits.clear();
- for (;;){
- parsed_lit = parseInt(in);
- if (parsed_lit == 0) break;
- var = abs(parsed_lit)-1;
- lits.push( (parsed_lit > 0) ? mkLit(var) : ~mkLit(var) );
- }
- }
- template<class B, class Solver>
- static void check_solution_DIMACS_main(B& in, Solver& S) {
- vec<Lit> lits;
- int vars = 0;
- int clauses = 0;
- int cnt = 0;
- bool ok=true;
- for (;;){
- skipWhitespace(in);
- if (*in == EOF) break;
- else if (*in == 'p'){
- if (eagerMatch(in, "p cnf")){
- vars = parseInt(in);
- clauses = parseInt(in);
- // SATRACE'06 hack
- // if (clauses > 4000000)
- // S.eliminate(true);
- }else{
- printf("c PARSE ERROR! Unexpected char: %c\n", *in), exit(3);
- }
- } else if (*in == 'c' || *in == 'p')
- skipLine(in);
- else{
- cnt++;
- int parsed_lit, var;
- bool ok=false;
- for(;;) {
- parsed_lit = parseInt(in);
- if (parsed_lit == 0) break; //{printf("\n"); break;}
- var = abs(parsed_lit)-1;
- // printf("%d ", parsed_lit);
- if ((parsed_lit>0 && S.model[var]==l_True) ||
- (parsed_lit<0 && S.model[var]==l_False))
- ok=true;
- }
- if (!ok) {
- printf("c clause %d is not satisfied\n", cnt);
- ok=false;
- // break;
- }
- }
- }
- if (cnt != clauses)
- printf("c WARNING! DIMACS header mismatch: wrong number of clauses.%d %d\n", cnt, clauses);
- else if (ok)
- printf("c solution checked against the original DIMACS file\n");
- }
- template<class Solver>
- static void check_solution_DIMACS(gzFile input_stream, Solver& S) {
- StreamBuffer in(input_stream);
- check_solution_DIMACS_main(in, S); }
- //=================================================================================================
- }
- #endif
|