Added call to eliminate_phi_interferences. Enabled phi-destruction.
[libfirm] / ir / be / lpp_remote.c
1 /**
2  * Author:      Daniel Grund
3  * Date:                02.06.2005
4  * Copyright:   (c) Universitaet Karlsruhe
5  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
6  */
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <sys/types.h>
15 #include <sys/stat.h>
16
17 #include "lpp_remote.h"
18 #include "xmalloc.h"
19 #include "assert.h"
20 #include "mps.h"
21
22 /* CPLEX-account related stuff */
23 #define DELETE_FILES            /**< deletes all dumped files after use. Files on server are always deleted. */
24 #define SSH_USER_HOST   "kb61@sp-smp.rz.uni-karlsruhe.de"
25 #define SSH_PASSWD_FILE "/ben/daniel/.smppw"
26 #define EXPECT_FILENAME "runme" /* name of the expect-script */
27
28 static INLINE FILE *ffopen(const char *base, const char *ext, const char *mode) {
29         FILE *out;
30         char buf[1024];
31
32         snprintf(buf, sizeof(buf), "%s.%s", base, ext);
33         if (! (out = fopen(buf, mode))) {
34                 fprintf(stderr, "Cannot open file %s in mode %s\n", buf, mode);
35                 return NULL;
36         }
37         return out;
38 }
39
40 static void lpp_write_cmd(lpp_t *lpp) {
41         FILE *out = ffopen(lpp->name, "cmd", "wt");
42         fprintf(out, "set logfile %s.sol\n", lpp->name);
43         fprintf(out, "set mip strategy mipstart 1\n");
44         fprintf(out, "set mip emphasis 3\n"); /* moving best bound */
45         fprintf(out, "set mip strategy variableselect 3\n"); /* strong branching */
46         fprintf(out, "read %s.mps\n", lpp->name);
47         fprintf(out, "read %s.mst\n", lpp->name);
48         fprintf(out, "optimize\n");
49         fprintf(out, "display solution variables -\n");
50         fprintf(out, "quit\n");
51         fclose(out);
52 }
53
54 static void lpp_write_exp(lpp_t *lpp) {
55         FILE *pwfile, *out;
56         char passwd[128];
57
58         pwfile = fopen(SSH_PASSWD_FILE, "rt");
59         fgets(passwd, sizeof(passwd), pwfile);
60         fclose(pwfile);
61
62         out = ffopen(EXPECT_FILENAME, "exp", "wt");
63         fprintf(out, "#! /usr/bin/expect\n");
64         fprintf(out, "spawn scp %s.mps %s.mst %s.cmd %s:\n", lpp->name, lpp->name, lpp->name, SSH_USER_HOST); /* copy problem files */
65         fprintf(out, "expect \"word:\"\nsend \"%s\\n\"\ninteract\n", passwd);
66
67         fprintf(out, "spawn ssh %s \"./cplex90 < %s.cmd\"\n", SSH_USER_HOST, lpp->name); /* solve */
68         fprintf(out, "expect \"word:\"\nsend \"%s\\n\"\ninteract\n", passwd);
69
70         fprintf(out, "spawn scp %s:%s.sol .\n", SSH_USER_HOST, lpp->name); /*copy back solution */
71         fprintf(out, "expect \"word:\"\nsend \"%s\\n\"\ninteract\n", passwd);
72
73         fprintf(out, "spawn ssh %s ./dell\n", SSH_USER_HOST); /* clean files on server */
74         fprintf(out, "expect \"word:\"\nsend \"%s\\n\"\ninteract\n", passwd);
75         fclose(out);
76 }
77
78 static void lpp_read_solution(lpp_t *lpp) {
79         FILE *in;
80         double sol_time;
81         unsigned iter;
82         int vars_section = 0;
83         char var_name[128];
84         double var_value;
85
86         if (!(in = ffopen(lpp->name, "sol", "rt"))) {
87                 lpp->sol_state = unknown;
88                 return;
89         }
90         while (!feof(in)) {
91                 char buf[1024];
92                 fgets(buf, sizeof(buf), in);
93
94                 /* error and solution state */
95                 if (!strncmp(buf, "CPLEX Error", 11))
96                         lpp->error = xstrdup(buf);
97                 else if (!strncmp(buf, "Warning:", 8))
98                         lpp->error = xstrdup(buf);
99                 else if (!strncmp(buf, "Integer optimal solution:", 25))
100                         lpp->sol_state = optimal;
101                 else if (!strcmp(buf, "No integer feasible solution exists."))
102                         lpp->sol_state = infeasible;
103                 else if (!strcmp(buf, "Error termination, integer feasible:"))
104                         lpp->sol_state = feasible;
105                 /* stats */
106                 else if (sscanf(buf, "Solution time = %lg sec. Iterations = %u", &sol_time, &iter) == 2) {
107                         lpp->sol_time = sol_time;
108                         lpp->iterations = iter;
109                 }
110                 /* variable values */
111                 else if(!strcmp(buf, "Variable Name           Solution Value")) {
112                         int i;
113                         vars_section = 1;
114                         for(i=0; i<lpp->var_next; ++i) {
115                                 name_t *var = lpp->vars[i];
116                                 var->value = 0;
117                                 var->value_kind = value_solution;
118                         }
119                 }
120                 else if(!strncmp(buf, "All other var", 13))
121                         vars_section = 0;
122                 else if (vars_section) {
123                         if (sscanf(buf, "%s %lg", var_name, &var_value) == 2)
124                                 lpp->vars[lpp_get_var_idx(lpp, var_name)]->value = var_value;
125                         else
126                                 assert(0 && "There should be variables to read in!");
127                 }
128         }
129         fclose(in);
130         if (lpp->error) {
131                 printf("\n%s\n", lpp->error);
132                 assert(0);
133         }
134 }
135
136 #ifdef DELETE_FILES
137 static void lpp_delete_files(lpp_t *lpp) {
138         char buf[1024];
139         int end = snprintf(buf, sizeof(buf), "%s", lpp->name);
140
141         snprintf(buf+end, sizeof(buf)-end, ".mps");
142         remove(buf);
143         snprintf(buf+end, sizeof(buf)-end, ".mst");
144         remove(buf);
145         snprintf(buf+end, sizeof(buf)-end, ".cmd");
146         remove(buf);
147         snprintf(buf+end, sizeof(buf)-end, ".sol");
148         remove(buf);
149         remove(EXPECT_FILENAME ".exp");
150 }
151 #endif
152
153 void lpp_solve_remote(lpp_t *lpp) {
154         FILE *out;
155         out = ffopen(lpp->name, "mps", "wt");
156         mps_write_mps(lpp, s_mps_free, out);
157         fclose(out);
158
159         out = ffopen(lpp->name, "mst", "wt");
160         mps_write_mst(lpp, s_mps_free, out);
161         fclose(out);
162
163         lpp_write_cmd(lpp);
164         lpp_write_exp(lpp);
165
166         /* call the expect script */
167         chmod(EXPECT_FILENAME ".exp", 0700);
168         system(EXPECT_FILENAME ".exp");
169
170         lpp_read_solution(lpp);
171 #ifdef DELETE_FILES
172         lpp_delete_files(lpp);
173 #endif
174 }