tvm
Loading...
Searching...
No Matches
operation.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
24#ifndef TVM_TE_OPERATION_H_
25#define TVM_TE_OPERATION_H_
26
27#include <tvm/arith/analyzer.h>
28#include <tvm/ffi/reflection/registry.h>
29#include <tvm/ir/cow.h>
30#include <tvm/ir/prim/expr.h>
31#include <tvm/te/tensor.h>
32#include <tvm/tirx/buffer.h>
33#include <tvm/tirx/op.h>
34
35#include <string>
36#include <unordered_map>
37#include <utility>
38#include <vector>
39
40namespace tvm {
42namespace te {
43
44// Reduce operator
49class CommReducerNode : public ffi::Object {
50 public:
52 ffi::Array<tirx::PrimVar> lhs;
54 ffi::Array<tirx::PrimVar> rhs;
56 ffi::Array<PrimExpr> result;
62 ffi::Array<PrimExpr> identity_element;
64 ffi::Array<PrimExpr> operator()(ffi::Array<PrimExpr> a, ffi::Array<PrimExpr> b) const;
69 mutable Span span;
70
71 static void RegisterReflection() {
72 namespace refl = tvm::ffi::reflection;
73 refl::ObjectDef<CommReducerNode>()
74 .def_ro("lhs", &CommReducerNode::lhs, refl::AttachFieldFlag::SEqHashDefRecursive())
75 .def_ro("rhs", &CommReducerNode::rhs, refl::AttachFieldFlag::SEqHashDefRecursive())
76 .def_ro("result", &CommReducerNode::result)
77 .def_ro("identity_element", &CommReducerNode::identity_element)
78 .def_ro("span", &CommReducerNode::span, refl::AttachFieldFlag::SEqHashIgnore());
79 }
80
82 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.CommReducer", CommReducerNode, ffi::Object);
83};
84
89class CommReducer : public ffi::ObjectRef {
90 public:
91 TVM_DLL CommReducer(ffi::Array<tirx::PrimVar> lhs, ffi::Array<tirx::PrimVar> rhs,
92 ffi::Array<PrimExpr> result, ffi::Array<PrimExpr> identity_element,
93 Span span = Span());
95};
96
98class ReduceNode : public OpaqueExprNode {
99 public:
103 ffi::Array<PrimExpr> source;
105 ffi::Array<PrimExpr> init;
107 ffi::Array<tirx::IterVar> axis;
115
116 static void RegisterReflection() {
117 namespace refl = tvm::ffi::reflection;
118 refl::ObjectDef<ReduceNode>()
119 .def_ro("combiner", &ReduceNode::combiner)
120 .def_ro("source", &ReduceNode::source)
121 .def_ro("init", &ReduceNode::init)
122 .def_ro("axis", &ReduceNode::axis)
123 .def_ro("condition", &ReduceNode::condition)
124 .def_ro("value_index", &ReduceNode::value_index);
125 }
127};
128
133class Reduce : public PrimExpr {
134 public:
135 TVM_DLL Reduce(CommReducer combiner, ffi::Array<PrimExpr> src, ffi::Array<tirx::IterVar> rdom,
136 PrimExpr condition, int value_index, ffi::Array<PrimExpr> init,
137 Span span = Span());
139 static constexpr bool _type_container_is_exact = true;
141};
142
147struct TensorDom {
148 // constructor
149 explicit TensorDom(int ndim) : data(ndim) {}
151 std::vector<std::vector<IntSet>> data;
152};
153
157class TVM_DLL OperationNode : public ffi::Object {
158 public:
160 std::string name;
162 std::string tag;
164 ffi::Map<ffi::String, ffi::Any> attrs;
165 // virtual destructor.
166 virtual ~OperationNode() {}
168 virtual int num_outputs() const = 0;
174 virtual PrimType output_dtype(size_t i) const = 0;
180 virtual ffi::Array<PrimExpr> output_shape(size_t i) const = 0;
185 virtual ffi::Array<Tensor> InputTensors() const = 0;
186
187 static void RegisterReflection() {
188 namespace refl = tvm::ffi::reflection;
189 refl::ObjectDef<OperationNode>()
190 .def_ro("name", &OperationNode::name)
191 .def_ro("tag", &OperationNode::tag)
192 .def_ro("attrs", &OperationNode::attrs);
193 }
194 TVM_FFI_DECLARE_OBJECT_INFO("te.Operation", OperationNode, ffi::Object);
195};
196
201 public:
203 ffi::Array<PrimExpr> shape;
206 // override behavior.
209 ffi::Array<PrimExpr> output_shape(size_t i) const final;
211
213 namespace refl = tvm::ffi::reflection;
214 refl::ObjectDef<PlaceholderOpNode>()
215 .def_ro("shape", &PlaceholderOpNode::shape)
216 .def_ro("dtype", &PlaceholderOpNode::dtype);
217 }
219};
220
225class PlaceholderOp : public Operation {
226 public:
227 TVM_DLL PlaceholderOp(std::string name, ffi::Array<PrimExpr> shape, PrimType dtype);
228
230};
231
237 public:
239 ffi::Array<IterVar> axis;
241 ffi::Array<IterVar> reduce_axis;
242 // override functions
243 ffi::Array<PrimExpr> output_shape(size_t idx) const final;
244
245 static void RegisterReflection() {
246 namespace refl = tvm::ffi::reflection;
247 refl::ObjectDef<BaseComputeOpNode>()
248 .def_ro("axis", &BaseComputeOpNode::axis)
249 .def_ro("reduce_axis", &BaseComputeOpNode::reduce_axis);
250 }
252};
253
258 public:
260 ffi::Array<PrimExpr> body;
263 // override functions
265 PrimType output_dtype(size_t i) const final;
266 ffi::Array<Tensor> InputTensors() const final;
267
268 static void RegisterReflection() {
269 namespace refl = tvm::ffi::reflection;
270 refl::ObjectDef<ComputeOpNode>().def_ro("body", &ComputeOpNode::body);
271 }
273};
274
279class ComputeOp : public Operation {
280 public:
281 TVM_DLL ComputeOp(std::string name, std::string tag, ffi::Map<ffi::String, ffi::Any> attrs,
282 ffi::Array<IterVar> axis, ffi::Array<PrimExpr> body);
283
286};
287
291class ScanOpNode : public OperationNode {
292 public:
296 ffi::Array<Tensor> init;
298 ffi::Array<Tensor> update;
300 ffi::Array<Tensor> state_placeholder;
305 ffi::Array<Tensor> inputs;
315 ffi::Array<IterVar> spatial_axis_;
318 // override behavior.
321 ffi::Array<PrimExpr> output_shape(size_t i) const final;
323
325 namespace refl = tvm::ffi::reflection;
326 refl::ObjectDef<ScanOpNode>()
327 .def_ro("scan_axis", &ScanOpNode::scan_axis)
328 .def_ro("init", &ScanOpNode::init)
329 .def_ro("update", &ScanOpNode::update)
330 .def_ro("state_placeholder", &ScanOpNode::state_placeholder)
331 .def_ro("inputs", &ScanOpNode::inputs)
332 .def_ro("spatial_axis_", &ScanOpNode::spatial_axis_);
333 }
335};
336
341class ScanOp : public Operation {
342 public:
343 TVM_DLL ScanOp(std::string name, std::string tag,
344 ffi::Optional<ffi::Map<ffi::String, ffi::Any>> attrs, IterVar axis,
345 ffi::Array<Tensor> init, ffi::Array<Tensor> update,
346 ffi::Array<Tensor> state_placeholder, ffi::Array<Tensor> input);
347
349};
350
355 public:
357 ffi::Array<Tensor> inputs;
359 ffi::Array<BufferVar> input_placeholders;
361 ffi::Array<BufferVar> output_placeholders;
364
367 // override functions
370 ffi::Array<PrimExpr> output_shape(size_t i) const final;
372
374 namespace refl = tvm::ffi::reflection;
375 refl::ObjectDef<ExternOpNode>()
376 .def_ro("inputs", &ExternOpNode::inputs)
377 .def_ro("input_placeholders", &ExternOpNode::input_placeholders)
378 .def_ro("output_placeholders", &ExternOpNode::output_placeholders)
379 .def_ro("body", &ExternOpNode::body);
380 }
382};
383
388class ExternOp : public Operation {
389 public:
390 TVM_DLL ExternOp(std::string name, std::string tag, ffi::Map<ffi::String, ffi::Any> attrs,
391 ffi::Array<Tensor> inputs, ffi::Array<BufferVar> input_placeholders,
392 ffi::Array<BufferVar> output_placeholders, Stmt body);
393
395};
396
402TVM_DLL PrimVar var(std::string name_hint, PrimType t = PrimType::Int(32));
403
410TVM_DLL IterVar thread_axis(Range dom, std::string tag);
411
418TVM_DLL IterVar reduce_axis(Range dom, std::string name = "rv");
419
421using FCompute = std::function<PrimExpr(const ffi::Array<PrimVar>& i)>;
422
424using FBatchCompute = std::function<ffi::Array<PrimExpr>(const ffi::Array<PrimVar>& i)>;
425
432TVM_DLL Tensor placeholder(ffi::Array<PrimExpr> shape, PrimType dtype = PrimType::Float(32),
433 std::string name = "placeholder");
434
444TVM_DLL Tensor compute(ffi::Array<PrimExpr> shape, FCompute fcompute, std::string name = "tensor",
445 std::string tag = "", ffi::Map<ffi::String, ffi::Any> attrs = {});
446
456TVM_DLL ffi::Array<Tensor> compute(ffi::Array<PrimExpr> shape, FBatchCompute fcompute,
457 std::string name = "tensor", std::string tag = "",
458 ffi::Map<ffi::String, ffi::Any> attrs = {});
459
472TVM_DLL ffi::Array<Tensor> scan(ffi::Array<Tensor> init, ffi::Array<Tensor> update,
473 ffi::Array<Tensor> state_placeholder,
474 ffi::Array<Tensor> inputs = ffi::Array<Tensor>(),
475 std::string name = "scan", std::string tag = "",
476 ffi::Map<ffi::String, ffi::Any> attrs = {});
477
478// same as compute, specialized for different fcompute function
479inline Tensor compute(ffi::Array<PrimExpr> shape, std::function<PrimExpr(PrimVar)> f,
480 std::string name = "tensor", std::string tag = "",
481 ffi::Map<ffi::String, ffi::Any> attrs = {}) {
482 FCompute fc = [f](const ffi::Array<PrimVar>& i) { return f(i[0]); };
483 return compute(shape, fc, name, tag, attrs);
484}
485inline Tensor compute(ffi::Array<PrimExpr> shape, std::function<PrimExpr(PrimVar, PrimVar)> f,
486 std::string name = "tensor", std::string tag = "",
487 ffi::Map<ffi::String, ffi::Any> attrs = {}) {
488 FCompute fc = [f](const ffi::Array<PrimVar>& i) { return f(i[0], i[1]); };
489 return compute(shape, fc, name, tag, attrs);
490}
491inline Tensor compute(ffi::Array<PrimExpr> shape,
492 std::function<PrimExpr(PrimVar, PrimVar, PrimVar)> f,
493 std::string name = "tensor", std::string tag = "",
494 ffi::Map<ffi::String, ffi::Any> attrs = {}) {
495 FCompute fc = [f](const ffi::Array<PrimVar>& i) { return f(i[0], i[1], i[2]); };
496 return compute(shape, fc, name, tag, attrs);
497}
498inline Tensor compute(ffi::Array<PrimExpr> shape,
499 std::function<PrimExpr(PrimVar, PrimVar, PrimVar, PrimVar)> f,
500 std::string name = "tensor", std::string tag = "",
501 ffi::Map<ffi::String, ffi::Any> attrs = {}) {
502 FCompute fc = [f](const ffi::Array<PrimVar>& i) { return f(i[0], i[1], i[2], i[3]); };
503 return compute(shape, fc, name, tag, attrs);
504}
505
506// inline function.
508 return static_cast<const OperationNode*>(get());
509}
510} // namespace te
511
512namespace ffi {
513
514template <>
515inline constexpr bool object_ref_contains_v<PrimExpr, te::ReduceNode> = true;
516
517} // namespace ffi
518} // namespace tvm
519#endif // TVM_TE_OPERATION_H_
Algebra expression simplifications.
Symbolic n-dimensional array, to represent a memory buffer.
Base node for opaque construction-time expressions.
Definition base_expr.h:352
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:401
Definition base_expr.h:137
static PrimType Float(int bits, int lanes=1)
Construct a floating-point type with fixed lanes.
static PrimType Void()
Construct the void sentinel type, encoded as handle(0, 0).
static PrimType Int(int bits, int lanes=1)
Construct a signed integer type with fixed lanes.
Range container
Definition expr.h:610
Definition source_map.h:111
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
A Compute op that compute a tensor on certain domain. This is the base class for ComputeOp (operating...
Definition operation.h:236
ffi::Array< IterVar > reduce_axis
IterVar on each reduction axis, if the body is a Reduce.
Definition operation.h:241
static void RegisterReflection()
Definition operation.h:245
ffi::Array< PrimExpr > output_shape(size_t idx) const final
Get shape of i-th output tensor.
TVM_FFI_DECLARE_OBJECT_INFO("te.BaseComputeOp", BaseComputeOpNode, OperationNode)
ffi::Array< IterVar > axis
IterVar on each axis.
Definition operation.h:239
A commutative reducer node to represent a commutative binary operator with identity element.
Definition operation.h:49
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.CommReducer", CommReducerNode, ffi::Object)
ffi::Array< tirx::PrimVar > lhs
The left argument of reducer.
Definition operation.h:52
Span span
Span that points to the original source code. Reserved debug information.
Definition operation.h:69
ffi::Array< tirx::PrimVar > rhs
The right argument of reducer.
Definition operation.h:54
ffi::Array< PrimExpr > operator()(ffi::Array< PrimExpr > a, ffi::Array< PrimExpr > b) const
Function call operator to combine a and b.
ffi::Array< PrimExpr > identity_element
The identity element of reducer, which leaves other elements unchanged when combined with it,...
Definition operation.h:62
ffi::Array< PrimExpr > result
The result of reducer.
Definition operation.h:56
static constexpr TVMFFISEqHashKind _type_s_eq_hash_kind
Definition operation.h:81
static void RegisterReflection()
Definition operation.h:71
Managed reference to CommReducerNode.
Definition operation.h:89
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(CommReducer, ffi::ObjectRef, CommReducerNode)
CommReducer(ffi::Array< tirx::PrimVar > lhs, ffi::Array< tirx::PrimVar > rhs, ffi::Array< PrimExpr > result, ffi::Array< PrimExpr > identity_element, Span span=Span())
A Compute op that compute a tensor on certain domain.
Definition operation.h:257
ComputeOpNode()
constructor
Definition operation.h:262
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.ComputeOp", ComputeOpNode, BaseComputeOpNode)
int num_outputs() const final
ffi::Array< PrimExpr > body
the compute expression
Definition operation.h:260
Managed reference to ComputeOpNode.
Definition operation.h:279
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(ComputeOp, Operation, ComputeOpNode)
ComputeOp(std::string name, std::string tag, ffi::Map< ffi::String, ffi::Any > attrs, ffi::Array< IterVar > axis, ffi::Array< PrimExpr > body)
TVM_DEFINE_OBJECT_REF_COW_METHOD(ComputeOpNode)
External computation that cannot be splitted.
Definition operation.h:354
int num_outputs() const final
ffi::Array< BufferVar > input_placeholders
Symbolic placeholder representation of inputs.
Definition operation.h:359
ffi::Array< BufferVar > output_placeholders
Symbolic placeholder representation of outputs.
Definition operation.h:361
ffi::Array< Tensor > inputs
The input tensors.
Definition operation.h:357
PrimType output_dtype(size_t i) const final
Get the primitive element type of the i-th output tensor.
static void RegisterReflection()
Definition operation.h:373
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.ExternOp", ExternOpNode, OperationNode)
Stmt body
the statement that generates the computation.
Definition operation.h:363
ExternOpNode()
constructor
Definition operation.h:366
ffi::Array< Tensor > InputTensors() const final
List all the input Tensors.
ffi::Array< PrimExpr > output_shape(size_t i) const final
Get shape of i-th output tensor.
Managed reference to ExternOpNode.
Definition operation.h:388
ExternOp(std::string name, std::string tag, ffi::Map< ffi::String, ffi::Any > attrs, ffi::Array< Tensor > inputs, ffi::Array< BufferVar > input_placeholders, ffi::Array< BufferVar > output_placeholders, Stmt body)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(ExternOp, Operation, ExternOpNode)
Base class of all operation nodes.
Definition operation.h:157
TVM_FFI_DECLARE_OBJECT_INFO("te.Operation", OperationNode, ffi::Object)
virtual ~OperationNode()
Definition operation.h:166
static void RegisterReflection()
Definition operation.h:187
virtual PrimType output_dtype(size_t i) const =0
Get the primitive element type of the i-th output tensor.
virtual int num_outputs() const =0
virtual ffi::Array< Tensor > InputTensors() const =0
List all the input Tensors.
virtual ffi::Array< PrimExpr > output_shape(size_t i) const =0
Get shape of i-th output tensor.
ffi::Map< ffi::String, ffi::Any > attrs
additional attributes of the operation
Definition operation.h:164
std::string name
optional name of the operation
Definition operation.h:160
std::string tag
optional tag of the operation
Definition operation.h:162
Operation that produces tensors.
Definition tensor.h:48
const OperationNode * operator->() const
access the internal node container
Definition operation.h:507
A placeholder op represents an input placeholder.
Definition operation.h:200
ffi::Array< Tensor > InputTensors() const final
List all the input Tensors.
TVM_FFI_DECLARE_OBJECT_INFO("te.PlaceholderOp", PlaceholderOpNode, OperationNode)
static void RegisterReflection()
Definition operation.h:212
ffi::Array< PrimExpr > shape
The shape of the input.
Definition operation.h:203
int num_outputs() const final
ffi::Array< PrimExpr > output_shape(size_t i) const final
Get shape of i-th output tensor.
PrimType dtype
The dtype of the input.
Definition operation.h:205
PrimType output_dtype(size_t i) const final
Get the primitive element type of the i-th output tensor.
Managed reference to PlaceholderOpNode.
Definition operation.h:225
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(PlaceholderOp, Operation, PlaceholderOpNode)
PlaceholderOp(std::string name, ffi::Array< PrimExpr > shape, PrimType dtype)
Reduction operator.
Definition operation.h:98
ffi::Array< tirx::IterVar > axis
The reduction axis.
Definition operation.h:107
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.Reduce", ReduceNode, OpaqueExprNode)
ffi::Array< PrimExpr > init
The init operand.
Definition operation.h:105
int value_index
the index of this reduce node
Definition operation.h:114
ffi::Array< PrimExpr > source
The source operand.
Definition operation.h:103
CommReducer combiner
The commutative combiner.
Definition operation.h:101
PrimExpr condition
Predicate on the reduction Only add the body to reduction if condition is true.
Definition operation.h:112
static void RegisterReflection()
Definition operation.h:116
Managed reference to ReduceNode.
Definition operation.h:133
Reduce(CommReducer combiner, ffi::Array< PrimExpr > src, ffi::Array< tirx::IterVar > rdom, PrimExpr condition, int value_index, ffi::Array< PrimExpr > init, Span span=Span())
TVM_DEFINE_OBJECT_REF_COW_METHOD(ReduceNode)
static constexpr bool _type_container_is_exact
Definition operation.h:139
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Reduce, PrimExpr, ReduceNode)
Symbolic scan.
Definition operation.h:291
ffi::Array< Tensor > state_placeholder
The placeholder to refer as states in update.
Definition operation.h:300
ScanOpNode()
constructor
Definition operation.h:317
int num_outputs() const final
ffi::Array< Tensor > init
the initialization tensors
Definition operation.h:296
ffi::Array< Tensor > update
the update function represented by tensor
Definition operation.h:298
ffi::Array< Tensor > inputs
the inputs to the scan, these are optionally provided But they can be helpful to provide hints to spe...
Definition operation.h:305
ffi::Array< Tensor > InputTensors() const final
List all the input Tensors.
static void RegisterReflection()
Definition operation.h:324
IterVar scan_axis
IterVar to scan over.
Definition operation.h:294
ffi::Array< PrimExpr > output_shape(size_t i) const final
Get shape of i-th output tensor.
PrimType output_dtype(size_t i) const final
Get the primitive element type of the i-th output tensor.
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("te.ScanOp", ScanOpNode, OperationNode)
ffi::Array< IterVar > spatial_axis_
Spatial axis to indicate spatial dimension of each output. They corresponds to flattened spatial axis...
Definition operation.h:315
Managed reference to ScanOpNode.
Definition operation.h:341
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(ScanOp, Operation, ScanOpNode)
ScanOp(std::string name, std::string tag, ffi::Optional< ffi::Map< ffi::String, ffi::Any > > attrs, IterVar axis, ffi::Array< Tensor > init, ffi::Array< Tensor > update, ffi::Array< Tensor > state_placeholder, ffi::Array< Tensor > input)
Tensor structure representing a possible input, or intermediate computation result.
Definition tensor.h:98
Iteration Variable, represents an iteration over an integer interval.
Definition var.h:194
Checked scalar view over a VarNode.
Definition var.h:46
Container of all statements.
Definition stmt.h:67
Copy-on-write helper macro for IR ffi::ObjectRef types.
TIR expressions.
PrimVar var(std::string name_hint, PrimType t=PrimType::Int(32))
Construct a new Var expression.
ffi::Array< Tensor > scan(ffi::Array< Tensor > init, ffi::Array< Tensor > update, ffi::Array< Tensor > state_placeholder, ffi::Array< Tensor > inputs=ffi::Array< Tensor >(), std::string name="scan", std::string tag="", ffi::Map< ffi::String, ffi::Any > attrs={})
Construct new tensors by scan.
Tensor placeholder(ffi::Array< PrimExpr > shape, PrimType dtype=PrimType::Float(32), std::string name="placeholder")
create a place holder tensor.
std::function< ffi::Array< PrimExpr >(const ffi::Array< PrimVar > &i)> FBatchCompute
The compute function to specify the inputs source of Tensors.
Definition operation.h:424
std::function< PrimExpr(const ffi::Array< PrimVar > &i)> FCompute
The compute function to specify the input source of a Tensor.
Definition operation.h:421
IterVar thread_axis(Range dom, std::string tag)
Create a new IterVar that represents an axis in thread.
IterVar reduce_axis(Range dom, std::string name="rv")
Create a new IterVar for reduction operations.
Tensor compute(ffi::Array< PrimExpr > shape, FCompute fcompute, std::string name="tensor", std::string tag="", ffi::Map< ffi::String, ffi::Any > attrs={})
Construct a new tensor by computing over shape, using the computation rule: result_tensor[axis] = fco...
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
Temporary data structure to store union of bounds of each axis of Tensor.
Definition operation.h:147
TensorDom(int ndim)
Definition operation.h:149
std::vector< std::vector< IntSet > > data
The domain data.
Definition operation.h:151
Dataflow tensor object.
Common operators defined for Expr.