tvm
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
int_set.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_ARITH_INT_SET_H_
25 #define TVM_ARITH_INT_SET_H_
26 
27 #include <tvm/ir/expr.h>
28 #include <tvm/tir/expr.h>
29 
30 #include <unordered_map>
31 
32 namespace tvm {
33 namespace arith {
34 
35 using tir::IterVar;
36 using tir::Var;
37 using tir::VarNode;
38 
39 class Analyzer;
40 
41 //-----------------------------------------------
42 // Integer set data structure.
43 //
44 // This is a API build on top of the base
45 // integer analysis API to provide set analysis.
46 //------------------------------------------------
51 
57 class IntSetNode : public Object {
58  public:
59  static constexpr const char* _type_key = "IntSet";
60  static constexpr bool _type_has_method_sequal_reduce = false;
62 };
63 
68 class IntSet : public ObjectRef {
69  public:
75  Range CoverRange(Range max_range) const;
77  PrimExpr min() const;
79  PrimExpr max() const;
81  SignType GetSignType() const;
83  bool IsNothing() const;
85  bool IsEverything() const;
87  bool IsSinglePoint() const;
101  bool CanProveSinglePoint(Analyzer* ana) const;
102  // TODO(tvm-team): update all CanProve to explicitly take
103  // analyzer to encourage more analyzer reuse
105  bool CanProvePositive() const;
107  bool CanProveNegative() const;
109  bool CanProveNonPositive() const;
111  bool CanProveNonNegative() const;
113  bool HasUpperBound() const;
115  bool HasLowerBound() const;
116 
121  PrimExpr PointValue() const;
128  bool MatchRange(const tvm::Range& r) const;
130  static IntSet Nothing();
132  static IntSet Everything();
138  static IntSet SinglePoint(PrimExpr point);
144  static IntSet Vector(PrimExpr vec);
151  static IntSet FromMinExtent(PrimExpr min, PrimExpr extent);
157  static IntSet FromRange(tvm::Range r);
164  static IntSet Interval(PrimExpr min, PrimExpr max);
165 
167 };
168 
169 //-----------------------------------------------
170 // Integer set legacy API.
171 //------------------------------------------------
178 Map<Var, IntSet> ConvertDomMap(const std::unordered_map<const VarNode*, IntSet>& dom_map);
187 IntSet EvalSet(PrimExpr e, const Map<IterVar, IntSet>& dom_map);
196 IntSet EvalSet(PrimExpr e, const Map<Var, IntSet>& dom_map);
204 IntSet EvalSet(PrimExpr e, const std::unordered_map<const tir::VarNode*, IntSet>& dom_map);
213 IntSet EvalSet(Range r, const Map<IterVar, IntSet>& dom_map);
214 
223 IntSet EvalSet(IntSet s, const std::unordered_map<const VarNode*, IntSet>& dom_map);
231 IntSet EvalSet(Range r, const std::unordered_map<const VarNode*, IntSet>& dom_map);
239 Array<IntSet> EvalSet(const Array<Range>& region, const Map<Var, IntSet>& dom_map);
241 using ExprIntSetMap = std::unordered_map<PrimExpr, IntSet, ObjectPtrHash, ObjectPtrEqual>;
251  const std::unordered_map<const VarNode*, IntSet>& dom_map);
252 
258 IntSet Union(const Array<IntSet>& sets);
259 
265 Array<IntSet> UnionRegion(const Array<Array<IntSet>>& nd_int_sets);
266 
273 
280 
286 IntSet Intersect(const Array<IntSet>& sets);
287 
294 
305  const Map<Var, Range>& var_dom,
306  const PrimExpr& predicate,
307  arith::Analyzer* analyzer);
308 
319  const Map<Var, Range>& var_dom,
320  const PrimExpr& predicate,
321  arith::Analyzer* analyzer);
322 
334  const Map<Var, Range>& var_dom,
335  const PrimExpr& predicate,
336  arith::Analyzer* analyzer);
337 
338 } // namespace arith
339 } // namespace tvm
340 #endif // TVM_ARITH_INT_SET_H_
IntSet UnionLowerBound(const Array< IntSet > &sets)
Create a lower-bound of union set, where some of the segments may be dropped.
Definition: int_set.h:50
PrimExpr min(PrimExpr a, PrimExpr b, Span span=Span())
take minimum of two values
SignType
Sign type of an integer expression.
Definition: int_set.h:50
static constexpr const char * _type_key
Definition: int_set.h:59
Base expr nodes in TVM.
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
Map< Var, arith::IntSet > AsIntSet(const Map< Var, Range > &var_dom)
Converts the Ranges to IntSets.
ExprIntSetMap EvalSetForEachSubExpr(PrimExpr e, const std::unordered_map< const VarNode *, IntSet > &dom_map)
Find the integer set of every sub-expression, given the domain of each iteration variables.
base class of all object containers.
Definition: object.h:167
Definition: int_set.h:50
IntSet Union(const Array< IntSet > &sets)
Create a union set of all sets, possibly relaxed.
TVM_DECLARE_BASE_OBJECT_INFO(IntSetNode, Object)
Range constainer.
Definition: expr.h:715
Base class of all Integer set containers. represent a set of integers in one dimension.
Definition: int_set.h:57
IntSet EvalSet(PrimExpr e, const Map< IterVar, IntSet > &dom_map)
Find an symbolic integer set that contains all possible values of e given the domain of each iteratio...
std::unordered_map< PrimExpr, IntSet, ObjectPtrHash, ObjectPtrEqual > ExprIntSetMap
Map from Expr to IntSet.
Definition: int_set.h:241
TIR expressions.
Managed reference to IntSetNode.
Definition: int_set.h:68
Array, container representing a contiguous sequence of ObjectRefs.
Definition: array.h:289
Map< Var, IntSet > ConvertDomMap(const std::unordered_map< const VarNode *, IntSet > &dom_map)
Convert std::unordered_map<const VarNode*, IntSet> to Map<Var, IntSet>
PrimExpr max(PrimExpr a, PrimExpr b, Span span=Span())
take maximum of two values
#define TVM_DEFINE_OBJECT_REF_METHODS(TypeName, ParentType, ObjectName)
Definition: object.h:713
IntSet Intersect(const Array< IntSet > &sets)
Create an intersected set of all sets.
Base class of all object reference.
Definition: object.h:511
Definition: int_set.h:50
Optional< Array< IntSet > > EstimateRegionLowerBound(const Array< Range > &region, const Map< Var, Range > &var_dom, const PrimExpr &predicate, arith::Analyzer *analyzer)
Analyze the region with affine map, given the domain of variables and their predicate. Some subregion may be discarded during the lower-bound analysis.
Array< IntSet > UnionRegionLowerBound(const Array< Array< IntSet >> &nd_int_sets)
The union of N-dimensional integer sets.
Array< IntSet > UnionRegion(const Array< Array< IntSet >> &nd_int_sets)
The union of N-dimensional integer sets.
Map container of NodeRef->NodeRef in DSL graph. Map implements copy on write semantics, which means map is mutable but copy will happen when array is referenced in more than two places.
Definition: map.h:1271
Optional< Array< IntSet > > EstimateRegionStrictBound(const Array< Range > &region, const Map< Var, Range > &var_dom, const PrimExpr &predicate, arith::Analyzer *analyzer)
Analyze the region with affine map, given the domain of variables and their predicate. The result should be strict, i.e. no region is discarded or relaxed.
Optional container that to represent to a Nullable variant of T.
Definition: optional.h:51
static constexpr bool _type_has_method_sequal_reduce
Definition: int_set.h:60
Reference to PrimExprNode.
Definition: expr.h:114
Array< IntSet > EstimateRegionUpperBound(const Array< Range > &region, const Map< Var, Range > &var_dom, const PrimExpr &predicate, arith::Analyzer *analyzer)
Analyze the region with affine map, given the domain of variables and their predicate Relaxation of t...
Definition: int_set.h:50
Analyzer that contains bunch of sub-analyzers.
Definition: analyzer.h:579