20 using namespace Couenne;
31 double sign = 1., retval = 0;
35 ex = ex -> Argument () -> Original ();
48 if (e -> getc0 () != 0)
49 retval -= sign * e -> getc0 ();
51 for (std::vector <std::pair <exprVar *, CouNumber> >::iterator i = e -> lcoeff () . begin ();
52 i != e -> lcoeff ().
end (); ++i) {
57 ((i != e -> lcoeff (). begin ()) || (e -> getc0 () != 0)))
62 i -> first -> print (f);
64 if (!(++wrapCount % 10))
73 retval -= ex -> Value ();
83 std::vector <std::pair <exprVar *, exprQuad::sparseQcol> > &
Q = q -> getQ ();
87 for (std::vector <std::pair <exprVar *, exprQuad::sparseQcol> >::iterator i = Q. begin ();
88 i != Q .
end (); ++i) {
90 for (std::vector <std::pair <exprVar *, CouNumber> >::iterator
j = i -> second. begin ();
91 j != i -> second .
end (); ++
j) {
100 if (i -> first -> Index () ==
101 j -> first -> Index ()) {
102 i -> first -> print (f);
105 i -> first -> print (f); f <<
" * ";
106 j -> first -> print (f);
109 if (!(++wrapCount % 10))
120 if ((mutex -> nArgs () == 1) &&
121 (mutex -> ArgList () [0] -> Type () ==
CONST)) {
123 retval -= sign * mutex -> ArgList () [0] -> Value ();
132 for (
int i=0; i<mutex -> nArgs ();) {
144 arg = mutex -> ArgList () [i];
148 arg = arg -> Argument ();
154 arg2 = arg -> ArgList () [1];
155 arg = arg -> ArgList () [0];
161 arg = arg -> Argument ();
165 if (arg -> Type () ==
CONST) retval -= signI * arg -> Value ();
168 (arg -> ArgList () [0] -> Type () ==
VAR) &&
169 (arg -> ArgList () [1] -> Type () ==
CONST)) {
171 f << ((signI > 0) ?
" + " :
" - ");
172 if (mult != 1) f << mult <<
" ";
173 arg -> ArgList () [0] -> print (f);
178 (arg -> ArgList () [0] -> Type () ==
CONST) &&
179 (arg -> ArgList () [1] -> code () ==
COU_EXPRPOW) &&
180 (arg -> ArgList () [1] -> ArgList () [0] -> Type () ==
VAR) &&
181 (arg -> ArgList () [1] -> ArgList () [1] -> Type () ==
CONST)) {
183 double c = mult * signI * arg -> ArgList () [0] -> Value ();
184 f << ((c > 0) ?
'+' :
' ') << c <<
" ";
185 arg -> ArgList () [1] -> ArgList () [0] -> print (f);
190 (arg -> ArgList () [0] -> Type () ==
VAR) &&
191 (arg -> ArgList () [1] -> Type () ==
VAR) &&
192 (arg -> ArgList () [0] -> Index () !=
193 arg -> ArgList () [1] -> Index ())) {
195 f << ((signI > 0) ?
" + " :
" - ");
196 if (mult != 1) f << mult <<
" ";
197 arg -> ArgList () [0] -> print (f); f <<
" * ";
198 arg -> ArgList () [1] -> print (f);
202 (arg -> ArgList () [0] -> Type () ==
VAR) &&
203 (arg -> ArgList () [1] -> Type () ==
VAR) &&
204 (arg -> ArgList () [0] -> Index () ==
205 arg -> ArgList () [1] -> Index ())) {
207 f << ((signI > 0) ?
" + " :
" - ");
208 if (mult != 1) f << mult <<
" ";
209 arg -> ArgList () [1] -> print (f);
214 (arg -> ArgList () [0] -> Type () ==
CONST) &&
215 (arg -> ArgList () [1] -> code () ==
COU_EXPRMUL) &&
216 (arg -> ArgList () [1] -> ArgList () [0] -> Type () ==
VAR) &&
217 (arg -> ArgList () [1] -> ArgList () [1] -> Type () ==
VAR) &&
218 (arg -> ArgList () [1] -> ArgList () [0] -> Index () !=
219 arg -> ArgList () [1] -> ArgList () [1] -> Index ())) {
221 double c = mult * signI * arg -> ArgList () [0] -> Value ();
222 f << ((c > 0) ?
'+' :
' ') << c <<
" ";
223 arg -> ArgList () [1] -> ArgList () [0] -> print (f); f <<
" * ";
224 arg -> ArgList () [1] -> ArgList () [1] -> print (f);
228 (arg -> ArgList () [0] -> Type () ==
CONST) &&
229 (arg -> ArgList () [1] -> code () ==
COU_EXPRMUL) &&
230 (arg -> ArgList () [1] -> ArgList () [0] -> Type () ==
VAR) &&
231 (arg -> ArgList () [1] -> ArgList () [1] -> Type () ==
VAR) &&
232 (arg -> ArgList () [1] -> ArgList () [0] -> Index () !=
233 arg -> ArgList () [1] -> ArgList () [1] -> Index ())) {
235 double c = mult * signI * arg -> ArgList () [0] -> Value ();
236 f << ((c > 0) ?
'+' :
' ') << c <<
" ";
237 arg -> ArgList () [1] -> ArgList () [0] -> print (f);
242 printf (
"Can't recognize expression (code: %d), exiting: ", arg -> code ());
244 printf (
"\nExpression: ");
250 if (!(++wrapCount % 10))
274 for (
int i=0; i <
nVars (); i++)
276 printf (
"Auxiliary variables not supported in writeLP yet, bailing out\n");
281 printf (
"Objective is nonlinear and not quadratic, bailing out\n");
285 for (
int i=0; i <
nCons (); i++) {
287 printf (
"Constraint %d is nonlinear and not quadratic, bailing out\n", i);
292 std::ofstream
f (fname.c_str ());
294 f << std::setprecision (15);
298 f <<
"\\ Problem name (saved using Couenne): " <<
problemName_ << std::endl << std::endl;
303 f <<
"minimize obj: ";
306 if (objConst != 0.) f << ((objConst > 0) ?
" + " :
" ") << objConst;
307 f << std::endl << std::endl <<
"Subject To" << std::endl << std::endl;
355 for (
int i=0; i <
nCons (); i++) {
361 f <<
"con_" << i <<
": ";
371 f << "= " << lb << std::endl;
373 else f << " <= " << ub << std::endl;
375 // if range constraint, print it once again
377 if (( lb > - COUENNE_INFINITY + 1)
378 && (ub < COUENNE_INFINITY - 1)
379 && (fabs (ub-lb) > COUENNE_EPS)) {
381 f << "con_" << i << "_rng: ";
382 printLPquad (f, constraints_ [i] -> Body (), 1);
383 f << " <= " << ub << std::endl;
387 f << "Bounds" << std::endl << std::endl;
389 for (int i=0; i < nVars (); i++) {
391 if ((Lb (i) == 0) && (Ub (i) >= COUENNE_INFINITY/2))
394 if (Lb (i) != 0) f << Lb (i) << " <= ";
395 variables_ [i] -> print (f);
396 if (Ub (i) < + COUENNE_INFINITY/2) f << " <= " << Ub (i);
400 f << "Generals" << std::endl << std::endl;
404 for (int i=0; i < nVars (); i++)
406 if (variables_ [i] -> isInteger ()) {
407 variables_ [i] -> print (f);
408 if (!(++wrapcount % 10))
414 f << std::endl << std::endl << "End" << std::endl;
int nVars() const
Total number of variables.
class Group, with constant, linear and nonlinear terms:
std::vector< CouenneObjective * > objectives_
Objectives.
std::string problemName_
problem name
CouNumber Q(register int k, CouNumber x)
void fint fint fint real fint real real real real * f
void fint fint fint real fint real real real real real real real real real * e
void writeLP(const std::string &fname)
Write nonlinear problem to a .lp file.
std::vector< CouenneConstraint * > constraints_
Constraints.
std::vector< exprVar * > variables_
Variables (original, auxiliary, and defined)
CouNumber * Ub() const
Return vector of upper bounds.
static Bigint * mult(Bigint *a, Bigint *b)
double CouNumber
main number type in Couenne
double printLPquad(std::ofstream &f, const expression *ex, double mult)
class exprQuad, with constant, linear and quadratic terms
int nCons() const
Get number of constraints.
CouNumber * Lb() const
Return vector of lower bounds.