1 /*===========================================================================*/
2 /* */
3 /* This file is part of the SYMPHONY Branch, Cut, and Price Library. */
4 /* */
5 /* SYMPHONY was jointly developed by Ted Ralphs (ted@lehigh.edu) and */
6 /* Laci Ladanyi (ladanyi@us.ibm.com). */
7 /* */
8 /* (c) Copyright 2000-2007 Ted Ralphs. All Rights Reserved. */
9 /* */
10 /* This software is licensed under the Eclipse Public License. Please see */
11 /* accompanying file for terms. */
12 /* */
13 /*===========================================================================*/
14 /*===========================================================================*/
15
16 #define CALL_FUNCTION(f) \
17 if ((termcode = f) < 0){ \
18 printf("Error detected: termcode = %i\n", termcode); \
19 printf("Exiting...\n\n"); \
20 exit(termcode); \
21 }
22
23 /*===========================================================================*\
24 This file contains the main() for the master process.
25
26 Note that, if you want to use the OSI SYMPHONY interface, you should set the
27 USE_OSI_INTERFACE flag and define the COINROOT path in the SYMPHONY
28 Makefile. Otherwise, the C callable library functions will be used by
29 default. See below for the usage.
30 \*===========================================================================*/
31
32 #if defined(USE_OSI_INTERFACE)
33
34 #include "OsiSymSolverInterface.hpp"
35
main(int argc,char ** argv)36 int main(int argc, char **argv)
37 {
38 OsiSymSolverInterface si;
39
40 /* Parse the command line */
41 si.parseCommandLine(argc, argv);
42
43 /* Read in the problem */
44 si.loadProblem();
45
46 /* Find a priori problem bounds */
47 si.findInitialBounds();
48
49 /* Solve the problem */
50 si.setSymParam("lp_executable_name", "spp_lp_cg");
51 si.branchAndBound();
52
53 return(0);
54 }
55
56 #else
57
58 #include "symphony.h"
59 #include "sym_master.h"
60 #include "spp.h"
61 #include <stdlib.h>
62
63 int spp_test(sym_environment *env);
64
main(int argc,char ** argv)65 int main(int argc, char **argv)
66 {
67 int termcode;
68 spp_problem *spp;
69
70 sym_environment *env = sym_open_environment();
71
72 sym_version();
73
74 CALL_FUNCTION( sym_parse_command_line(env, argc, argv) );
75
76 CALL_FUNCTION( sym_get_user_data(env, (void **)&spp) );
77
78 if(spp->par->test){
79
80 spp_test(env);
81
82 } else {
83
84
85 CALL_FUNCTION( sym_load_problem(env) );
86
87 CALL_FUNCTION( sym_find_initial_bounds(env) );
88
89 sym_set_str_param(env, "lp_executable_name", "spp_lp_cg");
90 sym_set_int_param(env, "generate_cgl_cuts", FALSE);
91
92 CALL_FUNCTION( sym_solve(env) );
93
94 }
95
96 CALL_FUNCTION( sym_close_environment(env) );
97
98 return(0);
99 }
100
101 /*===========================================================================*\
102 \*===========================================================================*/
103
104
spp_test(sym_environment * env)105 int spp_test(sym_environment *env)
106 {
107 int termcode, i, file_num = 1;
108 char input_files[1][MAX_FILE_NAME_LENGTH +1] = {"sample.spp"};
109
110 double sol[1] = {6314.00};
111
112 char *input_dir = (char*)malloc(CSIZE*(MAX_FILE_NAME_LENGTH+1));
113 char *infile = (char*)malloc(CSIZE*(MAX_FILE_NAME_LENGTH+1));
114 double *obj_val = (double *)calloc(DSIZE,file_num);
115 double tol = 1e-03;
116 spp_problem *spp;
117
118 CALL_FUNCTION( sym_get_user_data(env, (void **)&spp) );
119
120 if (strcmp(spp->par->test_dir, "") == 0){
121 strcpy(input_dir, ".");
122 } else{
123 strcpy(input_dir, spp->par->test_dir);
124 }
125
126 sym_set_int_param(env, "verbosity", -10);
127 spp->par->verbosity = -10;
128
129 for(i = 0; i<file_num; i++){
130
131 strcpy(infile, "");
132 sprintf(infile, "%s%s%s", input_dir, "/", input_files[i]);
133 strcpy(spp->par->infile, infile);
134
135 CALL_FUNCTION( sym_load_problem(env) );
136
137 printf("Solving %s...\n", input_files[i]);
138
139 CALL_FUNCTION( sym_solve(env) );
140
141 sym_get_obj_val(env, &obj_val[i]);
142
143 if((obj_val[i] < sol[i] + tol) &&
144 (obj_val[i] > sol[i] - tol)){
145 printf("Success!\n");
146 } else {
147 printf("Failure!(%f, %f) \n", obj_val[i], sol[i]);
148 }
149
150 if(env->mip->n && i + 1 < file_num){
151 free_master_u(env);
152 strcpy(env->par.infile, "");
153 env->mip = (MIPdesc *) calloc(1, sizeof(MIPdesc));
154 }
155 }
156
157 spp->par->test = FALSE;
158
159 FREE(input_dir);
160 FREE(infile);
161 FREE(obj_val);
162
163 return(0);
164
165 }
166
167 #endif
168
169