/* Reference : Tiihonen, J., Soininen, T., Niemela, I., Sulonen, R.: Empirical testing of a weight constraint rule based configurator. In ECAI 2002 Configuration Workshop. (2002) 17--22 http://www.soberit.hut.fi/pdmg/Empirical/index.html */ /////////////////////////////////////////////////////////////// // File: machine.cpp // Desc: ILOG instance for Machine Benchmark // Auth: Sathi // Date: Mon July 12 2004 ////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // File: machine.cpp // Desc: ILOG instance for Machine Benchmark from Finland // Auth: VeCoS, ITU // Date: Mon July 12 2004 ////////////////////////////////////////////////////////////// #include #include #include #include clock_t worst; ILOSTLBEGIN struct assignment_pair{ int varid; int value; }; int main(int argc, char** argv) { if (argc < 2) { cerr << "Usage: machine? \n "; exit(1); } IloEnv env; try { IloModel mdl(env); //////////////////////////////////////////////////////////// // Make aux. data structures for interactive configuration /////////////////////////////////////////////////////////// vector varDom; vector varPtr; //vari 5 IloIntVar vari(env, 0, 4); varPtr.push_back(&vari); varDom.push_back(5); mdl.add( (vari == 0) || (vari == 1) || (vari == 2) || (vari == 3) || (vari == 4) ); //toimitusmaa 22 IloIntVar toimitusmaa(env, 0, 21); varPtr.push_back(&toimitusmaa); varDom.push_back(22); mdl.add( (toimitusmaa == 0) || (toimitusmaa == 1) || (toimitusmaa == 2) || (toimitusmaa == 3) || (toimitusmaa == 4) || (toimitusmaa == 5) || (toimitusmaa == 6) || (toimitusmaa == 7) || (toimitusmaa == 8) || (toimitusmaa == 9) || (toimitusmaa == 10) || (toimitusmaa == 11) || (toimitusmaa == 12) || (toimitusmaa == 13) || (toimitusmaa == 14) || (toimitusmaa == 15) || (toimitusmaa == 16) || (toimitusmaa == 17) || (toimitusmaa == 18) || (toimitusmaa == 19) || (toimitusmaa == 20) || (toimitusmaa == 21) ); //nopeusluokka 2 IloIntVar nopeusluokka(env, 0, 1); varPtr.push_back(&nopeusluokka); varDom.push_back(2); mdl.add( (nopeusluokka == 0) || (nopeusluokka == 1) ); //voimanotto_kierrosnopeudet 2 IloIntVar voimanotto_kierrosnopeudet(env, 0, 1); varPtr.push_back(&voimanotto_kierrosnopeudet); varDom.push_back(2); mdl.add( (voimanotto_kierrosnopeudet == 0) || (voimanotto_kierrosnopeudet == 1) ); //etuakseli 2 IloIntVar etuakseli(env, 0, 1); varPtr.push_back(&etuakseli); varDom.push_back(2); mdl.add( (etuakseli == 0) || (etuakseli == 1) ); //etulokasuojat 2 IloIntVar etulokasuojat(env, 0, 1); varPtr.push_back(&etulokasuojat); varDom.push_back(2); mdl.add( (etulokasuojat == 0) || (etulokasuojat == 1) ); //takalokasuojat 3 IloIntVar takalokasuojat(env, 0, 2); varPtr.push_back(&takalokasuojat); varDom.push_back(3); mdl.add( (takalokasuojat == 0) || (takalokasuojat == 1) || (takalokasuojat == 2) ); //taka_akeslin_mutasuojat 2 IloIntVar taka_akeslin_mutasuojat(env, 0, 1); varPtr.push_back(&taka_akeslin_mutasuojat); varDom.push_back(2); mdl.add( (taka_akeslin_mutasuojat == 0) || (taka_akeslin_mutasuojat == 1) ); //kattovilkku_present 2 IloIntVar kattovilkku_present(env, 0, 1); varPtr.push_back(&kattovilkku_present); varDom.push_back(2); mdl.add( (kattovilkku_present == 0) || (kattovilkku_present == 1) ); //kattovilkku_nonesome 3 IloIntVar kattovilkku_nonesome(env, 0, 2); varPtr.push_back(&kattovilkku_nonesome); varDom.push_back(3); mdl.add( (kattovilkku_nonesome == 0) || (kattovilkku_nonesome == 1) || (kattovilkku_nonesome == 2) ); //etupainot_present 2 IloIntVar etupainot_present(env, 0, 1); varPtr.push_back(&etupainot_present); varDom.push_back(2); mdl.add( (etupainot_present == 0) || (etupainot_present == 1) ); //etupainot_nonesome 3 IloIntVar etupainot_nonesome(env, 0, 2); varPtr.push_back(&etupainot_nonesome); varDom.push_back(3); mdl.add( (etupainot_nonesome == 0) || (etupainot_nonesome == 1) || (etupainot_nonesome == 2) ); //lisaetupainot_present 2 IloIntVar lisaetupainot_present(env, 0, 1); varPtr.push_back(&lisaetupainot_present); varDom.push_back(2); mdl.add( (lisaetupainot_present == 0) || (lisaetupainot_present == 1) ); //lisaetupainot_nonesome 3 IloIntVar lisaetupainot_nonesome(env, 0, 2); varPtr.push_back(&lisaetupainot_nonesome); varDom.push_back(3); mdl.add( (lisaetupainot_nonesome == 0) || (lisaetupainot_nonesome == 1) || (lisaetupainot_nonesome == 2) ); //etunostolaite_present 2 IloIntVar etunostolaite_present(env, 0, 1); varPtr.push_back(&etunostolaite_present); varDom.push_back(2); mdl.add( (etunostolaite_present == 0) || (etunostolaite_present == 1) ); //etunostolaite_nonesome 3 IloIntVar etunostolaite_nonesome(env, 0, 2); varPtr.push_back(&etunostolaite_nonesome); varDom.push_back(3); mdl.add( (etunostolaite_nonesome == 0) || (etunostolaite_nonesome == 1) || (etunostolaite_nonesome == 2) ); //vetolaitteet 2 IloIntVar vetolaitteet(env, 0, 1); varPtr.push_back(&vetolaitteet); varDom.push_back(2); mdl.add( (vetolaitteet == 0) || (vetolaitteet == 1) ); //vetokoukku_perus_nonesome 6 IloIntVar vetokoukku_perus_nonesome(env, 0, 5); varPtr.push_back(&vetokoukku_perus_nonesome); varDom.push_back(6); mdl.add( (vetokoukku_perus_nonesome == 0) || (vetokoukku_perus_nonesome == 1) || (vetokoukku_perus_nonesome == 2) || (vetokoukku_perus_nonesome == 3) || (vetokoukku_perus_nonesome == 4) || (vetokoukku_perus_nonesome == 5) ); //vetokoukku_euro_nonesome 6 IloIntVar vetokoukku_euro_nonesome(env, 0, 5); varPtr.push_back(&vetokoukku_euro_nonesome); varDom.push_back(6); mdl.add( (vetokoukku_euro_nonesome == 0) || (vetokoukku_euro_nonesome == 1) || (vetokoukku_euro_nonesome == 2) || (vetokoukku_euro_nonesome == 3) || (vetokoukku_euro_nonesome == 4) || (vetokoukku_euro_nonesome == 5) ); //nopeuspoljin_taka 2 IloIntVar nopeuspoljin_taka(env, 0, 1); varPtr.push_back(&nopeuspoljin_taka); varDom.push_back(2); mdl.add( (nopeuspoljin_taka == 0) || (nopeuspoljin_taka == 1) ); //takahallimtalaittet 2 IloIntVar takahallimtalaittet(env, 0, 1); varPtr.push_back(&takahallimtalaittet); varDom.push_back(2); mdl.add( (takahallimtalaittet == 0) || (takahallimtalaittet == 1) ); //ohjaamo 2 IloIntVar ohjaamo(env, 0, 1); varPtr.push_back(&ohjaamo); varDom.push_back(2); mdl.add( (ohjaamo == 0) || (ohjaamo == 1) ); //vakioohjaamo_nonesome 3 IloIntVar vakioohjaamo_nonesome(env, 0, 2); varPtr.push_back(&vakioohjaamo_nonesome); varDom.push_back(3); mdl.add( (vakioohjaamo_nonesome == 0) || (vakioohjaamo_nonesome == 1) || (vakioohjaamo_nonesome == 2) ); //metsaohjaamo_nonesome 3 IloIntVar metsaohjaamo_nonesome(env, 0, 2); varPtr.push_back(&metsaohjaamo_nonesome); varDom.push_back(3); mdl.add( (metsaohjaamo_nonesome == 0) || (metsaohjaamo_nonesome == 1) || (metsaohjaamo_nonesome == 2) ); //sammutusvesisailio 2 IloIntVar sammutusvesisailio(env, 0, 1); varPtr.push_back(&sammutusvesisailio); varDom.push_back(2); mdl.add( (sammutusvesisailio == 0) || (sammutusvesisailio == 1) ); //rengaskoko 9 IloIntVar rengaskoko(env, 0, 8); varPtr.push_back(&rengaskoko); varDom.push_back(9); mdl.add( (rengaskoko == 0) || (rengaskoko == 1) || (rengaskoko == 2) || (rengaskoko == 3) || (rengaskoko == 4) || (rengaskoko == 5) || (rengaskoko == 6) || (rengaskoko == 7) || (rengaskoko == 8) ); // keep track of interaction int** var_isvalid = new int*[varPtr.size()]; int* is_assigned = new int[varPtr.size()]; for(int i=0;i< varPtr.size();i++) { var_isvalid[i] = new int[varDom[i]]; is_assigned[i] = 0; for(int j=0; j < varDom[i]; j++) var_isvalid[i][j] = 1; } int** var_shownValidThisStep = new int*[varPtr.size()]; for(int i=0;i< varPtr.size();i++) { var_shownValidThisStep[i] = new int[varDom[i]]; for(int j=0; j < varDom[i]; j++) var_shownValidThisStep[i][j] = 0; } assignment_pair* assignments = new assignment_pair[varPtr.size()]; assignment_pair* old_assignments = new assignment_pair[varPtr.size()]; int old_num_assigns = 0; int start_from_scratch = 1; ifstream ti(argv[1]); if (!ti) { cerr << argv[1] << " cannot be opened\n"; exit(1); } int num_assigns = 0; int varid; int value; int inp; int inp2; int itr_count=0; ti >> inp; ti >> inp2; int start_assign = 0; // mdl.add( ); //(kattovilkku_present = 0)->(kattovilkku_nonesome = 0); mdl.add((!(kattovilkku_present == 0)) || (kattovilkku_nonesome == 0)); //(kattovilkku_present <> 0)->(kattovilkku_nonesome <> 0); mdl.add((!( kattovilkku_present != 0 )) || ( kattovilkku_nonesome != 0 )); //(etupainot_present == 0) ->(etupainot_nonesome == 0); mdl.add((!( etupainot_present == 0)) || ( etupainot_nonesome == 0)); //(etupainot_present != 0) ->(etupainot_nonesome != 0); mdl.add((!(etupainot_present != 0 )) || ( etupainot_nonesome != 0)); //(lisaetupainot_present == 0) ->(lisaetupainot_nonesome == 0); mdl.add((!( lisaetupainot_present == 0)) || (lisaetupainot_nonesome == 0 )); //(lisaetupainot_present != 0) ->(lisaetupainot_nonesome != 0); mdl.add((!( lisaetupainot_present != 0)) || ( lisaetupainot_nonesome != 0)); //(etunostolaite_present == 0) ->(etunostolaite_nonesome == 0); mdl.add((!(etunostolaite_present == 0 )) || (etunostolaite_nonesome == 0 )); //(etunostolaite_present != 0) ->(etunostolaite_nonesome != 0); mdl.add((!( etunostolaite_present != 0)) || ( etunostolaite_nonesome != 0)); //(vetolaitteet == 0) -> ((vetokoukku_perus_nonesome != 0) and (vetokoukku_euro_nonesome == 0 )); mdl.add((!(vetolaitteet == 0 )) || ( (vetokoukku_perus_nonesome != 0) && (vetokoukku_euro_nonesome == 0 ))); //(vetolaitteet != 0) -> ((vetokoukku_perus_nonesome == 0) and (vetokoukku_euro_nonesome != 0 )); mdl.add((!( vetolaitteet != 0)) || ( (vetokoukku_perus_nonesome == 0) && (vetokoukku_euro_nonesome != 0 ))); //(ohjaamo == 0) -> ((vakioohjaamo_nonesome != 0)&& (metsaohjaamo_nonesome == 0)); mdl.add((!(ohjaamo == 0 )) || ((vakioohjaamo_nonesome != 0)&& (metsaohjaamo_nonesome == 0) )); //(ohjaamo != 0) -> ((vakioohjaamo_nonesome == 0)&& (metsaohjaamo_nonesome != 0)); mdl.add((!(ohjaamo != 0 )) || ( (vakioohjaamo_nonesome == 0)&& (metsaohjaamo_nonesome != 0))); //(takahallimtalaittet == 1)-> (nopeuspoljin_taka == 1); mdl.add((!( (takahallimtalaittet == 1))) || ( nopeuspoljin_taka == 1)); //(not ( (rengaskoko == 2) && (takalokasuojat == 0) )); mdl.add(!( (rengaskoko == 2) && (takalokasuojat == 0) ) ); //(not ( (rengaskoko == 3) && (takalokasuojat == 0) )); mdl.add(!( (rengaskoko == 3) && (takalokasuojat == 0) )); //(nopeusluokka == 1 )-> ( (toimitusmaa == 0 ) || (toimitusmaa == 5 ) || (toimitusmaa == 7 ) || (toimitusmaa == 13 ) || (toimitusmaa == 14 ) || (toimitusmaa == 19 ) ); mdl.add((!(nopeusluokka == 1 )) || ( (toimitusmaa == 0 ) || (toimitusmaa == 5 ) || (toimitusmaa == 7 ) || (toimitusmaa == 13 ) || (toimitusmaa == 14 ) || (toimitusmaa == 19 ) )); //(not ((etupainot_present == 1) && ( lisaetupainot_present == 1 ) && (etunostolaite_present == 1) )); mdl.add(!(((etupainot_present == 1) && ( lisaetupainot_present == 1 ) && (etunostolaite_present == 1) ))); //( metsaohjaamo_nonesome != 0) -> (nopeuspoljin_taka == 1); mdl.add((!( metsaohjaamo_nonesome != 0)) || (nopeuspoljin_taka == 1 )); //(not ((etupainot_present == 1) && ( sammutusvesisailio == 1))); mdl.add(!((etupainot_present == 1) && ( sammutusvesisailio == 1))); //////////////////////////////// // 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); // debug: I want to know what is assigned // cout << "Assigned: " << varName[assignments[i].varid] << " = " << assignments[i].value << endl; // cout.flush(); 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; // cout << " fi=" << g << " fj=" << int(solver.getValue(*varPtr[g])); } else var_isvalid[i][j] = 0; // cout << endl; solver.endSearch(); mdl.remove(current); } } // debug: print possible remaining values for each variable // cout << "\nRemaing values of variable domains\n"; // for (int i = 0; i < varPtr.size(); i++) // { // cout << varName[i] << "(" << i << ") "; // if (is_assigned[i]) // cout << " is assigned"; // else // for (int j = 0; j < varDom[i]; j++) // if (var_isvalid[i][j]) // cout << " " << j; // cout << endl; // } // cout << "\n\n"; // cout.flush(); itr_count++; old_num_assigns = num_assigns; num_assigns = 0; clock_t t2=clock(); if(itr_count==0) worst = (t2-t1); if(worst < (t2-t1)) worst = (t2-t1); } while (inp != -2); solver.out() << "End Simulation of " << itr_count << " Requests" << endl; solver.out()<<"Worst Time is "<<(worst/(double)CLOCKS_PER_SEC) << endl; } catch (IloException& ex) { cerr << "Error: " << ex << endl; } env.end(); return 0; }