00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "CouenneTypes.hpp"
00012
00013 #include "CouenneExprVar.hpp"
00014 #include "CouenneExprAbs.hpp"
00015 #include "CouenneExprSum.hpp"
00016 #include "CouenneExprSub.hpp"
00017 #include "CouenneExprMul.hpp"
00018 #include "CouenneExprDiv.hpp"
00019 #include "CouenneExprInv.hpp"
00020 #include "CouenneExprSin.hpp"
00021 #include "CouenneExprPow.hpp"
00022 #include "CouenneExprClone.hpp"
00023 #include "CouenneExprLog.hpp"
00024 #include "CouenneExprOpp.hpp"
00025 #include "CouenneExprCos.hpp"
00026 #include "CouenneExprExp.hpp"
00027
00028 #include "asl.h"
00029 #include "nlp.h"
00030 #include "opcode.hd"
00031
00032 using namespace Couenne;
00033
00034
00035 size_t getOperator (efunc *);
00036
00037
00038
00039
00040 void notimpl (const std::string &fname) {
00041 std::cerr << "*** Error: " << fname << " not implemented" << std::endl;
00042 exit (-1);
00043 }
00044
00045
00046
00047 expression *CouenneProblem::nl2e (expr *e, const ASL *asl) {
00048
00049 switch (getOperator (e -> op)) {
00050
00051 case OPPLUS: return new exprSum (nl2e (e -> L.e, asl), nl2e (e -> R.e, asl));
00052 case OPMINUS: return new exprSub (nl2e (e -> L.e, asl), nl2e (e -> R.e, asl));
00053 case OPMULT: return new exprMul (nl2e (e -> L.e, asl), nl2e (e -> R.e, asl));
00054 case OPDIV: return new exprDiv (nl2e (e -> L.e, asl), nl2e (e -> R.e, asl));
00055 case OPREM: notimpl ("remainder");
00056 case OPPOW: return new exprPow (nl2e (e -> L.e, asl), nl2e (e -> R.e, asl));
00057 case OPLESS: notimpl ("less");
00058 case MINLIST: notimpl ("min");
00059 case MAXLIST: notimpl ("max");
00060 case FLOOR: notimpl ("floor");
00061 case CEIL: notimpl ("ceil");
00062 case ABS: return new exprAbs (nl2e (e -> L.e, asl));
00063 case OPUMINUS:return new exprOpp (nl2e (e -> L.e, asl));
00064
00065 case OPIFnl: { notimpl ("ifnl");
00066
00067
00068 }
00069
00070 case OP_tanh: return new exprDiv
00071 (new exprSub (new exprExp (nl2e (e -> L.e, asl)),
00072 new exprExp (new exprOpp (nl2e (e->L.e, asl)))),
00073 new exprSum (new exprExp (nl2e (e -> L.e, asl)),
00074 new exprExp (new exprOpp (nl2e (e->L.e, asl)))));
00075
00076 case OP_tan:
00077 return new exprDiv (new exprSin (nl2e (e -> L.e, asl)), new exprCos (new exprClone (nl2e (e -> L.e, asl))));
00078 case OP_sqrt: return new exprPow (nl2e (e -> L.e, asl), new exprConst (0.5));
00079 case OP_sinh: return new exprMul (new exprConst (0.5),
00080 new exprSub (new exprExp (nl2e (e -> L.e, asl)),
00081 new exprExp (new exprOpp (nl2e (e->L.e, asl)))));
00082 case OP_sin: return new exprSin (nl2e (e -> L.e, asl));
00083 case OP_log10: return new exprMul (new exprConst (1.0 / log (10.0)),
00084 new exprLog (nl2e (e -> L.e, asl)));
00085 case OP_log: return new exprLog (nl2e (e -> L.e, asl));
00086 case OP_exp: return new exprExp (nl2e (e -> L.e, asl));
00087 case OP_cosh: return new exprMul (new exprConst (0.5),
00088 new exprSum (new exprExp (nl2e (e -> L.e, asl)),
00089 new exprExp (new exprOpp (nl2e (e->L.e, asl)))));
00090
00091 case OP_cos: return new exprCos (nl2e (e -> L.e, asl));
00092 case OP_atanh: notimpl ("atanh");
00093 case OP_atan2: notimpl ("atan2");
00094 case OP_atan: notimpl ("atan");
00095 case OP_asinh: notimpl ("asinh");
00096 case OP_asin: notimpl ("asin");
00097 case OP_acosh: notimpl ("acosh");
00098 case OP_acos: notimpl ("acos");
00099
00100 case OPSUMLIST: {
00101 int i=0;
00102 expression **al = new expression * [(e->R.ep - e->L.ep)];
00103 for (expr **ep = e->L.ep; ep < e->R.ep; ep++)
00104 al [i++] = nl2e (*ep, asl);
00105 return new exprSum (al, i);
00106 }
00107 case OPintDIV: notimpl ("intdiv");
00108 case OPprecision: notimpl ("precision");
00109 case OPround: notimpl ("round");
00110 case OPtrunc: notimpl ("trunc");
00111
00112 case OP1POW: return new exprPow (nl2e (e -> L.e, asl), new exprConst (((expr_n *)e->R.e)->v));
00113 case OP2POW: return new exprPow (nl2e (e -> L.e, asl), new exprConst (2.));
00114 case OPCPOW: return new exprPow (new exprConst (((expr_n *)e->L.e)->v), nl2e (e -> R.e, asl));
00115 case OPFUNCALL: notimpl ("function call");
00116 case OPNUM: return new exprConst (((expr_n *)e)->v);
00117 case OPPLTERM: notimpl ("plterm");
00118 case OPIFSYM: notimpl ("ifsym");
00119 case OPHOL: notimpl ("hol");
00120 case OPVARVAL: {
00121
00122 int j = ((expr_v *) e) -> a;
00123
00124 if (j >= nOrigVars_)
00125
00126
00127
00128 j = ((expr_v *) e) - ((const ASL_fg *) asl) -> I.var_e_;
00129
00130 if (j >= nOrigVars_ + ndefined_) {
00131 printf ("error: unknown variable x_%d\n", j);
00132
00133 exit (-1);
00134 }
00135
00136 return new exprClone (variables_ [j]);
00137 }
00138
00139 default:
00140 printf ("Couenne error: unknown operator (address %p), aborting.\n", Intcast (e -> op));
00141 exit (-1);
00142
00143 }
00144
00145 return new exprConst (0.);
00146 }