CoDiPack  2.3.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
commonTapeImplementation.hpp
1/*
2 * CoDiPack, a Code Differentiation Package
3 *
4 * Copyright (C) 2015-2024 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 "../misc/byteDataView.hpp"
42#include "../misc/eventSystem.hpp"
43#include "../misc/fileIo.hpp"
44#include "../misc/macros.hpp"
45#include "../misc/temporaryMemory.hpp"
46#include "data/dataInterface.hpp"
47#include "data/position.hpp"
48#include "indices/indexManagerInterface.hpp"
49#include "interfaces/fullTapeInterface.hpp"
50#include "io/tapeReaderWriterInterface.hpp"
51#include "misc/externalFunction.hpp"
52#include "misc/lowLevelFunctionEntry.hpp"
53#include "misc/vectorAccessInterface.hpp"
54
56namespace codi {
57
65 public:
66
67 using Real = CODI_ANY;
70
73 template<typename Chunk, typename Nested>
75
78 };
79
85 template<typename T_TapeTypes>
87 public:
88
89 using TapeTypes = CODI_DD(T_TapeTypes, TapeTypesInterface);
90
91 template<typename Chunk, typename Nested>
92 using Data = typename TapeTypes::template Data<Chunk, Nested>;
93
94 using NestedData = typename TapeTypes::NestedData;
95
100
105
106 using Position = typename LowLevelFunctionByteData::Position;
107 };
108
127 template<typename T_ImplTapeTypes, typename T_Impl>
129 : public FullTapeInterface<typename T_ImplTapeTypes::Real, typename T_ImplTapeTypes::Gradient,
130 typename T_ImplTapeTypes::Identifier,
131 typename CommonTapeTypes<T_ImplTapeTypes>::Position> {
132 public:
133
134 using ImplTapeTypes = CODI_DD(T_ImplTapeTypes, TapeTypesInterface);
136
137 using Real = typename ImplTapeTypes::Real;
138 using Gradient = typename ImplTapeTypes::Gradient;
139 using Identifier = typename ImplTapeTypes::Identifier;
140
146
148 using NestedPosition = typename LowLevelFunctionByteData::Position;
149
150 protected:
151
152 bool active;
153 std::set<TapeParameters> options;
154
157
162
164
166 static std::vector<LowLevelFunctionEntry<Impl, Real, Identifier>>* lowLevelFunctionLookup;
167
168 private:
169
171 static Config::LowLevelFunctionToken constexpr EXTERNAL_FUNCTION_TOKEN = 0;
172
173 CODI_INLINE Impl const& cast() const {
174 return static_cast<Impl const&>(*this);
175 }
176
177 CODI_INLINE Impl& cast() {
178 return static_cast<Impl&>(*this);
179 }
180
181 CODI_INLINE void resetInternal(bool resetAdjoints, AdjointsManagement adjointsManagement,
182 EventHints::Reset kind) {
183 EventSystem<Impl>::notifyTapeResetListeners(cast(), this->getZeroPosition(), kind, resetAdjoints);
184
185 if (resetAdjoints) {
186 cast().clearAdjoints(adjointsManagement);
187 }
188
190
191 llfByteData.reset();
192
193 // Requires extra reset since the default vector implementation forwards to resetTo
194 cast().indexManager.get().reset();
195 }
196
197 protected:
198
200 CODI_INLINE void initializeManualPushData(Real const& lhsValue, Identifier const& lhsIndex, size_t size) {
201 codiAssert(this->manualPushGoal == this->manualPushCounter);
203 this->manualPushLhsValue = lhsValue;
204 this->manualPushLhsIdentifier = lhsIndex;
205 this->manualPushCounter = 0;
206 this->manualPushGoal = size;
207 }
208 }
209
212 codiAssert(this->manualPushCounter < this->manualPushGoal);
213
215 this->manualPushCounter += 1;
216 }
217 }
218
219 protected:
220
221 /*******************************************************************************/
224
226
228
229 public:
230
233 : active(false),
234 options(),
235 llfInfoData(Config::SmallChunkSize),
236 llfByteData(Config::ByteDataChunkSize),
241 allocator() {
244
245 if (nullptr == lowLevelFunctionLookup) {
246 lowLevelFunctionLookup = new std::vector<LowLevelFunctionEntry<Impl, Real, Identifier>>();
247
248 // Add external function token. So EXTERNAL_FUNCTION_TOKEN is always zero.
251 if (token != EXTERNAL_FUNCTION_TOKEN) {
252 CODI_EXCEPTION("External function token is not zero.");
253 }
254 }
255 }
256
259
262
265
268
269 /*******************************************************************************/
272
274 void setGradient(Identifier const& identifier, Gradient const& gradient,
276 cast().gradient(identifier, adjointsManagement) = gradient;
277 }
278
280 Gradient const& getGradient(Identifier const& identifier,
281 AdjointsManagement adjointsManagement = AdjointsManagement::Automatic) const {
282 return cast().gradient(identifier, adjointsManagement);
283 }
284
285 // Gradient functions are not implemented.
286
288 /*******************************************************************************/
291
294 Impl& impl = cast();
295
296 impl.evaluate(impl.getPosition(), impl.getZeroPosition(), adjointsManagement);
297 }
298
300 template<typename Lhs>
302 cast().template store<Lhs, Lhs>(value, static_cast<ExpressionInterface<Real, Lhs> const&>(value));
304 value.cast().getIdentifier());
305 }
306
312
318
320 bool isActive() const {
321 return active;
322 }
323
325 template<typename Stream = std::ostream>
326 void printStatistics(Stream& out = std::cout) const {
327 cast().getTapeValues().formatDefault(out);
328 }
329
331 template<typename Stream = std::ostream>
332 void printTableHeader(Stream& out = std::cout) const {
333 cast().getTapeValues().formatHeader(out);
334 }
335
337 template<typename Stream = std::ostream>
338 void printTableRow(Stream& out = std::cout) const {
339 cast().getTapeValues().formatRow(out);
340 }
341
344 TapeValues values = cast().internalGetTapeValues();
345
346 values.addSection("Low level function info data entries");
347 llfInfoData.addToTapeValues(values);
348 values.addSection("Low level function byte data entries");
349 llfByteData.addToTapeValues(values);
350
351 return values;
352 }
353
355 CODI_INLINE void reset(bool resetAdjoints = true,
357 resetInternal(resetAdjoints, adjointsManagement, EventHints::Reset::Full);
358 }
359
360 // clearAdjoints and reset(Position) are not implemented.
361
363 /*******************************************************************************/
366
368 void swap(Impl& other) {
369 std::swap(active, other.active);
370
371 llfByteData.swap(other.llfByteData);
372 }
373
375 void resetHard() {
376 Impl& impl = cast();
377
378 // First perform a regular reset.
379 resetInternal(false, AdjointsManagement::Automatic, EventHints::Reset::Hard);
380
381 // Then perform the hard resets.
382 impl.deleteAdjointVector();
383
384 llfByteData.resetHard();
385 }
386
388
389 private:
390 static void writeFunction(const ChunkBase* chunk, FileIo& handle) {
391 chunk->writeData(handle);
392 }
393
394 static void readFunction(ChunkBase* chunk, FileIo& handle) {
395 chunk->readData(handle);
396 }
397
398 static void deleteFunction(ChunkBase* chunk) {
399 chunk->deleteData();
400 }
401
402 public:
403
406 void writeToFile(const std::string& filename) {
407 FileIo io(filename, true);
408
409 llfByteData.forEachChunk(writeFunction, true, io);
410 }
411
413 void readFromFile(const std::string& filename) {
414 FileIo io(filename, false);
415
416 llfByteData.forEachChunk(readFunction, true, io);
417 }
418
420 void deleteData() {
421 llfByteData.forEachChunk(deleteFunction, true);
422 }
423
425 std::set<TapeParameters> const& getAvailableParameters() const {
426 return options;
427 }
428
431 size_t getParameter(TapeParameters parameter) const {
432 switch (parameter) {
434 return llfByteData.getDataSize();
435 break;
437 return llfInfoData.getDataSize();
438 break;
440 CODI_WARNING(
441 "Tape parameter 'ExternalFunctionsSize' no longer supported. Use 'LLFInfoDataSize' and "
442 "'LLFByteDataSize' instead.");
443 return 0;
444 break;
445 default:
446 CODI_EXCEPTION("Tried to get undefined parameter for tape.");
447 return 0;
448 break;
449 }
450 }
451
453 bool hasParameter(TapeParameters parameter) const {
454 return options.cend() != options.find(parameter);
455 }
456
459 void setParameter(TapeParameters parameter, size_t value) {
460 switch (parameter) {
462 llfByteData.resize(value);
463 break;
465 llfInfoData.resize(value);
466 break;
468 CODI_WARNING(
469 "Tape parameter 'ExternalFunctionsSize' is no longer supported. Use 'LLFInfoDataSize' and "
470 "'LLFByteDataSize' instead.");
471 break;
472 default:
473 CODI_EXCEPTION("Tried to set undefined parameter for tape.");
474 break;
475 }
476 }
477
478 // createVectorAccess is not implemented.
479 // createVectorAccessCustomAdjoints is not implemented.
480 // resizeAdjointVector is not implemented.
481 // deleteAdjointVector is not implemented.
482 // beginUseAdjointVector is not implemented.
483 // endUseAdjointVector is not implemented.
484
486 /*******************************************************************************/
489
490 protected:
491
495 ByteDataView& dataView) {
496 codiAssert((size_t)token < lowLevelFunctionLookup->size());
498 CODI_EXCEPTION(
499 "Requested size for low level function is to big. Increase "
500 "codi::Config::LowLevelFunctionDataSize or perform a dynamic memory allocation.");
501 }
502
503 llfInfoData.reserveItems(1);
504 llfByteData.reserveItems(size);
505
506 llfInfoData.pushData(token, size);
507
508 char* dataPointer = nullptr;
509 llfByteData.getDataPointers(dataPointer);
510 dataView.init(dataPointer, 0, size);
511 llfByteData.addDataSize(size);
512 }
513
516 template<LowLevelFunctionEntryCallKind callType, typename... Args>
517 CODI_INLINE static void callLowLevelFunction(Impl& impl, bool forward,
518 /* data from low level function byte data vector */
519 size_t& curLLFByteDataPos, char* dataPtr,
520 /* data from low level function info data vector */
521 size_t& curLLFTInfoDataPos,
522 Config::LowLevelFunctionToken* const tokenPtr,
523 Config::LowLevelFunctionDataSize* const dataSizePtr,
524 Args&&... args) {
525 if (!forward) {
526 curLLFTInfoDataPos -= 1;
527 curLLFByteDataPos -= dataSizePtr[curLLFTInfoDataPos];
528 }
529
530 size_t endPos = curLLFByteDataPos + dataSizePtr[curLLFTInfoDataPos];
531 ByteDataView dataView(dataPtr, curLLFByteDataPos, endPos);
532
533 Config::LowLevelFunctionToken id = tokenPtr[curLLFTInfoDataPos];
534 LowLevelFunctionEntry<Impl, Real, Identifier> const& func = (*lowLevelFunctionLookup)[id];
535 if (func.template has<callType>()) CODI_Likely {
536 func.template call<callType>(&impl, dataView, std::forward<Args>(args)...);
537
538 codiAssert(endPos == dataView.getPosition());
539 } else CODI_Unlikely if (LowLevelFunctionEntryCallKind::Delete == callType) {
540 // No delete registered. Data is skiped by the curLLFByteDataPos update.
541 } else {
542 CODI_EXCEPTION("Requested call is not supported for low level function with token '%d'.", (int)id);
543 }
544
545 if (forward) {
546 curLLFByteDataPos += dataSizePtr[curLLFTInfoDataPos];
547 curLLFTInfoDataPos += 1;
548 }
549 }
550
551 public:
552
557
569
570 // pushLowLevelFunction is not implemented.
571
573 /*******************************************************************************/
576
580 ExternalFunctionLowLevelEntryMapper<Impl, Real, Identifier>::store(cast(), EXTERNAL_FUNCTION_TOKEN, extFunc);
581 }
582 }
583
584 // registerExternalFunctionOutput is not implemented.
585
587 /*******************************************************************************/
590
593 Impl& impl = cast();
594
595 impl.evaluateForward(impl.getZeroPosition(), impl.getPosition(), adjointsManagement);
596 }
597
599 /*******************************************************************************/
602
604 template<typename Type>
605 void writeTape(std::unique_ptr<TapeWriterInterface<Type>> writer) {
606 Impl& impl = cast();
607 impl.writeTape(writer.get(), impl.getZeroPosition(), impl.getPosition());
608 }
609
612 template<typename Type>
613 void writeTape(std::unique_ptr<TapeWriterInterface<Type>> writer, Position const& start, Position const& end) {
614 Impl& impl = cast();
615 impl.writeTape(writer.get(), start, end);
616 }
617
619 template<typename Type>
621 Impl& impl = cast();
622 impl.writeTape(&writeToFileRef, impl.getZeroPosition(), impl.getPosition());
623 }
624
627 template<typename Type>
628 void writeTape(codi::TapeWriterInterface<Type>& writeToFileRef, Position const& start, Position const& end) {
629 Impl& impl = cast();
630 impl.writeTape(&writeToFileRef, start, end);
631 }
632
634 /*******************************************************************************/
637
642
647
649 bool isIdentifierActive(Identifier const& index) const {
650 return index != cast().getPassiveIndex();
651 }
652
654 template<typename Lhs>
658
660 /*******************************************************************************/
663
666 return llfByteData.getPosition();
667 }
668
671 return llfByteData.getZeroPosition();
672 }
673
675
676 protected:
677
680 // Clear external function data.
681 auto deleteFunc = [this](
682 /* data from low level function byte data vector */
683 size_t& curLLFByteDataPos, size_t const& endLLFByteDataPos, char* dataPtr,
684 /* data from low level function info data vector */
685 size_t& curLLFInfoDataPos, size_t const& endLLFInfoDataPos,
686 Config::LowLevelFunctionToken* const tokenPtr,
687 Config::LowLevelFunctionDataSize* const dataSizePtr) {
688 CODI_UNUSED(endLLFByteDataPos);
689
690 while (curLLFInfoDataPos > endLLFInfoDataPos) {
691 callLowLevelFunction<LowLevelFunctionEntryCallKind::Delete>(cast(), false, curLLFByteDataPos, dataPtr,
692 curLLFInfoDataPos, tokenPtr, dataSizePtr);
693 }
694 };
695
696 llfByteData.template evaluateReverse<1>(cast().getPosition(), pos, deleteFunc);
697 }
698
699 public:
700
702
704 CODI_INLINE void resetTo(Position const& pos, bool resetAdjoints = true,
706 EventSystem<Impl>::notifyTapeResetListeners(cast(), pos, EventHints::Reset::To, resetAdjoints);
707
708 if (resetAdjoints) {
709 Impl& impl = cast();
710 impl.clearAdjoints(impl.getPosition(), pos, adjointsManagement);
711 }
712
714
715 llfByteData.resetTo(pos);
716 }
717
718 // clearAdjoints and evaluate are not implemented.
719
721 /*******************************************************************************/
724
727 Impl& impl = cast();
728
729 impl.evaluatePrimal(impl.getZeroPosition(), impl.getPosition());
730 }
731
733 void setPrimal(Identifier const& identifier, Real const& primal) {
734 cast().primal(identifier) = primal;
735 }
736
738 Real const& getPrimal(Identifier const& identifier) const {
739 return cast().primal(identifier);
740 }
741
743
744 protected:
745
746 /*******************************************************************************/
749
751 void init(typename ImplTapeTypes::NestedData* nested) {
752 llfInfoData.setNested(nested);
753 llfByteData.setNested(&llfInfoData);
754 }
755
757 };
758
759 template<typename ImplTapeTypes, typename Impl>
760 std::vector<LowLevelFunctionEntry<Impl, typename ImplTapeTypes::Real, typename ImplTapeTypes::Identifier>>*
762}
#define CODI_Unlikely
Declare unlikely evaluation of an execution path.
Definition config.h:399
#define CODI_INLINE
See codi::Config::ForcedInlines.
Definition config.h:457
#define CODI_Likely
Declare likely evaluation of an execution path.
Definition config.h:397
#define codiAssert(x)
See codi::Config::EnableAssert.
Definition config.h:432
#define CODI_DD(Type, Default)
Abbreviation for CODI_DECLARE_DEFAULT.
Definition macros.hpp:94
#define CODI_ENABLE_CHECK(option, condition)
Definition macros.hpp:53
#define CODI_ANY
Used in default declarations of expression templates.
Definition macros.hpp:98
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
bool constexpr EnableAssert
Enables asserts in CoDiPack for consistency checking.
Definition config.h:436
size_t constexpr LowLevelFunctionDataSizeMax
Maximum data size of a low level function.
Definition config.h:101
bool constexpr CheckTapeActivity
Makes it possible to ignore certain code parts. If turned of everything will be recorded.
Definition config.h:170
bool constexpr StatementEvents
Enable statement events. Disabled by default.
Definition config.h:319
size_t constexpr LowLevelFunctionTokenMaxSize
Maximum number of low level functions.
Definition config.h:111
Reset
Characterize a tape reset.
Definition eventSystem.hpp:72
CoDiPack - Code Differentiation Package.
Definition codi.hpp:91
void CODI_UNUSED(Args const &...)
Disable unused warnings for an arbitrary number of arguments.
Definition macros.hpp:46
TapeParameters
Configuration options for a tape.
Definition tapeParameters.hpp:52
LowLevelFunctionEntryCallKind
All possible call types for a low level function entry.
Definition lowLevelFunctionEntry.hpp:51
AdjointsManagement
Policies for management of the tape's interal adjoints.
Definition tapeParameters.hpp:98
@ Automatic
Manage internal adjoints automatically, including locking, bounds checking, and resizing.
Definition byteDataView.hpp:51
size_t getPosition()
Get the current data position.
Definition byteDataView.hpp:70
void init(char *pointer, size_t pos, size_t end)
Initialize the object.
Definition byteDataView.hpp:75
Definition chunk.hpp:185
Definition chunk.hpp:283
A chunk stores a contiguous block of data in CoDiPack.
Definition chunk.hpp:76
virtual void writeData(FileIo &handle) const =0
Write data to the FileIo handle.
Implementation of all common tape functionality.
Definition commonTapeImplementation.hpp:131
Gradient const & getGradient(Identifier const &identifier, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic) const
Set the gradient.
Definition commonTapeImplementation.hpp:280
void setPassive()
Stop/interrupt recording of statements.
Definition commonTapeImplementation.hpp:314
CommonTapeImplementation(CommonTapeImplementation &&)=delete
Do not allow move construction. Relevant use cases should be covered by swap.
static void callLowLevelFunction(Impl &impl, bool forward, size_t &curLLFByteDataPos, char *dataPtr, size_t &curLLFTInfoDataPos, Config::LowLevelFunctionToken *const tokenPtr, Config::LowLevelFunctionDataSize *const dataSizePtr, Args &&... args)
Called by the implementing tapes during a tape evaluation when a low level function statement has bee...
Definition commonTapeImplementation.hpp:517
Real manualPushLhsValue
For storeManual, remember the value assigned to the lhs.
Definition commonTapeImplementation.hpp:158
typename ImplTapeTypes::Real Real
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:137
static std::vector< LowLevelFunctionEntry< Impl, Real, Identifier > > * lowLevelFunctionLookup
Lookup table for low level function.
Definition commonTapeImplementation.hpp:166
std::set< TapeParameters > const & getAvailableParameters() const
See Parameters functions.
Definition commonTapeImplementation.hpp:425
CommonTapeImplementation(CommonTapeImplementation const &)=delete
Do not allow copy construction.
Position getPosition() const
Current position of the tape.
Definition commonTapeImplementation.hpp:665
void writeTape(codi::TapeWriterInterface< Type > &writeToFileRef, Position const &start, Position const &end)
For partial-tape writers using a manually generated writers.
Definition commonTapeImplementation.hpp:628
void setParameter(TapeParameters parameter, size_t value)
See Parameters functions.
Definition commonTapeImplementation.hpp:459
void evaluateForward(AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Perform a forward evaluation of a part of the tape. It has to hold start <= end.
Definition commonTapeImplementation.hpp:592
void resetHard()
Delete everything and return to the state after construction, as far as possible.
Definition commonTapeImplementation.hpp:375
void setPrimal(Identifier const &identifier, Real const &primal)
Set primal value.
Definition commonTapeImplementation.hpp:733
void setGradient(Identifier const &identifier, Gradient const &gradient, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Set the gradient.
Definition commonTapeImplementation.hpp:274
size_t manualPushCounter
Count the pushes after storeManual, to identify the last push.
Definition commonTapeImplementation.hpp:161
typename CommonTapeTypes< ImplTapeTypes >::LowLevelFunctionByteData LowLevelFunctionByteData
See CommonTapeTypes.
Definition commonTapeImplementation.hpp:144
void printStatistics(Stream &out=std::cout) const
Default formatting of TapeValues.
Definition commonTapeImplementation.hpp:326
LowLevelFunctionInfoData llfInfoData
Token and size data for low level functions.
Definition commonTapeImplementation.hpp:155
typename ImplTapeTypes::Gradient Gradient
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:138
void deactivateValue(LhsExpressionInterface< Real, Gradient, Impl, Lhs > &value)
Definition commonTapeImplementation.hpp:655
Position getZeroPosition() const
Initial position of the tape.
Definition commonTapeImplementation.hpp:670
Identifier manualPushLhsIdentifier
For storeManual, remember the identifier assigned to the lhs.
Definition commonTapeImplementation.hpp:159
void deleteData()
See File IO functions.
Definition commonTapeImplementation.hpp:420
void readFromFile(const std::string &filename)
See File IO functions.
Definition commonTapeImplementation.hpp:413
typename CommonTapeTypes< ImplTapeTypes >::LowLevelFunctionInfoData LowLevelFunctionInfoData
See CommonTapeTypes.
Definition commonTapeImplementation.hpp:142
void setActive()
Start/continue recording of statements.
Definition commonTapeImplementation.hpp:308
Real const & getPrimal(Identifier const &identifier) const
Get primal value.
Definition commonTapeImplementation.hpp:738
TemporaryMemory & getTemporaryMemory()
Temporary memory that can be used for dynamic data both during the evaluation and the recording.
Definition commonTapeImplementation.hpp:554
bool hasParameter(TapeParameters parameter) const
See Parameters functions.
Definition commonTapeImplementation.hpp:453
bool isActive() const
Check if the tape is recording.
Definition commonTapeImplementation.hpp:320
TapeValues internalGetTapeValues() const
Create tape values.
CommonTapeImplementation & operator=(CommonTapeImplementation &&)=delete
Do not allow move assignment. Relevant use cases should be covered by swap.
void deleteLowLevelFunctionData(Position const &pos)
Delete all external function data up to pos.
Definition commonTapeImplementation.hpp:679
size_t manualPushGoal
Store the number of expected pushes after a storeManual call.
Definition commonTapeImplementation.hpp:160
Identifier getPassiveIndex() const
Identifier for passive values. Usually 0.
Definition commonTapeImplementation.hpp:639
void init(typename ImplTapeTypes::NestedData *nested)
Initialize the base class.
Definition commonTapeImplementation.hpp:751
void reset(bool resetAdjoints=true, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Reset the tape to the initial state for a fresh recording.
Definition commonTapeImplementation.hpp:355
TemporaryMemory allocator
Allocator for temporary memory.
Definition commonTapeImplementation.hpp:163
LowLevelFunctionByteData NestedData
Shorthand.
Definition commonTapeImplementation.hpp:147
typename LowLevelFunctionByteData::Position NestedPosition
Shorthand.
Definition commonTapeImplementation.hpp:148
bool active
Whether or not the tape is in recording mode.
Definition commonTapeImplementation.hpp:152
std::set< TapeParameters > options
All options.
Definition commonTapeImplementation.hpp:153
void printTableHeader(Stream &out=std::cout) const
Table header output of TapeValues.
Definition commonTapeImplementation.hpp:332
CommonTapeImplementation & operator=(CommonTapeImplementation const &)=delete
Do not allow copy assignment.
Identifier getInvalidIndex() const
Invalid identifier.
Definition commonTapeImplementation.hpp:644
void printTableRow(Stream &out=std::cout) const
Table row output of TapeValues.
Definition commonTapeImplementation.hpp:338
bool isIdentifierActive(Identifier const &index) const
Definition commonTapeImplementation.hpp:649
TapeValues getTapeValues() const
Get current tape values.
Definition commonTapeImplementation.hpp:343
T_ImplTapeTypes ImplTapeTypes
See CommonTapeImplementation.
Definition commonTapeImplementation.hpp:134
void writeTape(std::unique_ptr< TapeWriterInterface< Type > > writer)
For full-tape writers using a smart pointer.
Definition commonTapeImplementation.hpp:605
void writeTape(codi::TapeWriterInterface< Type > &writeToFileRef)
For full-tape writers using a manually generated writers.
Definition commonTapeImplementation.hpp:620
T_Impl Impl
See CommonTapeImplementation.
Definition commonTapeImplementation.hpp:135
void evaluate(AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Perform a full reverse evaluation of the tape.
Definition commonTapeImplementation.hpp:293
void swap(Impl &other)
Swap all data with an other tape.
Definition commonTapeImplementation.hpp:368
typename CommonTapeTypes< ImplTapeTypes >::Position Position
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:145
void writeTape(std::unique_ptr< TapeWriterInterface< Type > > writer, Position const &start, Position const &end)
For partial-tape writers using a smart pointer.
Definition commonTapeImplementation.hpp:613
LowLevelFunctionByteData llfByteData
Byte data for low level functions.
Definition commonTapeImplementation.hpp:156
void resetTo(Position const &pos, bool resetAdjoints=true, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Reset the tape to the provided position.
Definition commonTapeImplementation.hpp:704
void incrementManualPushCounter()
Increment the manual push counter. Check against the declared push goal.
Definition commonTapeImplementation.hpp:211
Config::LowLevelFunctionToken registerLowLevelFunction(LowLevelFunctionEntry< Impl, Real, Identifier > const &entry)
Register a low level function on the tape.
Definition commonTapeImplementation.hpp:559
void registerOutput(LhsExpressionInterface< Real, Gradient, Impl, Lhs > &value)
Definition commonTapeImplementation.hpp:301
typename ImplTapeTypes::Identifier Identifier
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:139
CommonTapeImplementation()
Constructor.
Definition commonTapeImplementation.hpp:232
void initializeManualPushData(Real const &lhsValue, Identifier const &lhsIndex, size_t size)
Initialize all manual push data, including the counter. Check that a previous manual store is complet...
Definition commonTapeImplementation.hpp:200
void pushExternalFunction(ExternalFunction< Impl > const &extFunc)
Definition commonTapeImplementation.hpp:578
size_t getParameter(TapeParameters parameter) const
See Parameters functions.
Definition commonTapeImplementation.hpp:431
void evaluatePrimal()
Perform a full (forward) reevaluation of the primals in the tape.
Definition commonTapeImplementation.hpp:726
void writeToFile(const std::string &filename)
See File IO functions.
Definition commonTapeImplementation.hpp:406
void internalStoreLowLevelFunction(Config::LowLevelFunctionToken token, size_t size, ByteDataView &dataView)
Called by the implementing tapes to store a low level function. The size is reserved and allocated....
Definition commonTapeImplementation.hpp:494
Declares all types used in the CommonTapeImplementation.
Definition commonTapeImplementation.hpp:86
typename TapeTypes::template Data< Chunk, Nested > Data
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:92
typename TapeTypes::NestedData NestedData
See TapeTypesInterface.
Definition commonTapeImplementation.hpp:94
Data< LowLevelFunctionInfoChunk, NestedData > LowLevelFunctionInfoData
Token and size data for low level functions.
Definition commonTapeImplementation.hpp:99
typename LowLevelFunctionByteData::Position Position
Global position of the tape.
Definition commonTapeImplementation.hpp:106
Data< LowLevelFunctionByteChunk, LowLevelFunctionInfoData > LowLevelFunctionByteData
Byte data for low level functions.
Definition commonTapeImplementation.hpp:104
T_TapeTypes TapeTypes
See CommonTapeTypes.
Definition commonTapeImplementation.hpp:89
Data stream interface for tape data. Encapsulates data that is written e.g. for each statement or arg...
Definition dataInterface.hpp:149
static void notifyTapeRegisterOutputListeners(Tape &tape, Real &value, Identifier &identifier)
Invoke callbacks for TapeRegisterOutput events.
Definition eventSystem.hpp:453
static void notifyTapeResetListeners(Tape &tape, Position const &position, EventHints::Reset kind, bool clearAdjoints)
Invoke callbacks for TapeReset events.
Definition eventSystem.hpp:521
static void notifyTapeStopRecordingListeners(Tape &tape)
Invoke callbacks for TapeStopRecording events.
Definition eventSystem.hpp:396
static void notifyTapeStartRecordingListeners(Tape &tape)
Invoke callbacks for TapeStartRecording events.
Definition eventSystem.hpp:370
Base class for all CoDiPack expressions.
Definition expressionInterface.hpp:59
Low level function entry implementation for external functions.
Definition externalFunction.hpp:178
static void store(Tape &tape, Config::LowLevelFunctionToken token, ExtFunc const &extFunc)
Store an external function on the tape.
Definition externalFunction.hpp:212
User-defined evaluation functions for the taping process.
Definition externalFunction.hpp:102
Helper structure for writing binary data.
Definition fileIo.hpp:84
Full tape interface that supports all features of CoDiPack.
Definition fullTapeInterface.hpp:84
Gradient & gradient(Identifier const &identifier, AdjointsManagement adjointsManagement=AdjointsManagement::Automatic)
Reference access to gradient.
Indices enable the mapping of primal values to their adjoint counterparts.
Definition indexManagerInterface.hpp:78
Base class for all CoDiPack lvalue expression.
Definition lhsExpressionInterface.hpp:63
Real const & getValue() const
Get the primal value of this lvalue.
Definition lhsExpressionInterface.hpp:125
Impl & cast()
Cast to the implementation.
Definition lhsExpressionInterface.hpp:99
Low level function entry on the tape. See LowLevelFunctionTapeInterface for details.
Definition lowLevelFunctionEntry.hpp:67
Real & primal(Identifier const &identifier)
Writable reference to primal value.
Interface for the definition of tape types.
Definition commonTapeImplementation.hpp:64
int Real
Primal computation type, e.g. double.
Definition commonTapeImplementation.hpp:67
int Gradient
Gradient computation type, e.g. double or Direction.
Definition commonTapeImplementation.hpp:68
int Identifier
Identifier for the internal management, e.g. int.
Definition commonTapeImplementation.hpp:69
Tape information that can be printed in a pretty print format or a table format.
Definition tapeValues.hpp:75
void addSection(std::string const &name)
Add section. All further entries are added under this section.
Definition tapeValues.hpp:158
The interface used by all the tape writers. The tape writers are used to generate text,...
Definition tapeReaderWriterInterface.hpp:128
Allocator for temporary used memory.
Definition temporaryMemory.hpp:54