CoDiPack  3.1.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
jacobianReuseTape.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 <fstream>
39#include <type_traits>
40
41#include "../config.h"
42#include "../expressions/lhsExpressionInterface.hpp"
43#include "../expressions/logic/compileTimeTraversalLogic.hpp"
44#include "../expressions/logic/traversalLogic.hpp"
45#include "../misc/macros.hpp"
46#include "../traits/expressionTraits.hpp"
47#include "data/chunk.hpp"
48#include "indices/indexManagerInterface.hpp"
49#include "interfaces/editingTapeInterface.hpp"
50#include "interfaces/reverseTapeInterface.hpp"
51#include "io/tapeReaderWriterInterface.hpp"
52#include "jacobianBaseTape.hpp"
53
55namespace codi {
56
64 template<typename T_TapeTypes>
66 : public JacobianBaseTape<T_TapeTypes, JacobianReuseTape<T_TapeTypes>>,
67 public EditingTapeInterface<typename JacobianBaseTape<T_TapeTypes, JacobianReuseTape<T_TapeTypes>>::Position> {
68 public:
69
70 using TapeTypes = CODI_DD(T_TapeTypes,
73
75 friend Base;
76
77 using Real = typename TapeTypes::Real;
78 using Gradient = typename TapeTypes::Gradient;
79 using IndexManager = typename TapeTypes::IndexManager;
80 using Identifier = typename TapeTypes::Identifier;
81 using ActiveTypeTapeData = typename TapeTypes::ActiveTypeTapeData;
82 using Position = typename Base::Position;
83 using StatementData = typename TapeTypes::StatementData;
84
85 CODI_STATIC_ASSERT(!IndexManager::IsLinear, "This class requires an index manager with a reuse scheme.");
86
89
90 /*******************************************************************************/
93
95
97 void clearAdjoints(Position const& start, Position const& end,
99 if (AdjointsManagement::Automatic == adjointsManagement) {
100 this->adjoints.beginUse();
101 }
102
103 Identifier adjointsSize = (Identifier)this->adjoints.size();
104
105 auto clearFunc = [&adjointsSize, this](Identifier* index, Config::ArgumentSize* stmtSize) {
106 CODI_UNUSED(stmtSize);
107
108 if (*index < adjointsSize) {
109 this->adjoints[*index] = Gradient();
110 }
111 };
112
113 using StmtPosition = typename StatementData::Position;
114 StmtPosition startStmt = this->llfByteData.template extractPosition<StmtPosition>(start);
115 StmtPosition endStmt = this->llfByteData.template extractPosition<StmtPosition>(end);
116
117 this->statementData.forEachReverse(startStmt, endStmt, clearFunc);
118
119 if (AdjointsManagement::Automatic == adjointsManagement) {
120 this->adjoints.endUse();
121 }
122 }
123
125 template<typename AdjointVector>
126 void clearCustomAdjoints(Position const& start, Position const& end, AdjointVector&& data) {
127 auto clearFunc = [&data](Identifier* index, Config::ArgumentSize* stmtSize) {
128 CODI_UNUSED(stmtSize);
129 data[*index] = Gradient();
130 };
131
132 using StmtPosition = typename StatementData::Position;
133 StmtPosition startStmt = this->llfByteData.template extractPosition<StmtPosition>(start);
134 StmtPosition endStmt = this->llfByteData.template extractPosition<StmtPosition>(end);
135
136 this->statementData.forEachReverse(startStmt, endStmt, clearFunc);
137 }
138
140
141 protected:
142
143 /*******************************************************************************/
146
149 CODI_INLINE void pushStmtData(Identifier const& index, Config::ArgumentSize const& numberOfArguments) {
150 this->statementData.pushData(index, numberOfArguments);
151 }
152
154 template<typename AdjointVector>
156 /* data from call */
157 JacobianReuseTape& tape, AdjointVector&& adjointVector,
158 /* data from low level function byte data vector */
159 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
160 /* data from low level function info data vector */
161 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
162 Config::LowLevelFunctionDataSize* const dataSizePtr,
163 /* data from jacobian vector */
164 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
165 Identifier const* const rhsIdentifiers,
166 /* data from statement vector */
167 size_t& curStmtPos, size_t const& endStmtPos, Identifier const* const lhsIdentifiers,
168 Config::ArgumentSize const* const numberOfJacobians) {
169 CODI_UNUSED(endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
170
172
173 typename Base::template VectorAccess<AdjointVector> vectorAccess(adjointVector);
174
175 while (curStmtPos < endStmtPos) CODI_Likely {
176 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
177
180 tape, true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
181 } else CODI_Likely {
182 Adjoint lhsAdjoint = Adjoint();
183 Base::template incrementTangents<AdjointVector>(adjointVector, lhsAdjoint, argsSize, curJacobianPos,
184 rhsJacobians, rhsIdentifiers);
185
186 adjointVector[lhsIdentifiers[curStmtPos]] = lhsAdjoint;
187
189 tape, lhsIdentifiers[curStmtPos], GradientTraits::dim<Adjoint>(),
190 GradientTraits::toArray(lhsAdjoint).data());
191 }
192
193 curStmtPos += 1;
194 }
195 }
196
198 template<typename AdjointVector>
200 /* data from call */
201 JacobianReuseTape& tape, AdjointVector&& adjointVector,
202 /* data from low level function byte data vector */
203 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
204 /* data from low level function info data vector */
205 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
206 Config::LowLevelFunctionDataSize* const dataSizePtr,
207 /* data from jacobianData */
208 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
209 Identifier const* const rhsIdentifiers,
210 /* data from statementData */
211 size_t& curStmtPos, size_t const& endStmtPos, Identifier const* const lhsIdentifiers,
212 Config::ArgumentSize const* const numberOfJacobians) {
213 CODI_UNUSED(endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
214
216
217 typename Base::template VectorAccess<AdjointVector> vectorAccess(adjointVector);
218
219 while (curStmtPos > endStmtPos) CODI_Likely {
220 curStmtPos -= 1;
221
222 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
223
226 tape, false, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
227 } else CODI_Likely {
228 Adjoint const lhsAdjoint = adjointVector[lhsIdentifiers[curStmtPos]];
229
231 tape, lhsIdentifiers[curStmtPos], GradientTraits::dim<Adjoint>(),
232 GradientTraits::toArray(lhsAdjoint).data());
233
234 adjointVector[lhsIdentifiers[curStmtPos]] = Adjoint();
235 Base::incrementAdjoints(adjointVector, lhsAdjoint, argsSize, curJacobianPos, rhsJacobians, rhsIdentifiers);
236 }
237 }
238 }
239
241 template<typename TapeTypes>
243 /* file interface pointer*/
245 /* data from low level function byte data vector */
246 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
247 /* data from low level function info data vector */
248 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
249 Config::LowLevelFunctionDataSize* const dataSizePtr,
250 /* data from jacobianData */
251 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
252 Identifier const* const rhsIdentifiers,
253 /* data from statementData */
254 size_t& curStmtPos, size_t const& endStmtPos, Identifier const* const lhsIdentifiers,
255 Config::ArgumentSize const* const numberOfJacobians) {
256 CODI_UNUSED(endLLFByteDataPos, endLLFInfoDataPos, endJacobianPos);
257 Identifier curLhsIdentifier;
258 Config::ArgumentSize curNumberOfJacobians;
259
260 ByteDataView dataView = {};
262
263 while (curStmtPos < endStmtPos) CODI_Likely {
264 curLhsIdentifier = lhsIdentifiers[curStmtPos];
265 curNumberOfJacobians = numberOfJacobians[curStmtPos];
266 if (Config::StatementLowLevelFunctionTag == curNumberOfJacobians) CODI_Unlikely {
267 Base::prepareLowLevelFunction(true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr,
268 dataView, func);
269 writer->writeLowLevelFunction(func, dataView);
270 } else CODI_Likely {
271 writer->writeStatement(curLhsIdentifier, curJacobianPos, rhsJacobians, rhsIdentifiers,
272 curNumberOfJacobians);
273 curJacobianPos += numberOfJacobians[curStmtPos];
274 }
275 curStmtPos += 1;
276 }
277 }
278
279
280 public:
281
282 /*******************************************************************************/
285
288 template<typename Callbacks>
289 CODI_INLINE void iterateForward(Callbacks&& callbacks, Position start, Position end) {
290 auto evalFunc = [&callbacks](
291 /* data from call */
292 JacobianReuseTape& tape,
293 /* data from low level function byte data vector */
294 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
295 /* data from low level function info data vector */
296 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos,
297 Config::LowLevelFunctionToken* const tokenPtr,
298 Config::LowLevelFunctionDataSize* const dataSizePtr,
299 /* data from jacobian vector */
300 size_t& curJacobianPos, size_t const& endJacobianPos, Real* const rhsJacobians,
301 Identifier* const rhsIdentifiers,
302 /* data from statement vector */
303 size_t& curStmtPos, size_t const& endStmtPos, Identifier* const lhsIdentifiers,
304 Config::ArgumentSize const* const numberOfJacobians) CODI_LAMBDA_INLINE {
305 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
306
307 ByteDataView dataView = {};
309
310 while (curStmtPos < endStmtPos) CODI_Likely {
311 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
312
314 Base::prepareLowLevelFunction(true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr,
315 dataView, func);
316 callbacks.handleLowLevelFunction(*func, dataView);
317 } else CODI_Likely {
318 callbacks.handleStatement(lhsIdentifiers[curStmtPos], argsSize, &rhsJacobians[curJacobianPos],
319 &rhsIdentifiers[curJacobianPos]);
320
321 curJacobianPos += argsSize;
322 }
323
324 curStmtPos += 1;
325 }
326 };
327
328 Base::llfByteData.evaluateForward(start, end, evalFunc, *this);
329 }
330
333 template<typename Callbacks>
334 CODI_INLINE void iterateReverse(Callbacks&& callbacks, Position start, Position end) {
335 auto evalFunc = [&callbacks](
336 /* data from call */
337 JacobianReuseTape& tape,
338 /* data from low level function byte data vector */
339 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
340 /* data from low level function info data vector */
341 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos,
342 Config::LowLevelFunctionToken* const tokenPtr,
343 Config::LowLevelFunctionDataSize* const dataSizePtr,
344 /* data from jacobian vector */
345 size_t& curJacobianPos, size_t const& endJacobianPos, Real* const rhsJacobians,
346 Identifier* const rhsIdentifiers,
347 /* data from statement vector */
348 size_t& curStmtPos, size_t const& endStmtPos, Identifier* const lhsIdentifiers,
349 Config::ArgumentSize const* const numberOfJacobians) CODI_LAMBDA_INLINE {
350 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
351
352 ByteDataView dataView = {};
354
355 while (curStmtPos > endStmtPos) CODI_Likely {
356 curStmtPos -= 1;
357
358 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
359
361 Base::prepareLowLevelFunction(false, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr,
362 dataView, func);
363 callbacks.handleLowLevelFunction(*func, dataView);
364 } else CODI_Likely {
365 curJacobianPos -= argsSize;
366
367 callbacks.handleStatement(lhsIdentifiers[curStmtPos], argsSize, &rhsJacobians[curJacobianPos],
368 &rhsIdentifiers[curJacobianPos]);
369 }
370 }
371 };
372
373 Base::llfByteData.evaluateReverse(start, end, evalFunc, *this);
374 }
375
377 /*******************************************************************************/
380
384 CODI_INLINE void erase(Position const& start, Position const& end) {
385 JacobianReuseTape emptyTape;
386 erase(start, end, emptyTape);
387 }
388
389 // clang-format off
391 // clang-format on
392 CODI_INLINE void erase(Position const& start, Position const& end, JacobianReuseTape& emptyTape) {
393 // Store the tail after the part to be erased in the helper tape.
394 emptyTape.append(*this, end, this->getPosition());
395
396 // Reset the tape to before the erased part and re-append the tail. This accounts for external function position
397 // correction.
398
399 // Do not delete external function data for the part to be reappended.
400 this->llfByteData.resetTo(end);
401 clearAdjoints(end, this->getPosition());
402
403 // Delete external function data in the part to be erased.
404 this->resetTo(start);
405
406 this->append(emptyTape, emptyTape.getZeroPosition(), emptyTape.getPosition());
407
408 // Do not delete external function data in the helper tape.
409 emptyTape.llfByteData.reset();
410 }
411
413 CODI_INLINE void append(JacobianReuseTape& srcTape, Position const& start, Position const& end) {
414 srcTape.llfByteData.evaluateForward(start, end, JacobianReuseTape::internalAppend, this);
415 }
416
418 template<typename Func>
419 void editIdentifiers(Func&& modifyIdentifier, Position const& start, Position const& end) {
420 auto evalFunc = [&modifyIdentifier](
421 /* data from low level function byte data vector */
422 size_t&, size_t const&, char*,
423 /* data from low level function info data vector */
424 size_t&, size_t const&, Config::LowLevelFunctionToken* const,
426 /* data from jacobianData */
427 size_t& curJacobianPos, size_t const&, Real const* const, Identifier* const rhsIdentifiers,
428 /* data from statementData */
429 size_t& curStmtPos, size_t const& endStmtPos, Identifier* const lhsIdentifiers,
430 Config::ArgumentSize const* const numberOfJacobians) {
431 while (curStmtPos < endStmtPos) CODI_Likely {
432 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
433
434 if (Config::StatementLowLevelFunctionTag != argsSize) CODI_Likely { // skip low-level functions
435 modifyIdentifier(lhsIdentifiers[curStmtPos]);
436
437 size_t endJacobianPos = curJacobianPos + argsSize;
438 while (curJacobianPos < endJacobianPos) CODI_Likely {
439 modifyIdentifier(rhsIdentifiers[curJacobianPos]);
440 curJacobianPos += 1;
441 }
442 }
443
444 curStmtPos += 1;
445 }
446 };
447
448 Base::llfByteData.evaluateForward(start, end, evalFunc);
449 }
450
452
453 private:
454
455 static CODI_INLINE void internalAppend(
456 /* data from call */
457 JacobianReuseTape* dstTape,
458 /* data from low level function byte data vector */
459 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
460 /* data from low level function info data vector */
461 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos, Config::LowLevelFunctionToken* const tokenPtr,
462 Config::LowLevelFunctionDataSize* const dataSizePtr,
463 /* data from jacobianData */
464 size_t& curJacobianPos, size_t const& endJacobianPos, Real const* const rhsJacobians,
465 Identifier const* const rhsIdentifiers,
466 /* data from statementData */
467 size_t& curStmtPos, size_t const& endStmtPos, Identifier const* const lhsIdentifiers,
468 Config::ArgumentSize const* const numberOfJacobians) {
469 CODI_UNUSED(endLLFByteDataPos, endLLFInfoDataPos, endJacobianPos);
470
471 while (curStmtPos < endStmtPos) {
472 Config::ArgumentSize const argsSize = numberOfJacobians[curStmtPos];
474 Config::LowLevelFunctionToken token = tokenPtr[curLLFInfoDataPos];
475 size_t dataSize = dataSizePtr[curLLFInfoDataPos];
476
477 // Create the store on the new tape.
478 ByteDataView dstDataStore = {};
479 dstTape->pushLowLevelFunction(token, dataSize, dstDataStore);
480
481 // Copy the data.
482 dstDataStore.write(&dataPtr[curLLFByteDataPos], dataSize);
483
484 curLLFInfoDataPos += 1;
485 curLLFByteDataPos += dataSize;
486 } else CODI_Likely {
487 // Manual statement push.
488 dstTape->statementData.reserveItems(1);
489 dstTape->jacobianData.reserveItems(numberOfJacobians[curStmtPos]);
490
491 dstTape->pushStmtData(lhsIdentifiers[curStmtPos], numberOfJacobians[curStmtPos]);
492 size_t curJacobianEnd = curJacobianPos + numberOfJacobians[curStmtPos];
493
494 while (curJacobianPos < curJacobianEnd) {
495 dstTape->jacobianData.pushData(rhsJacobians[curJacobianPos], rhsIdentifiers[curJacobianPos]);
496 ++curJacobianPos;
497 }
498 }
499
500 ++curStmtPos;
501 }
502 }
503 };
504}
#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 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
uint8_t ArgumentSize
Type for the number of arguments in statements.
Definition config.h:117
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
inlineT * write(T const &data)
Write a single entry of type T.
Definition byteDataView.hpp:132
void iterateForward(Callbacks &&callbacks)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition commonTapeImplementation.hpp:371
Position getPosition() const
Definition commonTapeImplementation.hpp:737
inlinevoid resetTo(Position const &pos, bool resetAdjoints=true, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Definition commonTapeImplementation.hpp:776
Position getZeroPosition() const
Initial position of the tape.
Definition commonTapeImplementation.hpp:742
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
Edit tapes after they have been recorded.
Definition editingTapeInterface.hpp:65
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
JacobianData jacobianData
Data stream for argument specific data.
Definition jacobianBaseTape.hpp:179
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
inlinevoid pushLowLevelFunction(Config::LowLevelFunctionToken token, size_t size, ByteDataView &data)
Push a low level function to the tape.
Definition jacobianBaseTape.hpp:977
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
Final implementation for a Jacobian tape with a reuse index management.
Definition jacobianReuseTape.hpp:67
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, Identifier const *const lhsIdentifiers, Config::ArgumentSize const *const numberOfJacobians)
Passes the statement to the writer.
Definition jacobianReuseTape.hpp:242
inlinevoid append(JacobianReuseTape &srcTape, Position const &start, Position const &end)
Definition jacobianReuseTape.hpp:413
typename TapeTypes::Gradient Gradient
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:78
typename TapeTypes::StatementData StatementData
See JacobianTapeTypes.
Definition jacobianReuseTape.hpp:83
T_TapeTypes TapeTypes
See JacobianReuseTape.
Definition jacobianReuseTape.hpp:70
inlinestatic void internalEvaluateForward_EvalStatements(JacobianReuseTape &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, Identifier const *const lhsIdentifiers, Config::ArgumentSize const *const numberOfJacobians)
Perform a forward evaluation of the tape. Arguments are from the recursive eval methods of the DataIn...
Definition jacobianReuseTape.hpp:155
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 jacobianReuseTape.hpp:97
JacobianReuseTape()
Constructor.
Definition jacobianReuseTape.hpp:88
typename TapeTypes::Identifier Identifier
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:80
inlinevoid erase(Position const &start, Position const &end, JacobianReuseTape &emptyTape)
Erase a part of the tape. It has to hold start <= end. This variant of erase takes a reference to an ...
Definition jacobianReuseTape.hpp:392
inlinevoid iterateForward(Callbacks &&callbacks, Position start, Position end)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition jacobianReuseTape.hpp:289
JacobianBaseTape< T_TapeTypes, JacobianReuseTape > Base
Base class abbreviation.
Definition jacobianReuseTape.hpp:74
typename TapeTypes::Real Real
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:77
void clearCustomAdjoints(Position const &start, Position const &end, AdjointVector &&data)
Clear all adjoint values, that is, set them to zero.
Definition jacobianReuseTape.hpp:126
typename TapeTypes::IndexManager IndexManager
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:79
typename TapeTypes::ActiveTypeTapeData ActiveTypeTapeData
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:81
inlinestatic void internalEvaluateReverse_EvalStatements(JacobianReuseTape &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, Identifier const *const lhsIdentifiers, Config::ArgumentSize const *const numberOfJacobians)
Perform a reverse evaluation of the tape. Arguments are from the recursive eval methods of the DataIn...
Definition jacobianReuseTape.hpp:199
void editIdentifiers(Func &&modifyIdentifier, Position const &start, Position const &end)
Modify the identifiers in an already recorded tape.
Definition jacobianReuseTape.hpp:419
typename Base::Position Position
See TapeTypesInterface.
Definition jacobianReuseTape.hpp:82
inlinevoid erase(Position const &start, Position const &end)
Erase a part of the tape. It has to hold start <= end.
Definition jacobianReuseTape.hpp:384
inlinevoid pushStmtData(Identifier const &index, Config::ArgumentSize const &numberOfArguments)
Add statement specific data to the data streams.
Definition jacobianReuseTape.hpp:149
inlinevoid iterateReverse(Callbacks &&callbacks, Position start, Position end)
Iterate over the tape in a generalized fashion. callbacks needs to implement codi::CallbacksInterface...
Definition jacobianReuseTape.hpp:334
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