133 if (evalsAtomic_.find(&node) != evalsAtomic_.end()) {
138 throw CGException(
"Evaluator can only handle zero forward mode for atomic functions");
141 const std::vector<size_t>& info = node.
getInfo();
142 const std::vector<Argument<ScalarIn> >& args = node.
getArguments();
143 CPPADCG_ASSERT_KNOWN(args.size() == 2,
"Invalid number of arguments for atomic forward mode")
144 CPPADCG_ASSERT_KNOWN(info.size() == 3,
"Invalid number of information data for atomic forward mode")
148 typename std::map<size_t, atomic_base<ScalarOut>* >::const_iterator itaf = atomicFunctions_.find(
id);
149 atomic_base<ScalarOut>* atomicFunction =
nullptr;
150 if (itaf != atomicFunctions_.end()) {
151 atomicFunction = itaf->second;
154 if (atomicFunction ==
nullptr) {
155 std::stringstream ss;
156 ss <<
"No atomic function defined in the evaluator for ";
158 if (!atomName.empty()) {
159 ss <<
"'" << atomName <<
"'";
161 ss <<
"id '" <<
id <<
"'";
167 throw CGException(
"Evaluator can only handle zero forward mode for atomic functions");
169 const std::vector<ActiveOut>& ax = evalArrayCreationOperation(*args[0].getOperation());
170 std::vector<ActiveOut>& ay = evalArrayCreationOperation(*args[1].getOperation());
172 (*atomicFunction)(ax, ay);
174 evalsAtomic_.insert(&node);
183 CPPADCG_ASSERT_KNOWN(args.size() == 1,
"Invalid number of arguments for print()")
188 std::cout << nodePri.getBeforeString() << out << nodePri.getAfterString();
191 CppAD::PrintFor(
ActiveOut(0), nodePri.getBeforeString().c_str(), out, nodePri.getAfterString().c_str());