CoDiPack  3.1.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
jacobianLinearTape.hpp
1/*
2 * CoDiPack, a Code Differentiation Package
3 *
4 * Copyright (C) 2015-2026 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 <algorithm>
38#include <type_traits>
39
40#include "../config.h"
41#include "../expressions/lhsExpressionInterface.hpp"
42#include "../expressions/logic/compileTimeTraversalLogic.hpp"
43#include "../expressions/logic/traversalLogic.hpp"
44#include "../misc/macros.hpp"
45#include "../traits/adjointVectorTraits.hpp"
46#include "../traits/expressionTraits.hpp"
47#include "data/chunk.hpp"
48#include "indices/linearIndexManager.hpp"
49#include "interfaces/reverseTapeInterface.hpp"
50#include "jacobianBaseTape.hpp"
51
53namespace codi {
54
62 template<typename T_TapeTypes>
63 struct JacobianLinearTape : public JacobianBaseTape<T_TapeTypes, JacobianLinearTape<T_TapeTypes>> {
64 public:
65
66 using TapeTypes = CODI_DD(T_TapeTypes,
69
71 friend Base;
72
73 using Real = typename TapeTypes::Real;
74 using Gradient = typename TapeTypes::Gradient;
75 using IndexManager = typename TapeTypes::IndexManager;
76 using Identifier = typename TapeTypes::Identifier;
77 using ActiveTypeTapeData = typename TapeTypes::ActiveTypeTapeData;
78 using Position = typename Base::Position;
79
80 CODI_STATIC_ASSERT(IndexManager::IsLinear, "This class requires an index manager with a linear scheme.");
81
84
86
88 void clearAdjoints(Position const& start, Position const& end,
90 if (AdjointsManagement::Automatic == adjointsManagement) {
91 this->adjoints.beginUse();
92 }
93
94 using IndexPosition = CODI_DD(typename IndexManager::Position, int);
95 IndexPosition startIndex = this->llfByteData.template extractPosition<IndexPosition>(start);
96 IndexPosition endIndex = this->llfByteData.template extractPosition<IndexPosition>(end);
97
98 startIndex = std::min(startIndex, (IndexPosition)this->adjoints.size() - 1);
99 endIndex = std::min(endIndex, (IndexPosition)this->adjoints.size() - 1);
100
101 for (IndexPosition curPos = endIndex + 1; curPos <= startIndex; curPos += 1) {
102 this->adjoints[curPos] = Gradient();
103 }
104
105 if (AdjointsManagement::Automatic == adjointsManagement) {
106 this->adjoints.endUse();
107 }
108 }
109
111 template<typename AdjointVector>
112 void clearCustomAdjoints(Position const& start, Position const& end, AdjointVector&& data) {
113 using IndexPosition = CODI_DD(typename IndexManager::Position, int);
114 IndexPosition startIndex = this->llfByteData.template extractPosition<IndexPosition>(start);
115 IndexPosition endIndex = this->llfByteData.template extractPosition<IndexPosition>(end);
116
117 for (IndexPosition curPos = endIndex + 1; curPos <= startIndex; curPos += 1) {
119 }
120 }
121
122 protected:
123
126 CODI_INLINE void pushStmtData(Identifier const& index, Config::ArgumentSize const& numberOfArguments) {
127 CODI_UNUSED(index);
128
129 this->statementData.pushData(numberOfArguments);
130 }
131
133 template<typename AdjointVector>
135 /* data from call */
136 JacobianLinearTape& tape, AdjointVector&& adjointVector,
137 /* data from low level function byte data vector */
138 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
139 /* data from low level function info data vector */
140 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
141 Config::LowLevelFunctionDataSize* const dataSizePtr,
142 /* data from jacobian vector */
143 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
144 Identifier const* const rhsIdentifiers,
145 /* data from statement vector */
146 size_t& curStmtPos, size_t const& endStmtPos, Config::ArgumentSize const* const numberOfJacobians,
147 /* data from index handler */
148 size_t const& startAdjointPos, size_t const& endAdjointPos) {
149 CODI_UNUSED(endJacobianPos, endStmtPos, endLLFByteDataPos, endLLFInfoDataPos);
150
152
153 typename Base::template VectorAccess<AdjointVector> vectorAccess(adjointVector);
154
155 size_t curAdjointPos = startAdjointPos;
156
157 while (curAdjointPos < endAdjointPos) CODI_Likely {
158 curAdjointPos += 1;
159
160 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
161
164 tape, true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
165 } else if (Config::StatementInputTag == argsSize) CODI_Unlikely {
166 // Do nothing.
167 } else CODI_Likely {
168 Adjoint lhsAdjoint = Adjoint();
169 Base::incrementTangents(adjointVector, lhsAdjoint, argsSize, curJacobianPos, rhsJacobians, rhsIdentifiers);
170 adjointVector[curAdjointPos] = lhsAdjoint;
171
173 tape, curAdjointPos, GradientTraits::dim<Adjoint>(), GradientTraits::toArray(lhsAdjoint).data());
174 }
175
176 curStmtPos += 1;
177 }
178 }
179
181 template<typename AdjointVector>
183 /* data from call */
184 JacobianLinearTape& tape, AdjointVector&& adjointVector,
185 /* data from low level function byte data vector */
186 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
187 /* data from low level function info data vector */
188 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
189 Config::LowLevelFunctionDataSize* const dataSizePtr,
190 /* data from jacobianData */
191 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
192 Identifier const* const rhsIdentifiers,
193 /* data from statementData */
194 size_t& curStmtPos, size_t const& endStmtPos, Config::ArgumentSize const* const numberOfJacobians,
195 /* data from index handler */
196 size_t const& startAdjointPos, size_t const& endAdjointPos) {
197 CODI_UNUSED(endJacobianPos, endStmtPos, endLLFByteDataPos, endLLFInfoDataPos);
198
200
201 typename Base::template VectorAccess<AdjointVector> vectorAccess(adjointVector);
202
203 size_t curAdjointPos = startAdjointPos;
204
205 while (curAdjointPos > endAdjointPos) CODI_Likely {
206 curStmtPos -= 1;
207 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
208
211 tape, false, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
212 } else if (Config::StatementInputTag == argsSize) CODI_Unlikely {
213 // Do nothing.
214 } else CODI_Likely {
215 // No input value, perform regular statement evaluation.
216
217 Adjoint const lhsAdjoint = adjointVector[curAdjointPos]; // We do not use the zero index, decrement of
218 // curAdjointPos at the end of the loop.
219
221 tape, (Identifier)curAdjointPos, GradientTraits::dim<Adjoint>(),
222 GradientTraits::toArray(lhsAdjoint).data());
223
225 adjointVector[curAdjointPos] = Adjoint();
226 }
227
228 Base::incrementAdjoints(adjointVector, lhsAdjoint, argsSize, curJacobianPos, rhsJacobians, rhsIdentifiers);
229 }
230
231 curAdjointPos -= 1;
232 }
233 }
234
236 template<typename TapeTypes>
238 /* file interface pointer*/
240 /* data from low level function byte data vector */
241 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
242 /* data from low level function info data vector */
243 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
244 Config::LowLevelFunctionDataSize* const dataSizePtr,
245 /* data from jacobianData */
246 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
247 Identifier const* const rhsIdentifiers,
248 /* data from statementData */
249 size_t& curStmtPos, size_t const& endStmtPos, Config::ArgumentSize const* const numberOfJacobians,
250 /* data from index handler */
251 size_t const& startAdjointPos, size_t const& endAdjointPos) {
252 CODI_UNUSED(endLLFByteDataPos, endLLFInfoDataPos, endJacobianPos, endStmtPos);
253
254 ByteDataView dataView = {};
256
257 Identifier curLhsIdentifier;
258 Config::ArgumentSize argsSize;
259 size_t curAdjointPos = startAdjointPos;
260 while (curAdjointPos < endAdjointPos) CODI_Likely {
261 curAdjointPos += 1;
262 curLhsIdentifier = curAdjointPos;
263 argsSize = numberOfJacobians[curStmtPos];
265 Base::prepareLowLevelFunction(true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr,
266 dataView, func);
267 writer->writeLowLevelFunction(func, dataView);
268 } else if (Config::StatementInputTag == argsSize) CODI_Unlikely {
269 writer->writeStatement(curLhsIdentifier, curJacobianPos, rhsJacobians, rhsIdentifiers, argsSize);
270 } else CODI_Likely {
271 writer->writeStatement(curLhsIdentifier, curJacobianPos, rhsJacobians, rhsIdentifiers, argsSize);
272 curJacobianPos += argsSize;
273 }
274 curStmtPos += 1;
275 }
276 }
277
278 public:
279 /*******************************************************************************/
282
285 template<typename Callbacks>
286 CODI_INLINE void iterateForward(Callbacks&& callbacks, Position start, Position end) {
287 auto evalFunc =
288 [&callbacks](
289 /* data from call */
290 JacobianLinearTape& tape,
291 /* data from low level function byte data vector */
292 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
293 /* data from low level function info data vector */
294 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos,
295 Config::LowLevelFunctionToken* const tokenPtr, Config::LowLevelFunctionDataSize* const dataSizePtr,
296 /* data from jacobian vector */
297 size_t& curJacobianPos, size_t const& endJacobianPos, Real* const rhsJacobians,
298 Identifier* const rhsIdentifiers,
299 /* data from statement vector */
300 size_t& curStmtPos, size_t const& endStmtPos, Config::ArgumentSize const* const numberOfJacobians,
301 /* data from index handler */
302 size_t const& startAdjointPos, size_t const& endAdjointPos) CODI_LAMBDA_INLINE {
303 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos, endStmtPos);
304
305 ByteDataView dataView = {};
307
308 size_t curAdjointPos = startAdjointPos;
309 while (curAdjointPos < endAdjointPos) CODI_Likely {
310 curAdjointPos += 1;
311
312 Config::ArgumentSize argsSize = numberOfJacobians[curStmtPos];
313
315 Base::prepareLowLevelFunction(true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr,
316 dataSizePtr, dataView, func);
317 callbacks.handleLowLevelFunction(*func, dataView);
318 } else CODI_Likely {
320 argsSize = 0;
321 }
322
323 Identifier lhsIdentifier = curAdjointPos;
324 callbacks.handleStatement(lhsIdentifier, argsSize, &rhsJacobians[curJacobianPos],
325 &rhsIdentifiers[curJacobianPos]);
326
327 codiAssert(lhsIdentifier ==
328 (Identifier)curAdjointPos); // Lhs identifiers can not be edited in a linear tape.
329
330 curJacobianPos += argsSize;
331 }
332
333 curStmtPos += 1;
334 }
335 };
336
337 Base::llfByteData.evaluateForward(start, end, evalFunc, *this);
338 }
339
342 template<typename Callbacks>
343 CODI_INLINE void iterateReverse(Callbacks&& callbacks, Position start, Position end) {
344 auto evalFunc =
345 [&callbacks](
346 /* data from call */
347 JacobianLinearTape& tape,
348 /* data from low level function byte data vector */
349 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
350 /* data from low level function info data vector */
351 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos,
352 Config::LowLevelFunctionToken* const tokenPtr, Config::LowLevelFunctionDataSize* const dataSizePtr,
353 /* data from jacobian vector */
354 size_t& curJacobianPos, size_t const& endJacobianPos, Real* const rhsJacobians,
355 Identifier* const rhsIdentifiers,
356 /* data from statement vector */
357 size_t& curStmtPos, size_t const& endStmtPos, Config::ArgumentSize const* const numberOfJacobians,
358 /* data from index handler */
359 size_t const& startAdjointPos, size_t const& endAdjointPos) CODI_LAMBDA_INLINE {
360 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos, endStmtPos);
361
362 ByteDataView dataView = {};
364
365 size_t curAdjointPos = startAdjointPos;
366 while (curAdjointPos > endAdjointPos) CODI_Likely {
367 curStmtPos -= 1;
368
369 Config::ArgumentSize argsSize = numberOfJacobians[curStmtPos];
370
372 Base::prepareLowLevelFunction(false, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr,
373 dataSizePtr, dataView, func);
374 callbacks.handleLowLevelFunction(*func, dataView);
375 } else CODI_Likely {
377 argsSize = 0;
378 }
379
380 curJacobianPos -= argsSize;
381
382 Identifier lhsIdentifier = curAdjointPos;
383 callbacks.handleStatement(lhsIdentifier, argsSize, &rhsJacobians[curJacobianPos],
384 &rhsIdentifiers[curJacobianPos]);
385
386 codiAssert(lhsIdentifier ==
387 (Identifier)curAdjointPos); // Lhs identifiers can not be edited in a linear tape.
388 }
389
390 curAdjointPos -= 1;
391 }
392 };
393
394 Base::llfByteData.evaluateForward(start, end, evalFunc, *this);
395 }
396
398 };
399}
#define CODI_Unlikely
Declare unlikely evaluation of an execution path.
Definition config.h:408
#define CODI_LAMBDA_INLINE
See codi::Config::ForcedInlines.
Definition config.h:473
#define CODI_INLINE
See codi::Config::ForcedInlines.
Definition config.h:469
#define CODI_Likely
Declare likely evaluation of an execution path.
Definition config.h:406
#define codiAssert(x)
See codi::Config::EnableAssert.
Definition config.h:441
#define CODI_DD(Type, Default)
Abbreviation for CODI_DECLARE_DEFAULT.
Definition macros.hpp:97
#define CODI_STATIC_ASSERT(cond, message)
Static assert definition for CoDiPack. Not evaluated in IDE mode.
Definition macros.hpp:130
#define CODI_T(...)
Abbreviation for CODI_TEMPLATE.
Definition macros.hpp:117
typename GradientImplementation< AdjointVector >::Gradient Gradient
Deduce the entry type from an adjoint vector type, usually identical to the gradient type of a tape.
Definition adjointVectorTraits.hpp:92
uint16_t LowLevelFunctionDataSize
Size store type for a low level function.
Definition config.h:98
uint16_t LowLevelFunctionToken
Token type for low level functions in the tapes.
Definition config.h:108
size_t constexpr StatementLowLevelFunctionTag
Statement tag for low level functions.
Definition config.h:126
bool constexpr ReversalZeroesAdjoints
With a linear index management, control if adjoints are set to zero during reversal.
Definition config.h:298
uint8_t ArgumentSize
Type for the number of arguments in statements.
Definition config.h:117
size_t constexpr StatementInputTag
Tag for statements that are inputs. Used in linear index management context.
Definition config.h:123
inlinestd::array< AtomicTraits::RemoveAtomic< typename TraitsImplementation< Gradient >::Real >, TraitsImplementation< Gradient >::dim > toArray(Gradient const &gradient)
Converts the (possibly multi-component) gradient to an array of Reals.
Definition gradientTraits.hpp:116
inlinesize_t constexpr dim()
Number of dimensions this gradient value has.
Definition gradientTraits.hpp:96
CoDiPack - Code Differentiation Package.
Definition codi.hpp:97
inlinevoid CODI_UNUSED(Args const &...)
Disable unused warnings for an arbitrary number of arguments.
Definition macros.hpp:55
AdjointsManagement
Policies for management of the tape's interal adjoints.
Definition tapeParameters.hpp:100
@ Automatic
Manage internal adjoints automatically, including locking, bounds checking, and resizing.
Definition tapeParameters.hpp:102
ChunkedData< Chunk, NestedData > DefaultChunkedData
ChunkData DataInterface used in all regular tapes.
Definition chunkedData.hpp:520
Definition byteDataView.hpp:51
void iterateForward(Callbacks &&callbacks)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition commonTapeImplementation.hpp:371
inlinestatic void callLowLevelFunction(Impl &impl, bool forward, size_t &curLLFByteDataPos, char *dataPtr, size_t &curLLFTInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, Args &&... args)
Definition commonTapeImplementation.hpp:569
LowLevelFunctionByteData llfByteData
Definition commonTapeImplementation.hpp:158
inlinestatic Config::LowLevelFunctionToken prepareLowLevelFunction(bool forward, size_t &curLLFByteDataPos, char *dataPtr, size_t &curLLFTInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, ByteDataView &dataView, LowLevelFunctionEntry< Impl, Real, Identifier > const *&func)
Prepare the call of a low level function.
Definition commonTapeImplementation.hpp:540
void iterateReverse(Callbacks &&callbacks)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition commonTapeImplementation.hpp:379
static inlinevoid notifyStatementEvaluateListeners(Tape &tape, Identifier const &lhsIdentifier, size_t sizeLhsAdjoint, Real const *lhsAdjoint)
Invoke callbacks for StatementEvaluate events.
Definition eventSystem.hpp:712
Indices enable the mapping of primal values to their adjoint counterparts.
Definition indexManagerInterface.hpp:78
typename Base::Position Position
Definition jacobianBaseTape.hpp:157
inlinestatic void incrementAdjoints(AdjointVector &adjointVector, AdjointVectorTraits::Gradient< AdjointVector > const &lhsAdjoint, Config::ArgumentSize const &numberOfArguments, size_t &curJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers)
Definition jacobianBaseTape.hpp:655
StatementData statementData
Definition jacobianBaseTape.hpp:178
inlinestatic void incrementTangents(AdjointVector const &adjointVector, AdjointVectorTraits::Gradient< AdjointVector > &lhsAdjoint, Config::ArgumentSize const &numberOfArguments, size_t &curJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers)
Definition jacobianBaseTape.hpp:678
AdjointVectorAccess< Real, Identifier, AdjointVector > VectorAccess
Definition jacobianBaseTape.hpp:161
inlinevoid clearAdjoints(AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Definition jacobianBaseTape.hpp:599
inlinevoid pushStmtData(Identifier const &index, Config::ArgumentSize const &numberOfArguments)
Add statement specific data to the data streams.
Definition jacobianLinearTape.hpp:126
typename TapeTypes::Real Real
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:73
inlinestatic void internalWriteTape(codi::TapeWriterInterface< TapeTypes > *writer, size_t &curLLFByteDataPos, size_t const &endLLFByteDataPos, char *dataPtr, size_t &curLLFInfoDataPos, size_t const &endLLFInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, size_t &curJacobianPos, size_t const &endJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers, size_t &curStmtPos, size_t const &endStmtPos, Config::ArgumentSize const *const numberOfJacobians, size_t const &startAdjointPos, size_t const &endAdjointPos)
Passes the statement to the writer.
Definition jacobianLinearTape.hpp:237
inlinevoid iterateReverse(Callbacks &&callbacks, Position start, Position end)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition jacobianLinearTape.hpp:343
typename TapeTypes::ActiveTypeTapeData ActiveTypeTapeData
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:77
void clearCustomAdjoints(Position const &start, Position const &end, AdjointVector &&data)
Clear all adjoint values, that is, set them to zero.
Definition jacobianLinearTape.hpp:112
void clearAdjoints(Position const &start, Position const &end, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Clear all adjoints that would be set in a tape evaluation from start to end. It has to hold start >= ...
Definition jacobianLinearTape.hpp:88
typename TapeTypes::IndexManager IndexManager
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:75
JacobianLinearTape()
Constructor.
Definition jacobianLinearTape.hpp:83
inlinestatic void internalEvaluateForward_EvalStatements(JacobianLinearTape &tape, AdjointVector &&adjointVector, size_t &curLLFByteDataPos, size_t const &endLLFByteDataPos, char *dataPtr, size_t &curLLFInfoDataPos, size_t const &endLLFInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, size_t &curJacobianPos, size_t const &endJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers, size_t &curStmtPos, size_t const &endStmtPos, Config::ArgumentSize const *const numberOfJacobians, size_t const &startAdjointPos, size_t const &endAdjointPos)
Perform a forward evaluation of the tape. Arguments are from the recursive eval methods of the DataIn...
Definition jacobianLinearTape.hpp:134
typename TapeTypes::Gradient Gradient
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:74
T_TapeTypes TapeTypes
See JacobianLinearTape.
Definition jacobianLinearTape.hpp:66
typename TapeTypes::Identifier Identifier
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:76
inlinevoid iterateForward(Callbacks &&callbacks, Position start, Position end)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition jacobianLinearTape.hpp:286
JacobianBaseTape< TapeTypes, JacobianLinearTape > Base
Base class abbreviation.
Definition jacobianLinearTape.hpp:70
typename Base::Position Position
See TapeTypesInterface.
Definition jacobianLinearTape.hpp:78
inlinestatic void internalEvaluateReverse_EvalStatements(JacobianLinearTape &tape, AdjointVector &&adjointVector, size_t &curLLFByteDataPos, size_t const &endLLFByteDataPos, char *dataPtr, size_t &curLLFInfoDataPos, size_t const &endLLFInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, size_t &curJacobianPos, size_t const &endJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers, size_t &curStmtPos, size_t const &endStmtPos, Config::ArgumentSize const *const numberOfJacobians, size_t const &startAdjointPos, size_t const &endAdjointPos)
Perform a reverse evaluation of the tape. Arguments are from the recursive eval methods of the DataIn...
Definition jacobianLinearTape.hpp:182
Type definitions for the Jacobian tapes.
Definition jacobianBaseTape.hpp:80
Low level function entry on the tape. See LowLevelFunctionTapeInterface for details.
Definition lowLevelFunctionEntry.hpp:69
The interface used by all the tape writers. The tape writers are used to generate text,...
Definition tapeReaderWriterInterface.hpp:129
virtual void writeLowLevelFunction(LowLevelFunctionEntry< Tape, Real, Identifier > const *func, ByteDataView &data)
Used for statements that contain a low level function.
Definition tapeReaderWriterInterface.hpp:171
virtual void writeStatement(Identifier const &curLhsIdentifier, size_t &curJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers, Config::ArgumentSize const &nJacobians)
Called for each statement. The method writes the current statement to the file. This overload is used...
Definition tapeReaderWriterInterface.hpp:152