Example #1
0
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);
  }
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
0
//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);
}
Example #5
0
/******************************************************************************
 * 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;
}