40#include <codi/tools/lowlevelFunctions/eigenWrappers.hpp>
41#include <codi/tools/lowlevelFunctions/generationHelperCoDiPack.hpp>
42#include <codi/tools/lowlevelFunctions/lowLevelFunctionCreationUtilities.hpp>
47 template<Eigen::StorageOptions eigenStore,
typename Type>
49 using Real =
typename Type::Real;
54 using Tape =
typename Type::Tape;
69 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
70 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
71 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
72 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
73 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
74 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
77 typename LLFH::ActivityStoreType activityStore = {};
78 typename Trait_A::ArgumentStore A_store = {};
79 typename Trait_B::ArgumentStore B_store = {};
80 typename Trait_R::ArgumentStore R_store = {};
81 typename Trait_n::Store n = {};
82 typename Trait_k::Store k = {};
83 typename Trait_m::Store m = {};
85 bool active_A =
false;
86 bool active_B =
false;
89 LLFH::restoreActivity(&dataStore, activityStore);
90 active_A = LLFH::getActivity(activityStore, 0);
91 active_B = LLFH::getActivity(activityStore, 1);
92 Trait_n::restore(&dataStore, allocator, 1,
true, n);
93 Trait_k::restore(&dataStore, allocator, 1,
true, k);
94 Trait_m::restore(&dataStore, allocator, 1,
true, m);
95 Trait_A::restore(&dataStore, allocator, n * k, LLFH::createRestoreActions(
true,
false, active_A, active_B),
97 Trait_B::restore(&dataStore, allocator, k * m, LLFH::createRestoreActions(
true,
false, active_B, active_A),
99 Trait_R::restore(&dataStore, allocator, n * m, LLFH::createRestoreActions(
false,
true,
false,
true), R_store);
101 if (Tape::HasPrimalValues) {
103 if (active_A && active_B) {
104 Trait_A::getPrimalsFromVector(adjoints, n * k, A_store.identifierIn(), A_store.primal());
106 if (active_B && active_A) {
107 Trait_B::getPrimalsFromVector(adjoints, k * m, B_store.identifierIn(), B_store.primal());
111 for (
size_t curDim = 0; curDim < adjoints->
getVectorSize(); curDim += 1) {
114 Trait_A::getGradients(adjoints, n * k,
false, A_store.identifierIn(), A_store.gradientIn(), curDim);
117 Trait_B::getGradients(adjoints, k * m,
false, B_store.identifierIn(), B_store.gradientIn(), curDim);
119 if (Tape::HasPrimalValues && 0 == curDim) {
120 if (!Tape::LinearIndexHandling) {
122 Trait_R::getPrimalsFromVector(adjoints, n * m, R_store.identifierOut(), R_store.oldPrimal());
126 Trait_R::setPrimalsIntoVector(adjoints, n * m, R_store.identifierOut(), R_store.primal());
130 callForward(A_store.primal(), active_A, A_store.gradientIn(), B_store.primal(), active_B,
131 B_store.gradientIn(), R_store.primal(), R_store.gradientOut(), n, k, m);
133 Trait_R::setGradients(adjoints, n * m,
false, R_store.identifierOut(), R_store.gradientOut(), curDim);
149 codi::CODI_UNUSED(A, active_A, A_d_in, B, active_B, B_d_in, R, R_d_out, n, k, m);
166 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
167 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
168 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
169 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
170 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
171 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
174 typename LLFH::ActivityStoreType activityStore = {};
175 typename Trait_A::ArgumentStore A_store = {};
176 typename Trait_B::ArgumentStore B_store = {};
177 typename Trait_R::ArgumentStore R_store = {};
178 typename Trait_n::Store n = {};
179 typename Trait_k::Store k = {};
180 typename Trait_m::Store m = {};
182 bool active_A =
false;
183 bool active_B =
false;
186 LLFH::restoreActivity(&dataStore, activityStore);
187 active_A = LLFH::getActivity(activityStore, 0);
188 active_B = LLFH::getActivity(activityStore, 1);
189 Trait_n::restore(&dataStore, allocator, 1,
true, n);
190 Trait_k::restore(&dataStore, allocator, 1,
true, k);
191 Trait_m::restore(&dataStore, allocator, 1,
true, m);
192 Trait_A::restore(&dataStore, allocator, n * k, LLFH::createRestoreActions(
true,
false, active_A, active_B),
194 Trait_B::restore(&dataStore, allocator, k * m, LLFH::createRestoreActions(
true,
false, active_B, active_A),
196 Trait_R::restore(&dataStore, allocator, n * m, LLFH::createRestoreActions(
false,
true,
false,
true), R_store);
198 if (Tape::HasPrimalValues) {
199 if (!Tape::LinearIndexHandling) {
201 Trait_R::setPrimalsIntoVector(adjoints, n * m, R_store.identifierOut(), R_store.oldPrimal());
205 if (active_A && active_B) {
206 Trait_A::getPrimalsFromVector(adjoints, n * k, A_store.identifierIn(), A_store.primal());
208 if (active_B && active_A) {
209 Trait_B::getPrimalsFromVector(adjoints, k * m, B_store.identifierIn(), B_store.primal());
213 for (
size_t curDim = 0; curDim < adjoints->
getVectorSize(); curDim += 1) {
215 Trait_R::getGradients(adjoints, n * m,
true, R_store.identifierOut(), R_store.gradientOut(), curDim);
218 callReverse(A_store.primal(), active_A, A_store.gradientIn(), B_store.primal(), active_B,
219 B_store.gradientIn(), R_store.primal(), R_store.gradientOut(), n, k, m);
222 Trait_A::setGradients(adjoints, n * k,
true, A_store.identifierIn(), A_store.gradientIn(), curDim);
225 Trait_B::setGradients(adjoints, k * m,
true, B_store.identifierIn(), B_store.gradientIn(), curDim);
242 codi::CODI_UNUSED(A, active_A, A_b_in, B, active_B, B_b_in, R, R_b_out, n, k, m);
260 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
261 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
262 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
263 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
264 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
265 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
268 typename LLFH::ActivityStoreType activityStore = {};
269 typename Trait_A::ArgumentStore A_store = {};
270 typename Trait_B::ArgumentStore B_store = {};
271 typename Trait_R::ArgumentStore R_store = {};
272 typename Trait_n::Store n = {};
273 typename Trait_k::Store k = {};
274 typename Trait_m::Store m = {};
276 bool active_A =
false;
277 bool active_B =
false;
280 LLFH::restoreActivity(&dataStore, activityStore);
281 active_A = LLFH::getActivity(activityStore, 0);
282 active_B = LLFH::getActivity(activityStore, 1);
283 Trait_n::restore(&dataStore, allocator, 1,
true, n);
284 Trait_k::restore(&dataStore, allocator, 1,
true, k);
285 Trait_m::restore(&dataStore, allocator, 1,
true, m);
286 Trait_A::restore(&dataStore, allocator, n * k, LLFH::createRestoreActions(
true,
false, active_A, active_B),
288 Trait_B::restore(&dataStore, allocator, k * m, LLFH::createRestoreActions(
true,
false, active_B, active_A),
290 Trait_R::restore(&dataStore, allocator, n * m, LLFH::createRestoreActions(
false,
true,
false,
true), R_store);
297 for (
size_t i = 0; i < size; i += 1) {
298 func(&ids[i], userData);
311 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
312 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
313 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
314 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
315 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
316 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
319 typename LLFH::ActivityStoreType activityStore = {};
320 typename Trait_A::ArgumentStore A_store = {};
321 typename Trait_B::ArgumentStore B_store = {};
322 typename Trait_R::ArgumentStore R_store = {};
323 typename Trait_n::Store n = {};
324 typename Trait_k::Store k = {};
325 typename Trait_m::Store m = {};
327 bool active_A =
false;
328 bool active_B =
false;
331 LLFH::restoreActivity(&dataStore, activityStore);
332 active_A = LLFH::getActivity(activityStore, 0);
333 active_B = LLFH::getActivity(activityStore, 1);
334 Trait_n::restore(&dataStore, allocator, 1,
true, n);
335 Trait_k::restore(&dataStore, allocator, 1,
true, k);
336 Trait_m::restore(&dataStore, allocator, 1,
true, m);
337 Trait_A::restore(&dataStore, allocator, n * k, LLFH::createRestoreActions(
true,
false, active_A, active_B),
339 Trait_B::restore(&dataStore, allocator, k * m, LLFH::createRestoreActions(
true,
false, active_B, active_A),
341 Trait_R::restore(&dataStore, allocator, n * m, LLFH::createRestoreActions(
false,
true,
false,
true), R_store);
344 iterateIds(A_store.identifierIn(), n * k, func, userData);
347 iterateIds(B_store.identifierIn(), k * m, func, userData);
361 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
362 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
363 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
364 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
365 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
366 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
369 typename LLFH::ActivityStoreType activityStore = {};
370 typename Trait_A::ArgumentStore A_store = {};
371 typename Trait_B::ArgumentStore B_store = {};
372 typename Trait_R::ArgumentStore R_store = {};
373 typename Trait_n::Store n = {};
374 typename Trait_k::Store k = {};
375 typename Trait_m::Store m = {};
377 bool active_A =
false;
378 bool active_B =
false;
381 LLFH::restoreActivity(&dataStore, activityStore);
382 active_A = LLFH::getActivity(activityStore, 0);
383 active_B = LLFH::getActivity(activityStore, 1);
384 Trait_n::restore(&dataStore, allocator, 1,
true, n);
385 Trait_k::restore(&dataStore, allocator, 1,
true, k);
386 Trait_m::restore(&dataStore, allocator, 1,
true, m);
387 Trait_A::restore(&dataStore, allocator, n * k, LLFH::createRestoreActions(
true,
false, active_A, active_B),
389 Trait_B::restore(&dataStore, allocator, k * m, LLFH::createRestoreActions(
true,
false, active_B, active_A),
391 Trait_R::restore(&dataStore, allocator, n * m, LLFH::createRestoreActions(
false,
true,
false,
true), R_store);
393 iterateIds(R_store.identifierOut(), n * m, func, userData);
400 Tape& tape = Type::getTape();
405 using Trait_A =
typename LLFH::ActiveStoreTrait<Type*>;
406 using Trait_B =
typename LLFH::ActiveStoreTrait<Type*>;
407 using Trait_R =
typename LLFH::ActiveStoreTrait<Type*>;
408 using Trait_n =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
409 using Trait_k =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
410 using Trait_m =
typename LLFH::PassiveStoreTrait<int, uint8_t>;
413 typename LLFH::ActivityStoreType activityStore = {};
414 typename Trait_A::ArgumentStore A_store = {};
415 typename Trait_B::ArgumentStore B_store = {};
416 typename Trait_R::ArgumentStore R_store = {};
419 bool active_A = Trait_A::isActive(A, n * k);
420 bool active_B = Trait_B::isActive(B, k * m);
421 bool active = active_A | active_B;
428 size_t dataSize = LLFH::countActivitySize();
429 dataSize += Trait_n::countSize(n, 1,
true);
430 dataSize += Trait_k::countSize(k, 1,
true);
431 dataSize += Trait_m::countSize(m, 1,
true);
432 dataSize += Trait_A::countSize(A, n * k, LLFH::createStoreActions(active,
true,
false, active_A, active_B));
433 dataSize += Trait_B::countSize(B, k * m, LLFH::createStoreActions(active,
true,
false, active_B, active_A));
434 dataSize += Trait_R::countSize(R, n * m, LLFH::createStoreActions(active,
false,
true,
false,
true));
438 tape.pushLowLevelFunction(
ID, dataSize, dataStore);
441 LLFH::setActivity(activityStore, 0, active_A);
442 LLFH::setActivity(activityStore, 1, active_B);
443 LLFH::storeActivity(&dataStore, activityStore);
444 Trait_n::store(&dataStore, allocator, n, 1,
true);
445 Trait_k::store(&dataStore, allocator, k, 1,
true);
446 Trait_m::store(&dataStore, allocator, m, 1,
true);
447 Trait_A::store(&dataStore, allocator, A, n * k,
448 LLFH::createStoreActions(active,
true,
false, active_A, active_B), A_store);
449 Trait_B::store(&dataStore, allocator, B, k * m,
450 LLFH::createStoreActions(active,
true,
false, active_B, active_A), B_store);
451 Trait_R::store(&dataStore, allocator, R, n * m, LLFH::createStoreActions(active,
false,
true,
false,
true),
455 Trait_A::store(
nullptr, allocator, A, n * k,
456 LLFH::createStoreActions(active,
true,
false, active_A, active_B), A_store);
457 Trait_B::store(
nullptr, allocator, B, k * m,
458 LLFH::createStoreActions(active,
true,
false, active_B, active_A), B_store);
459 Trait_R::store(
nullptr, allocator, R, n * m, LLFH::createStoreActions(active,
false,
true,
false,
true),
463 callPrimal(active, A_store.primal(), active_A, A_store.identifierIn(), B_store.primal(), active_B,
464 B_store.identifierIn(), R_store.primal(), R_store.identifierOut(), n, k, m);
466 Trait_R::setExternalFunctionOutput(active, R, n * m, R_store.identifierOut(), R_store.primal(),
467 R_store.oldPrimal());
481 codi::CODI_UNUSED(active, A, active_A, A_i_in, B, active_B, B_i_in, R, R_i_out, n, k, m);
500 ID = Type::getTape().registerLowLevelFunction(
506 template<Eigen::StorageOptions eigenStore,
typename Type>
518 template<Eigen::StorageOptions eigenStore,
typename Type>
529 template<
typename Type>
539 template<
typename Type>
#define CODI_INLINE
See codi::Config::ForcedInlines.
Definition config.h:469
#define codiAssert(x)
See codi::Config::EnableAssert.
Definition config.h:441
uint16_t LowLevelFunctionToken
Token type for low level functions in the tapes.
Definition config.h:108
size_t constexpr LowLevelFunctionTokenInvalid
Invalid low level function token.
Definition config.h:114
CoDiPack - Code Differentiation Package.
Definition codi.hpp:97
MapEigenMatrix< T, store > mapEigen(T *p, int rows, int cols)
Create a mapped Eigen matrix with specified storing option.
Definition eigenWrappers.hpp:66
void matrixMatrixMultiplicationRowMajor(Type const *A, Type const *B, Type *R, int n, int k, int m)
Definition matrixMatrixMultiplication.hpp:530
void matrixMatrixMultiplication(Type const *A, Type const *B, Type *R, int n, int k, int m)
Definition matrixMatrixMultiplication.hpp:519
inlinevoid CODI_UNUSED(Args const &...)
Disable unused warnings for an arbitrary number of arguments.
Definition macros.hpp:55
void matrixMatrixMultiplicationColMajor(Type const *A, Type const *B, Type *R, int n, int k, int m)
Definition matrixMatrixMultiplication.hpp:540
double Real
The type with no CoDiPack values.
Definition activeArgumentStoreTraits.hpp:207
int Identifier
The type for holding the identifiers.
Definition activeArgumentStoreTraits.hpp:208
Real Gradient
The type that can represent the gradient values.
Definition activeArgumentStoreTraits.hpp:209
Definition byteDataView.hpp:51
Low level function generation for matrixMatrixMultiplication.
Definition matrixMatrixMultiplication.hpp:48
static CODI_INLINE void callPrimal(bool active, typename codi::ActiveArgumentStoreTraits< Type * >::Real const *A, bool active_A, typename codi::ActiveArgumentStoreTraits< Type * >::Identifier const *A_i_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real const *B, bool active_B, typename codi::ActiveArgumentStoreTraits< Type * >::Identifier const *B_i_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real *R, typename codi::ActiveArgumentStoreTraits< Type * >::Identifier *R_i_out, int n, int k, int m)
Primal computation function.
Definition matrixMatrixMultiplication.hpp:473
codi::VectorAccessInterface< Real, Identifier > * AdjointVectorAccess
Abbreviation for vector access interface.
Definition matrixMatrixMultiplication.hpp:52
static codi::Config::LowLevelFunctionToken ID
Id for this function.
Definition matrixMatrixMultiplication.hpp:60
static CODI_INLINE void callReverse(typename codi::ActiveArgumentStoreTraits< Type * >::Real const *A, bool active_A, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *A_b_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real const *B, bool active_B, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *B_b_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real *R, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *R_b_out, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store n, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store k, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store m)
Reverse function for derivative evaluation.
Definition matrixMatrixMultiplication.hpp:233
static CODI_INLINE void reverse(Tape *tape, codi::ByteDataView &dataStore, AdjointVectorAccess adjoints)
Function for reverse interpretation.
Definition matrixMatrixMultiplication.hpp:160
typename LowLevelFunctionEntry< Tape, Real, Identifier >::IterCallback IterCallback
See LowLevelFunctionEntry.
Definition matrixMatrixMultiplication.hpp:57
static CODI_INLINE void evalAndStore(Type const *A, Type const *B, Type *R, int n, int k, int m)
Store on tape.
Definition matrixMatrixMultiplication.hpp:399
static CODI_INLINE void del(Tape *tape, codi::ByteDataView &dataStore)
Function for deletion of contents.
Definition matrixMatrixMultiplication.hpp:254
static CODI_INLINE void iterateOutputs(Tape *tape, codi::ByteDataView &dataStore, IterCallback func, void *userData)
Function for iteration over inputs.
Definition matrixMatrixMultiplication.hpp:354
static CODI_INLINE void iterateInputs(Tape *tape, codi::ByteDataView &dataStore, IterCallback func, void *userData)
Function for iteration over inputs.
Definition matrixMatrixMultiplication.hpp:304
static CODI_INLINE void callForward(typename codi::ActiveArgumentStoreTraits< Type * >::Real const *A, bool active_A, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *A_d_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real const *B, bool active_B, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *B_d_in, typename codi::ActiveArgumentStoreTraits< Type * >::Real *R, typename codi::ActiveArgumentStoreTraits< Type * >::Gradient *R_d_out, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store n, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store k, typename codi::PassiveArgumentStoreTraits< int, uint8_t >::Store m)
Forward function for derivative evaluation.
Definition matrixMatrixMultiplication.hpp:140
typename Type::Real Real
Real of the type.
Definition matrixMatrixMultiplication.hpp:49
static CODI_INLINE void forward(Tape *tape, codi::ByteDataView &dataStore, AdjointVectorAccess adjoints)
Function for forward interpretation.
Definition matrixMatrixMultiplication.hpp:63
static CODI_INLINE void registerOnTape()
Register function on tape.
Definition matrixMatrixMultiplication.hpp:497
typename Type::Tape Tape
Abbreviation for tape.
Definition matrixMatrixMultiplication.hpp:54
typename Type::Identifier Identifier
Definition matrixMatrixMultiplication.hpp:50
Helper structure for storing low level functions and their arguments on a tape.
Definition lowLevelFunctionCreationUtilities.hpp:128
Low level function entry on the tape. See LowLevelFunctionTapeInterface for details.
Definition lowLevelFunctionEntry.hpp:69
void(*)(Identifier *id, void *userData) IterCallback
Callback function for the identifier iteration.
Definition lowLevelFunctionEntry.hpp:81
T Store
Type for the variable declaration for restoring the data.
Definition passiveArgumentStoreTraits.hpp:61
Allocator for temporary used memory.
Definition temporaryMemory.hpp:54
inlinevoid free()
Free all allocated memory. No destructors are called. Stored pointers and resources need to be deallo...
Definition temporaryMemory.hpp:110
inlinebool isEmpty()
Returns true if no data is currently allocated.
Definition temporaryMemory.hpp:71
Unified access to the adjoint vector and primal vector in a tape evaluation.
Definition vectorAccessInterface.hpp:94
virtual size_t getVectorSize() const =0
Vector size in the current tape evaluation.