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