4 * Copyright: (c) Universitaet Karlsruhe
5 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
14 #include <sys/types.h>
17 #include "lpp_remote.h"
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 */
28 static INLINE FILE *ffopen(const char *base, const char *ext, const char *mode) {
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);
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");
54 static void lpp_write_exp(lpp_t *lpp) {
58 pwfile = fopen(SSH_PASSWD_FILE, "rt");
59 fgets(passwd, sizeof(passwd), pwfile);
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);
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);
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);
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);
78 static void lpp_read_solution(lpp_t *lpp) {
86 if (!(in = ffopen(lpp->name, "sol", "rt"))) {
87 lpp->sol_state = unknown;
92 fgets(buf, sizeof(buf), in);
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;
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;
110 /* variable values */
111 else if(!strcmp(buf, "Variable Name Solution Value")) {
114 for(i=0; i<lpp->var_next; ++i) {
115 name_t *var = lpp->vars[i];
117 var->value_kind = value_solution;
120 else if(!strncmp(buf, "All other var", 13))
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;
126 assert(0 && "There should be variables to read in!");
131 printf("\n%s\n", lpp->error);
137 static void lpp_delete_files(lpp_t *lpp) {
139 int end = snprintf(buf, sizeof(buf), "%s", lpp->name);
141 snprintf(buf+end, sizeof(buf)-end, ".mps");
143 snprintf(buf+end, sizeof(buf)-end, ".mst");
145 snprintf(buf+end, sizeof(buf)-end, ".cmd");
147 snprintf(buf+end, sizeof(buf)-end, ".sol");
149 remove(EXPECT_FILENAME ".exp");
153 void lpp_solve_remote(lpp_t *lpp) {
155 out = ffopen(lpp->name, "mps", "wt");
156 mps_write_mps(lpp, s_mps_free, out);
159 out = ffopen(lpp->name, "mst", "wt");
160 mps_write_mst(lpp, s_mps_free, out);
166 /* call the expect script */
167 chmod(EXPECT_FILENAME ".exp", 0700);
168 system(EXPECT_FILENAME ".exp");
170 lpp_read_solution(lpp);
172 lpp_delete_files(lpp);