Английская Википедия:Adept (C++ library)
Шаблон:Infobox software Adept is a combined automatic differentiation and array software library for the C++ programming language. The automatic differentiation capability facilitates the development of applications involving mathematical optimization. Adept is notable for having applied the template metaprogramming technique of expression templates to speed-up the differentiation of mathematical statements.[1][2] Along with the efficient way that it stores the differential information, this makes it significantly faster than most other C++ tools that provide similar functionality (e.g. ADOL-C, CppAD and FADBAD),[1][3][4][5][6] although comparable performance has been reported for Stan and in some cases Sacado.[3] Differentiation may be in forward mode, reverse mode (for use with a Quasi-Newton minimization scheme), or the full Jacobian matrix may be computed (for use with the Levenberg-Marquardt or Gauss-Newton minimization schemes).
Applications of Adept have included financial modeling,[6][7] computational fluid dynamics,[8] physical chemistry,[9] parameter estimation[10] and meteorology.[11] Adept is free software distributed under the Apache License.
Example
Adept implements automatic differentiation using an operator overloading approach, in which scalars to be differentiated are written as adouble
, indicating an "active" version of the normal double
, and vectors to be differentiated are written as aVector
. The following simple example uses these types to differentiate a 3-norm calculation on a small vector:
#include <iostream>
#include <adept_arrays.h>
int main(int argc, const char** argv) {
using namespace adept;
Stack stack; // Object to store differential statements
aVector x(3); // Independent variables: active vector with 3 elements
x << 1.0, 2.0, 3.0; // Fill vector x
stack.new_recording(); // Clear any existing differential statements
adouble J = cbrt(sum(abs(x * x * x))); // Compute dependent variable: 3-norm in this case
J.set_gradient(1.0); // Seed the dependent variable
stack.reverse(); // Reverse-mode differentiation
std::cout << "dJ/dx = "
<< x.get_gradient() << "\n"; // Print the vector of partial derivatives dJ/dx
return 0;
}
When compiled and executed, this program reports the derivative as:
dJ/dx = {0.0917202, 0.366881, 0.825482}
See also
References
External links
- Английская Википедия
- Articles with example C++ code
- C++ numerical libraries
- Free computer libraries
- Free mathematics software
- Free science software
- Free software programmed in C++
- Software using the Apache license
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Английской Википедии