| 386 | |
| 387 | template<typename T> |
| 388 | void evalNodes(vector<Param<T>>& outputs, const vector<Node*>& output_nodes) { |
| 389 | if (outputs.empty()) return; |
| 390 | Node_map_t nodes; |
| 391 | vector<Node*> full_nodes; |
| 392 | vector<Node_ids> full_ids; |
| 393 | vector<int> output_ids; |
| 394 | vector<Node_ptr> node_clones; |
| 395 | |
| 396 | bool is_linear{true}; |
| 397 | dim_t numOutElems{1}; |
| 398 | assert(outputs.size() == output_nodes.size()); |
| 399 | KParam& out_info{outputs[0].info}; |
| 400 | dim_t* outDims{out_info.dims}; |
| 401 | dim_t* outStrides{out_info.strides}; |
| 402 | // unsigned nrInputs{0}; |
| 403 | |
| 404 | dim_t ndims{outDims[3] > 1 ? 4 |
| 405 | : outDims[2] > 1 ? 3 |
| 406 | : outDims[1] > 1 ? 2 |
| 407 | : outDims[0] > 0 ? 1 |
| 408 | : 0}; |
| 409 | for (dim_t dim{0}; dim < ndims; ++dim) { |
| 410 | is_linear &= (numOutElems == outStrides[dim]); |
| 411 | numOutElems *= outDims[dim]; |
| 412 | } |
| 413 | if (numOutElems == 0) { return; } |
| 414 | |
| 415 | for (Node* node : output_nodes) { |
| 416 | const int id{node->getNodesMap(nodes, full_nodes, full_ids)}; |
| 417 | output_ids.push_back(id); |
| 418 | } |
| 419 | |
| 420 | node_clones.clear(); |
| 421 | node_clones.reserve(full_nodes.size()); |
| 422 | for (Node* node : full_nodes) { node_clones.emplace_back(node->clone()); } |
| 423 | |
| 424 | bool moddimsFound{false}; |
| 425 | for (const Node* node : full_nodes) { |
| 426 | is_linear &= node->isLinear(outDims); |
| 427 | moddimsFound |= (node->getOp() == af_moddims_t); |
| 428 | // if (node->isBuffer()) { ++nrInputs; } |
| 429 | } |
| 430 | |
| 431 | bool emptyColumnsFound{false}; |
| 432 | if (is_linear) { |
| 433 | outDims[0] = numOutElems; |
| 434 | outDims[1] = 1; |
| 435 | outDims[2] = 1; |
| 436 | outDims[3] = 1; |
| 437 | outStrides[0] = 1; |
| 438 | outStrides[1] = numOutElems; |
| 439 | outStrides[2] = numOutElems; |
| 440 | outStrides[3] = numOutElems; |
| 441 | ndims = 1; |
| 442 | } else { |
| 443 | emptyColumnsFound = ndims > (outDims[0] == 1 ? 1 |
| 444 | : outDims[1] == 1 ? 2 |
| 445 | : outDims[2] == 1 ? 3 |
no test coverage detected