sq_lpsolve.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. #if defined(SQ_USE_LPSOLVE) || defined(SQ_USE_LPSOLVE_STATIC)
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "squirrel.h"
  6. #include "sqstdblobimpl.h"
  7. #include "lp_lib.h"
  8. ////////
  9. #include "dynamic_library.h"
  10. /*SquiLu
  11. local library_functions = [
  12. ["void", "lp_solve_version", "int *majorversion, int *minorversion, int *release, int *build"],
  13. ["lprec*", "make_lp", "int rows, int columns"],
  14. ["MYBOOL", "resize_lp", "lprec *lp, int rows, int columns"],
  15. ["lprec*", "read_LP", "char *filename, int verbose, char *lp_name"],
  16. ["lprec*", "read_MPS", "char *filename, int options"],
  17. ["lprec*", "read_freeMPS", "char *filename, int options"],
  18. ["void", "delete_lp", "lprec *plp"],
  19. //next entry should be the last one
  20. //to make valid the test made on load_library function
  21. ["void", "free_lp", "lprec **plp"],
  22. ];
  23. function write_library_functions_declaration(){
  24. foreach(k,v in library_functions) {
  25. putsnl("typedef " + v[0] + " (*" + v[1] + "_t)(" + v[2] + ");");
  26. putsnl("static " + v[1] + "_t dl" + v[1] + " = 0;");
  27. }
  28. }
  29. function write_library_functions_load(){
  30. foreach(k,v in library_functions){
  31. putsnl("dl" + v[1] + " = (" + v[1] + "_t) libdyn.dlsym(\"" + v[1] + "\");");
  32. putsnl("if(!dl" + v[1] + ") return false;");
  33. }
  34. }
  35. function write_library_functions_static_defines(){
  36. foreach(k,v in library_functions){
  37. putsnl("#define dl" + v[1] + " " + v[1]);
  38. }
  39. }
  40. SquiLu*/
  41. #ifdef SQ_USE_LPSOLVE_STATIC
  42. #define load_library(x) true
  43. //@write_library_functions_static_defines()
  44. // generated-code:begin
  45. #define dllp_solve_version lp_solve_version
  46. #define dlmake_lp make_lp
  47. #define dlresize_lp resize_lp
  48. #define dlread_LP read_LP
  49. #define dlread_MPS read_MPS
  50. #define dlread_freeMPS read_freeMPS
  51. #define dldelete_lp delete_lp
  52. #define dlfree_lp free_lp
  53. // generated-code:end
  54. #else
  55. static DynamicLibrary libdyn;
  56. //@write_library_functions_declaration();
  57. // generated-code:begin
  58. typedef void (*lp_solve_version_t)(int *majorversion, int *minorversion, int *release, int *build);
  59. static lp_solve_version_t dllp_solve_version = 0;
  60. typedef lprec* (*make_lp_t)(int rows, int columns);
  61. static make_lp_t dlmake_lp = 0;
  62. typedef MYBOOL (*resize_lp_t)(lprec *lp, int rows, int columns);
  63. static resize_lp_t dlresize_lp = 0;
  64. typedef lprec* (*read_LP_t)(char *filename, int verbose, char *lp_name);
  65. static read_LP_t dlread_LP = 0;
  66. typedef lprec* (*read_MPS_t)(char *filename, int options);
  67. static read_MPS_t dlread_MPS = 0;
  68. typedef lprec* (*read_freeMPS_t)(char *filename, int options);
  69. static read_freeMPS_t dlread_freeMPS = 0;
  70. typedef void (*delete_lp_t)(lprec *plp);
  71. static delete_lp_t dldelete_lp = 0;
  72. typedef void (*free_lp_t)(lprec **plp);
  73. static free_lp_t dlfree_lp = 0;
  74. // generated-code:end
  75. static const char *dynamicLibName = DYNLIB_FOR_OS(liblpsolve55);
  76. static bool load_library(const char *libname)
  77. {
  78. if(dlfree_lp) return true;
  79. if(libdyn.open(libname))
  80. {
  81. //@write_library_functions_load();
  82. // generated-code:begin
  83. dllp_solve_version = (lp_solve_version_t) libdyn.dlsym("lp_solve_version");
  84. if(!dllp_solve_version) return false;
  85. dlmake_lp = (make_lp_t) libdyn.dlsym("make_lp");
  86. if(!dlmake_lp) return false;
  87. dlresize_lp = (resize_lp_t) libdyn.dlsym("resize_lp");
  88. if(!dlresize_lp) return false;
  89. dlread_LP = (read_LP_t) libdyn.dlsym("read_LP");
  90. if(!dlread_LP) return false;
  91. dlread_MPS = (read_MPS_t) libdyn.dlsym("read_MPS");
  92. if(!dlread_MPS) return false;
  93. dlread_freeMPS = (read_freeMPS_t) libdyn.dlsym("read_freeMPS");
  94. if(!dlread_freeMPS) return false;
  95. dldelete_lp = (delete_lp_t) libdyn.dlsym("delete_lp");
  96. if(!dldelete_lp) return false;
  97. dlfree_lp = (free_lp_t) libdyn.dlsym("free_lp");
  98. if(!dlfree_lp) return false;
  99. // generated-code:end
  100. return true;
  101. }
  102. return false;
  103. }
  104. #endif // SQ_USE_LPSOLVE_STATIC
  105. SQ_OPT_STRING_STRLEN();
  106. static const SQChar LPSOLVE_Tag[] = _SC("SQLPSolve");
  107. #define GET_lpsolve_INSTANCE() SQ_GET_INSTANCE(v, 1, lprec, LPSOLVE_Tag) \
  108. if(self == NULL) return sq_throwerror(v, _SC("sqlpsolve object already closed"));
  109. static SQRESULT sq_lpsolve_releasehook(SQUserPointer p, SQInteger /*size*/, void */*ep*/)
  110. {
  111. lprec *self = ((lprec *)p);
  112. if(self)
  113. {
  114. dldelete_lp(self);
  115. }
  116. return 1;
  117. }
  118. static SQRESULT sq_lpsolve_constructor(HSQUIRRELVM v)
  119. {
  120. if(!load_library(dynamicLibName)) return sq_throwerror(v, _SC("Failed to load liblpsolve !"));
  121. SQ_FUNC_VARS_NO_TOP(v);
  122. SQ_GET_INTEGER(v, 2, constraints);
  123. SQ_GET_INTEGER(v, 3, variables);
  124. lprec *self = dlmake_lp(constraints, variables);
  125. self->set_verbose(self, IMPORTANT);
  126. sq_setinstanceup(v,1,self);
  127. sq_setreleasehook(v,1,sq_lpsolve_releasehook);
  128. return 0;
  129. }
  130. static SQRESULT sq_lpsolve_version(HSQUIRRELVM v)
  131. {
  132. int majorversion, minorversion, release, build;
  133. dllp_solve_version(&majorversion, &minorversion, &release, &build);
  134. sq_pushfstring(v,_SC("lp_solve %d.%d.%d.%d"), majorversion, minorversion, release, build);
  135. return 1;
  136. }
  137. static SQRESULT sq_lpsolve_loadlib(HSQUIRRELVM v)
  138. {
  139. SQ_FUNC_VARS_NO_TOP(v);
  140. SQ_GET_STRING(v, 2, libname);
  141. sq_pushbool(v, load_library(libname));
  142. return 1;
  143. }
  144. static SQRESULT sq_lpsolve_set_verbose(HSQUIRRELVM v)
  145. {
  146. SQ_FUNC_VARS_NO_TOP(v);
  147. GET_lpsolve_INSTANCE();
  148. SQ_GET_INTEGER(v, 2, mode);
  149. //dlset_verbose(self, mode);
  150. self->set_verbose(self, mode);
  151. return 0;
  152. }
  153. static SQRESULT sq_lpsolve_set_obj_fn(HSQUIRRELVM v)
  154. {
  155. SQ_FUNC_VARS_NO_TOP(v);
  156. GET_lpsolve_INSTANCE();
  157. const SQInteger ary_idx = 2;
  158. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  159. {
  160. SQInteger atype;
  161. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  162. void *ary;
  163. sq_arraygetrawdata(v, ary_idx, &ary);
  164. sq_pushbool(v, self->set_obj_fn(self, (REAL*)ary));
  165. }
  166. else sq_pushbool(v, SQFalse);
  167. return 1;
  168. }
  169. static SQRESULT sq_lpsolve_add_constraint(HSQUIRRELVM v)
  170. {
  171. SQ_FUNC_VARS_NO_TOP(v);
  172. GET_lpsolve_INSTANCE();
  173. const SQInteger ary_idx = 2;
  174. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  175. {
  176. SQInteger atype;
  177. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  178. void *ary;
  179. sq_arraygetrawdata(v, ary_idx, &ary);
  180. SQ_GET_INTEGER(v, 3, constr_type);
  181. SQ_GET_FLOAT(v, 4, rh);
  182. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  183. sq_pushbool(v, self->add_constraint(self, (REAL*)ary, constr_type, rh));
  184. }
  185. else sq_pushbool(v, SQFalse);
  186. return 1;
  187. }
  188. static SQRESULT sq_lpsolve_add_constraintex(HSQUIRRELVM v)
  189. {
  190. SQ_FUNC_VARS_NO_TOP(v);
  191. GET_lpsolve_INSTANCE();
  192. SQ_GET_INTEGER(v, 2, asize);
  193. const SQInteger ary_row_idx = 3;
  194. const SQInteger ary_col_idx = 4;
  195. if(sq_gettype(v, ary_row_idx) == OT_ARRAY)
  196. {
  197. SQInteger atype;
  198. if(sq_arraygettype(v, ary_row_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array for rows expected"));
  199. if(sq_arraygettype(v, ary_col_idx, &atype) != SQ_OK && atype == eat_SQInt32Array) return sq_throwerror(v, _SC("SQInt32Array for cols expected"));
  200. void *ary_row, *ary_col;
  201. sq_arraygetrawdata(v, ary_row_idx, &ary_row);
  202. sq_arraygetrawdata(v, ary_col_idx, &ary_col);
  203. SQ_GET_INTEGER(v, 5, constr_type);
  204. SQ_GET_FLOAT(v, 6, rh);
  205. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  206. sq_pushbool(v, self->add_constraintex(self, asize, (REAL*)ary_row, (int*)ary_col, constr_type, rh));
  207. }
  208. else sq_pushbool(v, SQFalse);
  209. return 1;
  210. }
  211. static SQRESULT sq_lpsolve_set_lowbo(HSQUIRRELVM v)
  212. {
  213. SQ_FUNC_VARS_NO_TOP(v);
  214. GET_lpsolve_INSTANCE();
  215. SQ_GET_INTEGER(v, 2, colnr);
  216. SQ_GET_FLOAT(v, 3, val);
  217. sq_pushbool(v, self->set_lowbo(self, colnr, val));
  218. return 1;
  219. }
  220. static SQRESULT sq_lpsolve_set_upbo(HSQUIRRELVM v)
  221. {
  222. SQ_FUNC_VARS_NO_TOP(v);
  223. GET_lpsolve_INSTANCE();
  224. SQ_GET_INTEGER(v, 2, rownr);
  225. SQ_GET_FLOAT(v, 3, val);
  226. sq_pushbool(v, self->set_upbo(self, rownr, val));
  227. return 1;
  228. }
  229. static SQRESULT sq_lpsolve_set_bounds(HSQUIRRELVM v)
  230. {
  231. SQ_FUNC_VARS_NO_TOP(v);
  232. GET_lpsolve_INSTANCE();
  233. SQ_GET_INTEGER(v, 2, colno)
  234. SQ_GET_FLOAT(v, 3, lb);
  235. SQ_GET_FLOAT(v, 4, ub);
  236. sq_pushbool(v, self->set_bounds(self, colno, lb, ub));
  237. return 1;
  238. }
  239. static SQRESULT sq_lpsolve_set_col_name(HSQUIRRELVM v)
  240. {
  241. SQ_FUNC_VARS_NO_TOP(v);
  242. GET_lpsolve_INSTANCE();
  243. SQ_GET_INTEGER(v, 2, colnr);
  244. SQ_GET_STRING(v, 3, name);
  245. sq_pushbool(v, self->set_col_name(self, colnr, (SQChar*)name));
  246. return 1;
  247. }
  248. static SQRESULT sq_lpsolve_get_col_name(HSQUIRRELVM v)
  249. {
  250. SQ_FUNC_VARS_NO_TOP(v);
  251. GET_lpsolve_INSTANCE();
  252. SQ_GET_INTEGER(v, 2, colnr);
  253. sq_pushstring(v, self->get_col_name(self, colnr), -1);
  254. return 1;
  255. }
  256. static SQRESULT sq_lpsolve_set_row_name(HSQUIRRELVM v)
  257. {
  258. SQ_FUNC_VARS_NO_TOP(v);
  259. GET_lpsolve_INSTANCE();
  260. SQ_GET_INTEGER(v, 2, rownr);
  261. SQ_GET_STRING(v, 3, name);
  262. sq_pushbool(v, self->set_row_name(self, rownr, (SQChar*)name));
  263. return 1;
  264. }
  265. static SQRESULT sq_lpsolve_get_row_name(HSQUIRRELVM v)
  266. {
  267. SQ_FUNC_VARS_NO_TOP(v);
  268. GET_lpsolve_INSTANCE();
  269. SQ_GET_INTEGER(v, 2, rownr);
  270. sq_pushstring(v, self->get_row_name(self, rownr), -1);
  271. return 1;
  272. }
  273. static SQRESULT sq_lpsolve_set_lp_name(HSQUIRRELVM v)
  274. {
  275. SQ_FUNC_VARS_NO_TOP(v);
  276. GET_lpsolve_INSTANCE();
  277. SQ_GET_STRING(v, 2, name);
  278. sq_pushbool(v, self->set_lp_name(self, (SQChar*)name));
  279. return 1;
  280. }
  281. static SQRESULT sq_lpsolve_get_lp_name(HSQUIRRELVM v)
  282. {
  283. SQ_FUNC_VARS_NO_TOP(v);
  284. GET_lpsolve_INSTANCE();
  285. sq_pushstring(v, self->get_lp_name(self), -1);
  286. return 1;
  287. }
  288. static SQRESULT sq_lpsolve_write_lp(HSQUIRRELVM v)
  289. {
  290. SQ_FUNC_VARS_NO_TOP(v);
  291. GET_lpsolve_INSTANCE();
  292. SQ_GET_STRING(v, 2, filename);
  293. sq_pushbool(v, self->write_lp(self, (SQChar*)filename));
  294. return 1;
  295. }
  296. static SQRESULT sq_lpsolve_write_mps(HSQUIRRELVM v)
  297. {
  298. SQ_FUNC_VARS_NO_TOP(v);
  299. GET_lpsolve_INSTANCE();
  300. SQ_GET_STRING(v, 2, filename);
  301. sq_pushbool(v, self->write_mps(self, (SQChar*)filename));
  302. return 1;
  303. }
  304. static SQRESULT sq_lpsolve_write_freemps(HSQUIRRELVM v)
  305. {
  306. SQ_FUNC_VARS_NO_TOP(v);
  307. GET_lpsolve_INSTANCE();
  308. SQ_GET_STRING(v, 2, filename);
  309. sq_pushbool(v, self->write_freemps(self, (SQChar*)filename));
  310. return 1;
  311. }
  312. static SQRESULT sq_lpsolve_write_params(HSQUIRRELVM v)
  313. {
  314. SQ_FUNC_VARS_NO_TOP(v);
  315. GET_lpsolve_INSTANCE();
  316. SQ_GET_STRING(v, 2, filename);
  317. SQ_GET_STRING(v, 3, options);
  318. sq_pushbool(v, self->write_params(self, (SQChar*)filename, (SQChar*)options));
  319. return 1;
  320. }
  321. static SQRESULT sq_lpsolve_read_problem(HSQUIRRELVM v, lprec *self)
  322. {
  323. if(self)
  324. {
  325. sq_pushstring(v, LPSOLVE_Tag, -1);
  326. if(sq_getonroottable(v) == SQ_OK){
  327. if(sq_createinstance(v, -1) == SQ_OK){
  328. sq_setinstanceup(v, -1, self);
  329. sq_setreleasehook(v,-1,sq_lpsolve_releasehook);
  330. }
  331. }
  332. }
  333. else sq_pushnull(v);
  334. return 1;
  335. }
  336. static SQRESULT sq_lpsolve_read_LP(HSQUIRRELVM v)
  337. {
  338. SQ_FUNC_VARS_NO_TOP(v);
  339. SQ_GET_STRING(v, 2, filename);
  340. SQ_GET_BOOL(v, 3, verbose);
  341. SQ_GET_STRING(v, 4, lp_name);
  342. lprec *self = dlread_LP((SQChar*)filename, verbose, (SQChar*)lp_name);
  343. return sq_lpsolve_read_problem(v, self);
  344. }
  345. static SQRESULT sq_lpsolve_read_MPS(HSQUIRRELVM v)
  346. {
  347. SQ_FUNC_VARS_NO_TOP(v);
  348. SQ_GET_STRING(v, 2, filename);
  349. SQ_GET_INTEGER(v, 3, options);
  350. lprec *self = dlread_MPS((SQChar*)filename, options);
  351. return sq_lpsolve_read_problem(v, self);
  352. }
  353. static SQRESULT sq_lpsolve_read_freeMPS(HSQUIRRELVM v)
  354. {
  355. SQ_FUNC_VARS_NO_TOP(v);
  356. SQ_GET_STRING(v, 2, filename);
  357. SQ_GET_INTEGER(v, 3, options);
  358. lprec *self = dlread_freeMPS((SQChar*)filename, options);
  359. return sq_lpsolve_read_problem(v, self);
  360. }
  361. static SQRESULT sq_lpsolve_read_params(HSQUIRRELVM v)
  362. {
  363. SQ_FUNC_VARS_NO_TOP(v);
  364. GET_lpsolve_INSTANCE();
  365. SQ_GET_STRING(v, 2, filename);
  366. SQ_GET_STRING(v, 3, options);
  367. sq_pushbool(v, self->read_params(self, (SQChar*)filename, (SQChar*)options));
  368. return 1;
  369. }
  370. static SQRESULT sq_lpsolve_get_mat(HSQUIRRELVM v)
  371. {
  372. SQ_FUNC_VARS_NO_TOP(v);
  373. GET_lpsolve_INSTANCE();
  374. SQ_GET_INTEGER(v, 2, rownr);
  375. SQ_GET_INTEGER(v, 3, colnr);
  376. sq_pushfloat(v, self->get_mat(self, rownr, colnr));
  377. return 1;
  378. }
  379. static SQRESULT sq_lpsolve_set_mat(HSQUIRRELVM v)
  380. {
  381. SQ_FUNC_VARS_NO_TOP(v);
  382. GET_lpsolve_INSTANCE();
  383. SQ_GET_INTEGER(v, 2, rownr);
  384. SQ_GET_INTEGER(v, 3, colnr);
  385. SQ_GET_FLOAT(v, 4, value);
  386. sq_pushbool(v, self->set_mat(self, rownr, colnr, value));
  387. return 1;
  388. }
  389. static SQRESULT sq_lpsolve_solve(HSQUIRRELVM v)
  390. {
  391. SQ_FUNC_VARS_NO_TOP(v);
  392. GET_lpsolve_INSTANCE();
  393. sq_pushinteger(v, self->solve(self));
  394. return 1;
  395. }
  396. static SQRESULT sq_lpsolve_get_objective(HSQUIRRELVM v)
  397. {
  398. SQ_FUNC_VARS_NO_TOP(v);
  399. GET_lpsolve_INSTANCE();
  400. sq_pushfloat(v, self->get_objective(self));
  401. return 1;
  402. }
  403. static SQRESULT sq_lpsolve_get_variables(HSQUIRRELVM v)
  404. {
  405. SQ_FUNC_VARS_NO_TOP(v);
  406. GET_lpsolve_INSTANCE();
  407. const SQInteger ary_idx = 2;
  408. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  409. {
  410. SQInteger atype;
  411. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  412. int ncols = self->get_Ncolumns(self);
  413. if(sq_getsize(v, ary_idx) != ncols) return sq_throwerror(v, _SC("SQFloat64Array of size %d expected"), ncols);
  414. void *ary;
  415. sq_arraygetrawdata(v, ary_idx, &ary);
  416. sq_pushbool(v, self->get_variables(self, (REAL*)ary));
  417. }
  418. else sq_pushbool(v, SQFalse);
  419. return 1;
  420. }
  421. static SQRESULT sq_lpsolve_get_constraints(HSQUIRRELVM v)
  422. {
  423. SQ_FUNC_VARS_NO_TOP(v);
  424. GET_lpsolve_INSTANCE();
  425. const SQInteger ary_idx = 2;
  426. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  427. {
  428. SQInteger atype;
  429. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  430. int nrows = self->get_Nrows(self);
  431. if(sq_getsize(v, ary_idx) != nrows) return sq_throwerror(v, _SC("SQFloat64Array of size %d expected"), nrows);
  432. void *ary;
  433. sq_arraygetrawdata(v, ary_idx, &ary);
  434. sq_pushbool(v, self->get_constraints(self, (REAL*)ary));
  435. }
  436. else sq_pushbool(v, SQFalse);
  437. return 1;
  438. }
  439. static SQRESULT sq_lpsolve_get_dual_solution(HSQUIRRELVM v)
  440. {
  441. SQ_FUNC_VARS_NO_TOP(v);
  442. GET_lpsolve_INSTANCE();
  443. const SQInteger ary_idx = 2;
  444. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  445. {
  446. SQInteger atype;
  447. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  448. int nrows = self->get_Nrows(self);
  449. if(sq_getsize(v, ary_idx) != nrows) return sq_throwerror(v, _SC("SQFloat64Array of size %d expected"), nrows);
  450. void *ary;
  451. sq_arraygetrawdata(v, ary_idx, &ary);
  452. sq_pushbool(v, self->get_dual_solution(self, (REAL*)ary));
  453. }
  454. else sq_pushbool(v, SQFalse);
  455. return 1;
  456. }
  457. static SQRESULT sq_lpsolve_get_sensitivity_rhs(HSQUIRRELVM v)
  458. {
  459. SQ_FUNC_VARS_NO_TOP(v);
  460. GET_lpsolve_INSTANCE();
  461. const SQInteger ary_idx_duals = 2;
  462. const SQInteger ary_idx_dualsfrom = 3;
  463. const SQInteger ary_idx_dualstill = 4;
  464. SQInteger atype;
  465. if(sq_arraygettype(v, ary_idx_duals, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  466. if(sq_arraygettype(v, ary_idx_dualsfrom, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  467. if(sq_arraygettype(v, ary_idx_dualstill, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  468. int nrows = self->get_Nrows(self);
  469. if(sq_getsize(v, ary_idx_duals) != nrows || sq_getsize(v, ary_idx_dualsfrom) != nrows || sq_getsize(v, ary_idx_dualstill) != nrows)
  470. return sq_throwerror(v, _SC("SQFloat64Array of size %d expected"), nrows);
  471. void *ary_duals, *ary_dualsfrom, *ary_dualstill;
  472. sq_arraygetrawdata(v, ary_idx_duals, &ary_duals);
  473. sq_arraygetrawdata(v, ary_idx_dualsfrom, &ary_dualsfrom);
  474. sq_arraygetrawdata(v, ary_idx_dualstill, &ary_dualstill);
  475. sq_pushbool(v, self->get_sensitivity_rhs(self, (REAL*)ary_duals, (REAL*)ary_dualsfrom, (REAL*)ary_dualstill));
  476. return 1;
  477. }
  478. static SQRESULT sq_lpsolve_get_nonzeros(HSQUIRRELVM v)
  479. {
  480. SQ_FUNC_VARS_NO_TOP(v);
  481. GET_lpsolve_INSTANCE();
  482. sq_pushinteger(v, self->get_nonzeros(self));
  483. return 1;
  484. }
  485. static SQRESULT sq_lpsolve_get_Nrows(HSQUIRRELVM v)
  486. {
  487. SQ_FUNC_VARS_NO_TOP(v);
  488. GET_lpsolve_INSTANCE();
  489. sq_pushinteger(v, self->get_Nrows(self));
  490. return 1;
  491. }
  492. static SQRESULT sq_lpsolve_get_Ncolumns(HSQUIRRELVM v)
  493. {
  494. SQ_FUNC_VARS_NO_TOP(v);
  495. GET_lpsolve_INSTANCE();
  496. sq_pushinteger(v, self->get_Ncolumns(self));
  497. return 1;
  498. }
  499. static SQRESULT sq_lpsolve_get_timeout(HSQUIRRELVM v)
  500. {
  501. SQ_FUNC_VARS_NO_TOP(v);
  502. GET_lpsolve_INSTANCE();
  503. sq_pushinteger(v, self->get_timeout(self));
  504. return 1;
  505. }
  506. static SQRESULT sq_lpsolve_set_timeout(HSQUIRRELVM v)
  507. {
  508. SQ_FUNC_VARS_NO_TOP(v);
  509. GET_lpsolve_INSTANCE();
  510. SQ_GET_INTEGER(v, 2, sectimeout);
  511. self->set_timeout(self, sectimeout);
  512. return 0;
  513. }
  514. static SQRESULT sq_lpsolve_print_lp(HSQUIRRELVM v)
  515. {
  516. SQ_FUNC_VARS_NO_TOP(v);
  517. GET_lpsolve_INSTANCE();
  518. self->print_lp(self);
  519. return 0;
  520. }
  521. static SQRESULT sq_lpsolve_print_objective(HSQUIRRELVM v)
  522. {
  523. SQ_FUNC_VARS_NO_TOP(v);
  524. GET_lpsolve_INSTANCE();
  525. self->print_objective(self);
  526. return 0;
  527. }
  528. static SQRESULT sq_lpsolve_print_solution(HSQUIRRELVM v)
  529. {
  530. SQ_FUNC_VARS_NO_TOP(v);
  531. GET_lpsolve_INSTANCE();
  532. SQ_GET_INTEGER(v, 2, ncols);
  533. self->print_solution(self, ncols);
  534. return 0;
  535. }
  536. static SQRESULT sq_lpsolve_print_constraints(HSQUIRRELVM v)
  537. {
  538. SQ_FUNC_VARS_NO_TOP(v);
  539. GET_lpsolve_INSTANCE();
  540. SQ_GET_INTEGER(v, 2, ncols);
  541. self->print_constraints(self, ncols);
  542. return 0;
  543. }
  544. static SQRESULT sq_lpsolve_print_duals(HSQUIRRELVM v)
  545. {
  546. SQ_FUNC_VARS_NO_TOP(v);
  547. GET_lpsolve_INSTANCE();
  548. self->print_duals(self);
  549. return 0;
  550. }
  551. static SQRESULT sq_lpsolve_set_maxim(HSQUIRRELVM v)
  552. {
  553. SQ_FUNC_VARS_NO_TOP(v);
  554. GET_lpsolve_INSTANCE();
  555. self->set_maxim(self);
  556. return 0;
  557. }
  558. static SQRESULT sq_lpsolve_set_rh(HSQUIRRELVM v)
  559. {
  560. SQ_FUNC_VARS_NO_TOP(v);
  561. GET_lpsolve_INSTANCE();
  562. SQ_GET_INTEGER(v, 2, col);
  563. SQ_GET_FLOAT(v, 3, row);
  564. sq_pushbool(v, self->set_rh(self, col, row));
  565. return 1;
  566. }
  567. static SQRESULT sq_lpsolve_set_rh_range(HSQUIRRELVM v)
  568. {
  569. SQ_FUNC_VARS_NO_TOP(v);
  570. GET_lpsolve_INSTANCE();
  571. SQ_GET_INTEGER(v, 2, col);
  572. SQ_GET_FLOAT(v, 3, row);
  573. sq_pushbool(v, self->set_rh_range(self, col, row));
  574. return 1;
  575. }
  576. static SQRESULT sq_lpsolve_set_int(HSQUIRRELVM v)
  577. {
  578. SQ_FUNC_VARS_NO_TOP(v);
  579. GET_lpsolve_INSTANCE();
  580. SQ_GET_INTEGER(v, 2, col);
  581. SQ_GET_BOOL(v, 3, bval);
  582. sq_pushbool(v, self->set_int(self, col, bval));
  583. return 1;
  584. }
  585. static SQRESULT sq_lpsolve_set_trace(HSQUIRRELVM v)
  586. {
  587. SQ_FUNC_VARS_NO_TOP(v);
  588. GET_lpsolve_INSTANCE();
  589. SQ_GET_BOOL(v, 2, bval);
  590. self->set_trace(self, bval);
  591. return 0;
  592. }
  593. static SQRESULT sq_lpsolve_set_debug(HSQUIRRELVM v)
  594. {
  595. SQ_FUNC_VARS_NO_TOP(v);
  596. GET_lpsolve_INSTANCE();
  597. SQ_GET_BOOL(v, 2, bval);
  598. self->set_debug(self, bval);
  599. return 0;
  600. }
  601. static SQRESULT sq_lpsolve_del_constraint(HSQUIRRELVM v)
  602. {
  603. SQ_FUNC_VARS_NO_TOP(v);
  604. GET_lpsolve_INSTANCE();
  605. SQ_GET_INTEGER(v, 2, cnum);
  606. sq_pushbool(v, self->del_constraint(self, cnum));
  607. return 1;
  608. }
  609. static SQRESULT sq_lpsolve_add_column(HSQUIRRELVM v)
  610. {
  611. SQ_FUNC_VARS_NO_TOP(v);
  612. GET_lpsolve_INSTANCE();
  613. const SQInteger ary_idx = 2;
  614. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  615. {
  616. SQInteger atype;
  617. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  618. void *ary;
  619. sq_arraygetrawdata(v, ary_idx, &ary);
  620. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  621. sq_pushbool(v, self->add_column(self, (REAL*)ary));
  622. }
  623. else sq_pushbool(v, SQFalse);
  624. return 1;
  625. }
  626. static SQRESULT sq_lpsolve_add_columnex(HSQUIRRELVM v)
  627. {
  628. SQ_FUNC_VARS_NO_TOP(v);
  629. GET_lpsolve_INSTANCE();
  630. SQ_GET_INTEGER(v, 2, asize);
  631. const SQInteger ary_row_idx = 3;
  632. const SQInteger ary_col_idx = 4;
  633. if(sq_gettype(v, ary_row_idx) == OT_ARRAY)
  634. {
  635. SQInteger atype;
  636. if(sq_arraygettype(v, ary_row_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array for rows expected"));
  637. if(sq_arraygettype(v, ary_col_idx, &atype) != SQ_OK && atype == eat_SQInt32Array) return sq_throwerror(v, _SC("SQInt32Array for cols expected"));
  638. void *ary_row, *ary_col;
  639. sq_arraygetrawdata(v, ary_row_idx, &ary_row);
  640. sq_arraygetrawdata(v, ary_col_idx, &ary_col);
  641. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  642. sq_pushbool(v, self->add_columnex(self, asize, (REAL*)ary_row, (int*)ary_col));
  643. }
  644. else sq_pushbool(v, SQFalse);
  645. return 1;
  646. }
  647. static SQRESULT sq_lpsolve_set_column(HSQUIRRELVM v)
  648. {
  649. SQ_FUNC_VARS_NO_TOP(v);
  650. GET_lpsolve_INSTANCE();
  651. SQ_GET_INTEGER(v, 2, colno);
  652. const SQInteger ary_idx = 3;
  653. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  654. {
  655. SQInteger atype;
  656. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  657. void *ary;
  658. sq_arraygetrawdata(v, ary_idx, &ary);
  659. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  660. sq_pushbool(v, self->set_column(self, colno, (REAL*)ary));
  661. }
  662. else sq_pushbool(v, SQFalse);
  663. return 1;
  664. }
  665. static SQRESULT sq_lpsolve_set_columnex(HSQUIRRELVM v)
  666. {
  667. SQ_FUNC_VARS_NO_TOP(v);
  668. GET_lpsolve_INSTANCE();
  669. SQ_GET_INTEGER(v, 2, colno);
  670. SQ_GET_INTEGER(v, 3, asize);
  671. const SQInteger ary_row_idx = 4;
  672. const SQInteger ary_col_idx = 5;
  673. if(sq_gettype(v, ary_row_idx) == OT_ARRAY)
  674. {
  675. SQInteger atype;
  676. if(sq_arraygettype(v, ary_row_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array for rows expected"));
  677. if(sq_arraygettype(v, ary_col_idx, &atype) != SQ_OK && atype == eat_SQInt32Array) return sq_throwerror(v, _SC("SQInt32Array for cols expected"));
  678. void *ary_row, *ary_col;
  679. sq_arraygetrawdata(v, ary_row_idx, &ary_row);
  680. sq_arraygetrawdata(v, ary_col_idx, &ary_col);
  681. //for(SQInteger i= 0, len =sq_getsize(v, ary_idx); i < len; ++i) printf("add_constraint %d %f\n", (int) i, ((REAL*)ary)[i]);
  682. sq_pushbool(v, self->set_columnex(self, colno, asize, (REAL*)ary_row, (int*)ary_col));
  683. }
  684. else sq_pushbool(v, SQFalse);
  685. return 1;
  686. }
  687. static SQRESULT sq_lpsolve_del_column(HSQUIRRELVM v)
  688. {
  689. SQ_FUNC_VARS_NO_TOP(v);
  690. GET_lpsolve_INSTANCE();
  691. SQ_GET_INTEGER(v, 2, colno);
  692. sq_pushbool(v, self->del_column(self, colno));
  693. return 1;
  694. }
  695. static SQRESULT sq_lpsolve_set_scaling(HSQUIRRELVM v)
  696. {
  697. SQ_FUNC_VARS_NO_TOP(v);
  698. GET_lpsolve_INSTANCE();
  699. SQ_GET_INTEGER(v, 2, scal_type);
  700. self->set_scaling(self, scal_type);
  701. return 0;
  702. }
  703. static SQRESULT sq_lpsolve_unscale(HSQUIRRELVM v)
  704. {
  705. SQ_FUNC_VARS_NO_TOP(v);
  706. GET_lpsolve_INSTANCE();
  707. self->unscale(self);
  708. return 0;
  709. }
  710. static SQRESULT sq_lpsolve_default_basis(HSQUIRRELVM v)
  711. {
  712. SQ_FUNC_VARS_NO_TOP(v);
  713. GET_lpsolve_INSTANCE();
  714. self->default_basis(self);
  715. return 0;
  716. }
  717. static SQRESULT sq_lpsolve_is_presolve(HSQUIRRELVM v)
  718. {
  719. SQ_FUNC_VARS_NO_TOP(v);
  720. GET_lpsolve_INSTANCE();
  721. SQ_GET_INTEGER(v, 2, flags);
  722. sq_pushbool(v, self->is_presolve(self, flags));
  723. return 1;
  724. }
  725. static SQRESULT sq_lpsolve_set_presolve(HSQUIRRELVM v)
  726. {
  727. SQ_FUNC_VARS_NO_TOP(v);
  728. GET_lpsolve_INSTANCE();
  729. SQ_GET_INTEGER(v, 2, flags);
  730. SQ_GET_INTEGER(v, 3, maxloops);
  731. self->set_presolve(self, flags, maxloops);
  732. return 0;
  733. }
  734. static SQRESULT sq_lpsolve_set_constr_type(HSQUIRRELVM v)
  735. {
  736. SQ_FUNC_VARS_NO_TOP(v);
  737. GET_lpsolve_INSTANCE();
  738. SQ_GET_INTEGER(v, 2, rowno);
  739. SQ_GET_INTEGER(v, 3, constraint_type);
  740. sq_pushbool(v, self->set_constr_type(self, rowno, constraint_type));
  741. return 1;
  742. }
  743. static SQRESULT sq_lpsolve_set_row(HSQUIRRELVM v)
  744. {
  745. SQ_FUNC_VARS_NO_TOP(v);
  746. GET_lpsolve_INSTANCE();
  747. SQ_GET_INTEGER(v, 2, rowno);
  748. const SQInteger ary_idx = 3;
  749. if(sq_gettype(v, ary_idx) == OT_ARRAY)
  750. {
  751. SQInteger atype;
  752. if(sq_arraygettype(v, ary_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array expected"));
  753. void *ary;
  754. sq_arraygetrawdata(v, ary_idx, &ary);
  755. sq_pushbool(v, self->set_row(self, rowno, (REAL*)ary));
  756. }
  757. else sq_pushbool(v, SQFalse);
  758. return 1;
  759. }
  760. static SQRESULT sq_lpsolve_set_rowex(HSQUIRRELVM v)
  761. {
  762. SQ_FUNC_VARS_NO_TOP(v);
  763. GET_lpsolve_INSTANCE();
  764. SQ_GET_INTEGER(v, 2, rowno);
  765. SQ_GET_INTEGER(v, 3, asize);
  766. const SQInteger ary_row_idx = 4;
  767. const SQInteger ary_col_idx = 5;
  768. if(sq_gettype(v, ary_row_idx) == OT_ARRAY)
  769. {
  770. SQInteger atype;
  771. if(sq_arraygettype(v, ary_row_idx, &atype) != SQ_OK && atype == eat_SQFloat64Array) return sq_throwerror(v, _SC("SQFloat64Array for rows expected"));
  772. if(sq_arraygettype(v, ary_col_idx, &atype) != SQ_OK && atype == eat_SQInt32Array) return sq_throwerror(v, _SC("SQInt32Array for cols expected"));
  773. void *ary_row, *ary_col;
  774. sq_arraygetrawdata(v, ary_row_idx, &ary_row);
  775. sq_arraygetrawdata(v, ary_col_idx, &ary_col);
  776. sq_pushbool(v, self->set_rowex(self, rowno, asize, (REAL*)ary_row, (int*)ary_col));
  777. }
  778. else sq_pushbool(v, SQFalse);
  779. return 1;
  780. }
  781. #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_lpsolve_##name,nparams,tycheck}
  782. static SQRegFunction sq_lpsolve_methods[] =
  783. {
  784. _DECL_FUNC(constructor,3,_SC(".ii")),
  785. _DECL_FUNC(version,1,_SC(".")),
  786. _DECL_FUNC(loadlib,2,_SC(".s")),
  787. _DECL_FUNC(set_verbose,2,_SC("xi")),
  788. _DECL_FUNC(set_obj_fn,2,_SC("xa")),
  789. _DECL_FUNC(add_constraint,4,_SC("xain")),
  790. _DECL_FUNC(add_constraintex,6,_SC("xiaain")),
  791. _DECL_FUNC(del_constraint,2,_SC(".i")),
  792. _DECL_FUNC(set_constr_type,3,_SC(".ii")),
  793. _DECL_FUNC(set_lowbo,3,_SC("xin")),
  794. _DECL_FUNC(set_upbo,3,_SC("xin")),
  795. _DECL_FUNC(set_bounds,4,_SC("xinn")),
  796. _DECL_FUNC(set_lp_name,2,_SC("xs")),
  797. _DECL_FUNC(get_lp_name,1,_SC("x")),
  798. _DECL_FUNC(set_col_name,3,_SC("xis")),
  799. _DECL_FUNC(get_col_name,2,_SC("xi")),
  800. _DECL_FUNC(set_row_name,3,_SC("xis")),
  801. _DECL_FUNC(get_row_name,2,_SC("xi")),
  802. _DECL_FUNC(write_lp,2,_SC("xs")),
  803. _DECL_FUNC(write_mps,2,_SC("xs")),
  804. _DECL_FUNC(write_freemps,2,_SC("xs")),
  805. _DECL_FUNC(write_params,3,_SC("xss")),
  806. _DECL_FUNC(read_LP,4,_SC(".sbs")),
  807. _DECL_FUNC(read_MPS,3,_SC(".si")),
  808. _DECL_FUNC(read_freeMPS,3,_SC(".si")),
  809. _DECL_FUNC(read_params,3,_SC("xss")),
  810. _DECL_FUNC(get_mat,3,_SC("xii")),
  811. _DECL_FUNC(set_mat,4,_SC("xiin")),
  812. _DECL_FUNC(solve,1,_SC("x")),
  813. _DECL_FUNC(get_objective,1,_SC("x")),
  814. _DECL_FUNC(get_variables,2,_SC("xa")),
  815. _DECL_FUNC(get_constraints,2,_SC("xa")),
  816. _DECL_FUNC(get_dual_solution,2,_SC("xa")),
  817. _DECL_FUNC(get_sensitivity_rhs,4,_SC("xaaa")),
  818. _DECL_FUNC(get_nonzeros,1,_SC("x")),
  819. _DECL_FUNC(get_Nrows,1,_SC("x")),
  820. _DECL_FUNC(get_Ncolumns,1,_SC("x")),
  821. _DECL_FUNC(set_timeout,2,_SC("xi")),
  822. _DECL_FUNC(get_timeout,1,_SC("x")),
  823. _DECL_FUNC(print_lp,1,_SC(".")),
  824. _DECL_FUNC(print_objective,1,_SC(".")),
  825. _DECL_FUNC(print_solution,2,_SC(".i")),
  826. _DECL_FUNC(print_constraints,2,_SC(".i")),
  827. _DECL_FUNC(print_duals,1,_SC(".")),
  828. _DECL_FUNC(set_maxim,1,_SC(".")),
  829. _DECL_FUNC(set_rh,3,_SC(".in")),
  830. _DECL_FUNC(set_rh_range,3,_SC(".in")),
  831. _DECL_FUNC(set_int,3,_SC(".ib")),
  832. _DECL_FUNC(set_debug,2,_SC(".b")),
  833. _DECL_FUNC(set_trace,2,_SC(".b")),
  834. _DECL_FUNC(add_column,2,_SC(".a")),
  835. _DECL_FUNC(add_columnex,4,_SC(".iaa")),
  836. _DECL_FUNC(set_column,3,_SC(".ia")),
  837. _DECL_FUNC(set_columnex,5,_SC(".iiaa")),
  838. _DECL_FUNC(del_column,2,_SC(".i")),
  839. _DECL_FUNC(set_scaling,2,_SC(".i")),
  840. _DECL_FUNC(unscale,1,_SC(".")),
  841. _DECL_FUNC(default_basis,1,_SC(".")),
  842. _DECL_FUNC(is_presolve,2,_SC(".i")),
  843. _DECL_FUNC(set_presolve,3,_SC(".ii")),
  844. _DECL_FUNC(set_row,3,_SC(".ia")),
  845. _DECL_FUNC(set_rowex,5,_SC(".iiaa")),
  846. {0,0}
  847. };
  848. #undef _DECL_FUNC
  849. typedef struct {
  850. const SQChar *Str;
  851. SQInteger Val;
  852. } KeyIntType, * KeyIntPtrType;
  853. static KeyIntType lpsolve_constants[] = {
  854. #define MK_CONST(c) {_SC(#c), c}
  855. MK_CONST(NEUTRAL),
  856. MK_CONST(CRITICAL),
  857. MK_CONST(SEVERE),
  858. MK_CONST(IMPORTANT),
  859. MK_CONST(NORMAL),
  860. MK_CONST(DETAILED),
  861. MK_CONST(FULL),
  862. MK_CONST(SCALE_NONE),
  863. MK_CONST(SCALE_EXTREME),
  864. MK_CONST(SCALE_RANGE),
  865. MK_CONST(SCALE_MEAN),
  866. MK_CONST(SCALE_GEOMETRIC),
  867. MK_CONST(SCALE_FUTURE1),
  868. MK_CONST(SCALE_FUTURE2),
  869. MK_CONST(SCALE_CURTISREID),
  870. MK_CONST(SCALE_LINEAR),
  871. MK_CONST(SCALE_QUADRATIC),
  872. MK_CONST(SCALE_LOGARITHMIC),
  873. MK_CONST(SCALE_USERWEIGHT),
  874. MK_CONST(SCALE_MAXTYPE),
  875. MK_CONST(SCALE_POWER2),
  876. MK_CONST(SCALE_EQUILIBRATE),
  877. MK_CONST(SCALE_INTEGERS),
  878. MK_CONST(SCALE_DYNUPDATE),
  879. MK_CONST(SCALE_ROWSONLY),
  880. MK_CONST(SCALE_COLSONLY),
  881. MK_CONST(SCALEMODEL_EQUILIBRATED),
  882. MK_CONST(SCALEMODEL_GEOMETRIC),
  883. MK_CONST(SCALEMODEL_ARITHMETIC),
  884. MK_CONST(SCALEMODEL_DYNAMIC),
  885. MK_CONST(SCALEMODEL_CURTISREID),
  886. /* Presolve defines */
  887. MK_CONST(PRESOLVE_NONE),
  888. MK_CONST(PRESOLVE_ROWS),
  889. MK_CONST(PRESOLVE_COLS),
  890. MK_CONST(PRESOLVE_LINDEP),
  891. MK_CONST(PRESOLVE_AGGREGATE),
  892. MK_CONST(PRESOLVE_SPARSER),
  893. MK_CONST(PRESOLVE_SOS),
  894. MK_CONST(PRESOLVE_REDUCEMIP),
  895. MK_CONST(PRESOLVE_KNAPSACK),
  896. MK_CONST(PRESOLVE_ELIMEQ2),
  897. MK_CONST(PRESOLVE_IMPLIEDFREE),
  898. MK_CONST(PRESOLVE_REDUCEGCD),
  899. MK_CONST(PRESOLVE_PROBEFIX),
  900. MK_CONST(PRESOLVE_PROBEREDUCE),
  901. MK_CONST(PRESOLVE_ROWDOMINATE),
  902. MK_CONST(PRESOLVE_COLDOMINATE),
  903. MK_CONST(PRESOLVE_MERGEROWS),
  904. MK_CONST(PRESOLVE_IMPLIEDSLK),
  905. MK_CONST(PRESOLVE_COLFIXDUAL),
  906. MK_CONST(PRESOLVE_BOUNDS),
  907. MK_CONST(PRESOLVE_LASTMASKMODE),
  908. MK_CONST(PRESOLVE_DUALS),
  909. MK_CONST(PRESOLVE_SENSDUALS),
  910. MK_CONST(FR),
  911. MK_CONST(LE),
  912. MK_CONST(GE),
  913. MK_CONST(EQ),
  914. MK_CONST(OF),
  915. {0,0}
  916. };
  917. #ifdef __cplusplus
  918. extern "C" {
  919. #endif
  920. SQRESULT sqext_register_lpsolve(HSQUIRRELVM v)
  921. {
  922. sq_pushstring(v,LPSOLVE_Tag,-1);
  923. sq_newclass(v,SQFalse);
  924. sq_settypetag(v,-1,(SQUserPointer)LPSOLVE_Tag);
  925. sq_insert_reg_funcs(v, sq_lpsolve_methods);
  926. //add constants
  927. KeyIntPtrType KeyIntPtr;
  928. for (KeyIntPtr = lpsolve_constants; KeyIntPtr->Str; KeyIntPtr++) {
  929. sq_pushstring(v, KeyIntPtr->Str, -1); //first the key
  930. sq_pushinteger(v, KeyIntPtr->Val); //then the value
  931. sq_newslot(v, -3, SQTrue); //store then
  932. }
  933. sq_newslot(v,-3,SQTrue);
  934. return 0;
  935. }
  936. #ifdef __cplusplus
  937. }
  938. #endif
  939. #endif //SQ_USE_LPSOLVE