CoDiPack  3.0.0
A Code Differentiation Package
SciComp TU Kaiserslautern
Loading...
Searching...
No Matches
graphWriters.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 "../../traits/tapeTraits.hpp"
39#include "commonReaderWriterBase.hpp"
40
42namespace codi {
59 template<typename T_Type>
61 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
63
64 using Tape = typename Type::Tape;
65 using Identifier = typename Type::Identifier;
66 using Real = typename Type::Real;
67
69
71 JacobianGraphTapeWriter(std::string const& name, std::vector<Identifier> const& in,
72 std::vector<Identifier> const& out, bool ifJacobians)
73 : Base(true, name, in, out), printJacobians(ifJacobians) {};
74
79 void writeStatement(Identifier const& curLhsIdentifier, size_t& curJacobianPos, Real const* const rhsJacobians,
80 Identifier const* const rhsIdentifiers, Config::ArgumentSize const& nJacobians) {
81 std::string node;
82 if (nJacobians == Config::StatementInputTag) CODI_Unlikely {
83 // Do nothing.
84 } else CODI_Likely {
85 // Ensure that the all the rhsIdentifiers have been added before connecting edges to them.
86 Base::placeUnusedRhsNodes(&rhsIdentifiers[curJacobianPos], nJacobians);
87
88 // Add the curLhsIdentifier node.
89 std::string to = Base::createNode(1, &curLhsIdentifier, "");
90
91 // Loop through rhsIdentifiers and create the edges. The this->identifierExtensions is used to find the
92 // current extension for each of the rhsIdentifiers.
93 for (size_t argCount = 0; argCount < nJacobians; argCount++) {
94 std::string labelText = "";
95 if (printJacobians) {
96 labelText = std::to_string(rhsJacobians[curJacobianPos + argCount]);
97 }
98 Base::createEdge(rhsIdentifiers[curJacobianPos + argCount], to, labelText);
99 }
100
101 Base::updateLhsIdentifiers(1, &curLhsIdentifier);
102 }
103 }
104 };
105
123 template<typename T_Type>
125 using Type = CODI_DD(T_Type, CODI_DEFAULT_LHS_EXPRESSION);
127
128 using Tape = typename Type::Tape;
129 using Identifier = typename Type::Identifier;
130 using Real = typename Type::Real;
131 using EvalHandle = typename Tape::EvalHandle;
132
134 PrimalGraphTapeWriter(std::string const& name, std::vector<Identifier> const& in,
135 std::vector<Identifier> const& out)
136 : Base(true, name, in, out) {};
137
143 void writeStatement(WriteInfo const& info, Identifier const* lhsIdentifiers, Real const* primalValues,
144 Config::ArgumentSize const& nPassiveValues, Identifier const* const rhsIdentifiers,
145 Real const* const passiveValues, Real const* const constantValues,
146 EvalHandle stmtEvalHandle) {
147 CODI_UNUSED(primalValues, passiveValues, constantValues, stmtEvalHandle);
148
149 std::string node;
150 if (nPassiveValues == Config::StatementInputTag) CODI_Unlikely {
151 // Do nothing.
152 } else CODI_Likely {
153 // Ensure that the all the rhsIdentifiers have been added before connecting edges to them. The mathRep string
154 // is also modified to include the identifier and value.
156
157 // The mathRep string is modified to include the identifier and value.
158 std::string mathRep =
160 // Add the curLhsIdentifier node.
161 std::string lhsNodeName = Base::createNode(info.numberOfOutputArguments, lhsIdentifiers, mathRep);
162
163 // Loop through rhsIdentifiers and create the edges. The identifierExtensions is used to find the current
164 // extension for each of the rhsIdentifiers.
165 for (size_t argCount = 0; argCount < info.numberOfActiveArguments; argCount++) {
166 Base::createEdge(rhsIdentifiers[argCount], lhsNodeName);
167 }
168
169 // Only record the increased extension after recording the edges. This ensure that if the lhs equals the rhs,
170 // that it results in two unique nodes.
172 }
173 }
174 };
175}
#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
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
inlinevoid CODI_UNUSED(Args const &...)
Disable unused warnings for an arbitrary number of arguments.
Definition macros.hpp:54
std::string modifyMathRep(std::string const &mathRep, Identifier const *const rhsIdentifiers, size_t const &nActiveValues)
Replaces all general identifiers in the math representation with the input, output or temporary annot...
Definition commonReaderWriterBase.hpp:401
CommonTextTapeWriter(bool writeDotHeaderFooter, std::string const &name, std::vector< Identifier > const &in, std::vector< Identifier > const &out)
Constructor.
Definition commonReaderWriterBase.hpp:251
std::string createNode(size_t nIdentifiers, Identifier const *identifiers, std::string const &label)
Creates a new node for a given Identifier and label.
Definition commonReaderWriterBase.hpp:336
void createEdge(Identifier const &from, std::string const &to, std::string const &label="")
Return a string that creates an edge between two nodes in the .dot language.
Definition commonReaderWriterBase.hpp:429
void updateLhsIdentifiers(size_t nIdentifiers, Identifier const *identifiers)
Update the identifiers extension and the prefix.
Definition commonReaderWriterBase.hpp:440
void placeUnusedRhsNodes(Identifier const *const rhsIdentifiers, Config::ArgumentSize const &nArguments)
Ensure that all the nodes on the rhs have been placed in the .dot file before creating edges to them.
Definition commonReaderWriterBase.hpp:417
void writeStatement(Identifier const &curLhsIdentifier, size_t &curJacobianPos, Real const *const rhsJacobians, Identifier const *const rhsIdentifiers, Config::ArgumentSize const &nJacobians)
Called for each statement. The method writes the current statement to the file. This overload is used...
Definition graphWriters.hpp:79
typename Type::Real Real
See TapeWriterInterface.
Definition graphWriters.hpp:66
typename Type::Tape Tape
See TapeWriterInterface.
Definition graphWriters.hpp:64
CommonTextTapeWriter< T_Type > Base
See CommonTextTapeWriter.
Definition graphWriters.hpp:62
JacobianGraphTapeWriter(std::string const &name, std::vector< Identifier > const &in, std::vector< Identifier > const &out, bool ifJacobians)
Constructor.
Definition graphWriters.hpp:71
T_Type Type
See TapeWriterInterface.
Definition graphWriters.hpp:61
bool printJacobians
Flag that enables the jacobians on the edges in the graph.
Definition graphWriters.hpp:68
typename Type::Identifier Identifier
See TapeWriterInterface.
Definition graphWriters.hpp:65
typename Type::Tape Tape
See TapeWriterInterface.
Definition graphWriters.hpp:128
T_Type Type
See TapeWriterInterface.
Definition graphWriters.hpp:125
CommonTextTapeWriter< T_Type > Base
See CommonTextTapeWriter.
Definition graphWriters.hpp:126
typename Type::Identifier Identifier
See TapeWriterInterface.
Definition graphWriters.hpp:129
typename Tape::EvalHandle EvalHandle
See TapeWriterInterface.
Definition graphWriters.hpp:131
PrimalGraphTapeWriter(std::string const &name, std::vector< Identifier > const &in, std::vector< Identifier > const &out)
Constructor.
Definition graphWriters.hpp:134
typename Type::Real Real
See TapeWriterInterface.
Definition graphWriters.hpp:130
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 graphWriters.hpp:143
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
size_t numberOfOutputArguments
Number of output arguments.
Definition tapeReaderWriterInterface.hpp:70
std::string mathRepresentation
Definition tapeReaderWriterInterface.hpp:74