void compile_vtree_shannon(NNF_NODE* node, Clause** learned_clause, DVtree* vtree, VtreeManager* vtree_manager, NnfManager* nnf_manager, SatState* sat_state) { Var* var = vtree_shannon_var(vtree); if(sat_instantiated_var(var) || sat_irrelevant_var(var)) { compile_dispatcher(node,learned_clause,vtree->right,vtree_manager,nnf_manager,sat_state); if(*learned_clause==NULL) *node = nnf_conjoin(*node,var2nnf(var,nnf_manager),nnf_manager); return; } Lit* plit = sat_pos_literal(var); Lit* nlit = sat_neg_literal(var); if(!compile_with_literal(node,learned_clause,plit,vtree,vtree_manager,nnf_manager,sat_state)) return; assert(*learned_clause==NULL); assert(!sat_instantiated_var(var)); NNF_NODE pnode = *node; //save the node when conditioned on plit if(!compile_with_literal(node,learned_clause,nlit,vtree,vtree_manager,nnf_manager,sat_state)) return; assert(*learned_clause==NULL); assert(!sat_instantiated_var(var)); NNF_NODE nnode = *node; //save the node when conditioned on nlit if(pnode==nnode) *node = pnode; else { NNF_NODE pl = nnf_literal2node(plit,nnf_manager); NNF_NODE nl = nnf_literal2node(nlit,nnf_manager); NNF_NODE pc = nnf_conjoin(pl,pnode,nnf_manager); NNF_NODE nc = nnf_conjoin(nl,nnode,nnf_manager); *node = nnf_disjoin(var,pc,nc,nnf_manager); } }
NNF_NODE var2nnf(Var* var, NnfManager* nnf_manager) { Lit* plit = sat_pos_literal(var); Lit* nlit = sat_neg_literal(var); if(sat_implied_literal(plit)) return nnf_literal2node(plit,nnf_manager); else if(sat_implied_literal(nlit)) return nnf_literal2node(nlit,nnf_manager); else return ONE_NNF_NODE; }
Lit* sat_opp_literal(const Lit* lit) { Var* var = sat_literal_var(lit); return lit->index > 0 ? sat_neg_literal(var) : sat_pos_literal(var); }
//returns 1 if the variable is instantiated, 0 otherwise //a variable is instantiated either by decision or implication (by unit resolution) BOOLEAN sat_instantiated_var(const Var* var) { Lit* plit = sat_pos_literal(var); Lit* nlit = sat_neg_literal(var); return sat_implied_literal(plit) || sat_implied_literal(nlit); }
/****************************************************************************** * Parse Clause line * -- For each line in the DIMACS file construct a new clause struct * -- initialize the array of literals this clause contains ******************************************************************************/ static unsigned long parseClause(SatState* sat_state, char* line, Clause* clause){ char* pch = NULL; unsigned long countvariables = 0; //Lit* literals = (Lit *) malloc(sizeof (Lit)); #ifdef DEBUG printf("%s\n",line); #endif // initialize memory of clause literals with one element and then increase the size by double if needed unsigned long MIN_CAPACITY = 1; clause->literals = (Lit**) malloc(sizeof(Lit*) * MIN_CAPACITY); //separate the string into space separated tokens pch = strtok(line, " \t"); while (pch != NULL){ //#ifdef DEBUG // printf("%s\n", pch); //#endif if(atol(pch) == END_OF_CLAUSE_LINE){ break; } if(countvariables >= MIN_CAPACITY){ // needs to realloc the size MIN_CAPACITY = countvariables * MALLOC_GROWTH_RATE; clause->literals = (Lit**) realloc( clause->literals, sizeof(Lit*) * MIN_CAPACITY); } signed long value = atol(pch); Var* var = &(sat_state->variables[abs(value) - 1]); // because array is filled from 0 to n-1 if(value < 0) clause->literals[countvariables] = sat_neg_literal(var); else if (value > 0) clause->literals[countvariables] = sat_pos_literal(var); add_clause_to_variable(var, clause); add_clause_to_variable_from_cnf(var, clause); add_clause_to_literal(clause->literals[countvariables], clause); //#ifdef DEBUG // print_clause_containing_literal(clause->literals[countvariables]); //#endif countvariables ++; pch = strtok (NULL, " \t"); } clause->num_literals_in_clause = countvariables; clause->max_size_list_literals = MIN_CAPACITY; clause->is_subsumed = 0; // For the two literal watch // just initialize here if(clause->num_literals_in_clause > 1){ clause->L1 = clause->literals[0]; // first literal add_watching_clause(clause, clause->L1); clause->L2 = clause->literals[1]; // second literal add_watching_clause(clause, clause->L2); } else{ //unit clause clause->L1 = clause->literals[0]; add_watching_clause(clause, clause->L1); clause->L2 = NULL; } clause->mark = 0; // THIS FIELD AS IT DESCRIBED BY IN THE REQUIREMENTS return countvariables; }