genmodel 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/Genmodel/GenModel.h +152 -0
- data/ext/Genmodel/GenModelBase.cpp +389 -0
- data/ext/Genmodel/GenModelCplex.cpp +814 -0
- data/ext/Genmodel/GenModelCplex.h +85 -0
- data/ext/Genmodel/GenModelOsi.cpp +892 -0
- data/ext/Genmodel/GenModelOsi.h +96 -0
- data/ext/Genmodel/GenModelOsiInterface.cpp +143 -0
- data/ext/Genmodel/GenModelOsiInterface.h +43 -0
- data/ext/Genmodel/Genmodel.cpp +10789 -0
- data/ext/Genmodel/InterfaceObject.cpp +68 -0
- data/ext/Genmodel/InterfaceObject.h +28 -0
- data/ext/Genmodel/ProblemReaderOsi.cpp +78 -0
- data/ext/Genmodel/ProblemReaderOsi.h +31 -0
- data/ext/Genmodel/extconf.rb +162 -0
- data/lib/Genmodel.rb +5 -0
- metadata +25 -13
- data/lib/genmodel.bundle +0 -0
- data/lib/genmodel.so +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4a5b782c3e49021afb07148276d397dc7cbaddad
|
4
|
+
data.tar.gz: d8597cd4ebe87868300ce4f1e1aea2846b1da264
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dd11d4bea0872a33f033489a3a25e05a76de22c3f34c6fc6e46dbd62b75cf722aed32151f7d2921738db2ad5ef07b668e76c8e5389d26a2b147706d6b88ffbaf
|
7
|
+
data.tar.gz: d6ead489e9333271f162a7fae9a9cb09e5b493dd07893f105312e692284886266615582af1cf587e4b219dada6804f86afa7041877fe40f4f21d5f087b140ea8
|
@@ -0,0 +1,152 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
* GenModel.h
|
3
|
+
* A generic model creation interface for different solver
|
4
|
+
*
|
5
|
+
* October 5 11:32 2009
|
6
|
+
* Copyright 2007 Mathieu Bouchard
|
7
|
+
* mathbouchard@gmail.com
|
8
|
+
****************************************************************************/
|
9
|
+
|
10
|
+
#ifndef GenModel_H
|
11
|
+
#define GenModel_H
|
12
|
+
|
13
|
+
#if defined WIN64 || defined WIN32
|
14
|
+
#ifndef snprintf
|
15
|
+
#define snprintf sprintf_s
|
16
|
+
#endif
|
17
|
+
#endif
|
18
|
+
|
19
|
+
#include <stdio.h>
|
20
|
+
#include <stdlib.h>
|
21
|
+
#include <string>
|
22
|
+
#include <vector>
|
23
|
+
#include <list>
|
24
|
+
#include <map>
|
25
|
+
#include <time.h>
|
26
|
+
//#include <sys/time.h>
|
27
|
+
#include <stdarg.h>
|
28
|
+
#include <float.h>
|
29
|
+
#include <limits>
|
30
|
+
|
31
|
+
using namespace std;
|
32
|
+
|
33
|
+
union genmodel_param {
|
34
|
+
long longval;
|
35
|
+
double dblval;
|
36
|
+
const char* strval;
|
37
|
+
};
|
38
|
+
|
39
|
+
genmodel_param dbl2param(double val);
|
40
|
+
genmodel_param long2param(long val);
|
41
|
+
genmodel_param str2param(string val);
|
42
|
+
|
43
|
+
class ModVars
|
44
|
+
{
|
45
|
+
public:
|
46
|
+
ModVars() {n=0; defub=DBL_MAX; deflb=-DBL_MAX;}
|
47
|
+
long AddVar(string nn, double o, double l, double u, char t);
|
48
|
+
long AddVars(string nn, long size, double o, double l, double u, char t);
|
49
|
+
long SetQpCoef(long i, long j, double val);
|
50
|
+
long Print();
|
51
|
+
vector<string> name;
|
52
|
+
vector<double> obj;
|
53
|
+
vector<char> type;
|
54
|
+
map<string, long> offset;
|
55
|
+
vector<double> ub;
|
56
|
+
vector<double> lb;
|
57
|
+
vector<double> sol;
|
58
|
+
vector<double> rc;
|
59
|
+
vector<double> qobj;
|
60
|
+
vector<long> qi;
|
61
|
+
vector<long> qj;
|
62
|
+
double defub;
|
63
|
+
double deflb;
|
64
|
+
|
65
|
+
unsigned long n;
|
66
|
+
};
|
67
|
+
|
68
|
+
class ModConsts
|
69
|
+
{
|
70
|
+
public:
|
71
|
+
ModConsts() {nz=0; lrhs=0.0; sense = 'E'; urhs=0.0;}
|
72
|
+
long AddNz(long c, double v);
|
73
|
+
string name;
|
74
|
+
vector<long> cols;
|
75
|
+
vector<double> coefs;
|
76
|
+
double dual;
|
77
|
+
double slack;
|
78
|
+
double lrhs;
|
79
|
+
char sense;
|
80
|
+
double urhs;
|
81
|
+
long id;
|
82
|
+
unsigned long nz;
|
83
|
+
};
|
84
|
+
|
85
|
+
class GenModel
|
86
|
+
{
|
87
|
+
public:
|
88
|
+
GenModel();
|
89
|
+
virtual ~GenModel() { ClearStructure(); };
|
90
|
+
long AddIndexToCoef(string coef, string index);
|
91
|
+
long AddCoef(string coef);
|
92
|
+
long CoefIndex(string coef, int nargs, ...);
|
93
|
+
long AddConst(string cname);
|
94
|
+
long AddConst(string cname, double rhs, char sense);
|
95
|
+
long AddVar(string nn, double o, double l, double u, char t);
|
96
|
+
long AddVars(string nn, long size, double o, double l, double u, char t);
|
97
|
+
long AddModelCol(vector<int>& ind, vector<double>& val, double obj, double lb, double ub, string name, char type = 'C');
|
98
|
+
long AddModelRow(vector<int>& ind, vector<double>& val, double rhs, char sense, string name);
|
99
|
+
long SetQpCoef(long i, long j, double val);
|
100
|
+
long AddNz(long row, long col, double val);
|
101
|
+
long AddNzToLast(long col, double val);
|
102
|
+
long SetNumbers();
|
103
|
+
long ClearStructure();
|
104
|
+
long PrintSol();
|
105
|
+
long PrintModel();
|
106
|
+
long PrintSol(string v);
|
107
|
+
long PrintSolNz();
|
108
|
+
long PrintSolNz(string v);
|
109
|
+
long PrintObjVal();
|
110
|
+
long SetLongParam(string param, long val);
|
111
|
+
long SetDblParam(string param, double val);
|
112
|
+
long SetBoolParam(string param, bool val);
|
113
|
+
long SetStrParam(string param, string val);
|
114
|
+
long ThrowError(string error);
|
115
|
+
virtual long Init(string name) = 0;
|
116
|
+
virtual long CreateModel() = 0;
|
117
|
+
virtual long Solve() = 0;
|
118
|
+
virtual long SetSol() = 0;
|
119
|
+
virtual long ChangeBulkBounds(int count, int * ind, char * type, double * vals);
|
120
|
+
virtual long WriteProblemToLpFile(string filename);
|
121
|
+
virtual long WriteSolutionToFile(string filename);
|
122
|
+
virtual long ChangeBulkObjectives(int count, int * ind, double * vals);
|
123
|
+
virtual long DeleteMipStarts();
|
124
|
+
virtual double GetMIPRelativeGap();
|
125
|
+
virtual double FindConstraintMaxLhs(long row);
|
126
|
+
virtual double FindConstraintMinLhs(long row);
|
127
|
+
virtual long MakeConstraintFeasible(long row);
|
128
|
+
bool binit;
|
129
|
+
bool bcreated;
|
130
|
+
string name;
|
131
|
+
|
132
|
+
vector<ModConsts> consts;
|
133
|
+
map<string,long> ci;
|
134
|
+
unsigned long nc;
|
135
|
+
unsigned long nr;
|
136
|
+
unsigned long nz;
|
137
|
+
ModVars vars;
|
138
|
+
string version;
|
139
|
+
|
140
|
+
double objval;
|
141
|
+
int solstat;
|
142
|
+
bool feasible;
|
143
|
+
bool dualfeasible;
|
144
|
+
bool hassolution;
|
145
|
+
void* solverdata;
|
146
|
+
map<string, long> longParam;
|
147
|
+
map<string, double> dblParam;
|
148
|
+
map<string, bool> boolParam;
|
149
|
+
map<string, string> strParam;
|
150
|
+
};
|
151
|
+
|
152
|
+
#endif // GenModel_H
|
@@ -0,0 +1,389 @@
|
|
1
|
+
#include "GenModel.h"
|
2
|
+
//#include "SqlCaller.h"
|
3
|
+
#include <math.h>
|
4
|
+
#include <time.h>
|
5
|
+
|
6
|
+
GenModel::GenModel()
|
7
|
+
{
|
8
|
+
version = "genmodel-0.0.21 build 0001";
|
9
|
+
hassolution = false;
|
10
|
+
bcreated = false;
|
11
|
+
binit = false;
|
12
|
+
nc=0;
|
13
|
+
nr=0;
|
14
|
+
solverdata = NULL;
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
double GenModel::FindConstraintMaxLhs(long row)
|
19
|
+
{
|
20
|
+
double total = 0.0;
|
21
|
+
for(int i = 0; i < int(consts[row].cols.size()); i++)
|
22
|
+
total += (consts[row].coefs[i] >= 0 ? vars.ub[consts[row].cols[i]] : vars.lb[consts[row].cols[i]])*consts[row].coefs[i];
|
23
|
+
return total;
|
24
|
+
}
|
25
|
+
|
26
|
+
double GenModel::FindConstraintMinLhs(long row)
|
27
|
+
{
|
28
|
+
double total = 0.0;
|
29
|
+
for(int i = 0; i < int(consts[row].cols.size()); i++)
|
30
|
+
total += (consts[row].coefs[i] >= 0 ? vars.lb[consts[row].cols[i]] : vars.ub[consts[row].cols[i]])*consts[row].coefs[i];
|
31
|
+
return total;
|
32
|
+
}
|
33
|
+
|
34
|
+
long GenModel::MakeConstraintFeasible(long row)
|
35
|
+
{
|
36
|
+
if(consts[row].sense == 'L')
|
37
|
+
{
|
38
|
+
double min = FindConstraintMinLhs(row);
|
39
|
+
if(min > consts[row].lrhs)
|
40
|
+
consts[row].lrhs = min;
|
41
|
+
}
|
42
|
+
else if(consts[row].sense == 'G')
|
43
|
+
{
|
44
|
+
double max = FindConstraintMaxLhs(row);
|
45
|
+
if(max < consts[row].lrhs)
|
46
|
+
consts[row].lrhs = max;
|
47
|
+
}
|
48
|
+
else if(consts[row].sense == 'R')
|
49
|
+
{
|
50
|
+
double min = FindConstraintMinLhs(row);
|
51
|
+
double max = FindConstraintMaxLhs(row);
|
52
|
+
if(max < consts[row].lrhs)
|
53
|
+
consts[row].lrhs = max;
|
54
|
+
else if(min > consts[row].urhs)
|
55
|
+
consts[row].urhs = min;
|
56
|
+
}
|
57
|
+
|
58
|
+
return 0;
|
59
|
+
}
|
60
|
+
|
61
|
+
long GenModel::SetLongParam(string param, long val)
|
62
|
+
{
|
63
|
+
longParam[param] = val;
|
64
|
+
return 0;
|
65
|
+
}
|
66
|
+
|
67
|
+
long GenModel::SetDblParam(string param, double val)
|
68
|
+
{
|
69
|
+
dblParam[param] = val;
|
70
|
+
return 0;
|
71
|
+
}
|
72
|
+
|
73
|
+
long GenModel::SetBoolParam(string param, bool val)
|
74
|
+
{
|
75
|
+
boolParam[param] = val;
|
76
|
+
return 0;
|
77
|
+
}
|
78
|
+
|
79
|
+
long GenModel::SetStrParam(string param, string val)
|
80
|
+
{
|
81
|
+
strParam[param] = val;
|
82
|
+
return 0;
|
83
|
+
}
|
84
|
+
|
85
|
+
long GenModel::ThrowError(string error)
|
86
|
+
{
|
87
|
+
printf("%s\n", error.c_str());
|
88
|
+
throw error;
|
89
|
+
}
|
90
|
+
|
91
|
+
long GenModel::PrintObjVal()
|
92
|
+
{
|
93
|
+
printf("obj : %f\n", objval);
|
94
|
+
|
95
|
+
return 0;
|
96
|
+
}
|
97
|
+
|
98
|
+
long GenModel::PrintSol()
|
99
|
+
{
|
100
|
+
//printf("obj : %f\n", objval);
|
101
|
+
for(long i = 0; i < long(vars.n); i++)
|
102
|
+
{
|
103
|
+
printf("%s : %f\n", vars.name[i].c_str(), vars.sol[i]);
|
104
|
+
}
|
105
|
+
return 0;
|
106
|
+
}
|
107
|
+
|
108
|
+
long GenModel::PrintModel()
|
109
|
+
{
|
110
|
+
return 0;
|
111
|
+
}
|
112
|
+
|
113
|
+
long GenModel::PrintSol(string v)
|
114
|
+
{
|
115
|
+
//printf("obj : %f\n", objval);
|
116
|
+
if(vars.offset.count(v) == 0)
|
117
|
+
return 0;
|
118
|
+
map<string, long>::iterator it = vars.offset.find(v);
|
119
|
+
long deb = it->second;
|
120
|
+
long fin = vars.n;
|
121
|
+
for(it = vars.offset.begin(); it != vars.offset.end(); it++)
|
122
|
+
{
|
123
|
+
if(it->second > deb && it->second < fin)
|
124
|
+
fin = it->second;
|
125
|
+
}
|
126
|
+
for(long i = deb; i < fin; i++)
|
127
|
+
{
|
128
|
+
printf("%s : %f\n", vars.name[i].c_str(), vars.sol[i]);
|
129
|
+
}
|
130
|
+
return 0;
|
131
|
+
}
|
132
|
+
|
133
|
+
long GenModel::PrintSolNz()
|
134
|
+
{
|
135
|
+
//printf("obj : %f\n", objval);
|
136
|
+
for(long i = 0; i < long(vars.n); i++)
|
137
|
+
{
|
138
|
+
if(fabs(vars.sol[i]) > 0.000001)
|
139
|
+
printf("%s : %f\n", vars.name[i].c_str(), vars.sol[i]);
|
140
|
+
}
|
141
|
+
return 0;
|
142
|
+
}
|
143
|
+
|
144
|
+
long GenModel::PrintSolNz(string v)
|
145
|
+
{
|
146
|
+
//printf("obj : %f\n", objval);
|
147
|
+
if(vars.offset.count(v) == 0)
|
148
|
+
return 0;
|
149
|
+
map<string, long>::iterator it = vars.offset.find(v);
|
150
|
+
long deb = it->second;
|
151
|
+
long fin = vars.n;
|
152
|
+
for(it = vars.offset.begin(); it != vars.offset.end(); it++)
|
153
|
+
{
|
154
|
+
if(it->second > deb && it->second < fin)
|
155
|
+
fin = it->second;
|
156
|
+
}
|
157
|
+
for(long i = deb; i < fin; i++)
|
158
|
+
{
|
159
|
+
if(fabs(vars.sol[i]) > 0.000001)
|
160
|
+
printf("%s : %f\n", vars.name[i].c_str(), vars.sol[i]);
|
161
|
+
}
|
162
|
+
return 0;
|
163
|
+
}
|
164
|
+
|
165
|
+
long ModConsts::AddNz(long c, double v)
|
166
|
+
{
|
167
|
+
cols.push_back(c);
|
168
|
+
coefs.push_back(v);
|
169
|
+
nz++;
|
170
|
+
return 0;
|
171
|
+
}
|
172
|
+
|
173
|
+
long GenModel::AddConst(string cname)
|
174
|
+
{
|
175
|
+
ci[cname] = nc;
|
176
|
+
consts.push_back(ModConsts());
|
177
|
+
consts.back().name = cname;
|
178
|
+
nc++;
|
179
|
+
return 0;
|
180
|
+
}
|
181
|
+
|
182
|
+
long GenModel::AddConst(string cname, double rhs, char sense)
|
183
|
+
{
|
184
|
+
AddConst(cname);
|
185
|
+
consts.back().lrhs = rhs;
|
186
|
+
consts.back().sense = sense;
|
187
|
+
return 0;
|
188
|
+
}
|
189
|
+
|
190
|
+
long GenModel::AddNz(long row, long col, double val)
|
191
|
+
{
|
192
|
+
consts[row].AddNz(col, val);
|
193
|
+
|
194
|
+
return 0;
|
195
|
+
}
|
196
|
+
long GenModel::AddNzToLast(long col, double val)
|
197
|
+
{
|
198
|
+
consts.back().AddNz(col, val);
|
199
|
+
return 0;
|
200
|
+
}
|
201
|
+
|
202
|
+
long GenModel::SetNumbers()
|
203
|
+
{
|
204
|
+
nr = consts.size();
|
205
|
+
nc = vars.n; //vars.obj.size();
|
206
|
+
nz = 0;
|
207
|
+
for(long i = 0; i < long(nr); i++)
|
208
|
+
{
|
209
|
+
consts[i].nz = consts[i].cols.size();
|
210
|
+
nz+=consts[i].nz;
|
211
|
+
}
|
212
|
+
return 0;
|
213
|
+
}
|
214
|
+
|
215
|
+
long GenModel::AddVar(string nn, double o, double l, double u, char t)
|
216
|
+
{
|
217
|
+
vars.AddVar(nn, o, l, u, t);
|
218
|
+
return 0;
|
219
|
+
}
|
220
|
+
|
221
|
+
long GenModel::AddVars(string nn, long size, double o, double l, double u, char t)
|
222
|
+
{
|
223
|
+
vars.AddVars(nn, size, o, l, u, t);
|
224
|
+
return 0;
|
225
|
+
}
|
226
|
+
|
227
|
+
long GenModel::SetQpCoef(long i, long j, double val)
|
228
|
+
{
|
229
|
+
vars.SetQpCoef(i, j, val);
|
230
|
+
return 0;
|
231
|
+
}
|
232
|
+
|
233
|
+
long GenModel::AddModelCol(vector<int>& ind, vector<double>& val, double obj, double lb, double ub, string name, char type)
|
234
|
+
{
|
235
|
+
AddVar(name, obj, lb, ub, type);
|
236
|
+
for(long i = 0; i < long(ind.size()); i++)
|
237
|
+
AddNz(ind[i], vars.n-1, val[i]);
|
238
|
+
|
239
|
+
return 0;
|
240
|
+
}
|
241
|
+
|
242
|
+
long GenModel::AddModelRow(vector<int>& ind, vector<double>& val, double rhs, char sense, string name)
|
243
|
+
{
|
244
|
+
AddConst(name, rhs, sense);
|
245
|
+
for(long i = 0; i < long(ind.size()); i++)
|
246
|
+
AddNzToLast(ind[i], val[i]);
|
247
|
+
|
248
|
+
return 0;
|
249
|
+
}
|
250
|
+
|
251
|
+
long GenModel::ChangeBulkBounds(int count, int * ind, char * type, double * vals)
|
252
|
+
{
|
253
|
+
return 0;
|
254
|
+
}
|
255
|
+
|
256
|
+
long GenModel::ChangeBulkObjectives(int count, int * ind, double * vals)
|
257
|
+
{
|
258
|
+
return 0;
|
259
|
+
}
|
260
|
+
|
261
|
+
long GenModel::WriteProblemToLpFile(string filename)
|
262
|
+
{
|
263
|
+
throw string("WriteProblemToLpFile() Not implemented");
|
264
|
+
return 0;
|
265
|
+
}
|
266
|
+
|
267
|
+
long GenModel::WriteSolutionToFile(string filename)
|
268
|
+
{
|
269
|
+
throw string("WriteSolutionToFile() Not implemented");
|
270
|
+
return 0;
|
271
|
+
}
|
272
|
+
|
273
|
+
long GenModel::DeleteMipStarts()
|
274
|
+
{
|
275
|
+
throw string("DeleteMipStarts() Not implemented");
|
276
|
+
return 0;
|
277
|
+
}
|
278
|
+
|
279
|
+
double GenModel::GetMIPRelativeGap()
|
280
|
+
{
|
281
|
+
throw string("DeleteMipStarts() Not implemented");
|
282
|
+
return 0.0;
|
283
|
+
}
|
284
|
+
|
285
|
+
long ModVars::AddVar(string nn, double o, double l, double u, char t)
|
286
|
+
{
|
287
|
+
//offset[nn] = n;
|
288
|
+
name.push_back(nn);
|
289
|
+
obj.push_back(o);
|
290
|
+
ub.push_back(u);
|
291
|
+
lb.push_back(l);
|
292
|
+
type.push_back(t);
|
293
|
+
n++;
|
294
|
+
|
295
|
+
return 0;
|
296
|
+
}
|
297
|
+
|
298
|
+
long ModVars::AddVars(string nn, long size, double o, double l, double u, char t)
|
299
|
+
{
|
300
|
+
offset[nn] = n;
|
301
|
+
char c[4096];
|
302
|
+
for(long i = 0; i < size; i++)
|
303
|
+
{
|
304
|
+
snprintf(c, 4096, "%s_%ld", nn.c_str(), i);
|
305
|
+
AddVar(string(c), o, l, u, t);
|
306
|
+
}
|
307
|
+
|
308
|
+
return 0;
|
309
|
+
}
|
310
|
+
|
311
|
+
long ModVars::SetQpCoef(long i, long j, double val)
|
312
|
+
{
|
313
|
+
qi.push_back(i);
|
314
|
+
qj.push_back(j);
|
315
|
+
qobj.push_back(val);
|
316
|
+
|
317
|
+
return 0;
|
318
|
+
}
|
319
|
+
|
320
|
+
long ModVars::Print()
|
321
|
+
{
|
322
|
+
for(long i = 0; i < long(n); i++)
|
323
|
+
{
|
324
|
+
printf("%ld: %s obj=%f [%c]\n", i, name[i].c_str(), obj[i], type[i]);
|
325
|
+
}
|
326
|
+
|
327
|
+
return 0;
|
328
|
+
}
|
329
|
+
|
330
|
+
template <typename T>
|
331
|
+
void _freeall(T& t)
|
332
|
+
{
|
333
|
+
T tmp;
|
334
|
+
t.swap(tmp);
|
335
|
+
}
|
336
|
+
|
337
|
+
long GenModel::ClearStructure()
|
338
|
+
{
|
339
|
+
consts.clear();
|
340
|
+
_freeall(consts);
|
341
|
+
ci.clear();
|
342
|
+
_freeall(ci);
|
343
|
+
vars.name.clear();
|
344
|
+
_freeall(vars.name);
|
345
|
+
vars.obj.clear();
|
346
|
+
_freeall(vars.obj);
|
347
|
+
vars.type.clear();
|
348
|
+
_freeall(vars.type);
|
349
|
+
vars.offset.clear();
|
350
|
+
_freeall(vars.offset);
|
351
|
+
vars.ub.clear();
|
352
|
+
_freeall(vars.ub);
|
353
|
+
vars.lb.clear();
|
354
|
+
_freeall(vars.lb);
|
355
|
+
vars.sol.clear();
|
356
|
+
_freeall(vars.sol);
|
357
|
+
vars.rc.clear();
|
358
|
+
_freeall(vars.rc);
|
359
|
+
vars.qobj.clear();
|
360
|
+
_freeall(vars.qobj);
|
361
|
+
vars.qi.clear();
|
362
|
+
_freeall(vars.qi);
|
363
|
+
vars.qj.clear();
|
364
|
+
_freeall(vars.qj);
|
365
|
+
|
366
|
+
return 0;
|
367
|
+
}
|
368
|
+
|
369
|
+
|
370
|
+
genmodel_param dbl2param(double val)
|
371
|
+
{
|
372
|
+
genmodel_param ret;
|
373
|
+
ret.dblval = val;
|
374
|
+
return ret;
|
375
|
+
}
|
376
|
+
|
377
|
+
genmodel_param long2param(long val)
|
378
|
+
{
|
379
|
+
genmodel_param ret;
|
380
|
+
ret.longval = val;
|
381
|
+
return ret;
|
382
|
+
}
|
383
|
+
|
384
|
+
genmodel_param str2param(string val)
|
385
|
+
{
|
386
|
+
genmodel_param ret;
|
387
|
+
ret.strval = val.c_str();
|
388
|
+
return ret;
|
389
|
+
}
|