DACE 2.0 API Manual
Differential Algebra Core Engine
DA.h
Go to the documentation of this file.
1 /******************************************************************************
2 * *
3 * DIFFERENTIAL ALGEBRA CORE ENGINE *
4 * *
5 *******************************************************************************
6 * *
7 * Copyright 2016 Politecnico di Milano (2014 Dinamica Srl) *
8 * Licensed under the Apache License, Version 2.0 (the "License"); *
9 * you may not use this file except in compliance with the License. *
10 * You may obtain a copy of the License at *
11 * *
12 * http://www.apache.org/licenses/LICENSE-2.0 *
13 * *
14 * Unless required by applicable law or agreed to in writing, software *
15 * distributed under the License is distributed on an "AS IS" BASIS, *
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
17 * See the License for the specific language governing permissions and *
18 * limitations under the License. *
19 * *
20 *******************************************************************************/
21 
22 /*
23  * DA.h
24  *
25  * Created on: Feb 24, 2014
26  * Author: Dinamica Srl
27  */
28 
29 #ifndef DINAMICA_DA_H_
30 #define DINAMICA_DA_H_
31 
32 // DACE C++ interface version (must match the version returned by DACEVER)
33 #define DACE_CPP_MAJOR (2)
34 #define DACE_CPP_MINOR (1)
35 
36 // C++ stdlib classes used in this public interface
37 #include <iostream>
38 #include <string>
39 #include <vector>
40 #include <stack>
41 #include <initializer_list>
42 
43 #include "dace/dacecore.h"
44 
45 namespace DACE{
46 
47 // forward declarations
48 class compiledDA;
49 class storedDA;
50 class DACEException;
51 class Monomial;
52 class Interval;
53 class DA;
54 template<typename T> class AlgebraicVector;
55 
57 class DACE_API DA
58 {
59  friend class compiledDA;
60  friend class storedDA;
61 
62 private:
63  static bool initialized;
64  static std::stack<unsigned int> TOstack;
65  DACEDA m_index;
66 
67 public:
68  /********************************************************************************
69  * DACE Setup
70  *********************************************************************************/
71  static void init(const unsigned int ord, const unsigned int nvar);
72  static bool isInitialized();
73  static void version(int &maj, int &min, int &patch);
74  static void checkVersion();
75  static double setEps(const double eps);
76  static double getEps();
77  static double getEpsMac();
78  static unsigned int getMaxOrder();
79  static unsigned int getMaxVariables();
80  static unsigned int getMaxMonomials();
81  static unsigned int getTO();
82  static unsigned int setTO(const unsigned int ot = DA::getMaxOrder());
83  static void pushTO(const unsigned int ot = DA::getMaxOrder());
84  static void popTO();
85 
86  /********************************************************************************
87  * Constructors & Destructors
88  *********************************************************************************/
89  DA();
90  DA(const DA &da);
91 
92  DA(DA &&da);
93 
94  explicit DA(const int i, const double c = 1.0);
95  explicit DA(const unsigned int i, const double c = 1.0);
96  DA(const double c);
97  ~DA() throw();
98 
99  /********************************************************************************
100  * Coefficient access and extraction routines
101  *********************************************************************************/
102  int isnan() const;
103  int isinf() const;
104  double cons() const;
105  AlgebraicVector<double> linear() const;
106  AlgebraicVector<DA> gradient() const;
107  double getCoefficient(const std::vector<unsigned int> &jj) const;
108  void setCoefficient(const std::vector<unsigned int> &jj, const double coeff);
109  Monomial getMonomial(const unsigned int npos) const;
110  void getMonomial(const unsigned int npos, Monomial &m) const;
111  std::vector<Monomial> getMonomials() const;
112 
113  /********************************************************************************
114  * Assignments
115  *********************************************************************************/
116  DA& operator=(DA &&da);
117 
118  DA& operator=(const DA &da);
119  DA& operator=(const double c);
120 
121  DA& operator+=(const DA &da);
122  DA& operator+=(const double c);
123 
124  DA& operator-=(const DA &da);
125  DA& operator-=(const double c);
126 
127  DA& operator*=(const DA &da);
128  DA& operator*=(const double c);
129 
130  DA& operator/=(const DA &da);
131  DA& operator/=(const double c);
132 
133  /********************************************************************************
134  * Algebraic operations
135  *********************************************************************************/
136  DA operator-() const;
137 
138  friend DA DACE_API operator+(const DA &da1, const DA &da2);
139  friend DA DACE_API operator+(const DA &da, const double c);
140  friend DA DACE_API operator+(const double c, const DA &da);
141 
142  friend DA DACE_API operator-(const DA &da1, const DA &da2);
143  friend DA DACE_API operator-(const DA &da, const double c);
144  friend DA DACE_API operator-(const double c, const DA &da);
145 
146  friend DA DACE_API operator*(const DA &da1, const DA &da2);
147  friend DA DACE_API operator*(const DA &da, const double c);
148  friend DA DACE_API operator*(const double c, const DA &da);
149 
150  friend DA DACE_API operator/(const DA &da1, const DA &da2);
151  friend DA DACE_API operator/(const DA &da, const double c);
152  friend DA DACE_API operator/(const double c, const DA &da);
153 
154  /********************************************************************************
155  * Math routines
156  *********************************************************************************/
157  DA multiplyMonomials(const DA &da) const;
158  DA divide(const unsigned int var, const unsigned int p = 1) const;
159  DA deriv(const unsigned int i) const;
160  DA deriv(const std::vector<unsigned int> ind) const;
161  DA integ(const unsigned int i) const;
162  DA integ(const std::vector<unsigned int> ind) const;
163  DA trim(const unsigned int min, const unsigned int max = DA::getMaxOrder()) const;
165  DA trunc() const;
166  DA round() const;
167  DA mod(const double p) const;
168  DA pow(const int p) const;
169  DA pow(const double p) const;
170  DA root(const int p = 2) const;
171  DA minv() const;
172  DA sqr() const;
173  DA sqrt() const;
174  DA isrt() const;
175  DA cbrt() const;
176  DA icrt() const;
177  DA hypot(const DA &da) const;
178  DA exp() const;
179  DA log() const;
180  DA logb(const double b = 10.0) const;
181  DA log10() const;
182  DA log2() const;
183  DA sin() const;
184  DA cos() const;
185  DA tan() const;
186  DA asin() const;
187  DA acos() const;
188  DA atan() const;
189  DA atan2(const DA &da) const;
190  DA sinh() const;
191  DA cosh() const;
192  DA tanh() const;
193  DA asinh() const;
194  DA acosh() const;
195  DA atanh() const;
196  DA erf() const;
197  DA erfc() const;
198  DA BesselJFunction(const int n) const;
199  DA BesselYFunction(const int n) const;
200  DA BesselIFunction(const int n, const bool scaled = false) const;
201  DA BesselKFunction(const int n, const bool scaled = false) const;
202  DA GammaFunction() const;
203  DA LogGammaFunction() const;
204  DA PsiFunction(const unsigned int n) const;
205 
206  /********************************************************************************
207  * Norm and estimation routines
208  *********************************************************************************/
209  unsigned int size() const;
210  double abs() const;
211  double norm(const unsigned int type = 0) const;
212  std::vector<double> orderNorm(const unsigned int var = 0, const unsigned int type = 0) const;
214  std::vector<double> estimNorm(const unsigned int var = 0, const unsigned int type = 0, const unsigned int nc = DA::getMaxOrder()) const;
216  std::vector<double> estimNorm(std::vector<double> &err, const unsigned int var = 0, const unsigned int type = 0, const unsigned int nc = DA::getMaxOrder()) const;
218  Interval bound() const;
219  double convRadius(const double eps, const unsigned int type = 1) const;
220 
221  /********************************************************************************
222  * DACE polynomial evaluation routines
223  *********************************************************************************/
224  template<class T> T eval(const std::vector<T> &args) const;
225  template<class T> T eval(const T args[], const unsigned int length) const;
226  template<class T> T evalScalar(const T &arg) const;
227  compiledDA compile() const;
228  DA plug(const unsigned int var, const double val = 0.0) const;
229  double evalMonomials(const DA &values) const;
230  DA replaceVariable(const unsigned int from = 0, const unsigned int to = 0, const double val = 1.0) const;
232  DA scaleVariable(const unsigned int var = 0, const double val = 1.0) const;
234  DA translateVariable(const unsigned int var = 0, const double a = 1.0, const double c = 0.0) const;
236 
237  /********************************************************************************
238  * DACE input/output routines
239  *********************************************************************************/
240  std::string toString() const;
241  void write(std::ostream &os) const;
242  friend DACE_API std::ostream& operator<< (std::ostream &out, const DA &da);
243  friend DACE_API std::istream& operator>> (std::istream &in, DA &da);
244 
245  /********************************************************************************
246  * Static factory routines
247  *********************************************************************************/
248  static DA random(const double cm);
249  static DA identity(const unsigned int var);
250  static DA fromString(const std::string &str);
251  static DA fromString(const std::vector<std::string> &str);
252  static DA read(std::istream &is);
253 
254  /********************************************************************************
255  * DACE various routines
256  *********************************************************************************/
257  static void memdump();
258 };
259 
260 /********************************************************************************
261 * DACE non-member functions
262 *********************************************************************************/
263 DACE_API int isnan(const DA &da);
264 DACE_API int isinf(const DA &da);
265 DACE_API double cons(const DA &da);
266 DACE_API AlgebraicVector<double> linear(const DA &da);
268 
269 DACE_API DA divide(const DA &da, const unsigned int var, const unsigned int p = 1);
270 DACE_API DA deriv(const DA &da, const unsigned int i);
271 DACE_API DA deriv(const DA &da, const std::vector<unsigned int> ind);
272 DACE_API DA integ(const DA &da, const unsigned int i);
273 DACE_API DA integ(const DA &da, const std::vector<unsigned int> ind);
274 DACE_API DA trim(const DA &da, const unsigned int min, const unsigned int max = DA::getMaxOrder());
275 DACE_API DA trunc(const DA &da);
276 DACE_API DA round(const DA &da);
277 DACE_API DA mod(const DA &da, const double p);
278 DACE_API DA pow(const DA &da, const int p);
279 DACE_API DA pow(const DA &da, const double p);
280 DACE_API DA root(const DA &da, const int p = 2);
281 DACE_API DA minv(const DA &da);
282 DACE_API DA sqr(const DA &da);
283 DACE_API DA sqrt(const DA &da);
284 DACE_API DA isrt(const DA &da);
285 DACE_API DA cbrt(const DA &da);
286 DACE_API DA icrt(const DA &da);
287 DACE_API DA hypot(const DA &da1, const DA &da2);
288 DACE_API DA exp(const DA &da);
289 DACE_API DA log(const DA &da);
290 DACE_API DA logb(const DA &da, const double b = 10.0);
291 DACE_API DA log10(const DA &da);
292 DACE_API DA log2(const DA &da);
293 DACE_API DA sin(const DA &da);
294 DACE_API DA cos(const DA &da);
295 DACE_API DA tan(const DA &da);
296 DACE_API DA asin(const DA &da);
297 DACE_API DA acos(const DA &da);
298 DACE_API DA atan(const DA &da);
299 DACE_API DA atan2(const DA &da1, const DA &da2);
300 DACE_API DA sinh(const DA &da);
301 DACE_API DA cosh(const DA &da);
302 DACE_API DA tanh(const DA &da);
303 DACE_API DA asinh(const DA &da);
304 DACE_API DA acosh(const DA &da);
305 DACE_API DA atanh(const DA &da);
306 DACE_API DA erf(const DA &da);
307 DACE_API DA erfc(const DA &da);
308 DACE_API DA jn(const int n, const DA &da);
309 DACE_API DA yn(const int n, const DA &da);
310 DACE_API DA BesselJFunction(const int n, const DA &da);
311 DACE_API DA BesselYFunction(const int n, const DA &da);
312 DACE_API DA BesselIFunction(const int n, const DA &da, const bool scaled = false);
313 DACE_API DA BesselKFunction(const int n, const DA &da, const bool scaled = false);
314 DACE_API DA tgamma(const DA &da);
315 DACE_API DA lgamma(const DA &da);
316 DACE_API DA GammaFunction(const DA &da);
317 DACE_API DA LogGammaFunction(const DA &da);
318 DACE_API DA PsiFunction(const unsigned int n, const DA &da);
319 
320 DACE_API unsigned int size(const DA &da);
321 DACE_API double abs(const DA &da);
322 DACE_API double norm(const DA &da, unsigned int type = 0);
323 DACE_API std::vector<double> orderNorm(const DA &da, unsigned int var = 0, unsigned int type = 0);
324 DACE_API std::vector<double> estimNorm(const DA &da, unsigned int var = 0, unsigned int type = 0, unsigned int nc = DA::getMaxOrder());
325 DACE_API std::vector<double> estimNorm(const DA &da, std::vector<double> &err, unsigned int var = 0, unsigned int type = 0, unsigned int nc = DA::getMaxOrder());
326 DACE_API Interval bound(const DA &da);
327 DACE_API double convRadius(const DA &da, const double eps, const unsigned int type = 1);
328 
329 template<class T> T eval(const DA &da, const std::vector<T> &args);
330 template<class T> T eval(const DA &da, const T args[], const unsigned int length);
331 template<class T> T evalScalar(const DA &da, const T &arg);
332 DACE_API compiledDA compile(const DA &da);
333 DACE_API DA plug(const DA &da, const unsigned int var, const double val = 0.0);
334 DACE_API DA replaceVariable(const DA &da, const unsigned int from = 0, const unsigned int to = 0, const double val = 1.0);
335 DACE_API DA scaleVariable(const DA &da, const unsigned int var = 0, const double val = 1.0);
336 DACE_API DA translateVariable(const DA &da, const unsigned int var = 0, const double a = 1.0, const double c = 0.0);
337 
338 DACE_API std::string toString(const DA &da);
339 DACE_API void write(const DA &da, std::ostream &os);
340 
341 
342 
344 class DACE_API storedDA : std::vector<char>
345 {
346 private:
347  static const unsigned int headerSize;
348 
349 public:
350  storedDA(const DA &da);
351  storedDA(const std::vector<char> &data);
352  storedDA(std::istream &is);
353 
354  bool isValid() const;
355 
356  operator DA() const;
357  operator std::string() const;
358 
359  friend DACE_API std::ostream& operator<<(std::ostream &out, const storedDA &sda);
360 };
361 
362 }
363 
364 #endif /* DINAMICA_DA_H_ */
DA log2(const DA &da)
Definition: DA.cpp:2255
int isnan(const DA &da)
Definition: DA.cpp:1954
DA replaceVariable(const DA &da, const unsigned int from, const unsigned int to, const double val)
Definition: DA.cpp:2670
AlgebraicVector< DA > plug(const AlgebraicVector< DA > &obj, const unsigned int var, const double val)
Definition: AlgebraicVector.cpp:383
DA icrt(const DA &da)
Definition: DA.cpp:2191
AlgebraicVector< DA > trim(const AlgebraicVector< DA > &obj, unsigned int min, unsigned int max)
Definition: AlgebraicVector.cpp:330
DA erf(const DA &da)
Definition: DA.cpp:2398
DA divide(const DA &da, const unsigned int var, const unsigned int p)
Definition: DA.cpp:1997
Definition: Interval.h:35
DA exp(const DA &da)
Definition: DA.cpp:2213
static unsigned int getMaxOrder()
Get the maximum order.
Definition: DA.cpp:111
DA trunc(const DA &da)
Definition: DA.cpp:2073
DA lgamma(const DA &da)
Definition: DA.cpp:2507
Interval bound(const DA &da)
Definition: DA.cpp:2636
DA cbrt(const DA &da)
Definition: DA.cpp:2181
DA cos(const DA &da)
Definition: DA.cpp:2276
double norm(const DA &da, unsigned int type)
Definition: DA.cpp:2567
DA log10(const DA &da)
Definition: DA.cpp:2245
DA tan(const DA &da)
Definition: DA.cpp:2286
std::vector< double > estimNorm(const DA &da, const unsigned int var, const unsigned int type, const unsigned int nc)
Definition: DA.cpp:2596
DA jn(const int n, const DA &da)
Definition: DA.cpp:2418
DA logb(const DA &da, const double b)
Definition: DA.cpp:2233
STL namespace.
AlgebraicVector< U > evalScalar(const AlgebraicVector< T > &obj, const U &arg)
DA BesselYFunction(const int n, const DA &da)
Definition: DA.cpp:2456
DA LogGammaFunction(const DA &da)
Definition: DA.cpp:2528
DA log(const DA &da)
Definition: DA.cpp:2223
DA pow(const DA &da, int p)
Definition: DA.cpp:2105
DA acos(const DA &da)
Definition: DA.cpp:2306
double abs(const DA &da)
Definition: DA.cpp:2558
DA atanh(const DA &da)
Definition: DA.cpp:2387
DA atan2(const DA &da1, const DA &da2)
Definition: DA.cpp:2326
DA translateVariable(const DA &da, const unsigned int var, const double a, const double c)
Definition: DA.cpp:2695
DA erfc(const DA &da)
Definition: DA.cpp:2408
Definition: Monomial.h:40
DA asinh(const DA &da)
Definition: DA.cpp:2367
DA isrt(const DA &da)
Definition: DA.cpp:2170
Definition: DA.h:57
DA BesselKFunction(const int n, const DA &da, const bool scaled)
Definition: DA.cpp:2482
DA acosh(const DA &da)
Definition: DA.cpp:2377
Definition: compiledDA.h:41
Definition: DA.h:344
void write(const DA &da, std::ostream &os)
Definition: DA.cpp:2726
Definition: AlgebraicMatrix.h:43
AlgebraicVector< DA > deriv(const AlgebraicVector< DA > &obj, const unsigned int p)
Definition: AlgebraicVector.cpp:344
DA PsiFunction(const unsigned int n, const DA &da)
Definition: DA.cpp:2538
DA sin(const DA &da)
Definition: DA.cpp:2266
std::ostream & operator<<(std::ostream &out, const AlgebraicMatrix< DA > &obj)
DA specialization of output stream operator.
Definition: AlgebraicMatrix.cpp:44
compiledDA compile(const AlgebraicVector< DA > &obj)
Definition: AlgebraicVector.cpp:372
std::vector< double > orderNorm(const DA &da, const unsigned int var, const unsigned int type)
Definition: DA.cpp:2580
DA asin(const DA &da)
Definition: DA.cpp:2296
DA tanh(const DA &da)
Definition: DA.cpp:2357
DA BesselIFunction(const int n, const DA &da, const bool scaled)
Definition: DA.cpp:2468
double convRadius(const DA &da, const double eps, const unsigned int type)
Definition: DA.cpp:2646
int isinf(const DA &da)
Definition: DA.cpp:1962
V eval(const AlgebraicVector< T > &obj, const V &args)
AlgebraicVector< DA > gradient(const DA &da)
Definition: DA.cpp:1987
DA hypot(const DA &da1, const DA &da2)
Definition: DA.cpp:2201
DA BesselJFunction(const int n, const DA &da)
Definition: DA.cpp:2444
DA atan(const DA &da)
Definition: DA.cpp:2316
#define DACE_API
Definition: dace_s.h:33
DA sqr(const DA &da)
Definition: DA.cpp:2150
Definition: AlgebraicMatrix.cpp:39
std::string toString(const DA &da)
Definition: DA.cpp:2716
double cons(const DA &da)
Definition: DA.cpp:1970
DA scaleVariable(const DA &da, const unsigned int var, const double val)
Definition: DA.cpp:2683
std::vector< std::vector< double > > linear(const AlgebraicVector< DA > &obj)
Definition: AlgebraicVector.cpp:316
DA mod(const DA &da, double p)
Definition: DA.cpp:2093
DA round(const DA &da)
Definition: DA.cpp:2083
unsigned int size(const DA &da)
Definition: DA.cpp:2549
DA GammaFunction(const DA &da)
Definition: DA.cpp:2518
DA minv(const DA &da)
Definition: DA.cpp:2140
DA tgamma(const DA &da)
Definition: DA.cpp:2496
DA sqrt(const DA &da)
Definition: DA.cpp:2160
#define min(a, b)
Definition: f2c.h:159
DA root(const DA &da, int p)
Definition: DA.cpp:2129
DA yn(const int n, const DA &da)
Definition: DA.cpp:2431
DA sinh(const DA &da)
Definition: DA.cpp:2337
int DACEDA
Definition: dacebase.h:70
DA cosh(const DA &da)
Definition: DA.cpp:2347
AlgebraicVector< DA > integ(const AlgebraicVector< DA > &obj, const unsigned int p)
Definition: AlgebraicVector.cpp:358
#define max(a, b)
Definition: f2c.h:160