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;
145 ScopeIDType _scopeColorCount;
147 ScopeIDType _currentScopeColor;
149 std::vector<ScopePath> _scopes;
151 std::list<std::pair<Node*, Node* > > _alteredNodes;
155 size_t _minTemporaryVarID;
206 template<
class VectorCG>
208 for (
size_t i = 0; i < variables.size(); i++) {
255 inline size_t getMaximumVariableID()
const;
257 inline bool isVerbose()
const;
259 inline void setVerbose(
bool verbose);
261 inline JobTimer* getJobTimer()
const;
263 inline void setJobTimer(
JobTimer* jobTimer);
281 inline size_t getOperationTreeVisitId()
const;
283 inline void startNewOperationTreeVisit();
285 inline bool isVisited(
const Node& node)
const;
287 inline void markVisited(
const Node& node);
304 inline const std::map<size_t, CGAbstractAtomicFun<Base>* >&
getAtomicFunctions()
const;
327 inline const std::string*
getLoopName(
size_t id)
const;
329 inline const std::vector<ScopePath>& getScopes()
const;
351 size_t& bifurcations,
352 size_t maxBifurcations = (std::numeric_limits<size_t>::max)());
373 const std::string& jobName =
"source");
377 std::vector<CGB>& dependent,
379 const std::string& jobName =
"source");
385 const std::string& jobName =
"source");
403 std::vector<std::string>& atomicFunctions,
404 const std::string& jobName =
"source");
408 std::vector<CGB>& dependent,
410 std::vector<std::string>& atomicFunctions,
411 const std::string& jobName =
"source");
417 std::vector<std::string>& atomicFunctions,
418 const std::string& jobName =
"source");
420 size_t getTemporaryVariableCount()
const;
422 size_t getTemporaryArraySize()
const;
424 size_t getTemporarySparseArraySize()
const;
434 virtual void reset();
451 inline Node* makeNode(CGOpCode op);
453 inline Node* makeNode(CGOpCode op,
456 inline Node* makeNode(CGOpCode op,
457 std::vector<Arg>&& args);
459 inline Node* makeNode(CGOpCode op,
460 std::vector<size_t>&& info,
461 std::vector<Arg>&& args);
463 inline Node* makeNode(CGOpCode op,
464 const std::vector<size_t>& info,
465 const std::vector<Arg>& args);
468 size_t iterationCount);
474 const std::vector<Arg >& endArgs);
478 const std::string& after);
495 inline Node* makeIndexDclrNode(
const std::string& name);
525 CGB createCG(
const Arg& arg);
531 const std::map<size_t, LoopModel<Base>*>& getLoops()
const;
535 inline size_t addLoopDependentIndexPattern(
IndexPattern& jacPattern);
537 inline void manageLoopDependentIndexPattern(
const IndexPattern* pattern);
539 inline size_t addLoopIndependentIndexPattern(
IndexPattern& pattern,
size_t hint);
544 static inline void findRandomIndexPatterns(
IndexPattern* ip,
545 std::set<RandomIndexPattern*>& found);
562 inline bool isSolvable(
Node& expression,
581 bool removeFromIndeps =
true);
585 bool removeFromIndeps =
true);
619 virtual Node* manageOperationNode(
Node* code);
628 size_t oldScope,
size_t newScope);
632 const std::vector<size_t>& iterationRegions,
633 ScopeIDType oldScope,
634 ScopeIDType commonScopeColor);
643 inline void updateVarScopeUsage(
Node* node,
644 ScopeIDType usageScope,
645 ScopeIDType oldUsageScope);
647 inline void addScopeToVarOrder(
size_t scope,
667 inline void replaceScope(
Node* node,
668 ScopeIDType oldScope,
669 ScopeIDType newScope);
683 inline bool containedInScope(
const Node& node,
686 inline static bool containsArgument(
const Node& node,
696 inline void addToEvaluationQueue(
Node& arg);
718 inline void repositionEvaluationQueue(
size_t fromPos,
744 inline void updateEvaluationQueueOrder(
Node& node,
745 size_t newEvalOrder);
747 inline bool isIndependent(
const Node& arg)
const;
749 inline bool isTemporary(
const Node& arg)
const;
751 inline static bool isTemporaryArray(
const Node& arg);
753 inline static bool isTemporarySparseArray(
const Node& arg);
755 inline static Node* getOperationFromAlias(
Node& alias);
757 inline size_t getEvaluationOrder(
const Node& node)
const;
759 inline void setEvaluationOrder(
Node& node,
762 inline size_t getLastUsageEvaluationOrder(
const Node& node)
const;
764 inline void setLastUsageEvaluationOrder(
const Node& node,
774 inline void setTotalUsageCount(
const Node& node,
777 inline void increaseTotalUsageCount(
const Node& node);
779 inline void resetManagedNodes();
785 inline void findPaths(SourceCodePath& path2node,
787 std::vector<SourceCodePath>& found,
790 static inline std::vector<SourceCodePath> findPathsFromNode(
const std::vector<SourceCodePath> nodePaths,
824 const SourceCodePath& path1,
825 const SourceCodePath& path2,
829 const SourceCodePath& pathRight);
832 const SourceCodePath& pathRight,
835 inline bool isSolvable(
const SourceCodePath& path)
const;
842 std::map<size_t, LoopModel<Base>*> loopModels;
843 std::vector<LoopEndOperationNode<Base>*> endNodes;
845 std::set<const Node*> indexes;
847 std::set<RandomIndexPattern*> indexRandomPatterns;
849 std::vector<IndexPattern*> dependentIndexPatterns;
850 std::vector<const IndexPattern*> dependentIndexPatternManaged;
851 std::vector<IndexPattern*> independentIndexPatterns;
853 std::vector<std::set<Node*> > outerVars;
857 std::vector<size_t> startEvalOrder;
863 inline void prepare4NewSourceGen();
874 inline const std::string*
getLoopName(
size_t id)
const;
880 size_t addDependentIndexPattern(
IndexPattern& jacPattern);
882 void manageDependentIndexPattern(
const IndexPattern* pattern);
884 size_t addIndependentIndexPattern(
IndexPattern& pattern,
size_t hint);
886 void addLoopEndNode(
Node& node);
892 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
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)
void makeVariables(VectorCG &variables)
CGB solveFor(Node &expression, Node &var)
bool handleTemporaryVarInDiffScopes(Node &code, size_t oldScope, size_t newScope)
CodeHandlerVector< Base, size_t > _operationCount
const std::map< size_t, CGAbstractAtomicFun< Base > *> & getAtomicFunctions() const
void undoSubstituteIndependent(Node &indep)
void reorderOperation(Node &node)
std::string getAtomicFunctionName(size_t id) const
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