CoDiPack  3.0.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
primalBinaryReaderWriter.hpp
1/*
2 * CoDiPack, a Code Differentiation Package
3 *
4 * Copyright (C) 2015-2025 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 "../../config.h"
38#include "primalBaseReaderWriter.hpp"
39
41namespace codi {
62 template<typename T_Type>
64 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
65 using Tape = typename Type::Tape;
66
67 using Identifier = typename Type::Identifier;
68 using Real = typename Type::Real;
69 using EvalHandle = typename Tape::EvalHandle;
70
71 FILE* fileHandleBin = nullptr;
72
74 PrimalBinaryTapeWriter(std::string const& name, std::vector<Identifier> const& in,
75 std::vector<Identifier> const& out)
76 : PrimalBaseTapeWriter<T_Type>(name, in, out) {};
77
79 void start(Tape& tape) {
80 if (Tape::TapeTypes::IsStaticIndexHandler) {
81 printPrimals(tape);
82 }
83
84 this->printIoBinary(tape);
85 this->openFile(fileHandleBin, this->fileName, "wb");
86 }
87
93 void writeStatement(WriteInfo const& info, Identifier const* lhsIdentifiers, Real const* primalValues,
94 Config::ArgumentSize const& nPassiveValues, Identifier const* const rhsIdentifiers,
95 Real const* const passiveValues, Real const* const constantValues,
96 EvalHandle stmtEvalHandle) {
98 fwrite(lhsIdentifiers, sizeof(Identifier), info.numberOfOutputArguments, fileHandleBin);
99 fwrite(primalValues, sizeof(Real), info.numberOfOutputArguments, fileHandleBin);
100 fwrite(&nPassiveValues, sizeof(Config::ArgumentSize), 1, fileHandleBin);
101
102 if (nPassiveValues == Config::StatementInputTag) CODI_Unlikely {
103 // Do nothing.
104 } else CODI_Likely {
106 fwrite(rhsIdentifiers, sizeof(Identifier), info.numberOfActiveArguments, fileHandleBin);
107 fwrite(passiveValues, sizeof(Real), nPassiveValues, fileHandleBin);
109 fwrite(constantValues, sizeof(Real), info.numberOfConstantArguments, fileHandleBin);
110 }
111 // Register the statement expression (in the form of a string) for the evalHandleKey.
112
113 size_t evalHandleIndex = this->getEvalHandleIndex(stmtEvalHandle, info.stmtExpression);
114 fwrite(&evalHandleIndex, sizeof(size_t), 1, fileHandleBin);
115 }
116
118 void printPrimals(Tape& tape) {
119 FILE* filePrimalBin = nullptr;
120 size_t nPrimals = tape.getParameter(TapeParameters::PrimalSize);
121
122 std::string fileNamePrimals = this->modifyFileName("Primals.dat");
123
124 this->openFile(filePrimalBin, fileNamePrimals, "wb");
125
126 // Print out the primals in a sparse vector representation.
127 fwrite(&nPrimals, sizeof(size_t), 1, filePrimalBin);
128 for (size_t indexCounter = 0; indexCounter < nPrimals; indexCounter++) {
129 Real const curPrimal = tape.getPrimal(indexCounter);
130 if (curPrimal != 0) {
131 fwrite(&indexCounter, sizeof(Identifier), 1, filePrimalBin);
132 fwrite(&curPrimal, sizeof(Real), 1, filePrimalBin);
133 }
134 }
135
136 fclose(filePrimalBin);
137 }
138
140 void finish() {
141 // Generate the handleCreator .hpp file.
143
144 fclose(fileHandleBin);
145 }
146 };
147
170 template<typename T_Type>
171 struct PrimalBinaryTapeReader : public CommonBaseTapeReader<T_Type> {
172 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
173 using Tape = typename Type::Tape;
174 using Identifier = typename Type::Identifier;
175 using Real = typename Type::Real;
176
177 std::vector<typename Tape::EvalHandle> evalHandles;
179 PrimalBinaryTapeReader(std::vector<typename Tape::EvalHandle> const& handles)
180 : CommonBaseTapeReader<T_Type>(), evalHandles(handles) {}
181
183 void readFile(std::string const& name) {
184 FILE* fileHandleReadBin = nullptr;
185
186 Config::ArgumentSize nOutputValues;
187 std::vector<Identifier> lhsIdentifiers(Config::MaxArgumentSize, 0);
188 std::vector<Real> primalValues(Config::MaxArgumentSize, 0.0);
189 Config::ArgumentSize nPassiveValues;
190 Config::ArgumentSize nActiveValues;
191 std::vector<Identifier> rhsIdentifiers(Config::MaxArgumentSize, 0);
192 std::vector<Real> rhsPrimalValues(Config::MaxArgumentSize, 0.0);
193 Config::ArgumentSize nConstants;
194 std::vector<Real> constants(Config::MaxArgumentSize, 0);
195
196 EvalHandleKey evalHandleKey;
197 this->fileName = name;
198
199 // Restore IO and the primal vector, if the tape is a reuseType.
200 this->restoreIoBinary();
201 this->tape.getIndexManager().updateLargestCreatedIndex(this->largestIndex);
202
203 if (Tape::TapeTypes::IsStaticIndexHandler) {
205 }
206
207 this->openFile(fileHandleReadBin, this->fileName, "rb");
208
209 while (fread(&nOutputValues, sizeof(Config::ArgumentSize), 1, fileHandleReadBin) == 1) {
210 fread(lhsIdentifiers.data(), sizeof(Identifier), nOutputValues, fileHandleReadBin);
211 fread(primalValues.data(), sizeof(Real), nOutputValues, fileHandleReadBin);
212 fread(&nPassiveValues, sizeof(Config::ArgumentSize), 1, fileHandleReadBin);
213
215 // TODO.
216 } else if (nPassiveValues == Config::StatementInputTag) CODI_Unlikely {
217 // Do nothing.
218 } else CODI_Likely {
219 fread(&nActiveValues, sizeof(Config::ArgumentSize), 1, fileHandleReadBin);
220 fread(rhsIdentifiers.data(), sizeof(Identifier), nActiveValues, fileHandleReadBin);
221 fread(rhsPrimalValues.data(), sizeof(Real), nPassiveValues, fileHandleReadBin);
222 fread(&nConstants, sizeof(Config::ArgumentSize), 1, fileHandleReadBin);
223 fread(constants.data(), sizeof(Real), nConstants, fileHandleReadBin);
224 }
225
226 fread(&evalHandleKey, sizeof(EvalHandleKey), 1, fileHandleReadBin);
227 this->tape.createStatementManual(nOutputValues, lhsIdentifiers.data(), primalValues.data(), nActiveValues,
228 rhsIdentifiers.data(), nPassiveValues, rhsPrimalValues.data(), nConstants,
229 constants.data(), evalHandles[evalHandleKey]);
230 }
231
232 fclose(fileHandleReadBin);
233 }
234
237 FILE* filePrimalBin = nullptr;
238
239 size_t nPrimals;
240 Identifier curIdentifier;
241 Real curPrimal;
242
243 this->openFile(filePrimalBin, this->modifyFileName("Primals.dat"), "rb");
244
245 // Restore the primal vector from a sparse vector.
246 fread(&nPrimals, sizeof(size_t), 1, filePrimalBin);
247 // Resize the primal vector.
248 this->tape.setParameter(TapeParameters::PrimalSize, nPrimals);
249
250 while (fread(&curIdentifier, sizeof(Identifier), 1, filePrimalBin) == 1) {
251 fread(&curPrimal, sizeof(Real), 1, filePrimalBin);
252 this->tape.setPrimal(curIdentifier, curPrimal);
253 }
254 }
255 };
256}
#define CODI_Unlikely
Declare unlikely evaluation of an execution path.
Definition config.h:408
#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:96
size_t constexpr StatementLowLevelFunctionTag
Statement tag for low level functions.
Definition config.h:126
size_t constexpr MaxArgumentSize
Maximum number of arguments in a statement.
Definition config.h:120
uint8_t ArgumentSize
Type for the number of arguments in statements.
Definition config.h:117
size_t constexpr StatementInputTag
Tag for statements that are inputs. Used in linear index management context.
Definition config.h:123
CoDiPack - Code Differentiation Package.
Definition codi.hpp:94
@ PrimalSize
[A: RW] Number of primal vector entries in primal value tapes.
Definition tapeParameters.hpp:63
size_t EvalHandleKey
Key for the evalHandle lookup.
Definition tapeReaderWriterInterface.hpp:44
Tape tape
The newly resorted tape.
Definition commonReaderWriterBase.hpp:153
Identifier largestIndex
The largest index on the stored tape.
Definition commonReaderWriterBase.hpp:155
void restoreIoBinary()
Restore the IO for the binary readers.
Definition commonReaderWriterBase.hpp:180
void printIoBinary(Tape &tape)
Generate the IO file in a binary format.
Definition commonReaderWriterBase.hpp:117
std::string fileName
The base file name provided by the user.
Definition commonReaderWriterBase.hpp:51
std::string modifyFileName(std::string const &suffix)
Remove the file extension and replace it with a new suffix.
Definition commonReaderWriterBase.hpp:59
void openFile(FILE *&fileHandle, std::string const &name, std::string const &mode)
Definition commonReaderWriterBase.hpp:67
void generateHandleCreatorFile()
This method is used to generate an .hpp file which creates the necessary EvalHandles in the reading p...
Definition primalBaseReaderWriter.hpp:78
PrimalBaseTapeWriter(std::string const &name, std::vector< Identifier > const &in, std::vector< Identifier > const &out)
Constructor.
Definition primalBaseReaderWriter.hpp:68
size_t getEvalHandleIndex(EvalHandle const evalHandle, std::string const &evalStatement)
Get the index for an evalHandle.
Definition primalBaseReaderWriter.hpp:118
typename Type::Real Real
See TapeReaderInterface.
Definition primalBinaryReaderWriter.hpp:175
typename Type::Identifier Identifier
See TapeReaderInterface.
Definition primalBinaryReaderWriter.hpp:174
T_Type Type
See TapeReaderInterface.
Definition primalBinaryReaderWriter.hpp:172
typename Type::Tape Tape
See TapeReaderInterface.
Definition primalBinaryReaderWriter.hpp:173
void restorePrimals()
Read and record the primal values from the sparse primal vector stored in "filename"Primals....
Definition primalBinaryReaderWriter.hpp:236
std::vector< typename Tape::EvalHandle > evalHandles
Definition primalBinaryReaderWriter.hpp:177
void readFile(std::string const &name)
This method uses the the fileName to reproduce a valid tape.
Definition primalBinaryReaderWriter.hpp:183
PrimalBinaryTapeReader(std::vector< typename Tape::EvalHandle > const &handles)
Constructor.
Definition primalBinaryReaderWriter.hpp:179
PrimalBinaryTapeWriter(std::string const &name, std::vector< Identifier > const &in, std::vector< Identifier > const &out)
Constructor.
Definition primalBinaryReaderWriter.hpp:74
typename Type::Tape Tape
See TapeWriterInterface.
Definition primalBinaryReaderWriter.hpp:65
void printPrimals(Tape &tape)
Print the primal vector in sparse vector representation.
Definition primalBinaryReaderWriter.hpp:118
typename Type::Identifier Identifier
See TapeWriterInterface.
Definition primalBinaryReaderWriter.hpp:67
FILE * fileHandleBin
File handle.
Definition primalBinaryReaderWriter.hpp:71
T_Type Type
See TapeWriterInterface.
Definition primalBinaryReaderWriter.hpp:64
typename Type::Real Real
See TapeWriterInterface.
Definition primalBinaryReaderWriter.hpp:68
void writeStatement(WriteInfo const &info, Identifier const *lhsIdentifiers, Real const *primalValues, Config::ArgumentSize const &nPassiveValues, Identifier const *const rhsIdentifiers, Real const *const passiveValues, Real const *const constantValues, EvalHandle stmtEvalHandle)
Called for each statement. The method writes the current statement to the file. This overload is used...
Definition primalBinaryReaderWriter.hpp:93
void start(Tape &tape)
Destructor.
Definition primalBinaryReaderWriter.hpp:79
void finish()
After all the statements have been written, the finish method finalizes the writing process.
Definition primalBinaryReaderWriter.hpp:140
typename Tape::EvalHandle EvalHandle
See TapeWriterInterface.
Definition primalBinaryReaderWriter.hpp:69
This class is used during the writing process of a primal value tape. The WriteInfo is returned by St...
Definition tapeReaderWriterInterface.hpp:69
size_t numberOfActiveArguments
Number of active arguments.
Definition tapeReaderWriterInterface.hpp:71
std::string stmtExpression
Used to generate a .hpp file for reading back a primal value tape.
Definition tapeReaderWriterInterface.hpp:73
size_t numberOfOutputArguments
Number of output arguments.
Definition tapeReaderWriterInterface.hpp:70
size_t numberOfConstantArguments
Number of constant arguments.
Definition tapeReaderWriterInterface.hpp:72