casacore
Loading...
Searching...
No Matches
SparseDiffX.h
Go to the documentation of this file.
1// # SparseDiff!A.h: An automatic differentiating class for functions
2// # Copyright (C) 2001,2002
3// # Associated Universities, Inc. Washington DC, USA.
4// #
5// # This library is free software; you can redistribute it and/or modify it
6// # under the terms of the GNU Library General Public License as published by
7// # the Free Software Foundation; either version 2 of the License, or (at your
8// # option) any later version.
9// #
10// # This library is distributed in the hope that it will be useful, but WITHOUT
11// # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12// # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13// # License for more details.
14// #
15// # You should have received a copy of the GNU Library General Public License
16// # along with this library; if not, write to the Free Software Foundation,
17// # Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18// #
19// # Correspondence concerning AIPS++ should be addressed as follows:
20// # Internet email: casa-feedback@nrao.edu.
21// # Postal address: AIPS++ Project Office
22// # National Radio Astronomy Observatory
23// # 520 Edgemont Road
24// # Charlottesville, VA 22903-2475 USA
25
26#ifndef SCIMATH_SPARSEDIFFX_H
27#define SCIMATH_SPARSEDIFFX_H
28
29// # Includes
30#include <casacore/casa/aips.h>
31#include <casacore/scimath/Mathematics/SparseDiff.h>
32
33namespace casacore { // # NAMESPACE CASACORE - BEGIN
34
35// # Forward declarations
36template <class T>
37class Vector;
38
39// <summary>
40// Class that computes partial derivatives by automatic differentiation.
41// </summary>
42//
43// <use visibility=export>
44//
45// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="tSparseDiff.cc"
46// demos="dSparseDiff.cc">
47// </reviewed>
48//
49// <prerequisite>
50// <li> <linkto class=SparseDiff>SparseDiff</linkto>
51// </prerequisite>
52//
53// <etymology>
54// Class that computes partial derivatives by automatic differentiation, thus
55// SparseDiff.
56// </etymology>
57//
58// <synopsis>
59// SparseDiffX is an <linkto class=SparseDiff>SparseDiff</linkto>. It is used
60// to be able to distinguish between two template incarnations; e.g. to
61// have one or more specializations, in addition to the general template
62// version.
63// </synopsis>
64//
65// <example>
66// See for an extensive example the demo program dSparseDiff. It is
67// based on the example given in the <linkto class=SparseDiff>SparseDiff</linkto>
68// class, and shows how to have both an automatic and a specific version
69// of a function object.
70// <srcblock>
71// // The function, with fixed parameters a,b:
72// template <class T> class f {
73// public:
74// T operator()(const T& x) { return a_p*a_p*a_p*b_p*b_p*x; }
75// void set(const T& a, const T& b) { a_p = a; b_p = b; }
76// private:
77// T a_p;
78// T b_p;
79// };
80// // The specialized function
81// template <> class f<SparseDiffX<Double> > {
82// public:
83// T operator()(const T& x) { return a_p*a_p*a_p*b_p*b_p*x; }
84// void set(const T& a, const T& b) { a_p = a; b_p = b; }
85// private:
86// T a_p;
87// T b_p;
88// };
89// // Call it with different template arguments:
90// SparseDiff<Double> a1(2,0), b1(3,1), x1(7);
91// f<SparseDiff<Double> > f1; f1.set(a1, b1);
92// cout << "Diff a,b: " << f1(x1) << endl;
93//
94// f<SparseDiffX<Double> > f12; f12.set(a1, b1);
95// cout << "Same....: " << f12(x1) << endl;
96//
97// // Result will be:
98// // Diff a,b: (504, [756, 336])
99// // Same....: (504, [756, 336])
100//
101// // It needed the template instantiations definitions:
102// template class f<SparseDiff<Double> >;
103// </srcblock>
104// </example>
105//
106// <motivation>
107// The class was created to enable separate calculations of the same
108// function.
109// </motivation>
110//
111// <templating arg=T>
112// <li> any class that has the standard mathematical and comparisons
113// defined
114// </templating>
115//
116// <todo asof="2001/06/07">
117// <li> Nothing I know
118// </todo>
119
120template <class T>
121class SparseDiffX : public SparseDiff<T> {
122 public:
123 // # Constructors
124 // Construct a constant with a value of zero. Zero derivatives.
126
127 // Construct a constant with a value of v. Zero derivatives.
128 SparseDiffX(const T &v) : SparseDiff<T>(v) {}
129
130 // A function f(x0,x1,...,xn,...) with a value of v.
131 // The nth derivative is one, and all others are zero.
132 SparseDiffX(const T &v, const uInt n) : SparseDiff<T>(v, n) {}
133
134 // A function f(x0,x1,...,xn,...) with a value of v. The
135 // nth derivative is der, and all other derivatives are zero.
136 SparseDiffX(const T &v, const uInt n, const T &der) : SparseDiff<T>(v, n, der) {}
137
138 // Construct one from another
139 SparseDiffX(const SparseDiff<T> &other) : SparseDiff<T>(other) {}
140
142
143 // Assignment operator. Assign a constant to variable. All derivatives
144 // are zero.
147 return *this;
148 }
149
150 // Assignment operator. Add a gradient to variable.
151 SparseDiffX<T> &operator=(const pair<uInt, T> &der) {
153 return *this;
154 }
155
156 // Assignment operator. Assign gradients to variable.
157 SparseDiffX<T> &operator=(const vector<pair<uInt, T>> &der) {
159 return *this;
160 }
161
162 // Assign one to another (deep copy).
165 return *this;
166 }
167
168 private:
169 // # Data
170};
171
172} // namespace casacore
173
174#endif
SparseDiffX(const T &v)
Construct a constant with a value of v.
SparseDiffX(const T &v, const uInt n)
A function f(x0,x1,...,xn,...) with a value of v.
SparseDiffX(const SparseDiff< T > &other)
Construct one from another.
SparseDiffX(const T &v, const uInt n, const T &der)
A function f(x0,x1,...,xn,...) with a value of v.
SparseDiffX()
Construct a constant with a value of zero.
SparseDiffX< T > & operator=(const SparseDiff< T > &other)
Assign one to another (deep copy).
SparseDiffX< T > & operator=(const T &v)
Assignment operator.
SparseDiffX< T > & operator=(const pair< uInt, T > &der)
Assignment operator.
SparseDiffX< T > & operator=(const vector< pair< uInt, T > > &der)
Assignment operator.
SparseDiff()
Construct a constant with a value of zero.
SparseDiff< T > & operator=(const T &v)
Assignment operator.
For temporary backward namespace compatibility, use casa as alias for casacore.
Definition mainpage.dox:28
unsigned int uInt
Definition aipstype.h:49