-static void pi_dump_lp(problem_instance_t *pi) {
- int i, max_abs_Qij;
- matrix_elem_t *e;
- FILE *out = ffopen(pi->name, "lpo", "wt");
-
- DBG((dbg, LEVEL_1, "Dumping lp_org...\n"));
- /* calc the big M for Q */
- max_abs_Qij = pi->maxQij;
- if (-pi->minQij > max_abs_Qij)
- max_abs_Qij = -pi->minQij;
- pi->bigM = pi->A_dim * max_abs_Qij;
- DBG((dbg, LEVEL_2, "BigM = %d\n", pi->bigM));
-
- /* generate objective function */
- fprintf(out, "min: ");
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, "+s%d_%d -%dx%d_%d ", pi->x[i].n, pi->x[i].c, pi->bigM, pi->x[i].n, pi->x[i].c);
- fprintf(out, ";\n\n");
-
- /* constraints for former objective function */
- for (i=0; i<pi->x_dim; ++i) {
- matrix_foreach_in_row(pi->Q, i, e) {
- int Qio = e->val;
- if (Qio == 1)
- fprintf(out, "+x%d_%d ", pi->x[e->col].n, pi->x[e->col].c);
- else if(Qio == -1)
- fprintf(out, "-x%d_%d ", pi->x[e->col].n, pi->x[e->col].c);
- else
- fprintf(out, "%+dx%d_%d ", Qio, pi->x[e->col].n, pi->x[e->col].c);
- }
- fprintf(out, "-y%d_%d -s%d_%d +%d= 0;\n", pi->x[i].n, pi->x[i].c, pi->x[i].n, pi->x[i].c, pi->bigM);
- }
- fprintf(out, "\n\n");
-
- /* constraints for (special) complementary condition */
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, "y%d_%d <= %d - %dx%d_%d;\n", pi->x[i].n, pi->x[i].c, 2*pi->bigM, 2*pi->bigM, pi->x[i].n, pi->x[i].c);
- fprintf(out, "\n\n");
-
- /* knapsack constraints */
- for (i=0; i<pi->A_dim; ++i) {
- matrix_foreach_in_row(pi->Q, i, e)
- fprintf(out, "+x%d_%d ", pi->x[e->col].n, pi->x[e->col].c);
- fprintf(out, " = 1;\n");
- }
- fprintf(out, "\n\n");
-
- /* interference graph constraints */
- for (i=0; i<pi->B_dim; ++i) {
- matrix_foreach_in_row(pi->Q, i, e)
- fprintf(out, "+x%d_%d ", pi->x[e->col].n, pi->x[e->col].c);
- fprintf(out, " <= 1;\n");
- }
- fprintf(out, "\n\n");
-
- /* integer constraints */
- fprintf(out, "int x%d_%d", pi->x[0].n, pi->x[0].c);
- for (i=1; i<pi->x_dim; ++i)
- fprintf(out, ", x%d_%d", pi->x[i].n, pi->x[i].c);
- fprintf(out, ";\n");
-
- fclose(out);
-}
-#endif
-
-#ifdef DUMP_MPS
-/**
- * Dumps an mps file representing the problem. This is NOT the old-style,
- * fixed-column format. Some white spaces are important, in general spaces
- * are separators, MARKER-lines are used in COLUMN section to define binaries.
- */
-//BETTER use last 2 fields in COLUMNS section
-static void pi_dump_mps(problem_instance_t *pi) {
- int i, max_abs_Qij;
- matrix_elem_t *e;
- FILE *out = ffopen(pi->name, "mps", "wt");
-
- DBG((dbg, LEVEL_1, "Dumping mps...\n"));
- max_abs_Qij = pi->maxQij;
- if (-pi->minQij > max_abs_Qij)
- max_abs_Qij = -pi->minQij;
- pi->bigM = pi->A_dim * max_abs_Qij;
- DBG((dbg, LEVEL_2, "BigM = %d\n", pi->bigM));
-
- fprintf(out, "NAME %s\n", pi->name);
-
- fprintf(out, "ROWS\n");
- fprintf(out, " N obj\n");
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, " E cQ%d\n", i);
- for (i=0; i<pi->A_dim; ++i)
- fprintf(out, " E cA%d\n", i);
- for (i=0; i<pi->B_dim; ++i)
- fprintf(out, " L cB%d\n", i);
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, " L cy%d\n", i);
-
- fprintf(out, "COLUMNS\n");
- /* the x vars come first */
- /* mark them as binaries */
- fprintf(out, " MARKI0\t'MARKER'\t'INTORG'\n");
-#ifdef USE_SOS
- int sos_cnt = 0;
- fprintf(out, " S1 SOS_%d\t'MARKER'\t'SOSORG'\n", sos_cnt++);
-#endif
- for (i=0; i<pi->x_dim; ++i) {
-#ifdef USE_SOS
- if (i>0 && pi->x[i].n != pi->x[i-1].n) {
- fprintf(out, " SOS_%d\t'MARKER'\t'SOSEND'\n", sos_cnt++);
- fprintf(out, " S1 SOS_%d\t'MARKER'\t'SOSORG'\n", sos_cnt++);
- }
-#endif
- /* participation in objective */
- fprintf(out, " x%d_%d\tobj\t%d\n", pi->x[i].n, pi->x[i].c, -pi->bigM);
- /* in Q */
- matrix_foreach_in_col(pi->Q, i, e)
- fprintf(out, " x%d_%d\tcQ%d\t%d\n", pi->x[i].n, pi->x[i].c, e->row, e->val);
- /* in A */
- matrix_foreach_in_col(pi->A, i, e)
- fprintf(out, " x%d_%d\tcA%d\t%d\n", pi->x[i].n, pi->x[i].c, e->row, e->val);
- /* in B */
- matrix_foreach_in_col(pi->B, i, e)
- fprintf(out, " x%d_%d\tcB%d\t%d\n", pi->x[i].n, pi->x[i].c, e->row, e->val);
- /* in y */
- fprintf(out, " x%d_%d\tcy%d\t%d\n", pi->x[i].n, pi->x[i].c, i, 2*pi->bigM);
- }
-
-#ifdef USE_SOS
- fprintf(out, " SOS_%d\t'MARKER'\t'SOSEND'\n", sos_cnt++);
-#endif
- fprintf(out, " MARKI1\t'MARKER'\t'INTEND'\n"); /* end of marking */
-
- /* next the s vars */
- for (i=0; i<pi->x_dim; ++i) {
- /* participation in objective */
- fprintf(out, " s%d_%d\tobj\t%d\n", pi->x[i].n, pi->x[i].c, 1);
- /* in Q */
- fprintf(out, " s%d_%d\tcQ%d\t%d\n", pi->x[i].n, pi->x[i].c, i, -1);
- }
-
- /* next the y vars */
- for (i=0; i<pi->x_dim; ++i) {
- /* in Q */
- fprintf(out, " y%d_%d\tcQ%d\t%d\n", pi->x[i].n, pi->x[i].c, i, -1);
- /* in y */
- fprintf(out, " y%d_%d\tcy%d\t%d\n", pi->x[i].n, pi->x[i].c, i, 1);
- }
-
- fprintf(out, "RHS\n");
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, " rhs\tcQ%d\t%d\n", i, -pi->bigM);
- for (i=0; i<pi->A_dim; ++i)
- fprintf(out, " rhs\tcA%d\t%d\n", i, 1);
- for (i=0; i<pi->B_dim; ++i)
- fprintf(out, " rhs\tcB%d\t%d\n", i, 1);
- for (i=0; i<pi->x_dim; ++i)
- fprintf(out, " rhs\tcy%d\t%d\n", i, 2*pi->bigM);
-
- fprintf(out, "ENDATA\n");
- fclose(out);
-
- out = ffopen(pi->name, "mst", "wt");
- fprintf(out, "NAME\n");
- for (i=0; i<pi->x_dim; ++i) {
- int val, n, c;
- n = pi->x[i].n;
- c = pi->x[i].c;
- if (get_irn_color(get_irn_for_graph_nr(pi->irg, n)) == c)
- val = 1;
- else
- val = 0;
- fprintf(out, " x%d_%d\t%d\n", n, c, val);
- }
- fprintf(out, "ENDATA\n");
- fclose(out);
-}
-#endif
-
-#ifdef DO_SOLVE
-/**
- * Invoke an external solver
- */
-static void pi_solve_ilp(problem_instance_t *pi) {
- FILE *out;
-
- /* write command file for CPLEX */
- out = ffopen(pi->name, "cmd", "wt");
- fprintf(out, "read %s.mps\n", pi->name);
- fprintf(out, "read %s.mst\n", pi->name);
- fprintf(out, "set mip strategy mipstart 1\n");
- fprintf(out, "optimize\n");
- fprintf(out, "set logfile %s.sol\n", pi->name);
- fprintf(out, "display solution variables 1-%d\n", pi->x_dim);
- fprintf(out, "set logfile cplex.log\n");
- fprintf(out, "quit\n");
- fclose(out);
-
- /* write expect-file for copying problem to RZ */
- out = ffopen(EXPECT_FILENAME, "exp", "wt");
- fprintf(out, "#! /usr/bin/expect\n");
- fprintf(out, "spawn scp %s.mps %s.mst %s.cmd %s:\n", pi->name, pi->name, pi->name, SSH_USER_HOST_PATH);
- fprintf(out, "expect \":\"\n");
- fprintf(out, "send \"%s\\n\"\n", SSH_PASSWD);
- fprintf(out, "interact\n");
-
- fprintf(out, "spawn ssh %s \"./cplex90 < %s.cmd\"\n", SSH_USER_HOST_PATH, pi->name);
- fprintf(out, "expect \":\"\n");
- fprintf(out, "send \"%s\\n\"\n", SSH_PASSWD);
- fprintf(out, "interact\n");
-
- fprintf(out, "spawn scp %s:%s.sol .\n", SSH_USER_HOST_PATH, pi->name);
- fprintf(out, "expect \":\"\n");
- fprintf(out, "send \"%s\\n\"\n", SSH_PASSWD);
- fprintf(out, "interact\n");
- fclose(out);
-
- /* call the expect script */
- chmod(EXPECT_FILENAME ".exp", 0700);
- system(EXPECT_FILENAME ".exp");