1 #ifndef CPPAD_CG_CODE_HANDLER_INCLUDED 2 #define CPPAD_CG_CODE_HANDLER_INCLUDED 32 using SourceCodePath = std::vector<PathNode>;
33 using ScopePath = std::vector<ScopePathElement<Base> >;
37 using ScopeIDType =
unsigned short;
49 size_t _idSparseArrayCount;
51 size_t _idAtomicCount;
53 std::vector<Node *> _independentVariables;
127 std::map<size_t, size_t> _atomicFunctionId2Index;
143 ScopeIDType _scopeColorCount;
145 ScopeIDType _currentScopeColor;
147 std::vector<ScopePath> _scopes;
149 std::list<std::pair<Node*, Node* > > _alteredNodes;
155 std::unique_ptr<LanguageGenerationData<Base> >
_info;
157 size_t _minTemporaryVarID;
208 template<
class VectorCG>
210 for (
size_t i = 0; i < variables.size(); i++) {
257 inline size_t getMaximumVariableID()
const;
259 inline bool isVerbose()
const;
261 inline void setVerbose(
bool verbose);
263 inline JobTimer* getJobTimer()
const;
265 inline void setJobTimer(
JobTimer* jobTimer);
283 inline size_t getOperationTreeVisitId()
const;
285 inline void startNewOperationTreeVisit();
287 inline bool isVisited(
const Node& node)
const;
289 inline void markVisited(
const Node& node);
306 inline const std::map<size_t, CGAbstractAtomicFun<Base>* >&
getAtomicFunctions()
const;
329 inline const std::string*
getLoopName(
size_t id)
const;
331 inline const std::vector<ScopePath>& getScopes()
const;
353 size_t& bifurcations,
354 size_t maxBifurcations = std::numeric_limits<size_t>::max());
375 const std::string& jobName =
"source");
379 std::vector<CGB>& dependent,
381 const std::string& jobName =
"source");
387 const std::string& jobName =
"source");
405 std::vector<std::string>& atomicFunctions,
406 const std::string& jobName =
"source");
410 std::vector<CGB>& dependent,
412 std::vector<std::string>& atomicFunctions,
413 const std::string& jobName =
"source");
419 std::vector<std::string>& atomicFunctions,
420 const std::string& jobName =
"source");
422 size_t getTemporaryVariableCount()
const;
424 size_t getTemporaryArraySize()
const;
426 size_t getTemporarySparseArraySize()
const;
436 virtual void reset();
453 inline Node* makeNode(CGOpCode op);
455 inline Node* makeNode(CGOpCode op,
458 inline Node* makeNode(CGOpCode op,
459 std::vector<Arg>&& args);
461 inline Node* makeNode(CGOpCode op,
462 std::vector<size_t>&& info,
463 std::vector<Arg>&& args);
465 inline Node* makeNode(CGOpCode op,
466 const std::vector<size_t>& info,
467 const std::vector<Arg>& args);
470 size_t iterationCount);
476 const std::vector<Arg >& endArgs);
480 const std::string& after);
497 inline Node* makeIndexDclrNode(
const std::string& name);
527 CGB createCG(
const Arg& arg);
533 const std::map<size_t, LoopModel<Base>*>& getLoops()
const;
537 inline size_t addLoopDependentIndexPattern(
IndexPattern& jacPattern);
539 inline void manageLoopDependentIndexPattern(
const IndexPattern* pattern);
541 inline size_t addLoopIndependentIndexPattern(
IndexPattern& pattern,
size_t hint);
546 static inline void findRandomIndexPatterns(
IndexPattern* ip,
547 std::set<RandomIndexPattern*>& found);
564 inline bool isSolvable(
Node& expression,
583 bool removeFromIndeps =
true);
587 bool removeFromIndeps =
true);
621 virtual Node* manageOperationNode(
Node* code);
630 size_t oldScope,
size_t newScope);
634 const std::vector<size_t>& iterationRegions,
635 ScopeIDType oldScope,
636 ScopeIDType commonScopeColor);
645 inline void updateVarScopeUsage(
Node* node,
646 ScopeIDType usageScope,
647 ScopeIDType oldUsageScope);
649 inline void addScopeToVarOrder(
size_t scope,
669 inline void replaceScope(
Node* node,
670 ScopeIDType oldScope,
671 ScopeIDType newScope);
685 inline bool containedInScope(
const Node& node,
688 inline static bool containsArgument(
const Node& node,
698 inline void addToEvaluationQueue(
Node& arg);
720 inline void repositionEvaluationQueue(
size_t fromPos,
746 inline void updateEvaluationQueueOrder(
Node& node,
747 size_t newEvalOrder);
749 inline bool isIndependent(
const Node& arg)
const;
751 inline bool isTemporary(
const Node& arg)
const;
753 inline static bool isTemporaryArray(
const Node& arg);
755 inline static bool isTemporarySparseArray(
const Node& arg);
757 inline static Node* getOperationFromAlias(
Node& alias);
759 inline size_t getEvaluationOrder(
const Node& node)
const;
761 inline void setEvaluationOrder(
Node& node,
764 inline size_t getLastUsageEvaluationOrder(
const Node& node)
const;
766 inline void setLastUsageEvaluationOrder(
const Node& node,
776 inline void setTotalUsageCount(
const Node& node,
779 inline void increaseTotalUsageCount(
const Node& node);
781 inline void resetManagedNodes();
787 inline void findPaths(SourceCodePath& path2node,
789 std::vector<SourceCodePath>& found,
792 static inline std::vector<SourceCodePath> findPathsFromNode(
const std::vector<SourceCodePath> nodePaths,
826 const SourceCodePath& path1,
827 const SourceCodePath& path2,
831 const SourceCodePath& pathRight);
834 const SourceCodePath& pathRight,
837 inline bool isSolvable(
const SourceCodePath& path)
const;
844 std::map<size_t, LoopModel<Base>*> loopModels;
845 std::vector<LoopEndOperationNode<Base>*> endNodes;
847 std::set<const Node*> indexes;
849 std::set<RandomIndexPattern*> indexRandomPatterns;
851 std::vector<IndexPattern*> dependentIndexPatterns;
852 std::vector<const IndexPattern*> dependentIndexPatternManaged;
853 std::vector<IndexPattern*> independentIndexPatterns;
855 std::vector<std::set<Node*> > outerVars;
859 std::vector<size_t> startEvalOrder;
865 inline void prepare4NewSourceGen();
876 inline const std::string*
getLoopName(
size_t id)
const;
882 size_t addDependentIndexPattern(
IndexPattern& jacPattern);
884 void manageDependentIndexPattern(
const IndexPattern* pattern);
886 size_t addIndependentIndexPattern(
IndexPattern& pattern,
size_t hint);
888 void addLoopEndNode(
Node& node);
894 friend class CG<Base>;
virtual void markCodeBlockUsed(Node &code)
const std::string * getLoopName(size_t id) const
std::vector< int > _atomicFunctionsMaxReverse
Node * cloneNode(const Node &n)
std::vector< SourceCodePath > findPaths(Node &root, Node &target, size_t max)
void substituteIndependent(const CGB &indep, const CGB &dep, bool removeFromIndeps=true)
void updateTemporaryVarInDiffScopes(Node &code)
std::vector< std::string > * _atomicFunctionsOrder
void reorderOperations(ArrayView< CGB > &dependent)
void deleteManagedNodes(size_t start, size_t end)
void findVariableDependencies()
CodeHandlerVector< Base, size_t > _lastVisit
void dependentAdded2EvaluationQueue(Node &node)
std::set< CodeHandlerVectorSync< Base > * > _managedVectors
const CodeHandlerVector< Base, size_t > & getVariablesIDs() const
bool manageOperationNodeMemory(Node *code)
const std::vector< Node * > & getManagedNodes() const
CodeHandlerVector< Base, size_t > _evaluationOrder
const std::string * getAtomicFunctionName(size_t id) const
size_t findLastTemporaryLocation(Node &node)
std::vector< std::vector< Node * > > _scopedVariableOrder
bool isCollectableVariableAddSub(const SourceCodePath &pathLeft, const SourceCodePath &pathRight, bool throwEx)
std::map< std::string, size_t > _atomicFunctionName2Index
std::vector< int > _atomicFunctionsMaxForward
size_t findFirstDifferentScope(size_t color1, size_t color2)
CodeHandlerVector< Base, ScopeIDType > _scope
void determineLastTempVarUsage(Node &node)
size_t getIndependentVariableSize() const
CGB collectVariableAddSub(const SourceCodePath &pathLeft, const SourceCodePath &pathRight)
const std::string * getLoopName(size_t id) const
const std::vector< int > & getExternalFuncMaxForwardOrder() const
void removeIndependent(Node &indep)
std::unique_ptr< LanguageGenerationData< Base > > _info
void makeVariables(VectorCG &variables)
CGB solveFor(Node &expression, Node &var)
bool handleTemporaryVarInDiffScopes(Node &code, size_t oldScope, size_t newScope)
const std::map< size_t, CGAbstractAtomicFun< Base > *> & getAtomicFunctions() const
void undoSubstituteIndependent(Node &indep)
void reorderOperation(Node &node)
void makeVariable(AD< CGB > &variable)
std::vector< Node * > _variableOrder
std::map< size_t, CGAbstractAtomicFun< Base > * > _atomicFunctions
CodeHandlerVector< Base, size_t > _totalUseCount
void replaceWithConditionalTempVar(Node &tmp, IndexOperationNode< Base > &iterationIndexOp, const std::vector< size_t > &iterationRegions, ScopeIDType oldScope, ScopeIDType commonScopeColor)
size_t getManagedNodesCount() const
size_t getIndependentVariableIndex(const Node &var) const
void reduceTemporaryVariables(ArrayView< CGB > &dependent)
void setZeroDependents(bool zeroDependents)
std::vector< std::set< Node * > > _variableDependencies
size_t getTotalUsageCount(const Node &node) const
virtual void checkVariableCreation(Node &code)
IndexOperationNode< Base > * _auxIterationIndexOp
void setReuseVariableIDs(bool reuse)
const std::vector< int > & getExternalFuncMaxReverseOrder() const
bool isZeroDependents() const
CGB collectVariable(Node &expression, const SourceCodePath &path1, const SourceCodePath &path2, size_t bifPos)
void restoreTemporaryVar(Node &tmp)
std::vector< Node * > _codeBlocks
virtual void generateCode(std::ostream &out, Language< Base > &lang, CppAD::vector< CGB > &dependent, VariableNameGenerator< Base > &nameGen, const std::string &jobName="source")
bool isReuseVariableIDs() const
CodeHandlerVector< Base, size_t > _varId
void breakCyclicDependency(Node *node, size_t scope, Node *endIf)
CodeHandlerVector< Base, size_t > _lastUsageOrder