88#pragma GCC diagnostic ignored "-Wshadow"
90#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
94#include "mp/nl-reader.h"
95#include "mp/nl-writer2.hpp"
96#include "mp/nl-opcodes.h"
98#define READER_NAME "nlreader"
99#define READER_DESC "AMPL .nl file reader"
100#define READER_EXTENSION "nl"
104#define SCIP_CALL_THROW(x) \
107 SCIP_RETCODE throw_retcode; \
108 if( ((throw_retcode) = (x)) != SCIP_OKAY ) \
109 throw std::logic_error("Error <" + std::to_string((long long)throw_retcode) + "> in function call at reader_nl.cpp:" + std::to_string(__LINE__)); \
118struct SCIP_ProbNlData
123 int amplopts[mp::MAX_AMPL_OPTIONS];
153 std::vector<SCIP_EXPR*> varexprs;
157 std::vector<std::vector<std::pair<SCIP_Real, SCIP_VAR*> > > nlconslin;
165 std::vector<SCIP_EXPR*> commonexprs;
173 std::vector<SCIP_EXPR*> exprstorelease;
182 std::map<int, std::vector<int> > sosvars;
183 std::vector<int> sosweights;
195 const char*& namesbegin,
196 const char* namesend,
200 if( namesbegin ==
NULL )
206 while( namesbegin != namesend )
215 if( *namesbegin ==
'\n' )
221 *(name++) = *(namesbegin++);
234 void LogicalExprToVarVal(
268 OnUnhandled(
"logical expression must be binary or constant");
293 const char* extstart = strrchr(
const_cast<char*
>(filename),
'.');
294 if( extstart !=
NULL )
295 probdata->filenamestublen = extstart - filename;
297 probdata->filenamestublen = strlen(filename);
298 assert(probdata->filenamestublen > 0);
300 memcpy(probdata->filenamestub, filename, probdata->filenamestublen);
301 probdata->filenamestub[probdata->filenamestublen] =
'\0';
304 const char* probname = strrchr(probdata->filenamestub,
'/');
305 if( probname ==
NULL )
306 probname = probdata->filenamestub;
317 probdata->filenamestub[probdata->filenamestublen] =
'.';
318 probdata->filenamestub[probdata->filenamestublen+1] =
'c';
319 probdata->filenamestub[probdata->filenamestublen+2] =
'o';
320 probdata->filenamestub[probdata->filenamestublen+3] =
'l';
321 probdata->filenamestub[probdata->filenamestublen+4] =
'\0';
322 colfile =
new fmt::File(probdata->filenamestub, fmt::File::RDONLY);
324 probdata->filenamestub[probdata->filenamestublen+1] =
'r';
325 probdata->filenamestub[probdata->filenamestublen+3] =
'w';
326 rowfile =
new fmt::File(probdata->filenamestub, fmt::File::RDONLY);
328 catch(
const fmt::SystemError& e )
333 probdata->filenamestub[probdata->filenamestublen] =
'\0';
346 assert(exprstorelease.empty());
356 const mp::NLHeader&
h
365 probdata->namplopts =
h.num_ampl_options;
370 mp::MemoryMappedFile<> mapped_colfile;
371 if( colfile !=
NULL )
372 mapped_colfile.map(*colfile,
"colfile");
373 const char* varnamesbegin = mapped_colfile.start();
374 const char* varnamesend = mapped_colfile.start() + mapped_colfile.size();
376 mp::MemoryMappedFile<> mapped_rowfile;
377 if( rowfile !=
NULL )
378 mapped_rowfile.map(*rowfile,
"rowfile");
379 const char* consnamesbegin = mapped_rowfile.start();
380 const char* consnamesend = mapped_rowfile.start() + mapped_rowfile.size();
382 probdata->nvars =
h.num_vars;
386 nnlvars =
MAX(
h.num_nl_vars_in_cons,
h.num_nl_vars_in_objs);
387 varexprs.resize(nnlvars);
391 for(
int i = 0;
i <
h.num_vars; ++
i )
395 if(
i <
h.num_nl_vars_in_both -
h.num_nl_integer_vars_in_both )
397 else if(
i <
h.num_nl_vars_in_both )
400 else if(
i <
h.num_nl_vars_in_cons -
h.num_nl_integer_vars_in_cons )
402 else if(
i <
h.num_nl_vars_in_cons )
405 else if(
i <
h.num_nl_vars_in_objs -
h.num_nl_integer_vars_in_objs )
407 else if(
i <
h.num_nl_vars_in_objs )
410 else if(
i <
h.num_vars -
h.num_linear_binary_vars -
h.num_linear_integer_vars )
412 else if(
i <
h.num_vars -
h.num_linear_integer_vars )
417 if( !nextName(varnamesbegin, varnamesend, name) )
451 probdata->nconss =
h.num_algebraic_cons;
453 nlconslin.resize(
h.num_nl_cons);
459 for(
int i = 0;
i <
h.num_nl_cons; ++
i )
462 if( !nextName(consnamesbegin, consnamesend, name) )
470 for(
int i =
h.num_nl_cons;
i <
h.num_algebraic_cons; ++
i )
472 if( !nextName(consnamesbegin, consnamesend, name) )
477 if(
h.num_nl_cons == 0 &&
h.num_logical_cons == 0 &&
h.num_integer_vars() == 0 )
478 probdata->islp =
true;
481 commonexprs.resize(
h.num_common_exprs());
494 exprstorelease.push_back(expr);
504 assert(variableIndex >= 0);
505 assert(variableIndex < (
int)varexprs.size());
508 return varexprs[variableIndex];
523 case mp::expr::MINUS:
546 case mp::expr::LOG10:
569 OnUnhandled(mp::expr::str(kind));
574 exprstorelease.push_back(expr);
587 SCIP_EXPR* children[2] = { firstChild, secondChild };
615 case mp::expr::POW_CONST_BASE:
616 case mp::expr::POW_CONST_EXP:
656 OnUnhandled(mp::expr::str(kind));
661 exprstorelease.push_back(expr);
672 std::shared_ptr<std::vector<SCIP_EXPR*> >
v;
680 v->reserve(num_args);
709 exprstorelease.push_back(expr);
720 if( objectiveIndex >= 1 )
721 OnUnhandled(
"multiple objective functions");
739 objexpr = nonlinearExpression;
788 if( num_linear_terms > 0 )
791 amplph.commonexprs[index] = commonexpr;
792 amplph.exprstorelease.push_back(commonexpr);
807 if( var_index < (
int)amplph.varexprs.size() )
830 assert(index < (
int)commonexprs.size());
842 if( commonexprs[index] !=
NULL )
850 else if( expr !=
NULL )
852 commonexprs[index] = expr;
862 assert(expr_index < (
int)commonexprs.size());
864 return commonexprs[expr_index];
874 assert(variableIndex >= 0);
899 assert(index < probdata->nconss);
902 if( index < (
int)nlconslin.size() )
943 if( initsol ==
NULL )
964 return ColumnSizeHandler();
1006 case mp::suf::Kind::CON:
1007 if( strncmp(name.data(),
"initial", name.size()) == 0 )
1009 suffix = CONSINITIAL;
1011 else if( strncmp(name.data(),
"separate", name.size()) == 0 )
1013 suffix = CONSSEPARATE;
1015 else if( strncmp(name.data(),
"enforce", name.size()) == 0 )
1017 suffix = CONSENFORCE;
1019 else if( strncmp(name.data(),
"check", name.size()) == 0 )
1023 else if( strncmp(name.data(),
"propagate", name.size()) == 0 )
1025 suffix = CONSPROPAGATE;
1027 else if( strncmp(name.data(),
"dynamic", name.size()) == 0 )
1029 suffix = CONSDYNAMIC;
1031 else if( strncmp(name.data(),
"removable", name.size()) == 0 )
1033 suffix = CONSREMOVABLE;
1041 case mp::suf::Kind::CON_BIT:
1045 case mp::suf::Kind::VAR:
1047 if( strncmp(name.data(),
"initial", name.size()) == 0 )
1049 suffix = VARINITIAL;
1051 else if( strncmp(name.data(),
"removable", name.size()) == 0 )
1053 suffix = VARREMOVABLE;
1055 else if( strncmp(name.data(),
"sosno", name.size()) == 0 )
1060 else if( strncmp(name.data(),
"ref", name.size()) == 0 )
1064 amplph.sosweights.resize(amplph.probdata->nvars, 0);
1072 case mp::suf::Kind::VAR_BIT:
1076 case mp::suf::Kind::OBJ:
1080 case mp::suf::Kind::OBJ_BIT:
1084 case mp::suf::Kind::PROBLEM:
1088 case mp::suf::Kind::PROB_BIT:
1146 amplph.sosvars[(int)value].push_back(index);
1151 amplph.sosweights[index] = (int)value;
1160 fmt::StringRef name,
1171 fmt::StringRef name,
1188 int constraintIndex;
1194 int constraintIndex_
1197 constraintIndex(constraintIndex_)
1199 assert(constraintIndex_ >= 0);
1200 assert(constraintIndex_ < amplph.probdata->nconss);
1216 assert(variableIndex >= 0);
1219 if( coefficient == 0.0 )
1222 if( constraintIndex < 0 )
1226 else if( constraintIndex < (
int)amplph.nlconslin.size() )
1228 amplph.nlconslin[constraintIndex].push_back(std::pair<SCIP_Real, SCIP_VAR*>(coefficient, amplph.probdata->vars[variableIndex]));
1232 SCIP_CONS* lincons = amplph.probdata->conss[constraintIndex];
1246 if( objectiveIndex >= 1 )
1247 OnUnhandled(
"multiple objective functions");
1256 int constraintIndex,
1273 exprstorelease.push_back(expr);
1287 LogicalExprToVarVal(arg,
var, val);
1299 exprstorelease.push_back(expr);
1306 mp::expr::Kind kind,
1320 LogicalExprToVarVal(lhs, lhsvar, lhsval);
1321 LogicalExprToVarVal(rhs, rhsvar, rhsval);
1327 if( lhsvar ==
NULL && rhsvar ==
NULL )
1330 exprstorelease.push_back(expr);
1334 if( (lhsvar ==
NULL && lhsval != 0.0) || (rhsvar ==
NULL && rhsval != 0.0) )
1338 exprstorelease.push_back(expr);
1342 if( lhsvar ==
NULL )
1350 if( rhsvar ==
NULL )
1363 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1367 exprstorelease.push_back(expr);
1383 if( lhsvar ==
NULL && rhsvar ==
NULL )
1386 exprstorelease.push_back(expr);
1390 if( (lhsvar ==
NULL && lhsval == 0.0) || (rhsvar ==
NULL && rhsval == 0.0) )
1394 exprstorelease.push_back(expr);
1398 if( lhsvar ==
NULL )
1406 if( rhsvar ==
NULL )
1419 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1423 exprstorelease.push_back(expr);
1441 if( lhsvar ==
NULL && rhsvar ==
NULL )
1444 exprstorelease.push_back(expr);
1448 if( lhsvar ==
NULL )
1450 std::swap(lhs, rhs);
1451 std::swap(lhsval, rhsval);
1452 std::swap(lhsvar, rhsvar);
1456 if( rhsvar ==
NULL )
1460 if( rhsval ==
TRUE )
1468 exprstorelease.push_back(expr);
1478 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1482 exprstorelease.push_back(expr);
1497 OnUnhandled(mp::expr::str(kind));
1507 mp::expr::Kind kind,
1521 LogicalExprToVarVal(lhs, lhsvar, lhsval);
1522 LogicalExprToVarVal(rhs, rhsvar, rhsval);
1529 bool isne = (kind == mp::expr::NE);
1530 if( lhsvar ==
NULL && rhsvar ==
NULL )
1533 exprstorelease.push_back(expr);
1537 if( lhsvar ==
NULL )
1539 std::swap(lhs, rhs);
1540 std::swap(lhsval, rhsval);
1541 std::swap(lhsvar, rhsvar);
1545 if( rhsvar ==
NULL )
1557 exprstorelease.push_back(expr);
1568 std::string name = std::string(
"_logic") + std::to_string((
long long)logiccount++);
1572 exprstorelease.push_back(expr);
1587 OnUnhandled(mp::expr::str(kind));
1604 if( objexpr !=
NULL )
1618 if( initsol !=
NULL )
1637 for(
size_t i = 0;
i < nlconslin.size(); ++
i )
1639 for(
size_t j = 0; j < nlconslin[
i].size(); ++j )
1646 for(
int i = 0;
i < probdata->nconss; ++
i )
1652 std::vector<SCIP_VAR*> setvars;
1653 std::vector<SCIP_Real> setweights;
1654 if( !sosvars.empty() )
1656 setvars.resize(probdata->nvars);
1657 probdata->islp =
false;
1659 if( !sosweights.empty() )
1660 setweights.resize(probdata->nvars);
1661 for( std::map<
int, std::vector<int> >::iterator sosit(sosvars.begin()); sosit != sosvars.end(); ++sosit )
1663 assert(sosit->first != 0);
1664 assert(!sosit->second.empty());
1667 bool issos2 = sosit->first < 0;
1669 if( issos2 && sosweights.empty() )
1674 OnUnhandled(
"SOS2 requires variable .ref suffix");
1677 for(
size_t i = 0;
i < sosit->second.size(); ++
i )
1679 int varidx = sosit->second[
i];
1680 setvars[
i] = probdata->vars[
varidx];
1682 if( issos2 && sosweights[
varidx] == 0 )
1684 OnUnhandled(
"Missing .ref value for SOS2 variable");
1685 if( !sosweights.empty() )
1693 (void)
SCIPsnprintf(name, 20,
"sos1_%d", sosit->first);
1698 (void)
SCIPsnprintf(name, 20,
"sos2_%d", -sosit->first);
1706 if( initsol !=
NULL )
1723 if( initsol !=
NULL )
1729 while( !exprstorelease.empty() )
1732 exprstorelease.pop_back();
1736 while( !varexprs.empty() )
1739 varexprs.pop_back();
1750 const char* probname;
1771 mp::NLHeader nlheader;
1787 ConNonlinearVars = 0,
1788 ConNonlinearVarsInt = 1,
1797 void analyseVariables()
1799 NlVarType* vartype =
NULL;
1802 int nlvars_cons = 0;
1803 int binvars_lin = 0;
1804 int intvars_lin = 0;
1805 int discrvars_nlcons = 0;
1807 nlheader.max_var_name_len = 0;
1810 nlheader.num_obj_nonzeros = 0;
1812 if( conshdlr_nonlinear !=
NULL )
1818 for(
int i = 0;
i < nactivevars + nfixedvars; ++
i )
1820 SCIP_VAR*
var = (
i < nactivevars ? activevars[
i] : fixedvars[
i-nactivevars]);
1825 ++nlheader.num_obj_nonzeros;
1835 if( var2expr !=
NULL )
1853 vartype[
i] = ConNonlinearVarsInt;
1856 vartype[
i] = ConNonlinearVars;
1867 vartype[
i] = LinearVarsBool;
1872 vartype[
i] = LinearVarsInt;
1876 vartype[
i] = LinearVars;
1882 if( namelen > nlheader.max_var_name_len )
1883 nlheader.max_var_name_len = namelen;
1892 for(
int vtype = ConNonlinearVars; vtype <= LinearVarsInt; ++vtype )
1893 for(
int i = 0;
i < nactivevars + nfixedvars; ++
i )
1894 if( vartype[
i] == (NlVarType)vtype )
1896 vars[nvars] = (
i < nactivevars ? activevars[
i] : fixedvars[
i-nactivevars]);
1900 assert(nvars == nactivevars + nfixedvars);
1904 nlheader.num_vars = nvars;
1910 nlheader.num_nl_vars_in_cons = nlvars_cons;
1911 nlheader.num_nl_vars_in_objs = nlvars_cons;
1912 nlheader.num_nl_vars_in_both = 0;
1915 nlheader.num_linear_net_vars = 0;
1918 nlheader.num_linear_binary_vars = binvars_lin;
1919 nlheader.num_linear_integer_vars = intvars_lin;
1922 nlheader.num_nl_integer_vars_in_both = 0;
1923 nlheader.num_nl_integer_vars_in_cons = discrvars_nlcons;
1924 nlheader.num_nl_integer_vars_in_objs = 0;
1930 void analyzeConstraints()
1938 if( nlheader.num_nl_vars_in_cons > 0 )
1940 for(
int i = 0;
i < nallconss; ++
i )
1945 algconss[nalgconss] = cons;
1953 nlheader.num_nl_cons = nalgconss;
1960 nlheader.num_ranges = 0;
1961 nlheader.num_eqns = 0;
1962 nlheader.max_con_name_len = 0;
1963 nlheader.num_con_nonzeros = 0;
1964 for(
int i = 0;
i < nallconss; ++
i )
1971 if( conshdlr == conshdlr_nonlinear )
1982 if( conshdlr == conshdlr_linear )
1988 for(
int v = 0; v < nconsvars; ++v )
1990 negconstant += conscoefs[v];
2000 else if( conshdlr == conshdlr_setppc )
2005 for(
int v = 0; v < nconsvars; ++v )
2012 lhs = 1.0 - negconstant;
2013 rhs = 1.0 - negconstant;
2016 lhs = 1.0 - negconstant;
2021 rhs = 1.0 - negconstant;
2024 throw mp::UnsupportedError(
"Unexpected SETPPC type");
2027 else if( conshdlr == conshdlr_logicor )
2032 for(
int v = 0; v < nconsvars; ++v )
2036 lhs = 1.0 - negconstant;
2039 else if( conshdlr == conshdlr_knapsack )
2045 for(
int v = 0; v < nconsvars; ++v )
2047 negweights += weights[v];
2052 else if( conshdlr == conshdlr_varbound )
2074 algconss[nalgconss] = cons;
2075 algconsslhs[nalgconss] = lhs;
2076 algconssrhs[nalgconss] = rhs;
2083 ++nlheader.num_eqns;
2085 ++nlheader.num_ranges;
2091 if( namelen > nlheader.max_con_name_len )
2092 nlheader.max_con_name_len = namelen;
2105 nlheader.num_con_nonzeros += nvarsincons;
2108 assert(nalgconss <= nallconss);
2113 for(
int i = 0;
i < nfixedvars; ++
i )
2124 nlheader.num_con_nonzeros += 2;
2140 if( namelen > nlheader.max_con_name_len )
2141 nlheader.max_con_name_len = namelen;
2144 aggconss[naggconss] =
var;
2147 ++nlheader.num_eqns;
2150 nlheader.num_algebraic_cons = nalgconss + naggconss;
2151 nlheader.num_logical_cons = 0;
2154 nlheader.num_compl_conds = 0;
2155 nlheader.num_nl_compl_conds = 0;
2156 nlheader.num_compl_dbl_ineqs = 0;
2157 nlheader.num_compl_vars_with_nz_lb = 0;
2160 nlheader.num_nl_net_cons = 0;
2161 nlheader.num_linear_net_cons = 0;
2165 int getVarAMPLIndex(
2181 const char* probname_,
2196 probname(probname_),
2197 objsense(objsense_),
2198 objscale(objscale_),
2199 objoffset(objoffset_),
2201 nactivevars(nvars_),
2202 fixedvars(fixedvars_),
2203 nfixedvars(nfixedvars_),
2206 nlcomments(nlcomments_),
2207 genericnames(genericnames_),
2218 nlheader.format = nlbinary_ ? mp::NLHeader::BINARY : mp::NLHeader::TEXT;
2235 if( var2idx !=
NULL )
2249 analyzeConstraints();
2251 nlheader.prob_name = probname;
2256 if( nlheader.num_obj_nonzeros == 0 && objoffset == 0.0 )
2257 nlheader.num_objs = 0;
2259 nlheader.num_objs = 1;
2260 nlheader.num_nl_objs = 0;
2263 nlheader.num_funcs = 0;
2269 nlheader.num_common_exprs_in_both = 0;
2270 nlheader.num_common_exprs_in_cons = 0;
2271 nlheader.num_common_exprs_in_objs = 0;
2272 nlheader.num_common_exprs_in_single_cons = 0;
2273 nlheader.num_common_exprs_in_single_objs = 0;
2298 template <
class ObjGradWriter>
2306 if( nlheader.num_obj_nonzeros == 0 )
2309 auto gvw = gw.MakeVectorWriter(nlheader.num_obj_nonzeros);
2310 for(
int v = 0; v < nvars; ++v )
2314 gvw.Write(v, objscale * coef);
2318 template <
class ObjExprWriter>
2325 ew.NPut(objscale * objoffset);
2328 template <
class VarBoundsWriter>
2330 VarBoundsWriter& vbw
2333 for(
int v = 0; v < nvars; ++v )
2344 vbw.WriteLbUb(lb, ub);
2348 template <
class ConBoundsWriter>
2350 ConBoundsWriter& cbw
2353 for(
int c = 0;
c < nalgconss; ++
c )
2358 cbw.WriteAlgConRange(bnd);
2361 for(
int v = 0; v < naggconss; ++v )
2386 cbw.WriteAlgConRange(bnd);
2398 assert(
i < nalgconss + naggconss);
2402 template <
class ConLinearExprWriter>
2405 ConLinearExprWriter& clw
2408 if(
i < nlheader.num_nl_cons )
2416 if( conshdlr == conshdlr_linear )
2426 if( nconsvars == 0 )
2429 auto vw = clw.MakeVectorWriter(nconsvars);
2430 for(
int v = 0; v < nconsvars; ++v )
2434 vw.Write(getVarAMPLIndex(consvars[v]), conscoefs[v]);
2439 if( conshdlr == conshdlr_setppc )
2444 if( nconsvars == 0 )
2447 auto vw = clw.MakeVectorWriter(nconsvars);
2448 for(
int v = 0; v < nconsvars; ++v )
2452 vw.Write(getVarAMPLIndex(consvars[v]), 1.0);
2457 if( conshdlr == conshdlr_logicor )
2462 if( nconsvars == 0 )
2465 auto vw = clw.MakeVectorWriter(nconsvars);
2466 for(
int v = 0; v < nconsvars; ++v )
2470 vw.Write(getVarAMPLIndex(consvars[v]), 1.0);
2475 if( conshdlr == conshdlr_knapsack )
2481 if( nconsvars == 0 )
2484 auto vw = clw.MakeVectorWriter(nconsvars);
2485 for(
int v = 0; v < nconsvars; ++v )
2489 vw.Write(getVarAMPLIndex(consvars[v]), (
SCIP_Real)weights[v]);
2494 assert(conshdlr == conshdlr_varbound);
2496 auto vw = clw.MakeVectorWriter(2);
2510 assert(
i < nalgconss + naggconss);
2518 auto vw = clw.MakeVectorWriter(2);
2519 vw.Write(getVarAMPLIndex(
var), 1.0);
2527 auto vw = clw.MakeVectorWriter(2);
2528 vw.Write(getVarAMPLIndex(
var), 1.0);
2537 vw.Write(getVarAMPLIndex(
var), 1.0);
2551 template <
class ConExprWriter>
2557 if(
i >= nlheader.num_nl_cons )
2564 std::stringstream unhandledexprmsg;
2581 ConExprWriter* parentew;
2582 if( expr == rootexpr )
2588 ConExprWriter* newew =
NULL;
2595 ConExprWriter ew2(parentew->OPut2(mp::nl::SUB));
2638 memcpy((
void*)(newew+1), (
void*)parentew,
sizeof(ConExprWriter));
2640 else if( nargs == 2 )
2642 new (newew+1) ConExprWriter(parentew->OPut2(mp::nl::ADD));
2646 new (newew+1) ConExprWriter(parentew->OPutN(mp::nl::SUM, nargs));
2659 newew =
new ConExprWriter(parentew->OPut2(mp::nl::MUL));
2669 newew =
new ConExprWriter(parentew->OPut1(mp::nl::POW2));
2671 newew =
new ConExprWriter(parentew->OPut1(mp::nl::SQRT));
2673 newew =
new ConExprWriter(parentew->OPut2(mp::nl::POW_CONST_EXP));
2677 newew =
new ConExprWriter(parentew->OPut1(mp::nl::LOG));
2681 newew =
new ConExprWriter(parentew->OPut1(mp::nl::EXP));
2685 newew =
new ConExprWriter(parentew->OPut1(mp::nl::ABS));
2689 newew =
new ConExprWriter(parentew->OPut1(mp::nl::SIN));
2693 newew =
new ConExprWriter(parentew->OPut1(mp::nl::COS));
2701 parentew->NPut(0.0);
2727 new (ews) ConExprWriter(ews[1].OPut2(mp::nl::MUL));
2735 memcpy((
void*)ews, (
void*)(ews+1),
sizeof(ConExprWriter));
2752 ews->~ConExprWriter();
2758 memcpy((
void*)(ews+1), (
void*)ews,
sizeof(ConExprWriter));
2767 if( childidx < nchildren-2 )
2771 ConExprWriter* newew =
new ConExprWriter(ew2->OPut2(mp::nl::MUL));
2791 ConExprWriter* parentew;
2792 if( expr == rootexpr )
2798 memcpy((
void*)parentew, (
void*)(ews+1),
sizeof(ConExprWriter));
2803 ews[1].~ConExprWriter();
2822 if( unhandledexprmsg.tellp() > 0 )
2823 throw mp::UnsupportedError(unhandledexprmsg.str());
2826 template <
class RowObjNameWriter>
2828 RowObjNameWriter& wrt
2831 if( !wrt || genericnames )
2834 for(
int c = 0;
c < nalgconss; ++
c )
2837 for(
int v = 0; v < naggconss; ++v )
2839 std::string aggname(
"aggr_");
2841 wrt << aggname.c_str();
2847 template <
class ColNameWriter>
2852 if( !wrt || genericnames )
2855 for(
int v = 0; v < nvars; ++v )
2872 assert(probnldata->vars !=
NULL || probnldata->nvars == 0);
2873 assert(probnldata->conss !=
NULL || probnldata->nconss == 0);
2875 for(
i = 0;
i < probnldata->nconss; ++
i )
2881 for(
i = 0;
i < probnldata->nvars; ++
i )
2926 mp::ReadNLFile(filename, handler);
2928 catch(
const mp::UnsupportedError& e )
2930 SCIPerrorMessage(
"unsupported construct in AMPL .nl file %s: %s\n", filename, e.what());
2936 catch(
const mp::Error& e )
2945 catch(
const fmt::SystemError& e )
2954 catch(
const std::bad_alloc& e )
2963 catch(
const std::exception& e )
2984 mp::WriteNLResult writerresult;
2987 char* tempdir =
NULL;
2988 char* tempnamestub =
NULL;
2989 char* tempname =
NULL;
2990 FILE* tempfile =
NULL;
3000 name, objsense,
objscale, objoffset,
3003 binary, comments, genericnames);
3011 mp::NLUtils nlutils;
3017 TCHAR systemtmp[MAX_PATH + 1];
3018 DWORD gettemprc = GetTempPathA(MAX_PATH + 1, systemtmp);
3019 if( gettemprc == 0 || gettemprc > MAX_PATH + 1 )
3021 SCIPerrorMessage(
"Cannot get name of directory for temporary files: error %d\n", errno);
3026 const char* systemtmp = getenv(
"TMPDIR");
3027 if( systemtmp ==
NULL )
3030 templen = strlen(systemtmp) + 30;
3035 if( _mktemp_s(tempdir, templen) )
3037 SCIPerrorMessage(
"Cannot generate name for temporary directory from template <%s>: error %d\n", tempdir, errno);
3041 if( _mkdir(tempdir) )
3043 SCIPerrorMessage(
"Cannot create temporary directory with name <%s>: error %d\n", tempdir, errno);
3048 if( mkdtemp(tempdir) ==
NULL )
3050 SCIPerrorMessage(
"Cannot generate temporary directory from template <%s>: error %d\n", tempdir, errno);
3060 SCIPdebugMsg(
scip,
"Temporary file stub for NL writing: %s\n", tempnamestub);
3062 writerresult = mp::WriteNLFile(tempnamestub, nlf, nlutils);
3066 (void)
SCIPsnprintf(tempname, templen,
"%s.nl", tempnamestub);
3068 switch( writerresult.first )
3070 case NLW2_WriteNL_OK:
3072 case NLW2_WriteNL_CantOpen:
3076 case NLW2_WriteNL_Failed:
3080 case NLW2_WriteNL_Unset:
3088 tempfile = fopen(tempname,
"rb");
3089 if( tempfile ==
NULL )
3091 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3095 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3096 fwrite(buf, 1, n, file !=
NULL ? file : stdout);
3101 if( !genericnames && filename !=
NULL )
3103 char* filename2 =
NULL;
3111 filenamelen = strlen(filename);
3113 memcpy(filename2, filename, filenamelen+1);
3116 filename2[filenamelen-3] =
'\0';
3121 SCIPsnprintf(tempname, templen,
"%s.row", tempnamestub);
3122 strcpy(filename2 + filenamelen,
".row");
3124 tempfile = fopen(tempname,
"rb");
3125 if( tempfile ==
NULL )
3127 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3130 file2 = fopen(filename2,
"wb");
3133 SCIPerrorMessage(
"Cannot open file <%s> for writing: error %d\n", filename2, errno);
3137 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3138 fwrite(buf, 1, n, file2);
3145 SCIPsnprintf(tempname, templen,
"%s.col", tempnamestub);
3146 strcpy(filename2 + filenamelen,
".col");
3148 tempfile = fopen(tempname,
"rb");
3149 if( tempfile ==
NULL )
3151 SCIPerrorMessage(
"Cannot open temporary file <%s> for reading: error %d\n", tempname, errno);
3154 file2 = fopen(filename2,
"wb");
3157 SCIPerrorMessage(
"Cannot open file <%s> for writing: error %d\n", filename2, errno);
3161 while( (n=fread(buf, 1,
sizeof(buf), tempfile)) != 0 )
3162 fwrite(buf, 1, n, file2);
3175 catch(
const mp::UnsupportedError& e )
3180 catch(
const mp::Error& e )
3186 catch(
const fmt::SystemError& e )
3192 catch(
const std::bad_alloc& e )
3197 catch(
const std::exception& e )
3204 if( tempname !=
NULL )
3212 if( tempdir !=
NULL )
3243 "reading/" READER_NAME "/binary",
"should nl files be written in binary format",
3246 "reading/" READER_NAME "/comments",
"should comments be written to nl files",
3267 if( probdata ==
NULL )
3273 probdata->filenamestub[probdata->filenamestublen] =
'.';
3274 probdata->filenamestub[probdata->filenamestublen+1] =
's';
3275 probdata->filenamestub[probdata->filenamestublen+2] =
'o';
3276 probdata->filenamestub[probdata->filenamestublen+3] =
'l';
3277 probdata->filenamestub[probdata->filenamestublen+4] =
'\0';
3279 FILE* solfile = fopen(probdata->filenamestub,
"w");
3280 if( solfile ==
NULL )
3282 SCIPerrorMessage(
"could not open file <%s> for writing\n", probdata->filenamestub);
3283 probdata->filenamestub[probdata->filenamestublen] =
'\0';
3287 probdata->filenamestub[probdata->filenamestublen] =
'\0';
3294 for(
int i = 0;
i < probdata->namplopts; ++
i )
3300 SCIPinfoMessage(
scip, solfile,
"%d\n%d\n", probdata->nconss, havedual ? probdata->nconss : 0);
3301 SCIPinfoMessage(
scip, solfile,
"%d\n%d\n", probdata->nvars, haveprimal ? probdata->nvars : 0);
3306 for(
int c = 0;
c < probdata->nconss; ++
c )
3315 if( transcons ==
NULL )
3327 for(
int i = 0;
i < probdata->nvars; ++
i )
3333 int solve_result_num = mp::sol::FAILURE;
3341 solve_result_num = mp::sol::LIMIT_FEAS_INTERRUPT;
3343 solve_result_num = mp::sol::LIMIT_NO_FEAS_INTERRUPT;
3349 solve_result_num = mp::sol::LIMIT_FEAS_NODES;
3351 solve_result_num = mp::sol::LIMIT_NO_FEAS_NODES;
3355 solve_result_num = mp::sol::LIMIT_FEAS_TIME;
3357 solve_result_num = mp::sol::LIMIT_NO_FEAS_TIME;
3361 solve_result_num = mp::sol::LIMIT_FEAS_SOFTMEM;
3363 solve_result_num = mp::sol::LIMIT_NO_FEAS_SOFTMEM;
3368 solve_result_num = mp::sol::LIMIT_FEAS_WORK;
3370 solve_result_num = mp::sol::LIMIT_NO_FEAS_WORK;
3373 solve_result_num = mp::sol::LIMIT_FEAS_BESTOBJ;
3377 solve_result_num = mp::sol::LIMIT_FEAS_BESTBND;
3379 solve_result_num = mp::sol::LIMIT_NO_FEAS_BESTBND;
3383 solve_result_num = mp::sol::LIMIT_FEAS_NUMSOLS;
3385 solve_result_num = mp::sol::LIMIT_NO_FEAS;
3391 solve_result_num = mp::sol::LIMIT_FEAS;
3393 solve_result_num = mp::sol::LIMIT_NO_FEAS;
3396 solve_result_num = mp::sol::SOLVED;
3399 solve_result_num = mp::sol::INFEASIBLE;
3403 solve_result_num = mp::sol::UNBOUNDED_FEAS;
3405 solve_result_num = mp::sol::UNBOUNDED_NO_FEAS;
3408 solve_result_num = mp::sol::LIMIT_INF_UNB;
3413 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