00001 #include<scil/scil.h>
00002 #include<scil/core/monomial.h>
00003
00004 #include<iostream>
00005 #include<string>
00006
00007
00008 using std::cout;
00009 using std::endl;
00010 using std::ifstream;
00011 using std::cerr;
00012
00013
00014 #define INPATH ""
00015
00016
00017 using namespace SCIL;
00018
00019
00020 void readcoeff(char* infile, double**& matrix1, double**& matrix2, int& size) {
00021 std::string path(INPATH);
00022 path += infile;
00023 ifstream file(path.c_str());
00024 if(file.fail()) {
00025 cerr << "in path " << path << endl;
00026 cerr<<"is no "<< infile<< endl;
00027 exit(1);
00028 }
00029 char buf[1024];
00030 while(file.peek() != '#')
00031 file.getline(buf, 1024);
00032
00033 char c;
00034 file >> c;
00035 file >> size;
00036 matrix1 = new double*[size];
00037 for(int i=0; i<size; i++) {
00038 matrix1[i] = new double[size];
00039 for(int j=0; j<size; j++) {
00040 file >>matrix1[i][j];
00041 }
00042 }
00043 matrix2 = new double*[size];
00044 for(int i=0; i<size; i++) {
00045 matrix2[i] = new double[size];
00046 for(int j=0; j<size; j++) {
00047 file >>matrix2[i][j];
00048 }
00049 }
00050 }
00051
00052
00053 int main(int argc, char ** argv) {
00054 if(argc != 2) {
00055 cerr<< "wrong number of input parameters!"<< endl;
00056 return 1;
00057 }
00058
00059 double **matrix1=NULL;
00060 double **matrix2=NULL;
00061 int size;
00062
00063
00064 readcoeff(argv[1], matrix1, matrix2, size);
00065
00066
00067 ILP_Problem IP(Optsense_Min);
00068 var **variablen= new var*[size];
00069 for(int i=0; i<size; i++) {
00070 variablen[i] = new var[size];
00071 for(int j=0; j<size; j++) {
00072 variablen[i][j] = IP.add_binary_variable(0);
00073 }
00074 }
00075
00076
00077 for(int i=0; i<size; i++) {
00078 for(int j=0; j<size; j++) {
00079 for(int k=0; k<size; k++) {
00080 for(int l=0; l<size; l++) {
00081 if(((i!=k) && (j!=l)) || ((i==k) && (j==l))) {
00082 if( matrix1[i][k] != 0. && matrix2[j][l] != 0. )
00083 IP.add_polynomial(variablen[i][j]*variablen[k][l]*(matrix1[i][k]*matrix2[j][l]));
00084 }
00085 }
00086 }
00087 }
00088 }
00089
00090
00091
00092 row r;
00093 for(int i=0; i<size; i++) {
00094 r=0;
00095 for(int j=0; j<size; j++) {
00096 r+=variablen[i][j];
00097 }
00098 IP.add_basic_constraint(r==1,Static);
00099 }
00100 for(int i=0; i<size; i++) {
00101 r=0;
00102 for(int j=0; j<size; j++) {
00103 r+=variablen[j][i];
00104 }
00105 IP.add_basic_constraint(r==1,Static);
00106 };
00107 IP.set_qrType(SQK2_SQK3);
00108
00109 IP.optimize();
00110
00111
00112 for(int i=0; i<size; i++) {
00113 for(int j=0; j<size; j++) {
00114 cout<<IP.get_solution(variablen[i][j]);
00115 }
00116 cout << endl;
00117 };
00118
00119 for(int i=0; i<size; i++){
00120 delete[] variablen[i];
00121 delete[] matrix1[i];
00122 delete[] matrix2[i];
00123 }
00124 delete[] variablen;
00125 delete[] matrix1;
00126 delete[] matrix2;
00127 }
00128