00001 #include<scil/scil.h>
00002 #include<scil/core/boolfunction.h>
00003 #include<iostream>
00004
00005 using namespace SCIL;
00006 using namespace std;
00007
00008 void read_instance(char* infile, ILP_Problem &IP, vector<var>& vars, list<boolfunction*>& bf_list) {
00009
00010 string path(infile);
00011 ifstream file(path.c_str());
00012 if(file.fail()) {
00013 cerr<<"no file with name "<< infile<<" found!"<< endl;
00014 exit(1);
00015 }
00016 char buf[1024];
00017 while(file.peek() != 'p')
00018 file.getline(buf, 1024);
00019
00020 char c;
00021 string type;
00022 int nv,nc, v, weight =1;
00023
00024 file>>c;
00025 file>>type;
00026 file>>nv;
00027 file>>nc;
00028 cout<<c<<" "<<type<<" "<<nv<<" "<<nc<<endl;
00029 vars.resize(nv+1);
00030 for(int i=1; i<=nv; i++){
00031 vars[i] = IP.add_binary_variable(0);
00032 }
00033 for(int j=0; j<nc; j++){
00034 if(type == "wcnf")
00035 file >> weight;
00036 boolfunction* bf = NULL;
00037 file >> v;
00038 while(v != 0){
00039 if(bf){
00040 if(v < 0)
00041 bf->add(OR, vars[-v], true);
00042 else
00043 bf->add(OR, vars[v]);
00044 } else {
00045 if(v < 0)
00046 bf = new boolfunction(vars[-v], true);
00047 else
00048 bf = new boolfunction(vars[v]);
00049 }
00050 file >> v;
00051 }
00052 cout<<weight<<" "<<j<<": "<<bf<<endl;
00053 bf_list.push_back(bf);
00054 IP.add_boolfunction(bf, weight);
00055 }
00056
00057 }
00058
00059 int main(int argc, char** argv) {
00060
00061 vector<var> vars;
00062 list<boolfunction*> bf_list;
00063 ILP_Problem IP(Optsense_Max);
00064
00065 read_instance(argv[1], IP,vars,bf_list);
00066
00067 IP.optimize();
00068
00069 solution s = IP.get_solution();
00070 cout<<"-----------Solution-----------"<<endl;
00071 for( int i = 1; i < vars.size(); i++)
00072 cout<<"x"<<i-1<<": "<<s.value(vars[i])<<endl;
00073 int num=0;
00074 for( list<boolfunction*>::iterator it = bf_list.begin(); it != bf_list.end(); it++)
00075 if (!((*it)->evaluate(s))){
00076 cout<<(*it)<<" value: "<<(*it)->evaluate(s)<<endl;
00077 num++;
00078 }
00079 cout<<"O = "<<num<<endl;
00080 }
00081