lemon-project-template-glpk
diff deps/glpk/src/glpmpl.h @ 9:33de93886c88
Import GLPK 4.47
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 20:59:10 +0100 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/deps/glpk/src/glpmpl.h Sun Nov 06 20:59:10 2011 +0100 1.3 @@ -0,0 +1,2583 @@ 1.4 +/* glpmpl.h (GNU MathProg translator) */ 1.5 + 1.6 +/*********************************************************************** 1.7 +* This code is part of GLPK (GNU Linear Programming Kit). 1.8 +* 1.9 +* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 1.10 +* 2009, 2010, 2011 Andrew Makhorin, Department for Applied Informatics, 1.11 +* Moscow Aviation Institute, Moscow, Russia. All rights reserved. 1.12 +* E-mail: <mao@gnu.org>. 1.13 +* 1.14 +* GLPK is free software: you can redistribute it and/or modify it 1.15 +* under the terms of the GNU General Public License as published by 1.16 +* the Free Software Foundation, either version 3 of the License, or 1.17 +* (at your option) any later version. 1.18 +* 1.19 +* GLPK is distributed in the hope that it will be useful, but WITHOUT 1.20 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1.21 +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 1.22 +* License for more details. 1.23 +* 1.24 +* You should have received a copy of the GNU General Public License 1.25 +* along with GLPK. If not, see <http://www.gnu.org/licenses/>. 1.26 +***********************************************************************/ 1.27 + 1.28 +#ifndef GLPMPL_H 1.29 +#define GLPMPL_H 1.30 + 1.31 +#include "glpavl.h" 1.32 +#include "glprng.h" 1.33 + 1.34 +typedef struct MPL MPL; 1.35 +typedef char STRING; 1.36 +typedef struct SYMBOL SYMBOL; 1.37 +typedef struct TUPLE TUPLE; 1.38 +typedef struct ARRAY ELEMSET; 1.39 +typedef struct ELEMVAR ELEMVAR; 1.40 +typedef struct FORMULA FORMULA; 1.41 +typedef struct ELEMCON ELEMCON; 1.42 +typedef union VALUE VALUE; 1.43 +typedef struct ARRAY ARRAY; 1.44 +typedef struct MEMBER MEMBER; 1.45 +#if 1 1.46 +/* many C compilers have DOMAIN declared in <math.h> :( */ 1.47 +#undef DOMAIN 1.48 +#define DOMAIN DOMAIN1 1.49 +#endif 1.50 +typedef struct DOMAIN DOMAIN; 1.51 +typedef struct DOMAIN_BLOCK DOMAIN_BLOCK; 1.52 +typedef struct DOMAIN_SLOT DOMAIN_SLOT; 1.53 +typedef struct SET SET; 1.54 +typedef struct WITHIN WITHIN; 1.55 +typedef struct GADGET GADGET; 1.56 +typedef struct PARAMETER PARAMETER; 1.57 +typedef struct CONDITION CONDITION; 1.58 +typedef struct VARIABLE VARIABLE; 1.59 +typedef struct CONSTRAINT CONSTRAINT; 1.60 +typedef struct TABLE TABLE; 1.61 +typedef struct TABARG TABARG; 1.62 +typedef struct TABFLD TABFLD; 1.63 +typedef struct TABIN TABIN; 1.64 +typedef struct TABOUT TABOUT; 1.65 +typedef struct TABDCA TABDCA; 1.66 +typedef union OPERANDS OPERANDS; 1.67 +typedef struct ARG_LIST ARG_LIST; 1.68 +typedef struct CODE CODE; 1.69 +typedef struct CHECK CHECK; 1.70 +typedef struct DISPLAY DISPLAY; 1.71 +typedef struct DISPLAY1 DISPLAY1; 1.72 +typedef struct PRINTF PRINTF; 1.73 +typedef struct PRINTF1 PRINTF1; 1.74 +typedef struct FOR FOR; 1.75 +typedef struct STATEMENT STATEMENT; 1.76 +typedef struct TUPLE SLICE; 1.77 + 1.78 +/**********************************************************************/ 1.79 +/* * * TRANSLATOR DATABASE * * */ 1.80 +/**********************************************************************/ 1.81 + 1.82 +#define A_BINARY 101 /* something binary */ 1.83 +#define A_CHECK 102 /* check statement */ 1.84 +#define A_CONSTRAINT 103 /* model constraint */ 1.85 +#define A_DISPLAY 104 /* display statement */ 1.86 +#define A_ELEMCON 105 /* elemental constraint/objective */ 1.87 +#define A_ELEMSET 106 /* elemental set */ 1.88 +#define A_ELEMVAR 107 /* elemental variable */ 1.89 +#define A_EXPRESSION 108 /* expression */ 1.90 +#define A_FOR 109 /* for statement */ 1.91 +#define A_FORMULA 110 /* formula */ 1.92 +#define A_INDEX 111 /* dummy index */ 1.93 +#define A_INPUT 112 /* input table */ 1.94 +#define A_INTEGER 113 /* something integer */ 1.95 +#define A_LOGICAL 114 /* something logical */ 1.96 +#define A_MAXIMIZE 115 /* objective has to be maximized */ 1.97 +#define A_MINIMIZE 116 /* objective has to be minimized */ 1.98 +#define A_NONE 117 /* nothing */ 1.99 +#define A_NUMERIC 118 /* something numeric */ 1.100 +#define A_OUTPUT 119 /* output table */ 1.101 +#define A_PARAMETER 120 /* model parameter */ 1.102 +#define A_PRINTF 121 /* printf statement */ 1.103 +#define A_SET 122 /* model set */ 1.104 +#define A_SOLVE 123 /* solve statement */ 1.105 +#define A_SYMBOLIC 124 /* something symbolic */ 1.106 +#define A_TABLE 125 /* data table */ 1.107 +#define A_TUPLE 126 /* n-tuple */ 1.108 +#define A_VARIABLE 127 /* model variable */ 1.109 + 1.110 +#define MAX_LENGTH 100 1.111 +/* maximal length of any symbolic value (this includes symbolic names, 1.112 + numeric and string literals, and all symbolic values that may appear 1.113 + during the evaluation phase) */ 1.114 + 1.115 +#define CONTEXT_SIZE 60 1.116 +/* size of the context queue, in characters */ 1.117 + 1.118 +#define OUTBUF_SIZE 1024 1.119 +/* size of the output buffer, in characters */ 1.120 + 1.121 +struct MPL 1.122 +{ /* translator database */ 1.123 + /*--------------------------------------------------------------*/ 1.124 + /* scanning segment */ 1.125 + int line; 1.126 + /* number of the current text line */ 1.127 + int c; 1.128 + /* the current character or EOF */ 1.129 + int token; 1.130 + /* the current token: */ 1.131 +#define T_EOF 201 /* end of file */ 1.132 +#define T_NAME 202 /* symbolic name (model section only) */ 1.133 +#define T_SYMBOL 203 /* symbol (data section only) */ 1.134 +#define T_NUMBER 204 /* numeric literal */ 1.135 +#define T_STRING 205 /* string literal */ 1.136 +#define T_AND 206 /* and && */ 1.137 +#define T_BY 207 /* by */ 1.138 +#define T_CROSS 208 /* cross */ 1.139 +#define T_DIFF 209 /* diff */ 1.140 +#define T_DIV 210 /* div */ 1.141 +#define T_ELSE 211 /* else */ 1.142 +#define T_IF 212 /* if */ 1.143 +#define T_IN 213 /* in */ 1.144 +#define T_INFINITY 214 /* Infinity */ 1.145 +#define T_INTER 215 /* inter */ 1.146 +#define T_LESS 216 /* less */ 1.147 +#define T_MOD 217 /* mod */ 1.148 +#define T_NOT 218 /* not ! */ 1.149 +#define T_OR 219 /* or || */ 1.150 +#define T_SPTP 220 /* s.t. */ 1.151 +#define T_SYMDIFF 221 /* symdiff */ 1.152 +#define T_THEN 222 /* then */ 1.153 +#define T_UNION 223 /* union */ 1.154 +#define T_WITHIN 224 /* within */ 1.155 +#define T_PLUS 225 /* + */ 1.156 +#define T_MINUS 226 /* - */ 1.157 +#define T_ASTERISK 227 /* * */ 1.158 +#define T_SLASH 228 /* / */ 1.159 +#define T_POWER 229 /* ^ ** */ 1.160 +#define T_LT 230 /* < */ 1.161 +#define T_LE 231 /* <= */ 1.162 +#define T_EQ 232 /* = == */ 1.163 +#define T_GE 233 /* >= */ 1.164 +#define T_GT 234 /* > */ 1.165 +#define T_NE 235 /* <> != */ 1.166 +#define T_CONCAT 236 /* & */ 1.167 +#define T_BAR 237 /* | */ 1.168 +#define T_POINT 238 /* . */ 1.169 +#define T_COMMA 239 /* , */ 1.170 +#define T_COLON 240 /* : */ 1.171 +#define T_SEMICOLON 241 /* ; */ 1.172 +#define T_ASSIGN 242 /* := */ 1.173 +#define T_DOTS 243 /* .. */ 1.174 +#define T_LEFT 244 /* ( */ 1.175 +#define T_RIGHT 245 /* ) */ 1.176 +#define T_LBRACKET 246 /* [ */ 1.177 +#define T_RBRACKET 247 /* ] */ 1.178 +#define T_LBRACE 248 /* { */ 1.179 +#define T_RBRACE 249 /* } */ 1.180 +#define T_APPEND 250 /* >> */ 1.181 +#define T_TILDE 251 /* ~ */ 1.182 +#define T_INPUT 252 /* <- */ 1.183 + int imlen; 1.184 + /* length of the current token */ 1.185 + char *image; /* char image[MAX_LENGTH+1]; */ 1.186 + /* image of the current token */ 1.187 + double value; 1.188 + /* value of the current token (for T_NUMBER only) */ 1.189 + int b_token; 1.190 + /* the previous token */ 1.191 + int b_imlen; 1.192 + /* length of the previous token */ 1.193 + char *b_image; /* char b_image[MAX_LENGTH+1]; */ 1.194 + /* image of the previous token */ 1.195 + double b_value; 1.196 + /* value of the previous token (if token is T_NUMBER) */ 1.197 + int f_dots; 1.198 + /* if this flag is set, the next token should be recognized as 1.199 + T_DOTS, not as T_POINT */ 1.200 + int f_scan; 1.201 + /* if this flag is set, the next token is already scanned */ 1.202 + int f_token; 1.203 + /* the next token */ 1.204 + int f_imlen; 1.205 + /* length of the next token */ 1.206 + char *f_image; /* char f_image[MAX_LENGTH+1]; */ 1.207 + /* image of the next token */ 1.208 + double f_value; 1.209 + /* value of the next token (if token is T_NUMBER) */ 1.210 + char *context; /* char context[CONTEXT_SIZE]; */ 1.211 + /* context circular queue (not null-terminated!) */ 1.212 + int c_ptr; 1.213 + /* pointer to the current position in the context queue */ 1.214 + int flag_d; 1.215 + /* if this flag is set, the data section is being processed */ 1.216 + /*--------------------------------------------------------------*/ 1.217 + /* translating segment */ 1.218 + DMP *pool; 1.219 + /* memory pool used to allocate all data instances created during 1.220 + the translation phase */ 1.221 + AVL *tree; 1.222 + /* symbolic name table: 1.223 + node.type = A_INDEX => node.link -> DOMAIN_SLOT 1.224 + node.type = A_SET => node.link -> SET 1.225 + node.type = A_PARAMETER => node.link -> PARAMETER 1.226 + node.type = A_VARIABLE => node.link -> VARIABLE 1.227 + node.type = A_CONSTRANT => node.link -> CONSTRAINT */ 1.228 + STATEMENT *model; 1.229 + /* linked list of model statements in the original order */ 1.230 + int flag_x; 1.231 + /* if this flag is set, the current token being left parenthesis 1.232 + begins a slice that allows recognizing any undeclared symbolic 1.233 + names as dummy indices; this flag is automatically reset once 1.234 + the next token has been scanned */ 1.235 + int as_within; 1.236 + /* the warning "in understood as within" has been issued */ 1.237 + int as_in; 1.238 + /* the warning "within understood as in" has been issued */ 1.239 + int as_binary; 1.240 + /* the warning "logical understood as binary" has been issued */ 1.241 + int flag_s; 1.242 + /* if this flag is set, the solve statement has been parsed */ 1.243 + /*--------------------------------------------------------------*/ 1.244 + /* common segment */ 1.245 + DMP *strings; 1.246 + /* memory pool to allocate STRING data structures */ 1.247 + DMP *symbols; 1.248 + /* memory pool to allocate SYMBOL data structures */ 1.249 + DMP *tuples; 1.250 + /* memory pool to allocate TUPLE data structures */ 1.251 + DMP *arrays; 1.252 + /* memory pool to allocate ARRAY data structures */ 1.253 + DMP *members; 1.254 + /* memory pool to allocate MEMBER data structures */ 1.255 + DMP *elemvars; 1.256 + /* memory pool to allocate ELEMVAR data structures */ 1.257 + DMP *formulae; 1.258 + /* memory pool to allocate FORMULA data structures */ 1.259 + DMP *elemcons; 1.260 + /* memory pool to allocate ELEMCON data structures */ 1.261 + ARRAY *a_list; 1.262 + /* linked list of all arrays in the database */ 1.263 + char *sym_buf; /* char sym_buf[255+1]; */ 1.264 + /* working buffer used by the routine format_symbol */ 1.265 + char *tup_buf; /* char tup_buf[255+1]; */ 1.266 + /* working buffer used by the routine format_tuple */ 1.267 + /*--------------------------------------------------------------*/ 1.268 + /* generating/postsolving segment */ 1.269 + RNG *rand; 1.270 + /* pseudo-random number generator */ 1.271 + int flag_p; 1.272 + /* if this flag is set, the postsolving phase is in effect */ 1.273 + STATEMENT *stmt; 1.274 + /* model statement being currently executed */ 1.275 + TABDCA *dca; 1.276 + /* pointer to table driver communication area for table statement 1.277 + currently executed */ 1.278 + int m; 1.279 + /* number of rows in the problem, m >= 0 */ 1.280 + int n; 1.281 + /* number of columns in the problem, n >= 0 */ 1.282 + ELEMCON **row; /* ELEMCON *row[1+m]; */ 1.283 + /* row[0] is not used; 1.284 + row[i] is elemental constraint or objective, which corresponds 1.285 + to i-th row of the problem, 1 <= i <= m */ 1.286 + ELEMVAR **col; /* ELEMVAR *col[1+n]; */ 1.287 + /* col[0] is not used; 1.288 + col[j] is elemental variable, which corresponds to j-th column 1.289 + of the problem, 1 <= j <= n */ 1.290 + /*--------------------------------------------------------------*/ 1.291 + /* input/output segment */ 1.292 + XFILE *in_fp; 1.293 + /* stream assigned to the input text file */ 1.294 + char *in_file; 1.295 + /* name of the input text file */ 1.296 + XFILE *out_fp; 1.297 + /* stream assigned to the output text file used to write all data 1.298 + produced by display and printf statements; NULL means the data 1.299 + should be sent to stdout via the routine xprintf */ 1.300 + char *out_file; 1.301 + /* name of the output text file */ 1.302 +#if 0 /* 08/XI-2009 */ 1.303 + char *out_buf; /* char out_buf[OUTBUF_SIZE] */ 1.304 + /* buffer to accumulate output data */ 1.305 + int out_cnt; 1.306 + /* count of data bytes stored in the output buffer */ 1.307 +#endif 1.308 + XFILE *prt_fp; 1.309 + /* stream assigned to the print text file; may be NULL */ 1.310 + char *prt_file; 1.311 + /* name of the output print file */ 1.312 + /*--------------------------------------------------------------*/ 1.313 + /* solver interface segment */ 1.314 + jmp_buf jump; 1.315 + /* jump address for non-local go to in case of error */ 1.316 + int phase; 1.317 + /* phase of processing: 1.318 + 0 - database is being or has been initialized 1.319 + 1 - model section is being or has been read 1.320 + 2 - data section is being or has been read 1.321 + 3 - model is being or has been generated/postsolved 1.322 + 4 - model processing error has occurred */ 1.323 + char *mod_file; 1.324 + /* name of the input text file, which contains model section */ 1.325 + char *mpl_buf; /* char mpl_buf[255+1]; */ 1.326 + /* working buffer used by some interface routines */ 1.327 +}; 1.328 + 1.329 +/**********************************************************************/ 1.330 +/* * * PROCESSING MODEL SECTION * * */ 1.331 +/**********************************************************************/ 1.332 + 1.333 +#define alloc(type) ((type *)dmp_get_atomv(mpl->pool, sizeof(type))) 1.334 +/* allocate atom of given type */ 1.335 + 1.336 +#define enter_context _glp_mpl_enter_context 1.337 +void enter_context(MPL *mpl); 1.338 +/* enter current token into context queue */ 1.339 + 1.340 +#define print_context _glp_mpl_print_context 1.341 +void print_context(MPL *mpl); 1.342 +/* print current content of context queue */ 1.343 + 1.344 +#define get_char _glp_mpl_get_char 1.345 +void get_char(MPL *mpl); 1.346 +/* scan next character from input text file */ 1.347 + 1.348 +#define append_char _glp_mpl_append_char 1.349 +void append_char(MPL *mpl); 1.350 +/* append character to current token */ 1.351 + 1.352 +#define get_token _glp_mpl_get_token 1.353 +void get_token(MPL *mpl); 1.354 +/* scan next token from input text file */ 1.355 + 1.356 +#define unget_token _glp_mpl_unget_token 1.357 +void unget_token(MPL *mpl); 1.358 +/* return current token back to input stream */ 1.359 + 1.360 +#define is_keyword _glp_mpl_is_keyword 1.361 +int is_keyword(MPL *mpl, char *keyword); 1.362 +/* check if current token is given non-reserved keyword */ 1.363 + 1.364 +#define is_reserved _glp_mpl_is_reserved 1.365 +int is_reserved(MPL *mpl); 1.366 +/* check if current token is reserved keyword */ 1.367 + 1.368 +#define make_code _glp_mpl_make_code 1.369 +CODE *make_code(MPL *mpl, int op, OPERANDS *arg, int type, int dim); 1.370 +/* generate pseudo-code (basic routine) */ 1.371 + 1.372 +#define make_unary _glp_mpl_make_unary 1.373 +CODE *make_unary(MPL *mpl, int op, CODE *x, int type, int dim); 1.374 +/* generate pseudo-code for unary operation */ 1.375 + 1.376 +#define make_binary _glp_mpl_make_binary 1.377 +CODE *make_binary(MPL *mpl, int op, CODE *x, CODE *y, int type, 1.378 + int dim); 1.379 +/* generate pseudo-code for binary operation */ 1.380 + 1.381 +#define make_ternary _glp_mpl_make_ternary 1.382 +CODE *make_ternary(MPL *mpl, int op, CODE *x, CODE *y, CODE *z, 1.383 + int type, int dim); 1.384 +/* generate pseudo-code for ternary operation */ 1.385 + 1.386 +#define numeric_literal _glp_mpl_numeric_literal 1.387 +CODE *numeric_literal(MPL *mpl); 1.388 +/* parse reference to numeric literal */ 1.389 + 1.390 +#define string_literal _glp_mpl_string_literal 1.391 +CODE *string_literal(MPL *mpl); 1.392 +/* parse reference to string literal */ 1.393 + 1.394 +#define create_arg_list _glp_mpl_create_arg_list 1.395 +ARG_LIST *create_arg_list(MPL *mpl); 1.396 +/* create empty operands list */ 1.397 + 1.398 +#define expand_arg_list _glp_mpl_expand_arg_list 1.399 +ARG_LIST *expand_arg_list(MPL *mpl, ARG_LIST *list, CODE *x); 1.400 +/* append operand to operands list */ 1.401 + 1.402 +#define arg_list_len _glp_mpl_arg_list_len 1.403 +int arg_list_len(MPL *mpl, ARG_LIST *list); 1.404 +/* determine length of operands list */ 1.405 + 1.406 +#define subscript_list _glp_mpl_subscript_list 1.407 +ARG_LIST *subscript_list(MPL *mpl); 1.408 +/* parse subscript list */ 1.409 + 1.410 +#define object_reference _glp_mpl_object_reference 1.411 +CODE *object_reference(MPL *mpl); 1.412 +/* parse reference to named object */ 1.413 + 1.414 +#define numeric_argument _glp_mpl_numeric_argument 1.415 +CODE *numeric_argument(MPL *mpl, char *func); 1.416 +/* parse argument passed to built-in function */ 1.417 + 1.418 +#define symbolic_argument _glp_mpl_symbolic_argument 1.419 +CODE *symbolic_argument(MPL *mpl, char *func); 1.420 + 1.421 +#define elemset_argument _glp_mpl_elemset_argument 1.422 +CODE *elemset_argument(MPL *mpl, char *func); 1.423 + 1.424 +#define function_reference _glp_mpl_function_reference 1.425 +CODE *function_reference(MPL *mpl); 1.426 +/* parse reference to built-in function */ 1.427 + 1.428 +#define create_domain _glp_mpl_create_domain 1.429 +DOMAIN *create_domain(MPL *mpl); 1.430 +/* create empty domain */ 1.431 + 1.432 +#define create_block _glp_mpl_create_block 1.433 +DOMAIN_BLOCK *create_block(MPL *mpl); 1.434 +/* create empty domain block */ 1.435 + 1.436 +#define append_block _glp_mpl_append_block 1.437 +void append_block(MPL *mpl, DOMAIN *domain, DOMAIN_BLOCK *block); 1.438 +/* append domain block to specified domain */ 1.439 + 1.440 +#define append_slot _glp_mpl_append_slot 1.441 +DOMAIN_SLOT *append_slot(MPL *mpl, DOMAIN_BLOCK *block, char *name, 1.442 + CODE *code); 1.443 +/* create and append new slot to domain block */ 1.444 + 1.445 +#define expression_list _glp_mpl_expression_list 1.446 +CODE *expression_list(MPL *mpl); 1.447 +/* parse expression list */ 1.448 + 1.449 +#define literal_set _glp_mpl_literal_set 1.450 +CODE *literal_set(MPL *mpl, CODE *code); 1.451 +/* parse literal set */ 1.452 + 1.453 +#define indexing_expression _glp_mpl_indexing_expression 1.454 +DOMAIN *indexing_expression(MPL *mpl); 1.455 +/* parse indexing expression */ 1.456 + 1.457 +#define close_scope _glp_mpl_close_scope 1.458 +void close_scope(MPL *mpl, DOMAIN *domain); 1.459 +/* close scope of indexing expression */ 1.460 + 1.461 +#define iterated_expression _glp_mpl_iterated_expression 1.462 +CODE *iterated_expression(MPL *mpl); 1.463 +/* parse iterated expression */ 1.464 + 1.465 +#define domain_arity _glp_mpl_domain_arity 1.466 +int domain_arity(MPL *mpl, DOMAIN *domain); 1.467 +/* determine arity of domain */ 1.468 + 1.469 +#define set_expression _glp_mpl_set_expression 1.470 +CODE *set_expression(MPL *mpl); 1.471 +/* parse set expression */ 1.472 + 1.473 +#define branched_expression _glp_mpl_branched_expression 1.474 +CODE *branched_expression(MPL *mpl); 1.475 +/* parse conditional expression */ 1.476 + 1.477 +#define primary_expression _glp_mpl_primary_expression 1.478 +CODE *primary_expression(MPL *mpl); 1.479 +/* parse primary expression */ 1.480 + 1.481 +#define error_preceding _glp_mpl_error_preceding 1.482 +void error_preceding(MPL *mpl, char *opstr); 1.483 +/* raise error if preceding operand has wrong type */ 1.484 + 1.485 +#define error_following _glp_mpl_error_following 1.486 +void error_following(MPL *mpl, char *opstr); 1.487 +/* raise error if following operand has wrong type */ 1.488 + 1.489 +#define error_dimension _glp_mpl_error_dimension 1.490 +void error_dimension(MPL *mpl, char *opstr, int dim1, int dim2); 1.491 +/* raise error if operands have different dimension */ 1.492 + 1.493 +#define expression_0 _glp_mpl_expression_0 1.494 +CODE *expression_0(MPL *mpl); 1.495 +/* parse expression of level 0 */ 1.496 + 1.497 +#define expression_1 _glp_mpl_expression_1 1.498 +CODE *expression_1(MPL *mpl); 1.499 +/* parse expression of level 1 */ 1.500 + 1.501 +#define expression_2 _glp_mpl_expression_2 1.502 +CODE *expression_2(MPL *mpl); 1.503 +/* parse expression of level 2 */ 1.504 + 1.505 +#define expression_3 _glp_mpl_expression_3 1.506 +CODE *expression_3(MPL *mpl); 1.507 +/* parse expression of level 3 */ 1.508 + 1.509 +#define expression_4 _glp_mpl_expression_4 1.510 +CODE *expression_4(MPL *mpl); 1.511 +/* parse expression of level 4 */ 1.512 + 1.513 +#define expression_5 _glp_mpl_expression_5 1.514 +CODE *expression_5(MPL *mpl); 1.515 +/* parse expression of level 5 */ 1.516 + 1.517 +#define expression_6 _glp_mpl_expression_6 1.518 +CODE *expression_6(MPL *mpl); 1.519 +/* parse expression of level 6 */ 1.520 + 1.521 +#define expression_7 _glp_mpl_expression_7 1.522 +CODE *expression_7(MPL *mpl); 1.523 +/* parse expression of level 7 */ 1.524 + 1.525 +#define expression_8 _glp_mpl_expression_8 1.526 +CODE *expression_8(MPL *mpl); 1.527 +/* parse expression of level 8 */ 1.528 + 1.529 +#define expression_9 _glp_mpl_expression_9 1.530 +CODE *expression_9(MPL *mpl); 1.531 +/* parse expression of level 9 */ 1.532 + 1.533 +#define expression_10 _glp_mpl_expression_10 1.534 +CODE *expression_10(MPL *mpl); 1.535 +/* parse expression of level 10 */ 1.536 + 1.537 +#define expression_11 _glp_mpl_expression_11 1.538 +CODE *expression_11(MPL *mpl); 1.539 +/* parse expression of level 11 */ 1.540 + 1.541 +#define expression_12 _glp_mpl_expression_12 1.542 +CODE *expression_12(MPL *mpl); 1.543 +/* parse expression of level 12 */ 1.544 + 1.545 +#define expression_13 _glp_mpl_expression_13 1.546 +CODE *expression_13(MPL *mpl); 1.547 +/* parse expression of level 13 */ 1.548 + 1.549 +#define set_statement _glp_mpl_set_statement 1.550 +SET *set_statement(MPL *mpl); 1.551 +/* parse set statement */ 1.552 + 1.553 +#define parameter_statement _glp_mpl_parameter_statement 1.554 +PARAMETER *parameter_statement(MPL *mpl); 1.555 +/* parse parameter statement */ 1.556 + 1.557 +#define variable_statement _glp_mpl_variable_statement 1.558 +VARIABLE *variable_statement(MPL *mpl); 1.559 +/* parse variable statement */ 1.560 + 1.561 +#define constraint_statement _glp_mpl_constraint_statement 1.562 +CONSTRAINT *constraint_statement(MPL *mpl); 1.563 +/* parse constraint statement */ 1.564 + 1.565 +#define objective_statement _glp_mpl_objective_statement 1.566 +CONSTRAINT *objective_statement(MPL *mpl); 1.567 +/* parse objective statement */ 1.568 + 1.569 +#define table_statement _glp_mpl_table_statement 1.570 +TABLE *table_statement(MPL *mpl); 1.571 +/* parse table statement */ 1.572 + 1.573 +#define solve_statement _glp_mpl_solve_statement 1.574 +void *solve_statement(MPL *mpl); 1.575 +/* parse solve statement */ 1.576 + 1.577 +#define check_statement _glp_mpl_check_statement 1.578 +CHECK *check_statement(MPL *mpl); 1.579 +/* parse check statement */ 1.580 + 1.581 +#define display_statement _glp_mpl_display_statement 1.582 +DISPLAY *display_statement(MPL *mpl); 1.583 +/* parse display statement */ 1.584 + 1.585 +#define printf_statement _glp_mpl_printf_statement 1.586 +PRINTF *printf_statement(MPL *mpl); 1.587 +/* parse printf statement */ 1.588 + 1.589 +#define for_statement _glp_mpl_for_statement 1.590 +FOR *for_statement(MPL *mpl); 1.591 +/* parse for statement */ 1.592 + 1.593 +#define end_statement _glp_mpl_end_statement 1.594 +void end_statement(MPL *mpl); 1.595 +/* parse end statement */ 1.596 + 1.597 +#define simple_statement _glp_mpl_simple_statement 1.598 +STATEMENT *simple_statement(MPL *mpl, int spec); 1.599 +/* parse simple statement */ 1.600 + 1.601 +#define model_section _glp_mpl_model_section 1.602 +void model_section(MPL *mpl); 1.603 +/* parse model section */ 1.604 + 1.605 +/**********************************************************************/ 1.606 +/* * * PROCESSING DATA SECTION * * */ 1.607 +/**********************************************************************/ 1.608 + 1.609 +#if 2 + 2 == 5 1.610 +struct SLICE /* see TUPLE */ 1.611 +{ /* component of slice; the slice itself is associated with its 1.612 + first component; slices are similar to n-tuples with exception 1.613 + that some slice components (which are indicated by asterisks) 1.614 + don't refer to any symbols */ 1.615 + SYMBOL *sym; 1.616 + /* symbol, which this component refers to; can be NULL */ 1.617 + SLICE *next; 1.618 + /* the next component of slice */ 1.619 +}; 1.620 +#endif 1.621 + 1.622 +#define create_slice _glp_mpl_create_slice 1.623 +SLICE *create_slice(MPL *mpl); 1.624 +/* create slice */ 1.625 + 1.626 +#define expand_slice _glp_mpl_expand_slice 1.627 +SLICE *expand_slice 1.628 +( MPL *mpl, 1.629 + SLICE *slice, /* destroyed */ 1.630 + SYMBOL *sym /* destroyed */ 1.631 +); 1.632 +/* append new component to slice */ 1.633 + 1.634 +#define slice_dimen _glp_mpl_slice_dimen 1.635 +int slice_dimen 1.636 +( MPL *mpl, 1.637 + SLICE *slice /* not changed */ 1.638 +); 1.639 +/* determine dimension of slice */ 1.640 + 1.641 +#define slice_arity _glp_mpl_slice_arity 1.642 +int slice_arity 1.643 +( MPL *mpl, 1.644 + SLICE *slice /* not changed */ 1.645 +); 1.646 +/* determine arity of slice */ 1.647 + 1.648 +#define fake_slice _glp_mpl_fake_slice 1.649 +SLICE *fake_slice(MPL *mpl, int dim); 1.650 +/* create fake slice of all asterisks */ 1.651 + 1.652 +#define delete_slice _glp_mpl_delete_slice 1.653 +void delete_slice 1.654 +( MPL *mpl, 1.655 + SLICE *slice /* destroyed */ 1.656 +); 1.657 +/* delete slice */ 1.658 + 1.659 +#define is_number _glp_mpl_is_number 1.660 +int is_number(MPL *mpl); 1.661 +/* check if current token is number */ 1.662 + 1.663 +#define is_symbol _glp_mpl_is_symbol 1.664 +int is_symbol(MPL *mpl); 1.665 +/* check if current token is symbol */ 1.666 + 1.667 +#define is_literal _glp_mpl_is_literal 1.668 +int is_literal(MPL *mpl, char *literal); 1.669 +/* check if current token is given symbolic literal */ 1.670 + 1.671 +#define read_number _glp_mpl_read_number 1.672 +double read_number(MPL *mpl); 1.673 +/* read number */ 1.674 + 1.675 +#define read_symbol _glp_mpl_read_symbol 1.676 +SYMBOL *read_symbol(MPL *mpl); 1.677 +/* read symbol */ 1.678 + 1.679 +#define read_slice _glp_mpl_read_slice 1.680 +SLICE *read_slice 1.681 +( MPL *mpl, 1.682 + char *name, /* not changed */ 1.683 + int dim 1.684 +); 1.685 +/* read slice */ 1.686 + 1.687 +#define select_set _glp_mpl_select_set 1.688 +SET *select_set 1.689 +( MPL *mpl, 1.690 + char *name /* not changed */ 1.691 +); 1.692 +/* select set to saturate it with elemental sets */ 1.693 + 1.694 +#define simple_format _glp_mpl_simple_format 1.695 +void simple_format 1.696 +( MPL *mpl, 1.697 + SET *set, /* not changed */ 1.698 + MEMBER *memb, /* modified */ 1.699 + SLICE *slice /* not changed */ 1.700 +); 1.701 +/* read set data block in simple format */ 1.702 + 1.703 +#define matrix_format _glp_mpl_matrix_format 1.704 +void matrix_format 1.705 +( MPL *mpl, 1.706 + SET *set, /* not changed */ 1.707 + MEMBER *memb, /* modified */ 1.708 + SLICE *slice, /* not changed */ 1.709 + int tr 1.710 +); 1.711 +/* read set data block in matrix format */ 1.712 + 1.713 +#define set_data _glp_mpl_set_data 1.714 +void set_data(MPL *mpl); 1.715 +/* read set data */ 1.716 + 1.717 +#define select_parameter _glp_mpl_select_parameter 1.718 +PARAMETER *select_parameter 1.719 +( MPL *mpl, 1.720 + char *name /* not changed */ 1.721 +); 1.722 +/* select parameter to saturate it with data */ 1.723 + 1.724 +#define set_default _glp_mpl_set_default 1.725 +void set_default 1.726 +( MPL *mpl, 1.727 + PARAMETER *par, /* not changed */ 1.728 + SYMBOL *altval /* destroyed */ 1.729 +); 1.730 +/* set default parameter value */ 1.731 + 1.732 +#define read_value _glp_mpl_read_value 1.733 +MEMBER *read_value 1.734 +( MPL *mpl, 1.735 + PARAMETER *par, /* not changed */ 1.736 + TUPLE *tuple /* destroyed */ 1.737 +); 1.738 +/* read value and assign it to parameter member */ 1.739 + 1.740 +#define plain_format _glp_mpl_plain_format 1.741 +void plain_format 1.742 +( MPL *mpl, 1.743 + PARAMETER *par, /* not changed */ 1.744 + SLICE *slice /* not changed */ 1.745 +); 1.746 +/* read parameter data block in plain format */ 1.747 + 1.748 +#define tabular_format _glp_mpl_tabular_format 1.749 +void tabular_format 1.750 +( MPL *mpl, 1.751 + PARAMETER *par, /* not changed */ 1.752 + SLICE *slice, /* not changed */ 1.753 + int tr 1.754 +); 1.755 +/* read parameter data block in tabular format */ 1.756 + 1.757 +#define tabbing_format _glp_mpl_tabbing_format 1.758 +void tabbing_format 1.759 +( MPL *mpl, 1.760 + SYMBOL *altval /* not changed */ 1.761 +); 1.762 +/* read parameter data block in tabbing format */ 1.763 + 1.764 +#define parameter_data _glp_mpl_parameter_data 1.765 +void parameter_data(MPL *mpl); 1.766 +/* read parameter data */ 1.767 + 1.768 +#define data_section _glp_mpl_data_section 1.769 +void data_section(MPL *mpl); 1.770 +/* read data section */ 1.771 + 1.772 +/**********************************************************************/ 1.773 +/* * * FLOATING-POINT NUMBERS * * */ 1.774 +/**********************************************************************/ 1.775 + 1.776 +#define fp_add _glp_mpl_fp_add 1.777 +double fp_add(MPL *mpl, double x, double y); 1.778 +/* floating-point addition */ 1.779 + 1.780 +#define fp_sub _glp_mpl_fp_sub 1.781 +double fp_sub(MPL *mpl, double x, double y); 1.782 +/* floating-point subtraction */ 1.783 + 1.784 +#define fp_less _glp_mpl_fp_less 1.785 +double fp_less(MPL *mpl, double x, double y); 1.786 +/* floating-point non-negative subtraction */ 1.787 + 1.788 +#define fp_mul _glp_mpl_fp_mul 1.789 +double fp_mul(MPL *mpl, double x, double y); 1.790 +/* floating-point multiplication */ 1.791 + 1.792 +#define fp_div _glp_mpl_fp_div 1.793 +double fp_div(MPL *mpl, double x, double y); 1.794 +/* floating-point division */ 1.795 + 1.796 +#define fp_idiv _glp_mpl_fp_idiv 1.797 +double fp_idiv(MPL *mpl, double x, double y); 1.798 +/* floating-point quotient of exact division */ 1.799 + 1.800 +#define fp_mod _glp_mpl_fp_mod 1.801 +double fp_mod(MPL *mpl, double x, double y); 1.802 +/* floating-point remainder of exact division */ 1.803 + 1.804 +#define fp_power _glp_mpl_fp_power 1.805 +double fp_power(MPL *mpl, double x, double y); 1.806 +/* floating-point exponentiation (raise to power) */ 1.807 + 1.808 +#define fp_exp _glp_mpl_fp_exp 1.809 +double fp_exp(MPL *mpl, double x); 1.810 +/* floating-point base-e exponential */ 1.811 + 1.812 +#define fp_log _glp_mpl_fp_log 1.813 +double fp_log(MPL *mpl, double x); 1.814 +/* floating-point natural logarithm */ 1.815 + 1.816 +#define fp_log10 _glp_mpl_fp_log10 1.817 +double fp_log10(MPL *mpl, double x); 1.818 +/* floating-point common (decimal) logarithm */ 1.819 + 1.820 +#define fp_sqrt _glp_mpl_fp_sqrt 1.821 +double fp_sqrt(MPL *mpl, double x); 1.822 +/* floating-point square root */ 1.823 + 1.824 +#define fp_sin _glp_mpl_fp_sin 1.825 +double fp_sin(MPL *mpl, double x); 1.826 +/* floating-point trigonometric sine */ 1.827 + 1.828 +#define fp_cos _glp_mpl_fp_cos 1.829 +double fp_cos(MPL *mpl, double x); 1.830 +/* floating-point trigonometric cosine */ 1.831 + 1.832 +#define fp_atan _glp_mpl_fp_atan 1.833 +double fp_atan(MPL *mpl, double x); 1.834 +/* floating-point trigonometric arctangent */ 1.835 + 1.836 +#define fp_atan2 _glp_mpl_fp_atan2 1.837 +double fp_atan2(MPL *mpl, double y, double x); 1.838 +/* floating-point trigonometric arctangent */ 1.839 + 1.840 +#define fp_round _glp_mpl_fp_round 1.841 +double fp_round(MPL *mpl, double x, double n); 1.842 +/* round floating-point value to n fractional digits */ 1.843 + 1.844 +#define fp_trunc _glp_mpl_fp_trunc 1.845 +double fp_trunc(MPL *mpl, double x, double n); 1.846 +/* truncate floating-point value to n fractional digits */ 1.847 + 1.848 +/**********************************************************************/ 1.849 +/* * * PSEUDO-RANDOM NUMBER GENERATORS * * */ 1.850 +/**********************************************************************/ 1.851 + 1.852 +#define fp_irand224 _glp_mpl_fp_irand224 1.853 +double fp_irand224(MPL *mpl); 1.854 +/* pseudo-random integer in the range [0, 2^24) */ 1.855 + 1.856 +#define fp_uniform01 _glp_mpl_fp_uniform01 1.857 +double fp_uniform01(MPL *mpl); 1.858 +/* pseudo-random number in the range [0, 1) */ 1.859 + 1.860 +#define fp_uniform _glp_mpl_uniform 1.861 +double fp_uniform(MPL *mpl, double a, double b); 1.862 +/* pseudo-random number in the range [a, b) */ 1.863 + 1.864 +#define fp_normal01 _glp_mpl_fp_normal01 1.865 +double fp_normal01(MPL *mpl); 1.866 +/* Gaussian random variate with mu = 0 and sigma = 1 */ 1.867 + 1.868 +#define fp_normal _glp_mpl_fp_normal 1.869 +double fp_normal(MPL *mpl, double mu, double sigma); 1.870 +/* Gaussian random variate with specified mu and sigma */ 1.871 + 1.872 +/**********************************************************************/ 1.873 +/* * * DATE/TIME * * */ 1.874 +/**********************************************************************/ 1.875 + 1.876 +#define fn_gmtime _glp_mpl_fn_gmtime 1.877 +double fn_gmtime(MPL *mpl); 1.878 +/* obtain the current calendar time (UTC) */ 1.879 + 1.880 +#define fn_str2time _glp_mpl_fn_str2time 1.881 +double fn_str2time(MPL *mpl, const char *str, const char *fmt); 1.882 +/* convert character string to the calendar time */ 1.883 + 1.884 +#define fn_time2str _glp_mpl_fn_time2str 1.885 +void fn_time2str(MPL *mpl, char *str, double t, const char *fmt); 1.886 +/* convert the calendar time to character string */ 1.887 + 1.888 +/**********************************************************************/ 1.889 +/* * * CHARACTER STRINGS * * */ 1.890 +/**********************************************************************/ 1.891 + 1.892 +#define create_string _glp_mpl_create_string 1.893 +STRING *create_string 1.894 +( MPL *mpl, 1.895 + char buf[MAX_LENGTH+1] /* not changed */ 1.896 +); 1.897 +/* create character string */ 1.898 + 1.899 +#define copy_string _glp_mpl_copy_string 1.900 +STRING *copy_string 1.901 +( MPL *mpl, 1.902 + STRING *str /* not changed */ 1.903 +); 1.904 +/* make copy of character string */ 1.905 + 1.906 +#define compare_strings _glp_mpl_compare_strings 1.907 +int compare_strings 1.908 +( MPL *mpl, 1.909 + STRING *str1, /* not changed */ 1.910 + STRING *str2 /* not changed */ 1.911 +); 1.912 +/* compare one character string with another */ 1.913 + 1.914 +#define fetch_string _glp_mpl_fetch_string 1.915 +char *fetch_string 1.916 +( MPL *mpl, 1.917 + STRING *str, /* not changed */ 1.918 + char buf[MAX_LENGTH+1] /* modified */ 1.919 +); 1.920 +/* extract content of character string */ 1.921 + 1.922 +#define delete_string _glp_mpl_delete_string 1.923 +void delete_string 1.924 +( MPL *mpl, 1.925 + STRING *str /* destroyed */ 1.926 +); 1.927 +/* delete character string */ 1.928 + 1.929 +/**********************************************************************/ 1.930 +/* * * SYMBOLS * * */ 1.931 +/**********************************************************************/ 1.932 + 1.933 +struct SYMBOL 1.934 +{ /* symbol (numeric or abstract quantity) */ 1.935 + double num; 1.936 + /* numeric value of symbol (used only if str == NULL) */ 1.937 + STRING *str; 1.938 + /* abstract value of symbol (used only if str != NULL) */ 1.939 +}; 1.940 + 1.941 +#define create_symbol_num _glp_mpl_create_symbol_num 1.942 +SYMBOL *create_symbol_num(MPL *mpl, double num); 1.943 +/* create symbol of numeric type */ 1.944 + 1.945 +#define create_symbol_str _glp_mpl_create_symbol_str 1.946 +SYMBOL *create_symbol_str 1.947 +( MPL *mpl, 1.948 + STRING *str /* destroyed */ 1.949 +); 1.950 +/* create symbol of abstract type */ 1.951 + 1.952 +#define copy_symbol _glp_mpl_copy_symbol 1.953 +SYMBOL *copy_symbol 1.954 +( MPL *mpl, 1.955 + SYMBOL *sym /* not changed */ 1.956 +); 1.957 +/* make copy of symbol */ 1.958 + 1.959 +#define compare_symbols _glp_mpl_compare_symbols 1.960 +int compare_symbols 1.961 +( MPL *mpl, 1.962 + SYMBOL *sym1, /* not changed */ 1.963 + SYMBOL *sym2 /* not changed */ 1.964 +); 1.965 +/* compare one symbol with another */ 1.966 + 1.967 +#define delete_symbol _glp_mpl_delete_symbol 1.968 +void delete_symbol 1.969 +( MPL *mpl, 1.970 + SYMBOL *sym /* destroyed */ 1.971 +); 1.972 +/* delete symbol */ 1.973 + 1.974 +#define format_symbol _glp_mpl_format_symbol 1.975 +char *format_symbol 1.976 +( MPL *mpl, 1.977 + SYMBOL *sym /* not changed */ 1.978 +); 1.979 +/* format symbol for displaying or printing */ 1.980 + 1.981 +#define concat_symbols _glp_mpl_concat_symbols 1.982 +SYMBOL *concat_symbols 1.983 +( MPL *mpl, 1.984 + SYMBOL *sym1, /* destroyed */ 1.985 + SYMBOL *sym2 /* destroyed */ 1.986 +); 1.987 +/* concatenate one symbol with another */ 1.988 + 1.989 +/**********************************************************************/ 1.990 +/* * * N-TUPLES * * */ 1.991 +/**********************************************************************/ 1.992 + 1.993 +struct TUPLE 1.994 +{ /* component of n-tuple; the n-tuple itself is associated with 1.995 + its first component; (note that 0-tuple has no components) */ 1.996 + SYMBOL *sym; 1.997 + /* symbol, which the component refers to; cannot be NULL */ 1.998 + TUPLE *next; 1.999 + /* the next component of n-tuple */ 1.1000 +}; 1.1001 + 1.1002 +#define create_tuple _glp_mpl_create_tuple 1.1003 +TUPLE *create_tuple(MPL *mpl); 1.1004 +/* create n-tuple */ 1.1005 + 1.1006 +#define expand_tuple _glp_mpl_expand_tuple 1.1007 +TUPLE *expand_tuple 1.1008 +( MPL *mpl, 1.1009 + TUPLE *tuple, /* destroyed */ 1.1010 + SYMBOL *sym /* destroyed */ 1.1011 +); 1.1012 +/* append symbol to n-tuple */ 1.1013 + 1.1014 +#define tuple_dimen _glp_mpl_tuple_dimen 1.1015 +int tuple_dimen 1.1016 +( MPL *mpl, 1.1017 + TUPLE *tuple /* not changed */ 1.1018 +); 1.1019 +/* determine dimension of n-tuple */ 1.1020 + 1.1021 +#define copy_tuple _glp_mpl_copy_tuple 1.1022 +TUPLE *copy_tuple 1.1023 +( MPL *mpl, 1.1024 + TUPLE *tuple /* not changed */ 1.1025 +); 1.1026 +/* make copy of n-tuple */ 1.1027 + 1.1028 +#define compare_tuples _glp_mpl_compare_tuples 1.1029 +int compare_tuples 1.1030 +( MPL *mpl, 1.1031 + TUPLE *tuple1, /* not changed */ 1.1032 + TUPLE *tuple2 /* not changed */ 1.1033 +); 1.1034 +/* compare one n-tuple with another */ 1.1035 + 1.1036 +#define build_subtuple _glp_mpl_build_subtuple 1.1037 +TUPLE *build_subtuple 1.1038 +( MPL *mpl, 1.1039 + TUPLE *tuple, /* not changed */ 1.1040 + int dim 1.1041 +); 1.1042 +/* build subtuple of given n-tuple */ 1.1043 + 1.1044 +#define delete_tuple _glp_mpl_delete_tuple 1.1045 +void delete_tuple 1.1046 +( MPL *mpl, 1.1047 + TUPLE *tuple /* destroyed */ 1.1048 +); 1.1049 +/* delete n-tuple */ 1.1050 + 1.1051 +#define format_tuple _glp_mpl_format_tuple 1.1052 +char *format_tuple 1.1053 +( MPL *mpl, 1.1054 + int c, 1.1055 + TUPLE *tuple /* not changed */ 1.1056 +); 1.1057 +/* format n-tuple for displaying or printing */ 1.1058 + 1.1059 +/**********************************************************************/ 1.1060 +/* * * ELEMENTAL SETS * * */ 1.1061 +/**********************************************************************/ 1.1062 + 1.1063 +#if 2 + 2 == 5 1.1064 +struct ELEMSET /* see ARRAY */ 1.1065 +{ /* elemental set of n-tuples; formally it is a "value" assigned 1.1066 + to members of model sets (like numbers and symbols, which are 1.1067 + values assigned to members of model parameters); note that a 1.1068 + simple model set is not an elemental set, it is 0-dimensional 1.1069 + array, the only member of which (if it exists) is assigned an 1.1070 + elemental set */ 1.1071 +#endif 1.1072 + 1.1073 +#define create_elemset _glp_mpl_create_elemset 1.1074 +ELEMSET *create_elemset(MPL *mpl, int dim); 1.1075 +/* create elemental set */ 1.1076 + 1.1077 +#define find_tuple _glp_mpl_find_tuple 1.1078 +MEMBER *find_tuple 1.1079 +( MPL *mpl, 1.1080 + ELEMSET *set, /* not changed */ 1.1081 + TUPLE *tuple /* not changed */ 1.1082 +); 1.1083 +/* check if elemental set contains given n-tuple */ 1.1084 + 1.1085 +#define add_tuple _glp_mpl_add_tuple 1.1086 +MEMBER *add_tuple 1.1087 +( MPL *mpl, 1.1088 + ELEMSET *set, /* modified */ 1.1089 + TUPLE *tuple /* destroyed */ 1.1090 +); 1.1091 +/* add new n-tuple to elemental set */ 1.1092 + 1.1093 +#define check_then_add _glp_mpl_check_then_add 1.1094 +MEMBER *check_then_add 1.1095 +( MPL *mpl, 1.1096 + ELEMSET *set, /* modified */ 1.1097 + TUPLE *tuple /* destroyed */ 1.1098 +); 1.1099 +/* check and add new n-tuple to elemental set */ 1.1100 + 1.1101 +#define copy_elemset _glp_mpl_copy_elemset 1.1102 +ELEMSET *copy_elemset 1.1103 +( MPL *mpl, 1.1104 + ELEMSET *set /* not changed */ 1.1105 +); 1.1106 +/* make copy of elemental set */ 1.1107 + 1.1108 +#define delete_elemset _glp_mpl_delete_elemset 1.1109 +void delete_elemset 1.1110 +( MPL *mpl, 1.1111 + ELEMSET *set /* destroyed */ 1.1112 +); 1.1113 +/* delete elemental set */ 1.1114 + 1.1115 +#define arelset_size _glp_mpl_arelset_size 1.1116 +int arelset_size(MPL *mpl, double t0, double tf, double dt); 1.1117 +/* compute size of "arithmetic" elemental set */ 1.1118 + 1.1119 +#define arelset_member _glp_mpl_arelset_member 1.1120 +double arelset_member(MPL *mpl, double t0, double tf, double dt, int j); 1.1121 +/* compute member of "arithmetic" elemental set */ 1.1122 + 1.1123 +#define create_arelset _glp_mpl_create_arelset 1.1124 +ELEMSET *create_arelset(MPL *mpl, double t0, double tf, double dt); 1.1125 +/* create "arithmetic" elemental set */ 1.1126 + 1.1127 +#define set_union _glp_mpl_set_union 1.1128 +ELEMSET *set_union 1.1129 +( MPL *mpl, 1.1130 + ELEMSET *X, /* destroyed */ 1.1131 + ELEMSET *Y /* destroyed */ 1.1132 +); 1.1133 +/* union of two elemental sets */ 1.1134 + 1.1135 +#define set_diff _glp_mpl_set_diff 1.1136 +ELEMSET *set_diff 1.1137 +( MPL *mpl, 1.1138 + ELEMSET *X, /* destroyed */ 1.1139 + ELEMSET *Y /* destroyed */ 1.1140 +); 1.1141 +/* difference between two elemental sets */ 1.1142 + 1.1143 +#define set_symdiff _glp_mpl_set_symdiff 1.1144 +ELEMSET *set_symdiff 1.1145 +( MPL *mpl, 1.1146 + ELEMSET *X, /* destroyed */ 1.1147 + ELEMSET *Y /* destroyed */ 1.1148 +); 1.1149 +/* symmetric difference between two elemental sets */ 1.1150 + 1.1151 +#define set_inter _glp_mpl_set_inter 1.1152 +ELEMSET *set_inter 1.1153 +( MPL *mpl, 1.1154 + ELEMSET *X, /* destroyed */ 1.1155 + ELEMSET *Y /* destroyed */ 1.1156 +); 1.1157 +/* intersection of two elemental sets */ 1.1158 + 1.1159 +#define set_cross _glp_mpl_set_cross 1.1160 +ELEMSET *set_cross 1.1161 +( MPL *mpl, 1.1162 + ELEMSET *X, /* destroyed */ 1.1163 + ELEMSET *Y /* destroyed */ 1.1164 +); 1.1165 +/* cross (Cartesian) product of two elemental sets */ 1.1166 + 1.1167 +/**********************************************************************/ 1.1168 +/* * * ELEMENTAL VARIABLES * * */ 1.1169 +/**********************************************************************/ 1.1170 + 1.1171 +struct ELEMVAR 1.1172 +{ /* elemental variable; formally it is a "value" assigned to 1.1173 + members of model variables (like numbers and symbols, which 1.1174 + are values assigned to members of model parameters) */ 1.1175 + int j; 1.1176 + /* LP column number assigned to this elemental variable */ 1.1177 + VARIABLE *var; 1.1178 + /* model variable, which contains this elemental variable */ 1.1179 + MEMBER *memb; 1.1180 + /* array member, which is assigned this elemental variable */ 1.1181 + double lbnd; 1.1182 + /* lower bound */ 1.1183 + double ubnd; 1.1184 + /* upper bound */ 1.1185 + double temp; 1.1186 + /* working quantity used in operations on linear forms; normally 1.1187 + it contains floating-point zero */ 1.1188 +#if 1 /* 15/V-2010 */ 1.1189 + int stat; 1.1190 + double prim, dual; 1.1191 + /* solution components provided by the solver */ 1.1192 +#endif 1.1193 +}; 1.1194 + 1.1195 +/**********************************************************************/ 1.1196 +/* * * LINEAR FORMS * * */ 1.1197 +/**********************************************************************/ 1.1198 + 1.1199 +struct FORMULA 1.1200 +{ /* term of linear form c * x, where c is a coefficient, x is an 1.1201 + elemental variable; the linear form itself is the sum of terms 1.1202 + and is associated with its first term; (note that the linear 1.1203 + form may be empty that means the sum is equal to zero) */ 1.1204 + double coef; 1.1205 + /* coefficient at elemental variable or constant term */ 1.1206 + ELEMVAR *var; 1.1207 + /* reference to elemental variable; NULL means constant term */ 1.1208 + FORMULA *next; 1.1209 + /* the next term of linear form */ 1.1210 +}; 1.1211 + 1.1212 +#define constant_term _glp_mpl_constant_term 1.1213 +FORMULA *constant_term(MPL *mpl, double coef); 1.1214 +/* create constant term */ 1.1215 + 1.1216 +#define single_variable _glp_mpl_single_variable 1.1217 +FORMULA *single_variable 1.1218 +( MPL *mpl, 1.1219 + ELEMVAR *var /* referenced */ 1.1220 +); 1.1221 +/* create single variable */ 1.1222 + 1.1223 +#define copy_formula _glp_mpl_copy_formula 1.1224 +FORMULA *copy_formula 1.1225 +( MPL *mpl, 1.1226 + FORMULA *form /* not changed */ 1.1227 +); 1.1228 +/* make copy of linear form */ 1.1229 + 1.1230 +#define delete_formula _glp_mpl_delete_formula 1.1231 +void delete_formula 1.1232 +( MPL *mpl, 1.1233 + FORMULA *form /* destroyed */ 1.1234 +); 1.1235 +/* delete linear form */ 1.1236 + 1.1237 +#define linear_comb _glp_mpl_linear_comb 1.1238 +FORMULA *linear_comb 1.1239 +( MPL *mpl, 1.1240 + double a, FORMULA *fx, /* destroyed */ 1.1241 + double b, FORMULA *fy /* destroyed */ 1.1242 +); 1.1243 +/* linear combination of two linear forms */ 1.1244 + 1.1245 +#define remove_constant _glp_mpl_remove_constant 1.1246 +FORMULA *remove_constant 1.1247 +( MPL *mpl, 1.1248 + FORMULA *form, /* destroyed */ 1.1249 + double *coef /* modified */ 1.1250 +); 1.1251 +/* remove constant term from linear form */ 1.1252 + 1.1253 +#define reduce_terms _glp_mpl_reduce_terms 1.1254 +FORMULA *reduce_terms 1.1255 +( MPL *mpl, 1.1256 + FORMULA *form /* destroyed */ 1.1257 +); 1.1258 +/* reduce identical terms in linear form */ 1.1259 + 1.1260 +/**********************************************************************/ 1.1261 +/* * * ELEMENTAL CONSTRAINTS * * */ 1.1262 +/**********************************************************************/ 1.1263 + 1.1264 +struct ELEMCON 1.1265 +{ /* elemental constraint; formally it is a "value" assigned to 1.1266 + members of model constraints (like numbers or symbols, which 1.1267 + are values assigned to members of model parameters) */ 1.1268 + int i; 1.1269 + /* LP row number assigned to this elemental constraint */ 1.1270 + CONSTRAINT *con; 1.1271 + /* model constraint, which contains this elemental constraint */ 1.1272 + MEMBER *memb; 1.1273 + /* array member, which is assigned this elemental constraint */ 1.1274 + FORMULA *form; 1.1275 + /* linear form */ 1.1276 + double lbnd; 1.1277 + /* lower bound */ 1.1278 + double ubnd; 1.1279 + /* upper bound */ 1.1280 +#if 1 /* 15/V-2010 */ 1.1281 + int stat; 1.1282 + double prim, dual; 1.1283 + /* solution components provided by the solver */ 1.1284 +#endif 1.1285 +}; 1.1286 + 1.1287 +/**********************************************************************/ 1.1288 +/* * * GENERIC VALUES * * */ 1.1289 +/**********************************************************************/ 1.1290 + 1.1291 +union VALUE 1.1292 +{ /* generic value, which can be assigned to object member or be a 1.1293 + result of evaluation of expression */ 1.1294 + /* indicator that specifies the particular type of generic value 1.1295 + is stored in the corresponding array or pseudo-code descriptor 1.1296 + and can be one of the following: 1.1297 + A_NONE - no value 1.1298 + A_NUMERIC - floating-point number 1.1299 + A_SYMBOLIC - symbol 1.1300 + A_LOGICAL - logical value 1.1301 + A_TUPLE - n-tuple 1.1302 + A_ELEMSET - elemental set 1.1303 + A_ELEMVAR - elemental variable 1.1304 + A_FORMULA - linear form 1.1305 + A_ELEMCON - elemental constraint */ 1.1306 + void *none; /* null */ 1.1307 + double num; /* value */ 1.1308 + SYMBOL *sym; /* value */ 1.1309 + int bit; /* value */ 1.1310 + TUPLE *tuple; /* value */ 1.1311 + ELEMSET *set; /* value */ 1.1312 + ELEMVAR *var; /* reference */ 1.1313 + FORMULA *form; /* value */ 1.1314 + ELEMCON *con; /* reference */ 1.1315 +}; 1.1316 + 1.1317 +#define delete_value _glp_mpl_delete_value 1.1318 +void delete_value 1.1319 +( MPL *mpl, 1.1320 + int type, 1.1321 + VALUE *value /* content destroyed */ 1.1322 +); 1.1323 +/* delete generic value */ 1.1324 + 1.1325 +/**********************************************************************/ 1.1326 +/* * * SYMBOLICALLY INDEXED ARRAYS * * */ 1.1327 +/**********************************************************************/ 1.1328 + 1.1329 +struct ARRAY 1.1330 +{ /* multi-dimensional array, a set of members indexed over simple 1.1331 + or compound sets of symbols; arrays are used to represent the 1.1332 + contents of model objects (i.e. sets, parameters, variables, 1.1333 + constraints, and objectives); arrays also are used as "values" 1.1334 + that are assigned to members of set objects, in which case the 1.1335 + array itself represents an elemental set */ 1.1336 + int type; 1.1337 + /* type of generic values assigned to the array members: 1.1338 + A_NONE - none (members have no assigned values) 1.1339 + A_NUMERIC - floating-point numbers 1.1340 + A_SYMBOLIC - symbols 1.1341 + A_ELEMSET - elemental sets 1.1342 + A_ELEMVAR - elemental variables 1.1343 + A_ELEMCON - elemental constraints */ 1.1344 + int dim; 1.1345 + /* dimension of the array that determines number of components in 1.1346 + n-tuples for all members of the array, dim >= 0; dim = 0 means 1.1347 + the array is 0-dimensional */ 1.1348 + int size; 1.1349 + /* size of the array, i.e. number of its members */ 1.1350 + MEMBER *head; 1.1351 + /* the first array member; NULL means the array is empty */ 1.1352 + MEMBER *tail; 1.1353 + /* the last array member; NULL means the array is empty */ 1.1354 + AVL *tree; 1.1355 + /* the search tree intended to find array members for logarithmic 1.1356 + time; NULL means the search tree doesn't exist */ 1.1357 + ARRAY *prev; 1.1358 + /* the previous array in the translator database */ 1.1359 + ARRAY *next; 1.1360 + /* the next array in the translator database */ 1.1361 +}; 1.1362 + 1.1363 +struct MEMBER 1.1364 +{ /* array member */ 1.1365 + TUPLE *tuple; 1.1366 + /* n-tuple, which identifies the member; number of its components 1.1367 + is the same for all members within the array and determined by 1.1368 + the array dimension; duplicate members are not allowed */ 1.1369 + MEMBER *next; 1.1370 + /* the next array member */ 1.1371 + VALUE value; 1.1372 + /* generic value assigned to the member */ 1.1373 +}; 1.1374 + 1.1375 +#define create_array _glp_mpl_create_array 1.1376 +ARRAY *create_array(MPL *mpl, int type, int dim); 1.1377 +/* create array */ 1.1378 + 1.1379 +#define find_member _glp_mpl_find_member 1.1380 +MEMBER *find_member 1.1381 +( MPL *mpl, 1.1382 + ARRAY *array, /* not changed */ 1.1383 + TUPLE *tuple /* not changed */ 1.1384 +); 1.1385 +/* find array member with given n-tuple */ 1.1386 + 1.1387 +#define add_member _glp_mpl_add_member 1.1388 +MEMBER *add_member 1.1389 +( MPL *mpl, 1.1390 + ARRAY *array, /* modified */ 1.1391 + TUPLE *tuple /* destroyed */ 1.1392 +); 1.1393 +/* add new member to array */ 1.1394 + 1.1395 +#define delete_array _glp_mpl_delete_array 1.1396 +void delete_array 1.1397 +( MPL *mpl, 1.1398 + ARRAY *array /* destroyed */ 1.1399 +); 1.1400 +/* delete array */ 1.1401 + 1.1402 +/**********************************************************************/ 1.1403 +/* * * DOMAINS AND DUMMY INDICES * * */ 1.1404 +/**********************************************************************/ 1.1405 + 1.1406 +struct DOMAIN 1.1407 +{ /* domain (a simple or compound set); syntactically domain looks 1.1408 + like '{ i in I, (j,k) in S, t in T : <predicate> }'; domains 1.1409 + are used to define sets, over which model objects are indexed, 1.1410 + and also as constituents of iterated operators */ 1.1411 + DOMAIN_BLOCK *list; 1.1412 + /* linked list of domain blocks (in the example above such blocks 1.1413 + are 'i in I', '(j,k) in S', and 't in T'); this list cannot be 1.1414 + empty */ 1.1415 + CODE *code; 1.1416 + /* pseudo-code for computing the logical predicate, which follows 1.1417 + the colon; NULL means no predicate is specified */ 1.1418 +}; 1.1419 + 1.1420 +struct DOMAIN_BLOCK 1.1421 +{ /* domain block; syntactically domain blocks look like 'i in I', 1.1422 + '(j,k) in S', and 't in T' in the example above (in the sequel 1.1423 + sets like I, S, and T are called basic sets) */ 1.1424 + DOMAIN_SLOT *list; 1.1425 + /* linked list of domain slots (i.e. indexing positions); number 1.1426 + of slots in this list is the same as dimension of n-tuples in 1.1427 + the basic set; this list cannot be empty */ 1.1428 + CODE *code; 1.1429 + /* pseudo-code for computing basic set; cannot be NULL */ 1.1430 + TUPLE *backup; 1.1431 + /* if this n-tuple is not empty, current values of dummy indices 1.1432 + in the domain block are the same as components of this n-tuple 1.1433 + (note that this n-tuple may have larger dimension than number 1.1434 + of dummy indices in this block, in which case extra components 1.1435 + are ignored); this n-tuple is used to restore former values of 1.1436 + dummy indices, if they were changed due to recursive calls to 1.1437 + the domain block */ 1.1438 + DOMAIN_BLOCK *next; 1.1439 + /* the next block in the same domain */ 1.1440 +}; 1.1441 + 1.1442 +struct DOMAIN_SLOT 1.1443 +{ /* domain slot; it specifies an individual indexing position and 1.1444 + defines the corresponding dummy index */ 1.1445 + char *name; 1.1446 + /* symbolic name of the dummy index; null pointer means the dummy 1.1447 + index is not explicitly specified */ 1.1448 + CODE *code; 1.1449 + /* pseudo-code for computing symbolic value, at which the dummy 1.1450 + index is bound; NULL means the dummy index is free within the 1.1451 + domain scope */ 1.1452 + SYMBOL *value; 1.1453 + /* current value assigned to the dummy index; NULL means no value 1.1454 + is assigned at the moment */ 1.1455 + CODE *list; 1.1456 + /* linked list of pseudo-codes with operation O_INDEX referring 1.1457 + to this slot; this linked list is used to invalidate resultant 1.1458 + values of the operation, which depend on this dummy index */ 1.1459 + DOMAIN_SLOT *next; 1.1460 + /* the next slot in the same domain block */ 1.1461 +}; 1.1462 + 1.1463 +#define assign_dummy_index _glp_mpl_assign_dummy_index 1.1464 +void assign_dummy_index 1.1465 +( MPL *mpl, 1.1466 + DOMAIN_SLOT *slot, /* modified */ 1.1467 + SYMBOL *value /* not changed */ 1.1468 +); 1.1469 +/* assign new value to dummy index */ 1.1470 + 1.1471 +#define update_dummy_indices _glp_mpl_update_dummy_indices 1.1472 +void update_dummy_indices 1.1473 +( MPL *mpl, 1.1474 + DOMAIN_BLOCK *block /* not changed */ 1.1475 +); 1.1476 +/* update current values of dummy indices */ 1.1477 + 1.1478 +#define enter_domain_block _glp_mpl_enter_domain_block 1.1479 +int enter_domain_block 1.1480 +( MPL *mpl, 1.1481 + DOMAIN_BLOCK *block, /* not changed */ 1.1482 + TUPLE *tuple, /* not changed */ 1.1483 + void *info, void (*func)(MPL *mpl, void *info) 1.1484 +); 1.1485 +/* enter domain block */ 1.1486 + 1.1487 +#define eval_within_domain _glp_mpl_eval_within_domain 1.1488 +int eval_within_domain 1.1489 +( MPL *mpl, 1.1490 + DOMAIN *domain, /* not changed */ 1.1491 + TUPLE *tuple, /* not changed */ 1.1492 + void *info, void (*func)(MPL *mpl, void *info) 1.1493 +); 1.1494 +/* perform evaluation within domain scope */ 1.1495 + 1.1496 +#define loop_within_domain _glp_mpl_loop_within_domain 1.1497 +void loop_within_domain 1.1498 +( MPL *mpl, 1.1499 + DOMAIN *domain, /* not changed */ 1.1500 + void *info, int (*func)(MPL *mpl, void *info) 1.1501 +); 1.1502 +/* perform iterations within domain scope */ 1.1503 + 1.1504 +#define out_of_domain _glp_mpl_out_of_domain 1.1505 +void out_of_domain 1.1506 +( MPL *mpl, 1.1507 + char *name, /* not changed */ 1.1508 + TUPLE *tuple /* not changed */ 1.1509 +); 1.1510 +/* raise domain exception */ 1.1511 + 1.1512 +#define get_domain_tuple _glp_mpl_get_domain_tuple 1.1513 +TUPLE *get_domain_tuple 1.1514 +( MPL *mpl, 1.1515 + DOMAIN *domain /* not changed */ 1.1516 +); 1.1517 +/* obtain current n-tuple from domain */ 1.1518 + 1.1519 +#define clean_domain _glp_mpl_clean_domain 1.1520 +void clean_domain(MPL *mpl, DOMAIN *domain); 1.1521 +/* clean domain */ 1.1522 + 1.1523 +/**********************************************************************/ 1.1524 +/* * * MODEL SETS * * */ 1.1525 +/**********************************************************************/ 1.1526 + 1.1527 +struct SET 1.1528 +{ /* model set */ 1.1529 + char *name; 1.1530 + /* symbolic name; cannot be NULL */ 1.1531 + char *alias; 1.1532 + /* alias; NULL means alias is not specified */ 1.1533 + int dim; /* aka arity */ 1.1534 + /* dimension (number of subscripts); dim = 0 means 0-dimensional 1.1535 + (unsubscripted) set, dim > 0 means set of sets */ 1.1536 + DOMAIN *domain; 1.1537 + /* subscript domain; NULL for 0-dimensional set */ 1.1538 + int dimen; 1.1539 + /* dimension of n-tuples, which members of this set consist of 1.1540 + (note that the model set itself is an array of elemental sets, 1.1541 + which are its members; so, don't confuse this dimension with 1.1542 + dimension of the model set); always non-zero */ 1.1543 + WITHIN *within; 1.1544 + /* list of supersets, which restrict each member of the set to be 1.1545 + in every superset from this list; this list can be empty */ 1.1546 + CODE *assign; 1.1547 + /* pseudo-code for computing assigned value; can be NULL */ 1.1548 + CODE *option; 1.1549 + /* pseudo-code for computing default value; can be NULL */ 1.1550 + GADGET *gadget; 1.1551 + /* plain set used to initialize the array of sets; can be NULL */ 1.1552 + int data; 1.1553 + /* data status flag: 1.1554 + 0 - no data are provided in the data section 1.1555 + 1 - data are provided, but not checked yet 1.1556 + 2 - data are provided and have been checked */ 1.1557 + ARRAY *array; 1.1558 + /* array of members, which are assigned elemental sets */ 1.1559 +}; 1.1560 + 1.1561 +struct WITHIN 1.1562 +{ /* restricting superset list entry */ 1.1563 + CODE *code; 1.1564 + /* pseudo-code for computing the superset; cannot be NULL */ 1.1565 + WITHIN *next; 1.1566 + /* the next entry for the same set or parameter */ 1.1567 +}; 1.1568 + 1.1569 +struct GADGET 1.1570 +{ /* plain set used to initialize the array of sets with data */ 1.1571 + SET *set; 1.1572 + /* pointer to plain set; cannot be NULL */ 1.1573 + int ind[20]; /* ind[dim+dimen]; */ 1.1574 + /* permutation of integers 1, 2, ..., dim+dimen */ 1.1575 +}; 1.1576 + 1.1577 +#define check_elem_set _glp_mpl_check_elem_set 1.1578 +void check_elem_set 1.1579 +( MPL *mpl, 1.1580 + SET *set, /* not changed */ 1.1581 + TUPLE *tuple, /* not changed */ 1.1582 + ELEMSET *refer /* not changed */ 1.1583 +); 1.1584 +/* check elemental set assigned to set member */ 1.1585 + 1.1586 +#define take_member_set _glp_mpl_take_member_set 1.1587 +ELEMSET *take_member_set /* returns reference, not value */ 1.1588 +( MPL *mpl, 1.1589 + SET *set, /* not changed */ 1.1590 + TUPLE *tuple /* not changed */ 1.1591 +); 1.1592 +/* obtain elemental set assigned to set member */ 1.1593 + 1.1594 +#define eval_member_set _glp_mpl_eval_member_set 1.1595 +ELEMSET *eval_member_set /* returns reference, not value */ 1.1596 +( MPL *mpl, 1.1597 + SET *set, /* not changed */ 1.1598 + TUPLE *tuple /* not changed */ 1.1599 +); 1.1600 +/* evaluate elemental set assigned to set member */ 1.1601 + 1.1602 +#define eval_whole_set _glp_mpl_eval_whole_set 1.1603 +void eval_whole_set(MPL *mpl, SET *set); 1.1604 +/* evaluate model set over entire domain */ 1.1605 + 1.1606 +#define clean_set _glp_mpl_clean_set 1.1607 +void clean_set(MPL *mpl, SET *set); 1.1608 +/* clean model set */ 1.1609 + 1.1610 +/**********************************************************************/ 1.1611 +/* * * MODEL PARAMETERS * * */ 1.1612 +/**********************************************************************/ 1.1613 + 1.1614 +struct PARAMETER 1.1615 +{ /* model parameter */ 1.1616 + char *name; 1.1617 + /* symbolic name; cannot be NULL */ 1.1618 + char *alias; 1.1619 + /* alias; NULL means alias is not specified */ 1.1620 + int dim; /* aka arity */ 1.1621 + /* dimension (number of subscripts); dim = 0 means 0-dimensional 1.1622 + (unsubscripted) parameter */ 1.1623 + DOMAIN *domain; 1.1624 + /* subscript domain; NULL for 0-dimensional parameter */ 1.1625 + int type; 1.1626 + /* parameter type: 1.1627 + A_NUMERIC - numeric 1.1628 + A_INTEGER - integer 1.1629 + A_BINARY - binary 1.1630 + A_SYMBOLIC - symbolic */ 1.1631 + CONDITION *cond; 1.1632 + /* list of conditions, which restrict each parameter member to 1.1633 + satisfy to every condition from this list; this list is used 1.1634 + only for numeric parameters and can be empty */ 1.1635 + WITHIN *in; 1.1636 + /* list of supersets, which restrict each parameter member to be 1.1637 + in every superset from this list; this list is used only for 1.1638 + symbolic parameters and can be empty */ 1.1639 + CODE *assign; 1.1640 + /* pseudo-code for computing assigned value; can be NULL */ 1.1641 + CODE *option; 1.1642 + /* pseudo-code for computing default value; can be NULL */ 1.1643 + int data; 1.1644 + /* data status flag: 1.1645 + 0 - no data are provided in the data section 1.1646 + 1 - data are provided, but not checked yet 1.1647 + 2 - data are provided and have been checked */ 1.1648 + SYMBOL *defval; 1.1649 + /* default value provided in the data section; can be NULL */ 1.1650 + ARRAY *array; 1.1651 + /* array of members, which are assigned numbers or symbols */ 1.1652 +}; 1.1653 + 1.1654 +struct CONDITION 1.1655 +{ /* restricting condition list entry */ 1.1656 + int rho; 1.1657 + /* flag that specifies the form of the condition: 1.1658 + O_LT - less than 1.1659 + O_LE - less than or equal to 1.1660 + O_EQ - equal to 1.1661 + O_GE - greater than or equal to 1.1662 + O_GT - greater than 1.1663 + O_NE - not equal to */ 1.1664 + CODE *code; 1.1665 + /* pseudo-code for computing the reference value */ 1.1666 + CONDITION *next; 1.1667 + /* the next entry for the same parameter */ 1.1668 +}; 1.1669 + 1.1670 +#define check_value_num _glp_mpl_check_value_num 1.1671 +void check_value_num 1.1672 +( MPL *mpl, 1.1673 + PARAMETER *par, /* not changed */ 1.1674 + TUPLE *tuple, /* not changed */ 1.1675 + double value 1.1676 +); 1.1677 +/* check numeric value assigned to parameter member */ 1.1678 + 1.1679 +#define take_member_num _glp_mpl_take_member_num 1.1680 +double take_member_num 1.1681 +( MPL *mpl, 1.1682 + PARAMETER *par, /* not changed */ 1.1683 + TUPLE *tuple /* not changed */ 1.1684 +); 1.1685 +/* obtain numeric value assigned to parameter member */ 1.1686 + 1.1687 +#define eval_member_num _glp_mpl_eval_member_num 1.1688 +double eval_member_num 1.1689 +( MPL *mpl, 1.1690 + PARAMETER *par, /* not changed */ 1.1691 + TUPLE *tuple /* not changed */ 1.1692 +); 1.1693 +/* evaluate numeric value assigned to parameter member */ 1.1694 + 1.1695 +#define check_value_sym _glp_mpl_check_value_sym 1.1696 +void check_value_sym 1.1697 +( MPL *mpl, 1.1698 + PARAMETER *par, /* not changed */ 1.1699 + TUPLE *tuple, /* not changed */ 1.1700 + SYMBOL *value /* not changed */ 1.1701 +); 1.1702 +/* check symbolic value assigned to parameter member */ 1.1703 + 1.1704 +#define take_member_sym _glp_mpl_take_member_sym 1.1705 +SYMBOL *take_member_sym /* returns value, not reference */ 1.1706 +( MPL *mpl, 1.1707 + PARAMETER *par, /* not changed */ 1.1708 + TUPLE *tuple /* not changed */ 1.1709 +); 1.1710 +/* obtain symbolic value assigned to parameter member */ 1.1711 + 1.1712 +#define eval_member_sym _glp_mpl_eval_member_sym 1.1713 +SYMBOL *eval_member_sym /* returns value, not reference */ 1.1714 +( MPL *mpl, 1.1715 + PARAMETER *par, /* not changed */ 1.1716 + TUPLE *tuple /* not changed */ 1.1717 +); 1.1718 +/* evaluate symbolic value assigned to parameter member */ 1.1719 + 1.1720 +#define eval_whole_par _glp_mpl_eval_whole_par 1.1721 +void eval_whole_par(MPL *mpl, PARAMETER *par); 1.1722 +/* evaluate model parameter over entire domain */ 1.1723 + 1.1724 +#define clean_parameter _glp_mpl_clean_parameter 1.1725 +void clean_parameter(MPL *mpl, PARAMETER *par); 1.1726 +/* clean model parameter */ 1.1727 + 1.1728 +/**********************************************************************/ 1.1729 +/* * * MODEL VARIABLES * * */ 1.1730 +/**********************************************************************/ 1.1731 + 1.1732 +struct VARIABLE 1.1733 +{ /* model variable */ 1.1734 + char *name; 1.1735 + /* symbolic name; cannot be NULL */ 1.1736 + char *alias; 1.1737 + /* alias; NULL means alias is not specified */ 1.1738 + int dim; /* aka arity */ 1.1739 + /* dimension (number of subscripts); dim = 0 means 0-dimensional 1.1740 + (unsubscripted) variable */ 1.1741 + DOMAIN *domain; 1.1742 + /* subscript domain; NULL for 0-dimensional variable */ 1.1743 + int type; 1.1744 + /* variable type: 1.1745 + A_NUMERIC - continuous 1.1746 + A_INTEGER - integer 1.1747 + A_BINARY - binary */ 1.1748 + CODE *lbnd; 1.1749 + /* pseudo-code for computing lower bound; NULL means lower bound 1.1750 + is not specified */ 1.1751 + CODE *ubnd; 1.1752 + /* pseudo-code for computing upper bound; NULL means upper bound 1.1753 + is not specified */ 1.1754 + /* if both the pointers lbnd and ubnd refer to the same code, the 1.1755 + variable is fixed at the corresponding value */ 1.1756 + ARRAY *array; 1.1757 + /* array of members, which are assigned elemental variables */ 1.1758 +}; 1.1759 + 1.1760 +#define take_member_var _glp_mpl_take_member_var 1.1761 +ELEMVAR *take_member_var /* returns reference */ 1.1762 +( MPL *mpl, 1.1763 + VARIABLE *var, /* not changed */ 1.1764 + TUPLE *tuple /* not changed */ 1.1765 +); 1.1766 +/* obtain reference to elemental variable */ 1.1767 + 1.1768 +#define eval_member_var _glp_mpl_eval_member_var 1.1769 +ELEMVAR *eval_member_var /* returns reference */ 1.1770 +( MPL *mpl, 1.1771 + VARIABLE *var, /* not changed */ 1.1772 + TUPLE *tuple /* not changed */ 1.1773 +); 1.1774 +/* evaluate reference to elemental variable */ 1.1775 + 1.1776 +#define eval_whole_var _glp_mpl_eval_whole_var 1.1777 +void eval_whole_var(MPL *mpl, VARIABLE *var); 1.1778 +/* evaluate model variable over entire domain */ 1.1779 + 1.1780 +#define clean_variable _glp_mpl_clean_variable 1.1781 +void clean_variable(MPL *mpl, VARIABLE *var); 1.1782 +/* clean model variable */ 1.1783 + 1.1784 +/**********************************************************************/ 1.1785 +/* * * MODEL CONSTRAINTS AND OBJECTIVES * * */ 1.1786 +/**********************************************************************/ 1.1787 + 1.1788 +struct CONSTRAINT 1.1789 +{ /* model constraint or objective */ 1.1790 + char *name; 1.1791 + /* symbolic name; cannot be NULL */ 1.1792 + char *alias; 1.1793 + /* alias; NULL means alias is not specified */ 1.1794 + int dim; /* aka arity */ 1.1795 + /* dimension (number of subscripts); dim = 0 means 0-dimensional 1.1796 + (unsubscripted) constraint */ 1.1797 + DOMAIN *domain; 1.1798 + /* subscript domain; NULL for 0-dimensional constraint */ 1.1799 + int type; 1.1800 + /* constraint type: 1.1801 + A_CONSTRAINT - constraint 1.1802 + A_MINIMIZE - objective (minimization) 1.1803 + A_MAXIMIZE - objective (maximization) */ 1.1804 + CODE *code; 1.1805 + /* pseudo-code for computing main linear form; cannot be NULL */ 1.1806 + CODE *lbnd; 1.1807 + /* pseudo-code for computing lower bound; NULL means lower bound 1.1808 + is not specified */ 1.1809 + CODE *ubnd; 1.1810 + /* pseudo-code for computing upper bound; NULL means upper bound 1.1811 + is not specified */ 1.1812 + /* if both the pointers lbnd and ubnd refer to the same code, the 1.1813 + constraint has the form of equation */ 1.1814 + ARRAY *array; 1.1815 + /* array of members, which are assigned elemental constraints */ 1.1816 +}; 1.1817 + 1.1818 +#define take_member_con _glp_mpl_take_member_con 1.1819 +ELEMCON *take_member_con /* returns reference */ 1.1820 +( MPL *mpl, 1.1821 + CONSTRAINT *con, /* not changed */ 1.1822 + TUPLE *tuple /* not changed */ 1.1823 +); 1.1824 +/* obtain reference to elemental constraint */ 1.1825 + 1.1826 +#define eval_member_con _glp_mpl_eval_member_con 1.1827 +ELEMCON *eval_member_con /* returns reference */ 1.1828 +( MPL *mpl, 1.1829 + CONSTRAINT *con, /* not changed */ 1.1830 + TUPLE *tuple /* not changed */ 1.1831 +); 1.1832 +/* evaluate reference to elemental constraint */ 1.1833 + 1.1834 +#define eval_whole_con _glp_mpl_eval_whole_con 1.1835 +void eval_whole_con(MPL *mpl, CONSTRAINT *con); 1.1836 +/* evaluate model constraint over entire domain */ 1.1837 + 1.1838 +#define clean_constraint _glp_mpl_clean_constraint 1.1839 +void clean_constraint(MPL *mpl, CONSTRAINT *con); 1.1840 +/* clean model constraint */ 1.1841 + 1.1842 +/**********************************************************************/ 1.1843 +/* * * DATA TABLES * * */ 1.1844 +/**********************************************************************/ 1.1845 + 1.1846 +struct TABLE 1.1847 +{ /* data table */ 1.1848 + char *name; 1.1849 + /* symbolic name; cannot be NULL */ 1.1850 + char *alias; 1.1851 + /* alias; NULL means alias is not specified */ 1.1852 + int type; 1.1853 + /* table type: 1.1854 + A_INPUT - input table 1.1855 + A_OUTPUT - output table */ 1.1856 + TABARG *arg; 1.1857 + /* argument list; cannot be empty */ 1.1858 + union 1.1859 + { struct 1.1860 + { SET *set; 1.1861 + /* input set; NULL means the set is not specified */ 1.1862 + TABFLD *fld; 1.1863 + /* field list; cannot be empty */ 1.1864 + TABIN *list; 1.1865 + /* input list; can be empty */ 1.1866 + } in; 1.1867 + struct 1.1868 + { DOMAIN *domain; 1.1869 + /* subscript domain; cannot be NULL */ 1.1870 + TABOUT *list; 1.1871 + /* output list; cannot be empty */ 1.1872 + } out; 1.1873 + } u; 1.1874 +}; 1.1875 + 1.1876 +struct TABARG 1.1877 +{ /* table argument list entry */ 1.1878 + CODE *code; 1.1879 + /* pseudo-code for computing the argument */ 1.1880 + TABARG *next; 1.1881 + /* next entry for the same table */ 1.1882 +}; 1.1883 + 1.1884 +struct TABFLD 1.1885 +{ /* table field list entry */ 1.1886 + char *name; 1.1887 + /* field name; cannot be NULL */ 1.1888 + TABFLD *next; 1.1889 + /* next entry for the same table */ 1.1890 +}; 1.1891 + 1.1892 +struct TABIN 1.1893 +{ /* table input list entry */ 1.1894 + PARAMETER *par; 1.1895 + /* parameter to be read; cannot be NULL */ 1.1896 + char *name; 1.1897 + /* column name; cannot be NULL */ 1.1898 + TABIN *next; 1.1899 + /* next entry for the same table */ 1.1900 +}; 1.1901 + 1.1902 +struct TABOUT 1.1903 +{ /* table output list entry */ 1.1904 + CODE *code; 1.1905 + /* pseudo-code for computing the value to be written */ 1.1906 + char *name; 1.1907 + /* column name; cannot be NULL */ 1.1908 + TABOUT *next; 1.1909 + /* next entry for the same table */ 1.1910 +}; 1.1911 + 1.1912 +struct TABDCA 1.1913 +{ /* table driver communication area */ 1.1914 + int id; 1.1915 + /* driver identifier (set by mpl_tab_drv_open) */ 1.1916 + void *link; 1.1917 + /* driver link pointer (set by mpl_tab_drv_open) */ 1.1918 + int na; 1.1919 + /* number of arguments */ 1.1920 + char **arg; /* char *arg[1+ns]; */ 1.1921 + /* arg[k], 1 <= k <= ns, is pointer to k-th argument */ 1.1922 + int nf; 1.1923 + /* number of fields */ 1.1924 + char **name; /* char *name[1+nc]; */ 1.1925 + /* name[k], 1 <= k <= nc, is name of k-th field */ 1.1926 + int *type; /* int type[1+nc]; */ 1.1927 + /* type[k], 1 <= k <= nc, is type of k-th field: 1.1928 + '?' - value not assigned 1.1929 + 'N' - number 1.1930 + 'S' - character string */ 1.1931 + double *num; /* double num[1+nc]; */ 1.1932 + /* num[k], 1 <= k <= nc, is numeric value of k-th field */ 1.1933 + char **str; 1.1934 + /* str[k], 1 <= k <= nc, is string value of k-th field */ 1.1935 +}; 1.1936 + 1.1937 +#define mpl_tab_num_args _glp_mpl_tab_num_args 1.1938 +int mpl_tab_num_args(TABDCA *dca); 1.1939 + 1.1940 +#define mpl_tab_get_arg _glp_mpl_tab_get_arg 1.1941 +const char *mpl_tab_get_arg(TABDCA *dca, int k); 1.1942 + 1.1943 +#define mpl_tab_num_flds _glp_mpl_tab_num_flds 1.1944 +int mpl_tab_num_flds(TABDCA *dca); 1.1945 + 1.1946 +#define mpl_tab_get_name _glp_mpl_tab_get_name 1.1947 +const char *mpl_tab_get_name(TABDCA *dca, int k); 1.1948 + 1.1949 +#define mpl_tab_get_type _glp_mpl_tab_get_type 1.1950 +int mpl_tab_get_type(TABDCA *dca, int k); 1.1951 + 1.1952 +#define mpl_tab_get_num _glp_mpl_tab_get_num 1.1953 +double mpl_tab_get_num(TABDCA *dca, int k); 1.1954 + 1.1955 +#define mpl_tab_get_str _glp_mpl_tab_get_str 1.1956 +const char *mpl_tab_get_str(TABDCA *dca, int k); 1.1957 + 1.1958 +#define mpl_tab_set_num _glp_mpl_tab_set_num 1.1959 +void mpl_tab_set_num(TABDCA *dca, int k, double num); 1.1960 + 1.1961 +#define mpl_tab_set_str _glp_mpl_tab_set_str 1.1962 +void mpl_tab_set_str(TABDCA *dca, int k, const char *str); 1.1963 + 1.1964 +#define mpl_tab_drv_open _glp_mpl_tab_drv_open 1.1965 +void mpl_tab_drv_open(MPL *mpl, int mode); 1.1966 + 1.1967 +#define mpl_tab_drv_read _glp_mpl_tab_drv_read 1.1968 +int mpl_tab_drv_read(MPL *mpl); 1.1969 + 1.1970 +#define mpl_tab_drv_write _glp_mpl_tab_drv_write 1.1971 +void mpl_tab_drv_write(MPL *mpl); 1.1972 + 1.1973 +#define mpl_tab_drv_close _glp_mpl_tab_drv_close 1.1974 +void mpl_tab_drv_close(MPL *mpl); 1.1975 + 1.1976 +/**********************************************************************/ 1.1977 +/* * * PSEUDO-CODE * * */ 1.1978 +/**********************************************************************/ 1.1979 + 1.1980 +union OPERANDS 1.1981 +{ /* operands that participate in pseudo-code operation (choice of 1.1982 + particular operands depends on the operation code) */ 1.1983 + /*--------------------------------------------------------------*/ 1.1984 + double num; /* O_NUMBER */ 1.1985 + /* floaing-point number to be taken */ 1.1986 + /*--------------------------------------------------------------*/ 1.1987 + char *str; /* O_STRING */ 1.1988 + /* character string to be taken */ 1.1989 + /*--------------------------------------------------------------*/ 1.1990 + struct /* O_INDEX */ 1.1991 + { DOMAIN_SLOT *slot; 1.1992 + /* domain slot, which contains dummy index to be taken */ 1.1993 + CODE *next; 1.1994 + /* the next pseudo-code with op = O_INDEX, which refers to the 1.1995 + same slot as this one; pointer to the beginning of this list 1.1996 + is stored in the corresponding domain slot */ 1.1997 + } index; 1.1998 + /*--------------------------------------------------------------*/ 1.1999 + struct /* O_MEMNUM, O_MEMSYM */ 1.2000 + { PARAMETER *par; 1.2001 + /* model parameter, which contains member to be taken */ 1.2002 + ARG_LIST *list; 1.2003 + /* list of subscripts; NULL for 0-dimensional parameter */ 1.2004 + } par; 1.2005 + /*--------------------------------------------------------------*/ 1.2006 + struct /* O_MEMSET */ 1.2007 + { SET *set; 1.2008 + /* model set, which contains member to be taken */ 1.2009 + ARG_LIST *list; 1.2010 + /* list of subscripts; NULL for 0-dimensional set */ 1.2011 + } set; 1.2012 + /*--------------------------------------------------------------*/ 1.2013 + struct /* O_MEMVAR */ 1.2014 + { VARIABLE *var; 1.2015 + /* model variable, which contains member to be taken */ 1.2016 + ARG_LIST *list; 1.2017 + /* list of subscripts; NULL for 0-dimensional variable */ 1.2018 +#if 1 /* 15/V-2010 */ 1.2019 + int suff; 1.2020 + /* suffix specified: */ 1.2021 +#define DOT_NONE 0x00 /* none (means variable itself) */ 1.2022 +#define DOT_LB 0x01 /* .lb (lower bound) */ 1.2023 +#define DOT_UB 0x02 /* .ub (upper bound) */ 1.2024 +#define DOT_STATUS 0x03 /* .status (status) */ 1.2025 +#define DOT_VAL 0x04 /* .val (primal value) */ 1.2026 +#define DOT_DUAL 0x05 /* .dual (dual value) */ 1.2027 +#endif 1.2028 + } var; 1.2029 +#if 1 /* 15/V-2010 */ 1.2030 + /*--------------------------------------------------------------*/ 1.2031 + struct /* O_MEMCON */ 1.2032 + { CONSTRAINT *con; 1.2033 + /* model constraint, which contains member to be taken */ 1.2034 + ARG_LIST *list; 1.2035 + /* list of subscripys; NULL for 0-dimensional constraint */ 1.2036 + int suff; 1.2037 + /* suffix specified (see O_MEMVAR above) */ 1.2038 + } con; 1.2039 +#endif 1.2040 + /*--------------------------------------------------------------*/ 1.2041 + ARG_LIST *list; /* O_TUPLE, O_MAKE, n-ary operations */ 1.2042 + /* list of operands */ 1.2043 + /*--------------------------------------------------------------*/ 1.2044 + DOMAIN_BLOCK *slice; /* O_SLICE */ 1.2045 + /* domain block, which specifies slice (i.e. n-tuple that contains 1.2046 + free dummy indices); this operation is never evaluated */ 1.2047 + /*--------------------------------------------------------------*/ 1.2048 + struct /* unary, binary, ternary operations */ 1.2049 + { CODE *x; 1.2050 + /* pseudo-code for computing first operand */ 1.2051 + CODE *y; 1.2052 + /* pseudo-code for computing second operand */ 1.2053 + CODE *z; 1.2054 + /* pseudo-code for computing third operand */ 1.2055 + } arg; 1.2056 + /*--------------------------------------------------------------*/ 1.2057 + struct /* iterated operations */ 1.2058 + { DOMAIN *domain; 1.2059 + /* domain, over which the operation is performed */ 1.2060 + CODE *x; 1.2061 + /* pseudo-code for computing "integrand" */ 1.2062 + } loop; 1.2063 + /*--------------------------------------------------------------*/ 1.2064 +}; 1.2065 + 1.2066 +struct ARG_LIST 1.2067 +{ /* operands list entry */ 1.2068 + CODE *x; 1.2069 + /* pseudo-code for computing operand */ 1.2070 + ARG_LIST *next; 1.2071 + /* the next operand of the same operation */ 1.2072 +}; 1.2073 + 1.2074 +struct CODE 1.2075 +{ /* pseudo-code (internal form of expressions) */ 1.2076 + int op; 1.2077 + /* operation code: */ 1.2078 +#define O_NUMBER 301 /* take floating-point number */ 1.2079 +#define O_STRING 302 /* take character string */ 1.2080 +#define O_INDEX 303 /* take dummy index */ 1.2081 +#define O_MEMNUM 304 /* take member of numeric parameter */ 1.2082 +#define O_MEMSYM 305 /* take member of symbolic parameter */ 1.2083 +#define O_MEMSET 306 /* take member of set */ 1.2084 +#define O_MEMVAR 307 /* take member of variable */ 1.2085 +#define O_MEMCON 308 /* take member of constraint */ 1.2086 +#define O_TUPLE 309 /* make n-tuple */ 1.2087 +#define O_MAKE 310 /* make elemental set of n-tuples */ 1.2088 +#define O_SLICE 311 /* define domain block (dummy op) */ 1.2089 + /* 0-ary operations --------------------*/ 1.2090 +#define O_IRAND224 312 /* pseudo-random in [0, 2^24-1] */ 1.2091 +#define O_UNIFORM01 313 /* pseudo-random in [0, 1) */ 1.2092 +#define O_NORMAL01 314 /* gaussian random, mu = 0, sigma = 1 */ 1.2093 +#define O_GMTIME 315 /* current calendar time (UTC) */ 1.2094 + /* unary operations --------------------*/ 1.2095 +#define O_CVTNUM 316 /* conversion to numeric */ 1.2096 +#define O_CVTSYM 317 /* conversion to symbolic */ 1.2097 +#define O_CVTLOG 318 /* conversion to logical */ 1.2098 +#define O_CVTTUP 319 /* conversion to 1-tuple */ 1.2099 +#define O_CVTLFM 320 /* conversion to linear form */ 1.2100 +#define O_PLUS 321 /* unary plus */ 1.2101 +#define O_MINUS 322 /* unary minus */ 1.2102 +#define O_NOT 323 /* negation (logical "not") */ 1.2103 +#define O_ABS 324 /* absolute value */ 1.2104 +#define O_CEIL 325 /* round upward ("ceiling of x") */ 1.2105 +#define O_FLOOR 326 /* round downward ("floor of x") */ 1.2106 +#define O_EXP 327 /* base-e exponential */ 1.2107 +#define O_LOG 328 /* natural logarithm */ 1.2108 +#define O_LOG10 329 /* common (decimal) logarithm */ 1.2109 +#define O_SQRT 330 /* square root */ 1.2110 +#define O_SIN 331 /* trigonometric sine */ 1.2111 +#define O_COS 332 /* trigonometric cosine */ 1.2112 +#define O_ATAN 333 /* trigonometric arctangent */ 1.2113 +#define O_ROUND 334 /* round to nearest integer */ 1.2114 +#define O_TRUNC 335 /* truncate to nearest integer */ 1.2115 +#define O_CARD 336 /* cardinality of set */ 1.2116 +#define O_LENGTH 337 /* length of symbolic value */ 1.2117 + /* binary operations -------------------*/ 1.2118 +#define O_ADD 338 /* addition */ 1.2119 +#define O_SUB 339 /* subtraction */ 1.2120 +#define O_LESS 340 /* non-negative subtraction */ 1.2121 +#define O_MUL 341 /* multiplication */ 1.2122 +#define O_DIV 342 /* division */ 1.2123 +#define O_IDIV 343 /* quotient of exact division */ 1.2124 +#define O_MOD 344 /* remainder of exact division */ 1.2125 +#define O_POWER 345 /* exponentiation (raise to power) */ 1.2126 +#define O_ATAN2 346 /* trigonometric arctangent */ 1.2127 +#define O_ROUND2 347 /* round to n fractional digits */ 1.2128 +#define O_TRUNC2 348 /* truncate to n fractional digits */ 1.2129 +#define O_UNIFORM 349 /* pseudo-random in [a, b) */ 1.2130 +#define O_NORMAL 350 /* gaussian random, given mu and sigma */ 1.2131 +#define O_CONCAT 351 /* concatenation */ 1.2132 +#define O_LT 352 /* comparison on 'less than' */ 1.2133 +#define O_LE 353 /* comparison on 'not greater than' */ 1.2134 +#define O_EQ 354 /* comparison on 'equal to' */ 1.2135 +#define O_GE 355 /* comparison on 'not less than' */ 1.2136 +#define O_GT 356 /* comparison on 'greater than' */ 1.2137 +#define O_NE 357 /* comparison on 'not equal to' */ 1.2138 +#define O_AND 358 /* conjunction (logical "and") */ 1.2139 +#define O_OR 359 /* disjunction (logical "or") */ 1.2140 +#define O_UNION 360 /* union */ 1.2141 +#define O_DIFF 361 /* difference */ 1.2142 +#define O_SYMDIFF 362 /* symmetric difference */ 1.2143 +#define O_INTER 363 /* intersection */ 1.2144 +#define O_CROSS 364 /* cross (Cartesian) product */ 1.2145 +#define O_IN 365 /* test on 'x in Y' */ 1.2146 +#define O_NOTIN 366 /* test on 'x not in Y' */ 1.2147 +#define O_WITHIN 367 /* test on 'X within Y' */ 1.2148 +#define O_NOTWITHIN 368 /* test on 'X not within Y' */ 1.2149 +#define O_SUBSTR 369 /* substring */ 1.2150 +#define O_STR2TIME 370 /* convert string to time */ 1.2151 +#define O_TIME2STR 371 /* convert time to string */ 1.2152 + /* ternary operations ------------------*/ 1.2153 +#define O_DOTS 372 /* build "arithmetic" set */ 1.2154 +#define O_FORK 373 /* if-then-else */ 1.2155 +#define O_SUBSTR3 374 /* substring */ 1.2156 + /* n-ary operations --------------------*/ 1.2157 +#define O_MIN 375 /* minimal value (n-ary) */ 1.2158 +#define O_MAX 376 /* maximal value (n-ary) */ 1.2159 + /* iterated operations -----------------*/ 1.2160 +#define O_SUM 377 /* summation */ 1.2161 +#define O_PROD 378 /* multiplication */ 1.2162 +#define O_MINIMUM 379 /* minimum */ 1.2163 +#define O_MAXIMUM 380 /* maximum */ 1.2164 +#define O_FORALL 381 /* conjunction (A-quantification) */ 1.2165 +#define O_EXISTS 382 /* disjunction (E-quantification) */ 1.2166 +#define O_SETOF 383 /* compute elemental set */ 1.2167 +#define O_BUILD 384 /* build elemental set */ 1.2168 + OPERANDS arg; 1.2169 + /* operands that participate in the operation */ 1.2170 + int type; 1.2171 + /* type of the resultant value: 1.2172 + A_NUMERIC - numeric 1.2173 + A_SYMBOLIC - symbolic 1.2174 + A_LOGICAL - logical 1.2175 + A_TUPLE - n-tuple 1.2176 + A_ELEMSET - elemental set 1.2177 + A_FORMULA - linear form */ 1.2178 + int dim; 1.2179 + /* dimension of the resultant value; for A_TUPLE and A_ELEMSET it 1.2180 + is the dimension of the corresponding n-tuple(s) and cannot be 1.2181 + zero; for other resultant types it is always zero */ 1.2182 + CODE *up; 1.2183 + /* parent pseudo-code, which refers to this pseudo-code as to its 1.2184 + operand; NULL means this pseudo-code has no parent and defines 1.2185 + an expression, which is not contained in another expression */ 1.2186 + int vflag; 1.2187 + /* volatile flag; being set this flag means that this operation 1.2188 + has a side effect; for primary expressions this flag is set 1.2189 + directly by corresponding parsing routines (for example, if 1.2190 + primary expression is a reference to a function that generates 1.2191 + pseudo-random numbers); in other cases this flag is inherited 1.2192 + from operands */ 1.2193 + int valid; 1.2194 + /* if this flag is set, the resultant value, which is a temporary 1.2195 + result of evaluating this operation on particular values of 1.2196 + operands, is valid; if this flag is clear, the resultant value 1.2197 + doesn't exist and therefore not valid; having been evaluated 1.2198 + the resultant value is stored here and not destroyed until the 1.2199 + dummy indices, which this value depends on, have been changed 1.2200 + (and if it doesn't depend on dummy indices at all, it is never 1.2201 + destroyed); thus, if the resultant value is valid, evaluating 1.2202 + routine can immediately take its copy not computing the result 1.2203 + from scratch; this mechanism is similar to moving invariants 1.2204 + out of loops and allows improving efficiency at the expense of 1.2205 + some extra memory needed to keep temporary results */ 1.2206 + /* however, if the volatile flag (see above) is set, even if the 1.2207 + resultant value is valid, evaluating routine computes it as if 1.2208 + it were not valid, i.e. caching is not used in this case */ 1.2209 + VALUE value; 1.2210 + /* resultant value in generic format */ 1.2211 +}; 1.2212 + 1.2213 +#define eval_numeric _glp_mpl_eval_numeric 1.2214 +double eval_numeric(MPL *mpl, CODE *code); 1.2215 +/* evaluate pseudo-code to determine numeric value */ 1.2216 + 1.2217 +#define eval_symbolic _glp_mpl_eval_symbolic 1.2218 +SYMBOL *eval_symbolic(MPL *mpl, CODE *code); 1.2219 +/* evaluate pseudo-code to determine symbolic value */ 1.2220 + 1.2221 +#define eval_logical _glp_mpl_eval_logical 1.2222 +int eval_logical(MPL *mpl, CODE *code); 1.2223 +/* evaluate pseudo-code to determine logical value */ 1.2224 + 1.2225 +#define eval_tuple _glp_mpl_eval_tuple 1.2226 +TUPLE *eval_tuple(MPL *mpl, CODE *code); 1.2227 +/* evaluate pseudo-code to construct n-tuple */ 1.2228 + 1.2229 +#define eval_elemset _glp_mpl_eval_elemset 1.2230 +ELEMSET *eval_elemset(MPL *mpl, CODE *code); 1.2231 +/* evaluate pseudo-code to construct elemental set */ 1.2232 + 1.2233 +#define is_member _glp_mpl_is_member 1.2234 +int is_member(MPL *mpl, CODE *code, TUPLE *tuple); 1.2235 +/* check if n-tuple is in set specified by pseudo-code */ 1.2236 + 1.2237 +#define eval_formula _glp_mpl_eval_formula 1.2238 +FORMULA *eval_formula(MPL *mpl, CODE *code); 1.2239 +/* evaluate pseudo-code to construct linear form */ 1.2240 + 1.2241 +#define clean_code _glp_mpl_clean_code 1.2242 +void clean_code(MPL *mpl, CODE *code); 1.2243 +/* clean pseudo-code */ 1.2244 + 1.2245 +/**********************************************************************/ 1.2246 +/* * * MODEL STATEMENTS * * */ 1.2247 +/**********************************************************************/ 1.2248 + 1.2249 +struct CHECK 1.2250 +{ /* check statement */ 1.2251 + DOMAIN *domain; 1.2252 + /* subscript domain; NULL means domain is not used */ 1.2253 + CODE *code; 1.2254 + /* code for computing the predicate to be checked */ 1.2255 +}; 1.2256 + 1.2257 +struct DISPLAY 1.2258 +{ /* display statement */ 1.2259 + DOMAIN *domain; 1.2260 + /* subscript domain; NULL means domain is not used */ 1.2261 + DISPLAY1 *list; 1.2262 + /* display list; cannot be empty */ 1.2263 +}; 1.2264 + 1.2265 +struct DISPLAY1 1.2266 +{ /* display list entry */ 1.2267 + int type; 1.2268 + /* item type: 1.2269 + A_INDEX - dummy index 1.2270 + A_SET - model set 1.2271 + A_PARAMETER - model parameter 1.2272 + A_VARIABLE - model variable 1.2273 + A_CONSTRAINT - model constraint/objective 1.2274 + A_EXPRESSION - expression */ 1.2275 + union 1.2276 + { DOMAIN_SLOT *slot; 1.2277 + SET *set; 1.2278 + PARAMETER *par; 1.2279 + VARIABLE *var; 1.2280 + CONSTRAINT *con; 1.2281 + CODE *code; 1.2282 + } u; 1.2283 + /* item to be displayed */ 1.2284 +#if 0 /* 15/V-2010 */ 1.2285 + ARG_LIST *list; 1.2286 + /* optional subscript list (for constraint/objective only) */ 1.2287 +#endif 1.2288 + DISPLAY1 *next; 1.2289 + /* the next entry for the same statement */ 1.2290 +}; 1.2291 + 1.2292 +struct PRINTF 1.2293 +{ /* printf statement */ 1.2294 + DOMAIN *domain; 1.2295 + /* subscript domain; NULL means domain is not used */ 1.2296 + CODE *fmt; 1.2297 + /* pseudo-code for computing format string */ 1.2298 + PRINTF1 *list; 1.2299 + /* printf list; can be empty */ 1.2300 + CODE *fname; 1.2301 + /* pseudo-code for computing filename to redirect the output; 1.2302 + NULL means the output goes to stdout */ 1.2303 + int app; 1.2304 + /* if this flag is set, the output is appended */ 1.2305 +}; 1.2306 + 1.2307 +struct PRINTF1 1.2308 +{ /* printf list entry */ 1.2309 + CODE *code; 1.2310 + /* pseudo-code for computing value to be printed */ 1.2311 + PRINTF1 *next; 1.2312 + /* the next entry for the same statement */ 1.2313 +}; 1.2314 + 1.2315 +struct FOR 1.2316 +{ /* for statement */ 1.2317 + DOMAIN *domain; 1.2318 + /* subscript domain; cannot be NULL */ 1.2319 + STATEMENT *list; 1.2320 + /* linked list of model statements within this for statement in 1.2321 + the original order */ 1.2322 +}; 1.2323 + 1.2324 +struct STATEMENT 1.2325 +{ /* model statement */ 1.2326 + int line; 1.2327 + /* number of source text line, where statement begins */ 1.2328 + int type; 1.2329 + /* statement type: 1.2330 + A_SET - set statement 1.2331 + A_PARAMETER - parameter statement 1.2332 + A_VARIABLE - variable statement 1.2333 + A_CONSTRAINT - constraint/objective statement 1.2334 + A_TABLE - table statement 1.2335 + A_SOLVE - solve statement 1.2336 + A_CHECK - check statement 1.2337 + A_DISPLAY - display statement 1.2338 + A_PRINTF - printf statement 1.2339 + A_FOR - for statement */ 1.2340 + union 1.2341 + { SET *set; 1.2342 + PARAMETER *par; 1.2343 + VARIABLE *var; 1.2344 + CONSTRAINT *con; 1.2345 + TABLE *tab; 1.2346 + void *slv; /* currently not used (set to NULL) */ 1.2347 + CHECK *chk; 1.2348 + DISPLAY *dpy; 1.2349 + PRINTF *prt; 1.2350 + FOR *fur; 1.2351 + } u; 1.2352 + /* specific part of statement */ 1.2353 + STATEMENT *next; 1.2354 + /* the next statement; in this list statements follow in the same 1.2355 + order as they appear in the model section */ 1.2356 +}; 1.2357 + 1.2358 +#define execute_table _glp_mpl_execute_table 1.2359 +void execute_table(MPL *mpl, TABLE *tab); 1.2360 +/* execute table statement */ 1.2361 + 1.2362 +#define free_dca _glp_mpl_free_dca 1.2363 +void free_dca(MPL *mpl); 1.2364 +/* free table driver communucation area */ 1.2365 + 1.2366 +#define clean_table _glp_mpl_clean_table 1.2367 +void clean_table(MPL *mpl, TABLE *tab); 1.2368 +/* clean table statement */ 1.2369 + 1.2370 +#define execute_check _glp_mpl_execute_check 1.2371 +void execute_check(MPL *mpl, CHECK *chk); 1.2372 +/* execute check statement */ 1.2373 + 1.2374 +#define clean_check _glp_mpl_clean_check 1.2375 +void clean_check(MPL *mpl, CHECK *chk); 1.2376 +/* clean check statement */ 1.2377 + 1.2378 +#define execute_display _glp_mpl_execute_display 1.2379 +void execute_display(MPL *mpl, DISPLAY *dpy); 1.2380 +/* execute display statement */ 1.2381 + 1.2382 +#define clean_display _glp_mpl_clean_display 1.2383 +void clean_display(MPL *mpl, DISPLAY *dpy); 1.2384 +/* clean display statement */ 1.2385 + 1.2386 +#define execute_printf _glp_mpl_execute_printf 1.2387 +void execute_printf(MPL *mpl, PRINTF *prt); 1.2388 +/* execute printf statement */ 1.2389 + 1.2390 +#define clean_printf _glp_mpl_clean_printf 1.2391 +void clean_printf(MPL *mpl, PRINTF *prt); 1.2392 +/* clean printf statement */ 1.2393 + 1.2394 +#define execute_for _glp_mpl_execute_for 1.2395 +void execute_for(MPL *mpl, FOR *fur); 1.2396 +/* execute for statement */ 1.2397 + 1.2398 +#define clean_for _glp_mpl_clean_for 1.2399 +void clean_for(MPL *mpl, FOR *fur); 1.2400 +/* clean for statement */ 1.2401 + 1.2402 +#define execute_statement _glp_mpl_execute_statement 1.2403 +void execute_statement(MPL *mpl, STATEMENT *stmt); 1.2404 +/* execute specified model statement */ 1.2405 + 1.2406 +#define clean_statement _glp_mpl_clean_statement 1.2407 +void clean_statement(MPL *mpl, STATEMENT *stmt); 1.2408 +/* clean specified model statement */ 1.2409 + 1.2410 +/**********************************************************************/ 1.2411 +/* * * GENERATING AND POSTSOLVING MODEL * * */ 1.2412 +/**********************************************************************/ 1.2413 + 1.2414 +#define alloc_content _glp_mpl_alloc_content 1.2415 +void alloc_content(MPL *mpl); 1.2416 +/* allocate content arrays for all model objects */ 1.2417 + 1.2418 +#define generate_model _glp_mpl_generate_model 1.2419 +void generate_model(MPL *mpl); 1.2420 +/* generate model */ 1.2421 + 1.2422 +#define build_problem _glp_mpl_build_problem 1.2423 +void build_problem(MPL *mpl); 1.2424 +/* build problem instance */ 1.2425 + 1.2426 +#define postsolve_model _glp_mpl_postsolve_model 1.2427 +void postsolve_model(MPL *mpl); 1.2428 +/* postsolve model */ 1.2429 + 1.2430 +#define clean_model _glp_mpl_clean_model 1.2431 +void clean_model(MPL *mpl); 1.2432 +/* clean model content */ 1.2433 + 1.2434 +/**********************************************************************/ 1.2435 +/* * * INPUT/OUTPUT * * */ 1.2436 +/**********************************************************************/ 1.2437 + 1.2438 +#define open_input _glp_mpl_open_input 1.2439 +void open_input(MPL *mpl, char *file); 1.2440 +/* open input text file */ 1.2441 + 1.2442 +#define read_char _glp_mpl_read_char 1.2443 +int read_char(MPL *mpl); 1.2444 +/* read next character from input text file */ 1.2445 + 1.2446 +#define close_input _glp_mpl_close_input 1.2447 +void close_input(MPL *mpl); 1.2448 +/* close input text file */ 1.2449 + 1.2450 +#define open_output _glp_mpl_open_output 1.2451 +void open_output(MPL *mpl, char *file); 1.2452 +/* open output text file */ 1.2453 + 1.2454 +#define write_char _glp_mpl_write_char 1.2455 +void write_char(MPL *mpl, int c); 1.2456 +/* write next character to output text file */ 1.2457 + 1.2458 +#define write_text _glp_mpl_write_text 1.2459 +void write_text(MPL *mpl, char *fmt, ...); 1.2460 +/* format and write text to output text file */ 1.2461 + 1.2462 +#define flush_output _glp_mpl_flush_output 1.2463 +void flush_output(MPL *mpl); 1.2464 +/* finalize writing data to output text file */ 1.2465 + 1.2466 +/**********************************************************************/ 1.2467 +/* * * SOLVER INTERFACE * * */ 1.2468 +/**********************************************************************/ 1.2469 + 1.2470 +#define MPL_FR 401 /* free (unbounded) */ 1.2471 +#define MPL_LO 402 /* lower bound */ 1.2472 +#define MPL_UP 403 /* upper bound */ 1.2473 +#define MPL_DB 404 /* both lower and upper bounds */ 1.2474 +#define MPL_FX 405 /* fixed */ 1.2475 + 1.2476 +#define MPL_ST 411 /* constraint */ 1.2477 +#define MPL_MIN 412 /* objective (minimization) */ 1.2478 +#define MPL_MAX 413 /* objective (maximization) */ 1.2479 + 1.2480 +#define MPL_NUM 421 /* continuous */ 1.2481 +#define MPL_INT 422 /* integer */ 1.2482 +#define MPL_BIN 423 /* binary */ 1.2483 + 1.2484 +#define error _glp_mpl_error 1.2485 +void error(MPL *mpl, char *fmt, ...); 1.2486 +/* print error message and terminate model processing */ 1.2487 + 1.2488 +#define warning _glp_mpl_warning 1.2489 +void warning(MPL *mpl, char *fmt, ...); 1.2490 +/* print warning message and continue model processing */ 1.2491 + 1.2492 +#define mpl_initialize _glp_mpl_initialize 1.2493 +MPL *mpl_initialize(void); 1.2494 +/* create and initialize translator database */ 1.2495 + 1.2496 +#define mpl_read_model _glp_mpl_read_model 1.2497 +int mpl_read_model(MPL *mpl, char *file, int skip_data); 1.2498 +/* read model section and optional data section */ 1.2499 + 1.2500 +#define mpl_read_data _glp_mpl_read_data 1.2501 +int mpl_read_data(MPL *mpl, char *file); 1.2502 +/* read data section */ 1.2503 + 1.2504 +#define mpl_generate _glp_mpl_generate 1.2505 +int mpl_generate(MPL *mpl, char *file); 1.2506 +/* generate model */ 1.2507 + 1.2508 +#define mpl_get_prob_name _glp_mpl_get_prob_name 1.2509 +char *mpl_get_prob_name(MPL *mpl); 1.2510 +/* obtain problem (model) name */ 1.2511 + 1.2512 +#define mpl_get_num_rows _glp_mpl_get_num_rows 1.2513 +int mpl_get_num_rows(MPL *mpl); 1.2514 +/* determine number of rows */ 1.2515 + 1.2516 +#define mpl_get_num_cols _glp_mpl_get_num_cols 1.2517 +int mpl_get_num_cols(MPL *mpl); 1.2518 +/* determine number of columns */ 1.2519 + 1.2520 +#define mpl_get_row_name _glp_mpl_get_row_name 1.2521 +char *mpl_get_row_name(MPL *mpl, int i); 1.2522 +/* obtain row name */ 1.2523 + 1.2524 +#define mpl_get_row_kind _glp_mpl_get_row_kind 1.2525 +int mpl_get_row_kind(MPL *mpl, int i); 1.2526 +/* determine row kind */ 1.2527 + 1.2528 +#define mpl_get_row_bnds _glp_mpl_get_row_bnds 1.2529 +int mpl_get_row_bnds(MPL *mpl, int i, double *lb, double *ub); 1.2530 +/* obtain row bounds */ 1.2531 + 1.2532 +#define mpl_get_mat_row _glp_mpl_get_mat_row 1.2533 +int mpl_get_mat_row(MPL *mpl, int i, int ndx[], double val[]); 1.2534 +/* obtain row of the constraint matrix */ 1.2535 + 1.2536 +#define mpl_get_row_c0 _glp_mpl_get_row_c0 1.2537 +double mpl_get_row_c0(MPL *mpl, int i); 1.2538 +/* obtain constant term of free row */ 1.2539 + 1.2540 +#define mpl_get_col_name _glp_mpl_get_col_name 1.2541 +char *mpl_get_col_name(MPL *mpl, int j); 1.2542 +/* obtain column name */ 1.2543 + 1.2544 +#define mpl_get_col_kind _glp_mpl_get_col_kind 1.2545 +int mpl_get_col_kind(MPL *mpl, int j); 1.2546 +/* determine column kind */ 1.2547 + 1.2548 +#define mpl_get_col_bnds _glp_mpl_get_col_bnds 1.2549 +int mpl_get_col_bnds(MPL *mpl, int j, double *lb, double *ub); 1.2550 +/* obtain column bounds */ 1.2551 + 1.2552 +#define mpl_has_solve_stmt _glp_mpl_has_solve_stmt 1.2553 +int mpl_has_solve_stmt(MPL *mpl); 1.2554 +/* check if model has solve statement */ 1.2555 + 1.2556 +#if 1 /* 15/V-2010 */ 1.2557 +#define mpl_put_row_soln _glp_mpl_put_row_soln 1.2558 +void mpl_put_row_soln(MPL *mpl, int i, int stat, double prim, 1.2559 + double dual); 1.2560 +/* store row (constraint/objective) solution components */ 1.2561 +#endif 1.2562 + 1.2563 +#if 1 /* 15/V-2010 */ 1.2564 +#define mpl_put_col_soln _glp_mpl_put_col_soln 1.2565 +void mpl_put_col_soln(MPL *mpl, int j, int stat, double prim, 1.2566 + double dual); 1.2567 +/* store column (variable) solution components */ 1.2568 +#endif 1.2569 + 1.2570 +#if 0 /* 15/V-2010 */ 1.2571 +#define mpl_put_col_value _glp_mpl_put_col_value 1.2572 +void mpl_put_col_value(MPL *mpl, int j, double val); 1.2573 +/* store column value */ 1.2574 +#endif 1.2575 + 1.2576 +#define mpl_postsolve _glp_mpl_postsolve 1.2577 +int mpl_postsolve(MPL *mpl); 1.2578 +/* postsolve model */ 1.2579 + 1.2580 +#define mpl_terminate _glp_mpl_terminate 1.2581 +void mpl_terminate(MPL *mpl); 1.2582 +/* free all resources used by translator */ 1.2583 + 1.2584 +#endif 1.2585 + 1.2586 +/* eof */