-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathinit.c
144 lines (118 loc) · 3.54 KB
/
init.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <gurobi_c.h>
#include <TH/TH.h>
#undef NDEBUG
#include <assert.h>
#include <string.h>
GRBenv* GT_loadenv(const char* logfilename, int outputFlag) {
GRBenv *env;
int error = GRBloadenv(&env, logfilename);
assert(!error);
int OutputFlag = 0;
error = GRBsetintparam(env, "OutputFlag", outputFlag);
assert(!error);
return env;
}
GRBmodel* GT_newmodel(GRBenv *env, const char *name, THDoubleTensor *obj,
THDoubleTensor *lb, THDoubleTensor *ub) {
GRBmodel *model;
int nVars = THDoubleTensor_size(obj, 0);
double *obj_ = THDoubleTensor_data(obj);
double *lb_ = THDoubleTensor_data(lb);
double *ub_ = 0;
if (ub) {
ub_ = THDoubleTensor_data(ub);
}
int error = GRBnewmodel(env, &model, name, nVars, obj_, lb_, ub_, 0, 0);
assert(!error);
return model;
}
void GT_setdblattrlist(GRBmodel *model, const char *name, int len, THIntTensor *ind,
THDoubleTensor *values) {
int *ind_ = THIntTensor_data(ind);
double *values_ = THDoubleTensor_data(values);
int error = GRBsetdblattrlist(model, name, len, ind_, values_);
assert(!error);
}
int GT_getintattr(GRBmodel *model, const char *name) {
int attr;
int error = GRBgetintattr(model, name, &attr);
assert(!error);
return attr;
}
void GT_addconstr(GRBmodel *model, int nnz, THIntTensor *cind, THDoubleTensor *cval,
const char *sense, double rhs) {
int* cind_ = THIntTensor_data(cind);
double* cval_ = THDoubleTensor_data(cval);
char sense_;
if (!strcmp(sense, "LE")) {
sense_ = GRB_LESS_EQUAL;
} else if (!strcmp(sense, "EQ")) {
sense_ = GRB_EQUAL;
} else if (!strcmp(sense, "GE")) {
sense_ = GRB_GREATER_EQUAL;
} else {
printf("WARNING: sense incorrectly set\n");
assert(0);
}
int error = GRBaddconstr(model, nnz, cind_, cval_, sense_, rhs, 0);
assert(!error);
}
void GT_addqpterms(GRBmodel *model, int numqnz, THIntTensor *qrow, THIntTensor *qcol,
THDoubleTensor *qval) {
int *qrow_ = THIntTensor_data(qrow);
int *qcol_ = THIntTensor_data(qcol);
double *qval_ = THDoubleTensor_data(qval);
int error = GRBaddqpterms(model, numqnz, qrow_, qcol_, qval_);
assert(!error);
}
void GT_delq(GRBmodel *model) {
int error = GRBdelq(model);
assert(!error);
}
int GT_solve(THDoubleTensor *rx, GRBmodel *model) {
int error = GRBoptimize(model);
assert(!error);
int status = GT_getintattr(model, "Status");
int nVars = THDoubleTensor_size(rx, 0);
if(status==2){
int *idx = (int*) malloc(nVars * sizeof(int));
for (int i = 0; i < nVars; i++) {
idx[i] = i;
}
double *rx_ = THDoubleTensor_data(rx);
error = GRBgetdblattrlist(model, "X", nVars, idx, rx_);
assert(!error);
free(idx);
}
return status;
}
void GT_solvePar(THDoubleTensor *rx, THIntTensor *status, GRBmodel **models,
int nVars, int nModels) {
int *idx = (int*) malloc(nVars * sizeof(int));
for (int i = 0; i < nVars; i++) {
idx[i] = i;
}
double *rx_ = THDoubleTensor_data(rx);
int *status_ = THIntTensor_data(status);
#pragma omp parallel for default(shared)
for (int i = 0; i < nModels; i++) {
GRBmodel* model = models[i];
int error = GRBoptimize(model);
assert(!error);
int status = GT_getintattr(model, "Status");
status_[i] = status;
error = GRBgetdblattrlist(model, "X", nVars, idx, rx_ + i*nVars);
/* assert(!error); */
}
free(idx);
}
void GT_free(GRBenv *env, GRBmodel *model) {
int error;
if (model) {
error = GRBfreemodel(model);
assert(!error);
}
if (env) {
GRBfreeenv(env);
}
}