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;
342 inline std::vector<SourceCodePath>
findPaths(Node& root,
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);
559 inline CGB
solveFor(Node& expression,
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,
805 inline CGB
solveFor(
const SourceCodePath& path);
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>;