1 /* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7     http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 
16 #ifndef TENSORFLOW_CORE_GRAPPLER_OP_TYPES_H_
17 #define TENSORFLOW_CORE_GRAPPLER_OP_TYPES_H_
18 
19 #include "tensorflow/core/framework/node_def.pb.h"
20 #include "tensorflow/core/framework/op.h"
21 #include "tensorflow/core/lib/core/status.h"
22 
23 namespace tensorflow {
24 namespace grappler {
25 bool IsAdd(const NodeDef& node);
26 bool IsAddN(const NodeDef& node);
27 bool IsAll(const NodeDef& node);
28 bool IsAngle(const NodeDef& node);
29 bool IsAny(const NodeDef& node);
30 bool IsAnyDiv(const NodeDef& node);
31 bool IsAnyBatchMatMul(const NodeDef& node);
32 bool IsAnyMatMul(const NodeDef& node);
33 bool IsAnyMax(const NodeDef& node);
34 bool IsAnyMaxPool(const NodeDef& node);
35 bool IsAnyMin(const NodeDef& node);
36 bool IsAnyMul(const NodeDef& node);
37 bool IsAnySparseSegmentReduction(const NodeDef& node);
38 bool IsApproximateEqual(const NodeDef& node);
39 bool IsArg(const NodeDef& node);
40 bool IsArgMax(const NodeDef& node);
41 bool IsArgMin(const NodeDef& node);
42 bool IsAssert(const NodeDef& node);
43 bool IsAssign(const NodeDef& node);
44 bool IsAtan2(const NodeDef& node);
45 bool IsAvgPoolGrad(const NodeDef& node);
46 bool IsBetainc(const NodeDef& node);
47 bool IsBiasAdd(const NodeDef& node);
48 bool IsBiasAddV2(const NodeDef& node);
49 bool IsBiasAddGrad(const NodeDef& node);
50 bool IsBitcast(const NodeDef& node);
51 bool IsBroadcastTo(const NodeDef& node);
52 bool IsCast(const NodeDef& node);
53 bool IsCheckNumerics(const NodeDef& node);
54 bool IsCollective(const NodeDef& node);
55 bool IsComplex(const NodeDef& node);
56 bool IsComplexAbs(const NodeDef& node);
57 bool IsConcat(const NodeDef& node);
58 bool IsConcatOffset(const NodeDef& node);
59 bool IsConj(const NodeDef& node);
60 bool IsConjugateTranspose(const NodeDef& node);
61 bool IsConstant(const NodeDef& node);
62 bool IsControlFlow(const NodeDef& node);
63 bool IsConv2D(const NodeDef& node);
64 bool IsConv2DBackpropFilter(const NodeDef& node);
65 bool IsConv2DBackpropInput(const NodeDef& node);
66 bool IsConv3D(const NodeDef& node);
67 bool IsConv3DBackpropFilterV2(const NodeDef& node);
68 bool IsConv3DBackpropInputV2(const NodeDef& node);
69 bool IsDepthwiseConv2dNative(const NodeDef& node);
70 bool IsDepthwiseConv2dNativeBackpropFilter(const NodeDef& node);
71 bool IsDepthwiseConv2dNativeBackpropInput(const NodeDef& node);
72 bool IsDequeueOp(const NodeDef& node);
73 bool IsDiv(const NodeDef& node);
74 bool IsDivNoNan(const NodeDef& node);
75 bool IsElementWiseMonotonic(const NodeDef& node, bool* is_non_decreasing);
76 bool IsElu(const NodeDef& node);
77 bool IsEluGrad(const NodeDef& node);
78 bool IsQuantizationEmulation(const NodeDef& node);
79 bool IsEnter(const NodeDef& node);
80 bool IsEqual(const NodeDef& node);
81 bool IsExit(const NodeDef& node);
82 bool IsExp(const NodeDef& node);
83 bool IsFakeParam(const NodeDef& node);
84 bool IsFill(const NodeDef& node);
85 bool IsFloorDiv(const NodeDef& node);
86 bool IsFloorMod(const NodeDef& node);
87 bool IsFusedBatchNorm(const NodeDef& node);
88 bool IsFusedBatchNormEx(const NodeDef& node);
89 bool IsFusedBatchNormGrad(const NodeDef& node);
90 bool IsGather(const NodeDef& node);
91 bool IsGreater(const NodeDef& node);
92 bool IsGreaterEqual(const NodeDef& node);
93 bool IsHistogramSummary(const NodeDef& node);
94 bool IsHostConstant(const NodeDef& node);
95 bool IsIdentity(const NodeDef& node);
96 bool IsIdentityN(const NodeDef& node);
97 bool IsIdentityNSingleInput(const NodeDef& node);
98 bool IsIf(const NodeDef& node);
99 bool IsIgamma(const NodeDef& node);
100 bool IsIgammac(const NodeDef& node);
101 bool IsImag(const NodeDef& node);
102 bool IsImmutableConst(const NodeDef& node);
103 bool IsInvGrad(const NodeDef& node);
104 bool IsLeakyRelu(const NodeDef& node);
105 bool IsLeakyReluGrad(const NodeDef& node);
106 bool IsLess(const NodeDef& node);
107 bool IsLessEqual(const NodeDef& node);
108 bool IsLog(const NodeDef& node);
109 bool IsLogicalAnd(const NodeDef& node);
110 bool IsLogicalNot(const NodeDef& node);
111 bool IsLogicalOr(const NodeDef& node);
112 bool IsLoopCond(const NodeDef& node);
113 bool IsMatMul(const NodeDef& node);
114 bool IsMax(const NodeDef& node);
115 bool IsMaxPoolGrad(const NodeDef& node);
116 bool IsMaximum(const NodeDef& node);
117 bool IsMean(const NodeDef& node);
118 bool IsMerge(const NodeDef& node);
119 bool IsMin(const NodeDef& node);
120 bool IsMinimum(const NodeDef& node);
121 bool IsMirrorPad(const NodeDef& node);
122 bool IsMirrorPadGrad(const NodeDef& node);
123 bool IsMod(const NodeDef& node);
124 bool IsMul(const NodeDef& node);
125 bool IsMulNoNan(const NodeDef& node);
126 bool IsNeg(const NodeDef& node);
127 bool IsNextIteration(const NodeDef& node);
128 bool IsNoOp(const NodeDef& node);
129 bool IsNotEqual(const NodeDef& node);
130 bool IsOnesLike(const NodeDef& node);
131 bool IsPack(const NodeDef& node);
132 bool IsPack(const NodeDef& node);
133 bool IsPad(const NodeDef& node);
134 bool IsPartitionedCall(const NodeDef& node);
135 bool IsPlaceholder(const NodeDef& node);
136 bool IsPolygamma(const NodeDef& node);
137 bool IsPow(const NodeDef& node);
138 bool IsPrint(const NodeDef& node);
139 bool IsProd(const NodeDef& node);
140 bool IsQuantizedMatMul(const NodeDef& node);
141 bool IsQueue(const NodeDef& node);
142 bool IsRandomShuffle(const NodeDef& node);
143 bool IsRank(const NodeDef& node);
144 bool IsReadVariableOp(const NodeDef& node);
145 bool IsReadVariablesOp(const NodeDef& node);
146 bool IsReal(const NodeDef& node);
147 bool IsRealDiv(const NodeDef& node);
148 bool IsReciprocalGrad(const NodeDef& node);
149 bool IsRecv(const NodeDef& node);
150 bool IsReduction(const NodeDef& node);
151 bool IsRelu(const NodeDef& node);
152 bool IsRelu6(const NodeDef& node);
153 bool IsRelu6Grad(const NodeDef& node);
154 bool IsReluGrad(const NodeDef& node);
155 bool IsReshape(const NodeDef& node);
156 bool IsRestore(const NodeDef& node);
157 bool IsRetval(const NodeDef& node);
158 bool IsReverse(const NodeDef& node);
159 bool IsReverseV2(const NodeDef& node);
160 bool IsRsqrt(const NodeDef& node);
161 bool IsRsqrtGrad(const NodeDef& node);
162 bool IsSelect(const NodeDef& node);
163 bool IsSeluGrad(const NodeDef& node);
164 bool IsSend(const NodeDef& node);
165 bool IsShape(const NodeDef& node);
166 bool IsShapeN(const NodeDef& node);
167 bool IsShuffle(const NodeDef& node);
168 bool IsSigmoidGrad(const NodeDef& node);
169 bool IsSize(const NodeDef& node);
170 bool IsSlice(const NodeDef& node);
171 bool IsSnapshot(const NodeDef& node);
172 bool IsSoftmax(const NodeDef& node);
173 bool IsSoftplusGrad(const NodeDef& node);
174 bool IsSoftsignGrad(const NodeDef& node);
175 bool IsSplit(const NodeDef& node);
176 bool IsSplitV(const NodeDef& node);
177 bool IsSqrt(const NodeDef& node);
178 bool IsSqrtGrad(const NodeDef& node);
179 bool IsSquare(const NodeDef& node);
180 bool IsSquaredDifference(const NodeDef& node);
181 bool IsSqueeze(const NodeDef& node);
182 bool IsStackCloseOp(const NodeDef& node);
183 bool IsStackOp(const NodeDef& node);
184 bool IsStackPopOp(const NodeDef& node);
185 bool IsStackPushOp(const NodeDef& node);
186 bool IsStatefulPartitionedCall(const NodeDef& node);
187 bool IsStopGradient(const NodeDef& node);
188 bool IsStridedSlice(const NodeDef& node);
189 bool IsStridedSliceGrad(const NodeDef& node);
190 bool IsSub(const NodeDef& node);
191 bool IsSum(const NodeDef& node);
192 bool IsSwitch(const NodeDef& node);
193 bool IsSymbolicGradient(const NodeDef& node);
194 bool IsTanh(const NodeDef& node);
195 bool IsTanhGrad(const NodeDef& node);
196 bool IsTensorArray(const NodeDef& node);
197 bool IsTile(const NodeDef& node);
198 bool IsTranspose(const NodeDef& node);
199 bool IsTruncateDiv(const NodeDef& node);
200 bool IsTruncateMod(const NodeDef& node);
201 bool IsUnique(const NodeDef& node);
202 bool IsUnpack(const NodeDef& node);
203 bool IsVariable(const NodeDef& node);
204 bool IsWhile(const NodeDef& node);
205 bool IsXdivy(const NodeDef& node);
206 bool IsXlaLaunch(const NodeDef& node);
207 bool IsZerosLike(const NodeDef& node);
208 bool IsZeta(const NodeDef& node);
209 
210 // Return true if the op is an aggregation (e.g. Add, AddN).
211 // Returns false if it could not be determined to be so.
212 bool IsAggregate(const NodeDef& node);
213 
214 // Return true if the op is commutative (e.g. Mul, Add).
215 // Returns false if it could not be determined to be so.
216 bool IsCommutative(const NodeDef& node);
217 
218 // Returns true if the node is known to use persistent memory to store its
219 // value.
220 bool IsPersistent(const NodeDef& node);
221 
222 // Returns true if the node belongs to the NC_DATASET class (see graph/graph.h).
223 bool IsDataset(const NodeDef& node);
224 
225 // Returns true if the node op is marked as stateful, or if it was not found in
226 // op_registry.
227 bool IsStateful(const NodeDef node, const OpRegistryInterface* op_registry);
228 bool IsStateful(const NodeDef node);  // use OpRegistry::Global()
229 
230 bool IsFreeOfSideEffect(const NodeDef& node,
231                         const OpRegistryInterface* op_registry);
232 bool IsFreeOfSideEffect(const NodeDef& node);  // use OpRegistry::Global()
233 
234 // Returns true if the takes a tensor reference as input.
235 // Returns false if the op type is unknown.
236 bool HasRefInput(const NodeDef& node);
237 
238 bool ModifiesFrameInfo(const NodeDef& node);
239 
240 // Returns true if the op is known to write to one or more of its inputs.
241 bool ModifiesInputsInPlace(const NodeDef& node);
242 
243 // Returns true if the op is an element-wise involution, i.e. if it is its
244 // own inverse such that f(f(x)) == x.
245 bool IsInvolution(const NodeDef& node);
246 
247 // Returns true if the op preserves the order and value of elements
248 // and shape of its first input tensor.
249 bool IsValueAndOrderAndShapePreserving(const NodeDef& node);
250 
251 // Returns true if the op preserves the order and value of elements in its
252 // first input tensor and possible changes its shape.
253 bool IsValueAndOrderPreserving(const NodeDef& node);
254 
255 // Returns true if the op in node only rearranges the order of elements in its
256 // first input tensor and possible changes its shape. More precisely, this
257 // function returns true if the op commutes with all element-wise operations.
258 bool IsValuePreserving(const NodeDef& node);
259 
260 // Returns true if node is idempotent w.r.t. its first input, i.e. if
261 // Op(Op(x, y, z), y, z) = Op(x, y, z).
262 bool IsIdempotent(const NodeDef& node);
263 
264 bool IsUnaryElementWise(const NodeDef& node);
265 
266 // Returns true if we can find an opdef corresponding to the op of the node.
267 bool HasOpDef(const NodeDef& node);
268 
269 // Returns true if the op changes the scalar type of its first input elements
270 // and preserves the number of elements.
271 bool IsCastLike(const NodeDef& node);
272 
273 // Returns true if this op never forwards any of its inputs, i.e. always
274 // allocates buffers for its inputs.
275 bool NeverForwardsInputs(const NodeDef& node);
276 
277 }  // end namespace grappler
278 }  // end namespace tensorflow
279 
280 #endif  // TENSORFLOW_CORE_GRAPPLER_OP_TYPES_H_
281