CoDiPack  3.0.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
customAdjointVectorHelper.hpp
1/*
2 * CoDiPack, a Code Differentiation Package
3 *
4 * Copyright (C) 2015-2025 Chair for Scientific Computing (SciComp), University of Kaiserslautern-Landau
5 * Homepage: http://scicomp.rptu.de
6 * Contact: Prof. Nicolas R. Gauger (codi@scicomp.uni-kl.de)
7 *
8 * Lead developers: Max Sagebaum, Johannes Blühdorn (SciComp, University of Kaiserslautern-Landau)
9 *
10 * This file is part of CoDiPack (http://scicomp.rptu.de/software/codi).
11 *
12 * CoDiPack is free software: you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, either version 3 of the
15 * License, or (at your option) any later version.
16 *
17 * CoDiPack is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty
19 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * See the GNU General Public License for more details.
22 * You should have received a copy of the GNU
23 * General Public License along with CoDiPack.
24 * If not, see <http://www.gnu.org/licenses/>.
25 *
26 * For other licensing options please contact us.
27 *
28 * Authors:
29 * - SciComp, University of Kaiserslautern-Landau:
30 * - Max Sagebaum
31 * - Johannes Blühdorn
32 * - Former members:
33 * - Tim Albring
34 */
35#pragma once
36
37#include "../../config.h"
38#include "../../expressions/lhsExpressionInterface.hpp"
39#include "../../misc/macros.hpp"
40#include "../../tapes/interfaces/fullTapeInterface.hpp"
41#include "../../tapes/misc/adjointVectorAccess.hpp"
42#include "../../tapes/misc/vectorAccessInterface.hpp"
43#include "../../traits/tapeTraits.hpp"
44
46namespace codi {
47
60 template<typename T_Type>
62 public:
63
65 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
66
67 using Real = typename Type::Real;
68 using Identifier = typename Type::Identifier;
69
71 using Tape = typename Type::Tape;
72 using Position = typename Tape::Position;
73
74 private:
75
76 Tape* tape;
77
78 public:
79
82
85
86 /*******************************************************************************/
89
91 virtual void clearAdjoints() = 0;
92
94 virtual void deleteAdjointVector() = 0;
95
97 virtual void evaluate(Position const& start, Position const& end) = 0;
98
99 // clang-format off
101 // clang-format on
102 virtual void evaluateForward(Position const& start, Position const& end) = 0;
103
106
108 /*******************************************************************************/
111
113 void evaluate() {
114 evaluate(tape->getPosition(), tape->getZeroPosition());
115 }
116
119 evaluate(tape->getPosition(), tape->getZeroPosition());
120 }
121
123 void setTape(Tape& tape) {
124 this->tape = &tape;
125 }
126
129 return *this->tape;
130 }
131
133 };
134
156 template<typename T_Type, typename T_Gradient>
158 public:
159
161 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
162 using Gradient = CODI_DD(T_Gradient, double);
163
165
166 using Real = typename Type::Real;
167 using Identifier = typename Type::Identifier;
168
170 using Tape = CODI_DD(typename Type::Tape, CODI_DEFAULT_TAPE);
171 using Position = typename Tape::Position;
172
173 protected:
174 std::vector<Gradient> adjointVector;
175
178
181
182 public:
183
187
190 if (nullptr != adjointInterface) {
191 delete adjointInterface;
192 }
193 }
194
195 /*******************************************************************************/
198
201 for (size_t i = 0; i < adjointVector.size(); i += 1) {
202 adjointVector[i] = Gradient();
203 }
204 }
205
208 adjointVector.resize(0);
209 adjointVector.shrink_to_fit();
210 }
211
213 void evaluate(Position const& start, Position const& end) {
214 checkAdjointVectorSize();
215
216 Base::getTape().evaluate(start, end, adjointVector.data());
217 }
218 using Base::evaluate;
219
221 void evaluateForward(Position const& start, Position const& end) {
222 checkAdjointVectorSize();
223
224 Base::getTape().evaluateForward(start, end, adjointVector.data());
225 }
227
230 if (nullptr != adjointInterface) {
231 delete adjointInterface;
232 }
233
234 checkAdjointVectorSize();
236 return adjointInterface;
237 }
238
240 /*******************************************************************************/
243
245 Gradient const& getGradient(Identifier const& identifier) const {
246 return gradient(identifier);
247 }
248
251 return adjointVector[identifier];
252 }
253
255 Gradient const& gradientUnchecked(Identifier const& identifier) const {
256 return adjointVector[identifier];
257 }
258
260 Gradient& gradient(Identifier const& identifier) {
261 checkAdjointVectorSize();
262
263 if (0 != identifier && identifier < (Identifier)adjointVector.size()) {
264 return adjointVector[identifier];
265 } else {
267 return zeroValue;
268 }
269 }
270
272 Gradient const& gradient(Identifier const& identifier) const {
273 if (0 != identifier && identifier < (Identifier)adjointVector.size()) {
274 return adjointVector[identifier];
275 } else {
276 return constZeroValue;
277 }
278 }
279
281 void setGradient(Identifier& identifier, Gradient const& gradientValue) {
282 gradient(identifier) = gradientValue;
283 }
284
286
287 private:
288
289 void checkAdjointVectorSize() {
290 if (adjointVector.size() <= Base::getTape().getParameter(TapeParameters::LargestIdentifier)) {
292 }
293 }
294 };
295}
#define CODI_DD(Type, Default)
Abbreviation for CODI_DECLARE_DEFAULT.
Definition macros.hpp:96
CoDiPack - Code Differentiation Package.
Definition codi.hpp:94
@ LargestIdentifier
[A: R] Largest identifier distributed by the index manger.
Definition tapeParameters.hpp:60
Implementation of VectorAccessInterface for adjoint vectors.
Definition adjointVectorAccess.hpp:61
void clearAdjoints()
Set all adjoints to zero.
Definition customAdjointVectorHelper.hpp:200
Gradient const & gradient(Identifier const &identifier) const
Get a constant reference to the gradient. Checked access.
Definition customAdjointVectorHelper.hpp:272
Gradient & gradientUnchecked(Identifier const &identifier)
Get a reference to the gradient. Unchecked access.
Definition customAdjointVectorHelper.hpp:250
VectorAccessInterface< Real, Identifier > * getVectorInterface()
Get a new general interface to the adjoint vector.
Definition customAdjointVectorHelper.hpp:229
CustomAdjointVectorInterface< Type > Base
Abbreviation for the base class.
Definition customAdjointVectorHelper.hpp:164
Gradient & gradient(Identifier const &identifier)
Get a reference to the gradient. Checked access.
Definition customAdjointVectorHelper.hpp:260
~CustomAdjointVectorHelper()
Destructor.
Definition customAdjointVectorHelper.hpp:189
typename Tape::Position Position
See PositionalEvaluationTapeInterface.
Definition customAdjointVectorHelper.hpp:171
T_Type Type
< See CustomAdjointVectorHelper.
Definition customAdjointVectorHelper.hpp:161
Gradient const & gradientUnchecked(Identifier const &identifier) const
Get a constant reference to the gradient. Unchecked access.
Definition customAdjointVectorHelper.hpp:255
void evaluateForward(Position const &start, Position const &end)
Perform a forward evaluation of a part of the tape. It has to hold start <= end.
Definition customAdjointVectorHelper.hpp:221
Gradient const & getGradient(Identifier const &identifier) const
Get a constant reference to the gradient.
Definition customAdjointVectorHelper.hpp:245
typename Type::Real Real
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:166
T_Gradient Gradient
See CustomAdjointVectorHelper.
Definition customAdjointVectorHelper.hpp:162
AdjointVectorAccess< Real, Identifier, Gradient * > * adjointInterface
Last created adjoint interface.
Definition customAdjointVectorHelper.hpp:180
void deleteAdjointVector()
Delete the adjoint vector.
Definition customAdjointVectorHelper.hpp:207
Gradient zeroValue
Temporary zero value.
Definition customAdjointVectorHelper.hpp:176
std::vector< Gradient > adjointVector
Custom adjoint vector.
Definition customAdjointVectorHelper.hpp:174
typename Type::Tape Tape
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:170
Gradient const constZeroValue
Temporary constant zero value.
Definition customAdjointVectorHelper.hpp:177
CustomAdjointVectorHelper()
Constructor.
Definition customAdjointVectorHelper.hpp:185
typename Type::Identifier Identifier
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:167
void setGradient(Identifier &identifier, Gradient const &gradientValue)
Set the gradient. Checked access.
Definition customAdjointVectorHelper.hpp:281
void evaluate(Position const &start, Position const &end)
Perform a full reverse evaluation of the tape.
Definition customAdjointVectorHelper.hpp:213
void evaluateForward()
Perform a forward evaluation of a part of the tape. It has to hold start <= end.
Definition customAdjointVectorHelper.hpp:118
CustomAdjointVectorInterface()
Constructor.
Definition customAdjointVectorHelper.hpp:81
void evaluate()
Perform a full reverse evaluation of the tape.
Definition customAdjointVectorHelper.hpp:113
typename Type::Identifier Identifier
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:68
virtual VectorAccessInterface< Real, Identifier > * getVectorInterface()=0
Get a new general interface to the adjoint vector.
T_Type Type
See CustomAdjointVectorInterface.
Definition customAdjointVectorHelper.hpp:65
typename Tape::Position Position
See PositionalEvaluationTapeInterface.
Definition customAdjointVectorHelper.hpp:72
void setTape(Tape &tape)
Set the tape for the evaluations.
Definition customAdjointVectorHelper.hpp:123
virtual ~CustomAdjointVectorInterface()
Destructor.
Definition customAdjointVectorHelper.hpp:84
virtual void deleteAdjointVector()=0
Delete the adjoint vector.
virtual void clearAdjoints()=0
Set all adjoints to zero.
typename Type::Real Real
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:67
virtual void evaluateForward(Position const &start, Position const &end)=0
Perform a forward evaluation of a part of the tape. It has to hold start <= end.
virtual void evaluate(Position const &start, Position const &end)=0
Perform a reverse evaluation for a part of the tape. It hast to hold start >= end.
Tape & getTape()
Definition customAdjointVectorHelper.hpp:128
typename Type::Tape Tape
See LhsExpressionInterface.
Definition customAdjointVectorHelper.hpp:71
Unified access to the adjoint vector and primal vector in a tape evaluation.
Definition vectorAccessInterface.hpp:94