MCPcopy Create free account
hub / github.com/NVIDIA/TensorRT / parsePermute

Function parsePermute

parsers/caffe/caffeParser/opParsers/parsePermute.cpp:24–81  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

22namespace nvcaffeparser1
23{
24ILayer* parsePermute(INetworkDefinition& network, const trtcaffe::LayerParameter& msg, CaffeWeightFactory& /*weightFactory*/, BlobNameToTensor& tensors)
25{
26 if (!checkBlobs(msg, 1, 1))
27 {
28 return nullptr;
29 }
30
31 const trtcaffe::PermuteParameter& p = msg.permute_param();
32 Dims bottomDims = tensors[msg.bottom(0)]->getDimensions();
33 Dims topDims = tensors[msg.bottom(0)]->getDimensions();
34 int nbDims = bottomDims.nbDims;
35
36 std::vector<int> orders;
37 std::vector<bool> knownOrders(nbDims + 1, false);
38 bool orderAbort = (p.order(0) != 0); // First order must be 0 (batch dimension)
39 for (int i = 0; i < p.order_size(); i++)
40 {
41 int order = p.order(i);
42 orderAbort |= (order > nbDims) || (std::find(orders.begin(), orders.end(), order) != orders.end());
43 orders.push_back(order);
44 knownOrders[order] = true;
45 }
46
47 if (orderAbort)
48 {
49 std::cout << "Caffe Parser: Invalid permute param. TensorRT does not support permute in N (batch) dimension, and order index must be within the tensor dimensions. no duplicate order allowed." << std::endl;
50 return nullptr;
51 }
52
53 // Keep the rest of the order
54 for (int i = 0; i < nbDims; i++)
55 {
56 if (!knownOrders[i])
57 {
58 orders.push_back(i);
59 }
60 }
61
62 // Remove the first order (batch)
63 orders.erase(orders.begin());
64
65 for (int i = 0; i < nbDims; i++)
66 {
67 topDims.d[i] = bottomDims.d[orders[i] - 1];
68 }
69 assert(parserutils::volume(topDims) == parserutils::volume(bottomDims));
70
71 nvinfer1::Permutation permuteOrder;
72 for (int i = 0; i < nbDims; i++)
73 {
74 permuteOrder.order[i] = orders[i] - 1;
75 }
76
77 auto permute = network.addShuffle(*tensors[msg.bottom(0)]);
78 permute->setReshapeDimensions(topDims);
79 permute->setFirstTranspose(permuteOrder);
80 return permute;
81}

Callers

nothing calls this directly

Calls 6

checkBlobsFunction · 0.85
addShuffleMethod · 0.80
setReshapeDimensionsMethod · 0.80
setFirstTransposeMethod · 0.80
volumeFunction · 0.50
getDimensionsMethod · 0.45

Tested by

no test coverage detected