ADOL-C: Automatic Differentiation in C/C++ 2.7.3
Loading...
Searching...
No Matches
infotype.h
Go to the documentation of this file.
1#ifndef ADOLC_INFO_TYPE_H
2#define ADOLC_INFO_TYPE_H
3
4#include <adolc/adolcerror.h>
5#include <adolc/dvlparms.h>
6#include <adolc/internal/usrparms.h> // ADOLC_IO_CHUNK_SIZE
8#include <array>
9#include <concepts>
10#include <cstddef>
11#include <cstdio>
12#include <type_traits>
13#include <utility>
14
15/*
16 This header defines the small policy interface used by ADOL-C tape I/O code.
17
18 The Info structs (OpInfo, LocInfo, ValInfo, TayInfo) are stateless adapters:
19 - they select the concrete buffer stored in a buffer context,
20 - they name the metadata entries that higher-level code stores in TapeInfos,
21 - they provide tape-specific hooks for forward/reverse sweeps.
22
23 The important split is intentional: Info adapters operate on a buffer context,
24 while metadata values are passed as an explicit stats array to the operations
25 that need them.
26*/
27
28namespace ADOLC::detail {
29
30template <class Info, class BufferContext>
31using InfoBufferType = std::remove_cvref_t<decltype(Info::getBuffer(
32 std::declval<BufferContext &>()))>;
33
42template <class T, class BufferContext, class ErrorType>
43concept InfoType =
44 requires(BufferContext &context, const BufferContext &constContext,
45 size_t blockSize) {
46 typename T::value_type;
48 typename T::value_type>;
49
50 { T::fileIndex } -> std::convertible_to<size_t>;
51 { T::num } -> std::same_as<const typename BufferContext::StatEntries &>;
52 { T::error } -> std::convertible_to<ErrorType>;
53 { T::chunkSize } -> std::convertible_to<size_t>;
54 { T::removeExistingBeforeWrite } -> std::convertible_to<bool>;
55 { T::openWriteMode } -> std::convertible_to<const char *>;
56
57 {
58 T::getBuffer(context)
59 } -> std::same_as<InfoBufferType<T, BufferContext> &>;
60 {
61 T::getBuffer(constContext)
62 } -> std::same_as<const InfoBufferType<T, BufferContext> &>;
63
64 T::ensureReverseReadable(context, blockSize);
65 {
66 T::reverseSeekOffset(constContext, blockSize)
67 } -> std::convertible_to<long>;
68 T::updateBufferStatsForward(context, blockSize);
69 T::updateBufferStatsReverse(context, blockSize);
70 T::updateBufferPositionForward(context);
71 T::updateBufferPositionReverse(context, blockSize);
72 T::prepareForwardPosition(context, blockSize);
73 };
74
82template <class Derived, class BufferContext, typename ValueType>
84 using value_type = ValueType;
85 using StatEntries = typename BufferContext::StatEntries;
86
87 static constexpr bool removeExistingBeforeWrite = true;
88 static constexpr const char *openWriteMode = "wb";
89
90 static void ensureReverseReadable(BufferContext & /*context*/,
91 size_t /*blockSize*/) {}
92
93 static long reverseSeekOffset(const BufferContext &context,
94 size_t blockSize) {
95 const auto &buffer = Derived::getBuffer(context);
96 return static_cast<long>(sizeof(value_type) *
97 (buffer.numOnTape() - blockSize));
98 }
99
100 static void updateBufferStatsForward(BufferContext &context,
101 size_t blockSize) {
102 auto &buffer = Derived::getBuffer(context);
103 buffer.numOnTape(buffer.numOnTape() - blockSize);
104 }
105
106 static void updateBufferStatsReverse(BufferContext &context,
107 size_t blockSize) {
108 auto &buffer = Derived::getBuffer(context);
109 buffer.numOnTape(buffer.numOnTape() - blockSize);
110 }
111
112 static void updateBufferPositionForward(BufferContext &context) {
113 Derived::getBuffer(context).position(0);
114 }
115
116 static void updateBufferPositionReverse(BufferContext &context,
117 size_t blockSize) {
118 Derived::getBuffer(context).position(blockSize);
119 }
120
121 static void prepareForwardPosition(BufferContext &context,
122 size_t /*blockSize*/) {
123 Derived::getBuffer(context).position(0);
124 }
125};
126
130template <class BufferContext, class EType>
131struct OpInfo
132 : InfoAdapter<OpInfo<BufferContext, EType>, BufferContext, unsigned char> {
135 using value_type = typename Base::value_type;
137
138 static constexpr StatEntries num = BufferContext::NUM_OPERATIONS;
139 static constexpr StatEntries fileAccess = BufferContext::OP_FILE_ACCESS;
140 static constexpr StatEntries bufferSize = BufferContext::OP_BUFFER_SIZE;
141 static constexpr size_t fileIndex = 0;
142
143 static constexpr EType error = EType::OP_READ_FAILED;
144 static constexpr size_t chunkSize = ADOLC_IO_CHUNK_SIZE / sizeof(value_type);
145
146 static OpBuffer &getBuffer(BufferContext &context) {
147 return context.opBuffer_;
148 }
149 static const OpBuffer &getBuffer(const BufferContext &context) {
150 return context.opBuffer_;
151 }
152};
153
157template <class BufferContext, class EType>
159 : InfoAdapter<LocInfo<BufferContext, EType>, BufferContext, size_t> {
162 using value_type = typename Base::value_type;
164
165 static constexpr StatEntries num = BufferContext::NUM_LOCATIONS;
166 static constexpr StatEntries fileAccess = BufferContext::LOC_FILE_ACCESS;
167 static constexpr StatEntries bufferSize = BufferContext::LOC_BUFFER_SIZE;
168 static constexpr size_t fileIndex = 1;
169
170 static constexpr EType error = EType::LOC_READ_FAILED;
171 static constexpr size_t chunkSize = ADOLC_IO_CHUNK_SIZE / sizeof(value_type);
172
173 static LocBuffer &getBuffer(BufferContext &context) {
174 return context.locBuffer_;
175 }
176 static const LocBuffer &getBuffer(const BufferContext &context) {
177 return context.locBuffer_;
178 }
179
180 static void updateBufferPositionReverse(BufferContext &context,
181 size_t blockSize) {
182 auto &buffer = getBuffer(context);
183 const auto loc = blockSize - buffer[blockSize - 1];
184 buffer.position(loc);
185 }
186
187 static void prepareForwardPosition(BufferContext &context, size_t blockSize) {
188 size_t numLocsForStats = statSpace;
189 while (numLocsForStats >= blockSize) {
190 context.template loadBlockIntoBufferForward<Self>(blockSize);
191 numLocsForStats -= blockSize;
192 }
193 getBuffer(context).position(numLocsForStats);
194 }
195};
196
200template <class BufferContext, class EType>
202 : InfoAdapter<ValInfo<BufferContext, EType>, BufferContext, double> {
205 using value_type = typename Base::value_type;
207
208 static constexpr StatEntries num = BufferContext::NUM_VALUES;
209 static constexpr StatEntries fileAccess = BufferContext::VAL_FILE_ACCESS;
210 static constexpr StatEntries bufferSize = BufferContext::VAL_BUFFER_SIZE;
211 static constexpr size_t fileIndex = 2;
212
213 static constexpr EType error = EType::VAL_READ_FAILED;
214 static constexpr size_t chunkSize = ADOLC_IO_CHUNK_SIZE / sizeof(value_type);
215
216 static ValBuffer &getBuffer(BufferContext &context) {
217 return context.valBuffer_;
218 }
219 static const ValBuffer &getBuffer(const BufferContext &context) {
220 return context.valBuffer_;
221 }
222
223 static void updateBufferPositionForward(BufferContext &context) {
224 getBuffer(context).position(0);
225 context.locBuffer_.advance();
226 }
227
228 static void updateBufferPositionReverse(BufferContext &context,
229 size_t blockSize) {
230 getBuffer(context).position(blockSize -
231 context.locBuffer_.retreatAndRead());
232 }
233};
234
238template <class BufferContext, class EType>
240 : InfoAdapter<TayInfo<BufferContext, EType>, BufferContext, double> {
243 using value_type = typename Base::value_type;
245
246 static constexpr StatEntries num = BufferContext::NUM_TAYS;
247 static constexpr StatEntries bufferSize = BufferContext::TAY_BUFFER_SIZE;
248 static constexpr size_t fileIndex = 3;
249 static constexpr bool removeExistingBeforeWrite = false;
250 static constexpr const char *openWriteMode = "w+b";
251
252 static constexpr EType error = EType::TAY_READ_FAILED;
253 static constexpr size_t chunkSize = ADOLC_IO_CHUNK_SIZE / sizeof(value_type);
254
255 static TayBuffer &getBuffer(BufferContext &context) {
256 return context.tayBuffer_;
257 }
258 static const TayBuffer &getBuffer(const BufferContext &context) {
259 return context.tayBuffer_;
260 }
261
262 static void ensureReverseReadable(BufferContext &context, size_t blockSize) {
263 if (getBuffer(context).position() == 0) {
264 context.template loadBlockIntoBufferReverse<Self>(blockSize);
265 }
266 }
267
268 static long reverseSeekOffset(const BufferContext &context,
269 size_t blockSize) {
270 return static_cast<long>(sizeof(value_type) *
271 (context.nextBufferNumber * blockSize));
272 }
273
274 static void updateBufferStatsReverse(BufferContext &context,
275 size_t /*blockSize*/) {
276 context.lastTayBlockInCore = 0;
277 --context.nextBufferNumber;
278 }
279};
280
282template <typename BufferContext, typename ErrorType,
283 InfoType<BufferContext, ErrorType> Info>
284static size_t write(BufferContext &context, size_t chunk, size_t size) {
285 auto &buffer = Info::getBuffer(context);
286 return fwrite(buffer.begin() + (chunk * Info::chunkSize),
287 size * sizeof(typename Info::value_type), 1, buffer.file());
288}
289
290} // namespace ADOLC::detail
291
292#endif // ADOLC_INFO_TYPE_H
size_t position() const
Returns the current buffer index.
Definition bufferstate.h:260
Concept describing the primitive buffer/file interface used by tape I/O code.
Definition bufferstate.h:27
Concept describing the required interface of a tape Info adapter.
Definition infotype.h:43
#define statSpace
Definition dvlparms.h:44
Definition bufferstate.h:12
std::remove_cvref_t< decltype(Info::getBuffer(std::declval< BufferContext & >()))> InfoBufferType
Definition infotype.h:32
Common compile-time interface for operation, location, value, and Taylor tape buffers.
Definition infotype.h:83
static void ensureReverseReadable(BufferContext &, size_t)
Definition infotype.h:90
static constexpr bool removeExistingBeforeWrite
Definition infotype.h:87
static constexpr const char * openWriteMode
Definition infotype.h:88
static long reverseSeekOffset(const BufferContext &context, size_t blockSize)
Definition infotype.h:93
static void prepareForwardPosition(BufferContext &context, size_t)
Definition infotype.h:121
static void updateBufferPositionForward(BufferContext &context)
Definition infotype.h:112
static void updateBufferStatsForward(BufferContext &context, size_t blockSize)
Definition infotype.h:100
static void updateBufferStatsReverse(BufferContext &context, size_t blockSize)
Definition infotype.h:106
ValueType value_type
Definition infotype.h:84
static void updateBufferPositionReverse(BufferContext &context, size_t blockSize)
Definition infotype.h:116
typename BufferContext::StatEntries StatEntries
Definition infotype.h:85
Adapter for the locations tape (loc tape).
Definition infotype.h:159
static constexpr size_t chunkSize
Definition infotype.h:171
static void prepareForwardPosition(BufferContext &context, size_t blockSize)
Definition infotype.h:187
static constexpr EType error
Definition infotype.h:170
static void updateBufferPositionReverse(BufferContext &context, size_t blockSize)
Definition infotype.h:180
typename Base::StatEntries StatEntries
Definition infotype.h:163
static constexpr size_t fileIndex
Definition infotype.h:168
typename Base::value_type value_type
Definition infotype.h:162
static constexpr StatEntries bufferSize
Definition infotype.h:167
static LocBuffer & getBuffer(BufferContext &context)
Definition infotype.h:173
static constexpr StatEntries num
Definition infotype.h:165
static constexpr StatEntries fileAccess
Definition infotype.h:166
static const LocBuffer & getBuffer(const BufferContext &context)
Definition infotype.h:176
Adapter for the operations tape (op tape).
Definition infotype.h:132
typename Base::value_type value_type
Definition infotype.h:135
static constexpr StatEntries bufferSize
Definition infotype.h:140
static constexpr size_t chunkSize
Definition infotype.h:144
static constexpr StatEntries fileAccess
Definition infotype.h:139
static constexpr StatEntries num
Definition infotype.h:138
static constexpr size_t fileIndex
Definition infotype.h:141
static constexpr EType error
Definition infotype.h:143
static const OpBuffer & getBuffer(const BufferContext &context)
Definition infotype.h:149
typename Base::StatEntries StatEntries
Definition infotype.h:136
static OpBuffer & getBuffer(BufferContext &context)
Definition infotype.h:146
Adapter for the Taylor tape (tay tape).
Definition infotype.h:240
static constexpr size_t chunkSize
Definition infotype.h:253
typename Base::value_type value_type
Definition infotype.h:243
typename Base::StatEntries StatEntries
Definition infotype.h:244
static TayBuffer & getBuffer(BufferContext &context)
Definition infotype.h:255
static constexpr const char * openWriteMode
Definition infotype.h:250
static void updateBufferStatsReverse(BufferContext &context, size_t)
Definition infotype.h:274
static constexpr size_t fileIndex
Definition infotype.h:248
static constexpr StatEntries bufferSize
Definition infotype.h:247
static constexpr bool removeExistingBeforeWrite
Definition infotype.h:249
static long reverseSeekOffset(const BufferContext &context, size_t blockSize)
Definition infotype.h:268
static const TayBuffer & getBuffer(const BufferContext &context)
Definition infotype.h:258
static constexpr EType error
Definition infotype.h:252
static void ensureReverseReadable(BufferContext &context, size_t blockSize)
Definition infotype.h:262
static constexpr StatEntries num
Definition infotype.h:246
Adapter for the values tape (val tape).
Definition infotype.h:202
static const ValBuffer & getBuffer(const BufferContext &context)
Definition infotype.h:219
static constexpr StatEntries fileAccess
Definition infotype.h:209
typename Base::value_type value_type
Definition infotype.h:205
static constexpr size_t chunkSize
Definition infotype.h:214
static constexpr size_t fileIndex
Definition infotype.h:211
static constexpr EType error
Definition infotype.h:213
static constexpr StatEntries num
Definition infotype.h:208
static void updateBufferPositionForward(BufferContext &context)
Definition infotype.h:223
static ValBuffer & getBuffer(BufferContext &context)
Definition infotype.h:216
static constexpr StatEntries bufferSize
Definition infotype.h:210
typename Base::StatEntries StatEntries
Definition infotype.h:206
static void updateBufferPositionReverse(BufferContext &context, size_t blockSize)
Definition infotype.h:228
#define ADOLC_IO_CHUNK_SIZE
Definition usrparms.h:68