assert(datanode !=
NULL);
98assert(vars !=
NULL);
99assert(nvars !=
NULL);
100assert(doingfine !=
NULL);
107 if( variables ==
NULL)
115 if( attrval ==
NULL)
117 SCIPerrorMessage(
"Attribute \"numberOfVariables\" not found in <variables> node.\n");
122varssize = (int)strtol(attrval, (
char**)&attrval, 10);
123 if( *attrval !=
'\0'|| varssize < 0 )
129assert(varssize >= 0);
138 const char* varname;
144 if( varssize == *nvars )
146 SCIPerrorMessage(
"Expected %d variables, got at least %d many.\n", varssize, *nvars+1);
156 if( attrval !=
NULL&& strcmp(attrval,
"1") != 0 )
158 SCIPerrorMessage(
"Variable attribute 'mult' not supported (while parsing variable <%s>)\n", varname);
165 if( attrval ==
NULL)
167 else if( strcmp(attrval,
"-INF") == 0 )
169 else if( strcmp(attrval,
"INF") == 0 )
173varlb = strtod(attrval, (
char**)&attrval);
174 if( *attrval !=
'\0')
176 SCIPerrorMessage(
"Error parsing variable lower bound '%s' for variable <%s>\n", attrval, varname);
184 if( attrval ==
NULL)
186 else if( strcmp(attrval,
"-INF") == 0 )
188 else if( strcmp(attrval,
"INF") == 0 )
192varub = strtod(attrval, (
char**)&attrval);
193 if( *attrval !=
'\0')
195 SCIPerrorMessage(
"Error parsing variable upper bound '%s' for variable <%s>\n", attrval, varname);
207 if( attrval ==
NULL)
209 else switch( *attrval )
235 SCIPerrorMessage(
"Unsupported variable type '%s' for variable <%s>\n", attrval, varname);
247 SCIP_CALL(
SCIPcreateVar(
scip, &(*vars)[*nvars], varname, varlb, varub, 0.0, vartype, !dynamiccols, dynamiccols,
NULL,
NULL,
NULL,
NULL,
NULL) );
248assert((*vars)[*nvars] !=
NULL);
262consvars[0] = (*vars)[*nvars];
263consvars[1] = (*vars)[*nvars];
269bounds[1] = semibound;
281 if( *nvars < varssize )
283 SCIPerrorMessage(
"Expected %d variables, but got only %d many.\n", varssize, *nvars);
304 const char* attrval;
307assert(datanode !=
NULL);
308assert(vars !=
NULL|| nvars == 0);
309assert(doingfine !=
NULL);
315 if( objective ==
NULL)
320 if( attrval !=
NULL&& strcmp(attrval,
"1") != 0 )
329 if( attrval ==
NULL)
335 else if( strcmp(attrval,
"min") == 0 )
339 else if( strcmp(attrval,
"max") == 0 )
358 if( attrval ==
NULL)
360 SCIPerrorMessage(
"Missing \"idx\" attribute in objective coefficient.\n");
364idx = (int)strtol(attrval, (
char**)&attrval, 10);
365 if( *attrval !=
'\0')
372 if( idx < 0 || idx >= nvars )
374 SCIPerrorMessage(
"Invalid variable index '%d' of objective coefficient.\n", idx);
388val = strtod(attrval, (
char**)&attrval);
389 if( *attrval !=
'\0')
402 if( attrval !=
NULL)
406objconst = strtod(attrval, (
char**)&attrval);
407 if( *attrval !=
'\0')
414 if( objconst != 0.0 )
418 SCIP_CALL(
SCIPcreateVar(
scip, &objconstvar,
"objconstvar", objconst, objconst, 1.0,
SCIP_VARTYPE_CONTINUOUS, !dynamiccols, dynamiccols,
NULL,
NULL,
NULL,
NULL,
NULL) );
444 const char* attrval;
447assert(datanode !=
NULL);
448assert(nconss !=
NULL);
449assert(doingfine !=
NULL);
456 if( constraints ==
NULL)
460attrval =
xmlGetAttrval(constraints,
"numberOfConstraints");
461 if( attrval ==
NULL)
463 SCIPerrorMessage(
"Attribute \"numberOfConstraints\" not found in <constraints> node.\n");
468*nconss = (int)strtol(attrval, (
char**)&attrval, 10);
469 if( *attrval !=
'\0'|| *nconss < 0 )
475assert(*nconss >= 0);
504assert(nlinvars >= 0);
505assert(nquadterms >= 0);
516 if( nquadterms == 0 && nlexpr ==
NULL)
519nlinvars, linvars, lincoefs, lhs, rhs, initialconss,
525assert(objvar !=
NULL);
542 if( nlinvars > 0 || nquadterms > 0 )
546nquadterms, quadvars1, quadvars2, quadcoefs,
NULL,
NULL) );
550 if( nlexpr !=
NULL)
556 if( varexpr !=
NULL)
572assert(nlexpr !=
NULL);
577 SCIP_EXPR* children[2] = {nlexpr, varexpr};
580assert(varexpr !=
NULL);
603assert(varexpr !=
NULL);
615assert(objvar !=
NULL);
647 const char* attrval;
652assert(datanode !=
NULL);
653assert(doingfine !=
NULL);
654assert(linvars !=
NULL);
655assert(lincoefs !=
NULL);
656assert(nlinvars !=
NULL);
657assert(quadvars1 !=
NULL);
658assert(quadvars2 !=
NULL);
659assert(quadcoefs !=
NULL);
660assert(nquadterms !=
NULL);
661assert(nlexprs !=
NULL);
666 if( constraints ==
NULL)
672 const char* consname;
678 SCIPerrorMessage(
"Expected %d constraints, but got at least %d many.\n", nconss, c+1);
685 if( consname ==
NULL)
693 if( attrval !=
NULL&& strcmp(attrval,
"1") != 0 )
695 SCIPerrorMessage(
"Constraint attribute 'mult' not supported (while parsing constraint <%s>).\n", consname);
702 if( attrval ==
NULL)
704 else if( strcmp(attrval,
"-INF") == 0 )
706 else if( strcmp(attrval,
"INF") == 0 )
710conslhs = strtod(attrval, (
char**)&attrval);
711 if( *attrval !=
'\0')
713 SCIPerrorMessage(
"Error parsing constraint lower bound '%s' for constraint <%s>.\n", attrval, consname);
721 if( attrval ==
NULL)
723 else if( strcmp(attrval,
"-INF") == 0 )
725 else if( strcmp(attrval,
"INF") == 0 )
729consrhs = strtod(attrval, (
char**)&attrval);
730 if( *attrval !=
'\0')
732 SCIPerrorMessage(
"Error parsing constraint upper bound '%s' for constraint <%s>.\n", attrval, consname);
740 if( attrval !=
NULL)
744consconstant = strtod(attrval, (
char**)&attrval);
745 if( *attrval !=
'\0')
747 SCIPerrorMessage(
"Error parsing constraint constant '%s' for constraint <%s>.\n", attrval, consname);
752conslhs -= consconstant;
754consrhs -= consconstant;
759quadvars1[c], quadvars2[c], quadcoefs[c], nquadterms[c], nlexprs[c],
760conslhs, consrhs, consname,
FALSE, initialconss, dynamicconss, dynamicrows) );
767 SCIPerrorMessage(
"Got %d constraints, but expected %d many.\n", c, nconss);
789 const char* attrval;
791assert(node !=
NULL);
792assert(mult !=
NULL);
793assert(doingfine !=
NULL);
796 if( incrint !=
NULL)
798 if( incrreal !=
NULL)
802 if( attrval ==
NULL)
806*mult = (int)strtol(attrval, (
char**)&attrval, 10);
807 if( *attrval !=
'\0'|| *mult < 1 )
819 if( attrval ==
NULL)
822 if( incrint !=
NULL)
824*incrint = (int)strtol(attrval, (
char**)&attrval, 10);
825 if( *attrval !=
'\0')
833 if( incrreal !=
NULL)
835*incrreal = strtod(attrval, (
char**)&attrval);
864 const char* attrval;
876assert(datanode !=
NULL);
877assert(vars !=
NULL|| nvars == 0);
878assert(doingfine !=
NULL);
882 if( lincoef ==
NULL)
887 if( attrval ==
NULL)
889 SCIPerrorMessage(
"Attribute \"numberOfValues\" not found for <linearConstraintCoefficients> node.\n");
894nnz = (int)strtol(attrval, (
char**)&attrval, 10);
895 if( *attrval !=
'\0'|| nnz < 0 )
897 SCIPerrorMessage(
"Invalid value '%s' for \"numberOfValues\" attribute in <linearConstraintCoefficients> node.\n",
xmlGetAttrval(lincoef,
"numberOfValues"));
905 if( startnode ==
NULL)
907 SCIPerrorMessage(
"Node <start> not found inside <linearConstraintCoefficients> node.\n");
913 if( idxnode !=
NULL)
917 SCIPerrorMessage(
"Both <rowIdx> and <colIdx> found under <linearConstraintCoefficients> node.\n");
926 if( idxnode ==
NULL)
928 SCIPerrorMessage(
"Both <rowIdx> and <colIdx> not found under <linearConstraintCoefficients> node.\n");
936 if( valnode ==
NULL)
938 SCIPerrorMessage(
"<value> node not found under <linearConstraintCoefficients> node.\n");
954 if( strcmp(
xmlGetName(elnode),
"el") != 0 )
956 SCIPerrorMessage(
"Expected <el> node under <start> node in <linearConstraintCoefficients>, but got '%s'.\n",
xmlGetName(elnode));
960 if( count >= (rowmajor ? nconss : nvars) + 1 )
962 SCIPerrorMessage(
"Too many elements under <start> node in <linearConstraintCoefficients>, expected %d many, got at least %d.\n", (rowmajor ? nconss : nvars) + 1, count + 1);
968 SCIPerrorMessage(
"No data in <el> node in <linearConstraintCoefficients>.\n");
975 if( *attrval !=
'\0'|| start[count] < 0 || (start[count] > nnz) )
977 SCIPerrorMessage(
"Invalid value '%s' in <el> node under <start> node in <linearConstraintCoefficients>.\n",
xmlGetData(elnode));
987 for( --mult; mult > 0; --mult )
990 if( count >= (rowmajor ? nconss : nvars) + 1 )
992 SCIPerrorMessage(
"Too many elements under <start> node in <linearConstraintCoefficients>, expected %d many, got at least %d.\n", (rowmajor ? nconss : nvars) + 1, count + 1);
996start[count] = start[count-1] + incrint;
999 if( count != (rowmajor ? nconss : nvars) + 1 )
1001 SCIPerrorMessage(
"Got only %d <start> entries in <linearConstraintCoefficients>, but expected %d many.\n", count, (rowmajor ? nconss : nvars) + 1);
1002*doingfine =
FALSE;
1013 if( strcmp(
xmlGetName(elnode),
"el") != 0 )
1015 SCIPerrorMessage(
"Expected <el> node under <%s> node in <linearConstraintCoefficients>, but got '%s'.\n", rowmajor ?
"colIdx":
"rowIdx",
xmlGetName(elnode));
1016*doingfine =
FALSE;
1021 SCIPerrorMessage(
"Too many elements under <%s> node in <linearConstraintCoefficients>, expected %d many, but got at least %d.\n", rowmajor ?
"colIdx":
"rowIdx", nnz, count + 1);
1022*doingfine =
FALSE;
1027 SCIPerrorMessage(
"No data in <el> node under <%s> node in <linearConstraintCoefficients>.\n", rowmajor ?
"colIdx":
"rowIdx");
1028*doingfine =
FALSE;
1034 if( *attrval !=
'\0'|| idx[count] < 0 || (idx[count] >= (rowmajor ? nvars : nconss)) )
1036 SCIPerrorMessage(
"Invalid value '%s' in <el> node under <%s> node in <linearConstraintCoefficients>.\n",
xmlGetData(elnode), rowmajor ?
"colIdx":
"rowIdx");
1037*doingfine =
FALSE;
1046 for( --mult; mult > 0; --mult )
1051 SCIPerrorMessage(
"Too many elements under <%s> node in <linearConstraintCoefficients>, expected %d many, got at least %d.\n", rowmajor ?
"colIdx":
"rowIdx", nnz, count + 1);
1052*doingfine =
FALSE;
1055idx[count] = idx[count-1] + incrint;
1060 SCIPerrorMessage(
"Got only %d entries in <%s> node in <linearConstraintCoefficients>, expected %d many.\n", count, rowmajor ?
"colIdx":
"rowIdx", nnz);
1061*doingfine =
FALSE;
1072 if( strcmp(
xmlGetName(elnode),
"el") != 0 )
1074 SCIPerrorMessage(
"Expected <el> node under <value> node in <linearConstraintCoefficients>, but got '%s'.\n",
xmlGetName(elnode));
1075*doingfine =
FALSE;
1080 SCIPerrorMessage(
"Too many elements under <value> node in <linearConstraintCoefficients>, expected %d many, got at least %d.\n", nnz, count + 1);
1081*doingfine =
FALSE;
1086 SCIPerrorMessage(
"No data in <el> node under <value> node in <linearConstraintCoefficients>.\n");
1087*doingfine =
FALSE;
1095 SCIPerrorMessage(
"Invalid value '%s' in <el> node under <value> node in <linearConstraintCoefficients>.\n",
xmlGetData(elnode));
1096*doingfine =
FALSE;
1105 for( --mult; mult > 0; --mult )
1110 SCIPerrorMessage(
"Too many elements under <value> node in <linearConstraintCoefficients>, expected %d many, got at least %d.\n", nnz, count + 1);
1111*doingfine =
FALSE;
1114val[count] = val[count-1] + incrreal;
1119 SCIPerrorMessage(
"Got only %d entries under <value> node in <linearConstraintCoefficients>, expected %d many.\n", count, nnz);
1120*doingfine =
FALSE;
1129 for( row = 0; row < nconss; ++row )
1134assert(start[row] >= 0);
1135assert(start[row+1] >= 0);
1136assert(start[row] <= nnz);
1137assert(start[row+1] <= nnz);
1139assert(linvars[row] ==
NULL);
1140assert(lincoefs[row] ==
NULL);
1141assert(nlinvars[row] == 0);
1143 nterms= start[row+1] - start[row];
1147 for( pos = start[row]; pos < start[row+1]; ++pos )
1152assert(idx[pos] >= 0);
1153assert(idx[pos] < nvars);
1155linvars[row][nlinvars[row]] = vars[idx[pos]];
1156lincoefs[row][nlinvars[row]] = val[pos];
1159assert(nlinvars[row] ==
nterms);
1169 for( k = 0; k < 2; ++k )
1171 for( col = 0; col < nvars; ++col )
1174assert(start[col] >= 0);
1175assert(start[col+1] >= 0);
1176assert(start[col] <= nnz);
1177assert(start[col+1] <= nnz);
1178 for( pos = start[col]; pos < start[col+1]; ++pos )
1180 intconsidx = idx[pos];
1185assert(considx >= 0);
1186assert(considx < nconss);
1190++(nlinvars[considx]);
1194linvars[considx][nlinvars[considx]] = vars[col];
1195lincoefs[considx][nlinvars[considx]] = val[pos];
1196++(nlinvars[considx]);
1206 for( c = 0; c < nconss; ++c )
1244 const char* attrval;
1253assert(datanode !=
NULL);
1254assert(quadvars1 !=
NULL);
1255assert(quadvars2 !=
NULL);
1256assert(quadcoefs !=
NULL);
1257assert(nquadterms !=
NULL);
1258assert(doingfine !=
NULL);
1262 if( quadcoef ==
NULL)
1266attrval =
xmlGetAttrval(quadcoef,
"numberOfQuadraticTerms");
1267 if( attrval ==
NULL)
1269 SCIPerrorMessage(
"Attribute \"numberOfQuadraticTerms\" not found for <quadraticCoefficients> node.\n");
1270*doingfine =
FALSE;
1274nqterms = (int)strtol(attrval, (
char**)&attrval, 10);
1275 if( *attrval !=
'\0'|| nqterms < 0 )
1277 SCIPerrorMessage(
"Invalid value '%s' for \"numberOfQuadraticTerms\" attribute of <quadraticCoefficients> node.\n",
xmlGetAttrval(quadcoef,
"numberOfQuadraticTerms"));
1278*doingfine =
FALSE;
1281assert(nqterms >= 0);
1286assert(vars !=
NULL);
1292 if( strcmp(
xmlGetName(qterm),
"qTerm") != 0 )
1295*doingfine =
FALSE;
1298 if( count >= nqterms )
1300 SCIPerrorMessage(
"Too many quadratic terms under <quadraticCoefficients> node, expected %d many, but got at least %d.\n", nqterms, count + 1);
1301*doingfine =
FALSE;
1307 if( attrval ==
NULL)
1309 SCIPerrorMessage(
"Missing \"idx\" attribute in %d'th <qTerm> node under <quadraticCoefficients> node.\n", count);
1310*doingfine =
FALSE;
1314considx = (int)strtol(attrval, (
char**)&attrval, 10);
1315 if( *attrval !=
'\0'|| considx < -1 || considx >= nconss )
1317 SCIPerrorMessage(
"Invalid value '%s' in \"idx\" attribute of %d'th <qTerm> node under <quadraticCoefficients> node.\n",
xmlGetAttrval(qterm,
"idx"), count);
1318*doingfine =
FALSE;
1324 if( attrval ==
NULL)
1326 SCIPerrorMessage(
"Missing \"idxOne\" attribute in %d'th <qTerm> node under <quadraticCoefficients> node.\n", count);
1327*doingfine =
FALSE;
1331varidx1 = (int)strtol(attrval, (
char**)&attrval, 10);
1332 if( *attrval !=
'\0'|| varidx1 < 0 || varidx1 >= nvars )
1334 SCIPerrorMessage(
"Invalid value '%s' in \"idxOne\" attribute of %d'th <qTerm> node under <quadraticCoefficients> node.\n",
xmlGetAttrval(qterm,
"idxOne"), count);
1335*doingfine =
FALSE;
1341 if( attrval ==
NULL)
1343 SCIPerrorMessage(
"Missing \"idxTwo\" attribute in %d'th <qTerm> node under <quadraticCoefficients> node.\n", count);
1344*doingfine =
FALSE;
1348varidx2 = (int)strtol(attrval, (
char**)&attrval, 10);
1349 if( *attrval !=
'\0'|| varidx2 < 0 || varidx2 >= nvars )
1351 SCIPerrorMessage(
"Invalid value '%s' in \"idxTwo\" attribute of %d'th <qTerm> node under <quadraticCoefficients> node.\n",
xmlGetAttrval(qterm,
"idxTwo"), count);
1352*doingfine =
FALSE;
1358 if( attrval !=
NULL)
1360coef = strtod(attrval, (
char**)&attrval);
1361 if( *attrval !=
'\0'|| (coef != coef) )
1363 SCIPerrorMessage(
"Invalid value '%s' in \"coef\" attribute of %d'th <qTerm> node under <quadraticCoefficients> node.\n",
xmlGetAttrval(qterm,
"coef"), count);
1364*doingfine =
FALSE;
1379 if( considx == -1 )
1382 if( nquadterms[considx] + 1 > termssize[considx] )
1390termssize[considx] = newsize;
1393quadvars1[considx][nquadterms[considx]] = vars[varidx1];
1394quadvars2[considx][nquadterms[considx]] = vars[varidx2];
1395quadcoefs[considx][nquadterms[considx]] = coef;
1396++nquadterms[considx];
1399 if( count != nqterms )
1401 SCIPerrorMessage(
"Got only %d quadratic terms under <quadraticCoefficients> node, but expected %d many.\n", count, nqterms);
1402*doingfine =
FALSE;
1419 const char* exprname;
1422assert(expr !=
NULL);
1423assert(node !=
NULL);
1424assert(vars !=
NULL);
1425assert(doingfine !=
NULL);
1428assert(exprname !=
NULL);
1433 if( strcmp(exprname,
"variable") == 0 )
1435 const char* attrval;
1441 if( attrval ==
NULL)
1443 SCIPerrorMessage(
"Attribute \"idx\" required for <variable> node in nonlinear expression\n");
1444*doingfine =
FALSE;
1448idx = (int)strtol(attrval, (
char**)&attrval, 10);
1449 if( *attrval !=
'\0'|| idx < 0 || idx >= nvars )
1452*doingfine =
FALSE;
1458 if( attrval !=
NULL)
1460coef = strtod(attrval, (
char**)&attrval);
1463 SCIPerrorMessage(
"Invalid value '%s' in \"coef\" attribute of <variable> node in nonlinear expression.\n",
xmlGetAttrval(node,
"coef"));
1464*doingfine =
FALSE;
1491 if( strcmp(exprname,
"number") == 0 )
1493 const char* attrval;
1497 if( attrval !=
NULL&& (strcmp(attrval,
"real") != 0) )
1499 SCIPerrorMessage(
"Type '%s' for <number> node in nonlinear expression not supported.\n", attrval);
1500*doingfine =
FALSE;
1505 if( attrval !=
NULL)
1507val = strtod(attrval, (
char**)&attrval);
1510 SCIPerrorMessage(
"Invalid value '%s' in \"value\" attribute of <number> node in nonlinear expression.\n",
xmlGetAttrval(node,
"value"));
1511*doingfine =
FALSE;
1529 if( strcmp(exprname,
"PI") == 0 )
1537 if( strcmp(exprname,
"E") == 0 )
1546 if( strcmp(exprname,
"negate") == 0 ||
1547strcmp(exprname,
"abs") == 0 ||
1548strcmp(exprname,
"squareRoot") == 0 ||
1549strcmp(exprname,
"sqrt") == 0 ||
1550strcmp(exprname,
"square") == 0 ||
1551strcmp(exprname,
"exp") == 0 ||
1552strcmp(exprname,
"ln") == 0 ||
1553strcmp(exprname,
"log10") == 0 ||
1554strcmp(exprname,
"sin") == 0 ||
1555strcmp(exprname,
"cos") == 0 ||
1556strcmp(exprname,
"erf") == 0
1564 SCIPerrorMessage(
"Expected exactly one child in <%s> node in nonlinear expression\n", exprname);
1565*doingfine =
FALSE;
1574assert(arg !=
NULL);
1577 if( strcmp(exprname,
"negate") == 0 )
1585 else if( strcmp(exprname,
"abs") == 0 )
1589 else if( strcmp(exprname,
"squareRoot") == 0 || strcmp(exprname,
"sqrt") == 0 )
1593 else if( strcmp(exprname,
"square") == 0 )
1597 else if( strcmp(exprname,
"exp") == 0 )
1601 else if( strcmp(exprname,
"ln") == 0 )
1605 else if( strcmp(exprname,
"log10") == 0 )
1614 else if( strcmp(exprname,
"sin") == 0 )
1618 else if( strcmp(exprname,
"cos") == 0 )
1622 else if( strcmp(exprname,
"erf") == 0 )
1624 SCIPwarningMessage(
scip,
"Danger! You're entering a construction area. Implementation of support for 'erf' is incomplete.\n");
1635 if( strcmp(exprname,
"plus") == 0 ||
1636strcmp(exprname,
"minus") == 0 ||
1637strcmp(exprname,
"times") == 0 ||
1638strcmp(exprname,
"divide") == 0 ||
1639strcmp(exprname,
"power") == 0 ||
1640strcmp(exprname,
"signpower") == 0 ||
1641strcmp(exprname,
"log") == 0
1651 SCIPerrorMessage(
"Expected exactly two children in <%s> node in nonlinear expression.\n", exprname);
1652*doingfine =
FALSE;
1659 gotoTERMINATE_TWO_ARGS;
1660assert(args[0] !=
NULL);
1665 gotoTERMINATE_TWO_ARGS;
1666assert(args[1] !=
NULL);
1668 if( strcmp(exprname,
"plus") == 0 )
1672 else if( strcmp(exprname,
"minus") == 0 )
1677 else if( strcmp(exprname,
"times") == 0 )
1681 else if( strcmp(exprname,
"divide") == 0 )
1692 else if( strcmp(exprname,
"power") == 0 )
1706 SCIPerrorMessage(
"Negative base in <power> node with nonconstant exponent not allowed in nonlinear expression.\n");
1707*doingfine =
FALSE;
1708 gotoTERMINATE_TWO_ARGS;
1736 else if( strcmp(exprname,
"signpower") == 0 )
1742*doingfine =
FALSE;
1743 gotoTERMINATE_TWO_ARGS;
1747 SCIPerrorMessage(
"Signpower only supported for exponents > 1, but got %g.\n",
1749*doingfine =
FALSE;
1750 gotoTERMINATE_TWO_ARGS;
1756 else if( strcmp(exprname,
"log") == 0 )
1775 else if( strcmp(exprname,
"min") == 0 )
1778*doingfine =
FALSE;
1779 gotoTERMINATE_TWO_ARGS;
1783assert(strcmp(exprname,
"max") == 0);
1786*doingfine =
FALSE;
1787 gotoTERMINATE_TWO_ARGS;
1793 if( args[0] !=
NULL)
1797 if( args[1] !=
NULL)
1806 if( strcmp(exprname,
"sum") == 0 || strcmp(exprname,
"product") == 0 )
1829 if( nargs >= argssize )
1834assert(nargs < argssize);
1839assert(args[nargs] ==
NULL);
1864 if( strcmp(exprname,
"sum") == 0 )
1879 for( i = 0; i < nargs; ++i )
1881assert(args[i] !=
NULL);
1890 if( strcmp(exprname,
"min") == 0 || strcmp(exprname,
"max") == 0 )
1893*doingfine =
FALSE;
1897 if( strcmp(exprname,
"quadratic") == 0 )
1899 const char* attrval;
1918 if( strcmp(
xmlGetName(qterm),
"qpTerm") != 0 )
1920 SCIPerrorMessage(
"Unexpected <%s> node under <quadratic> node in nonlinear expression, expected <qpTerm>.\n",
xmlGetName(qterm));
1921*doingfine =
FALSE;
1925 if( nquadelems >= quadelemssize )
1932assert(quadelemssize > nquadelems);
1936 if( attrval ==
NULL)
1938 SCIPerrorMessage(
"Missing \"idxOne\" attribute in %d'th <qpTerm> node under <quadratic> node in nonlinear expression.\n", nquadelems);
1939*doingfine =
FALSE;
1943idx = (int)strtol(attrval, (
char**)&attrval, 10);
1944 if( *attrval !=
'\0'|| idx < 0 || idx >= nvars )
1946 SCIPerrorMessage(
"Invalid value '%s' for \"idxOne\" attribute of %d'th <qpTerm> node under <quadratic> node in nonlinear expression.\n",
xmlGetAttrval(qterm,
"idxOne"), nquadelems);
1947*doingfine =
FALSE;
1950quadvars1[nquadelems] = vars[idx];
1954 if( attrval ==
NULL)
1956 SCIPerrorMessage(
"Missing \"idxTwo\" attribute in %d'th <qpTerm> node under <quadratic> node in nonlinear expression.\n", nquadelems);
1957*doingfine =
FALSE;
1961idx = (int)strtol(attrval, (
char**)&attrval, 10);
1962 if( *attrval !=
'\0'|| idx < 0 || idx >= nvars )
1964 SCIPerrorMessage(
"Invalid value '%s' for \"idxTwo\" attribute of %d'th <qpTerm> node under <quadratic> node in nonlinear expression.\n",
xmlGetAttrval(qterm,
"idxTwo"), nquadelems);
1965*doingfine =
FALSE;
1968quadvars2[nquadelems] = vars[idx];
1972 if( attrval !=
NULL)
1974quadcoefs[nquadelems] = strtod(attrval, (
char**)&attrval);
1975 if( *attrval !=
'\0'|| !
SCIPisFinite(quadcoefs[nquadelems]) )
1977 SCIPerrorMessage(
"Invalid value '%s' for \"coef\" attribute of %d'th <qpTerm> node under <quadratic> node in nonlinear expression.\n",
xmlGetAttrval(qterm,
"coef"), nquadelems);
1978*doingfine =
FALSE;
1984quadcoefs[nquadelems] = 1.0;
1989 SCIP_CALL(
SCIPcreateExprQuadratic(
scip, expr, 0,
NULL,
NULL, nquadelems, quadvars1, quadvars2, quadcoefs,
NULL,
NULL) );
1992 SCIPerrorMessage(
"Expression operand <%s> in nonlinear expression not supported by SCIP so far.\n", exprname);
1993*doingfine =
FALSE;
2013 const char* attrval;
2019assert(datanode !=
NULL);
2020assert(vars !=
NULL|| nvars == 0);
2021assert(exprs !=
NULL);
2022assert(doingfine !=
NULL);
2026 if( nlexprs ==
NULL)
2030attrval =
xmlGetAttrval(nlexprs,
"numberOfNonlinearExpressions");
2031 if( attrval ==
NULL)
2033 SCIPerrorMessage(
"Attribute \"numberOfNonlinearExpressions\" in <nonlinearExpressions> node not found.\n");
2034*doingfine =
FALSE;
2038nnlexprs = (int)strtol(attrval, (
char**)&attrval, 10);
2039 if( *attrval !=
'\0'|| nnlexprs < 0 )
2041 SCIPerrorMessage(
"Invalid value '%s' for \"numberOfNonlinearExpressions\" attribute in <nonlinearExpressions>.\n",
xmlGetAttrval(nlexprs,
"numberOfNonlinearExpressions"));
2042*doingfine =
FALSE;
2045assert(nnlexprs >= 0);
2051 if( strcmp(
xmlGetName(nlexpr),
"nl") != 0 )
2054*doingfine =
FALSE;
2057 if( count >= nnlexprs )
2059 SCIPerrorMessage(
"Too many nonlinear expressions under <nonlinearExpressions> node, expected %d many, but got at least %d.\n", nnlexprs, count + 1);
2060*doingfine =
FALSE;
2070 if( attrval ==
NULL)
2072 SCIPerrorMessage(
"Missing \"idx\" attribute in %d'th <nl> node under <nonlinearExpressions> node.\n", count);
2073*doingfine =
FALSE;
2077considx = (int)strtol(attrval, (
char**)&attrval, 10);
2078 if( *attrval !=
'\0'|| considx < -1 || considx >= nconss )
2080 SCIPerrorMessage(
"Invalid value '%s' in \"idx\" attribute of %d'th <nl> node under <nonlinearExpressions> node.\n",
xmlGetAttrval(nlexpr,
"idx"), count);
2081*doingfine =
FALSE;
2124 const char* attrval;
2143initial = initialconss;
2149dynamic = dynamicconss;
2150removable = dynamicrows;
2154 if( soscons==
NULL)
2159 if( attrval ==
NULL)
2161 SCIPerrorMessage(
"Attribute \"numberOfSOS in <specialOrderedSets> node not found.\n");
2162*doingfine =
FALSE;
2166nsoscons = (int)strtol(attrval, (
char**)&attrval, 10);
2167 if( *attrval !=
'\0'|| nsoscons < 0 )
2169 SCIPerrorMessage(
"Invalid value '%s' for \"numberOfSOS\" attribute in <specialOrderedSets>.\n",
xmlGetAttrval(soscons,
"numberOfSOS"));
2170*doingfine =
FALSE;
2173assert(nsoscons >= 0);
2182 if( strcmp(
xmlGetName(soscons),
"sos") != 0 )
2185*doingfine =
FALSE;
2189 if( count >= nsoscons)
2191 SCIPerrorMessage(
"Too many sos under <specialOrderedSets> node, expected %d many, but got at least %d.\n", nsoscons, count + 1);
2192*doingfine =
FALSE;
2198 if( attrval ==
NULL)
2201*doingfine =
FALSE;
2205nsosvars = (int)strtol(attrval, (
char**)&attrval, 10);
2206 if( *attrval !=
'\0'|| nsosvars < 0 )
2209*doingfine =
FALSE;
2212assert(nsosvars >= 0);
2216 if( attrval ==
NULL)
2219*doingfine =
FALSE;
2223sosorder = (int)strtol(attrval, (
char**)&attrval, 10);
2224 if( *attrval !=
'\0'|| sosorder < 0 || sosorder > 2 )
2227*doingfine =
FALSE;
2230assert(sosorder == 1 || sosorder == 2);
2240 SCIP_CALL(
SCIPcreateConsSOS1(
scip, &cons, name, 0,
NULL,
NULL, initial, separate, enforce, check, propagate,
2241local, dynamic, removable,
FALSE) );
2244 SCIP_CALL(
SCIPcreateConsSOS2(
scip, &cons, name, 0,
NULL,
NULL, initial, separate, enforce, check, propagate,
2245local, dynamic, removable,
FALSE) );
2258 if( attrval ==
NULL)
2260 SCIPerrorMessage(
"Attribute \"idx\" in <var> node below <specialOrderedSets> node not found.\n");
2261*doingfine =
FALSE;
2265idx = (int)strtol(attrval, (
char**)&attrval, 10);
2266 if( *attrval !=
'\0'|| idx < 0 || idx > nvars - 1 )
2269*doingfine =
FALSE;
2338 int* nlinvars =
NULL;
2344 int* nquadterms =
NULL;
2345 int* termssize =
NULL;
2351assert(reader !=
NULL);
2352assert(result !=
NULL);
2353assert(filename !=
NULL);
2365 if( start ==
NULL)
2367 SCIPerrorMessage(
"Some error occurred when parsing the OSiL XML file '%s'.\n", filename);
2376 if( header !=
NULL)
2410 SCIP_CALL_TERMINATE( retcode,
readVariables(
scip, data, &vars, &nvars, initialconss, dynamicconss, dynamiccols, dynamicrows, &doingfine), CLEANUP );
2413assert(vars !=
NULL|| nvars == 0);
2437 SCIP_CALL_TERMINATE( retcode,
readLinearCoefs(
scip, data, vars, nvars, nconss, linvars, lincoefs, nlinvars, &doingfine), CLEANUP );
2443nquadterms, termssize, &doingfine), CLEANUP );
2454quadvars1, quadvars2, quadcoefs, nquadterms, nlexprs, initialconss, dynamicconss, dynamicrows, &doingfine),
2460 if( nlinvars[nconss] > 0 || nquadterms[nconss] > 0 || nlexprs[nconss] !=
NULL)
2463quadvars1[nconss], quadvars2[nconss], quadcoefs[nconss], nquadterms[nconss], nlexprs[nconss],
2479 if( start !=
NULL)
2483assert(termssize !=
NULL);
2484 for( c = nconss; c >= 0; --c )
2487 if( nlexprs !=
NULL&& nlexprs[c] !=
NULL)
2512 for( i = 0; i < nvars; ++i )
constraint handler for bound disjunction constraints
Constraint handler for linear constraints in their most general form, .
constraint handler for nonlinear constraints specified by algebraic expressions
constraint handler for SOS type 1 constraints
constraint handler for SOS type 2 constraints
#define SCIP_CALL_TERMINATE(retcode, x, TERM)
absolute expression handler
SCIP_RETCODE SCIPcreateExprErf(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
handler for Gaussian error function expressions
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_RETCODE SCIPaddCoefLinear(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real val)
SCIP_RETCODE SCIPaddVarSOS1(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real weight)
SCIP_RETCODE SCIPcreateConsBounddisjunction(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_BOUNDTYPE *boundtypes, SCIP_Real *bounds, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPcreateConsSOS1(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *weights, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPcreateConsNonlinear(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_EXPR *expr, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable)
SCIP_RETCODE SCIPcreateConsSOS2(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *weights, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPcreateConsLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPaddVarSOS2(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var, SCIP_Real weight)
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_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_RETCODE SCIPappendExprSumExpr(SCIP *scip, SCIP_EXPR *expr, SCIP_EXPR *child, SCIP_Real childcoef)
SCIP_RETCODE SCIPcreateExprSignpower(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_Real exponent, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
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_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_RETCODE SCIPincludeReaderOsil(SCIP *scip)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
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 SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_RETCODE SCIPgetBoolParam(SCIP *scip, const char *name, SCIP_Bool *value)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_RETCODE SCIPcreateExprQuadratic(SCIP *scip, SCIP_EXPR **expr, int nlinvars, SCIP_VAR **linvars, SCIP_Real *lincoefs, int nquadterms, SCIP_VAR **quadvars1, SCIP_VAR **quadvars2, SCIP_Real *quadcoefs, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
SCIP_Bool SCIPisExprSum(SCIP *scip, SCIP_EXPR *expr)
SCIP_Bool SCIPisExprValue(SCIP *scip, SCIP_EXPR *expr)
SCIP_RETCODE SCIPreleaseExpr(SCIP *scip, SCIP_EXPR **expr)
SCIP_Real SCIPgetValueExprValue(SCIP_EXPR *expr)
void SCIPcaptureExpr(SCIP_EXPR *expr)
#define SCIPallocClearBlockMemoryArray(scip, ptr, num)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPreallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
#define SCIPfreeBufferArrayNull(scip, ptr)
SCIP_RETCODE SCIPincludeReaderBasic(SCIP *scip, SCIP_READER **readerptr, const char *name, const char *desc, const char *extension, SCIP_READERDATA *readerdata)
SCIP_RETCODE SCIPsetReaderCopy(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERCOPY((*readercopy)))
SCIP_RETCODE SCIPsetReaderRead(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERREAD((*readerread)))
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
SCIP_RETCODE SCIPchgVarObj(SCIP *scip, SCIP_VAR *var, SCIP_Real newobj)
int SCIPsnprintf(char *t, int len, const char *s,...)
static volatile int nterms
memory allocation routines
public methods for managing constraints
public methods for message output
public data structures and miscellaneous methods
public methods for NLP management
public methods for problem variables
static SCIP_RETCODE readConstraints(SCIP *scip, const XML_NODE *datanode, int nconss, SCIP_VAR ***linvars, SCIP_Real **lincoefs, int *nlinvars, SCIP_VAR ***quadvars1, SCIP_VAR ***quadvars2, SCIP_Real **quadcoefs, int *nquadterms, SCIP_EXPR **nlexprs, SCIP_Bool initialconss, SCIP_Bool dynamicconss, SCIP_Bool dynamicrows, SCIP_Bool *doingfine)
static SCIP_RETCODE readExpression(SCIP *scip, SCIP_EXPR **expr, const XML_NODE *node, SCIP_VAR **vars, int nvars, SCIP_Bool *doingfine)
static SCIP_DECL_READERREAD(readerReadOsil)
static SCIP_RETCODE readQuadraticCoefs(SCIP *scip, const XML_NODE *datanode, SCIP_VAR **vars, int nvars, int nconss, SCIP_VAR ***quadvars1, SCIP_VAR ***quadvars2, SCIP_Real **quadcoefs, int *nquadterms, int *termssize, SCIP_Bool *doingfine)
static SCIP_RETCODE readLinearCoefs(SCIP *scip, const XML_NODE *datanode, SCIP_VAR **vars, int nvars, int nconss, SCIP_VAR ***linvars, SCIP_Real **lincoefs, int *nlinvars, SCIP_Bool *doingfine)
static SCIP_RETCODE createConstraint(SCIP *scip, SCIP_VAR **linvars, SCIP_Real *lincoefs, int nlinvars, SCIP_VAR **quadvars1, SCIP_VAR **quadvars2, SCIP_Real *quadcoefs, int nquadterms, SCIP_EXPR *nlexpr, SCIP_Real lhs, SCIP_Real rhs, const char *name, SCIP_Bool objcons, SCIP_Bool initialconss, SCIP_Bool dynamicconss, SCIP_Bool dynamicrows)
static SCIP_RETCODE readVariables(SCIP *scip, const XML_NODE *datanode, SCIP_VAR ***vars, int *nvars, SCIP_Bool initialconss, SCIP_Bool dynamicconss, SCIP_Bool dynamiccols, SCIP_Bool dynamicrows, SCIP_Bool *doingfine)
static SCIP_RETCODE readObjective(SCIP *scip, const XML_NODE *datanode, SCIP_VAR **vars, int nvars, SCIP_Bool dynamiccols, SCIP_Bool *doingfine)
static SCIP_RETCODE readNonlinearExprs(SCIP *scip, const XML_NODE *datanode, SCIP_VAR **vars, int nvars, int nconss, SCIP_EXPR **exprs, SCIP_Bool *doingfine)
static SCIP_RETCODE readSOScons(SCIP *scip, const XML_NODE *datanode, SCIP_VAR **vars, int nvars, SCIP_Bool initialconss, SCIP_Bool dynamicconss, SCIP_Bool dynamicrows, SCIP_Bool *doingfine)
static void readMultIncr(const XML_NODE *node, int *mult, int *incrint, SCIP_Real *incrreal, SCIP_Bool *doingfine)
static SCIP_DECL_READERCOPY(readerCopyOsil)
static SCIP_RETCODE readNConstraints(SCIP *scip, const XML_NODE *datanode, int *nconss, SCIP_Bool *doingfine)
OS instance language (OSiL) format file reader.
public methods for constraint handler plugins and constraints
public methods for memory management
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for reader plugins
public methods for SCIP variables
enum SCIP_BoundType SCIP_BOUNDTYPE
enum SCIP_Retcode SCIP_RETCODE
@ SCIP_VARTYPE_CONTINUOUS
enum SCIP_Vartype SCIP_VARTYPE
declarations for XML parsing
const XML_NODE * xmlFirstChild(const XML_NODE *node)
const XML_NODE * xmlFindNodeMaxdepth(const XML_NODE *node, const char *name, int depth, int maxdepth)
const char * xmlGetName(const XML_NODE *node)
const char * xmlGetAttrval(const XML_NODE *node, const char *name)
struct XML_NODE_struct XML_NODE
void xmlShowNode(const XML_NODE *root)
const XML_NODE * xmlNextSibl(const XML_NODE *node)
XML_NODE * xmlProcess(const char *filename)
const char * xmlGetData(const XML_NODE *node)
void xmlFreeNode(XML_NODE *node)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4