CppADCodeGen  2.3.0
A C++ Algorithmic Differentiation Package with Source Code Generation
language.hpp
1 #ifndef CPPAD_CG_LANGUAGE_INCLUDED
2 #define CPPAD_CG_LANGUAGE_INCLUDED
3 /* --------------------------------------------------------------------------
4  * CppADCodeGen: C++ Algorithmic Differentiation with Source Code Generation:
5  * Copyright (C) 2012 Ciengis
6  *
7  * CppADCodeGen is distributed under multiple licenses:
8  *
9  * - Eclipse Public License Version 1.0 (EPL1), and
10  * - GNU General Public License Version 3 (GPL3).
11  *
12  * EPL1 terms and conditions can be found in the file "epl-v10.txt", while
13  * terms and conditions for the GPL3 can be found in the file "gpl3.txt".
14  * ----------------------------------------------------------------------------
15  * Author: Joao Leal
16  */
17 
18 namespace CppAD {
19 namespace cg {
20 
26 template<class Base>
28 public:
29  using Node = OperationNode<Base>;
30  using ScopeIDType = typename CodeHandler<Base>::ScopeIDType;
31 public:
35  const std::vector<Node *>& independent;
52  const std::vector<Node*>& variableOrder;
56  const std::vector<std::set<Node*>>& variableDependencies;
64  const std::map<size_t, size_t>& atomicFunctionId2Index;
68  const std::map<size_t, std::string>& atomicFunctionId2Name;
73  const std::vector<int>& atomicFunctionsMaxForward;
78  const std::vector<int>& atomicFunctionsMaxReverse;
82  const bool reuseIDs;
83  //
84  const std::set<const Node*>& indexes;
85  //
86  const std::set<RandomIndexPattern*>& indexRandomPatterns;
87  //
88  const std::vector<IndexPattern*>& loopDependentIndexPatterns;
89  //
90  const std::vector<IndexPattern*>& loopIndependentIndexPatterns;
107  const bool zeroDependents;
108 public:
109 
110  LanguageGenerationData(const std::vector<Node *>& ind,
111  const ArrayView<CG<Base> >& dep,
112  size_t minTempVID,
113  const CodeHandlerVector<Base, size_t>& varIds,
114  const std::vector<Node*>& vo,
115  const std::vector<std::set<Node*>>& variableDependencies,
117  const std::map<size_t, size_t>& atomicId2Index,
118  const std::map<size_t, std::string>& atomicId2Name,
119  const std::vector<int>& atomicMaxForward,
120  const std::vector<int>& atomicMaxReverse,
121  const bool ri,
122  const std::set<const Node*>& indexes,
123  const std::set<RandomIndexPattern*>& idxRandomPatterns,
124  const std::vector<IndexPattern*>& dependentIndexPatterns,
125  const std::vector<IndexPattern*>& independentIndexPatterns,
126  const CodeHandlerVector<Base, size_t>& totalUseCount,
128  IndexOperationNode<Base>& auxIterationIndexOp,
129  bool zero) :
130  independent(ind),
131  dependent(dep),
132  minTemporaryVarID(minTempVID),
133  varId(varIds),
134  variableOrder(vo),
135  variableDependencies(variableDependencies),
136  nameGen(ng),
137  atomicFunctionId2Index(atomicId2Index),
138  atomicFunctionId2Name(atomicId2Name),
139  atomicFunctionsMaxForward(atomicMaxForward),
140  atomicFunctionsMaxReverse(atomicMaxReverse),
141  reuseIDs(ri),
142  indexes(indexes),
143  indexRandomPatterns(idxRandomPatterns),
144  loopDependentIndexPatterns(dependentIndexPatterns),
145  loopIndependentIndexPatterns(independentIndexPatterns),
146  totalUseCount(totalUseCount),
147  scope(scope),
148  auxIterationIndexOp(auxIterationIndexOp),
149  zeroDependents(zero) {
150  }
151 };
152 
158 template<class Base>
159 class Language {
160  friend class CodeHandler<Base>;
161 public:
162  using Node = OperationNode<Base>;
163 protected:
164  virtual void generateSourceCode(std::ostream& out,
165  const std::unique_ptr<LanguageGenerationData<Base> >& info) = 0;
166 
173  virtual bool createsNewVariable(const Node& op,
174  size_t totalUseCount) const = 0;
175 
176  virtual bool requiresVariableArgument(enum CGOpCode op,
177  size_t argIndex) const = 0;
178 
183  virtual bool requiresVariableDependencies() const = 0;
184 
185 };
186 
187 } // END cg namespace
188 } // END CppAD namespace
189 
190 #endif
const std::map< size_t, std::string > & atomicFunctionId2Name
Definition: language.hpp:68
const CodeHandlerVector< Base, size_t > & varId
Definition: language.hpp:48
const std::vector< int > & atomicFunctionsMaxReverse
Definition: language.hpp:78
IndexOperationNode< Base > & auxIterationIndexOp
Definition: language.hpp:102
const CodeHandlerVector< Base, ScopeIDType > & scope
Definition: language.hpp:98
const std::vector< Node * > & independent
Definition: language.hpp:35
const std::map< size_t, size_t > & atomicFunctionId2Index
Definition: language.hpp:64
const CodeHandlerVector< Base, size_t > & totalUseCount
Definition: language.hpp:94
const std::vector< int > & atomicFunctionsMaxForward
Definition: language.hpp:73
VariableNameGenerator< Base > & nameGen
Definition: language.hpp:60
const ArrayView< CG< Base > > & dependent
Definition: language.hpp:39
const std::vector< std::set< Node * > > & variableDependencies
Definition: language.hpp:56
const std::vector< Node * > & variableOrder
Definition: language.hpp:52