Identifiers are created in a linear fashion. Each assign creates a new index which is counted up. More...
#include <linearIndexManager.hpp>
Public Types | |
using | Base = IndexManagerInterface<Index> |
Base class abbreviation. | |
using | Index = T_Index |
See LinearIndexManager. | |
DataInterface: Type declaration | |
using | Position = Index |
Positions coincide with indices. | |
using | NestedData = void |
Terminator, no further nested data. | |
using | InternalPosHandle = size_t |
Internal positions coincide with positions. | |
Public Types inherited from codi::IndexManagerInterface< T_Index > | |
using | Index = T_Index |
See IndexManagerInterface. | |
Public Types inherited from codi::DataInterface< T_NestedData, T_InternalPosHandle > | |
using | InternalPosHandle = T_InternalPosHandle |
See DataInterface. | |
using | NestedData = T_NestedData |
See DataInterface. | |
using | Position = EmptyPosition |
Contains position data for this DataInterface and all nested interfaces. | |
Public Member Functions | |
LinearIndexManager (Index reservedIndices) | |
Constructor. | |
IndexManagerInterface: Methods | |
void | addToTapeValues (TapeValues &values) const |
Add storage and other information to the tape values. | |
template<typename Tape > | |
void | freeIndex (Index &index) const |
Call on destruction of a primal value. Usually called from the destructor. | |
template<typename Tape > | |
bool | assignIndex (Index &index) |
Call on assignment of a primal value, e.g. on w for w = a + b . | |
template<typename Tape > | |
bool | assignUnusedIndex (Index &index) |
Call on registering input values. | |
template<typename Tape > | |
void | copyIndex (Index &lhs, Index const &rhs) |
Call on copy of a primal value, e.g. w = a . | |
Index | getLargestCreatedIndex () const |
Returns the largest created index. | |
DataInterface: Methods | |
template<typename TargetPosition > | |
TargetPosition | extractPosition (Position const &pos) const |
Extract the position of a nested DataInterface from the global position object provide by this interface. | |
size_t | getDataSize () const |
Position | getPosition () const |
size_t | getPushedDataCount (InternalPosHandle const &startPos) |
Position | getZeroPosition () const |
void | pushData () |
Add data to the storage allocated by the implementation. The method can only be called after a call to reserveItems and only as often as the number of reserved items. | |
InternalPosHandle | reserveItems (size_t const &items) |
Reserve this many items on the data stream. See pushData for details. | |
void | resize (size_t const &totalSize) |
void | resetTo (Position const &pos) |
void | reset () |
void | resetHard () |
void | erase (Position const &start, Position const &end, bool recursive=true) |
void | setNested (NestedData *v) |
void | swap (LinearIndexManager< Index > &other) |
template<int selectedDepth = -1, typename FunctionObject , typename... Args> | |
void | evaluateForward (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces. | |
template<int selectedDepth = -1, typename FunctionObject , typename... Args> | |
void | evaluateReverse (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces. | |
template<typename FunctionObject , typename... Args> | |
void | forEachChunk (FunctionObject &function, bool recursive, Args &&... args) |
Calls the function object for each continuous segment of data. | |
template<typename FunctionObject , typename... Args> | |
void | forEachForward (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Calls the function object for each item in the data stream. This call is not recursive. | |
template<typename FunctionObject , typename... Args> | |
void | forEachReverse (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Calls the function object for each item in the data stream. This call is not recursive. | |
Public Member Functions inherited from codi::IndexManagerInterface< T_Index > | |
void | addToTapeValues (TapeValues &values) const |
Add storage and other information to the tape values. | |
Index | getLargestCreatedIndex () const |
Returns the largest created index. | |
template<typename Tape > | |
bool | assignIndex (Index &index) |
Call on assignment of a primal value, e.g. on w for w = a + b . | |
template<typename Tape > | |
bool | assignUnusedIndex (Index &index) |
Call on registering input values. | |
template<typename Tape > | |
void | copyIndex (Index &lhs, Index const &rhs) |
Call on copy of a primal value, e.g. w = a . | |
template<typename Tape > | |
void | freeIndex (Index &index) |
Call on destruction of a primal value. Usually called from the destructor. | |
void | reset () |
Reset for a new recording. | |
Public Member Functions inherited from codi::DataInterface< T_NestedData, T_InternalPosHandle > | |
void | addDataSize (size_t const &size) |
Add this many items to the data stream, after the data has been manipulated via pointers obtained from getDataPointers(). | |
template<typename... Data> | |
void | getDataPointers (Data *&... pointers) |
Get pointers to the data from the storage implementation. The method can only be called after a call to reserveItems() and data can only be accessed from 0 to the number given by reserveItems (excluding). Afterwards, addDataSize() needs to be called with the actual number of elements that have been written. | |
template<typename... Data> | |
void | pushData (Data const &... data) |
Add data to the storage allocated by the implementation. The method can only be called after a call to reserveItems and only as often as the number of reserved items. | |
InternalPosHandle | reserveItems (size_t const &items) |
Reserve this many items on the data stream. See pushData for details. | |
void | resize (size_t const &totalSize) |
void | reset () |
void | resetHard () |
void | resetTo (Position const &pos) |
void | erase (Position const &start, Position const &end, bool recursive=true) |
size_t | getDataSize () const |
Position | getPosition () const |
size_t | getPushedDataCount (InternalPosHandle const &startPos) |
Position | getZeroPosition () const |
void | addToTapeValues (TapeValues &values) const |
Add amount of stored data to the TapeValues object. Not called on the nested vector. | |
template<typename TargetPosition > | |
TargetPosition | extractPosition (Position const &pos) const |
Extract the position of a nested DataInterface from the global position object provide by this interface. | |
void | setNested (NestedData *v) |
void | swap (DataInterface &other) |
template<int selectedDepth = -1, typename FunctionObject , typename... Args> | |
void | evaluateForward (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces. | |
template<int selectedDepth = -1, typename FunctionObject , typename... Args> | |
void | evaluateReverse (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces. | |
template<typename FunctionObject , typename... Args> | |
void | forEachChunk (FunctionObject &function, bool recursive, Args &&... args) |
Calls the function object for each continuous segment of data. | |
template<typename FunctionObject , typename... Args> | |
void | forEachForward (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Calls the function object for each item in the data stream. This call is not recursive. | |
template<typename FunctionObject , typename... Args> | |
void | forEachReverse (Position const &start, Position const &end, FunctionObject function, Args &&... args) |
Calls the function object for each item in the data stream. This call is not recursive. | |
Static Public Attributes | |
IndexManagerInterface: Constants | |
static bool constexpr | CopyNeedsStatement = false |
Copy optimization is implemented. | |
static bool constexpr | IsLinear = true |
Tightly coupled to statements. | |
static bool constexpr | NeedsStaticStorage = false |
Linear indices are not meaningful across tape instances. | |
Static Public Attributes inherited from codi::IndexManagerInterface< T_Index > | |
static Index constexpr | InactiveIndex = Index(0) |
Default inactive index for all index managers. | |
static Index constexpr | InvalidIndex |
Default invalid index for all index mangers (max value for unsigned types). | |
static bool constexpr | CopyNeedsStatement |
True if no copy optimization is implemented. See IndexManagerInterface. | |
static bool constexpr | IsLinear |
True if identifiers are coupled to the statements. See IndexManagerInterface. | |
static bool constexpr | NeedsStaticStorage = false |
True if the index manager is specific to a tape type (and not a tape instance). See IndexManagerInterface. | |
Identifiers are created in a linear fashion. Each assign creates a new index which is counted up.
A simple copy optimization is implemented here. Since each index is only bound to one primal value, the index can simply be copied.
Mathematical and implementational details are explained in SBG2021Index.
Since this index manager is tightly coupled to the statements, it is specific to a tape instance and requires non-static storage.
Since there is a one-to-one relation between tape and index manager for linear index managers, this index manager is thread-safe. Due to its linear nature, however, it can only be used to record tapes in parallel that do not depend on each other.
T_Index | Type for the identifier, usually an integer type. |
|
inline |
Add storage and other information to the tape values.
[in,out] | values | Will only create new data entries and no new section. Implementation: Adds maximum live indices. |
|
inline |
Call on assignment of a primal value, e.g. on w
for w = a + b
.
|
inline |
Call on registering input values.
|
inline |
Call on copy of a primal value, e.g. w = a
.
|
inline |
Erase the given range of data. Implementations may choose to free allocated memory. The parameter recursive controls whether erase is also called on nested interfaces. Implementation: Empty. Linear index management depends on indices being handed out in a contiguous fashion, and deleting a range of indices is not meaningful.
|
inline |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces.
func is called for each region of continuous data that is valid for all nested DataInterfaces. func is then called as
What kind of data is appended by each DataInterface is implementation dependent. The default is the set (start, end, dataEntry1, dataEntry2, etc.) which is appended.
It has to hold start <= end.
Positions count up in this call.
[in] | start | Starting position. |
[in] | end | Ending position. |
[in] | function | Function object called. |
[in,out] | args | Additional arguments for the function object. |
selectedDepth | Selected depth for the recursion into nested data interfaces. 0 means that only the data from this interface is used. A value of 1 means that the data from the first nested interface is used, etc.. A value of -1 can be used to select the innermost interface, regardless of the number of nested interfaces. |
FunctionObject | Function object which is called. |
Args | Arguments for the function object. This is a terminating DataInterface. The function object is always called and selectedDepth can be ignored. |
|
inline |
Evaluates the function object with segments of continuous and valid data for all nested DataInterfaces.
Same as evaluateForward. It has to hold start >= end. Positions count down in this call.
[in] | start | Starting position. |
[in] | end | Ending position. |
[in] | function | Function object called. |
[in,out] | args | Additional arguments for the function object. |
selectedDepth | Selected depth for the recursion into nested data interfaces. 0 means that only the data from this interface is used. A value of 1 means that the data from the first nested interface is used, etc.. A value of -1 can be used to select the innermost interface, regardless of the number of nested interfaces. |
FunctionObject | Function object which is called. |
Args | Arguments for the function object. This is a terminating DataInterface. The function object is always called and selectedDepth can be ignored. |
|
inline |
Extract the position of a nested DataInterface from the global position object provide by this interface.
[in] | pos | Position of the DataInterface. |
TargetPosition | Position definition of a nested DataInterface. |
|
inline |
Calls the function object for each continuous segment of data.
The call is
Chunk is of the type ChunkBase.
[in] | function | Function object called. |
[in] | recursive | True if same call should be performed for all nested DataInterfaces. |
[in,out] | args | Additional arguments for the function object. |
FunctionObject | Function object which is called. |
Args | Arguments for the function object. |
|
inline |
Calls the function object for each item in the data stream. This call is not recursive.
The call to function is
It has to hold start <= end.
[in] | start | Starting position. |
[in] | end | Ending position |
[in] | function | Function object called. |
[in,out] | args | Additional arguments for the function object. |
FunctionObject | Function object which is called. |
Args | Arguments for the function object. |
|
inline |
Calls the function object for each item in the data stream. This call is not recursive.
See forEachForward.
It has to hold start >= end.
[in] | start | Starting position. |
[in] | end | Ending position |
[in] | function | Function object called. |
[in,out] | args | Additional arguments for the function object. |
FunctionObject | Function object which is called. |
Args | Arguments for the function object. |
|
inline |
Call on destruction of a primal value. Usually called from the destructor.
Implementation: Freed indices are ignored.
|
inline |
|
inline |
Returns the largest created index.
This is the largest entry in the adjoint vectors created by the tapes. The following properties are specific to the LinearIndexManager:
|
inline |
|
inline |
Compute the number of data items stored after a call to reserveItems.
|
inline |
|
inline |
Add data to the storage allocated by the implementation. The method can only be called after a call to reserveItems and only as often as the number of reserved items.
pushData() can be called less often than indicated with reserveItems(). The call to reserveItems only represents the maximum number of data items that can be pushed safely.
After a new call to reserveItems(), only this many number of data items can be pushed, leftovers will not accumulate.
For an example of how to use pushData, please see the DataInterface documentation.
[in] | data | The number of arguments has to match the number of data stores of the implementation. |
Data | Types of the pushed data. |
|
inline |
Reserve this many items on the data stream. See pushData for details.
[in] | items | Number of data items to reserve. |
|
inline |
Reset to the zero position. Data is not deallocated. Also called on nested interfaces.
|
inline |
Reset to the zero position. Data is deallocated and the default size is allocated again. Also called on nested interfaces.
|
inline |
Reset to the given position. Data is not deallocated. Also called on the nested interfaces.
|
inline |
Allocate the requested number of data items.
|
inline |
Set the pointer to the nested vector. Needs to be done before any other action and only once.
|
inline |
Swap with other DataInterface of the same type.