trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
expr_ops.hpp
1 #pragma once
2 
3 #include "sco_fwd.hpp"
4 #include "solver_interface.hpp"
5 
6 namespace sco {
7 
8 
9 
11 
12 // multiplication
13 inline void exprScale(AffExpr& v, double a) {
14  v.constant *= a;
15  for (int i=0; i < v.coeffs.size(); ++i) v.coeffs[i] *= a;
16 }
17 inline void exprScale(QuadExpr& q, double a) {
18  exprScale(q.affexpr, a);
19  for (int i=0; i < q.coeffs.size(); ++i) q.coeffs[i] *= a;
20 }
21 
22 // addition
23 inline void exprInc(AffExpr& a, double b) {
24  a.constant += b;
25 }
26 inline void exprInc(AffExpr& a, const AffExpr& b) {
27  a.constant += b.constant;
28  a.coeffs.insert(a.coeffs.end(), b.coeffs.begin(), b.coeffs.end());
29  a.vars.insert(a.vars.end(), b.vars.begin(), b.vars.end());
30 }
31 inline void exprInc(AffExpr& a, const Var& b) {
32  exprInc(a, AffExpr(b));
33 }
34 inline void exprInc(QuadExpr& a, double b) {
35  exprInc(a.affexpr, b);
36 }
37 inline void exprInc(QuadExpr& a, const Var& b) {
38  exprInc(a.affexpr, AffExpr(b));
39 }
40 inline void exprInc(QuadExpr& a, const AffExpr& b) {
41  exprInc(a.affexpr, b);
42 }
43 inline void exprInc(QuadExpr& a, const QuadExpr& b) {
44  exprInc(a.affexpr, b.affexpr);
45  a.coeffs.insert(a.coeffs.end(), b.coeffs.begin(), b.coeffs.end());
46  a.vars1.insert(a.vars1.end(), b.vars1.begin(), b.vars1.end());
47  a.vars2.insert(a.vars2.end(), b.vars2.begin(), b.vars2.end());
48 }
49 
50 
51 // subtraction
52 inline void exprDec(AffExpr& a, double b) {
53  a.constant -= b;
54 }
55 inline void exprDec(AffExpr& a, AffExpr b) {
56  exprScale(b, -1);
57  exprInc(a, b);
58 }
59 inline void exprDec(AffExpr& a, const Var& b) {
60  exprDec(a, AffExpr(b));
61 }
62 inline void exprDec(QuadExpr& a, double b) {
63  exprDec(a.affexpr, b);
64 }
65 inline void exprDec(QuadExpr& a, const Var& b) {
66  exprDec(a.affexpr, b);
67 }
68 inline void exprDec(QuadExpr& a, const AffExpr& b) {
69  exprDec(a.affexpr, b);
70 }
71 inline void exprDec(QuadExpr& a, QuadExpr b) {
72  exprScale(b, -1);
73  exprInc(a, b);
74 }
75 
77 
78 inline AffExpr exprMult(const Var& a, double b) {
79  AffExpr c(a);
80  exprScale(c,b);
81  return c;
82 }
83 // multiplication
84 inline AffExpr exprMult(AffExpr a, double b) {
85  exprScale(a,b);
86  return a;
87 }
88 inline QuadExpr exprMult(QuadExpr a, double b) {
89  exprScale(a, b);
90  return a;
91 }
92 
93 
94 
95 inline AffExpr exprAdd(AffExpr a, double b) {
96  exprInc(a, b);
97  return a;
98 }
99 inline AffExpr exprAdd(AffExpr a, const Var& b) {
100  exprInc(a, b);
101  return a;
102 }
103 inline AffExpr exprAdd(AffExpr a, const AffExpr& b) {
104  exprInc(a, b);
105  return a;
106 }
107 inline QuadExpr exprAdd(QuadExpr a, double b) {
108  exprInc(a, b);
109  return a;
110 }
111 inline QuadExpr exprAdd(QuadExpr a, const Var& b) {
112  exprInc(a, b);
113  return a;
114 }
115 inline QuadExpr exprAdd(QuadExpr a, const AffExpr& b) {
116  exprInc(a, b);
117  return a;
118 }
119 inline QuadExpr exprAdd(QuadExpr a, const QuadExpr& b) {
120  exprInc(a, b);
121  return a;
122 }
123 
124 
125 
126 
127 inline AffExpr exprSub(AffExpr a, double b) {
128  exprDec(a, b);
129  return a;
130 }
131 inline AffExpr exprSub(AffExpr a, const Var& b) {
132  exprDec(a, b);
133  return a;
134 }
135 inline AffExpr exprSub(AffExpr a, const AffExpr& b) {
136  exprDec(a, b);
137  return a;
138 }
139 inline QuadExpr exprSub(QuadExpr a, double b) {
140  exprDec(a, b);
141  return a;
142 }
143 inline QuadExpr exprSub(QuadExpr a, const Var& b) {
144  exprDec(a, b);
145  return a;
146 }
147 inline QuadExpr exprSub(QuadExpr a, const AffExpr& b) {
148  exprDec(a, b);
149  return a;
150 }
151 inline QuadExpr exprSub(QuadExpr a, const QuadExpr& b) {
152  exprDec(a, b);
153  return a;
154 }
155 
156 
157 
158 
160 
161 
162 
163 QuadExpr exprSquare(const Var&);
164 QuadExpr exprSquare(const AffExpr&);
165 
166 AffExpr cleanupAff(const AffExpr&);
167 QuadExpr cleanupQuad(const QuadExpr&); //warning: might make it non-psd!
168 
169 
170 }