I don't remember why we (or I) decided to use CONST expressions to represent exponents of POW expressions.
So, for instance, to represent z^2 where z is the third variable of some problem, the code is like:
int nops = 3;
CSIP_OP ops[] = {VARIDX, CONST, POW};
int children[] = {2, 0, 0, 1};
int begin[] = {0, 1, 2, 4};
double values[] = {2.0};
see test.c::test_nlp
However, that CONST expression is never used when creating the expression tree, since when creating the POW expression the code looks directly into values:
case SCIP_EXPR_REALPOWER:
assert(2 == begin[i + 1] - begin[i]);
{
double exponent;
// the second child is the exponent which is a const
exponent = values[children[begin[children[begin[i] + 1]]]];
printf("Seeing a power with exponent %g (nchild %d)\n", exponent, begin[i+1] - begin[i]);
SCIP_in_CSIP(SCIPexprCreate(SCIPblkmem(scip), &exprs[i],
ops[i], exprs[children[begin[i]]], exponent));
}
break;
This of course produces a memory leak, since the created CONST expression is never used, hence, never freed