42#include "../expressions/lhsExpressionInterface.hpp"
43#include "../expressions/logic/compileTimeTraversalLogic.hpp"
44#include "../expressions/logic/traversalLogic.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"
64 template<
typename T_TapeTypes>
67 public EditingTapeInterface<typename JacobianBaseTape<T_TapeTypes, JacobianReuseTape<T_TapeTypes>>::Position> {
77 using Real =
typename TapeTypes::Real;
85 CODI_STATIC_ASSERT(!IndexManager::IsLinear,
"This class requires an index manager with a reuse scheme.");
108 if (*index < adjointsSize) {
113 using StmtPosition =
typename StatementData::Position;
114 StmtPosition startStmt = this->
llfByteData.template extractPosition<StmtPosition>(start);
115 StmtPosition endStmt = this->
llfByteData.template extractPosition<StmtPosition>(end);
117 this->
statementData.forEachReverse(startStmt, endStmt, clearFunc);
125 template<
typename Adjo
intVector>
132 using StmtPosition =
typename StatementData::Position;
133 StmtPosition startStmt = this->
llfByteData.template extractPosition<StmtPosition>(start);
134 StmtPosition endStmt = this->
llfByteData.template extractPosition<StmtPosition>(end);
136 this->
statementData.forEachReverse(startStmt, endStmt, clearFunc);
154 template<
typename Adjo
intVector>
159 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
164 size_t& curJacobianPos,
size_t const& endJacobianPos,
Real const*
const rhsJacobians,
167 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier const*
const lhsIdentifiers,
169 CODI_UNUSED(endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
180 tape,
true, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
182 Adjoint lhsAdjoint = Adjoint();
184 rhsJacobians, rhsIdentifiers);
186 adjointVector[lhsIdentifiers[curStmtPos]] = lhsAdjoint;
198 template<
typename Adjo
intVector>
203 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
208 size_t& curJacobianPos,
size_t const& endJacobianPos,
Real const*
const rhsJacobians,
211 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier const*
const lhsIdentifiers,
213 CODI_UNUSED(endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
226 tape,
false, curLLFByteDataPos, dataPtr, curLLFInfoDataPos, tokenPtr, dataSizePtr, &vectorAccess);
228 Adjoint
const lhsAdjoint = adjointVector[lhsIdentifiers[curStmtPos]];
234 adjointVector[lhsIdentifiers[curStmtPos]] = Adjoint();
241 template<
typename TapeTypes>
246 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
251 size_t& curJacobianPos,
size_t const& endJacobianPos,
Real const*
const rhsJacobians,
254 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier const*
const lhsIdentifiers,
256 CODI_UNUSED(endLLFByteDataPos, endLLFInfoDataPos, endJacobianPos);
264 curLhsIdentifier = lhsIdentifiers[curStmtPos];
265 curNumberOfJacobians = numberOfJacobians[curStmtPos];
271 writer->
writeStatement(curLhsIdentifier, curJacobianPos, rhsJacobians, rhsIdentifiers,
272 curNumberOfJacobians);
273 curJacobianPos += numberOfJacobians[curStmtPos];
288 template<
typename Callbacks>
290 auto evalFunc = [&callbacks](
294 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
296 size_t& curLLFInfoDataPos,
size_t const& endLLFInfoDataPos,
300 size_t& curJacobianPos,
size_t const& endJacobianPos,
Real*
const rhsJacobians,
303 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier*
const lhsIdentifiers,
305 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
316 callbacks.handleLowLevelFunction(*func, dataView);
318 callbacks.handleStatement(lhsIdentifiers[curStmtPos], argsSize, &rhsJacobians[curJacobianPos],
319 &rhsIdentifiers[curJacobianPos]);
321 curJacobianPos += argsSize;
333 template<
typename Callbacks>
335 auto evalFunc = [&callbacks](
339 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
341 size_t& curLLFInfoDataPos,
size_t const& endLLFInfoDataPos,
345 size_t& curJacobianPos,
size_t const& endJacobianPos,
Real*
const rhsJacobians,
348 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier*
const lhsIdentifiers,
350 CODI_UNUSED(tape, endJacobianPos, endLLFByteDataPos, endLLFInfoDataPos);
363 callbacks.handleLowLevelFunction(*func, dataView);
365 curJacobianPos -= argsSize;
367 callbacks.handleStatement(lhsIdentifiers[curStmtPos], argsSize, &rhsJacobians[curJacobianPos],
368 &rhsIdentifiers[curJacobianPos]);
386 erase(start, end, emptyTape);
414 srcTape.
llfByteData.evaluateForward(start, end, JacobianReuseTape::internalAppend,
this);
418 template<
typename Func>
420 auto evalFunc = [&modifyIdentifier](
422 size_t&,
size_t const&,
char*,
427 size_t& curJacobianPos,
size_t const&,
Real const*
const,
Identifier*
const rhsIdentifiers,
429 size_t& curStmtPos,
size_t const& endStmtPos,
Identifier*
const lhsIdentifiers,
435 modifyIdentifier(lhsIdentifiers[curStmtPos]);
437 size_t endJacobianPos = curJacobianPos + argsSize;
438 while (curJacobianPos < endJacobianPos)
CODI_Likely {
439 modifyIdentifier(rhsIdentifiers[curJacobianPos]);
459 size_t& curLLFByteDataPos,
size_t const& endLLFByteDataPos,
char* dataPtr,
464 size_t& curJacobianPos,
size_t const& endJacobianPos, Real
const*
const rhsJacobians,
465 Identifier
const*
const rhsIdentifiers,
467 size_t& curStmtPos,
size_t const& endStmtPos, Identifier
const*
const lhsIdentifiers,
469 CODI_UNUSED(endLLFByteDataPos, endLLFInfoDataPos, endJacobianPos);
471 while (curStmtPos < endStmtPos) {
475 size_t dataSize = dataSizePtr[curLLFInfoDataPos];
482 dstDataStore.
write(&dataPtr[curLLFByteDataPos], dataSize);
484 curLLFInfoDataPos += 1;
485 curLLFByteDataPos += dataSize;
489 dstTape->
jacobianData.reserveItems(numberOfJacobians[curStmtPos]);
491 dstTape->
pushStmtData(lhsIdentifiers[curStmtPos], numberOfJacobians[curStmtPos]);
492 size_t curJacobianEnd = curJacobianPos + numberOfJacobians[curStmtPos];
494 while (curJacobianPos < curJacobianEnd) {
495 dstTape->
jacobianData.pushData(rhsJacobians[curJacobianPos], rhsIdentifiers[curJacobianPos]);
#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
Adjoints adjoints
Definition jacobianBaseTape.hpp:181
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
JacobianBaseTape()
Definition jacobianBaseTape.hpp:215
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