pytorch/caffe2/operators/onnx_while_op.cc
Nikita Shulga a9b0a921d5 Disable avoid-non-const-global-variables lint check (#62008)
Summary:
As GoogleTest `TEST` macro is non-compliant with it as well as `DEFINE_DISPATCH`

All changes but the ones to `.clang-tidy` are generated using following script:
```
for i in `find . -type f -iname "*.c*" -or -iname "*.h"|xargs grep cppcoreguidelines-avoid-non-const-global-variables|cut -f1 -d:|sort|uniq`;  do sed -i "/\/\/ NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)/d" $i; done
```

Pull Request resolved: https://github.com/pytorch/pytorch/pull/62008

Reviewed By: driazati, r-barnes

Differential Revision: D29838584

Pulled By: malfet

fbshipit-source-id: 1b2f8602c945bd4ce50a9bfdd204755556e31d13
2021-07-22 18:04:40 -07:00

83 lines
3.3 KiB
C++

#include "caffe2/operators/onnx_while_op.h"
namespace caffe2 {
REGISTER_CPU_OPERATOR(ONNXWhile, ONNXWhileOp<CPUContext>);
OPERATOR_SCHEMA(ONNXWhile)
.NumInputs(2, INT_MAX)
.NumOutputs(0, INT_MAX)
.SetDoc(R"DOC(
*** EXPERIMENTAL. This operator is a work-in-progress. No assumption should be
made about the stability or correctness of this op. ***
Generic Looping construct confirming to the ONNX Loop operator spec. This loop
has multiple termination conditions:
1. Trip count. Iteration count specified at runtime. Set by specifying the
input M. Optional. Set to empty string to omit. Note that a static trip
count (specified at graph construction time) can be specified by passing
in a constant node for input M.
2. Loop termination condition. This is an input to the op that determines
whether to run the first interation and also a loop-carried dependency for
the body graph. The body graph must yield a value for the condition
variable, whether this input is provided or not.
This table summarizes the operating modes of this operator with equivalent
C-style code:
Operator inputs defined as (max_trip_count, condition_var). Omitted optional
inputs are represented as empty string. Concretely, in this caffe2 op an input
is marked as omitted by setting its 'has_{name}' argument to False.
input ("", ""):
for (int i=0; ; ++i) {
cond = ... // Note this value is ignored, but is required in the body
}
input ("", cond) // Note this is analogous to a while loop
bool cond = ...;
for (int i=0; cond; ++i) {
cond = ...;
}
input ("", 1) // Note this is analogous to a do-while loop
bool cond = true
for (int i=0; cond; ++i) {
cond = ...;
}
input (trip_count, "") // Note this is analogous to a for loop
int trip_count = ...
for (int i=0; i < trip_count; ++i) {
cond = ...; // ignored
}
input (trip_count, cond)
int trip_count = ...;
bool cond = ...;
for (int i=0; i < trip_count && cond; ++i) {
cond = ...;
}
)DOC")
.Arg("body", "Net executed on each iteration")
.Arg("has_trip_count", "Whether to use the trip count input")
.Arg("has_cond", "Whether to use the condition input")
.Arg("save_scopes", "Whether to save the scopes across iterations, as in "
"for backprop")
.Arg("disable_scopes", "Do not create new scopes. Use this only if you're "
"certain there will be no name collision, for "
"example if you're converting from a fully-SSA IR")
.NumInputs(2, INT_MAX)
.Input(0, "max_trip_count", "Number of iterations to go out to. Used if "
"the flag has_trip_count is True.")
.Input(1, "first_iter_condition", "Dynamic condition value for the first "
"iteration. For all subsequent iterations,"
" the condition from the body graph is "
"used. This input is used if the flag "
"has_cond is true.")
.NumOutputs(0, INT_MAX)
.AllowInplace([](int in, int out) -> bool { return true; });
} // namespace caffe2