tvm
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
dataflow_pattern_functor.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_RELAY_DATAFLOW_PATTERN_FUNCTOR_H_
25 #define TVM_RELAY_DATAFLOW_PATTERN_FUNCTOR_H_
26 
28 
29 #include <unordered_set>
30 #include <utility>
31 
32 namespace tvm {
33 namespace relay {
34 
42 template <typename FType>
44 
45 // functions to be overriden.
46 #define DFPATTERN_FUNCTOR_DEFAULT \
47  { return VisitDFPatternDefault_(op, std::forward<Args>(args)...); }
48 
49 #define RELAY_DFPATTERN_FUNCTOR_DISPATCH(OP) \
50  vtable.template set_dispatch<OP>([](const ObjectRef& n, TSelf* self, Args... args) { \
51  return self->VisitDFPattern_(static_cast<const OP*>(n.get()), std::forward<Args>(args)...); \
52  });
53 
54 template <typename R, typename... Args>
55 class DFPatternFunctor<R(const DFPattern& n, Args...)> {
56  private:
57  using TSelf = DFPatternFunctor<R(const DFPattern& n, Args...)>;
58  using FType = tvm::NodeFunctor<R(const ObjectRef& n, TSelf* self, Args...)>;
59 
60  public:
62  virtual ~DFPatternFunctor() {}
69  R operator()(const DFPattern& n, Args... args) {
70  return VisitDFPattern(n, std::forward<Args>(args)...);
71  }
78  virtual R VisitDFPattern(const DFPattern& n, Args... args) {
79  ICHECK(n.defined());
80  static FType vtable = InitVTable();
81  return vtable(n, this, std::forward<Args>(args)...);
82  }
83  // Functions that can be overriden by subclass
84  virtual R VisitDFPattern_(const AltPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
85  virtual R VisitDFPattern_(const AttrPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
86  virtual R VisitDFPattern_(const CallPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
90  virtual R VisitDFPattern_(const ExprPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
92  virtual R VisitDFPattern_(const IfPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
93  virtual R VisitDFPattern_(const LetPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
94  virtual R VisitDFPattern_(const ShapePatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
96  Args... args) DFPATTERN_FUNCTOR_DEFAULT;
97  virtual R VisitDFPattern_(const TuplePatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
98  virtual R VisitDFPattern_(const TypePatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
99  virtual R VisitDFPattern_(const VarPatternNode* op, Args... args) DFPATTERN_FUNCTOR_DEFAULT;
101  virtual R VisitDFPatternDefault_(const Object* op, Args...) {
102  LOG(FATAL) << "Do not have a default for " << op->GetTypeKey();
103  throw;
104  }
105 
106  private:
107  // initialize the vtable.
108  static FType InitVTable() {
109  FType vtable;
110  // Set dispatch
127  return vtable;
128  }
129 };
130 
137 class DFPatternVisitor : public DFPatternFunctor<void(const DFPattern&)> {
138  public:
139  void VisitDFPattern(const DFPattern& pattern) override;
140  void VisitDFPattern_(const AltPatternNode* op) override;
141  void VisitDFPattern_(const AttrPatternNode* op) override;
142  void VisitDFPattern_(const CallPatternNode* op) override;
143  void VisitDFPattern_(const ConstantPatternNode* op) override;
144  void VisitDFPattern_(const DataTypePatternNode* op) override;
145  void VisitDFPattern_(const DominatorPatternNode* op) override;
146  void VisitDFPattern_(const ExprPatternNode* op) override;
147  void VisitDFPattern_(const FunctionPatternNode* op) override;
148  void VisitDFPattern_(const IfPatternNode* op) override;
149  void VisitDFPattern_(const LetPatternNode* op) override;
150  void VisitDFPattern_(const ShapePatternNode* op) override;
151  void VisitDFPattern_(const TupleGetItemPatternNode* op) override;
152  void VisitDFPattern_(const TuplePatternNode* op) override;
153  void VisitDFPattern_(const TypePatternNode* op) override;
154  void VisitDFPattern_(const VarPatternNode* op) override;
155  void VisitDFPattern_(const WildcardPatternNode* op) override;
156 
157  protected:
158  // set of already-visited nodes
159  std::unordered_set<const Object*> visited_;
160 };
161 
162 } // namespace relay
163 } // namespace tvm
164 #endif // TVM_RELAY_DATAFLOW_PATTERN_FUNCTOR_H_
A dynamically dispatched functor on the type of the first argument.
Definition: functor.h:64
#define DFPATTERN_FUNCTOR_DEFAULT
Definition: dataflow_pattern_functor.h:46
virtual R VisitDFPattern_(const TuplePatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:97
Pattern for Types.
Definition: dataflow_pattern.h:437
A dynamical functor that dispatches on in the first DFPattern argument.
Definition: dataflow_pattern_functor.h:43
virtual R VisitDFPattern_(const TypePatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:98
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
virtual R VisitDFPattern_(const ExprPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:90
Pattern for Relay Expression.
Definition: dataflow_pattern.h:83
#define RELAY_DFPATTERN_FUNCTOR_DISPATCH(OP)
Definition: dataflow_pattern_functor.h:49
Definition: dataflow_pattern.h:301
virtual ~DFPatternFunctor()
virtual destructor
Definition: dataflow_pattern_functor.h:62
virtual R VisitDFPattern_(const FunctionPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:91
A binding of a sub-network.
Definition: dataflow_pattern.h:228
void VisitDFPattern_(const AltPatternNode *op) override
Dominated Graph Pattern Pattern for fuzzy subgraphs where all outputs of the parent are used finally ...
Definition: dataflow_pattern.h:497
virtual R VisitDFPattern(const DFPattern &n, Args... args)
The functor call.
Definition: dataflow_pattern_functor.h:78
base class of all object containers.
Definition: object.h:167
A simple visitor wrapper around DFPatternFunctor. Recursively visit the content.
Definition: dataflow_pattern_functor.h:137
Definition: dataflow_pattern_functor.h:55
Definition: dataflow_pattern.h:285
Pattern for Types.
Definition: dataflow_pattern.h:379
virtual R VisitDFPattern_(const IfPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:92
R operator()(const DFPattern &n, Args... args)
Same as call.
Definition: dataflow_pattern_functor.h:69
std::unordered_set< const Object * > visited_
Definition: dataflow_pattern_functor.h:159
virtual R VisitDFPattern_(const TupleGetItemPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:95
Pattern for Alternate Expressions.
Definition: dataflow_pattern.h:331
bool defined() const
Definition: object.h:544
Pattern for Attributes.
Definition: dataflow_pattern.h:466
virtual R VisitDFPattern_(const DataTypePatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:88
virtual R VisitDFPattern_(const ConstantPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:87
CallPattern container.
Definition: dataflow_pattern.h:157
void VisitDFPattern(const DFPattern &pattern) override
Container for Constant.
Definition: dataflow_pattern.h:138
virtual R VisitDFPattern_(const VarPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:99
Managed reference to dataflow patterns.
Definition: dataflow_pattern.h:50
Base class of all object reference.
Definition: object.h:511
std::string GetTypeKey() const
Definition: object.h:180
Container for Var.
Definition: dataflow_pattern.h:111
Tuple container.
Definition: dataflow_pattern.h:266
virtual R VisitDFPattern_(const AltPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:84
Pattern for Shapes.
Definition: dataflow_pattern.h:408
virtual R VisitDFPattern_(const ShapePatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:94
A pattern language for matching dataflow properties.
virtual R VisitDFPattern_(const AttrPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:85
virtual R VisitDFPattern_(const LetPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:93
virtual R VisitDFPattern_(const WildcardPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:100
virtual R VisitDFPattern_(const CallPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:86
Relay Function container.
Definition: dataflow_pattern.h:189
Wildcard Pattern.
Definition: dataflow_pattern.h:359
virtual R VisitDFPattern_(const DominatorPatternNode *op, Args... args)
Definition: dataflow_pattern_functor.h:89
virtual R VisitDFPatternDefault_(const Object *op, Args...)
Definition: dataflow_pattern_functor.h:101