/////////////////////////////////////////////////////////////// // File: cnf2ilog.cpp // Auth: Sathi // Date: Jun 21 2004 ////////////////////////////////////////////////////////////// #include ILOSTLBEGIN #include #include #include #include #include #include #include #include #include #include clock_t worst; using namespace std; struct assignment_pair{ int varid; int value; }; vector readClause(char* line,int lineNo,int varNum) { // line defines a term int lit; vector litList; if (sscanf(line,"%i",&lit) != 1) { cout << "Error line " << lineNo << ": enable to match lit pattern\n"; exit(1); } //cerr< varNum) { cout << "Error line " << lineNo << ": var number of literal " << lit << " exeeds number of vars\n"; cout < \n "; exit(1); } IloEnv env; try { IloModel mdl(env); char inName[512] = ""; strcpy(inName,argv[1]); // open files FILE *in; if ( (in = fopen(inName,"r")) == NULL ) { cout << "Error: could not open " << inName << endl; exit(1); } //+++++++++++++++++++++++++++++ // Read input //+++++++++++++++++++++++++++++ char line[2048]; int varNum; int clauseNum; vector< vector > clause; int lineNo = 0; while (fgets(line,2048,in) != NULL) { lineNo++; //cerr<<"Line :"< varDom; vector varPtr; for(int i=0; i constraint; constraint.resize(((clause.size()+varNum)/5000)); if((clause.size()+varNum)%5000 != 0) constraint.resize(constraint.size()+1); for (int i=0; i < clause.size()+varNum; i++) { IloConstraint cls; if(ivarNum) cerr<<"Literal out of range "<varNum) cerr<<"Literal out of range2"<> inp; ti >> inp2; int start_assign = 0; //////////////////////////////// // Do interactive configuration // from trace file /////////////////////////////// IloExtractableArray iloextractablearray(env,varPtr.size()); IloSolver solver(mdl); do{ clock_t t1=clock(); for(int k = 0; k < old_num_assigns; k++) old_assignments[k] = assignments[k]; ti >> inp; ti >> inp2; while(inp != -1 && inp != -2){ varid = inp; value = inp2; assignments[num_assigns].varid = varid; assignments[num_assigns].value = value; //cerr<<"varid "<> inp; ti >> inp2; } // make the assignments // check for each valid value in previous request. if(num_assigns == old_num_assigns + 1){ int i; for(i = 0; i < old_num_assigns; i++){ if(assignments[i].varid != old_assignments[i].varid || assignments[i].value != old_assignments[i].value) break; } if(i == old_num_assigns) start_from_scratch = 0; else start_from_scratch = 1; } else start_from_scratch=1; if(start_from_scratch){ //remove old_num_assigns of iloextractable array constraints from the model //valid all values are valid values for(int i = 0; i < old_num_assigns; i++){ mdl.remove(iloextractablearray[i]); } for(int i = 0; i < varPtr.size(); i++) for(int j = 0; j < varDom[i];j++) var_isvalid[i][j] = 1; for(int i = 0; i < varPtr.size(); i++) is_assigned[i]=0; start_assign = 0; } else start_assign = old_num_assigns; for(int i = start_assign; i < num_assigns; i++){ iloextractablearray[i] = mdl.add(*varPtr[assignments[i].varid] == assignments[i].value); is_assigned[assignments[i].varid] = 1; } for(int i = 0; i < varPtr.size(); i++) for(int j = 0; j < varDom[i];j++) var_shownValidThisStep[i][j] = 0; for(int i = 0; i < varPtr.size(); i++){ if (is_assigned[i]) continue; for(int j = 0; j < varDom[i]; j++) { if (!var_isvalid[i][j]) continue; if (var_shownValidThisStep[i][j]) continue; // cout << "i=" << i << " j=" << j << endl; // cout.flush(); IloExtractable current = mdl.add(*varPtr[i] == j); solver.startNewSearch(); if( solver.next() ) for (int g = 0; g < varPtr.size(); g++) { var_shownValidThisStep[g][int(solver.getValue(*varPtr[g]))] = 1; } else var_isvalid[i][j] = 0; // cout << endl; solver.endSearch(); mdl.remove(current); } } itr_count++; cout<<"\rRequest No : "<