85#pragma GCC diagnostic ignored "-Wshadow"
87#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
91#include "mp/nl-reader.h"
92#include "mp/nl-writer2.hpp"
93#include "mp/nl-opcodes.h"
95#define READER_NAME "nlreader"
96#define READER_DESC "AMPL .nl file reader"
97#define READER_EXTENSION "nl"
101#define SCIP_CALL_THROW(x) \
104 SCIP_RETCODE throw_retcode; \
105 if( ((throw_retcode) = (x)) != SCIP_OKAY ) \
106 throw std::logic_error("Error <" + std::to_string((long long)throw_retcode) + "> in function call at reader_nl.cpp:" + std::to_string(__LINE__)); \
115struct SCIP_ProbNlData
120 int amplopts[mp::MAX_AMPL_OPTIONS];
150 std::vector<SCIP_EXPR*> varexprs;
154 std::vector<std::vector<std::pair<SCIP_Real, SCIP_VAR*> > > nlconslin;
162 std::vector<SCIP_EXPR*> commonexprs;
170 std::vector<SCIP_EXPR*> exprstorelease;
179 std::map<int, std::vector<int> > sosvars;
180 std::vector<int> sosweights;
192 const char*& namesbegin,
193 const char* namesend,
197 if( namesbegin ==
NULL )
203 while( namesbegin != namesend )
212 if( *namesbegin ==
'\n' )
218 *(name++) = *(namesbegin++);
231 void LogicalExprToVarVal(
265 OnUnhandled(
"logical expression must be binary or constant");
290 const char* extstart = strrchr(
const_cast<char*
>(filename),
'.');
291 if( extstart !=
NULL )
292 probdata->filenamestublen = extstart - filename;
294 probdata->filenamestublen = strlen(filename);
295 assert(probdata->filenamestublen > 0);
297 memcpy(probdata->filenamestub, filename, probdata->filenamestublen);
298 probdata->filenamestub[probdata->filenamestublen] =
'\0';
301 const char* probname = strrchr(probdata->filenamestub,
'/');
302 if( probname ==
NULL )
303 probname = probdata->filenamestub;
314 probdata->filenamestub[probdata->filenamestublen] =
'.';
315 probdata->filenamestub[probdata->filenamestublen+1] =
'c';
316 probdata->filenamestub[probdata->filenamestublen+2] =
'o';
317 probdata->filenamestub[probdata->filenamestublen+3] =
'l';
318 probdata->filenamestub[probdata->filenamestublen+4] =
'\0';
319 colfile =
new fmt::File(probdata->filenamestub, fmt::File::RDONLY);
321 probdata->filenamestub[probdata->filenamestublen+1] =
'r';
322 probdata->filenamestub[probdata->filenamestublen+3] =
'w';
323 rowfile =
new fmt::File(probdata->filenamestub, fmt::File::RDONLY);
325 catch(
const fmt::SystemError& e )
330 probdata->filenamestub[probdata->filenamestublen] =
'\0';
343 assert(exprstorelease.empty());
353 const mp::NLHeader&
h
362 probdata->namplopts =
h.num_ampl_options;
367 mp::MemoryMappedFile<> mapped_colfile;
368 if( colfile !=
NULL )
369 mapped_colfile.map(*colfile,
"colfile");
370 const char* varnamesbegin = mapped_colfile.start();
371 const char* varnamesend = mapped_colfile.start() + mapped_colfile.size();
373 mp::MemoryMappedFile<> mapped_rowfile;
374 if( rowfile !=
NULL )
375 mapped_rowfile.map(*rowfile,
"rowfile");
376 const char* consnamesbegin = mapped_rowfile.start();
377 const char* consnamesend = mapped_rowfile.start() + mapped_rowfile.size();
379 probdata->nvars =
h.num_vars;
383 nnlvars =
MAX(
h.num_nl_vars_in_cons,
h.num_nl_vars_in_objs);
384 varexprs.resize(nnlvars);
388 for(
int i = 0;
i <
h.num_vars; ++
i )
392 if(
i <
h.num_nl_vars_in_both -
h.num_nl_integer_vars_in_both )
394 else if(
i <
h.num_nl_vars_in_both )
397 else if(
i <
h.num_nl_vars_in_cons -
h.num_nl_integer_vars_in_cons )
399 else if(
i <
h.num_nl_vars_in_cons )
402 else if(
i <
h.num_nl_vars_in_objs -
h.num_nl_integer_vars_in_objs )
404 else if(
i <
h.num_nl_vars_in_objs )
407 else if(
i <
h.num_vars -
h.num_linear_binary_vars -
h.num_linear_integer_vars )
409 else if(
i <
h.num_vars -
h.num_linear_integer_vars )
414 if( !nextName(varnamesbegin, varnamesend, name) )
448 probdata->nconss =
h.num_algebraic_cons;
450 nlconslin.resize(
h.num_nl_cons);
456 for(
int i = 0;
i <
h.num_nl_cons; ++
i )
459 if( !nextName(consnamesbegin, consnamesend, name) )
467 for(
int i =
h.num_nl_cons;
i <
h.num_algebraic_cons; ++
i )
469 if( !nextName(consnamesbegin, consnamesend, name) )
474 if(
h.num_nl_cons == 0 &&
h.num_logical_cons == 0 &&
h.num_integer_vars() == 0 )
475 probdata->islp =
true;
478 commonexprs.resize(
h.num_common_exprs());
491 exprstorelease.push_back(expr);
501 assert(variableIndex >= 0);
502 assert(variableIndex < (
int)varexprs.size());
505 return varexprs[variableIndex];
520 case mp::expr::MINUS:
543 case mp::expr::LOG10:
566 OnUnhandled(mp::expr::str(kind));
571 exprstorelease.push_back(expr);
584 SCIP_EXPR* children[2] = { firstChild, secondChild };
612 case mp::expr::POW_CONST_BASE:
613 case mp::expr::POW_CONST_EXP:
653 OnUnhandled(mp::expr::str(kind));
658 exprstorelease.push_back(expr);
669 std::shared_ptr<std::vector<SCIP_EXPR*> >
v;
677 v->reserve(num_args);
706 exprstorelease.push_back(expr);
717 if( objectiveIndex >= 1 )
718 OnUnhandled(
"multiple objective functions");
736 objexpr = nonlinearExpression;
785 if( num_linear_terms > 0 )
788 amplph.commonexprs[index] = commonexpr;
789 amplph.exprstorelease.push_back(commonexpr);
804 if( var_index < (
int)amplph.varexprs.size() )
827 assert(index < (
int)commonexprs.size());
839 if( commonexprs[index] !=
NULL )
847 else if( expr !=
NULL )
849 commonexprs[index] = expr;
859 assert(expr_index < (
int)commonexprs.size());
861 return commonexprs[expr_index];
871 assert(variableIndex >= 0);
896 assert(index < probdata->nconss);
899 if( index < (
int)nlconslin.size() )
940 if( initsol ==
NULL )
961 return ColumnSizeHandler();
1003 case mp::suf::Kind::CON:
1004 if( strncmp(name.data(),
"initial", name.size()) == 0 )
1006 suffix = CONSINITIAL;
1008 else if( strncmp(name.data(),
"separate", name.size()) == 0 )
1010 suffix = CONSSEPARATE;
1012 else if( strncmp(name.data(),
"enforce", name.size()) == 0 )
1014 suffix = CONSENFORCE;
1016 else if( strncmp(name.data(),
"check", name.size()) == 0 )
1020 else if( strncmp(name.data(),
"propagate", name.size()) == 0 )
1022 suffix = CONSPROPAGATE;
1024 else if( strncmp(name.data(),
"dynamic", name.size()) == 0 )
1026 suffix = CONSDYNAMIC;
1028 else if( strncmp(name.data(),
"removable", name.size()) == 0 )
1030 suffix = CONSREMOVABLE;
1038 case mp::suf::Kind::CON_BIT:
1042 case mp::suf::Kind::VAR:
1044 if( strncmp(name.data(),
"initial", name.size()) == 0 )
1046 suffix = VARINITIAL;
1048 else if( strncmp(name.data(),
"removable", name.size()) == 0 )
1050 suffix = VARREMOVABLE;
1052 else if( strncmp(name.data(),
"sosno", name.size()) == 0 )
1057 else if( strncmp(name.data(),
"ref", name.size()) == 0 )
1061 amplph.sosweights.resize(amplph.probdata->nvars, 0);
1069 case mp::suf::Kind::VAR_BIT:
1073 case mp::suf::Kind::OBJ:
1077 case mp::suf::Kind::OBJ_BIT:
1081 case mp::suf::Kind::PROBLEM:
1085 case mp::suf::Kind::PROB_BIT:
1143 amplph.sosvars[(int)value].push_back(index);
1148 amplph.sosweights[index] = (int)value;
1157 fmt::StringRef name,
1168 fmt::StringRef name,
1185 int constraintIndex;
1191 int constraintIndex_
1194 constraintIndex(constraintIndex_)
1196 assert(constraintIndex_ >= 0);
1197 assert(constraintIndex_ < amplph.probdata->nconss);
1213 assert(variableIndex >= 0);
1216 if( coefficient == 0.0 )
1219 if( constraintIndex < 0 )
1223 else if( constraintIndex < (
int)amplph.nlconslin.size() )
1225 amplph.nlconslin[constraintIndex].push_back(std::pair<SCIP_Real, SCIP_VAR*>(coefficient, amplph.probdata->vars[variableIndex]));
1229 SCIP_CONS* lincons = amplph.probdata->conss[constraintIndex];
1243 if( objectiveIndex >= 1 )
1244 OnUnhandled(
"multiple objective functions");
1253 int constraintIndex,
1270 exprstorelease.push_back(expr);
1284 LogicalExprToVarVal(arg,
var, val);
1296 exprstorelease.push_back(expr);
1303 mp::expr::Kind kind,
1317 LogicalExprToVarVal(lhs, lhsvar, lhsval);
1318 LogicalExprToVarVal(rhs, rhsvar, rhsval);
1324 if( lhsvar ==
NULL && rhsvar ==
NULL )
1327 exprstorelease.push_back(expr);
1331 if( (lhsvar ==
NULL && lhsval != 0.0) || (rhsvar ==
NULL && rhsval != 0.0) )
1335 exprstorelease.push_back(expr);
1339 if( lhsvar ==
NULL )
1347 if( rhsvar ==
NULL )
1360 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1364 exprstorelease.push_back(expr);
1380 if( lhsvar ==
NULL && rhsvar ==
NULL )
1383 exprstorelease.push_back(expr);
1387 if( (lhsvar ==
NULL && lhsval == 0.0) || (rhsvar ==
NULL && rhsval == 0.0) )
1391 exprstorelease.push_back(expr);
1395 if( lhsvar ==
NULL )
1403 if( rhsvar ==
NULL )
1416 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1420 exprstorelease.push_back(expr);
1438 if( lhsvar ==
NULL && rhsvar ==
NULL )
1441 exprstorelease.push_back(expr);
1445 if( lhsvar ==
NULL )
1447 std::swap(lhs, rhs);
1448 std::swap(lhsval, rhsval);
1449 std::swap(lhsvar, rhsvar);
1453 if( rhsvar ==
NULL )
1457 if( rhsval ==
TRUE )
1465 exprstorelease.push_back(expr);
1475 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1479 exprstorelease.push_back(expr);
1494 OnUnhandled(mp::expr::str(kind));
1504 mp::expr::Kind kind,
1518 LogicalExprToVarVal(lhs, lhsvar, lhsval);
1519 LogicalExprToVarVal(rhs, rhsvar, rhsval);
1526 bool isne = (kind == mp::expr::NE);
1527 if( lhsvar ==
NULL && rhsvar ==
NULL )
1530 exprstorelease.push_back(expr);
1534 if( lhsvar ==
NULL )
1536 std::swap(lhs, rhs);
1537 std::swap(lhsval, rhsval);
1538 std::swap(lhsvar, rhsvar);
1542 if( rhsvar ==
NULL )
1554 exprstorelease.push_back(expr);
1565 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1569 exprstorelease.push_back(expr);
1584 OnUnhandled(mp::expr::str(kind));
1601 if( objexpr !=
NULL )
1615 if( initsol !=
NULL )
1634 for(
size_t i = 0;
i < nlconslin.size(); ++
i )
1636 for(
size_t j = 0; j < nlconslin[
i].size(); ++j )
1643 for(
int i = 0;
i < probdata->nconss; ++
i )
1649 std::vector<SCIP_VAR*> setvars;
1650 std::vector<SCIP_Real> setweights;
1651 if( !sosvars.empty() )
1653 setvars.resize(probdata->nvars);
1654 probdata->islp =
false;
1656 if( !sosweights.empty() )
1657 setweights.resize(probdata->nvars);
1658 for( std::map<
int, std::vector<int> >::iterator sosit(sosvars.begin()); sosit != sosvars.end(); ++sosit )
1660 assert(sosit->first != 0);
1661 assert(!sosit->second.empty());
1664 bool issos2 = sosit->first < 0;
1666 if( issos2 && sosweights.empty() )
1671 OnUnhandled(
"SOS2 requires variable .ref suffix");
1674 for(
size_t i = 0;
i < sosit->second.size(); ++
i )
1676 int varidx = sosit->second[
i];
1677 setvars[
i] = probdata->vars[
varidx];
1679 if( issos2 && sosweights[
varidx] == 0 )
1681 OnUnhandled(
"Missing .ref value for SOS2 variable");
1682 if( !sosweights.empty() )
1690 (void)
SCIPsnprintf(name, 20,
"sos1_%d", sosit->first);
1695 (void)
SCIPsnprintf(name, 20,
"sos2_%d", -sosit->first);
1703 if( initsol !=
NULL )
1720 if( initsol !=
NULL )
1726 while( !exprstorelease.empty() )
1729 exprstorelease.pop_back();
1733 while( !varexprs.empty() )
1736 varexprs.pop_back();
1747 const char* probname;
1768 mp::NLHeader nlheader;
1784 ConNonlinearVars = 0,
1785 ConNonlinearVarsInt = 1,
1794 void analyseVariables()
1796 NlVarType* vartype =
NULL;
1799 int nlvars_cons = 0;
1800 int binvars_lin = 0;
1801 int intvars_lin = 0;
1802 int discrvars_nlcons = 0;
1804 nlheader.max_var_name_len = 0;
1807 nlheader.num_obj_nonzeros = 0;
1809 if( conshdlr_nonlinear !=
NULL )
1815 for(
int i = 0;
i < nactivevars + nfixedvars; ++
i )
1817 SCIP_VAR*
var = (
i < nactivevars ? activevars[
i] : fixedvars[
i-nactivevars]);
1822 ++nlheader.num_obj_nonzeros;
1832 if( var2expr !=
NULL )
1850 vartype[
i] = ConNonlinearVarsInt;
1853 vartype[
i] = ConNonlinearVars;
1864 vartype[
i] = LinearVarsBool;
1869 vartype[
i] = LinearVarsInt;
1873 vartype[
i] = LinearVars;
1879 if( namelen > nlheader.max_var_name_len )
1880 nlheader.max_var_name_len = namelen;
1889 for(
int vtype = ConNonlinearVars; vtype <= LinearVarsInt; ++vtype )
1890 for(
int i = 0;
i < nactivevars + nfixedvars; ++
i )
1891 if( vartype[
i] == (NlVarType)vtype )
1893 vars[nvars] = (
i < nactivevars ? activevars[
i] : fixedvars[
i-nactivevars]);
1897 assert(nvars == nactivevars + nfixedvars);
1901 nlheader.num_vars = nvars;
1907 nlheader.num_nl_vars_in_cons = nlvars_cons;
1908 nlheader.num_nl_vars_in_objs = nlvars_cons;
1909 nlheader.num_nl_vars_in_both = 0;
1912 nlheader.num_linear_net_vars = 0;
1915 nlheader.num_linear_binary_vars = binvars_lin;
1916 nlheader.num_linear_integer_vars = intvars_lin;
1919 nlheader.num_nl_integer_vars_in_both = 0;
1920 nlheader.num_nl_integer_vars_in_cons = discrvars_nlcons;
1921 nlheader.num_nl_integer_vars_in_objs = 0;
1927 void analyzeConstraints()
1935 if( nlheader.num_nl_vars_in_cons > 0 )
1937 for(
int i = 0;
i < nallconss; ++
i )
1942 algconss[nalgconss] = cons;
1950 nlheader.num_nl_cons = nalgconss;
1957 nlheader.num_ranges = 0;
1958 nlheader.num_eqns = 0;
1959 nlheader.max_con_name_len = 0;
1960 nlheader.num_con_nonzeros = 0;
1961 for(
int i = 0;
i < nallconss; ++
i )
1968 if( conshdlr == conshdlr_nonlinear )
1979 if( conshdlr == conshdlr_linear )
1985 for(
int v = 0; v < nconsvars; ++v )
1987 negconstant += conscoefs[v];
1997 else if( conshdlr == conshdlr_setppc )
2002 for(
int v = 0; v < nconsvars; ++v )
2009 lhs = 1.0 - negconstant;
2010 rhs = 1.0 - negconstant;
2013 lhs = 1.0 - negconstant;
2018 rhs = 1.0 - negconstant;
2021 throw mp::UnsupportedError(
"Unexpected SETPPC type");
2024 else if( conshdlr == conshdlr_logicor )
2029 for(
int v = 0; v < nconsvars; ++v )
2033 lhs = 1.0 - negconstant;
2036 else if( conshdlr == conshdlr_knapsack )
2042 for(
int v = 0; v < nconsvars; ++v )
2044 negweights += weights[v];
2049 else if( conshdlr == conshdlr_varbound )
2071 algconss[nalgconss] = cons;
2072 algconsslhs[nalgconss] = lhs;
2073 algconssrhs[nalgconss] = rhs;
2080 ++nlheader.num_eqns;
2082 ++nlheader.num_ranges;
2088 if( namelen > nlheader.max_con_name_len )
2089 nlheader.max_con_name_len = namelen;
2102 nlheader.num_con_nonzeros += nvarsincons;
2105 assert(nalgconss <= nallconss);
2110 for(
int i = 0;
i < nfixedvars; ++
i )
2121 nlheader.num_con_nonzeros += 2;
2137 if( namelen > nlheader.max_con_name_len )
2138 nlheader.max_con_name_len = namelen;
2141 aggconss[naggconss] =
var;
2144 ++nlheader.num_eqns;
2147 nlheader.num_algebraic_cons = nalgconss + naggconss;
2148 nlheader.num_logical_cons = 0;
2151 nlheader.num_compl_conds = 0;
2152 nlheader.num_nl_compl_conds = 0;
2153 nlheader.num_compl_dbl_ineqs = 0;
2154 nlheader.num_compl_vars_with_nz_lb = 0;
2157 nlheader.num_nl_net_cons = 0;
2158 nlheader.num_linear_net_cons = 0;
2162 int getVarAMPLIndex(
2178 const char* probname_,
2193 probname(probname_),
2194 objsense(objsense_),
2195 objscale(objscale_),
2196 objoffset(objoffset_),
2198 nactivevars(nvars_),
2199 fixedvars(fixedvars_),
2200 nfixedvars(nfixedvars_),
2203 nlcomments(nlcomments_),
2204 genericnames(genericnames_),
2215 nlheader.format = nlbinary_ ? mp::NLHeader::BINARY : mp::NLHeader::TEXT;
2232 if( var2idx !=
NULL )
2246 analyzeConstraints();
2248 nlheader.prob_name = probname;
2253 if( nlheader.num_obj_nonzeros == 0 && objoffset == 0.0 )
2254 nlheader.num_objs = 0;
2256 nlheader.num_objs = 1;
2257 nlheader.num_nl_objs = 0;
2260 nlheader.num_funcs = 0;
2266 nlheader.num_common_exprs_in_both = 0;
2267 nlheader.num_common_exprs_in_cons = 0;
2268 nlheader.num_common_exprs_in_objs = 0;
2269 nlheader.num_common_exprs_in_single_cons = 0;
2270 nlheader.num_common_exprs_in_single_objs = 0;
2295 template <
class ObjGradWriter>
2303 if( nlheader.num_obj_nonzeros == 0 )
2306 auto gvw = gw.MakeVectorWriter(nlheader.num_obj_nonzeros);
2307 for(
int v = 0; v < nvars; ++v )
2311 gvw.Write(v, objscale * coef);
2315 template <
class ObjExprWriter>
2322 ew.NPut(objscale * objoffset);
2325 template <
class VarBoundsWriter>
2327 VarBoundsWriter& vbw
2330 for(
int v = 0; v < nvars; ++v )
2341 vbw.WriteLbUb(lb, ub);
2345 template <
class ConBoundsWriter>
2347 ConBoundsWriter& cbw
2350 for(
int c = 0;
c < nalgconss; ++
c )
2355 cbw.WriteAlgConRange(bnd);
2358 for(
int v = 0; v < naggconss; ++v )
2383 cbw.WriteAlgConRange(bnd);
2395 assert(
i < nalgconss + naggconss);
2399 template <
class ConLinearExprWriter>
2402 ConLinearExprWriter& clw
2405 if(
i < nlheader.num_nl_cons )
2413 if( conshdlr == conshdlr_linear )
2423 if( nconsvars == 0 )
2426 auto vw = clw.MakeVectorWriter(nconsvars);
2427 for(
int v = 0; v < nconsvars; ++v )
2431 vw.Write(getVarAMPLIndex(consvars[v]), conscoefs[v]);
2436 if( conshdlr == conshdlr_setppc )
2441 if( nconsvars == 0 )
2444 auto vw = clw.MakeVectorWriter(nconsvars);
2445 for(
int v = 0; v < nconsvars; ++v )
2449 vw.Write(getVarAMPLIndex(consvars[v]), 1.0);
2454 if( conshdlr == conshdlr_logicor )
2459 if( nconsvars == 0 )
2462 auto vw = clw.MakeVectorWriter(nconsvars);
2463 for(
int v = 0; v < nconsvars; ++v )
2467 vw.Write(getVarAMPLIndex(consvars[v]), 1.0);
2472 if( conshdlr == conshdlr_knapsack )
2478 if( nconsvars == 0 )
2481 auto vw = clw.MakeVectorWriter(nconsvars);
2482 for(
int v = 0; v < nconsvars; ++v )
2486 vw.Write(getVarAMPLIndex(consvars[v]), (
SCIP_Real)weights[v]);
2491 assert(conshdlr == conshdlr_varbound);
2493 auto vw = clw.MakeVectorWriter(2);
2507 assert(
i < nalgconss + naggconss);
2515 auto vw = clw.MakeVectorWriter(2);
2516 vw.Write(getVarAMPLIndex(
var), 1.0);
2524 auto vw = clw.MakeVectorWriter(2);
2525 vw.Write(getVarAMPLIndex(
var), 1.0);
2534 vw.Write(getVarAMPLIndex(
var), 1.0);
2548 template <
class ConExprWriter>
2554 if(
i >= nlheader.num_nl_cons )
2561 std::stringstream unhandledexprmsg;
2578 ConExprWriter* parentew;
2579 if( expr == rootexpr )
2585 ConExprWriter* newew =
NULL;
2592 ConExprWriter ew2(parentew->OPut2(mp::nl::SUB));
2635 memcpy((
void*)(newew+1), (
void*)parentew,
sizeof(ConExprWriter));
2637 else if( nargs == 2 )
2639 new (newew+1) ConExprWriter(parentew->OPut2(mp::nl::ADD));
2643 new (newew+1) ConExprWriter(parentew->OPutN(mp::nl::SUM, nargs));
2656 newew =
new ConExprWriter(parentew->OPut2(mp::nl::MUL));
2666 newew =
new ConExprWriter(parentew->OPut1(mp::nl::POW2));
2668 newew =
new ConExprWriter(parentew->OPut1(mp::nl::SQRT));
2670 newew =
new ConExprWriter(parentew->OPut2(mp::nl::POW_CONST_EXP));
2674 newew =
new ConExprWriter(parentew->OPut1(mp::nl::LOG));
2678 newew =
new ConExprWriter(parentew->OPut1(mp::nl::EXP));
2682 newew =
new ConExprWriter(parentew->OPut1(mp::nl::ABS));
2686 newew =
new ConExprWriter(parentew->OPut1(mp::nl::SIN));
2690 newew =
new ConExprWriter(parentew->OPut1(mp::nl::COS));
2698 parentew->NPut(0.0);
2724 new (ews) ConExprWriter(ews[1].OPut2(mp::nl::MUL));
2732 memcpy((
void*)ews, (
void*)(ews+1),
sizeof(ConExprWriter));
2749 ews->~ConExprWriter();
2755 memcpy((
void*)(ews+1), (
void*)ews,
sizeof(ConExprWriter));
2764 if( childidx < nchildren-2 )
2768 ConExprWriter* newew =
new ConExprWriter(ew2->OPut2(mp::nl::MUL));
2788 ConExprWriter* parentew;
2789 if( expr == rootexpr )
2795 memcpy((
void*)parentew, (
void*)(ews+1),
sizeof(ConExprWriter));
2800 ews[1].~ConExprWriter();
2819 if( unhandledexprmsg.tellp() > 0 )
2820 throw mp::UnsupportedError(unhandledexprmsg.str());
2823 template <
class RowObjNameWriter>
2825 RowObjNameWriter& wrt
2828 if( !wrt || genericnames )
2831 for(
int c = 0;
c < nalgconss; ++
c )
2834 for(
int v = 0; v < naggconss; ++v )
2836 std::string aggname(
"aggr_");
2838 wrt << aggname.c_str();
2844 template <
class ColNameWriter>
2849 if( !wrt || genericnames )
2852 for(
int v = 0; v < nvars; ++v )
2869 assert(probnldata->vars !=
NULL || probnldata->nvars == 0);
2870 assert(probnldata->conss !=
NULL || probnldata->conss == 0);
2872 for(
i = 0;
i < probnldata->nconss; ++
i )
2878 for(
i = 0;
i < probnldata->nvars; ++
i )
2923 mp::ReadNLFile(filename, handler);
2925 catch(
const mp::UnsupportedError& e )
2927 SCIPerrorMessage(
"unsupported construct in AMPL .nl file %s: %s\n", filename, e.what());
2933 catch(
const mp::Error& e )
2942 catch(
const fmt::SystemError& e )
2951 catch(
const std::bad_alloc& e )
2960 catch(
const std::exception& e )
2981 mp::WriteNLResult writerresult;
2984 char* tempdir =
NULL;
2985 char* tempnamestub =
NULL;
2986 char* tempname =
NULL;
2987 FILE* tempfile =
NULL;
2997 name, objsense,
objscale, objoffset,
3000 binary, comments, genericnames);
3008 mp::NLUtils nlutils;
3014 TCHAR systemtmp[MAX_PATH + 1];
3015 DWORD gettemprc = GetTempPathA(MAX_PATH + 1, systemtmp);
3016 if( gettemprc == 0 || gettemprc > MAX_PATH + 1 )
3018 SCIPerrorMessage(
"Cannot get name of directory for temporary files: error %d\n", errno);
3023 const char* systemtmp = getenv(
"TMPDIR");
3024 if( systemtmp ==
NULL )
3027 templen = strlen(systemtmp) + 30;
3032 if( _mktemp_s(tempdir, templen) )
3034 SCIPerrorMessage(
"Cannot generate name for temporary directory from template <%s>: error %d\n", tempdir, errno);
3038 if( _mkdir(tempdir) )
3040 SCIPerrorMessage(
"Cannot create temporary directory with name <%s>: error %d\n", tempdir, errno);
3045 if( mkdtemp(tempdir) ==
NULL )
3047 SCIPerrorMessage(
"Cannot generate temporary directory from template <%s>: error %d\n", tempdir, errno);
3057 SCIPdebugMsg(
scip,
"Temporary file stub for NL writing: %s\n", tempnamestub);
3059 writerresult = mp::WriteNLFile(tempnamestub, nlf, nlutils);
3063 (void)
SCIPsnprintf(tempname, templen,
"%s.nl", tempnamestub);
3065 switch( writerresult.first )
3067 case NLW2_WriteNL_OK:
3069 case NLW2_WriteNL_CantOpen:
3073 case NLW2_WriteNL_Failed:
3077 case NLW2_WriteNL_Unset:
3085 tempfile = fopen(tempname,
"rb");
3086 if( tempfile ==
NULL )
3088 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3092 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3093 fwrite(buf, 1, n, file !=
NULL ? file : stdout);
3098 if( !genericnames && filename !=
NULL )
3100 char* filename2 =
NULL;
3108 filenamelen = strlen(filename);
3110 memcpy(filename2, filename, filenamelen+1);
3113 filename2[filenamelen-3] =
'\0';
3118 SCIPsnprintf(tempname, templen,
"%s.row", tempnamestub);
3119 strcpy(filename2 + filenamelen,
".row");
3121 tempfile = fopen(tempname,
"rb");
3122 if( tempfile ==
NULL )
3124 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3127 file2 = fopen(filename2,
"wb");
3130 SCIPerrorMessage(
"Cannot open file <%s> for writing: error %d\n", filename2, errno);
3134 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3135 fwrite(buf, 1, n, file2);
3142 SCIPsnprintf(tempname, templen,
"%s.col", tempnamestub);
3143 strcpy(filename2 + filenamelen,
".col");
3145 tempfile = fopen(tempname,
"rb");
3146 if( tempfile ==
NULL )
3148 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3151 file2 = fopen(filename2,
"wb");
3154 SCIPerrorMessage(
"Cannot open file <%s> for writing: error %d\n", filename2, errno);
3158 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3159 fwrite(buf, 1, n, file2);
3172 catch(
const mp::UnsupportedError& e )
3177 catch(
const mp::Error& e )
3183 catch(
const fmt::SystemError& e )
3189 catch(
const std::bad_alloc& e )
3194 catch(
const std::exception& e )
3201 if( tempname !=
NULL )
3209 if( tempdir !=
NULL )
3240 "reading/" READER_NAME "/binary",
"should nl files be written in binary format",
3243 "reading/" READER_NAME "/comments",
"should comments be written to nl files",
3264 if( probdata ==
NULL )
3270 probdata->filenamestub[probdata->filenamestublen] =
'.';
3271 probdata->filenamestub[probdata->filenamestublen+1] =
's';
3272 probdata->filenamestub[probdata->filenamestublen+2] =
'o';
3273 probdata->filenamestub[probdata->filenamestublen+3] =
'l';
3274 probdata->filenamestub[probdata->filenamestublen+4] =
'\0';
3276 FILE* solfile = fopen(probdata->filenamestub,
"w");
3277 if( solfile ==
NULL )
3279 SCIPerrorMessage(
"could not open file <%s> for writing\n", probdata->filenamestub);
3280 probdata->filenamestub[probdata->filenamestublen] =
'\0';
3284 probdata->filenamestub[probdata->filenamestublen] =
'\0';
3291 for(
int i = 0;
i < probdata->namplopts; ++
i )
3297 SCIPinfoMessage(
scip, solfile,
"%d\n%d\n", probdata->nconss, havedual ? probdata->nconss : 0);
3298 SCIPinfoMessage(
scip, solfile,
"%d\n%d\n", probdata->nvars, haveprimal ? probdata->nvars : 0);
3303 for(
int c = 0;
c < probdata->nconss; ++
c )
3312 if( transcons ==
NULL )
3324 for(
int i = 0;
i < probdata->nvars; ++
i )
3330 int solve_result_num = mp::sol::FAILURE;
3338 solve_result_num = mp::sol::LIMIT_FEAS_INTERRUPT;
3340 solve_result_num = mp::sol::LIMIT_NO_FEAS_INTERRUPT;
3346 solve_result_num = mp::sol::LIMIT_FEAS_NODES;
3348 solve_result_num = mp::sol::LIMIT_NO_FEAS_NODES;
3352 solve_result_num = mp::sol::LIMIT_FEAS_TIME;
3354 solve_result_num = mp::sol::LIMIT_NO_FEAS_TIME;
3358 solve_result_num = mp::sol::LIMIT_FEAS_SOFTMEM;
3360 solve_result_num = mp::sol::LIMIT_NO_FEAS_SOFTMEM;
3365 solve_result_num = mp::sol::LIMIT_FEAS_WORK;
3367 solve_result_num = mp::sol::LIMIT_NO_FEAS_WORK;
3370 solve_result_num = mp::sol::LIMIT_FEAS_BESTOBJ;
3374 solve_result_num = mp::sol::LIMIT_FEAS_BESTBND;
3376 solve_result_num = mp::sol::LIMIT_NO_FEAS_BESTBND;
3380 solve_result_num = mp::sol::LIMIT_FEAS_NUMSOLS;
3382 solve_result_num = mp::sol::LIMIT_NO_FEAS;
3388 solve_result_num = mp::sol::LIMIT_FEAS;
3390 solve_result_num = mp::sol::LIMIT_NO_FEAS;
3393 solve_result_num = mp::sol::SOLVED;
3396 solve_result_num = mp::sol::INFEASIBLE;
3400 solve_result_num = mp::sol::UNBOUNDED_FEAS;
3402 solve_result_num = mp::sol::UNBOUNDED_NO_FEAS;
3405 solve_result_num = mp::sol::LIMIT_INF_UNB;
3410 if( fclose(solfile) != 0 )
void AddTerm(int var_index, double coef)
receives notification of a term in the linear expression
LinearExprHandler(AMPLProblemHandler &lph_, int index, int num_linear_terms)
constructor
LinearPartHandler(AMPLProblemHandler &lph_)
void AddTerm(int variableIndex, double coefficient)
LinearPartHandler(AMPLProblemHandler &lph_, int constraintIndex_)
NumericArgHandler(int num_args)
constructor
void AddArg(SCIP_EXPR *term)
adds term to sum
std::shared_ptr< std::vector< SCIP_EXPR * > > v
void SetValue(int index, T value)
SuffixHandler(AMPLProblemHandler &lph_, fmt::StringRef name, mp::suf::Kind kind)
constructor
implementation of AMPL/MPs NLHandler that constructs a SCIP problem while a .nl file is read
void EndCommonExpr(int index, SCIP_EXPR *expr, int)
receive notification of the end of a common expression
LinearPartHandler LinearObjHandler
NumericArgHandler BeginSum(int num_args)
receive notification of the beginning of a summation
void OnAlgebraicCon(int constraintIndex, SCIP_EXPR *expr)
receive notification of an algebraic constraint expression
LinearPartHandler OnLinearObjExpr(int objectiveIndex, int)
receive notification of the linear part of an objective
LogicalExpr OnBinaryLogical(mp::expr::Kind kind, LogicalExpr lhs, LogicalExpr rhs)
receives notification of a binary logical expression <mp::expr::FIRST_BINARY_LOGICAL>
LogicalExpr OnNot(LogicalExpr arg)
receives notification of a logical not <mp::expr::NOT>
SCIP_EXPR * OnBinary(mp::expr::Kind kind, SCIP_EXPR *firstChild, SCIP_EXPR *secondChild)
receive notification of a binary expression
SCIP_EXPR * OnNumber(double value)
receive notification of a number in a nonlinear expression
LogicalExpr OnRelational(mp::expr::Kind kind, NumericExpr lhs, NumericExpr rhs)
SuffixHandler< int > IntSuffixHandler
LinearExprHandler BeginCommonExpr(int index, int num_linear_terms)
receive notification of the beginning of a common expression (defined variable)
AMPLProblemHandler(const AMPLProblemHandler &)=delete
LinearConHandler OnLinearConExpr(int constraintIndex, int)
receive notification of the linear part of a constraint
void OnInitialValue(int var_index, double value)
receive notification of the initial value for a variable
SCIP_EXPR * OnVariableRef(int variableIndex)
receive notification of a variable reference in a nonlinear expression
AMPLProblemHandler(SCIP *scip_, const char *filename)
ColumnSizeHandler OnColumnSizes()
receives notification of Jacobian column sizes
AMPLProblemHandler & operator=(const AMPLProblemHandler &)=delete
LinearPartHandler LinearConHandler
void OnVarBounds(int variableIndex, double variableLB, double variableUB)
receive notification of variable bounds
SCIP_EXPR * OnCommonExprRef(int expr_index)
receive notification of a common expression (defined variable) reference
~AMPLProblemHandler() override
void OnHeader(const mp::NLHeader &h)
void OnLogicalCon(int index, LogicalExpr expr)
receives notification of a logical constraint expression
DblSuffixHandler OnDblSuffix(fmt::StringRef name, mp::suf::Kind kind, int)
receive notification of a double suffix
void OnConBounds(int index, double lb, double ub)
receive notification of constraint sides
IntSuffixHandler OnIntSuffix(fmt::StringRef name, mp::suf::Kind kind, int)
receive notification of an integer suffix
LogicalExpr OnBool(bool value)
receives notification of a Boolean value <mp::expr::BOOL>
SCIP_EXPR * OnUnary(mp::expr::Kind kind, SCIP_EXPR *child)
receive notification of a unary expression
SCIP_EXPR * EndSum(NumericArgHandler handler)
receive notification of the end of a summation
void OnInitialDualValue(int, double)
receives notification of the initial value for a dual variable
SuffixHandler< SCIP_Real > DblSuffixHandler
void OnObj(int objectiveIndex, mp::obj::Type type, SCIP_EXPR *nonlinearExpression)
receive notification of an objective type and the nonlinear part of an objective expression
void FeedConExpression(int i, ConExprWriter &ew)
SCIPNLFeeder(SCIP *scip_, const char *probname_, SCIP_OBJSENSE objsense_, SCIP_Real objscale_, SCIP_Real objoffset_, SCIP_VAR **vars_, int nvars_, SCIP_VAR **fixedvars_, int nfixedvars_, SCIP_CONS **conss_, int nconss_, SCIP_Bool nlbinary_, SCIP_Bool nlcomments_, SCIP_Bool genericnames_)
Constructor.
void FeedObjGradient(int i, ObjGradWriter &gw)
void FeedVarBounds(VarBoundsWriter &vbw) const
void FeedObjExpression(int i, ObjExprWriter &ew)
bool WantNLComments() const
NL comments?
void FeedRowAndObjNames(RowObjNameWriter &wrt) const
int WantColumnSizes() const
void FeedLinearConExpr(int i, ConLinearExprWriter &clw)
void FeedConBounds(ConBoundsWriter &cbw)
const char * ConDescription(int i)
void FeedColNames(ColNameWriter &wrt) const
Constraint handler for AND constraints, .
Constraint handler for knapsack constraints of the form , x binary and .
Constraint handler for linear constraints in their most general form, .
Constraint handler for logicor constraints (equivalent to set covering, but algorithms are suited fo...
constraint handler for nonlinear constraints specified by algebraic expressions
Constraint handler for "or" constraints, .
Constraint handler for the set partitioning / packing / covering constraints .
constraint handler for SOS type 1 constraints
constraint handler for SOS type 2 constraints
Constraint handler for variable bound constraints .
Constraint handler for XOR constraints, .
absolute expression handler
exponential expression handler
logarithm expression handler
power and signed power expression handlers
product expression handler
handler for sin expressions
constant value expression handler
variable expression handler
SCIP_Real SCIPgetDualsolLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPaddLinearVarNonlinear(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real coef)
int SCIPgetNVarsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetVbdcoefVarbound(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsLogicor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetRhsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPchgRhsLinear(SCIP *scip, SCIP_CONS *cons, SCIP_Real rhs)
SCIP_RETCODE SCIPaddCoefLinear(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real val)
SCIP_RETCODE SCIPcreateConsBasicXor(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_Bool rhs, int nvars, SCIP_VAR **vars)
SCIP_Real SCIPgetLhsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPchgLhsNonlinear(SCIP *scip, SCIP_CONS *cons, SCIP_Real lhs)
SCIP_HASHMAP * SCIPgetVarExprHashmapNonlinear(SCIP_CONSHDLR *conshdlr)
int SCIPgetNVarsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicOr(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_VAR *resvar, int nvars, SCIP_VAR **vars)
SCIP_RETCODE SCIPchgRhsNonlinear(SCIP *scip, SCIP_CONS *cons, SCIP_Real rhs)
SCIP_Real * SCIPgetValsLinear(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicSOS1(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *weights)
SCIP_VAR * SCIPgetVbdvarVarbound(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs)
SCIP_VAR ** SCIPgetVarsSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_EXPR * SCIPgetExprNonlinear(SCIP_CONS *cons)
SCIP_Real SCIPgetRhsNonlinear(SCIP_CONS *cons)
SCIP_VAR * SCIPgetVarVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicNonlinear(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_EXPR *expr, SCIP_Real lhs, SCIP_Real rhs)
SCIP_Longint * SCIPgetWeightsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Longint SCIPgetCapacityKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetLhsVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_SETPPCTYPE SCIPgetTypeSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsLogicor(SCIP *scip, SCIP_CONS *cons)
SCIP_Real SCIPgetRhsVarbound(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsKnapsack(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicAnd(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_VAR *resvar, int nvars, SCIP_VAR **vars)
SCIP_RETCODE SCIPchgExprNonlinear(SCIP *scip, SCIP_CONS *cons, SCIP_EXPR *expr)
SCIP_RETCODE SCIPchgLhsLinear(SCIP *scip, SCIP_CONS *cons, SCIP_Real lhs)
SCIP_Real SCIPgetLhsNonlinear(SCIP_CONS *cons)
SCIP_RETCODE SCIPcreateConsBasicSOS2(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *weights)
@ SCIP_SETPPCTYPE_PARTITIONING
@ SCIP_SETPPCTYPE_COVERING
@ SCIP_SETPPCTYPE_PACKING
SCIP_RETCODE SCIPcreateExprVar(SCIP *scip, SCIP_EXPR **expr, SCIP_VAR *var, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprProduct(SCIP *scip, SCIP_EXPR **expr, int nchildren, SCIP_EXPR **children, SCIP_Real coefficient, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprSin(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_Bool SCIPisExprAbs(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPcreateExprCos(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprAbs(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_Bool SCIPisExprLog(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPappendExprSumExpr(SCIP *scip, SCIP_EXPR *expr, SCIP_EXPR *child, SCIP_Real childcoef)
SCIP_Bool SCIPisExprExp(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPcreateExprLog(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprExp(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_Bool SCIPisExprCos(SCIP *scip, SCIP_EXPR *expr)
SCIP_Bool SCIPisExprSin(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPcreateExprSum(SCIP *scip, SCIP_EXPR **expr, int nchildren, SCIP_EXPR **children, SCIP_Real *coefficients, SCIP_Real constant, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprValue(SCIP *scip, SCIP_EXPR **expr, SCIP_Real value, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_RETCODE SCIPcreateExprPow(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_Real exponent, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_Bool SCIPhasPerformedPresolve(SCIP *scip)
SCIP_RETCODE SCIPprintStatus(SCIP *scip, FILE *file)
SCIP_STATUS SCIPgetStatus(SCIP *scip)
SCIP_STAGE SCIPgetStage(SCIP *scip)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
SCIP_PROBDATA * SCIPgetProbData(SCIP *scip)
SCIP_RETCODE SCIPsetObjsense(SCIP *scip, SCIP_OBJSENSE objsense)
SCIP_OBJSENSE SCIPgetObjsense(SCIP *scip)
SCIP_RETCODE SCIPcreateProb(SCIP *scip, const char *name, SCIP_DECL_PROBDELORIG((*probdelorig)), SCIP_DECL_PROBTRANS((*probtrans)), SCIP_DECL_PROBDELTRANS((*probdeltrans)), SCIP_DECL_PROBINITSOL((*probinitsol)), SCIP_DECL_PROBEXITSOL((*probexitsol)), SCIP_DECL_PROBCOPY((*probcopy)), SCIP_PROBDATA *probdata)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapInsertInt(SCIP_HASHMAP *hashmap, void *origin, int image)
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_RETCODE SCIPgetBoolParam(SCIP *scip, const char *name, SCIP_Bool *value)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_RETCODE SCIPgetConsNVars(SCIP *scip, SCIP_CONS *cons, int *nvars, SCIP_Bool *success)
SCIP_CONSHDLR * SCIPconsGetHdlr(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConsSeparated(SCIP *scip, SCIP_CONS *cons, SCIP_Bool separate)
SCIP_RETCODE SCIPsetConsDynamic(SCIP *scip, SCIP_CONS *cons, SCIP_Bool dynamic)
SCIP_RETCODE SCIPsetConsInitial(SCIP *scip, SCIP_CONS *cons, SCIP_Bool initial)
SCIP_RETCODE SCIPsetConsEnforced(SCIP *scip, SCIP_CONS *cons, SCIP_Bool enforce)
const char * SCIPconsGetName(SCIP_CONS *cons)
SCIP_RETCODE SCIPsetConsRemovable(SCIP *scip, SCIP_CONS *cons, SCIP_Bool removable)
SCIP_RETCODE SCIPgetTransformedCons(SCIP *scip, SCIP_CONS *cons, SCIP_CONS **transcons)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_RETCODE SCIPsetConsPropagated(SCIP *scip, SCIP_CONS *cons, SCIP_Bool propagate)
SCIP_RETCODE SCIPsetConsChecked(SCIP *scip, SCIP_CONS *cons, SCIP_Bool check)
const char * SCIPexprhdlrGetName(SCIP_EXPRHDLR *exprhdlr)
SCIP_RETCODE SCIPevalExpr(SCIP *scip, SCIP_EXPR *expr, SCIP_SOL *sol, SCIP_Longint soltag)
int SCIPexprGetNChildren(SCIP_EXPR *expr)
SCIP_Real SCIPgetExponentExprPow(SCIP_EXPR *expr)
SCIP_Bool SCIPisExprProduct(SCIP *scip, SCIP_EXPR *expr)
SCIP_Bool SCIPexpriterIsEnd(SCIP_EXPRITER *iterator)
SCIP_EXPR * SCIPexpriterSkipDFS(SCIP_EXPRITER *iterator)
SCIP_Bool SCIPisExprSum(SCIP *scip, SCIP_EXPR *expr)
SCIP_Real * SCIPgetCoefsExprSum(SCIP_EXPR *expr)
SCIP_EXPRITER_USERDATA SCIPexpriterGetCurrentUserData(SCIP_EXPRITER *iterator)
SCIP_Bool SCIPisExprValue(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPreleaseExpr(SCIP *scip, SCIP_EXPR **expr)
SCIP_EXPR * SCIPexpriterGetCurrent(SCIP_EXPRITER *iterator)
void SCIPexpriterSetStagesDFS(SCIP_EXPRITER *iterator, SCIP_EXPRITER_STAGE stopstages)
SCIP_Bool SCIPisExprVar(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPcreateExpriter(SCIP *scip, SCIP_EXPRITER **iterator)
SCIP_EXPR * SCIPexpriterGetParentDFS(SCIP_EXPRITER *iterator)
SCIP_Real SCIPgetValueExprValue(SCIP_EXPR *expr)
void SCIPexpriterSetCurrentUserData(SCIP_EXPRITER *iterator, SCIP_EXPRITER_USERDATA userdata)
SCIP_Bool SCIPisExprPower(SCIP *scip, SCIP_EXPR *expr)
SCIP_Real SCIPexprGetEvalValue(SCIP_EXPR *expr)
SCIP_EXPR * SCIPexpriterGetNext(SCIP_EXPRITER *iterator)
SCIP_Real SCIPgetConstantExprSum(SCIP_EXPR *expr)
SCIP_VAR * SCIPgetVarExprVar(SCIP_EXPR *expr)
int SCIPexpriterGetChildIdxDFS(SCIP_EXPRITER *iterator)
void SCIPfreeExpriter(SCIP_EXPRITER **iterator)
SCIP_EXPRITER_STAGE SCIPexpriterGetStageDFS(SCIP_EXPRITER *iterator)
SCIP_RETCODE SCIPexpriterInit(SCIP_EXPRITER *iterator, SCIP_EXPR *expr, SCIP_EXPRITER_TYPE type, SCIP_Bool allowrevisit)
SCIP_EXPRITER_USERDATA SCIPexpriterGetExprUserData(SCIP_EXPRITER *iterator, SCIP_EXPR *expr)
SCIP_EXPRHDLR * SCIPexprGetHdlr(SCIP_EXPR *expr)
SCIP_RETCODE SCIPincludeExternalCodeInformation(SCIP *scip, const char *name, const char *description)
#define SCIPallocClearMemory(scip, ptr)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
#define SCIPallocClearBufferArray(scip, ptr, num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPfreeMemory(scip, ptr)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define SCIPfreeBufferArrayNull(scip, ptr)
SCIP_RETCODE SCIPsetReaderCopy(SCIP *scip, SCIP_READER *reader,)
SCIP_RETCODE SCIPincludeReaderBasic(SCIP *scip, SCIP_READER **readerptr, const char *name, const char *desc, const char *extension, SCIP_READERDATA *readerdata)
SCIP_RETCODE SCIPsetReaderWrite(SCIP *scip, SCIP_READER *reader,)
SCIP_RETCODE SCIPsetReaderRead(SCIP *scip, SCIP_READER *reader,)
SCIP_SOL * SCIPgetBestSol(SCIP *scip)
SCIP_RETCODE SCIPaddSolFree(SCIP *scip, SCIP_SOL **sol, SCIP_Bool *stored)
SCIP_RETCODE SCIPprintSol(SCIP *scip, SCIP_SOL *sol, FILE *file, SCIP_Bool printzeros)
SCIP_RETCODE SCIPsetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var, SCIP_Real val)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPvarGetNegationConstant(SCIP_VAR *var)
SCIP_Real SCIPvarGetMultaggrConstant(SCIP_VAR *var)
SCIP_VAR * SCIPvarGetNegatedVar(SCIP_VAR *var)
SCIP_RETCODE SCIPtightenVarUbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
SCIP_Real SCIPvarGetAggrConstant(SCIP_VAR *var)
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
SCIP_Real SCIPvarGetAggrScalar(SCIP_VAR *var)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPvarSetInitial(SCIP_VAR *var, SCIP_Bool initial)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
SCIP_RETCODE SCIPchgVarLbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_RETCODE SCIPchgVarType(SCIP *scip, SCIP_VAR *var, SCIP_VARTYPE vartype, SCIP_Bool *infeasible)
SCIP_RETCODE SCIPgetNegatedVar(SCIP *scip, SCIP_VAR *var, SCIP_VAR **negvar)
SCIP_VAR ** SCIPvarGetMultaggrVars(SCIP_VAR *var)
int SCIPvarGetMultaggrNVars(SCIP_VAR *var)
SCIP_RETCODE SCIPvarSetRemovable(SCIP_VAR *var, SCIP_Bool removable)
SCIP_Bool SCIPvarIsNegated(SCIP_VAR *var)
SCIP_RETCODE SCIPchgVarUbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_VAR * SCIPvarGetNegationVar(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPcreateVarBasic(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype)
SCIP_RETCODE SCIPchgVarObj(SCIP *scip, SCIP_VAR *var, SCIP_Real newobj)
SCIP_Real * SCIPvarGetMultaggrScalars(SCIP_VAR *var)
SCIP_RETCODE SCIPtightenVarLbGlobal(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
SCIP_VAR * SCIPvarGetAggrVar(SCIP_VAR *var)
int SCIPstrcasecmp(const char *s1, const char *s2)
int SCIPsnprintf(char *t, int len, const char *s,...)
SCIPfreeSol(scip, &heurdata->sol))
SCIPcreateSol(scip, &heurdata->sol, heur))
assert(minobj< SCIPgetCutoffbound(scip))
#define BMScopyMemoryArray(ptr, source, num)
SCIP_RETCODE SCIPincludeReaderNl(SCIP *scip)
struct SCIP_ProbNlData SCIP_PROBNLDATA
#define SCIP_CALL_THROW(x)
SCIP_RETCODE SCIPwriteSolutionNl(SCIP *scip)
AMPL .nl file reader and writer.
struct SCIP_Cons SCIP_CONS
struct SCIP_Conshdlr SCIP_CONSHDLR
struct SCIP_Expr SCIP_EXPR
struct SCIP_ExprIter SCIP_EXPRITER
#define SCIP_EXPRITER_VISITINGCHILD
#define SCIP_EXPRITER_VISITEDCHILD
#define SCIP_EXPRITER_LEAVEEXPR
#define SCIP_EXPRITER_ALLSTAGES
#define SCIP_EXPRITER_ENTEREXPR
struct SCIP_HashMap SCIP_HASHMAP
struct SCIP_ProbData SCIP_PROBDATA
#define SCIP_DECL_PROBDELORIG(x)
enum SCIP_Objsense SCIP_OBJSENSE
#define SCIP_DECL_READERWRITE(x)
struct SCIP_Reader SCIP_READER
#define SCIP_DECL_READERREAD(x)
#define SCIP_DECL_READERCOPY(x)
enum SCIP_Retcode SCIP_RETCODE
@ SCIP_STATUS_TOTALNODELIMIT
@ SCIP_STATUS_BESTSOLLIMIT
@ SCIP_STATUS_PRIMALLIMIT
@ SCIP_STATUS_USERINTERRUPT
@ SCIP_STATUS_STALLNODELIMIT
@ SCIP_STATUS_RESTARTLIMIT
@ SCIP_VARTYPE_CONTINUOUS
@ SCIP_VARSTATUS_MULTAGGR
@ SCIP_VARSTATUS_AGGREGATED
enum SCIP_Vartype SCIP_VARTYPE