1 #ifndef CPPAD_CG_ATOMIC_DEPENDENCY_LOCATOR_INCLUDED     2 #define CPPAD_CG_ATOMIC_DEPENDENCY_LOCATOR_INCLUDED    34     std::set<std::pair<size_t, size_t>> 
sizes;
    53     std::map<size_t, AtomicUseInfo<Base>> atomicInfo_;
    54     std::map<OperationNode<Base>*, std::set<size_t> > indeps_;
    62     inline const std::map<size_t, AtomicUseInfo<Base>>& findAtomicsUsage() {
    63         if (!atomicInfo_.empty()) {
    67         size_t m = fun_.Range();
    68         size_t n = fun_.Domain();
    70         std::vector<CG<Base> > x(n);
    74         assert(x.size() == 0 || (x[0].getOperationNode()->getHandlerPosition() == 0 && x[x.size() - 1].getOperationNode()->getHandlerPosition() == x.size() - 1));
    76         std::vector<CG<Base> > dep = fun_.Forward(0, x);
    78         for (
size_t i = 0; i < m; i++) {
    79             findAtomicsUsage(dep[i].getOperationNode());
    83         for (
auto& pair: atomicInfo_) {
    84             size_t id = pair.first;
    86             pair.second.atom = regAtomics.at(
id);
    96             return std::set<size_t>();
    99         if (op == CGOpCode::Inv) {
   100             std::set<size_t> indeps;
   106         if (handler_.isVisited(*node)) {
   108             return indeps_.at(node);
   111         handler_.markVisited(*node);
   113         std::set<size_t> indeps;
   114         const std::vector<Argument<Base> >& args = node->
getArguments();
   115         for (
size_t a = 0; a < args.size(); a++) {
   116             std::set<size_t> aindeps = findAtomicsUsage(args[a].getOperation());
   117             indeps.insert(aindeps.begin(), aindeps.end());
   119         indeps_[node] = indeps;
   121         if (op == CGOpCode::AtomicForward) {
   122             CPPADCG_ASSERT_UNKNOWN(node->
getInfo().size() > 1);
   123             CPPADCG_ASSERT_UNKNOWN(node->
getArguments().size() > 1);
   124             size_t id = node->
getInfo()[0];
   128             CPPADCG_ASSERT_UNKNOWN(p == 0);
   134             CPPADCG_ASSERT_UNKNOWN(tx != 
nullptr && tx->
getOperationType() == CGOpCode::ArrayCreation);
   135             CPPADCG_ASSERT_UNKNOWN(ty != 
nullptr && ty->
getOperationType() == CGOpCode::ArrayCreation);
   137             auto& info = atomicInfo_[id];
   138             info.outerIndeps.insert(indeps.begin(), indeps.end());
   139             info.sizes.insert(std::pair<size_t, size_t>(tx->
getArguments().size(),
 
CGAbstractAtomicFun< Base > * atom
const std::vector< Argument< Base > > & getArguments() const
size_t getHandlerPosition() const
CGOpCode getOperationType() const
void makeVariables(VectorCG &variables)
const std::map< size_t, CGAbstractAtomicFun< Base > *> & getAtomicFunctions() const
std::set< size_t > outerIndeps
std::set< std::pair< size_t, size_t > > sizes
const std::vector< size_t > & getInfo() const